{"version":3,"file":"dereekb-dbx-web.mjs","sources":["../../../../packages/dbx-web/src/lib/interaction/popover/popover.position.strategy.ts","../../../../packages/dbx-web/src/lib/layout/compact/compact.ts","../../../../packages/dbx-web/src/lib/layout/compact/compact.store.ts","../../../../packages/dbx-web/src/lib/layout/compact/compact.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.coordinator.service.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.coordinator.component.ts","../../../../packages/dbx-web/src/lib/keypress/keydown.listener.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.component.ts","../../../../packages/dbx-web/src/lib/interaction/popover/abstract.popover.directive.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.content.component.ts","../../../../packages/dbx-web/src/lib/layout/style/style.ts","../../../../packages/dbx-web/src/lib/layout/style/style.color.service.ts","../../../../packages/dbx-web/src/lib/layout/style/style.color.directive.ts","../../../../packages/dbx-web/src/lib/button/progress/button.progress.config.ts","../../../../packages/dbx-web/src/lib/button/progress/abstract.progress.button.directive.ts","../../../../packages/dbx-web/src/lib/button/progress/bar.button.component.ts","../../../../packages/dbx-web/src/lib/button/progress/bar.button.component.html","../../../../packages/dbx-web/src/lib/button/progress/spinner.button.component.ts","../../../../packages/dbx-web/src/lib/button/progress/spinner.button.component.html","../../../../packages/dbx-web/src/lib/button/progress/button.progress.providers.ts","../../../../packages/dbx-web/src/lib/button/button.component.ts","../../../../packages/dbx-web/src/lib/button/button.spacer.directive.ts","../../../../packages/dbx-web/src/lib/button/button.floating.directive.ts","../../../../packages/dbx-web/src/lib/button/icon/icon.button.component.ts","../../../../packages/dbx-web/src/lib/button/rotating/button.rotating.ts","../../../../packages/dbx-web/src/lib/button/rotating/button.rotating.tristate.ts","../../../../packages/dbx-web/src/lib/button/rotating/button.rotating.directive.ts","../../../../packages/dbx-web/src/lib/button/button.module.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.controls.buttons.component.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.controls.component.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.overlay.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.position.strategy.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.service.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.init.directive.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.outlet.component.ts","../../../../packages/dbx-web/src/lib/interaction/detach/detach.module.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/abstract.dialog.directive.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.content.close.component.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.content.footer.component.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.content.directive.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.action.directive.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.injection.component.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.content.ts","../../../../packages/dbx-web/src/lib/interaction/dialog/dialog.module.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.service.ts","../../../../packages/dbx-web/src/lib/interaction/popover/abstract.popover.ref.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.action.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.close.component.ts","../../../../packages/dbx-web/src/lib/screen/resize.ts","../../../../packages/dbx-web/src/lib/screen/resize.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.content.component.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.controls.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.header.component.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.scroll.content.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.content.module.ts","../../../../packages/dbx-web/src/lib/interaction/popover/popover.module.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.view.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.switch.button.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.pending.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.component.html","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.button.directive.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.popover.button.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.wrapper.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.wrapper.component.html","../../../../packages/dbx-web/src/lib/interaction/filter/filter.preset.directive.ts","../../../../packages/dbx-web/src/lib/router/provider/router.provider.config.ts","../../../../packages/dbx-web/src/lib/util/click.ts","../../../../packages/dbx-web/src/lib/router/layout/anchor/anchor.component.ts","../../../../packages/dbx-web/src/lib/router/layout/anchorlist/anchorlist.component.ts","../../../../packages/dbx-web/src/lib/router/layout/anchorlist/anchorlist.component.html","../../../../packages/dbx-web/src/lib/interaction/filter/filter.preset.list.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.menu.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.preset.menu.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.preset.menu.component.html","../../../../packages/dbx-web/src/lib/interaction/filter/filter.partial.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.partial.menu.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.partial.menu.component.html","../../../../packages/dbx-web/src/lib/interaction/filter/filter.partial.list.component.ts","../../../../packages/dbx-web/src/lib/interaction/filter/filter.module.ts","../../../../packages/dbx-web/src/lib/interaction/iframe/iframe.component.ts","../../../../packages/dbx-web/src/lib/interaction/iframe/iframe.dialog.component.ts","../../../../packages/dbx-web/src/lib/interaction/iframe/embed.component.ts","../../../../packages/dbx-web/src/lib/interaction/iframe/embed.dialog.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.coordinator.service.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.coordinator.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/abstract.popup.directive.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.content.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.controls.buttons.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.controls.component.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.module.ts","../../../../packages/dbx-web/src/lib/interaction/popup/popup.service.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.box.directive.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.confirm.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.button.confirm.directive.ts","../../../../packages/dbx-web/src/lib/layout/section/section.header.component.ts","../../../../packages/dbx-web/src/lib/layout/section/section.component.ts","../../../../packages/dbx-web/src/lib/layout/section/subsection.component.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.component.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.confirm.component.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.confirm.dialog.component.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.confirm.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.container.directive.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.page.component.ts","../../../../packages/dbx-web/src/lib/interaction/prompt/prompt.module.ts","../../../../packages/dbx-web/src/lib/interaction/upload/abstract.upload.component.ts","../../../../packages/dbx-web/src/lib/interaction/upload/upload.accept.ts","../../../../packages/dbx-web/src/lib/interaction/upload/upload.action.ts","../../../../packages/dbx-web/src/lib/interaction/upload/upload.area.component.ts","../../../../packages/dbx-web/src/lib/interaction/upload/upload.button.component.ts","../../../../packages/dbx-web/src/lib/interaction/upload/upload.component.ts","../../../../packages/dbx-web/src/lib/interaction/upload/upload.action.directive.ts","../../../../packages/dbx-web/src/lib/error/error.widget.directive.ts","../../../../packages/dbx-web/src/lib/layout/text/label.block.component.ts","../../../../packages/dbx-web/src/lib/error/default.error.widget.component.ts","../../../../packages/dbx-web/src/lib/error/error.widget.service.ts","../../../../packages/dbx-web/src/lib/error/error.widget.component.ts","../../../../packages/dbx-web/src/lib/error/error.details.component.ts","../../../../packages/dbx-web/src/lib/error/error.popover.component.ts","../../../../packages/dbx-web/src/lib/layout/style/style.text-color.directive.ts","../../../../packages/dbx-web/src/lib/error/error.view.component.ts","../../../../packages/dbx-web/src/lib/error/error.component.ts","../../../../packages/dbx-web/src/lib/loading/loading-progress.component.ts","../../../../packages/dbx-web/src/lib/loading/basic-loading.component.ts","../../../../packages/dbx-web/src/lib/loading/basic-loading.component.html","../../../../packages/dbx-web/src/lib/loading/loading.component.ts","../../../../packages/dbx-web/src/lib/loading/loading.action.directive.ts","../../../../packages/dbx-web/src/lib/loading/loading.module.ts","../../../../packages/dbx-web/src/lib/layout/style/spacer.directive.ts","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.component.ts","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.component.html","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.default.ts","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.generator.ts","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.service.ts","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.directive.ts","../../../../packages/dbx-web/src/lib/action/snackbar/action.snackbar.module.ts","../../../../packages/dbx-web/src/lib/error/error.action.directive.ts","../../../../packages/dbx-web/src/lib/action/transition/transition.safety.dialog.component.ts","../../../../packages/dbx-web/src/lib/action/transition/transition.safety.directive.ts","../../../../packages/dbx-web/src/lib/action/action.confirm.directive.ts","../../../../packages/dbx-web/src/lib/action/key.trigger.directive.ts","../../../../packages/dbx-web/src/lib/action/action.module.ts","../../../../packages/dbx-web/src/lib/error/error.api.ts","../../../../packages/dbx-web/src/lib/error/error.loading.directive.ts","../../../../packages/dbx-web/src/lib/error/error.snackbar.component.ts","../../../../packages/dbx-web/src/lib/error/error.snackbar.service.ts","../../../../packages/dbx-web/src/lib/error/error.snackbar.action.directive.ts","../../../../packages/dbx-web/src/lib/error/state.ts","../../../../packages/dbx-web/src/lib/extension/browser/browser.agent.service.ts","../../../../packages/dbx-web/src/lib/extension/browser/browser.agent.view.ts","../../../../packages/dbx-web/src/lib/extension/browser/browser.agent.view.override.button.component.ts","../../../../packages/dbx-web/src/lib/extension/browser/browser.agent.view.component.ts","../../../../packages/dbx-web/src/lib/extension/model/state/actions/actions.ts","../../../../packages/dbx-web/src/lib/extension/model/state/actions/model.actions.ts","../../../../packages/dbx-web/src/lib/extension/model/state/reducers/model.module.config.ts","../../../../packages/dbx-web/src/lib/extension/model/state/reducers/index.ts","../../../../packages/dbx-web/src/lib/extension/model/model.tracker.view.storage.ts","../../../../packages/dbx-web/src/lib/extension/model/model.tracker.service.ts","../../../../packages/dbx-web/src/lib/extension/model/state/effects/tracker.effects.ts","../../../../packages/dbx-web/src/lib/extension/model/model.state.service.ts","../../../../packages/dbx-web/src/lib/extension/model/model.providers.ts","../../../../packages/dbx-web/src/lib/extension/model/model.tracker.ts","../../../../packages/dbx-web/src/lib/extension/model/model.types.service.ts","../../../../packages/dbx-web/src/lib/extension/download/blob/download.blob.button.component.ts","../../../../packages/dbx-web/src/lib/extension/download/list/download.file.list.ts","../../../../packages/dbx-web/src/lib/screen/screen.ts","../../../../packages/dbx-web/src/lib/screen/screen.service.ts","../../../../packages/dbx-web/src/lib/layout/accordion/accordion.header.height.directive.ts","../../../../packages/dbx-web/src/lib/layout/avatar/avatar.ts","../../../../packages/dbx-web/src/lib/layout/avatar/avatar.view.component.ts","../../../../packages/dbx-web/src/lib/layout/avatar/avatar.service.ts","../../../../packages/dbx-web/src/lib/layout/avatar/avatar.component.ts","../../../../packages/dbx-web/src/lib/layout/bar/bar.directive.ts","../../../../packages/dbx-web/src/lib/layout/bar/bar.header.component.ts","../../../../packages/dbx-web/src/lib/layout/bar/pagebar.component.ts","../../../../packages/dbx-web/src/lib/layout/bar/bar.layout.module.ts","../../../../packages/dbx-web/src/lib/layout/block/two.block.component.ts","../../../../packages/dbx-web/src/lib/layout/card/card.box.component.ts","../../../../packages/dbx-web/src/lib/layout/card/card.box.container.directive.ts","../../../../packages/dbx-web/src/lib/layout/card/card.box.layout.module.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.store.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.component.ts","../../../../packages/dbx-web/src/lib/layout/column/one/one.column.component.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.back.directive.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.context.directive.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.full.left.directive.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.head.directive.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.sref.directive.ts","../../../../packages/dbx-web/src/lib/router/layout/anchor/anchor.icon.component.ts","../../../../packages/dbx-web/src/lib/router/layout/anchor/anchor.link.component.ts","../../../../packages/dbx-web/src/lib/router/layout/anchor/anchor.content.component.ts","../../../../packages/dbx-web/src/lib/router/layout/anchor/anchor.module.ts","../../../../packages/dbx-web/src/lib/router/layout/anchor/anchor.segue.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.modifier.ts","../../../../packages/dbx-web/src/lib/layout/list/modifier/list.view.value.modifier.directive.ts","../../../../packages/dbx-web/src/lib/router/layout/list/router.list.directive.ts","../../../../packages/dbx-web/src/lib/router/layout/navbar/navbar.component.ts","../../../../packages/dbx-web/src/lib/router/layout/navbar/navbar.component.html","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.component.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.button.component.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.pagebar.component.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.page.component.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.ifdisplaymode.directive.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/sidenav.module.ts","../../../../packages/dbx-web/src/lib/router/layout/sidenav/index.ts","../../../../packages/dbx-web/src/lib/router/layout/layout.module.ts","../../../../packages/dbx-web/src/lib/router/provider/ngrouter/anchor.component.ts","../../../../packages/dbx-web/src/lib/router/provider/ngrouter/anchor.component.html","../../../../packages/dbx-web/src/lib/router/provider/ngrouter/angular.router.providers.ts","../../../../packages/dbx-web/src/lib/router/provider/uirouter/anchor.component.ts","../../../../packages/dbx-web/src/lib/router/provider/uirouter/anchor.component.html","../../../../packages/dbx-web/src/lib/router/provider/uirouter/uirouter.router.providers.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.right.component.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.sref.showright.directive.ts","../../../../packages/dbx-web/src/lib/layout/column/two/two.column.module.ts","../../../../packages/dbx-web/src/lib/layout/content/content.border.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.box.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.elevate.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.page.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.pit.directive.ts","../../../../packages/dbx-web/src/lib/layout/content/content.layout.module.ts","../../../../packages/dbx-web/src/lib/layout/flag/flag.component.ts","../../../../packages/dbx-web/src/lib/layout/flag/flag.prompt.component.ts","../../../../packages/dbx-web/src/lib/layout/flag/flag.layout.module.ts","../../../../packages/dbx-web/src/lib/layout/flex/flex.group.directive.ts","../../../../packages/dbx-web/src/lib/layout/flex/flex.size.directive.ts","../../../../packages/dbx-web/src/lib/layout/item/item.icon.component.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.separator.ts","../../../../packages/dbx-web/src/lib/layout/list/group/list.view.value.group.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.component.ts","../../../../packages/dbx-web/src/lib/layout/list/accordion/list.accordion.view.component.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/accordion/list.accordion.view.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/grid/list.grid.view.component.ts","../../../../packages/dbx-web/src/lib/layout/list/grid/list.grid.view.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/meta/list.view.meta.icon.component.ts","../../../../packages/dbx-web/src/lib/layout/list/group/list.view.value.group.title.header.component.ts","../../../../packages/dbx-web/src/lib/layout/list/group/list.view.value.group.title.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/modifier/list.view.value.modifier.ripple.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/modifier/list.view.value.modifier.selection.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/modifier/list.modifier.module.ts","../../../../packages/dbx-web/src/lib/layout/list/list.content.empty.component.ts","../../../../packages/dbx-web/src/lib/layout/list/list.component.ts","../../../../packages/dbx-web/src/lib/layout/list/list.component.html","../../../../packages/dbx-web/src/lib/layout/list/list.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/list.module.ts","../../../../packages/dbx-web/src/lib/layout/list/list.track.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.selection.component.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.selection.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/list.view.value.item.directive.ts","../../../../packages/dbx-web/src/lib/layout/list/list.wrapper.ts","../../../../packages/dbx-web/src/lib/layout/section/section.intro.component.ts","../../../../packages/dbx-web/src/lib/layout/section/section.page.component.ts","../../../../packages/dbx-web/src/lib/layout/section/section.layout.module.ts","../../../../packages/dbx-web/src/lib/layout/style/style.service.ts","../../../../packages/dbx-web/src/lib/layout/style/style.set.directive.ts","../../../../packages/dbx-web/src/lib/layout/style/style.directive.ts","../../../../packages/dbx-web/src/lib/layout/style/style.body.directive.ts","../../../../packages/dbx-web/src/lib/layout/style/style.layout.module.ts","../../../../packages/dbx-web/src/lib/layout/style/style.providers.ts","../../../../packages/dbx-web/src/lib/layout/text/address.component.ts","../../../../packages/dbx-web/src/lib/layout/text/detail.block.header.component.ts","../../../../packages/dbx-web/src/lib/layout/text/detail.block.component.ts","../../../../packages/dbx-web/src/lib/layout/text/icon-tile.component.ts","../../../../packages/dbx-web/src/lib/layout/text/icon-tile.directive.ts","../../../../packages/dbx-web/src/lib/layout/text/step.block.component.ts","../../../../packages/dbx-web/src/lib/layout/text/icon.spacer.component.ts","../../../../packages/dbx-web/src/lib/layout/text/linkify/linkify.ts","../../../../packages/dbx-web/src/lib/layout/text/linkify/linkify.service.ts","../../../../packages/dbx-web/src/lib/layout/text/linkify/linkify.component.ts","../../../../packages/dbx-web/src/lib/layout/text/linkify/linkify.providers.ts","../../../../packages/dbx-web/src/lib/layout/text/text.chip.directive.ts","../../../../packages/dbx-web/src/lib/layout/text/text.chip.list.component.ts","../../../../packages/dbx-web/src/lib/layout/text/text.chips.component.ts","../../../../packages/dbx-web/src/lib/layout/text/number.limit.component.ts","../../../../packages/dbx-web/src/lib/util/clipboard.ts","../../../../packages/dbx-web/src/lib/util/clipboard.directive.ts","../../../../packages/dbx-web/src/lib/layout/text/copy.text.directive.ts","../../../../packages/dbx-web/src/lib/layout/text/copy.text.component.ts","../../../../packages/dbx-web/src/lib/layout/text/copy.field.component.ts","../../../../packages/dbx-web/src/lib/layout/text/text.module.ts","../../../../packages/dbx-web/src/lib/extension/download/list/download.file.list.item.component.ts","../../../../packages/dbx-web/src/lib/extension/download/list/download.file.list.component.ts","../../../../packages/dbx-web/src/lib/extension/download/text/download.text.component.ts","../../../../packages/dbx-web/src/lib/extension/download/text/download.text.component.html","../../../../packages/dbx-web/src/lib/extension/preview/webfilepreview.service.ts","../../../../packages/dbx-web/src/lib/extension/preview/webfilepreview.component.ts","../../../../packages/dbx-web/src/lib/extension/zip/zip.blob.ts","../../../../packages/dbx-web/src/lib/extension/zip/zip.blob.preview.list.component.ts","../../../../packages/dbx-web/src/lib/extension/zip/zip.blob.preview.component.ts","../../../../packages/dbx-web/src/lib/extension/zip/zip.blob.preview.component.html","../../../../packages/dbx-web/src/lib/extension/zip/zip.preview.component.ts","../../../../packages/dbx-web/src/lib/extension/zip/zip.preview.dialog.component.ts","../../../../packages/dbx-web/src/lib/extension/preview/webfilepreview.service.preset.ts","../../../../packages/dbx-web/src/lib/extension/structure/structure.structure.directive.ts","../../../../packages/dbx-web/src/lib/extension/structure/structure.body.directive.ts","../../../../packages/dbx-web/src/lib/extension/title/title.delegate.ts","../../../../packages/dbx-web/src/lib/extension/title/title.service.ts","../../../../packages/dbx-web/src/lib/extension/title/title.directive.ts","../../../../packages/dbx-web/src/lib/extension/title/title.providers.ts","../../../../packages/dbx-web/src/lib/extension/widget/widget.service.ts","../../../../packages/dbx-web/src/lib/extension/widget/widget.component.ts","../../../../packages/dbx-web/src/lib/extension/widget/widget.directive.ts","../../../../packages/dbx-web/src/lib/extension/widget/widget.list.component.ts","../../../../packages/dbx-web/src/lib/extension/help/help.context.service.ts","../../../../packages/dbx-web/src/lib/extension/help/help.context.ts","../../../../packages/dbx-web/src/lib/extension/help/help.context.directive.ts","../../../../packages/dbx-web/src/lib/extension/help/help.widget.service.ts","../../../../packages/dbx-web/src/lib/extension/help/help.providers.ts","../../../../packages/dbx-web/src/lib/extension/help/help.widget.ts","../../../../packages/dbx-web/src/lib/extension/help/absract.help.widget.directive.ts","../../../../packages/dbx-web/src/lib/extension/help/help.view.list.entry.component.ts","../../../../packages/dbx-web/src/lib/extension/help/help.view.list.entry.component.html","../../../../packages/dbx-web/src/lib/extension/help/help.view.list.component.ts","../../../../packages/dbx-web/src/lib/extension/help/help.view.popover.component.ts","../../../../packages/dbx-web/src/lib/extension/help/help.view.popover.component.html","../../../../packages/dbx-web/src/lib/extension/help/help.view.popover.button.component.ts","../../../../packages/dbx-web/src/lib/extension/image/image.compression.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.sidecar.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.utility.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.store.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.store.directive.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.entry.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.list.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.page.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.page.list.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.preview.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.preview.dialog.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.component.html","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.file.upload.validator.directive.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.file.upload.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.editor.file.upload.has.state.directive.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.import.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.upload.dialog.component.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.upload.button.directive.ts","../../../../packages/dbx-web/src/lib/extension/pdf/pdf.merge.upload.action.directive.ts","../../../../packages/dbx-web/src/lib/extension/mcp/mcp.connect.ts","../../../../packages/dbx-web/src/lib/extension/mcp/mcp.connect.service.ts","../../../../packages/dbx-web/src/lib/extension/mcp/mcp.connect.providers.ts","../../../../packages/dbx-web/src/lib/extension/mcp/mcp.connect.view.component.ts","../../../../packages/dbx-web/src/lib/extension/mcp/mcp.connect.dialog.component.ts","../../../../packages/dbx-web/src/lib/extension/mcp/mcp.connect.button.component.ts","../../../../packages/dbx-web/src/lib/screen/screen.providers.ts","../../../../packages/dbx-web/src/lib/util/cdk.ts","../../../../packages/dbx-web/src/lib/dbx-web.module.ts","../../../../packages/dbx-web/src/dereekb-dbx-web.ts"],"sourcesContent":["import { type FlexibleConnectedPositionStrategy, type HorizontalConnectionPos, type Overlay, type VerticalConnectionPos } from '@angular/cdk/overlay';\nimport { type ElementRef } from '@angular/core';\nimport { type NgOverlayContainerConfiguration } from 'ng-overlay-container';\n\n/**\n * Configuration for creating a popover position strategy.\n */\nexport interface PopoverPositionStrategyConfig {\n  readonly overlay: Overlay;\n  readonly elementRef: ElementRef;\n  readonly config: NgOverlayContainerConfiguration;\n}\n\n/**\n * Creates a flexible connected position strategy for popovers with multiple fallback positions.\n *\n * @example\n * ```ts\n * const strategy = PopoverPositionStrategy.make(overlay, elementRef, overlayConfig);\n * ```\n */\nexport class PopoverPositionStrategy {\n  static make(overlay: Overlay, elementRef: ElementRef, config: NgOverlayContainerConfiguration): FlexibleConnectedPositionStrategy {\n    const [originX, origin2ndX, origin3rdX]: HorizontalConnectionPos[] = config.originX === 'end' ? ['end', 'start', 'center'] : config.originX === 'start' ? ['start', 'end', 'center'] : ['center', 'start', 'end'];\n\n    const overlayX = originX;\n    const [overlayY, overlayFallbackY]: VerticalConnectionPos[] = config.overlayY === 'bottom' ? ['bottom', 'top'] : ['top', 'bottom'];\n\n    const [originY, originFallbackY] = [overlayFallbackY, overlayY];\n    const { offsetX = 0, offsetY = 0 } = config;\n\n    return overlay\n      .position()\n      .flexibleConnectedTo(elementRef)\n      .withLockedPosition(true)\n      .withPositions([\n        {\n          originX,\n          originY,\n          overlayX,\n          overlayY,\n          offsetY\n        },\n        {\n          originX: origin2ndX,\n          originY,\n          overlayX: origin2ndX,\n          overlayY,\n          offsetY\n        },\n        {\n          originX,\n          originY: originFallbackY,\n          overlayX,\n          overlayY: overlayFallbackY,\n          offsetY: -offsetY\n        },\n        {\n          originX: origin2ndX,\n          originY: originFallbackY,\n          overlayX: origin2ndX,\n          overlayY: overlayFallbackY,\n          offsetY: -offsetY\n        },\n        {\n          originX: origin3rdX,\n          originY,\n          overlayX: origin3rdX,\n          overlayY,\n          offsetY\n        },\n        {\n          originX: origin3rdX,\n          originY: originFallbackY,\n          overlayX: origin3rdX,\n          overlayY: overlayFallbackY,\n          offsetY: -offsetY\n        }\n      ])\n      .withDefaultOffsetX(offsetX)\n      .withDefaultOffsetY(offsetY);\n  }\n}\n","import { type Maybe } from '@dereekb/util';\nimport { type Observable, of, map } from 'rxjs';\n\n/**\n * Represents the two display density modes: full (default) or compact (reduced spacing/content).\n */\nexport enum CompactMode {\n  FULL = 'full',\n  COMPACT = 'compact'\n}\n\n/**\n * Maps each compact mode to a corresponding value of type `T`.\n */\nexport interface CompactModeOptions<T> {\n  full?: T;\n  compact?: T;\n}\n\n/**\n * Extends {@link CompactModeOptions} with a default mode fallback used when no mode is provided.\n */\nexport interface CompactModeDefaultOptions<T> extends CompactModeOptions<T> {\n  defaultMode?: Maybe<CompactMode>;\n}\n\n/**\n * Accepts either a `CompactMode` enum value or a boolean (`true` = compact, `false` = full).\n */\nexport type CompactModeOption = CompactMode | boolean;\n\n/**\n * Converts a boolean or `CompactMode` value into a normalized `CompactMode`.\n * `true` maps to `CompactMode.COMPACT`, `false` maps to `CompactMode.FULL`.\n *\n * @param input - Boolean or CompactMode value to normalize.\n * @returns The normalized CompactMode enum value.\n *\n * @example\n * ```ts\n * compactModeFromInput(true);  // CompactMode.COMPACT\n * compactModeFromInput(CompactMode.FULL);  // CompactMode.FULL\n * ```\n */\nexport function compactModeFromInput(input: CompactMode | boolean): CompactMode {\n  if (typeof input === 'boolean') {\n    input = input ? CompactMode.COMPACT : CompactMode.FULL;\n  }\n\n  return input === CompactMode.COMPACT ? CompactMode.COMPACT : CompactMode.FULL;\n}\n\n/**\n * Maps an observable compact mode stream to the corresponding value from the config.\n * Falls back to the config's `defaultMode` (or `FULL`) when the observable is nullish.\n *\n * @param mode$ - An observable of the current compact mode, or nullish to use the default.\n * @param config - The mapping configuration containing values for each mode and an optional default.\n * @returns An observable emitting the mapped value corresponding to the current compact mode.\n *\n * @example\n * ```ts\n * const value$ = mapCompactModeObs(mode$, {\n *   full: 'large-layout',\n *   compact: 'small-layout',\n *   defaultMode: CompactMode.FULL\n * });\n * ```\n */\nexport function mapCompactModeObs<T>(mode$: Maybe<Observable<CompactMode>>, config: CompactModeDefaultOptions<T>): Observable<Maybe<T>> {\n  const modeObs = mode$ ?? of(config.defaultMode ?? CompactMode.FULL);\n  return modeObs.pipe(\n    map((inputMode) => {\n      const isCompact = (inputMode ?? config.defaultMode) === CompactMode.COMPACT;\n\n      return isCompact ? config.compact : config.full;\n    })\n  );\n}\n","import { Injectable } from '@angular/core';\nimport { ComponentStore } from '@ngrx/component-store';\nimport { map } from 'rxjs';\nimport { CompactMode, compactModeFromInput } from './compact';\n\n/**\n * State shape for the compact context store, holding the current compact mode.\n */\nexport interface CompactContextState {\n  mode: CompactMode;\n}\n\n/**\n * Injectable component store that manages the current {@link CompactMode} state.\n * Provided at the component level via {@link DbxCompactDirective} and consumed by\n * child components to adapt their layout density.\n */\n@Injectable()\nexport class CompactContextStore extends ComponentStore<CompactContextState> {\n  constructor() {\n    super({ mode: CompactMode.FULL });\n  }\n\n  // MARK: Accessors\n  readonly mode$ = this.state$.pipe(map((x) => x.mode));\n\n  // MARK: State Changes\n  readonly setMode = this.updater((state, mode: CompactMode | boolean) => ({ mode: compactModeFromInput(mode) }));\n}\n","import { Directive, effect, inject, input } from '@angular/core';\nimport { type CompactMode } from './compact';\nimport { CompactContextStore } from './compact.store';\n\n/**\n * Provides a {@link CompactContextStore} to descendant components, allowing them to react\n * to compact vs. full display mode. The mode is set via the directive's input binding.\n *\n * @example\n * ```html\n * <div [dbxCompact]=\"true\">\n *   <!-- Child components can inject CompactContextStore to read the mode -->\n *   <my-component></my-component>\n * </div>\n *\n * <div [dbxCompact]=\"compactMode\">\n *   <my-adaptive-layout></my-adaptive-layout>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxCompact]',\n  providers: [CompactContextStore],\n  exportAs: 'compact'\n})\nexport class DbxCompactDirective {\n  readonly mode = input.required<CompactMode | boolean>({ alias: 'dbxCompact' });\n\n  readonly compactContextStore = inject(CompactContextStore);\n  readonly mode$ = this.compactContextStore.mode$;\n\n  protected readonly modeEffect = effect(() => {\n    this.compactContextStore.setMode(this.mode());\n  });\n}\n","import { type Maybe } from '@dereekb/util';\nimport { type Observable } from 'rxjs';\n\n/**\n * Unique key used to identify and coordinate popover instances.\n */\nexport type DbxPopoverKey = string;\n\n/**\n * Abstract controller for managing a popover's lifecycle, providing access to its data and close/return operations.\n */\nexport abstract class DbxPopoverController<O = unknown, I = unknown> {\n  abstract readonly key: DbxPopoverKey;\n  abstract readonly data?: Maybe<I>;\n  abstract readonly closing$: Observable<boolean>;\n  /**\n   * Signals for the popover to close.\n   */\n  abstract close(): void;\n  /**\n   * Closes the popover and returns the input value.\n   */\n  abstract return(value?: O): void;\n}\n","import { type DbxPopoverKey, type DbxPopoverController } from './popover';\nimport { Service } from '@angular/core';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Root-level service that tracks active popovers by key, ensuring only one popover per key exists at a time.\n *\n * When a new popover is added with a key that already exists, the previous popover is closed automatically.\n */\n@Service()\nexport class DbxPopoverCoordinatorService {\n  private readonly _popovers = completeOnDestroy(new BehaviorSubject<Map<DbxPopoverKey, DbxPopoverController>>(new Map()));\n\n  readonly popovers$ = this._popovers.asObservable();\n\n  get popovers(): Map<DbxPopoverKey, DbxPopoverController> {\n    return this._popovers.value;\n  }\n\n  public addPopover(popover: DbxPopoverController): void {\n    const key = popover.key;\n\n    if (key) {\n      this.removePopover(key);\n      this._popovers.value.set(key, popover);\n      this._popovers.next(this.popovers);\n    }\n  }\n\n  public removePopover(key: DbxPopoverKey, popover?: DbxPopoverController): void {\n    if (key) {\n      const existing = this.popovers.get(key);\n\n      // Remove if there is one existing, and if popover is provided it is the same popover.\n      if (existing && (!popover || popover === existing)) {\n        existing.close();\n        this._popovers.value.delete(key);\n        this._popovers.next(this.popovers);\n      }\n    }\n  }\n}\n","import { DbxPopoverController } from './popover';\nimport { Component, inject } from '@angular/core';\nimport { DbxPopoverCoordinatorService } from './popover.coordinator.service';\nimport { delay, distinctUntilChanged, map, shareReplay } from 'rxjs';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { clean } from '@dereekb/dbx-core';\n\n/**\n * Coordinates popover display by registering with {@link DbxPopoverCoordinatorService} and only rendering content when this popover is the active one for its key.\n *\n * @example\n * ```html\n * <dbx-popover-coordinator>\n *   <div>Popover content rendered only when active.</div>\n * </dbx-popover-coordinator>\n * ```\n */\n@Component({\n  selector: 'dbx-popover-coordinator',\n  template: `\n    @if (showSignal()) {\n      <ng-content></ng-content>\n    }\n  `\n})\nexport class DbxPopoverCoordinatorComponent {\n  private readonly _service = inject(DbxPopoverCoordinatorService);\n  private readonly _popover = inject(DbxPopoverController);\n\n  readonly isPopoverForKey$ = this._service.popovers$.pipe(\n    map((x) => x.get(this._popover.key) === this._popover),\n    distinctUntilChanged(),\n    shareReplay(1) // TODO: Unsure why this delay is here after all\n  );\n\n  readonly show$ = this.isPopoverForKey$.pipe(delay(0));\n  readonly showSignal = toSignal(this.show$);\n\n  constructor() {\n    this._service.addPopover(this._popover);\n    clean(() => this._service.removePopover(this._popover.key, this._popover));\n  }\n}\n","import { HostListener, Directive, input, output, computed } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Listens for `window:keydown` events and emits matching keyboard events.\n *\n * Optionally filters by specific key names and can be disabled at runtime.\n *\n * @example\n * ```html\n * <!-- Listen for all keydown events -->\n * <div dbxWindowKeyDownListener (dbxWindowKeyDownListener)=\"onKey($event)\"></div>\n *\n * <!-- Listen only for Escape and Enter keys -->\n * <div dbxWindowKeyDownListener\n *   [dbxWindowKeyDownFilter]=\"['Escape', 'Enter']\"\n *   (dbxWindowKeyDownListener)=\"onKey($event)\">\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxWindowKeyDownListener]'\n})\nexport class DbxWindowKeyDownListenerDirective {\n  readonly dbxWindowKeyDownListener = output<KeyboardEvent>();\n\n  readonly dbxWindowKeyDownEnabled = input<Maybe<boolean>>();\n  readonly dbxWindowKeyDownFilter = input<Maybe<string[]>>();\n\n  readonly isEnabledSignal = this.dbxWindowKeyDownEnabled;\n\n  readonly keysFilterSignal = computed(() => {\n    const filterOnKeys = this.dbxWindowKeyDownFilter();\n    let filter: Maybe<Set<string>>;\n\n    if (filterOnKeys) {\n      filter = new Set(filterOnKeys);\n    }\n\n    return filter;\n  });\n\n  @HostListener('window:keydown', ['$event'])\n  handleKeyboardEvent(event: KeyboardEvent) {\n    const keysFilter = this.keysFilterSignal();\n    const enabled = this.isEnabledSignal();\n\n    if (enabled !== false && (!keysFilter || keysFilter.has(event.key))) {\n      this.dbxWindowKeyDownListener.emit(event);\n    }\n  }\n}\n","import { Component, type Type, type OnInit, type OnDestroy, type ElementRef, inject } from '@angular/core';\nimport { type NgOverlayContainerConfiguration, type NgPopoverCloseType, NgPopoverRef } from 'ng-overlay-container';\nimport { AbstractTransitionWatcherDirective, DbxInjectionComponent, type DbxInjectionComponentConfig, completeOnDestroy } from '@dereekb/dbx-core';\nimport { Subject, filter, first, map, shareReplay, startWith } from 'rxjs';\nimport { PopoverPositionStrategy } from './popover.position.strategy';\nimport { type Overlay } from '@angular/cdk/overlay';\nimport { LockSet } from '@dereekb/rxjs';\nimport { CompactContextStore, CompactMode } from '../../layout/compact';\nimport { isPromise, type Maybe, type PromiseOrValue, type SpaceSeparatedCssClasses } from '@dereekb/util';\nimport { DbxPopoverController, type DbxPopoverKey } from './popover';\nimport { DbxPopoverCoordinatorComponent } from './popover.coordinator.component';\nimport { DbxWindowKeyDownListenerDirective } from '../../keypress';\n\n/**\n * Extended popover controller that supports an optional async closing value function.\n */\nexport abstract class DbxPopoverComponentController<O, I> extends DbxPopoverController<O, I> {\n  getClosingValueFn?: (value?: I) => Promise<O>;\n}\n\nexport interface DbxPopoverComponentConfig<O, I, T> {\n  /**\n   * Key used for uniquely identifying a limited instance.\n   *\n   * Only one popover should exist at a time given a certain key.\n   */\n  readonly key: DbxPopoverKey;\n  /**\n   * Origin element to position on.\n   */\n  readonly origin: ElementRef;\n  /**\n   * Whether or not to close if a transition occurs.\n   */\n  readonly closeOnTransition?: boolean;\n  /**\n   * Whether or not to dismiss when the escape button is pressed.\n   *\n   * False by default.\n   */\n  readonly closeOnEscape?: boolean;\n  /**\n   * Component to inject into the popover.\n   */\n  readonly componentClass: Type<T>;\n  /**\n   * Panel classes to add to the popover.\n   */\n  readonly panelClass?: Maybe<SpaceSeparatedCssClasses>;\n  /**\n   * Data available to the popover.\n   */\n  readonly data?: Maybe<I>;\n  /**\n   * Optional function to initialize the popover component.\n   *\n   * @param component\n   * @param controller\n   */\n  readonly init?: (component: T, controller: DbxPopoverController<O, I>) => void;\n}\n\n/**\n * Full popover configuration including overlay container settings. Used internally.\n */\nexport interface FullDbxPopoverComponentConfig<O, I, T> extends DbxPopoverComponentConfig<O, I, T> {\n  readonly configuration: NgOverlayContainerConfiguration;\n}\n\n/**\n * Core popover component that renders injected content with position strategy, transition watching, and keyboard close support.\n *\n * Coordinates with {@link DbxPopoverCoordinatorService} to ensure only one popover per key is active at a time.\n *\n * @dbxWebComponent\n * @dbxWebSlug popover\n * @dbxWebCategory overlay\n * @dbxWebRelated popup, prompt-confirm, dialog-content\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-popover></dbx-popover>\n * ```\n *\n * @example\n * ```html\n * // In a service: this.popoverService.open({ content: MyContentComponent, origin })\n * ```\n */\n@Component({\n  template: `\n    <dbx-popover-coordinator role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"key\" (dbxWindowKeyDownListener)=\"handleKeydown()\" [dbxWindowKeyDownFilter]=\"triggerCloseKeys\">\n      <div class=\"dbx-popover-component\" dbx-injection [config]=\"contentConfig\"></div>\n    </dbx-popover-coordinator>\n  `,\n  providers: [\n    {\n      provide: DbxPopoverController,\n      useExisting: DbxPopoverComponent\n    },\n    {\n      provide: CompactContextStore\n    }\n  ],\n  host: {\n    '[class]': 'config.panelClass'\n  },\n  imports: [DbxPopoverCoordinatorComponent, DbxWindowKeyDownListenerDirective, DbxInjectionComponent]\n})\nexport class DbxPopoverComponent<O = unknown, I = unknown, T = unknown> extends AbstractTransitionWatcherDirective implements DbxPopoverController<O, I>, OnInit, OnDestroy {\n  private readonly popoverRef = inject(NgPopoverRef<FullDbxPopoverComponentConfig<O, I, T>, O>);\n  private readonly compactContextState = inject(CompactContextStore);\n\n  readonly lockSet = new LockSet();\n\n  readonly contentConfig: DbxInjectionComponentConfig = {\n    componentClass: this.config.componentClass,\n    init: this.config.init ? (instance) => (this.config as Required<FullDbxPopoverComponentConfig<O, I, T>>).init(instance as T, this) : undefined\n  };\n\n  private _startedClosing = false;\n  private _awaitingClosingValue = false;\n  private readonly _closing = completeOnDestroy(new Subject<void>());\n\n  private _triggerCloseKeys: string[] = [];\n\n  readonly isClosing$ = this._closing.pipe(\n    first(),\n    map(() => true),\n    startWith(false),\n    shareReplay(1)\n  );\n\n  readonly closing$ = this.isClosing$.pipe(filter((x) => x));\n\n  /**\n   * Optional function that provides the value to close with. A value that is not a promise closes the popover right away.\n   */\n  getClosingValueFn?: (value: Maybe<I>, closeType: NgPopoverCloseType) => PromiseOrValue<O | undefined>;\n\n  constructor() {\n    super();\n\n    // Override Close to properly signal to listeners when a close is occuring.\n    const originalClose = this.popoverRef.close;\n    this.popoverRef.close = (x) => {\n      if (!this._startedClosing) {\n        this.lockSet.lockForSeconds(1);\n        this._startedClosing = true;\n        this.close();\n        originalClose.call(this.popoverRef, x);\n      }\n    };\n\n    // Also intercept the _close function to capture backdropClose, etc.\n    const original_close = (this.popoverRef as any)._close;\n    (this.popoverRef as any)._close = (closeType: NgPopoverCloseType, inputValue: O | undefined) => {\n      const closeWithValue = (value?: O | undefined) => {\n        original_close.call(this.popoverRef, closeType, value);\n      };\n\n      if (closeType === 'close' || inputValue != null) {\n        closeWithValue(inputValue);\n      } else {\n        // expected to be a backdrop close. Get the closing value then close.\n        this._useClosingValue(closeType, (x) => closeWithValue(x));\n      }\n    };\n\n    const overlay = (this.popoverRef as any)._overlay as Overlay; // overlay is not publically accessible\n    const elementRef = this.config.origin;\n    const configuration = this.config.configuration;\n\n    this.compactContextState.setMode(CompactMode.COMPACT);\n    const position = PopoverPositionStrategy.make(overlay, elementRef, configuration);\n    this.popoverRef.overlay.updatePositionStrategy(position);\n  }\n\n  get config(): FullDbxPopoverComponentConfig<O, I, T> {\n    return this.popoverRef.data;\n  }\n\n  get panelClass(): Maybe<SpaceSeparatedCssClasses> {\n    return this.config.panelClass;\n  }\n\n  get key(): DbxPopoverKey {\n    return this.config.key;\n  }\n\n  get data(): Maybe<I> {\n    return this.config.data;\n  }\n\n  get triggerCloseKeys(): string[] {\n    return this._triggerCloseKeys;\n  }\n\n  ngOnInit(): void {\n    if (this.config.closeOnEscape) {\n      this._triggerCloseKeys = ['Escape'];\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.lockSet.destroyOnNextUnlock(() => {\n      this._closing.complete();\n    });\n  }\n\n  protected updateForSuccessfulTransition(): void {\n    if (this.config.closeOnTransition !== false) {\n      this.close();\n    }\n  }\n\n  // Popover Controls\n  public close(): void {\n    if (!this._startedClosing && this.getClosingValueFn != null) {\n      this._useClosingValue('close', (x) => this.return(x));\n    } else {\n      this.return();\n    }\n  }\n\n  public return(value?: O | undefined): void {\n    this._closing.next();\n    this.popoverRef.close(value);\n  }\n\n  private _useClosingValue(closeType: NgPopoverCloseType, useValue: (value?: O | undefined) => void) {\n    if (this.getClosingValueFn == null) {\n      useValue();\n    } else if (!this._awaitingClosingValue) {\n      // a close requested while the closing value is computed is ignored, so the closing value is only computed once\n      this._awaitingClosingValue = true;\n      const closingValue = this.getClosingValueFn(this.data, closeType);\n\n      if (isPromise(closingValue)) {\n        closingValue.then(\n          (x) => {\n            useValue(x);\n          },\n          () => {\n            useValue();\n          }\n        );\n      } else {\n        useValue(closingValue);\n      }\n    }\n  }\n\n  // Keypresses\n  handleKeydown() {\n    this.close();\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { DbxPopoverComponent } from './popover.component';\n\n/**\n * Abstract base directive for components rendered inside a popover, providing access to close and return operations.\n */\n@Directive()\nexport abstract class AbstractPopoverDirective<O = unknown, I = unknown, T = unknown> {\n  readonly popover = inject(DbxPopoverComponent<O, I, T>);\n\n  close(): void {\n    this.popover.close();\n  }\n\n  returnAndClose(value: O): void {\n    this.popover.return(value);\n  }\n}\n","import { type ComponentRef, type Provider, type Type, forwardRef } from '@angular/core';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { type Observable } from 'rxjs';\n\n/**\n * Unique key used to identify a detach instance.\n */\nexport type DbxDetachKey = string;\n\n/**\n * Default key used when no key is specified.\n */\nexport const DEFAULT_DBX_DETACH_KEY: DbxDetachKey = 'default';\n\n/**\n * Possible display states for a detach instance.\n */\nexport const DbxDetachWindowState = {\n  /**\n   * Content renders at an outlet location in the page.\n   */\n  ATTACHED: 'attached' as const,\n  /**\n   * Content renders in a floating overlay (via ng-overlay-container).\n   */\n  DETACHED: 'detached' as const,\n  /**\n   * Content is in the floating overlay but body is hidden (only controls visible).\n   */\n  MINIMIZED: 'minimized' as const\n} as const;\n\n/**\n * Union type of all possible detach window state values.\n */\nexport type DbxDetachWindowStateType = (typeof DbxDetachWindowState)[keyof typeof DbxDetachWindowState];\n\n/**\n * Overlay-specific configuration for a detach instance.\n */\nexport interface DbxDetachOverlayConfig {\n  readonly width?: string;\n  readonly height?: string;\n  readonly isDraggable?: boolean;\n}\n\n/**\n * Configuration for initializing a detach instance.\n *\n * Extends {@link DbxInjectionComponentConfig} with an optional key and overlay settings.\n */\nexport interface DbxDetachConfig<T = unknown> extends DbxInjectionComponentConfig<T> {\n  readonly key?: DbxDetachKey;\n  readonly overlay?: DbxDetachOverlayConfig;\n}\n\n/**\n * Tracks a single detached component managed by {@link DbxDetachService}.\n *\n * The component is created imperatively and lives in the service.\n * Outlets and overlays are just display locations — this instance\n * tracks which location currently hosts the component.\n */\nexport interface DbxDetachInstance<T = unknown> {\n  readonly key: DbxDetachKey;\n  readonly componentRef: ComponentRef<T>;\n  readonly windowState$: Observable<DbxDetachWindowStateType>;\n  readonly closing$: Observable<boolean>;\n  /**\n   * Moves content to an outlet in the page (if one exists for this key).\n   */\n  attach(): void;\n  /**\n   * Moves content to the floating overlay.\n   */\n  detach(): void;\n  /**\n   * Collapses the floating overlay so only controls are visible.\n   */\n  minimize(): void;\n  /**\n   * Destroys the detached component entirely.\n   */\n  close(): void;\n}\n\n/**\n * Abstract controller that content components can inject to\n * trigger state changes without being aware of the underlying mechanism.\n */\nexport abstract class DbxDetachController<I = unknown> {\n  abstract readonly key: DbxDetachKey;\n  abstract readonly data?: Maybe<I>;\n  abstract readonly windowState$: Observable<DbxDetachWindowStateType>;\n  abstract readonly closing$: Observable<boolean>;\n  abstract attach(): void;\n  abstract detach(): void;\n  abstract minimize(): void;\n  abstract close(): void;\n}\n\n/**\n * Creates Angular providers that register a {@link DbxDetachController} implementation for DI.\n *\n * @param sourceType - The concrete class to provide as the controller.\n * @returns Array of Angular providers that bind the source type to {@link DbxDetachController}.\n *\n * @Component ({\n *   providers: provideDbxDetachController(MyDetachController),\n * })\n * export class MyComponent {}\n * ```\n *\n * @example\n * ```typescript\n */\nexport function provideDbxDetachController<S extends DbxDetachController>(sourceType: Type<S>): Provider[] {\n  return [\n    {\n      provide: DbxDetachController,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n","import { Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { map } from 'rxjs';\nimport { DbxDetachController, DbxDetachWindowState } from './detach';\n\n/**\n * Wraps detach body content, hiding the body when the panel is minimized while keeping the controls visible.\n *\n * @example\n * ```html\n * <dbx-detach-content>\n *   <dbx-detach-controls controls [header]=\"'My Panel'\"></dbx-detach-controls>\n *   <p>Body content here.</p>\n * </dbx-detach-content>\n * ```\n */\n@Component({\n  selector: 'dbx-detach-content',\n  template: `\n    <ng-content select=\"[controls]\"></ng-content>\n    @if (showContentSignal()) {\n      <div class=\"dbx-detach-content-container\">\n        <ng-content></ng-content>\n      </div>\n    }\n  `,\n  host: {\n    class: 'dbx-detach-content'\n  }\n})\nexport class DbxDetachContentComponent {\n  private readonly _detachController = inject(DbxDetachController);\n\n  readonly showContent$ = this._detachController.windowState$.pipe(map((x) => x !== DbxDetachWindowState.MINIMIZED));\n  readonly showContentSignal = toSignal(this.showContent$, { initialValue: true });\n}\n","import { type CharacterPrefixSuffixCleanString, type CssClass, type CssStyleObject, type CssToken, cssTokenVar, type CssTokenVar, DASH_CHARACTER_PREFIX_INSTANCE, type DashPrefixString, hashStringToNumber, type Maybe } from '@dereekb/util';\n\n// MARK: App Styling\n/**\n * An kebab-case style name that uniquely identifies a styling for an app.\n *\n * Examples: 'doc-app'\n */\nexport type DbxStyleName = string;\n\n/**\n * A suffix that can be added to a style class to differentiate a separate mode.\n *\n * Dark mode is an example, with the suffix 'dark' or '-dark'. The suffix does not have to\n */\nexport type DbxStyleClassSuffix = DbxStyleClassCleanSuffix | DbxStyleClassDashSuffix;\n\n/**\n * A DbxStyleClassSuffix that does not start with a dash.\n *\n * Dark mode is an example, with the suffix 'dark'.\n */\nexport type DbxStyleClassCleanSuffix = CharacterPrefixSuffixCleanString;\n\n/**\n * A DbxStyleClassSuffix that starts with a dash.\n *\n * Dark mode is an example, with the suffix '-dark'.\n */\nexport type DbxStyleClassDashSuffix = DashPrefixString;\n\n/**\n * Strips a leading dash from a style class suffix string, producing a clean suffix.\n */\nexport const dbxStyleClassCleanSuffix = DASH_CHARACTER_PREFIX_INSTANCE.cleanString;\n\n/**\n * A style class that is a combination of a style name and a suffix.\n *\n * Examples:\n * - 'doc-app': the default style of an app\n * - 'doc-app-dark': the dark mode style of an app\n */\nexport type DbxStyleClass = string | `${DbxStyleName}${DbxStyleClassSuffix}`;\n\n/**\n * The standard suffix used for dark mode styling.\n */\nexport const DBX_DARK_STYLE_CLASS_SUFFIX: DbxStyleClassSuffix = '-dark';\n\n/**\n * Configuration for an application's style, including the root style class and allowed suffixes for variant modes (e.g., dark mode).\n */\nexport interface DbxStyleConfig {\n  /**\n   * Root style class name.\n   */\n  readonly style: DbxStyleClass;\n  /**\n   * Set of all allowed DbxStyleClassSuffixes for the DbxStyleClass in the config, if applicable.\n   */\n  readonly suffixes?: Set<DbxStyleClassSuffix>;\n}\n\n/**\n * Supplemental classes / inline styles (CSS custom properties) applied on top of the configured global style.\n *\n * Used by `DbxStyleService` to layer additional styling onto `document.body` (via `DbxStyleBodyDirective`) without\n * replacing the configured root style class — e.g. the style-demo controls forward their active levers here so they\n * repaint the entire app.\n */\nexport interface DbxStyleSupplement {\n  /**\n   * Supplemental classes added alongside the configured root style class.\n   */\n  readonly classes?: Maybe<CssClass[]>;\n  /**\n   * Supplemental inline styles (typically CSS custom properties such as `--mat-sys-*`).\n   */\n  readonly style?: Maybe<CssStyleObject>;\n}\n\n/**\n * Flattened body application: the root style class plus any supplement classes, alongside the supplement inline styles.\n *\n * Emitted by `DbxStyleService.styleApplication$` and consumed by `DbxStyleBodyDirective` to apply both classes and\n * inline custom properties to `document.body`.\n */\nexport interface DbxStyleApplication {\n  /**\n   * The root style class followed by any supplement classes.\n   */\n  readonly classes: CssClass[];\n  /**\n   * The supplement inline styles (empty when no supplement is set).\n   */\n  readonly style: CssStyleObject;\n}\n\n// MARK: Theme\n/**\n * The five core Material Design M3 theme palette colors.\n *\n * - 'secondary' is the M3 secondary palette color (equivalent to 'accent')\n * - 'tertiary' is the M3 tertiary palette color\n */\nexport type DbxThemeColorMain = 'primary' | 'secondary' | 'tertiary' | 'accent' | 'warn';\n\n/**\n * Additional semantic theme colors beyond the core Material palettes.\n */\nexport type DbxThemeColorExtra = 'notice' | 'ok' | 'success' | 'grey';\n\n/**\n * Secondary theme colors representing neutral or inactive states.\n */\nexport type DbxThemeColorExtraSecondary = 'default' | 'disabled';\n\n/**\n * Union of main and extra theme colors, excluding secondary states.\n */\nexport type DbxThemeColorMainOrExtra = DbxThemeColorMain | DbxThemeColorExtra;\n\n/**\n * All available theme colors, including main, extra, and secondary variants.\n */\nexport type DbxThemeColor = DbxThemeColorMainOrExtra | DbxThemeColorExtraSecondary;\n\nexport const DBX_THEME_COLORS_MAIN: DbxThemeColorMain[] = ['primary', 'secondary', 'tertiary', 'accent', 'warn'];\nexport const DBX_THEME_COLORS_EXTRA: DbxThemeColorExtra[] = ['notice', 'ok', 'success', 'grey'];\nexport const DBX_THEME_COLORS_EXTRA_SECONDARY: DbxThemeColorExtraSecondary[] = ['default', 'disabled'];\nexport const DBX_THEME_COLORS: DbxThemeColor[] = [...DBX_THEME_COLORS_MAIN, ...DBX_THEME_COLORS_EXTRA, ...DBX_THEME_COLORS_EXTRA_SECONDARY];\n\n/**\n * Background mix percentage (0-100) that controls the opacity of a themed background color.\n *\n * Used with `--dbx-color-bg-tone` to create tonal/muted color appearances.\n * A value of `100` produces a fully opaque background, while lower values (e.g. `18`) produce a subtle tonal effect.\n */\nexport type DbxColorTone = number;\n\n/**\n * Identifier for a {@link DbxColorConfigTemplate} registered with the `DbxColorService`.\n *\n * Use a kebab-case string (e.g. `'brand-positive'`) to reference a template from a\n * {@link DbxColorConfig} via {@link DbxColorConfig.template}.\n */\nexport type DbxColorConfigTemplateKey = string;\n\n/**\n * Reusable, named {@link DbxColorConfig} preset registered with the `DbxColorService`.\n *\n * Templates are looked up by their {@link key} and merged beneath an input\n * {@link DbxColorConfig} that references them via {@link DbxColorConfig.template}.\n */\nexport interface DbxColorConfigTemplate {\n  /**\n   * Unique key identifying this template.\n   */\n  readonly key: DbxColorConfigTemplateKey;\n  /**\n   * Template values applied when an input {@link DbxColorConfig} references this template.\n   */\n  readonly config: DbxColorConfig;\n  /**\n   * When true, the template participates in the \"curated color set\" — the pool of colors used by\n   * deterministic color pickers (e.g. avatar initials backgrounds via {@link dbxCuratedColorConfigForString}).\n   */\n  readonly curated?: Maybe<boolean>;\n}\n\n/**\n * Config object accepted by `[dbxColor]` / `[dbxTextColor]` when applying an arbitrary (non-themed) color.\n *\n * Any valid CSS color value is allowed: hex, `rgb()`, `hsl()`, `var(...)`, `color-mix(...)`, etc.\n *\n * A {@link template} can also be set to reference a registered {@link DbxColorConfigTemplate}\n * via the `DbxColorService`; the template's fields are merged in as defaults, with the\n * input config's fields taking precedence.\n *\n * @example\n * ```html\n * <div [dbxColor]=\"{ color: '#ff0066', contrast: 'white' }\">Hex</div>\n * <div [dbxColor]=\"{ color: 'var(--mat-sys-tertiary)', contrast: 'var(--mat-sys-on-tertiary)', tone: 18 }\">Tonal</div>\n * <span [dbxTextColor]=\"{ color: '#0066ff' }\">Text only</span>\n * <div [dbxColor]=\"{ template: 'brand-positive' }\">Template</div>\n * <div [dbxColor]=\"{ template: 'brand-positive', tone: 60 }\">Template with override</div>\n * ```\n */\nexport interface DbxColorConfig {\n  /**\n   * Optional key of a {@link DbxColorConfigTemplate} registered with the `DbxColorService`.\n   *\n   * When set, the referenced template's fields are merged beneath this config (input fields win).\n   */\n  readonly template?: Maybe<DbxColorConfigTemplateKey>;\n  /**\n   * Background/vibrant color when used with `[dbxColor]`; foreground color when used with `[dbxTextColor]`.\n   *\n   * Optional when a {@link template} is set that supplies the color.\n   */\n  readonly color?: string;\n  /**\n   * Contrast/foreground color used by `[dbxColor]`. Ignored by `[dbxTextColor]`.\n   */\n  readonly contrast?: string;\n  /**\n   * Optional opacity (0-100). The standalone `[dbxColorTone]` input wins when set.\n   */\n  readonly tone?: DbxColorTone;\n  /**\n   * Optional explicit tonal-mode flag. Only consulted when the standalone `[dbxColorTone]` input is unset.\n   */\n  readonly tonal?: boolean;\n}\n\n/**\n * Union accepted by `[dbxColor]` and `[dbxTextColor]` — either a named theme color or a config object with arbitrary CSS color values.\n */\nexport type DbxColorInput = DbxThemeColor | DbxColorConfig | '';\n\n/**\n * Type guard: true when the value is a {@link DbxColorConfig} object (not a named-color string).\n *\n * Any non-null object is treated as a config so template-only configs (i.e. `{ template: 'foo' }`)\n * are detected before the service expands them.\n *\n * @param value - The value to test.\n * @returns `true` when the value is a {@link DbxColorConfig}\n *\n * @example\n * ```ts\n * isDbxColorConfig('primary'); // false\n * isDbxColorConfig({ color: '#ff0066' }); // true\n * isDbxColorConfig({ template: 'brand-positive' }); // true\n * isDbxColorConfig(undefined); // false\n * ```\n */\nexport function isDbxColorConfig(value: Maybe<DbxColorInput>): value is DbxColorConfig {\n  return typeof value === 'object' && value !== null;\n}\n\n// MARK: Curated Colors\n/**\n * Number of curated colors shipped in the default curated color set.\n *\n * Matches the `--dbx-curated-color-1` … `--dbx-curated-color-{@link DBX_CURATED_COLOR_COUNT}` CSS tokens\n * declared by the dbx-web theme.\n */\nexport const DBX_CURATED_COLOR_COUNT = 12;\n\n/**\n * Key prefix used for the default curated color templates ({@link DBX_CURATED_COLOR_TEMPLATES}).\n */\nexport const DBX_CURATED_COLOR_TEMPLATE_KEY_PREFIX = 'curated-';\n\n/**\n * Default curated color templates ({@link DBX_CURATED_COLOR_COUNT} entries).\n *\n * Each template is flagged {@link DbxColorConfigTemplate.curated} and references the\n * `--dbx-curated-color-N` / `--dbx-curated-color-N-contrast` CSS tokens (rather than literal color\n * values) so applications can override the palette by overriding those tokens. The `var(...)` values\n * are applied directly by `[dbxColor]` even when the `DbxColorService` has not expanded the template.\n *\n * Registered automatically by the `DbxColorService` so the curated set is always available.\n */\nexport const DBX_CURATED_COLOR_TEMPLATES: DbxColorConfigTemplate[] = Array.from({ length: DBX_CURATED_COLOR_COUNT }, (_, index) => {\n  const colorNumber = index + 1;\n\n  return {\n    key: `${DBX_CURATED_COLOR_TEMPLATE_KEY_PREFIX}${colorNumber}`,\n    curated: true,\n    config: {\n      color: `var(--dbx-curated-color-${colorNumber})`,\n      contrast: `var(--dbx-curated-color-${colorNumber}-contrast)`\n    }\n  };\n});\n\n/**\n * Deterministically selects a curated {@link DbxColorConfig} for the given string.\n *\n * The same input string always maps to the same curated color (via {@link hashStringToNumber}),\n * making it suitable for stable, name-derived colors such as avatar initials backgrounds. The\n * returned config includes the picked template's `key` (so the `DbxColorService` can re-expand it\n * with app overrides) alongside its `var(...)`-backed color values (so it renders even without the service).\n *\n * @param value - The string to derive a curated color from (e.g. a person's name).\n * @param templates - Curated templates to pick from. Defaults to {@link DBX_CURATED_COLOR_TEMPLATES}.\n * @returns The selected curated config, or `null` when the value is blank or no templates are available.\n *\n * @example\n * ```ts\n * dbxCuratedColorConfigForString('Michelle B');\n * // -> { color: 'var(--dbx-curated-color-3)', contrast: 'var(--dbx-curated-color-3-contrast)', template: 'curated-3' }\n * ```\n */\nexport function dbxCuratedColorConfigForString(value: Maybe<string>, templates: DbxColorConfigTemplate[] = DBX_CURATED_COLOR_TEMPLATES): Maybe<DbxColorConfig> {\n  let result: Maybe<DbxColorConfig>;\n\n  if (value && templates.length > 0) {\n    const index = hashStringToNumber(value) % templates.length;\n    const template = templates[index];\n    result = { ...template.config, template: template.key };\n  }\n\n  return result;\n}\n\n/**\n * CSS class that applies the background `color-mix` rule using the host's inline `--dbx-bg-color-current` / `--dbx-color-current` values.\n *\n * Used by `[dbxColor]` when bound to a {@link DbxColorConfig}.\n */\nexport const DBX_COLOR_CUSTOM_BG_CSS_CLASS: CssClass = 'dbx-color-bg';\n\n/**\n * CSS class that applies `color: var(--dbx-color-current)` only.\n *\n * Used by `[dbxTextColor]` when bound to a {@link DbxColorConfig}.\n */\nexport const DBX_COLOR_CUSTOM_TEXT_CSS_CLASS: CssClass = 'dbx-color-text';\n\n/**\n * Returns the token-providing CSS class name for a themed background color.\n *\n * Under the token-only contract the returned `dbx-{color}-bg` classes declare the `--dbx-bg-color-current` /\n * `--dbx-color-current` custom properties but paint nothing on their own — painting is performed by the\n * `.dbx-color-bg` utility (or a `.dbx-color`-scoped component) reading those tokens. For named colors this returns the\n * `dbx-{color}-bg` token class; for a {@link DbxColorConfig} it returns {@link DBX_COLOR_CUSTOM_BG_CSS_CLASS} so static\n * (non-directive) callers still paint, while the `[dbxColor]` directive itself bypasses this for configs and supplies the\n * tokens through inline style bindings instead.\n *\n * @param color - The theme color, color config, or nullish/empty for the default class.\n * @returns The CSS class name for the themed background (e.g., `'dbx-primary-bg'`, `'dbx-color-bg'`, or `'dbx-default'`)\n *\n * @example\n * ```ts\n * dbxColorBackground('primary'); // 'dbx-primary-bg'\n * dbxColorBackground({ color: '#ff0066' }); // 'dbx-color-bg'\n * dbxColorBackground(undefined); // 'dbx-default'\n * ```\n */\nexport function dbxColorBackground(color: Maybe<DbxColorInput>): CssClass {\n  let cssClass: CssClass = 'dbx-default'; // default text color class (not -bg) to avoid setting --dbx-bg-color-current which interferes with button label color tokens\n\n  if (isDbxColorConfig(color)) {\n    cssClass = DBX_COLOR_CUSTOM_BG_CSS_CLASS;\n  } else {\n    switch (color) {\n      case 'primary':\n      case 'secondary':\n      case 'tertiary':\n      case 'accent':\n      case 'warn':\n      case 'notice':\n      case 'ok':\n      case 'success':\n      case 'grey':\n      case 'disabled':\n      case 'default':\n        cssClass = `dbx-${color}-bg`;\n        break;\n      default:\n        break;\n    }\n  }\n\n  return cssClass;\n}\n\n/**\n * Maps each {@link DbxThemeColor} to its corresponding CSS token reference string.\n */\nconst DBX_THEME_COLOR_CSS_VAR_MAP: Record<DbxThemeColor, CssToken> = {\n  primary: '--dbx-primary-color',\n  secondary: '--dbx-secondary-color',\n  tertiary: '--dbx-tertiary-color',\n  accent: '--dbx-accent-color',\n  warn: '--dbx-warn-color',\n  notice: '--dbx-notice-color',\n  ok: '--dbx-ok-color',\n  success: '--dbx-success-color',\n  grey: '--dbx-grey-color',\n  disabled: '--dbx-disabled-color',\n  default: '--dbx-default-color'\n};\n\n/**\n * Returns the CSS token reference string for a given {@link DbxThemeColor}.\n *\n * @example\n * ```ts\n * dbxThemeColorCssToken('primary'); // '--dbx-primary-color'\n * dbxThemeColorCssToken(undefined); // undefined\n * ```\n *\n * @param color - the theme color, or nullish/empty for the default\n * @param returnDefault - when true, returns the default token instead of undefined for unrecognized colors\n * @returns CSS token reference string (e.g., `'--dbx-primary-color'`) or undefined if the color is not valid.\n */\nexport function dbxThemeColorCssToken(color: Maybe<DbxThemeColor>, returnDefault: true): CssToken;\nexport function dbxThemeColorCssToken(color: Maybe<DbxThemeColor>, returnDefault?: Maybe<boolean>): Maybe<CssToken>;\nexport function dbxThemeColorCssToken(color: Maybe<DbxThemeColor>, returnDefault?: Maybe<boolean>): Maybe<CssToken> {\n  let result: Maybe<CssToken>;\n\n  if (color && color in DBX_THEME_COLOR_CSS_VAR_MAP) {\n    result = DBX_THEME_COLOR_CSS_VAR_MAP[color];\n  } else if (returnDefault) {\n    result = DBX_THEME_COLOR_CSS_VAR_MAP.default;\n  }\n\n  return result;\n}\n\n/**\n * Returns the CSS token var() reference string for a given {@link DbxThemeColor}.\n *\n * @example\n * ```ts\n * dbxThemeColorCssTokenVar('primary'); // 'var(--dbx-primary-color)'\n * dbxThemeColorCssTokenVar(undefined); // undefined\n * ```\n *\n * @param color - the theme color, or nullish/empty for the default\n * @param returnDefault - when true, returns the default token var instead of undefined for unrecognized colors\n * @returns CSS token var() reference string (e.g., `'var(--dbx-primary-color)'`) or undefined if the color is not valid.\n */\nexport function dbxThemeColorCssTokenVar(color: Maybe<DbxThemeColor>, returnDefault: true): CssTokenVar;\nexport function dbxThemeColorCssTokenVar(color: Maybe<DbxThemeColor>, returnDefault?: Maybe<boolean>): Maybe<CssTokenVar>;\nexport function dbxThemeColorCssTokenVar(color: Maybe<DbxThemeColor>, returnDefault?: Maybe<boolean>): Maybe<CssTokenVar> {\n  const cssVar = dbxThemeColorCssToken(color, returnDefault);\n  let result: Maybe<CssTokenVar>;\n\n  if (cssVar) {\n    result = cssTokenVar(cssVar);\n  }\n\n  return result;\n}\n","import { inject, Injectable } from '@angular/core';\nimport { type ArrayOrValue, type Maybe, useIterableOrValue } from '@dereekb/util';\nimport { type DbxColorConfig, type DbxColorConfigTemplate, type DbxColorConfigTemplateKey, DBX_CURATED_COLOR_TEMPLATES, dbxCuratedColorConfigForString } from './style';\n\n/**\n * Configuration provided in the root module/environment for seeding {@link DbxColorService} with initial templates.\n */\nexport abstract class DbxColorServiceConfig {\n  /**\n   * Templates to register at service construction time.\n   */\n  abstract readonly templates?: Maybe<DbxColorConfigTemplate[]>;\n}\n\n/**\n * Service that registers named {@link DbxColorConfigTemplate} entries and expands\n * {@link DbxColorConfig} values that reference a template by key.\n *\n * Seeded via `provideDbxStyleService({ dbxColorServiceConfig: { templates: [...] } })`,\n * then injected by {@link DbxColorDirective} and {@link DbxTextColorDirective} to resolve\n * template references at render time.\n *\n * @dbxWebComponent\n * @dbxWebSlug color-service\n * @dbxWebCategory layout\n * @dbxWebRelated color, text-color, style-service\n *\n * @example\n * ```ts\n * const colorService = inject(DbxColorService);\n * colorService.register({ key: 'brand-positive', config: { color: '#1f9b59', contrast: 'white', tone: 18 } });\n * colorService.expandColorConfig({ template: 'brand-positive' });\n * // -> { template: 'brand-positive', color: '#1f9b59', contrast: 'white', tone: 18 }\n * ```\n */\n@Injectable()\nexport class DbxColorService {\n  private readonly _templates = new Map<DbxColorConfigTemplateKey, DbxColorConfigTemplate>();\n\n  constructor() {\n    const initialConfig = inject(DbxColorServiceConfig, { optional: true });\n\n    // Register the default curated color set first so it is always available.\n    // App-provided templates are registered afterwards (override: true) so an app can replace a curated key.\n    this.register(DBX_CURATED_COLOR_TEMPLATES, false);\n\n    if (initialConfig?.templates) {\n      this.register(initialConfig.templates);\n    }\n  }\n\n  /**\n   * Registers one or more {@link DbxColorConfigTemplate} entries.\n   *\n   * @param templates - The template(s) to register.\n   * @param override - Whether existing entries with the same key should be replaced (default true)\n   */\n  register(templates: ArrayOrValue<DbxColorConfigTemplate>, override: boolean = true): void {\n    useIterableOrValue(templates, (template) => {\n      if (override || !this._templates.has(template.key)) {\n        this._templates.set(template.key, template);\n      }\n    });\n  }\n\n  /**\n   * Returns whether a template with the given key has been registered.\n   *\n   * @param key - The template key to check.\n   * @returns True when a template is registered under the given key.\n   */\n  hasTemplate(key: DbxColorConfigTemplateKey): boolean {\n    return this._templates.has(key);\n  }\n\n  /**\n   * Returns the {@link DbxColorConfigTemplate} registered under the given key, or undefined if none.\n   *\n   * @param key - The template key to look up.\n   * @returns The registered template, or undefined when no template matches.\n   */\n  getTemplate(key: DbxColorConfigTemplateKey): Maybe<DbxColorConfigTemplate> {\n    return this._templates.get(key);\n  }\n\n  /**\n   * Returns all currently registered template keys.\n   *\n   * @returns Array of all registered template keys.\n   */\n  getAllRegisteredTemplateKeys(): DbxColorConfigTemplateKey[] {\n    return Array.from(this._templates.keys());\n  }\n\n  /**\n   * Returns all registered templates flagged as part of the curated color set, in registration order.\n   *\n   * Includes the default {@link DBX_CURATED_COLOR_TEMPLATES} plus any app-registered curated templates.\n   *\n   * @returns The curated templates in insertion order.\n   */\n  getCuratedColorTemplates(): DbxColorConfigTemplate[] {\n    return Array.from(this._templates.values()).filter((template) => template.curated === true);\n  }\n\n  /**\n   * Deterministically selects a curated {@link DbxColorConfig} for the given string from the registered curated set.\n   *\n   * The same input always maps to the same curated color, making it suitable for stable, name-derived\n   * colors such as avatar initials backgrounds.\n   *\n   * @param value - The string to derive a curated color from (e.g. a person's name).\n   * @returns The selected curated config, or `null` when the value is blank or no curated templates are registered.\n   */\n  getCuratedColorForValue(value: Maybe<string>): Maybe<DbxColorConfig> {\n    return dbxCuratedColorConfigForString(value, this.getCuratedColorTemplates());\n  }\n\n  /**\n   * Resolves the {@link DbxColorConfig.template} reference (if any) and merges the template's\n   * fields beneath the input config. Input config fields override the template's fields.\n   *\n   * Returns the input unchanged when no template is set or when the template key is unknown.\n   *\n   * @param config - The input config to expand.\n   * @returns An expanded config, or the input unchanged when no expansion applies.\n   *\n   * @example\n   * ```ts\n   * service.register({ key: 'brand-positive', config: { color: '#1f9b59', contrast: 'white', tone: 18 } });\n   * service.expandColorConfig({ template: 'brand-positive' });\n   * // -> { template: 'brand-positive', color: '#1f9b59', contrast: 'white', tone: 18 }\n   * service.expandColorConfig({ template: 'brand-positive', tone: 60 });\n   * // -> { template: 'brand-positive', color: '#1f9b59', contrast: 'white', tone: 60 }\n   * ```\n   */\n  expandColorConfig(config: Maybe<DbxColorConfig>): Maybe<DbxColorConfig> {\n    let result: Maybe<DbxColorConfig> = config;\n\n    if (config?.template) {\n      const template = this._templates.get(config.template);\n\n      if (template) {\n        result = { ...template.config, ...config };\n      }\n    }\n\n    return result;\n  }\n}\n","import { computed, Directive, inject, model } from '@angular/core';\nimport { type DbxColorConfig, type DbxColorInput, type DbxColorTone, dbxColorBackground, isDbxColorConfig } from './style';\nimport { DbxColorService } from './style.color.service';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Provides themed color *tokens* to the host element — it never paints a background itself.\n *\n * Accepts either a {@link DbxThemeColor} string (e.g. `'primary'`, `'success'`) or a {@link DbxColorConfig}\n * object carrying arbitrary CSS color values (any hex, `rgb()`, `hsl()`, `var(...)`, `color-mix(...)`, etc.).\n * The directive sets the `--dbx-bg-color-current` / `--dbx-color-current` (and tone) custom properties and adds the\n * `.dbx-color` marker class, leaving the actual painting to either the explicit `.dbx-color-bg` utility on the same\n * element or a colored-surface component's own `.dbx-color`-scoped SCSS (e.g. `<dbx-bar>`, `<dbx-button>`, `<dbx-loading>`,\n * `<dbx-icon-tile>`, `<mat-card>`) that reads the inherited tokens.\n *\n * Optionally set {@link dbxColorTone} (0-100) to control background opacity for a tonal/muted appearance.\n * When tonal mode is active, the `dbx-color-tonal` CSS class is added and a CSS rule overrides the text\n * color to the vibrant color (via `--dbx-bg-color-current`).\n *\n * The standalone `[dbxColorTone]` input wins over `config.tone` when both are set; the same precedence\n * applies to tonal mode.\n *\n * @dbxWebComponent\n * @dbxWebSlug color\n * @dbxWebCategory layout\n * @dbxWebRelated text-color, color-service\n * @dbxWebMinimalExample ```html\n * <div dbxColor=\"primary\" class=\"dbx-color-bg\"></div>\n * ```\n *\n * @example\n * ```html\n * <!-- pair with .dbx-color-bg to paint a plain element -->\n * <div dbxColor=\"primary\" class=\"dbx-color-bg\">Themed background</div>\n * <div dbxColor=\"primary\" [dbxColorTone]=\"18\" class=\"dbx-color-bg\">Tonal themed</div>\n * <div [dbxColor]=\"{ color: '#ff0066', contrast: 'white' }\" class=\"dbx-color-bg\">Custom hex</div>\n *\n * <!-- a colored-surface component paints itself from the tokens; no .dbx-color-bg needed -->\n * <dbx-bar dbxColor=\"primary\">Bar paints itself</dbx-bar>\n * <dbx-button color=\"warn\" raised text=\"Delete\"></dbx-button>\n * ```\n */\n@Directive({\n  selector: '[dbxColor]',\n  host: {\n    '[class]': 'cssClassSignal()',\n    '[class.dbx-color]': 'hasColorSignal()',\n    '[class.dbx-color-tonal]': 'isTonalSignal()',\n    '[style.--dbx-color-bg-tone]': 'bgToneStyleSignal()',\n    '[style.--dbx-bg-color-current]': 'bgColorStyleSignal()',\n    '[style.--dbx-color-current]': 'colorStyleSignal()'\n  }\n})\nexport class DbxColorDirective {\n  private readonly _colorService = inject(DbxColorService, { optional: true });\n\n  /**\n   * The color to provide tokens for. Declared as a `model` so a colored-surface component on the same host (e.g.\n   * `dbx-button`) can push its resolved color into the directive, keeping it the single token provider on the element.\n   */\n  readonly dbxColor = model<Maybe<DbxColorInput>>();\n\n  /**\n   * Background tone level (0-100). When set, the background becomes semi-transparent\n   * and text color switches to the vibrant theme color for a tonal appearance.\n   *\n   * Declared as a `model` for the same reason as {@link dbxColor}: a colored-surface component on the same host (e.g.\n   * `dbx-avatar-view`) resolves its tone from its own inputs/context and pushes it here, keeping this directive the\n   * single token provider on the element.\n   */\n  readonly dbxColorTone = model<Maybe<DbxColorTone>>();\n\n  /**\n   * Whether a color is currently bound. When nothing is bound the directive is fully inert — it adds no marker class\n   * and no token class — so color tokens inherited from a `[dbxColor]` ancestor pass through untouched (important for\n   * components that host this directive unconditionally, e.g. `dbx-button` inside a tonal `[dbxColor]` card).\n   */\n  readonly hasColorSignal = computed(() => Boolean(this.dbxColor()));\n\n  /**\n   * Applies the named `dbx-{color}-bg` token class for a {@link DbxThemeColor} string, or `''` both for a\n   * {@link DbxColorConfig} (whose tokens are supplied by the inline `--dbx-bg-color-current` / `--dbx-color-current`\n   * style bindings instead) and when no color is bound (inert; inherited tokens pass through). The directive is a pure\n   * token provider — none of these classes paint a background; painting is done by the `.dbx-color-bg` utility or a\n   * component's own `.dbx-color`-scoped SCSS.\n   */\n  readonly cssClassSignal = computed(() => {\n    const value = this.dbxColor();\n    let cssClass = '';\n\n    if (value) {\n      cssClass = isDbxColorConfig(value) ? '' : dbxColorBackground(value);\n    }\n\n    return cssClass;\n  });\n\n  private readonly _configSignal = computed<Maybe<DbxColorConfig>>(() => {\n    const value = this.dbxColor();\n    return isDbxColorConfig(value) ? (this._colorService?.expandColorConfig(value) ?? value) : undefined;\n  });\n\n  /**\n   * Inline `--dbx-bg-color-current` value applied when a {@link DbxColorConfig} is bound. Resolves to `null` in string mode so the named `.dbx-{color}-bg` class supplies the variable instead.\n   */\n  readonly bgColorStyleSignal = computed(() => this._configSignal()?.color ?? null);\n\n  /**\n   * Inline `--dbx-color-current` value applied when a {@link DbxColorConfig} is bound. Resolves to `null` (and inherits from the named bg class) when omitted or in string mode.\n   */\n  readonly colorStyleSignal = computed(() => this._configSignal()?.contrast ?? null);\n\n  /**\n   * Effective tone used for opacity. The standalone `[dbxColorTone]` input wins when set; otherwise `config.tone` applies.\n   */\n  readonly effectiveToneSignal = computed<Maybe<DbxColorTone>>(() => {\n    const _config = this._configSignal();\n    const inputTone = this.dbxColorTone();\n    return inputTone ?? _config?.tone;\n  });\n\n  /**\n   * Whether tonal mode is active. Adds the `dbx-color-tonal` CSS class which\n   * overrides the text color to the vibrant theme color via CSS rather than\n   * an inline style binding (which would conflict with `[ngStyle]`).\n   *\n   * Precedence: an input-tone always implies tonal (existing behavior); otherwise\n   * `config.tonal` wins when explicitly set, then falls back to inferring tonal mode\n   * from `config.tone`.\n   */\n  readonly isTonalSignal = computed(() => {\n    const _config = this._configSignal();\n    const inputTone = this.dbxColorTone();\n    let tonal = false;\n\n    if (inputTone == null) {\n      const config = _config;\n\n      if (config?.tonal != null) {\n        tonal = config.tonal;\n      } else if (config?.tone != null) {\n        tonal = true;\n      }\n    } else {\n      tonal = true;\n    }\n\n    return tonal;\n  });\n\n  /**\n   * Sets `--dbx-color-bg-tone` on the host to control the background opacity via `color-mix` in the `-bg` class mixin.\n   */\n  readonly bgToneStyleSignal = computed(() => {\n    const tone = this.effectiveToneSignal();\n    return tone == null ? null : `${tone}%`;\n  });\n}\n","import { InjectionToken } from '@angular/core';\nimport { type ThemePalette } from '@angular/material/core';\nimport { type ProgressSpinnerMode } from '@angular/material/progress-spinner';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxThemeColor } from '../../layout/style/style';\nimport { type DbxButtonType } from '../button';\nimport { type DbxButtonEcho, type DbxButtonWorking } from '@dereekb/dbx-core';\n\n/**\n * Full configuration for a progress button, controlling appearance, working state,\n * colors, spinner behavior, and button type.\n */\nexport interface DbxProgressButtonConfig {\n  /**\n   * Current working state. A boolean enables indeterminate mode; a number (0-100) enables determinate mode.\n   */\n  readonly working?: Maybe<DbxButtonWorking>;\n  /**\n   * Button label text.\n   */\n  readonly text?: Maybe<string>;\n  /**\n   * Text displayed alongside the spinner while working.\n   */\n  readonly spinnerText?: Maybe<string>;\n  /**\n   * Theme color for the progress spinner.\n   */\n  readonly spinnerColor?: Maybe<ThemePalette | DbxThemeColor>;\n  /**\n   * Theme color for the progress bar (bar mode only).\n   */\n  readonly barColor?: Maybe<ThemePalette | DbxThemeColor>;\n  /**\n   * When true, renders only the icon button without text.\n   */\n  readonly iconOnly?: Maybe<boolean>;\n  /**\n   * Explicit spinner diameter in pixels.\n   */\n  readonly spinnerSize?: Maybe<number>;\n  /**\n   * Ratio of spinner size relative to button height (0-1).\n   */\n  readonly spinnerRatio?: Maybe<number>;\n  /**\n   * Spinner mode: determinate or indeterminate.\n   */\n  readonly mode?: Maybe<ProgressSpinnerMode>;\n  /**\n   * Whether the button stretches to full container width.\n   */\n  readonly fullWidth?: Maybe<boolean>;\n  /**\n   * Whether the button is disabled.\n   */\n  readonly disabled?: Maybe<boolean>;\n  /**\n   * Custom inline styles applied to the button element.\n   */\n  readonly customStyle?: Maybe<{ [key: string]: string }>;\n  /**\n   * Custom CSS class applied to the button element.\n   */\n  readonly customClass?: Maybe<string>;\n  /**\n   * Custom CSS color for the spinner stroke. Overrides `spinnerColor` when provided.\n   */\n  readonly customSpinnerColor?: Maybe<string>;\n  /**\n   * Icon configuration for the button.\n   */\n  readonly buttonIcon?: Maybe<DbxProgressButtonIcon>;\n  /**\n   * Identifier used for matching against global configuration.\n   */\n  readonly id?: Maybe<string>;\n  /**\n   * Material button variant to render.\n   */\n  readonly buttonType?: Maybe<DbxButtonType>;\n  /**\n   * HTML `type` attribute for the underlying button element (e.g. \"submit\", \"button\").\n   */\n  readonly buttonTypeAttribute?: Maybe<string>;\n  /**\n   * Whether to render as a Material floating action button (`mat-fab`). A button with text renders as an extended FAB.\n   *\n   * Combined with {@link iconOnly}, renders a round icon button instead.\n   */\n  readonly fab?: Maybe<boolean>;\n  /**\n   * Accessible label for the button, applied as `aria-label`.\n   * Especially important for icon-only buttons that lack visible text.\n   */\n  readonly ariaLabel?: Maybe<string>;\n  /**\n   * Active button echo. When set, the button's text/icon fade out (preserving width)\n   * and a centered echo icon overlay appears, mirroring the spinner working animation.\n   */\n  readonly buttonEcho?: Maybe<DbxButtonEcho>;\n  /**\n   * Whether the button has meaningful text or projected content to display alongside the icon.\n   * When explicitly `false`, the button renders the icon without text-mode margins/padding,\n   * centering the icon properly. When `true` or `undefined`, the button renders the text area normally.\n   */\n  readonly hasTextContent?: Maybe<boolean>;\n}\n\n/**\n * Configuration for the icon displayed inside a progress button.\n */\nexport interface DbxProgressButtonIcon {\n  /**\n   * Theme color for the icon.\n   */\n  readonly color?: Maybe<ThemePalette | DbxThemeColor>;\n  /**\n   * Material icon font ligature name (e.g. \"save\", \"delete\").\n   */\n  readonly fontIcon?: Maybe<string>;\n  /**\n   * Icon font set to use (e.g. for extended icon libraries).\n   */\n  readonly fontSet?: Maybe<string>;\n  /**\n   * Whether to render the icon inline with text.\n   */\n  readonly inline?: Maybe<boolean>;\n  /**\n   * SVG icon name registered with MatIconRegistry.\n   */\n  readonly svgIcon?: Maybe<string>;\n  /**\n   * Custom CSS class applied to the icon element.\n   */\n  readonly customClass?: Maybe<string>;\n}\n\n/**\n * Progress button configuration that includes an identifier, used for matching\n * buttons against global configuration overrides.\n */\nexport interface DbxProgressButtonTargetedConfig extends DbxProgressButtonConfig {\n  readonly id?: Maybe<string>;\n}\n\n/**\n * Array of targeted progress button configurations, provided globally to override\n * defaults for buttons matching specific IDs.\n */\nexport type DbxProgressButtonGlobalConfig = DbxProgressButtonTargetedConfig[];\n\n/**\n * Injection token for providing a global array of progress button configurations.\n */\nexport const DBX_PROGRESS_BUTTON_GLOBAL_CONFIG = new InjectionToken<DbxProgressButtonGlobalConfig>('DbxProgressButtonGlobalConfig');\n","import { Directive, HostListener, inject, computed, input, type Signal, output } from '@angular/core';\nimport { dbxActionWorkProgress, type DbxActionWorkProgress, type DbxButtonWorking } from '@dereekb/dbx-core';\nimport { type Configurable, type CssClass, isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { type DbxProgressButtonGlobalConfig, type DbxProgressButtonConfig, type DbxProgressButtonTargetedConfig, DBX_PROGRESS_BUTTON_GLOBAL_CONFIG } from './button.progress.config';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { type DbxButtonType } from '../button';\nimport { type ProgressSpinnerMode } from '@angular/material/progress-spinner';\n\n/**\n * Abstract base for progress button components. Manages configuration merging with global defaults,\n * working/disabled state computation, CSS class generation, and click event handling.\n * Subclasses provide the specific template (spinner or bar).\n */\n@Directive()\nexport abstract class AbstractProgressButtonDirective {\n  private readonly globalConfig = inject<DbxProgressButtonGlobalConfig>(DBX_PROGRESS_BUTTON_GLOBAL_CONFIG, { optional: true }) ?? [];\n\n  readonly btnClick = output<MouseEvent>();\n\n  readonly config = input.required<Maybe<DbxProgressButtonConfig>>();\n\n  readonly buttonId = input<Maybe<string>>();\n  readonly working = input<Maybe<DbxButtonWorking>>();\n  readonly disabled = input<Maybe<boolean>>();\n\n  readonly globalOptionsSignal: Signal<Maybe<DbxProgressButtonConfig>> = computed(() => {\n    const buttonId = this.buttonId();\n    return buttonId ? this.globalConfig.find((config: DbxProgressButtonTargetedConfig) => config.id === buttonId) : undefined;\n  });\n\n  readonly configSignal = computed<Maybe<DbxProgressButtonConfig>>(() => {\n    const config = this.config();\n    const globalConfig = this.globalOptionsSignal();\n\n    let completeConfig: Maybe<Configurable<DbxProgressButtonConfig>>;\n\n    if (config || globalConfig) {\n      completeConfig = {\n        ...globalConfig,\n        ...config\n      };\n\n      // set the iconOnly property if the buttonType is icon\n      if (completeConfig.buttonType === 'icon') {\n        completeConfig.iconOnly = true;\n      } else if (completeConfig.iconOnly) {\n        completeConfig.buttonType = 'icon';\n      }\n    }\n\n    return completeConfig;\n  });\n\n  /**\n   * CSS classes shared by every button presentation (custom class, full width, disabled), without the Material variant classes.\n   */\n  readonly commonCssClassSignal = computed(() => {\n    const config = this.configSignal();\n    const classes: CssClass[] = [config?.customClass ?? ''];\n\n    if (config?.fullWidth) {\n      classes.push('fullWidth');\n    }\n\n    if (config?.disabled) {\n      classes.push('disabled');\n    }\n\n    return classes;\n  });\n\n  /**\n   * {@link commonCssClassSignal} plus the Material variant classes for the configured {@link DbxButtonType}.\n   */\n  readonly baseCssClassSignal = computed(() => {\n    const config = this.configSignal();\n    const classes: CssClass[] = [...this.commonCssClassSignal()];\n\n    let buttonType: DbxButtonType = 'basic';\n\n    if (config?.iconOnly) {\n      buttonType = 'icon';\n    } else if (config?.buttonType) {\n      buttonType = config.buttonType;\n    }\n\n    switch (buttonType) {\n      case 'icon':\n        classes.push('mdc-icon-button mat-mdc-icon-button mat-unthemed');\n        break;\n      case 'raised':\n        classes.push('mat-mdc-raised-button mdc-button--raised');\n        break;\n      case 'stroked':\n        classes.push('mat-mdc-outlined-button mdc-button--outlined');\n        break;\n      case 'flat':\n        classes.push('mat-mdc-unelevated-button mdc-button--unelevated');\n        break;\n      case 'tonal':\n        classes.push('mat-mdc-tonal-button mdc-button--tonal');\n        break;\n      default:\n        classes.push('mat-unthemed');\n        break;\n    }\n\n    return classes;\n  });\n\n  readonly baseCssClasses$ = toObservable(this.baseCssClassSignal);\n\n  readonly workingProgressSignal: Signal<DbxButtonWorking> = computed(() => {\n    const working = this.working();\n    const config = this.configSignal();\n    const configWorking = config?.working;\n\n    return dbxActionWorkProgress([working, configWorking]);\n  });\n\n  readonly isWorkingSignal = computed(() => isDefinedAndNotFalse(this.workingProgressSignal()));\n\n  readonly workingValueSignal: Signal<Maybe<DbxActionWorkProgress>> = computed(() => {\n    const working = this.workingProgressSignal();\n    let result: Maybe<DbxActionWorkProgress>;\n\n    if (typeof working === 'number') {\n      result = working;\n    }\n\n    return result;\n  });\n\n  readonly modeSignal: Signal<ProgressSpinnerMode> = computed(() => {\n    const config = this.configSignal();\n    const workingValue = this.workingValueSignal();\n\n    const mode = config?.mode;\n    let result: ProgressSpinnerMode;\n\n    if (mode) {\n      result = mode;\n    } else if (workingValue == null) {\n      result = 'indeterminate';\n    } else {\n      result = 'determinate';\n    }\n\n    return result;\n  });\n\n  readonly disabledSignal = computed(() => {\n    const disabled = this.disabled();\n    const configDisabled = this.configSignal()?.disabled;\n    return disabled || configDisabled;\n  });\n\n  readonly buttonTypeAttributeSignal = computed(() => {\n    const options = this.configSignal();\n    return options?.buttonTypeAttribute;\n  });\n\n  readonly buttonDisabledSignal = computed(() => {\n    const working = this.isWorkingSignal();\n    const disabled = this.disabledSignal();\n    return working || disabled;\n  });\n\n  readonly showProgressSignal = computed(() => {\n    const working = this.isWorkingSignal();\n    const disabled = this.disabledSignal();\n    return working && !disabled;\n  });\n\n  /**\n   * Whether a button echo overlay is active (iconOnly echo mode).\n   */\n  readonly echoActiveSignal = computed(() => {\n    return this.configSignal()?.buttonEcho != null;\n  });\n\n  /**\n   * Whether button content should be hidden via opacity (working spinner or echo overlay active).\n   */\n  readonly hideContentSignal = computed(() => {\n    const echoActive = this.echoActiveSignal();\n    return this.showProgressSignal() || echoActive;\n  });\n\n  /**\n   * When true, the click handler will not call `stopImmediatePropagation()`,\n   * allowing the click event to continue bubbling. Needed for components like\n   * file upload buttons where a parent must handle the click synchronously.\n   */\n  readonly allowClickPropagation = input<boolean, Maybe<boolean>>(false, { transform: Boolean });\n\n  @HostListener('click', ['$event'])\n  public handleClick(event: MouseEvent): void {\n    const working = this.isWorkingSignal();\n    const disabled = this.disabledSignal();\n\n    if (!working && !disabled) {\n      this.btnClick.emit(event);\n\n      if (!this.allowClickPropagation()) {\n        event.stopImmediatePropagation();\n      }\n    }\n  }\n}\n","import { Component } from '@angular/core';\nimport { AbstractProgressButtonDirective } from './abstract.progress.button.directive';\nimport { map, shareReplay } from 'rxjs';\nimport { spaceSeparatedCssClasses } from '@dereekb/util';\nimport { distinctUntilItemsHaveDifferentValues } from '@dereekb/rxjs';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NgClass, NgStyle } from '@angular/common';\n\n/**\n * Progress button that displays a Material progress bar beneath the button while working.\n *\n * @dbxWebComponent\n * @dbxWebSlug progress-bar-button\n * @dbxWebCategory button\n * @dbxWebRelated button, progress-spinner-button\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-progress-bar-button [config]=\"cfg\"></dbx-progress-bar-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-progress-bar-button [config]=\"cfg\" (btnClick)=\"onClick()\"></dbx-progress-bar-button>\n * ```\n */\n@Component({\n  selector: 'dbx-progress-bar-button,dbx-bar-button',\n  templateUrl: './bar.button.component.html',\n  styleUrls: ['./bar.button.component.scss', './shared.button.component.scss'],\n  imports: [MatButtonModule, MatIconModule, MatProgressBar, NgClass, NgStyle]\n})\nexport class DbxProgressBarButtonComponent extends AbstractProgressButtonDirective {\n  readonly buttonCss$ = this.baseCssClasses$.pipe(\n    distinctUntilItemsHaveDifferentValues((x) => x[1]),\n    map((x) => spaceSeparatedCssClasses(x[1])),\n    shareReplay(1)\n  );\n\n  readonly buttonCssSignal = toSignal(this.buttonCss$);\n}\n","<button class=\"dbx-color-bg dbx-base-button dbx-progress-bar-button\" mat-button [type]=\"buttonTypeAttributeSignal()\" [ngClass]=\"buttonCssSignal()\" [ngStyle]=\"configSignal()?.customStyle\" [disabled]=\"buttonDisabledSignal()\" [attr.aria-label]=\"configSignal()?.ariaLabel\">\n  @if (configSignal()?.buttonIcon) {\n    <mat-icon\n      class=\"mat-button-icon\"\n      [class.is-mat-icon]=\"!configSignal()?.buttonIcon?.fontSet!\"\n      [class.dbx-icon-no-text]=\"configSignal()?.hasTextContent === false\"\n      [class.working]=\"echoActiveSignal()\"\n      [ngClass]=\"configSignal()?.buttonIcon?.customClass!\"\n      [fontSet]=\"configSignal()?.buttonIcon?.fontSet!\"\n      [fontIcon]=\"configSignal()?.buttonIcon?.fontIcon!\"\n      [color]=\"configSignal()?.buttonIcon?.color!\"\n      [svgIcon]=\"configSignal()?.buttonIcon?.svgIcon!\"\n      [inline]=\"configSignal()?.buttonIcon?.inline!\">\n      {{ configSignal()?.buttonIcon?.fontSet! ? '' : configSignal()?.buttonIcon?.fontIcon! }}\n    </mat-icon>\n  }\n  @if (!configSignal()?.fab && !configSignal()?.iconOnly && !(configSignal()?.hasTextContent === false && configSignal()?.buttonIcon)) {\n    <span [class.working]=\"echoActiveSignal()\">\n      {{ configSignal()?.text }}\n      <ng-content></ng-content>\n    </span>\n  }\n  @if (showProgressSignal()) {\n    <mat-progress-bar class=\"bar\" [color]=\"configSignal()?.barColor!\" [mode]=\"modeSignal()\" [value]=\"workingValueSignal()\"></mat-progress-bar>\n  }\n  @if (echoActiveSignal()) {\n    <span class=\"echo-overlay-icon material-symbols-outlined\">{{ configSignal()?.buttonEcho?.icon }}</span>\n  }\n</button>\n","import { Component, computed, ElementRef, viewChild } from '@angular/core';\nimport { AbstractProgressButtonDirective } from './abstract.progress.button.directive';\nimport { distinctUntilChanged, map, shareReplay } from 'rxjs';\nimport { type Maybe, spaceSeparatedCssClasses } from '@dereekb/util';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressSpinner } from '@angular/material/progress-spinner';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\n\n/**\n * Progress button that overlays a Material progress spinner on the button while working.\n * Supports icon-only, FAB, extended FAB, and text button modes with automatic spinner sizing.\n *\n * A `fab` config renders a Material `mat-fab` — an extended FAB when the button has text — while `fab` + `iconOnly` renders a\n * round icon button.\n *\n * @dbxWebComponent\n * @dbxWebSlug progress-spinner-button\n * @dbxWebCategory button\n * @dbxWebRelated button, progress-bar-button\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-progress-spinner-button [config]=\"cfg\"></dbx-progress-spinner-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-progress-spinner-button [config]=\"cfg\" (btnClick)=\"onClick()\"></dbx-progress-spinner-button>\n * ```\n */\n@Component({\n  selector: 'dbx-progress-spinner-button,dbx-spinner-button',\n  templateUrl: './spinner.button.component.html',\n  styleUrls: ['./spinner.button.component.scss', './shared.button.component.scss'],\n  imports: [MatButtonModule, MatIconModule, MatProgressSpinner, NgClass, NgStyle, NgTemplateOutlet]\n})\nexport class DbxProgressSpinnerButtonComponent extends AbstractProgressButtonDirective {\n  readonly buttonRef = viewChild.required<string, ElementRef<HTMLElement>>('button', { read: ElementRef<HTMLElement> });\n\n  /**\n   * Whether the button renders as a Material FAB (`mat-fab`). Set by `fab` without `iconOnly`; an `iconOnly` + `fab` button keeps the\n   * round icon-button presentation.\n   */\n  readonly isFabSignal = computed(() => {\n    const config = this.configSignal();\n    return Boolean(config?.fab && !config.iconOnly);\n  });\n\n  /**\n   * Whether a FAB renders as an extended FAB (icon + label) because it has text content.\n   */\n  readonly isExtendedFabSignal = computed(() => {\n    const config = this.configSignal();\n    return this.isFabSignal() && (config?.hasTextContent ?? Boolean(config?.text));\n  });\n\n  readonly buttonCssArraySignal = computed(() => {\n    const config = this.configSignal();\n    // A FAB takes its presentation from mat-fab, so the mat-button variant classes are left off.\n    const classes = this.isFabSignal() ? [...this.commonCssClassSignal()] : [...this.baseCssClassSignal()];\n\n    if (config?.fab) {\n      classes.push('dbx-progress-spinner-fab');\n    }\n\n    return classes;\n  });\n\n  readonly buttonCss$ = toObservable(this.buttonCssArraySignal).pipe(map(spaceSeparatedCssClasses), distinctUntilChanged(), shareReplay(1));\n\n  readonly spinnerSizeSignal = computed(() => {\n    const config = this.configSignal();\n    const buttonRef = this.buttonRef();\n\n    const elem = buttonRef.nativeElement;\n    const height = elem.clientHeight;\n\n    let size: Maybe<number>;\n\n    if (config != null) {\n      if (config.iconOnly) {\n        if (config.fab) {\n          size = 48;\n        } else {\n          size = height;\n        }\n      } else {\n        size = config.spinnerSize;\n      }\n    }\n\n    if (!size) {\n      const minimumSpinnerSize = 24;\n      const spinnerRatio = config?.spinnerRatio ?? 0.33;\n      const targetSpinnerSize = height * Math.min(1, spinnerRatio);\n      size = Math.min(height, Math.max(minimumSpinnerSize, targetSpinnerSize));\n    }\n\n    return size;\n  });\n\n  readonly buttonCssSignal = toSignal(this.buttonCss$);\n\n  readonly showTextContentSignal = computed(() => {\n    const isExtendedFab = this.isExtendedFabSignal();\n    const config = this.configSignal();\n    // Hide text area for FAB, icon-only, or when an icon is present with no text content.\n    // Do not hide when there is no icon, as projected content (ng-content) may be present\n    // even when hasTextContent is false (e.g. dynamically created components where\n    // projected content detection at constructor time is unreliable).\n    // An extended FAB shows its text; a regular FAB only shows its icon.\n    const isIconWithNoTextContent = config?.hasTextContent === false && config?.buttonIcon;\n    const isHiddenByFab = config?.fab && !isExtendedFab;\n    return !isHiddenByFab && !config?.iconOnly && !isIconWithNoTextContent;\n  });\n\n  readonly showTextButtonIconSignal = computed(() => {\n    const config = this.configSignal();\n    const showText = this.showTextContentSignal();\n    return showText && config?.buttonIcon; // shows the button icon with showing the text.\n  });\n\n  readonly showIconSignal = computed(() => {\n    const showTextContent = this.showTextContentSignal();\n    const config = this.configSignal();\n    return (\n      config?.buttonIcon && !showTextContent // button icon must be defined\n    ); // show icon if either fab or iconOnly is true\n  });\n\n  readonly customSpinnerStyleSignal = computed(() => {\n    const customSpinnerColor = this.configSignal()?.customSpinnerColor;\n    return customSpinnerColor ? { '--mat-progress-spinner-active-indicator-color': customSpinnerColor } : undefined;\n  });\n\n  readonly customSpinnerStyleClassSignal = computed(() => {\n    const hasCustomStyle = Boolean(this.customSpinnerStyleSignal());\n    return hasCustomStyle ? { 'dbx-progress-spinner-custom': true } : undefined;\n  });\n}\n","@if (isFabSignal()) {\n  <button class=\"dbx-color-bg dbx-base-button dbx-progress-spinner-button\" #button mat-fab [extended]=\"isExtendedFabSignal()\" [type]=\"buttonTypeAttributeSignal()\" [ngClass]=\"buttonCssSignal()\" [ngStyle]=\"configSignal()?.customStyle\" [disabled]=\"buttonDisabledSignal()\" [attr.aria-label]=\"configSignal()?.ariaLabel\">\n    <ng-container [ngTemplateOutlet]=\"buttonContent\"></ng-container>\n  </button>\n} @else {\n  <button class=\"dbx-color-bg dbx-base-button dbx-progress-spinner-button\" #button mat-button [type]=\"buttonTypeAttributeSignal()\" [ngClass]=\"buttonCssSignal()\" [ngStyle]=\"configSignal()?.customStyle\" [disabled]=\"buttonDisabledSignal()\" [attr.aria-label]=\"configSignal()?.ariaLabel\">\n    <ng-container [ngTemplateOutlet]=\"buttonContent\"></ng-container>\n  </button>\n}\n<!-- Button Content -->\n<ng-template #buttonContent>\n  @if (showTextContentSignal()) {\n    @if (showTextButtonIconSignal()) {\n      <mat-icon\n        class=\"mat-button-icon\"\n        [class.is-mat-icon]=\"!configSignal()?.buttonIcon?.fontSet\"\n        [class.working]=\"hideContentSignal()\"\n        [ngClass]=\"configSignal()?.buttonIcon?.customClass\"\n        [fontSet]=\"configSignal()?.buttonIcon?.fontSet!\"\n        [fontIcon]=\"configSignal()?.buttonIcon?.fontIcon!\"\n        [color]=\"configSignal()?.buttonIcon?.color!\"\n        [svgIcon]=\"configSignal()?.buttonIcon?.svgIcon!\">\n        {{ configSignal()?.buttonIcon?.fontSet ? '' : configSignal()?.buttonIcon?.fontIcon }}\n      </mat-icon>\n    }\n    <span class=\"button-text\" [class.working]=\"hideContentSignal()\">\n      {{ configSignal()?.text }}\n      <ng-content></ng-content>\n    </span>\n  }\n  @if (showIconSignal()) {\n    <!-- Use ng-container to prevent mat-icon from being a child of the button which changes the behavior -->\n    <ng-container>\n      <mat-icon\n        class=\"mat-fab-icon\"\n        [class.working]=\"hideContentSignal()\"\n        [fontSet]=\"configSignal()?.buttonIcon?.fontSet!\"\n        [fontIcon]=\"configSignal()?.buttonIcon?.fontIcon!\"\n        [color]=\"configSignal()?.buttonIcon?.color!\"\n        [svgIcon]=\"configSignal()?.buttonIcon?.svgIcon!\"\n        [inline]=\"configSignal()?.fab && configSignal()?.buttonIcon?.inline!\">\n        {{ configSignal()?.buttonIcon?.fontSet! ? '' : configSignal()?.buttonIcon?.fontIcon! }}\n      </mat-icon>\n    </ng-container>\n  }\n  @if (showProgressSignal()) {\n    <mat-spinner class=\"spinner\" [diameter]=\"spinnerSizeSignal()\" [color]=\"configSignal()?.spinnerColor!\" [mode]=\"modeSignal()\" [value]=\"workingValueSignal()\" [ngStyle]=\"customSpinnerStyleSignal()\" [ngClass]=\"customSpinnerStyleClassSignal()\" [class.working]=\"showProgressSignal()\"></mat-spinner>\n  }\n  @if (echoActiveSignal()) {\n    <span class=\"echo-overlay-icon material-symbols-outlined\">{{ configSignal()?.buttonEcho?.icon }}</span>\n  }\n</ng-template>\n","import { type EnvironmentProviders, makeEnvironmentProviders, type Provider } from '@angular/core';\nimport { type DbxProgressButtonGlobalConfig, DBX_PROGRESS_BUTTON_GLOBAL_CONFIG } from './button.progress.config';\n\n/**\n * Registers a global configuration for progress buttons, allowing default styles and\n * behavior to be overridden application-wide by button ID.\n *\n * @param config - Array of targeted configurations to apply globally.\n * @returns Environment providers to include in your application bootstrap.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n *   providers: [\n *     provideDbxProgressButtonGlobalConfig([\n *       { id: 'primary-save', buttonType: 'raised', spinnerColor: 'primary' }\n *     ])\n *   ]\n * });\n * ```\n */\nexport function provideDbxProgressButtonGlobalConfig(config: DbxProgressButtonGlobalConfig): EnvironmentProviders {\n  const providers: Provider[] = [\n    {\n      provide: DBX_PROGRESS_BUTTON_GLOBAL_CONFIG,\n      useValue: config\n    }\n  ];\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Component, computed, effect, ElementRef, inject, input, model, untracked } from '@angular/core';\nimport { type ThemePalette } from '@angular/material/core';\nimport { provideDbxButton, AbstractDbxButtonDirective, hasNonTrivialChildNodes, type DbxButtonEcho } from '@dereekb/dbx-core';\nimport { type Configurable, isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { type DbxProgressButtonConfig } from './progress/button.progress.config';\nimport { type DbxColorInput, type DbxThemeColor, isDbxColorConfig } from '../layout/style/style';\nimport { DbxColorDirective } from '../layout/style/style.color.directive';\nimport { DbxProgressSpinnerButtonComponent, DbxProgressBarButtonComponent } from './progress';\nimport { type ProgressSpinnerMode } from '@angular/material/progress-spinner';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { type DbxButtonStyle, type DbxButtonType } from './button';\n\n/**\n * Feature-rich button component that supports loading indicators, multiple Material button styles,\n * custom colors, icons, and floating action button (FAB / extended FAB) mode. Integrates with the dbxAction system\n * for automatic working/disabled state management.\n *\n * @dbxWebComponent\n * @dbxWebSlug button\n * @dbxWebCategory button\n * @dbxWebRelated icon-button, progress-spinner-button, progress-bar-button\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-button text=\"Save\" raised [dbxAction]=\"saveAction\"></dbx-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-button [text]=\"'Save'\" raised [dbxAction]=\"saveAction\">\n * </dbx-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-button icon=\"delete\" flat color=\"warn\" [dbxAction]=\"deleteAction\">\n * </dbx-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-button text=\"Upload\" bar [working]=\"uploadProgress\">\n *   <!-- Uses a progress bar instead of spinner -->\n * </dbx-button>\n * ```\n */\n@Component({\n  selector: 'dbx-button',\n  template: `\n    @if (bar()) {\n      <dbx-progress-bar-button (btnClick)=\"clickButton()\" [config]=\"configSignal()\" [allowClickPropagation]=\"allowClickPropagation()\">\n        <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n      </dbx-progress-bar-button>\n    } @else {\n      <dbx-progress-spinner-button (btnClick)=\"clickButton()\" [config]=\"configSignal()\" [allowClickPropagation]=\"allowClickPropagation()\">\n        <ng-template [ngTemplateOutlet]=\"content\"></ng-template>\n      </dbx-progress-spinner-button>\n    }\n    <!-- Content -->\n    <ng-template #content>\n      <ng-content></ng-content>\n    </ng-template>\n  `,\n  providers: provideDbxButton(DbxButtonComponent),\n  imports: [DbxProgressSpinnerButtonComponent, DbxProgressBarButtonComponent, NgTemplateOutlet],\n  hostDirectives: [DbxColorDirective]\n})\nexport class DbxButtonComponent extends AbstractDbxButtonDirective {\n  /**\n   * Whether the host element has projected content (checked at construction time,\n   * before Angular moves the nodes for content projection).\n   */\n  private readonly _hasProjectedContent: boolean;\n\n  constructor() {\n    super();\n    const el = inject(ElementRef<HTMLElement>);\n    this._hasProjectedContent = hasNonTrivialChildNodes(el.nativeElement);\n\n    const dbxColorDirective = inject(DbxColorDirective, { self: true });\n\n    let originalColor: Maybe<DbxColorInput>;\n    let overridden = false;\n\n    // Pushes the button's resolved color (echo > color input > buttonStyle) into the host DbxColorDirective, which\n    // provides the color tokens + `.dbx-color` marker the button paints from. The directive's own value is restored once\n    // the button stops supplying a color (e.g. an echo ends).\n    effect(() => {\n      const color = this.colorSignal() as Maybe<DbxColorInput>;\n\n      if (color != null) {\n        if (!overridden) {\n          originalColor = untracked(dbxColorDirective.dbxColor);\n          overridden = true;\n        }\n\n        dbxColorDirective.dbxColor.set(color);\n      } else if (overridden) {\n        dbxColorDirective.dbxColor.set(originalColor);\n        overridden = false;\n      }\n    });\n  }\n\n  readonly bar = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n\n  readonly type = input<Maybe<DbxButtonType>>();\n  /**\n   * Style of the button. Individual style inputs (e.g. {@link color}, {@link raised}) take precedence.\n   *\n   * Declared as a `model` so a directive composed onto the button (e.g. `dbxRotatingButton`) can set it.\n   */\n  readonly buttonStyle = model<Maybe<DbxButtonStyle>>();\n\n  /**\n   * Color of the button. Takes precedence over the {@link buttonStyle} color.\n   *\n   * Declared as a `model` so a directive composed onto the button (e.g. `dbxRotatingButton`) can set it.\n   */\n  readonly color = model<Maybe<ThemePalette | DbxColorInput>>();\n  readonly spinnerColor = input<Maybe<ThemePalette | DbxThemeColor>>();\n\n  readonly customTextColor = input<Maybe<string>>();\n  readonly customSpinnerColor = input<Maybe<string>>();\n\n  readonly basic = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly tonal = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly raised = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly stroked = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly flat = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly iconOnly = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  /**\n   * Renders a Material FAB, or an extended FAB when the button has text. Combine with {@link iconOnly} for a round icon button.\n   */\n  readonly fab = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly customContent = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n  readonly allowClickPropagation = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n\n  readonly mode = input<Maybe<ProgressSpinnerMode>>();\n\n  /**\n   * The echo currently being displayed, if any. Echoes only display while the button is neither working nor disabled,\n   * mirroring the echo gating in {@link configSignal}.\n   */\n  private readonly _activeEchoSignal = computed<Maybe<DbxButtonEcho>>(() => {\n    const echo = this.buttonEchoSignal();\n    const working = this.workingSignal();\n    const disabled = !this.isWorkingSignal() && this.disabledSignal();\n    return echo && !working && !disabled ? echo : undefined;\n  });\n\n  /**\n   * Resolved button color from the active echo, the {@link color} input, or {@link buttonStyle} (in that order). Pushed\n   * into the host {@link DbxColorDirective}, which provides the color tokens + `.dbx-color` marker that the button's\n   * `dbx-button.dbx-color .mdc-button` SCSS paints from; an active echo's color temporarily takes over those tokens.\n   */\n  readonly colorSignal = computed(() => {\n    const color = this.color();\n    const buttonStyle = this.buttonStyle();\n    const echoColor = this._activeEchoSignal()?.color as Maybe<ThemePalette | DbxColorInput>;\n    return echoColor ?? color ?? buttonStyle?.color;\n  });\n\n  readonly styleTypeSignal = computed(() => {\n    const iconOnly = this.iconOnly();\n    const raised = this.raised();\n    const stroked = this.stroked();\n    const flat = this.flat();\n    const tonal = this.tonal();\n    const style = this.buttonStyle();\n    let type = this.type() ?? style?.type;\n\n    if (!type) {\n      if (iconOnly) {\n        type = 'icon';\n      } else if (raised) {\n        type = 'raised';\n      } else if (stroked) {\n        type = 'stroked';\n      } else if (flat) {\n        type = 'flat';\n      } else if (tonal) {\n        type = 'tonal';\n      }\n    }\n\n    return type;\n  });\n\n  readonly configSignal = computed<DbxProgressButtonConfig>(() => {\n    // configure custom style\n    const customContent = this.customContent();\n    const customStyle = {} as {\n      [key: string]: string;\n    };\n\n    const buttonStyle = this.buttonStyle();\n\n    const customTextColorValue = this.customTextColor() ?? buttonStyle?.customTextColor;\n\n    if (customTextColorValue) {\n      customStyle['color'] = customTextColorValue;\n    }\n\n    const customSpinnerColorValue = this.customSpinnerColor() ?? buttonStyle?.customSpinnerColor;\n    const customSpinnerColor: Maybe<string> = customSpinnerColorValue ?? customTextColorValue;\n\n    const buttonColor = this.colorSignal();\n    // mat-spinner [color] only accepts ThemePalette/named colors, so coerce a DbxColorConfig or empty-string buttonColor away.\n    const buttonColorSpinnerFallback: Maybe<ThemePalette | DbxThemeColor> = !buttonColor || isDbxColorConfig(buttonColor) ? undefined : (buttonColor as DbxThemeColor);\n    const spinnerColor = this.spinnerColor() ?? buttonStyle?.spinnerColor ?? buttonColorSpinnerFallback;\n\n    const disabledSignalValue = this.disabledSignal();\n    const disabled = !this.isWorkingSignal() && disabledSignalValue; // Only disabled if we're not working, in order to show the animation.\n\n    const iconValue = this.iconSignal();\n    const buttonIcon = iconValue ? { fontIcon: iconValue } : undefined;\n\n    const textValue = this.textSignal();\n    const hasTextContent = !!textValue || this._hasProjectedContent || customContent;\n\n    const isIconOnlyButton = buttonIcon && !hasTextContent;\n    const fab = this.fab() || buttonStyle?.fab;\n\n    const mode = this.mode() ?? buttonStyle?.mode;\n    const working = this.workingSignal();\n    const buttonType = this.styleTypeSignal();\n\n    const ariaLabel = this.ariaLabel();\n\n    const config: Configurable<DbxProgressButtonConfig> = {\n      fab,\n      working,\n      buttonIcon,\n      customStyle,\n      customClass: 'dbx-button ' + (isIconOnlyButton ? 'dbx-button-no-text' : ''),\n      text: textValue ?? '',\n      hasTextContent,\n      // An icon-only fab renders as a Material FAB rather than falling back to the icon button (set iconOnly for the round icon button).\n      buttonType: buttonType ?? (isIconOnlyButton && !fab ? 'icon' : 'basic'),\n      barColor: 'accent',\n      mode,\n      spinnerColor,\n      customSpinnerColor,\n      disabled,\n      ariaLabel\n    };\n\n    // Apply button echo when not working and not disabled\n    const echo = this._activeEchoSignal();\n\n    if (echo) {\n      if (echo.iconOnly && isIconOnlyButton) {\n        // Icon-only button: directly swap icon and color\n        if (echo.icon) {\n          config.buttonIcon = { fontIcon: echo.icon };\n        }\n      } else if (echo.iconOnly) {\n        // Text button with iconOnly echo: overlay rendering — text/icon fade out via opacity\n        // (staying in DOM to preserve button width), echo icon shows as centered overlay\n        config.buttonEcho = echo;\n      } else {\n        // Direct swap: replace icon and/or text in the config\n        if (echo.icon) {\n          config.buttonIcon = { fontIcon: echo.icon };\n        }\n\n        if (echo.text != null) {\n          config.text = echo.text;\n        }\n      }\n    }\n\n    return config;\n  });\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Adds inline spacing between adjacent buttons. Can be used as an element or attribute.\n *\n * @dbxWebComponent\n * @dbxWebSlug button-spacer\n * @dbxWebCategory button\n * @dbxWebRelated bar, spacer, button\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-button-spacer></dbx-button-spacer>\n * ```\n *\n * @example\n * ```html\n * <dbx-bar>\n *   <dbx-button text=\"Save\" raised></dbx-button>\n *   <dbx-button-spacer></dbx-button-spacer>\n *   <dbx-button text=\"Cancel\"></dbx-button>\n * </dbx-bar>\n * ```\n */\n@Directive({\n  selector: 'dbx-button-spacer,[dbxButtonSpacer]',\n  host: {\n    class: 'dbx-button-spacer d-inline'\n  }\n})\nexport class DbxButtonSpacerDirective {}\n","import { computed, Directive, input } from '@angular/core';\nimport { type CssTokenVar, type Maybe, type Pixels, type PixelsString } from '@dereekb/util';\n\n/**\n * How a {@link DbxButtonFloatingDirective} host floats.\n *\n * - `'sticky'`: pinned to the edge of its scroll container while its parent section is on screen, then rests at the end of that section.\n * - `'fixed'`: pinned to the viewport, like a classic floating action button.\n */\nexport type DbxButtonFloatingMode = 'sticky' | 'fixed';\n\n/**\n * Edge and alignment a {@link DbxButtonFloatingDirective} host floats to.\n */\nexport type DbxButtonFloatingPosition = 'bottom-right' | 'bottom-left' | 'bottom-center' | 'top-right' | 'top-left' | 'top-center';\n\n/**\n * Horizontal alignment portion of a {@link DbxButtonFloatingPosition}.\n */\nexport type DbxButtonFloatingHorizontalAlignment = 'left' | 'center' | 'right';\n\n/**\n * Distance between a floating button and the edge it is pinned to. Numbers are treated as pixels.\n */\nexport type DbxButtonFloatingOffset = Pixels | PixelsString | CssTokenVar;\n\n/**\n * Configuration for a {@link DbxButtonFloatingDirective}.\n */\nexport interface DbxButtonFloatingConfig {\n  /**\n   * How the host floats. Defaults to `'sticky'`.\n   */\n  readonly mode?: Maybe<DbxButtonFloatingMode>;\n  /**\n   * Edge and alignment the host floats to. Defaults to `'bottom-right'`.\n   */\n  readonly position?: Maybe<DbxButtonFloatingPosition>;\n  /**\n   * Offset applied to both axes. Defaults to the `--dbx-button-floating-offset` token (`padding-4`).\n   */\n  readonly offset?: Maybe<DbxButtonFloatingOffset>;\n  /**\n   * Horizontal offset. Takes priority over {@link offset}. Only applies in `'fixed'` mode.\n   */\n  readonly offsetX?: Maybe<DbxButtonFloatingOffset>;\n  /**\n   * Vertical offset. Takes priority over {@link offset}.\n   */\n  readonly offsetY?: Maybe<DbxButtonFloatingOffset>;\n}\n\n/**\n * Default {@link DbxButtonFloatingPosition} for a {@link DbxButtonFloatingDirective}.\n */\nexport const DEFAULT_DBX_BUTTON_FLOATING_POSITION: DbxButtonFloatingPosition = 'bottom-right';\n\n/**\n * Floats its host — typically a `dbx-button` with `dbxActionButton`, or a wrapper holding several buttons — over the content\n * by applying the `.dbx-button-floating` utility classes.\n *\n * In the default `'sticky'` mode the host stays pinned to the edge of its scroll container while its parent section is on\n * screen, which suits a Save button at the end of a long form. Place the host at the end of its section for bottom positions and\n * at the start for top positions. Sticky stops working when an ancestor between the host and the scroll container sets\n * `overflow`. In `'fixed'` mode the host is pinned to the viewport; fixed positioning is re-anchored to any ancestor that sets\n * `transform`, `filter` or `contain`.\n *\n * Set `fab` on the `dbx-button` for the Material FAB presentation (an extended FAB when it has text). Pair with\n * `dbxActionEnforceModified` on the action to keep a floating Save button disabled until the form has changes.\n *\n * @dbxWebComponent\n * @dbxWebSlug button-floating\n * @dbxWebCategory button\n * @dbxWebRelated button, button-spacer, content-pit\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-button dbxButtonFloating fab color=\"primary\" icon=\"save\" text=\"Save\" dbxActionButton></dbx-button>\n * ```\n *\n * @example\n * ```html\n * <div dbxAction dbxActionEnforceModified [dbxActionHandler]=\"handleSave\">\n *   <my-form dbxActionForm></my-form>\n *   <dbx-button dbxButtonFloating fab color=\"primary\" icon=\"save\" text=\"Save\" dbxActionButton></dbx-button>\n * </div>\n * ```\n *\n * @example\n * ```html\n * <dbx-button dbxButtonFloating=\"top-left\" dbxButtonFloatingMode=\"fixed\" [dbxButtonFloatingOffset]=\"24\" fab icon=\"add\" text=\"New\"></dbx-button>\n * ```\n */\n@Directive({\n  selector: '[dbxButtonFloating]',\n  host: {\n    class: 'dbx-button-floating',\n    '[class.dbx-button-floating-fixed]': 'isFixedSignal()',\n    '[class.dbx-button-floating-top]': 'isTopSignal()',\n    '[class.dbx-button-floating-left]': \"horizontalAlignmentSignal() === 'left'\",\n    '[class.dbx-button-floating-center]': \"horizontalAlignmentSignal() === 'center'\",\n    '[style.--dbx-button-floating-offset-x]': 'offsetXSignal()',\n    '[style.--dbx-button-floating-offset-y]': 'offsetYSignal()'\n  }\n})\nexport class DbxButtonFloatingDirective {\n  /**\n   * Config for the floating button, or a {@link DbxButtonFloatingPosition} shorthand. Empty when used as a bare attribute.\n   */\n  readonly dbxButtonFloating = input<Maybe<DbxButtonFloatingConfig | DbxButtonFloatingPosition | ''>>();\n\n  readonly dbxButtonFloatingMode = input<Maybe<DbxButtonFloatingMode>>();\n  readonly dbxButtonFloatingPosition = input<Maybe<DbxButtonFloatingPosition>>();\n  readonly dbxButtonFloatingOffset = input<Maybe<DbxButtonFloatingOffset>>();\n\n  readonly configSignal = computed<Maybe<DbxButtonFloatingConfig>>(() => {\n    const value = this.dbxButtonFloating();\n    let config: Maybe<DbxButtonFloatingConfig>;\n\n    if (typeof value === 'string') {\n      config = value ? { position: value } : undefined;\n    } else {\n      config = value;\n    }\n\n    return config;\n  });\n\n  readonly modeSignal = computed<DbxButtonFloatingMode>(() => {\n    const config = this.configSignal();\n    return this.dbxButtonFloatingMode() ?? config?.mode ?? 'sticky';\n  });\n  readonly positionSignal = computed<DbxButtonFloatingPosition>(() => {\n    const config = this.configSignal();\n    return this.dbxButtonFloatingPosition() ?? config?.position ?? DEFAULT_DBX_BUTTON_FLOATING_POSITION;\n  });\n\n  readonly isFixedSignal = computed(() => this.modeSignal() === 'fixed');\n  readonly isTopSignal = computed(() => this.positionSignal().startsWith('top-'));\n  readonly horizontalAlignmentSignal = computed(() => this.positionSignal().split('-')[1] as DbxButtonFloatingHorizontalAlignment);\n\n  readonly offsetXSignal = computed(() => {\n    const config = this.configSignal();\n    return toDbxButtonFloatingOffsetCssValue(this.dbxButtonFloatingOffset() ?? config?.offsetX ?? config?.offset);\n  });\n\n  readonly offsetYSignal = computed(() => {\n    const config = this.configSignal();\n    return toDbxButtonFloatingOffsetCssValue(this.dbxButtonFloatingOffset() ?? config?.offsetY ?? config?.offset);\n  });\n}\n\n/**\n * Converts a {@link DbxButtonFloatingOffset} into a CSS value. Numbers are converted to pixel strings.\n *\n * @param offset - The offset to convert.\n * @returns The CSS value, or undefined if no offset is provided.\n */\nfunction toDbxButtonFloatingOffsetCssValue(offset: Maybe<DbxButtonFloatingOffset>): Maybe<PixelsString | CssTokenVar> {\n  return typeof offset === 'number' ? `${offset}px` : (offset ?? undefined);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { MatButtonModule, MatIconButton } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { AbstractDbxButtonDirective, provideDbxButton } from '@dereekb/dbx-core';\n\n/**\n * Lightweight button that renders as either an icon-only Material icon button or a text button\n * with an icon prefix, depending on whether text is provided.\n *\n * @dbxWebComponent\n * @dbxWebSlug icon-button\n * @dbxWebCategory button\n * @dbxWebRelated button\n * @dbxWebSkillRefs dbx__migration__migrate-dbx-icon-button\n * @dbxWebMinimalExample ```html\n * <dbx-icon-button icon=\"add\"></dbx-icon-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-icon-button icon=\"delete\" color=\"warn\" [dbxAction]=\"deleteAction\"></dbx-icon-button>\n * ```\n */\n@Component({\n  selector: 'dbx-icon-button',\n  template: `\n    @switch (buttonDisplayTypeSignal()) {\n      @case ('text_button') {\n        <button mat-button class=\"mat-unthemed\" [disabled]=\"disabledSignal()\" [attr.aria-label]=\"ariaLabel()\" (click)=\"clickButton()\">\n          @if (iconSignal()) {\n            <mat-icon class=\"dbx-icon-spacer\">{{ iconSignal() }}</mat-icon>\n          }\n          <span>{{ textSignal() }}</span>\n          <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n        </button>\n      }\n      @case ('icon_button') {\n        <button mat-icon-button [disabled]=\"disabledSignal()\" [attr.aria-label]=\"ariaLabel() || iconSignal()\" (click)=\"clickButton()\">\n          <mat-icon aria-hidden=\"true\">{{ iconSignal() }}</mat-icon>\n          <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n        </button>\n      }\n    }\n    <ng-template #content>\n      <ng-content></ng-content>\n    </ng-template>\n  `,\n  providers: provideDbxButton(DbxIconButtonComponent),\n  host: {\n    class: 'dbx-icon-button'\n  },\n  imports: [MatButtonModule, MatIconModule, MatIconButton, NgTemplateOutlet]\n})\nexport class DbxIconButtonComponent extends AbstractDbxButtonDirective {}\n","import { type Maybe } from '@dereekb/util';\nimport { type DbxButtonDisplayStylePair, type DbxButtonStyle } from '../button';\n\n/**\n * A single state of a {@link DbxRotatingButtonDirective}.\n *\n * The `display` (icon/text) and `style` (color, type, …) are applied to the host `dbx-button` while the state is active.\n */\nexport interface DbxRotatingButtonState<T> extends DbxButtonDisplayStylePair {\n  /**\n   * Value the state represents.\n   */\n  readonly value: T;\n  /**\n   * Label for the state, e.g. \"On\". Used in the button's aria-label (\"{label}: {state label}\") and the change announcement.\n   */\n  readonly label?: Maybe<string>;\n}\n\n/**\n * Identifies the \"Default\" state of a {@link DbxRotatingButtonConfig} and the state it resolves to. For example, a tristate\n * \"Default\" state whose value is `null` but that resolves to On (`true`).\n */\nexport interface DbxRotatingButtonDefaultState<T> {\n  /**\n   * Value of the default state.\n   */\n  readonly value: T;\n  /**\n   * Value of the state the default state resolves to.\n   */\n  readonly equivalentValue: T;\n}\n\n/**\n * Function that compares two rotating button values.\n */\nexport type DbxRotatingButtonValueIsEqualFunction<T> = (a: Maybe<T>, b: Maybe<T>) => boolean;\n\n/**\n * Configuration for a {@link DbxRotatingButtonDirective}.\n */\nexport interface DbxRotatingButtonConfig<T> {\n  /**\n   * States to rotate through, in order. Each click moves to the next state, wrapping back to the first.\n   */\n  readonly states: DbxRotatingButtonState<T>[];\n  /**\n   * Label for the thing being changed, e.g. \"Email\". Prefixes the state label in the aria-label and announcements.\n   */\n  readonly label?: Maybe<string>;\n  /**\n   * Base style for every state. Each state's `style` is merged over it.\n   *\n   * The directive sets the button's `buttonStyle`, so pass the base style here instead of binding `buttonStyle` on the button.\n   */\n  readonly style?: Maybe<DbxButtonStyle>;\n  /**\n   * Whether to announce each change through the LiveAnnouncer. True by default.\n   */\n  readonly announceChanges?: Maybe<boolean>;\n  /**\n   * Compares values to find the current state. Defaults to {@link isEqualDbxRotatingButtonValue}.\n   */\n  readonly isEqual?: Maybe<DbxRotatingButtonValueIsEqualFunction<T>>;\n  /**\n   * The default state and the state it resolves to. Used by {@link DbxRotatingButtonConfig.skipDefaultEquivalentOnFirstClick}.\n   */\n  readonly defaultState?: Maybe<DbxRotatingButtonDefaultState<T>>;\n  /**\n   * Whether the first click skips moving between the {@link DbxRotatingButtonConfig.defaultState} and the state it resolves\n   * to, so the first click always changes the resolved value. The skipped state is visited last instead, so the button still\n   * rotates through every state before returning to where it started. See {@link dbxRotatingButtonRotationOrder}. False by default.\n   */\n  readonly skipDefaultEquivalentOnFirstClick?: Maybe<boolean>;\n}\n\n/**\n * Default value comparison for a {@link DbxRotatingButtonConfig}. Strict equality, treating `null` and `undefined` as equal.\n *\n * @param a - The first value.\n * @param b - The second value.\n * @returns True if the values are equal.\n */\nexport function isEqualDbxRotatingButtonValue<T>(a: Maybe<T>, b: Maybe<T>): boolean {\n  return (a ?? null) === (b ?? null);\n}\n\n/**\n * Returns the index of the state that matches the value, or -1 if no state matches.\n *\n * @param config - The rotating button configuration.\n * @param value - The value to find.\n * @returns The index of the matching state, or -1.\n */\nexport function dbxRotatingButtonStateIndex<T>(config: Pick<DbxRotatingButtonConfig<T>, 'states' | 'isEqual'>, value: Maybe<T>): number {\n  const isEqual = config.isEqual ?? isEqualDbxRotatingButtonValue;\n  return config.states.findIndex((state) => isEqual(state.value, value));\n}\n\n/**\n * Returns the order the states rotate in, as indexes of the config's states.\n *\n * This is the configured order, unless `skipDefaultEquivalent` is true, the config has a `defaultState`, and the move from the\n * state matching the value is between the default state and the state it resolves to, which would not change the resolved value.\n * That move is then skipped, and the skipped state is visited last instead, just before returning to the state matching the value.\n * For example, a tristate whose default resolves to On rotates Default -> Off -> On -> Default. With only two states, or a value\n * that matches no state, the configured order is returned.\n *\n * @param config - The rotating button configuration.\n * @param value - The current value, where the rotation starts.\n * @param skipDefaultEquivalent - Whether to skip the move between the default state and its equivalent state.\n * @returns The state indexes in rotation order.\n */\nexport function dbxRotatingButtonRotationOrder<T>(config: Pick<DbxRotatingButtonConfig<T>, 'states' | 'isEqual' | 'defaultState'>, value: Maybe<T>, skipDefaultEquivalent?: Maybe<boolean>): number[] {\n  const { states, defaultState } = config;\n  const isEqual = config.isEqual ?? isEqualDbxRotatingButtonValue;\n  const count = states.length;\n  const index = dbxRotatingButtonStateIndex(config, value);\n  let rotationOrder = states.map((_, i) => i);\n\n  if (skipDefaultEquivalent && defaultState && index !== -1 && count > 2) {\n    const skippedIndex = (index + 1) % count;\n    const currentValue = states[index].value;\n    const nextValue = states[skippedIndex].value;\n    const isDefaultToEquivalent = isEqual(currentValue, defaultState.value) && isEqual(nextValue, defaultState.equivalentValue);\n    const isEquivalentToDefault = isEqual(currentValue, defaultState.equivalentValue) && isEqual(nextValue, defaultState.value);\n\n    if (isDefaultToEquivalent || isEquivalentToDefault) {\n      // start at the current state, visit the states after the skipped state, then the skipped state\n      rotationOrder = [index, ...Array.from({ length: count - 2 }, (_, i) => (index + 2 + i) % count), skippedIndex];\n    }\n  }\n\n  return rotationOrder;\n}\n\n/**\n * Returns the state after the state matching the value in the rotation order, wrapping back to the start. A value that matches\n * no state starts at the first state.\n *\n * @param config - The rotating button configuration.\n * @param value - The current value.\n * @param rotationOrder - The state indexes in rotation order, from {@link dbxRotatingButtonRotationOrder}. Defaults to the configured order.\n * @returns The next state, or undefined if there are no states.\n */\nexport function nextDbxRotatingButtonState<T>(config: Pick<DbxRotatingButtonConfig<T>, 'states' | 'isEqual'>, value: Maybe<T>, rotationOrder?: Maybe<readonly number[]>): Maybe<DbxRotatingButtonState<T>> {\n  const { states } = config;\n  const index = dbxRotatingButtonStateIndex(config, value);\n  let nextState: Maybe<DbxRotatingButtonState<T>>;\n\n  if (index === -1 || !rotationOrder?.length) {\n    nextState = states.length ? states[(index + 1) % states.length] : undefined;\n  } else {\n    const position = rotationOrder.indexOf(index);\n    nextState = states[rotationOrder[(position + 1) % rotationOrder.length]];\n  }\n\n  return nextState;\n}\n\n/**\n * Returns the aria-label for a rotating button state: \"{label}: {state label}\", or whichever of the two is set.\n *\n * @param label - The rotating button label.\n * @param state - The current state.\n * @returns The aria-label, or undefined if neither label is set.\n */\nexport function dbxRotatingButtonAriaLabel<T>(label: Maybe<string>, state: Maybe<DbxRotatingButtonState<T>>): Maybe<string> {\n  const stateLabel = state?.label;\n  return label && stateLabel ? `${label}: ${stateLabel}` : (label ?? stateLabel ?? undefined);\n}\n","import { type Maybe } from '@dereekb/util';\nimport { type DbxButtonStyle } from '../button';\nimport { type DbxRotatingButtonConfig, type DbxRotatingButtonDefaultState, type DbxRotatingButtonState } from './button.rotating';\n\n/**\n * Value of a three-state / 3-phase (default/on/off) choice.\n *\n * - `true` — explicitly on\n * - `false` — explicitly off\n * - `null`/`undefined` — no explicit choice; resolves to the default. Emitted as `null`, which means \"clear\".\n */\nexport type DbxTristateValue = Maybe<boolean>;\n\n/**\n * Display state of a {@link DbxTristateValue}.\n */\nexport type DbxTristateState = 'on' | 'off' | 'default';\n\n/**\n * Default icon for the explicit \"on\" state.\n */\nexport const DEFAULT_DBX_TRISTATE_ON_ICON = 'check_circle';\n\n/**\n * Default icon for the explicit \"off\" state.\n */\nexport const DEFAULT_DBX_TRISTATE_OFF_ICON = 'block';\n\n/**\n * Icon for the \"default\" state when the default value is unknown.\n */\nexport const DEFAULT_DBX_TRISTATE_UNKNOWN_DEFAULT_ICON = 'radio_button_unchecked';\n\n/**\n * Default color for the explicit \"on\" state.\n */\nexport const DEFAULT_DBX_TRISTATE_ON_COLOR: DbxButtonStyle['color'] = 'primary';\n\n/**\n * Default color for the explicit \"off\" state.\n */\nexport const DEFAULT_DBX_TRISTATE_OFF_COLOR: DbxButtonStyle['color'] = 'warn';\n\n/**\n * Returns the display state for the input value.\n *\n * @param value - The tristate value.\n * @returns `'on'`, `'off'` or `'default'`.\n */\nexport function dbxTristateState(value: DbxTristateValue): DbxTristateState {\n  let state: DbxTristateState;\n\n  if (value === true) {\n    state = 'on';\n  } else if (value === false) {\n    state = 'off';\n  } else {\n    state = 'default';\n  }\n\n  return state;\n}\n\n/**\n * Returns the effective value, resolving the default state to the default value.\n *\n * @param value - The tristate value.\n * @param defaultValue - What the default state resolves to.\n * @returns The effective value, or undefined if the value is the default and the default is unknown.\n */\nexport function dbxTristateEffectiveValue(value: DbxTristateValue, defaultValue?: Maybe<boolean>): Maybe<boolean> {\n  return value ?? defaultValue;\n}\n\n/**\n * Rotation order of a tristate value: default, then on, then off.\n *\n * The first click skips moving between the default state and the state it resolves to (see\n * {@link DbxTristateRotatingButtonConfigInput.skipDefaultEquivalentOnFirstClick}), so it always flips the effective value,\n * and the skipped state is visited last instead. For example, a default that resolves to on rotates Default -> Off -> On -> Default.\n */\nexport const DBX_TRISTATE_CYCLE: readonly DbxTristateValue[] = [null, true, false];\n\n/**\n * Per-state display configuration for {@link dbxTristateRotatingButtonConfig}.\n */\nexport interface DbxTristateStateDisplayConfig {\n  /**\n   * Icon to show for the state.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Label for the state.\n   */\n  readonly label?: Maybe<string>;\n  /**\n   * Color of the button for the state.\n   */\n  readonly color?: DbxButtonStyle['color'];\n}\n\n/**\n * Input for {@link dbxTristateStateLabel}.\n */\nexport interface DbxTristateStateLabelInput {\n  /**\n   * The current value.\n   */\n  readonly value: DbxTristateValue;\n  /**\n   * What the default state resolves to.\n   */\n  readonly defaultValue?: Maybe<boolean>;\n  /**\n   * Per-state label overrides.\n   */\n  readonly on?: Maybe<Pick<DbxTristateStateDisplayConfig, 'label'>>;\n  readonly off?: Maybe<Pick<DbxTristateStateDisplayConfig, 'label'>>;\n  readonly default?: Maybe<Pick<DbxTristateStateDisplayConfig, 'label'>>;\n}\n\n/**\n * Returns the label for the state of a tristate value: `On`, `Off`, `Default (On)`, `Default (Off)` or `Default`.\n *\n * @param input - The current value, default value and per-state labels.\n * @returns The state label.\n */\nexport function dbxTristateStateLabel(input: DbxTristateStateLabelInput): string {\n  const { value, defaultValue } = input;\n  const onLabel = input.on?.label ?? 'On';\n  const offLabel = input.off?.label ?? 'Off';\n  let label: string;\n\n  switch (dbxTristateState(value)) {\n    case 'on':\n      label = onLabel;\n      break;\n    case 'off':\n      label = offLabel;\n      break;\n    default: {\n      const defaultLabel = input.default?.label ?? 'Default';\n      const resolvedLabel = defaultValue ? onLabel : offLabel;\n      label = defaultValue == null ? defaultLabel : `${defaultLabel} (${resolvedLabel})`;\n      break;\n    }\n  }\n\n  return label;\n}\n\n/**\n * Input for {@link dbxTristateRotatingButtonConfig}.\n */\nexport interface DbxTristateRotatingButtonConfigInput {\n  /**\n   * Label for the thing being changed, e.g. \"Email\".\n   */\n  readonly label?: Maybe<string>;\n  /**\n   * What the default state resolves to.\n   */\n  readonly defaultValue?: Maybe<boolean>;\n  /**\n   * Display for the explicit \"on\" state.\n   */\n  readonly on?: Maybe<DbxTristateStateDisplayConfig>;\n  /**\n   * Display for the explicit \"off\" state.\n   */\n  readonly off?: Maybe<DbxTristateStateDisplayConfig>;\n  /**\n   * Display for the default state. The icon defaults to the resolved on/off icon, with no color.\n   */\n  readonly default?: Maybe<DbxTristateStateDisplayConfig>;\n  /**\n   * Base button style for every state.\n   */\n  readonly style?: Maybe<DbxButtonStyle>;\n  /**\n   * Whether to announce each change through the LiveAnnouncer. True by default.\n   */\n  readonly announceChanges?: Maybe<boolean>;\n  /**\n   * Whether the first click skips moving between the default state and the state it resolves to, such as from \"Default (On)\"\n   * to \"On\", so the first click always flips the effective value. The skipped state is visited last instead, such as\n   * \"Default (On)\" -> \"Off\" -> \"On\" -> \"Default (On)\". Has no effect when the default value is unknown. True by default.\n   */\n  readonly skipDefaultEquivalentOnFirstClick?: Maybe<boolean>;\n}\n\n/**\n * Creates a {@link DbxRotatingButtonConfig} for a three-state / 3-phase (default/on/off) toggle.\n *\n * The states rotate in {@link DBX_TRISTATE_CYCLE} order (default, on, off). A known default value sets the config's\n * `defaultState`, so by default the first click skips the state that would look like no change and visits it last. Explicit choices are\n * colored; the default state shows the resolved on/off icon without a color.\n *\n * @param input - The labels, default value and per-state display.\n * @returns A rotating button configuration whose default state has the value `null`.\n *\n * @example\n * ```ts\n * const config = dbxTristateRotatingButtonConfig({ label: 'Text', defaultValue: false });\n * ```\n */\nexport function dbxTristateRotatingButtonConfig(input: DbxTristateRotatingButtonConfigInput): DbxRotatingButtonConfig<DbxTristateValue> {\n  const { label, defaultValue, on, off, style, announceChanges, skipDefaultEquivalentOnFirstClick } = input;\n  const onIcon = on?.icon ?? DEFAULT_DBX_TRISTATE_ON_ICON;\n  const offIcon = off?.icon ?? DEFAULT_DBX_TRISTATE_OFF_ICON;\n  let resolvedDefaultIcon: string;\n\n  if (defaultValue == null) {\n    resolvedDefaultIcon = DEFAULT_DBX_TRISTATE_UNKNOWN_DEFAULT_ICON;\n  } else {\n    resolvedDefaultIcon = defaultValue ? onIcon : offIcon;\n  }\n\n  const states: DbxRotatingButtonState<DbxTristateValue>[] = DBX_TRISTATE_CYCLE.map((value) => {\n    let icon: string;\n    let color: DbxButtonStyle['color'];\n\n    switch (dbxTristateState(value)) {\n      case 'on':\n        icon = onIcon;\n        color = on?.color ?? DEFAULT_DBX_TRISTATE_ON_COLOR;\n        break;\n      case 'off':\n        icon = offIcon;\n        color = off?.color ?? DEFAULT_DBX_TRISTATE_OFF_COLOR;\n        break;\n      default:\n        icon = input.default?.icon ?? resolvedDefaultIcon;\n        color = input.default?.color;\n        break;\n    }\n\n    return {\n      value,\n      label: dbxTristateStateLabel({ value, defaultValue, on, off, default: input.default }),\n      display: { icon },\n      style: { color }\n    };\n  });\n\n  // an unknown default resolves to neither on nor off\n  const defaultState: Maybe<DbxRotatingButtonDefaultState<DbxTristateValue>> = defaultValue == null ? undefined : { value: null, equivalentValue: defaultValue };\n\n  return { states, label, style, announceChanges, defaultState, skipDefaultEquivalentOnFirstClick: skipDefaultEquivalentOnFirstClick ?? true };\n}\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { computed, Directive, effect, inject, input, model, untracked } from '@angular/core';\nimport { cleanSubscription } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButtonComponent } from '../button.component';\nimport { type DbxRotatingButtonConfig, dbxRotatingButtonAriaLabel, dbxRotatingButtonRotationOrder, dbxRotatingButtonStateIndex, nextDbxRotatingButtonState } from './button.rotating';\n\n/**\n * Turns a `dbx-button` into a rotating / multi-state button. Each click moves to the next configured state, and the\n * state's icon, text, style and aria-label are set on the button.\n *\n * Use {@link dbxTristateRotatingButtonConfig} for a three-state / 3-phase (default/on/off) toggle. The directive sets the\n * button's `icon`, `text`, `buttonStyle` and `ariaLabel`, so configure those through the config rather than on the button.\n *\n * The button stops click propagation by default, so a rotating button works inside clickable list rows.\n *\n * @dbxWebComponent\n * @dbxWebSlug rotating-button\n * @dbxWebCategory button\n * @dbxWebKind directive\n * @dbxWebRelated button, icon-button\n * @dbxWebMinimalExample ```html\n * <dbx-button iconOnly [dbxRotatingButton]=\"tristateConfig\" [(dbxRotatingButtonValue)]=\"emailEnabled\"></dbx-button>\n * ```\n *\n * @example\n * ```ts\n * readonly tristateConfig = dbxTristateRotatingButtonConfig({ label: 'Text', defaultValue: false });\n * ```\n *\n * @example\n * ```html\n * <dbx-button stroked [dbxRotatingButton]=\"{ label: 'Sort', states: [{ value: 'asc', display: { icon: 'arrow_upward', text: 'Ascending' } }, { value: 'desc', display: { icon: 'arrow_downward', text: 'Descending' } }] }\" [(dbxRotatingButtonValue)]=\"sort\"></dbx-button>\n * ```\n */\n@Directive({\n  selector: '[dbxRotatingButton]',\n  exportAs: 'dbxRotatingButton'\n})\nexport class DbxRotatingButtonDirective<T = unknown> {\n  readonly dbxButton = inject(DbxButtonComponent, { host: true });\n  private readonly _liveAnnouncer = inject(LiveAnnouncer);\n\n  /**\n   * Order the states rotate in, set by the first click. See {@link dbxRotatingButtonRotationOrder}.\n   *\n   * Kept while the config has the same number of states, since a host may rebuild the config on every change.\n   */\n  private _rotationOrder: Maybe<number[]>;\n\n  readonly dbxRotatingButton = input<Maybe<DbxRotatingButtonConfig<T>>>();\n\n  /**\n   * The current value. Two-way bindable with `[(dbxRotatingButtonValue)]`.\n   */\n  readonly dbxRotatingButtonValue = model<Maybe<T>>();\n\n  /**\n   * Index of the state matching the current value, or -1 if none match.\n   */\n  readonly stateIndexSignal = computed(() => {\n    const dbxRotatingButtonValue = this.dbxRotatingButtonValue();\n    const config = this.dbxRotatingButton();\n    return config ? dbxRotatingButtonStateIndex(config, dbxRotatingButtonValue) : -1;\n  });\n\n  /**\n   * The current state. Falls back to the first state when the value matches no state.\n   */\n  readonly stateSignal = computed(() => {\n    const states = this.dbxRotatingButton()?.states;\n    const index = this.stateIndexSignal();\n    return states?.[index === -1 ? 0 : index];\n  });\n\n  readonly ariaLabelSignal = computed(() => dbxRotatingButtonAriaLabel(this.dbxRotatingButton()?.label, this.stateSignal()));\n\n  constructor() {\n    effect(() => {\n      const config = this.dbxRotatingButton();\n      const state = this.stateSignal();\n      const ariaLabel = this.ariaLabelSignal();\n\n      untracked(() => {\n        const button = this.dbxButton;\n        const baseStyle = config?.style;\n        const stateStyle = state?.style;\n\n        button.icon.set(state?.display?.icon);\n        button.text.set(state?.display?.text);\n        button.buttonStyle.set(baseStyle || stateStyle ? { ...baseStyle, ...stateStyle } : undefined);\n        button.ariaLabel.set(ariaLabel);\n      });\n    });\n\n    cleanSubscription(this.dbxButton.clicked$.subscribe(() => this.rotate()));\n  }\n\n  /**\n   * Moves to the next state, emits its value, and announces the change.\n   *\n   * When the config sets `skipDefaultEquivalentOnFirstClick`, the first rotation skips the state equivalent to the default state\n   * and visits it last instead.\n   */\n  rotate(): void {\n    const config = this.dbxRotatingButton();\n\n    if (config) {\n      const value = this.dbxRotatingButtonValue();\n      let rotationOrder = this._rotationOrder;\n\n      if (rotationOrder?.length !== config.states.length) {\n        rotationOrder = dbxRotatingButtonRotationOrder(config, value, config.skipDefaultEquivalentOnFirstClick);\n        this._rotationOrder = rotationOrder;\n      }\n\n      const nextState = nextDbxRotatingButtonState(config, value, rotationOrder);\n\n      if (nextState) {\n        this.dbxRotatingButtonValue.set(nextState.value);\n\n        const announcement = dbxRotatingButtonAriaLabel(config.label, nextState);\n\n        if (config.announceChanges !== false && announcement) {\n          void this._liveAnnouncer.announce(announcement);\n        }\n      }\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxButtonComponent } from './button.component';\nimport { DbxButtonSpacerDirective } from './button.spacer.directive';\nimport { DbxButtonFloatingDirective } from './button.floating.directive';\nimport { DbxCoreButtonModule } from '@dereekb/dbx-core';\nimport { DbxIconButtonComponent } from './icon';\nimport { DbxProgressSpinnerButtonComponent, DbxProgressBarButtonComponent } from './progress';\nimport { DbxRotatingButtonDirective } from './rotating';\n\nconst importsAndExports = [\n  DbxCoreButtonModule,\n  DbxIconButtonComponent,\n  // buttons\n  DbxButtonComponent,\n  DbxButtonSpacerDirective,\n  DbxButtonFloatingDirective,\n  // progress\n  DbxProgressSpinnerButtonComponent,\n  DbxProgressBarButtonComponent,\n  // rotating\n  DbxRotatingButtonDirective\n];\n\n/**\n * Convenience module that bundles all button components and directives from\n * both @dereekb/dbx-core and @dereekb/dbx-web, including progress buttons and icon buttons.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxButtonModule {}\n","import { Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DbxDetachController, DbxDetachWindowState } from './detach';\nimport { DbxButtonModule } from '../../button/button.module';\nimport { DbxButtonSpacerDirective } from '../../button/button.spacer.directive';\n\n/**\n * Renders state-dependent control buttons for a detach component.\n *\n * - ATTACHED: detach (picture_in_picture_alt) + close\n * - DETACHED: attach (open_in_full) + minimize + close\n * - MINIMIZED: attach (open_in_full) + restore (maximize) + close\n */\n@Component({\n  selector: 'dbx-detach-control-buttons',\n  template: `\n    @switch (windowStateSignal()) {\n      @case ('attached') {\n        <dbx-button [flat]=\"true\" icon=\"picture_in_picture_alt\" (buttonClick)=\"detachClicked()\"></dbx-button>\n      }\n      @case ('detached') {\n        <dbx-button [flat]=\"true\" icon=\"open_in_full\" (buttonClick)=\"attachClicked()\"></dbx-button>\n        <dbx-button-spacer></dbx-button-spacer>\n        <dbx-button [flat]=\"true\" icon=\"minimize\" (buttonClick)=\"minimizeClicked()\"></dbx-button>\n      }\n      @case ('minimized') {\n        <dbx-button [flat]=\"true\" icon=\"open_in_full\" (buttonClick)=\"attachClicked()\"></dbx-button>\n        <dbx-button-spacer></dbx-button-spacer>\n        <dbx-button [flat]=\"true\" icon=\"maximize\" (buttonClick)=\"detachClicked()\"></dbx-button>\n      }\n    }\n    <dbx-button-spacer></dbx-button-spacer>\n    <dbx-button [flat]=\"true\" icon=\"close\" color=\"warn\" (buttonClick)=\"closeClicked()\"></dbx-button>\n  `,\n  host: {\n    class: 'dbx-detach-control-buttons'\n  },\n  imports: [DbxButtonModule, DbxButtonSpacerDirective]\n})\nexport class DbxDetachControlButtonsComponent {\n  private readonly _detachController = inject(DbxDetachController);\n\n  readonly windowStateSignal = toSignal(this._detachController.windowState$, { initialValue: DbxDetachWindowState.ATTACHED });\n\n  attachClicked(): void {\n    this._detachController.attach();\n  }\n\n  detachClicked(): void {\n    this._detachController.detach();\n  }\n\n  minimizeClicked(): void {\n    this._detachController.minimize();\n  }\n\n  closeClicked(): void {\n    this._detachController.close();\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { DbxDetachControlButtonsComponent } from './detach.controls.buttons.component';\n\n/**\n * Renders the detach control bar with a header title and window management buttons (attach, detach, minimize, close).\n *\n * @example\n * ```html\n * <dbx-detach-controls [header]=\"'My Panel'\"></dbx-detach-controls>\n * ```\n */\n@Component({\n  selector: 'dbx-detach-controls',\n  template: `\n    <span class=\"dbx-detach-controls-header\">{{ header() }}</span>\n    <div class=\"spacer\"></div>\n    <dbx-detach-control-buttons></dbx-detach-control-buttons>\n  `,\n  host: {\n    class: 'dbx-detach-controls'\n  },\n  imports: [DbxDetachControlButtonsComponent]\n})\nexport class DbxDetachControlsComponent {\n  readonly header = input<string>();\n}\n","import { Component, inject, type AfterViewInit, ElementRef } from '@angular/core';\nimport { NgPopoverRef } from 'ng-overlay-container';\nimport { DbxDetachController } from './detach';\nimport { CompactContextStore, CompactMode } from '../../layout/compact';\n\n/**\n * Data passed to the overlay component via {@link NgPopoverRef}.\n */\nexport interface DbxDetachOverlayData {\n  readonly controller: DbxDetachController;\n  readonly hostElement: HTMLElement;\n}\n\n/**\n * Component rendered inside the ng-overlay-container overlay.\n *\n * Receives the detached component's host element and appends it to the overlay DOM.\n * The component's lifecycle and change detection are managed by {@link DbxDetachService},\n * not the overlay.\n */\n@Component({\n  template: `\n    <div class=\"dbx-detach-overlay\"></div>\n  `,\n  providers: [\n    {\n      provide: DbxDetachController,\n      useFactory: () => {\n        const popoverRef = inject(NgPopoverRef<DbxDetachOverlayData>);\n        return popoverRef.data.controller;\n      }\n    },\n    {\n      provide: CompactContextStore\n    }\n  ],\n  host: {\n    class: 'dbx-detach-overlay-host'\n  }\n})\nexport class DbxDetachOverlayComponent implements AfterViewInit {\n  private readonly _elementRef = inject(ElementRef);\n  private readonly _popoverRef = inject(NgPopoverRef<DbxDetachOverlayData>);\n  private readonly _compactContextStore = inject(CompactContextStore);\n\n  constructor() {\n    this._compactContextStore.setMode(CompactMode.COMPACT);\n  }\n\n  ngAfterViewInit(): void {\n    const overlayEl = this._elementRef.nativeElement.querySelector('.dbx-detach-overlay');\n    if (overlayEl) {\n      overlayEl.appendChild(this._popoverRef.data.hostElement);\n    }\n  }\n}\n","import { GlobalPositionStrategy } from '@angular/cdk/overlay';\n\n/**\n * Predefined screen positions for a popup overlay.\n */\nexport type PopupPosition = 'center' | 'bottom_left' | 'bottom_right';\n\n/**\n * X/Y offset for fine-tuning popup positioning.\n */\nexport interface PopupPositionOffset {\n  readonly x?: string;\n  readonly y?: string;\n}\n\n/**\n * Global position strategy for popups that supports named positions (center, bottom_left, bottom_right) with optional offsets.\n *\n * @example\n * ```ts\n * const strategy = new PopupGlobalPositionStrategy('bottom_right', { x: '16px', y: '16px' });\n * ```\n */\nexport class PopupGlobalPositionStrategy extends GlobalPositionStrategy {\n  private _position!: PopupPosition;\n  private _offset: PopupPositionOffset = {};\n\n  constructor(position: PopupPosition = 'bottom_right', offset?: PopupPositionOffset) {\n    super();\n    this.setPopupPosition(position, offset);\n  }\n\n  setPopupOffset(offset?: PopupPositionOffset): void {\n    this.setPopupPosition(this._position, offset ?? {});\n  }\n\n  setPopupPosition(position: PopupPosition, offset?: PopupPositionOffset): void {\n    this._resetPositions();\n    this._position = position;\n\n    if (offset) {\n      this._offset = offset;\n    }\n\n    const offsetX = this._offset.x ?? '0';\n    const offsetY = this._offset.y ?? '0';\n\n    switch (position) {\n      case 'center':\n        this.centerHorizontally();\n        this.centerVertically();\n        break;\n      case 'bottom_left':\n        this.bottom(offsetY);\n        this.left(offsetX);\n        break;\n      case 'bottom_right':\n        this.bottom(offsetY);\n        this.right(offsetX);\n        break;\n    }\n  }\n\n  private _resetPositions(): void {\n    this.top();\n    this.bottom();\n    this.left();\n    this.right();\n  }\n}\n","import { Service, ApplicationRef, type ComponentRef, EnvironmentInjector, Injector, inject, createComponent } from '@angular/core';\nimport { createInjectorForInjectionComponentConfig, initInjectionComponent } from '@dereekb/dbx-core';\nimport { NgOverlayContainerService, type NgPopoverRef } from 'ng-overlay-container';\nimport { Overlay } from '@angular/cdk/overlay';\nimport { BehaviorSubject, type Observable, map, distinctUntilChanged } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxDetachController, DbxDetachWindowState, type DbxDetachConfig, type DbxDetachInstance, type DbxDetachKey, type DbxDetachOverlayConfig, type DbxDetachWindowStateType, DEFAULT_DBX_DETACH_KEY } from './detach';\nimport { DbxDetachOverlayComponent, type DbxDetachOverlayData } from './detach.overlay.component';\nimport { PopupGlobalPositionStrategy } from '../popup/popup.position.strategy';\n\n// MARK: Entry Controller\n/**\n * Concrete {@link DbxDetachController} for a service-managed entry.\n *\n * Delegates all state changes back to the service.\n */\nclass DbxDetachEntryController<I = unknown> extends DbxDetachController<I> {\n  private readonly _windowState = new BehaviorSubject<DbxDetachWindowStateType>(DbxDetachWindowState.DETACHED);\n  private readonly _closing = new BehaviorSubject<boolean>(false);\n\n  readonly windowState$ = this._windowState.asObservable();\n  readonly closing$ = this._closing.asObservable();\n\n  constructor(\n    readonly key: DbxDetachKey,\n    readonly data: Maybe<I>,\n    private readonly _service: DbxDetachService\n  ) {\n    super();\n  }\n\n  get windowState(): DbxDetachWindowStateType {\n    return this._windowState.value;\n  }\n\n  setWindowState(state: DbxDetachWindowStateType): void {\n    this._windowState.next(state);\n  }\n\n  attach(): void {\n    this._service.attachToOutlet(this.key);\n  }\n\n  detach(): void {\n    this._service.detachToOverlay(this.key);\n  }\n\n  minimize(): void {\n    this._service.minimizeToOverlay(this.key);\n  }\n\n  close(): void {\n    this._service.closeOrReattach(this.key);\n  }\n\n  emitClosing(): void {\n    this._closing.next(true);\n  }\n}\n\n// MARK: Entry\n/**\n * Internal tracked state for a detach entry.\n */\ninterface DbxDetachEntryState<T = unknown> {\n  readonly key: DbxDetachKey;\n  readonly componentRef: ComponentRef<T>;\n  readonly controller: DbxDetachEntryController;\n  readonly overlayConfig: DbxDetachOverlayConfig;\n  overlayRef?: NgPopoverRef<DbxDetachOverlayData>;\n  currentOutlet?: Element;\n  lastOutlet?: Element;\n}\n\n// MARK: Instance\n/**\n * Concrete {@link DbxDetachInstance} backed by a service entry.\n */\nclass DbxDetachInstanceImpl<T = unknown> implements DbxDetachInstance<T> {\n  constructor(private readonly _entry: DbxDetachEntryState<T>) {}\n\n  get key(): DbxDetachKey {\n    return this._entry.key;\n  }\n\n  get componentRef(): ComponentRef<T> {\n    return this._entry.componentRef;\n  }\n\n  get windowState$(): Observable<DbxDetachWindowStateType> {\n    return this._entry.controller.windowState$;\n  }\n\n  get closing$(): Observable<boolean> {\n    return this._entry.controller.closing$;\n  }\n\n  attach(): void {\n    this._entry.controller.attach();\n  }\n\n  detach(): void {\n    this._entry.controller.detach();\n  }\n\n  minimize(): void {\n    this._entry.controller.minimize();\n  }\n\n  close(): void {\n    this._entry.controller.close();\n  }\n}\n\n// MARK: Service\n/**\n * Root-level service that owns and manages detached components.\n *\n * Components are created imperatively via {@link createComponent} and kept alive\n * via {@link ApplicationRef.attachView}. They are not tied to any template.\n *\n * Outlets and overlays are just display locations — the service moves the component's\n * host element between them based on the current state.\n *\n * Multiple simultaneous detached components are supported via unique keys.\n */\n@Service()\nexport class DbxDetachService {\n  private readonly _appRef = inject(ApplicationRef);\n  private readonly _injector = inject(Injector);\n  private readonly _envInjector = inject(EnvironmentInjector);\n  private readonly _overlay = inject(Overlay);\n  private readonly _overlayContainerService = new NgOverlayContainerService(this._overlay, this._injector);\n\n  private readonly _entries = new Map<DbxDetachKey, DbxDetachEntryState>();\n  private readonly _entries$ = new BehaviorSubject<Map<DbxDetachKey, DbxDetachEntryState>>(this._entries);\n\n  /**\n   * Initializes a detached component for the given key. Returns the existing instance if one already exists.\n   *\n   * @param config - The detach configuration including component class, key, and overlay settings.\n   * @returns The new or existing {@link DbxDetachInstance} for the given key.\n   */\n  init<T>(config: DbxDetachConfig<T>): DbxDetachInstance<T> {\n    const key = config.key ?? DEFAULT_DBX_DETACH_KEY;\n\n    const existing = this._entries.get(key);\n    let instance: DbxDetachInstance<T>;\n\n    if (existing) {\n      instance = new DbxDetachInstanceImpl(existing as DbxDetachEntryState<T>);\n    } else {\n      const controller = new DbxDetachEntryController(key, config.data, this);\n\n      // Build injector using shared utility, adding DbxDetachController provider\n      const elementInjector = createInjectorForInjectionComponentConfig({\n        config: {\n          ...config,\n          providers: [{ provide: DbxDetachController, useValue: controller }, ...(config.providers ?? [])]\n        },\n        parentInjector: this._injector\n      });\n\n      // Create component imperatively (not in any VCR)\n      const componentRef = createComponent(config.componentClass, {\n        environmentInjector: this._envInjector,\n        elementInjector\n      });\n\n      // Run init callback\n      initInjectionComponent(componentRef, config);\n\n      // Attach view to ApplicationRef for change detection\n      this._appRef.attachView(componentRef.hostView);\n\n      const overlayConfig: DbxDetachOverlayConfig = config.overlay ?? {};\n\n      const entry: DbxDetachEntryState<T> = {\n        key,\n        componentRef,\n        controller,\n        overlayConfig\n      };\n\n      this._entries.set(key, entry);\n      this._entries$.next(this._entries);\n\n      instance = new DbxDetachInstanceImpl(entry);\n    }\n\n    return instance;\n  }\n\n  /**\n   * Gets the instance for the given key, if it exists.\n   *\n   * @param key - The detach key to look up. Defaults to {@link DEFAULT_DBX_DETACH_KEY}.\n   * @returns The instance if found, otherwise `undefined`.\n   */\n  get<T = unknown>(key?: DbxDetachKey): Maybe<DbxDetachInstance<T>> {\n    const entry = this._entries.get(key ?? DEFAULT_DBX_DETACH_KEY);\n    return entry ? new DbxDetachInstanceImpl(entry as DbxDetachEntryState<T>) : undefined;\n  }\n\n  /**\n   * Observable of whether an entry exists for the given key.\n   *\n   * @param key - The detach key to observe. Defaults to {@link DEFAULT_DBX_DETACH_KEY}.\n   * @returns An observable that emits `true` when an entry exists for the key.\n   */\n  has$(key?: DbxDetachKey): Observable<boolean> {\n    const k = key ?? DEFAULT_DBX_DETACH_KEY;\n    return this._entries$.pipe(\n      map((entries) => entries.has(k)),\n      distinctUntilChanged()\n    );\n  }\n\n  /**\n   * Moves the component's host element into the given outlet element.\n   *\n   * If no outlet element is provided, falls back to the last known outlet\n   * (for reattaching from the overlay to the previous location).\n   *\n   * @param key - The detach key identifying the entry.\n   * @param outletElement - The DOM element to move the component into. Falls back to the last known outlet.\n   */\n  attachToOutlet(key: DbxDetachKey, outletElement?: Element): void {\n    const entry = this._entries.get(key);\n\n    if (entry) {\n      const target = outletElement ?? entry.lastOutlet;\n\n      // No outlet available or it's been removed from the DOM → skip\n      if (target?.isConnected) {\n        this._closeOverlay(entry);\n        this._moveDomTo(entry, target);\n        entry.currentOutlet = target;\n        entry.lastOutlet = target;\n        entry.controller.setWindowState(DbxDetachWindowState.ATTACHED);\n      }\n    }\n  }\n\n  /**\n   * Moves the component to the floating overlay.\n   *\n   * @param key - The detach key identifying the entry.\n   */\n  detachToOverlay(key: DbxDetachKey): void {\n    const entry = this._entries.get(key);\n    if (!entry) {\n      return;\n    }\n\n    this._openOverlay(entry);\n    this._resizeOverlayForState(entry, DbxDetachWindowState.DETACHED);\n    entry.controller.setWindowState(DbxDetachWindowState.DETACHED);\n  }\n\n  /**\n   * Moves the component to the floating overlay in minimized state.\n   *\n   * @param key - The detach key identifying the entry.\n   */\n  minimizeToOverlay(key: DbxDetachKey): void {\n    const entry = this._entries.get(key);\n    if (!entry) {\n      return;\n    }\n\n    this._openOverlay(entry);\n    this._resizeOverlayForState(entry, DbxDetachWindowState.MINIMIZED);\n    entry.controller.setWindowState(DbxDetachWindowState.MINIMIZED);\n  }\n\n  /**\n   * Called when an outlet is destroyed.\n   *\n   * @param key - The detach key identifying the entry.\n   * @param outletElement - The outlet element being destroyed.\n   * @param detachToOverlay - When true, the component moves to the floating overlay.\n   *   When false, the component's DOM is removed but it stays alive in the service (hidden).\n   */\n  outletDestroyed(key: DbxDetachKey, outletElement: Element, detachToOverlay: boolean): void {\n    const entry = this._entries.get(key);\n    if (entry?.currentOutlet === outletElement) {\n      entry.currentOutlet = undefined;\n\n      if (detachToOverlay) {\n        this._openOverlay(entry);\n        entry.controller.setWindowState(DbxDetachWindowState.DETACHED);\n      } else {\n        this._removeDom(entry);\n      }\n    }\n  }\n\n  /**\n   * If the last outlet is still in the DOM, reattaches the component there.\n   * Otherwise destroys the component.\n   *\n   * @param key - The detach key identifying the entry.\n   */\n  closeOrReattach(key: DbxDetachKey): void {\n    const entry = this._entries.get(key);\n    if (!entry) {\n      return;\n    }\n\n    if (entry.lastOutlet?.isConnected) {\n      this.attachToOutlet(key, entry.lastOutlet);\n    } else {\n      entry.controller.emitClosing();\n      this.remove(key);\n    }\n  }\n\n  /**\n   * Destroys the component and removes it from the service.\n   *\n   * @param key - The detach key identifying the entry to remove.\n   */\n  remove(key: DbxDetachKey): void {\n    const entry = this._entries.get(key);\n    if (!entry) {\n      return;\n    }\n\n    this._closeOverlay(entry);\n    this._appRef.detachView(entry.componentRef.hostView);\n    entry.componentRef.destroy();\n    this._entries.delete(key);\n    this._entries$.next(this._entries);\n  }\n\n  // MARK: Internal\n  private _openOverlay(entry: DbxDetachEntryState): void {\n    if (entry.overlayRef) {\n      return;\n    }\n\n    // Remove from current outlet\n    this._removeDom(entry);\n    entry.currentOutlet = undefined;\n\n    const { overlayConfig } = entry;\n    const width = overlayConfig.width ?? '400px';\n    const height = overlayConfig.height ?? '500px';\n    const isDraggable = overlayConfig.isDraggable ?? false;\n\n    const data: DbxDetachOverlayData = {\n      controller: entry.controller,\n      hostElement: entry.componentRef.location.nativeElement\n    };\n\n    const ref = this._overlayContainerService.open<DbxDetachOverlayData>({\n      content: DbxDetachOverlayComponent,\n      data,\n      configuration: {\n        width,\n        height,\n        useGlobalPositionStrategy: true,\n        hasBackdrop: false,\n        isResizable: false,\n        isDraggable\n      }\n    });\n\n    const position = new PopupGlobalPositionStrategy('bottom_right', { x: '16px', y: '16px' });\n    ref.overlay.updatePositionStrategy(position);\n\n    entry.overlayRef = ref;\n  }\n\n  private _resizeOverlayForState(entry: DbxDetachEntryState, state: DbxDetachWindowStateType): void {\n    if (!entry.overlayRef) {\n      return;\n    }\n\n    const { overlayConfig } = entry;\n    const width = overlayConfig.width ?? '400px';\n\n    if (state === DbxDetachWindowState.MINIMIZED) {\n      entry.overlayRef.resize(width, 'auto');\n    } else {\n      const height = overlayConfig.height ?? '500px';\n      entry.overlayRef.resize(width, height);\n    }\n\n    entry.overlayRef.overlay.updatePosition();\n  }\n\n  private _closeOverlay(entry: DbxDetachEntryState): void {\n    if (!entry.overlayRef) {\n      return;\n    }\n\n    // Remove DOM from overlay before closing\n    this._removeDom(entry);\n\n    try {\n      entry.overlayRef.close();\n    } catch {\n      // Overlay may already be closed\n    }\n\n    entry.overlayRef = undefined;\n  }\n\n  private _moveDomTo(entry: DbxDetachEntryState, target: Element): void {\n    const hostEl = entry.componentRef.location.nativeElement as HTMLElement;\n    target.appendChild(hostEl);\n  }\n\n  private _removeDom(entry: DbxDetachEntryState): void {\n    const hostEl = entry.componentRef.location.nativeElement as HTMLElement;\n    hostEl.remove();\n  }\n}\n","import { Directive, type OnInit, inject, input } from '@angular/core';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DEFAULT_DBX_DETACH_KEY, type DbxDetachKey } from './detach';\nimport { DbxDetachService } from './detach.service';\n\n/**\n * Directive that ensures a detached component exists in the {@link DbxDetachService} for the given key.\n *\n * Place this on any element to declaratively initialize a detached component.\n * The component is created in the service on init and is NOT destroyed when this directive is destroyed —\n * it lives in the service until explicitly closed.\n *\n * @example\n * ```html\n * <div [dbxDetachInit]=\"chatWidgetConfig\" dbxDetachInitKey=\"support-chat\"></div>\n * ```\n */\n@Directive({\n  selector: '[dbxDetachInit]'\n})\nexport class DbxDetachInitDirective implements OnInit {\n  private readonly _detachService = inject(DbxDetachService);\n\n  readonly config = input.required<DbxInjectionComponentConfig>({ alias: 'dbxDetachInit' });\n  readonly key = input<DbxDetachKey>(DEFAULT_DBX_DETACH_KEY, { alias: 'dbxDetachInitKey' });\n\n  ngOnInit(): void {\n    this._detachService.init({\n      ...this.config(),\n      key: this.key()\n    });\n  }\n}\n","import { Component, ElementRef, inject, input, type OnInit, type OnDestroy, effect } from '@angular/core';\nimport { DEFAULT_DBX_DETACH_KEY, type DbxDetachKey } from './detach';\nimport { DbxDetachService } from './detach.service';\n\n/**\n * Outlet component that displays a detached component at its DOM location.\n *\n * When this component initializes, it tells the {@link DbxDetachService} to move\n * the component for the given key into this element.\n *\n * When destroyed (e.g. navigation away), behavior depends on {@link detachOnDestroy}:\n * - `true`: the component moves to the floating overlay and remains visible\n * - `false` (default): the component stays alive in the service but is hidden until a new outlet appears\n *\n * @example\n * ```html\n * <!-- Auto-floats when navigating away -->\n * <dbx-detach-outlet key=\"support-chat\" [detachOnDestroy]=\"true\"></dbx-detach-outlet>\n *\n * <!-- Hidden when navigating away, re-appears when outlet is recreated -->\n * <dbx-detach-outlet key=\"support-chat\"></dbx-detach-outlet>\n * ```\n */\n@Component({\n  selector: 'dbx-detach-outlet',\n  template: `\n    <div class=\"dbx-detach-outlet-content\"></div>\n  `,\n  host: {\n    class: 'dbx-detach-outlet'\n  }\n})\nexport class DbxDetachOutletComponent implements OnInit, OnDestroy {\n  private readonly _detachService = inject(DbxDetachService);\n  private readonly _elementRef = inject(ElementRef);\n\n  readonly key = input<DbxDetachKey>(DEFAULT_DBX_DETACH_KEY);\n\n  /**\n   * When true, the component automatically moves to the floating overlay\n   * when this outlet is destroyed (e.g. page navigation). Defaults to false.\n   */\n  readonly detachOnDestroy = input(false);\n\n  private _currentKey?: DbxDetachKey;\n  private _contentElement?: Element;\n\n  /**\n   * Re-attaches when the key input changes.\n   */\n  protected readonly _keyEffect = effect(() => {\n    const newKey = this.key();\n    if (this._currentKey && this._currentKey !== newKey) {\n      this._releaseFromService(this._currentKey);\n    }\n\n    this._currentKey = newKey;\n    this._attachToService(newKey);\n  });\n\n  ngOnInit(): void {\n    this._contentElement = this._elementRef.nativeElement.querySelector('.dbx-detach-outlet-content');\n  }\n\n  ngOnDestroy(): void {\n    if (this._currentKey && this._contentElement) {\n      this._detachService.outletDestroyed(this._currentKey, this._contentElement, this.detachOnDestroy());\n    }\n  }\n\n  private _attachToService(key: DbxDetachKey): void {\n    if (this._contentElement) {\n      this._detachService.attachToOutlet(key, this._contentElement);\n    }\n  }\n\n  private _releaseFromService(key: DbxDetachKey): void {\n    if (this._contentElement) {\n      this._detachService.outletDestroyed(key, this._contentElement, this.detachOnDestroy());\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxDetachOutletComponent } from './detach.outlet.component';\nimport { DbxDetachInitDirective } from './detach.init.directive';\nimport { DbxDetachOverlayComponent } from './detach.overlay.component';\nimport { DbxDetachContentComponent } from './detach.content.component';\nimport { DbxDetachControlsComponent } from './detach.controls.component';\nimport { DbxDetachControlButtonsComponent } from './detach.controls.buttons.component';\n\nconst importsAndExports = [DbxDetachOutletComponent, DbxDetachInitDirective, DbxDetachOverlayComponent, DbxDetachContentComponent, DbxDetachControlsComponent, DbxDetachControlButtonsComponent];\n\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxDetachInteractionModule {}\n","import { Directive, inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { AbstractTransitionWatcherDirective } from '@dereekb/dbx-core';\n\n/**\n * Abstract base directive for dialog components that automatically close on a successful route transition.\n *\n * Provides access to the dialog's injected data and a reference to close or return a value from the dialog.\n */\n@Directive()\nexport abstract class AbstractDialogDirective<R = unknown, D = unknown, T = unknown> extends AbstractTransitionWatcherDirective {\n  readonly data: D = inject(MAT_DIALOG_DATA, { optional: true });\n  readonly dialogRef = inject(MatDialogRef<T, R>);\n\n  protected updateForSuccessfulTransition(): void {\n    this.close();\n  }\n\n  returnValue(value?: R) {\n    this.close(value);\n  }\n\n  close(value?: R) {\n    this.dialogRef.close(value);\n  }\n}\n","import { Component, input, output } from '@angular/core';\nimport { MatIconButton } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\n\n/**\n * Renders a floating close button positioned in the corner of a dialog.\n *\n * @example\n * ```html\n * <dbx-dialog-content-close (close)=\"onClose()\" [padded]=\"true\"></dbx-dialog-content-close>\n * ```\n */\n@Component({\n  selector: 'dbx-dialog-content-close',\n  template: `\n    <button class=\"dbx-dialog-content-close-button\" mat-icon-button (click)=\"closeClicked()\">\n      <mat-icon>close</mat-icon>\n    </button>\n  `,\n  host: {\n    class: 'dbx-dialog-content-close',\n    '[class.dbx-dialog-content-close-padding]': 'padded()'\n  },\n  imports: [MatIconModule, MatIconButton]\n})\nexport class DbxDialogContentCloseComponent {\n  readonly padded = input<boolean>(true);\n\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  readonly close = output<void>();\n\n  closeClicked() {\n    this.close.emit(undefined);\n  }\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { type ThemePalette } from '@angular/material/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type DbxButtonStyle } from '../../button/button';\n\n/**\n * Configuration for the dialog content footer button appearance.\n */\nexport interface DbxDialogContentFooterConfig {\n  /**\n   * (Optional) Material theme palette for the close button.\n   *\n   * Only accepts a {@link ThemePalette}; prefer {@link buttonStyle} to paint the button with an arbitrary\n   * {@link DbxColorInput} (including a registered color template).\n   */\n  readonly buttonColor?: ThemePalette;\n  readonly closeText?: string;\n  /**\n   * (Optional) Style for the close button.\n   *\n   * Defaults to {@link DEFAULT_DIALOG_CONTENT_FOOTER_BUTTON_STYLE}. A `color` set here wins over {@link buttonColor}.\n   */\n  readonly buttonStyle?: Maybe<DbxButtonStyle>;\n}\n\n/**\n * Default style for the dialog content footer's close button.\n */\nexport const DEFAULT_DIALOG_CONTENT_FOOTER_BUTTON_STYLE: DbxButtonStyle = { type: 'raised' };\n\n/**\n * Renders a close button at the bottom of a dialog with customizable text and color.\n *\n * @example\n * ```html\n * <dbx-dialog-content-footer [closeText]=\"'Done'\" [buttonColor]=\"'primary'\" (close)=\"onClose()\"></dbx-dialog-content-footer>\n * ```\n *\n * @example\n * ```html\n * <dbx-dialog-content-footer [closeText]=\"'Done'\" [buttonStyle]=\"{ type: 'flat', color: brandColor }\" (close)=\"onClose()\"></dbx-dialog-content-footer>\n * ```\n */\n@Component({\n  selector: 'dbx-dialog-content-footer',\n  template: `\n    <dbx-button [buttonStyle]=\"buttonStyleSignal()\" [text]=\"closeTextSignal()\" (buttonClick)=\"closeClicked()\"></dbx-button>\n  `,\n  host: {\n    class: 'dbx-dialog-content-footer'\n  },\n  imports: [DbxButtonComponent]\n})\nexport class DbxDialogContentFooterComponent {\n  readonly config = input<Maybe<DbxDialogContentFooterConfig>>();\n\n  readonly closeText = input<Maybe<string>>();\n  readonly buttonColor = input<Maybe<ThemePalette>>();\n  readonly buttonStyle = input<Maybe<DbxButtonStyle>>();\n\n  readonly closeTextSignal = computed(() => {\n    const config = this.config();\n    return this.closeText() ?? config?.closeText ?? 'Close';\n  });\n\n  /**\n   * Resolved close button style. The narrower {@link buttonColor} is folded in as the color only when the resolved\n   * style does not already carry one, so a `buttonStyle` color always wins.\n   */\n  readonly buttonStyleSignal = computed<DbxButtonStyle>(() => {\n    const buttonColor = this.buttonColor();\n    const config = this.config();\n    const style = this.buttonStyle() ?? config?.buttonStyle;\n    const color = style?.color ?? buttonColor ?? config?.buttonColor;\n    return { ...DEFAULT_DIALOG_CONTENT_FOOTER_BUTTON_STYLE, ...style, color };\n  });\n\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  readonly close = output<void>();\n\n  closeClicked() {\n    this.close.emit();\n  }\n}\n","import { computed, Directive, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Width mode for dialog content containers.\n */\nexport type DbxDialogContentContainerWidth = 'normal' | 'wide';\n\n/**\n * Directive that applies standard dialog content styling and width configuration.\n *\n * Can be used as an element, attribute, or CSS class selector.\n *\n * @dbxWebComponent\n * @dbxWebSlug dialog-content\n * @dbxWebCategory overlay\n * @dbxWebRelated popover, popup, prompt\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <div dbxDialogContent>Body</div>\n * ```\n *\n * @example\n * ```html\n * <dbx-dialog-content>\n *   <h2>Confirm</h2>\n *   <p>Are you sure?</p>\n * </dbx-dialog-content>\n * ```\n */\n@Directive({\n  selector: 'dbx-dialog-content,[dbxDialogContent],.dbx-dialog-content',\n  host: {\n    class: 'dbx-dialog-content',\n    '[class]': `classConfigSignal()`\n  }\n})\nexport class DbxDialogContentDirective {\n  readonly width = input<DbxDialogContentContainerWidth, Maybe<DbxDialogContentContainerWidth>>('normal', { transform: (x) => x ?? 'normal' });\n\n  readonly classConfigSignal = computed(() => `${this.width()}-dialog-content`);\n}\n","import { first, type Observable } from 'rxjs';\nimport { Directive, ElementRef, inject, input } from '@angular/core';\nimport { AbstractDbxActionValueGetterDirective } from '@dereekb/dbx-core';\nimport { type IsEqualFunction, type IsModifiedFunction } from '@dereekb/rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { type MatDialogRef } from '@angular/material/dialog';\n\n/**\n * A function that opens a MatDialog and returns the dialog reference. Used with {@link DbxActionDialogDirective}.\n */\nexport type DbxActionDialogFunction<T = unknown> = () => MatDialogRef<unknown, Maybe<T>>;\n\n/**\n * Action directive that opens a dialog and captures the returned value as the action's value.\n *\n * The directive triggers the provided dialog function, waits for the dialog to close, and uses the result as the action value.\n *\n * @example\n * ```html\n * <button [dbxActionDialog]=\"openMyDialog\" dbxActionButton></button>\n * ```\n */\n@Directive({\n  exportAs: 'dbxActionDialog',\n  selector: '[dbxActionDialog]'\n})\nexport class DbxActionDialogDirective<T = unknown> extends AbstractDbxActionValueGetterDirective<T> {\n  readonly elementRef = inject(ElementRef);\n\n  readonly dbxActionDialog = input.required<DbxActionDialogFunction<T>>();\n  readonly dbxActionDialogIsModified = input<Maybe<IsModifiedFunction>>();\n  readonly dbxActionDialogIsEqual = input<Maybe<IsEqualFunction>>();\n\n  constructor() {\n    super();\n    this.configureInputs({\n      isModifiedSignal: this.dbxActionDialogIsModified,\n      isEqualSignal: this.dbxActionDialogIsEqual\n    });\n    this.setValueGetterFunction(() => this._getDataFromDialog());\n  }\n\n  protected _getDataFromDialog(): Observable<Maybe<T>> {\n    return this._makeDialogRef().afterClosed().pipe(first());\n  }\n\n  protected _makeDialogRef(): MatDialogRef<unknown, Maybe<T>> {\n    return this.dbxActionDialog()();\n  }\n}\n","import { Component } from '@angular/core';\nimport { type MatDialog, type MatDialogRef, type MatDialogConfig } from '@angular/material/dialog';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { AbstractDialogDirective } from './abstract.dialog.directive';\nimport { type DbxDialogContentContainerWidth, DbxDialogContentDirective } from './dialog.content.directive';\nimport { DbxDialogContentCloseComponent } from './dialog.content.close.component';\nimport { type Maybe } from '@dereekb/util';\nimport { NgClass } from '@angular/common';\n\n/**\n * Configuration for opening a dialog with a dynamically injected component.\n */\nexport interface DbxInjectionDialogComponentConfig<T = unknown> extends Omit<MatDialogConfig, 'data'> {\n  readonly contentWidth?: Maybe<DbxDialogContentContainerWidth>;\n  readonly showCloseButton?: boolean;\n  readonly componentConfig: DbxInjectionComponentConfig<T>;\n}\n\n/**\n * Dialog component that renders a dynamically injected component using {@link DbxInjectionComponent}.\n *\n * Use the static `openDialog` method to open the dialog with a given component configuration.\n *\n * @example\n * ```ts\n * DbxInjectionDialogComponent.openDialog(matDialog, {\n *   componentConfig: { componentClass: MyComponent },\n *   showCloseButton: true,\n *   contentWidth: 'wide'\n * });\n * ```\n */\n@Component({\n  template: `\n    <dbx-dialog-content class=\"dbx-dialog-content-100\" [ngClass]=\"{ 'dbx-dialog-content-100-padded-closed': showCloseButton }\" [width]=\"contentWidth\">\n      @if (showCloseButton) {\n        <dbx-dialog-content-close (close)=\"close()\"></dbx-dialog-content-close>\n      }\n      <dbx-injection [config]=\"componentConfig\"></dbx-injection>\n    </dbx-dialog-content>\n  `,\n  imports: [DbxInjectionComponent, DbxDialogContentDirective, DbxDialogContentCloseComponent, NgClass]\n})\nexport class DbxInjectionDialogComponent<T = unknown> extends AbstractDialogDirective<void, DbxInjectionDialogComponentConfig<T>> {\n  get showCloseButton() {\n    return this.data.showCloseButton ?? true;\n  }\n\n  get contentWidth() {\n    return this.data.contentWidth;\n  }\n\n  get componentConfig() {\n    return this.data.componentConfig;\n  }\n\n  static openDialog<T>(matDialog: MatDialog, config: DbxInjectionDialogComponentConfig<T>): MatDialogRef<DbxInjectionDialogComponent<T>, void> {\n    return matDialog.open(DbxInjectionDialogComponent<T>, {\n      width: '80vw',\n      height: '80vh',\n      ...config,\n      data: config\n    });\n  }\n}\n","import { type MatDialogConfig } from '@angular/material/dialog';\nimport { type Maybe, cssClassesSet } from '@dereekb/util';\n\n/**\n * Configuration for dialog content, extending MatDialogConfig but omitting internal properties.\n */\nexport type DbxDialogContentConfig = Omit<MatDialogConfig, 'viewContainerRef' | 'injector' | 'id' | 'data'>;\n\n/**\n * Sanitizes a {@link DbxDialogContentConfig} by normalizing the panelClass into an array.\n *\n * @param input - The dialog content config to sanitize, or null/undefined.\n * @returns A new config with panelClass normalized to an array of CSS class strings.\n *\n * @example\n * ```ts\n * const config = sanitizeDbxDialogContentConfig({ panelClass: 'my-panel my-other-panel' });\n * ```\n */\nexport function sanitizeDbxDialogContentConfig(input: Maybe<DbxDialogContentConfig>): DbxDialogContentConfig {\n  const panelClass = input?.panelClass;\n\n  return {\n    ...input,\n    panelClass: panelClass ? Array.from(cssClassesSet(input?.panelClass)) : undefined\n  };\n}\n","import { NgModule } from '@angular/core';\nimport { DbxDialogContentDirective } from './dialog.content.directive';\nimport { DbxActionDialogDirective } from './dialog.action.directive';\nimport { DbxDialogContentFooterComponent } from './dialog.content.footer.component';\nimport { DbxDialogContentCloseComponent } from './dialog.content.close.component';\n\nconst importsAndExports = [DbxDialogContentDirective, DbxActionDialogDirective, DbxDialogContentFooterComponent, DbxDialogContentCloseComponent];\n\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxDialogModule {}\n","import { DbxPopoverComponent, type DbxPopoverComponentConfig, type FullDbxPopoverComponentConfig } from './popover.component';\nimport { Service, Injector, inject } from '@angular/core';\nimport { type NgOverlayContainerConfiguration, NgOverlayContainerService, type NgPopoverRef } from 'ng-overlay-container';\nimport { Overlay } from '@angular/cdk/overlay';\n\n/**\n * Sizing-related configuration options for a popover overlay.\n */\nexport type DbxPopoverConfigSizing = Pick<NgOverlayContainerConfiguration, 'originX' | 'originY' | 'height' | 'width' | 'minHeight' | 'minWidth' | 'isResizable'>;\n\n/**\n * Full configuration for opening a popover via {@link DbxPopoverService}, combining component config with sizing and an optional injector.\n */\nexport interface DbxPopoverConfig<O, I, T> extends DbxPopoverComponentConfig<O, I, T>, DbxPopoverConfigSizing {\n  readonly injector?: Injector;\n}\n\n/**\n * Root-level service for programmatically opening popover overlays with dynamic component content.\n *\n * @example\n * ```ts\n * const ref = popoverService.open({\n *   key: 'my-popover',\n *   origin: elementRef,\n *   componentClass: MyPopoverContentComponent,\n *   width: '400px',\n *   height: '300px'\n * });\n * ```\n */\n@Service()\nexport class DbxPopoverService {\n  private readonly _overlay = inject(Overlay);\n  private readonly _injector = inject(Injector);\n  private readonly _overlayContainerService: NgOverlayContainerService = new NgOverlayContainerService(this._overlay, this._injector);\n\n  open<O, I, T>(config: DbxPopoverConfig<O, I, T>): NgPopoverRef<DbxPopoverComponentConfig<O, I, T>, O> {\n    const service = config.injector ? new NgOverlayContainerService(this._overlay, config.injector) : this._overlayContainerService;\n\n    const configuration: NgOverlayContainerConfiguration = {\n      panelClass: 'dbx-popover-container',\n      originX: config.originX ?? 'start',\n      originY: config.originY ?? 'top',\n      // TODO: Resize height/width.\n      minHeight: config.minHeight,\n      minWidth: config.minWidth,\n      height: config.height ?? '500px',\n      width: config.width ?? '400px',\n      hasBackdrop: true,\n      isDraggable: false,\n      isResizable: config.isResizable ?? false,\n      disableBackdropClose: false\n    };\n\n    return service.open<FullDbxPopoverComponentConfig<O, I, T>, O>({\n      content: DbxPopoverComponent,\n      data: {\n        ...config,\n        configuration\n      },\n      configuration\n    });\n  }\n}\n","import { Directive, type ElementRef, output } from '@angular/core';\nimport { clean, cleanSubscription } from '@dereekb/dbx-core';\nimport { type NgPopoverCloseEvent, type NgPopoverRef } from 'ng-overlay-container';\n\n/**\n * Abstract base directive for creating and managing a popover reference lifecycle, including open and close events.\n *\n * The open popover is closed when the directive is destroyed, since it is anchored to the directive's element and usually\n * reads from the directive's injector. This also closes a popover that stays open across route transitions when its page is left.\n */\n@Directive()\nexport abstract class AbstractPopoverRefDirective<T = unknown, R = unknown> {\n  private _popoverRef?: NgPopoverRef<T, R>;\n\n  protected readonly _popoverSub = cleanSubscription();\n\n  constructor() {\n    // registered after _popoverSub, so its afterClosed$ subscription is already gone and _afterClosed() does not run for a destroyed directive\n    clean(() => this._popoverRef?.close());\n  }\n\n  showPopover(origin?: ElementRef): void {\n    if (!this._popoverRef) {\n      this._showPopoverRef(origin);\n    }\n  }\n\n  private _showPopoverRef(origin?: ElementRef): void {\n    const popoverRef = this._makePopoverRef(origin);\n    this._popoverRef = popoverRef;\n    this._afterOpened(popoverRef);\n    this._popoverSub.setSub(\n      popoverRef.afterClosed$.subscribe((x) => {\n        this._afterClosed(x);\n        this._popoverRef = undefined;\n      })\n    );\n  }\n\n  protected abstract _makePopoverRef(origin?: ElementRef): NgPopoverRef<T, R>;\n\n  protected _afterOpened(_popoverRef: NgPopoverRef<T, R>): void {\n    // Do nothing. Override in parent type\n  }\n\n  protected _afterClosed(_value: NgPopoverCloseEvent<R>): void {\n    // Do nothing. Override in parent type\n  }\n}\n\n/**\n * Extension of {@link AbstractPopoverRefDirective} that emits `popoverOpened` and `popoverClosed` output events.\n */\n@Directive()\nexport abstract class AbstractPopoverRefWithEventsDirective<T = unknown, R = unknown> extends AbstractPopoverRefDirective<T, R> {\n  readonly popoverOpened = output<NgPopoverRef<T, R>>();\n  readonly popoverClosed = output<NgPopoverCloseEvent<R>>();\n\n  protected override _afterOpened(popoverRef: NgPopoverRef<T, R>): void {\n    this.popoverOpened.emit(popoverRef);\n  }\n\n  protected override _afterClosed(event: NgPopoverCloseEvent<R>): void {\n    this.popoverClosed.emit(event);\n  }\n}\n","import { first, type Observable, map } from 'rxjs';\nimport { Directive, ElementRef, inject, input } from '@angular/core';\nimport { type NgPopoverRef } from 'ng-overlay-container';\nimport { AbstractDbxActionValueGetterDirective } from '@dereekb/dbx-core';\nimport { type IsEqualFunction, type IsModifiedFunction } from '@dereekb/rxjs';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Parameters passed to a {@link DbxActionPopoverFunction} when opening a popover.\n */\nexport interface DbxActionPopoverFunctionParams {\n  readonly origin: ElementRef;\n}\n\n/**\n * A function that opens a popover and returns its reference. Used with {@link DbxActionPopoverDirective}.\n */\nexport type DbxActionPopoverFunction<T = unknown> = (params: DbxActionPopoverFunctionParams) => NgPopoverRef<unknown, Maybe<T>>;\n\n/**\n * Action directive that opens a popover and captures the returned value as the action's value.\n *\n * The directive triggers the provided popover function, waits for the popover to close, and uses the result as the action value.\n *\n * @example\n * ```html\n * <button [dbxActionPopover]=\"openMyPopover\" dbxActionButton></button>\n * ```\n */\n@Directive({\n  exportAs: 'dbxActionPopover',\n  selector: '[dbxActionPopover]'\n})\nexport class DbxActionPopoverDirective<T = unknown> extends AbstractDbxActionValueGetterDirective<T> {\n  readonly elementRef = inject(ElementRef);\n\n  readonly dbxActionPopover = input.required<DbxActionPopoverFunction<T>>();\n  readonly dbxActionPopoverIsModified = input<Maybe<IsModifiedFunction>>();\n  readonly dbxActionPopoverIsEqual = input<Maybe<IsEqualFunction>>();\n\n  constructor() {\n    super();\n    this.configureInputs({\n      isModifiedSignal: this.dbxActionPopoverIsModified,\n      isEqualSignal: this.dbxActionPopoverIsEqual\n    });\n    this.setValueGetterFunction(() => this._getDataFromPopover());\n  }\n\n  protected _getDataFromPopover(): Observable<Maybe<T>> {\n    return this._makePopoverRef().afterClosed$.pipe(\n      first(),\n      map((x) => x.data)\n    );\n  }\n\n  protected _makePopoverRef(): NgPopoverRef<unknown, Maybe<T>> {\n    const origin = this.elementRef;\n    const fn = this.dbxActionPopover();\n\n    return fn({\n      origin\n    });\n  }\n}\n","import { Component, inject } from '@angular/core';\nimport { DbxPopoverComponent } from './popover.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatIconButton } from '@angular/material/button';\n\n/**\n * Renders a close icon button that closes the parent popover when clicked.\n *\n * @example\n * ```html\n * <dbx-popover-header [header]=\"'Settings'\">\n *   <dbx-popover-close-button></dbx-popover-close-button>\n * </dbx-popover-header>\n * ```\n */\n@Component({\n  selector: 'dbx-popover-close-button',\n  template: `\n    <button mat-icon-button (click)=\"dbxPopoverComponent.close()\"><mat-icon>close</mat-icon></button>\n  `,\n  imports: [MatIconModule, MatIconButton]\n})\nexport class DbxPopoverCloseButtonComponent {\n  readonly dbxPopoverComponent = inject(DbxPopoverComponent);\n}\n","import { DestroyRef, ElementRef, inject, type Signal, signal } from '@angular/core';\n\n/**\n * Resize event used by resizeSignal.\n *\n * Maintains the same pattern as https://github.com/NemesLaszlo/angular-resize-event\n */\nexport interface ResizedEvent {\n  readonly newRect: DOMRectReadOnly;\n  readonly oldRect?: DOMRectReadOnly;\n  readonly isFirst: boolean;\n}\n\n/**\n * Creates a signal that emits {@link ResizedEvent} values whenever the observed element is resized.\n *\n * Must be called in an Angular injection context. Automatically disconnects the ResizeObserver on destroy.\n *\n * @param inputElement - The element to observe; if omitted, the host element is injected via `ElementRef`\n * @returns A read-only signal of resize events.\n *\n * @example\n * ```ts\n * // In a component:\n * readonly resize = resizeSignal();\n *\n * readonly widthEffect = effect(() => {\n *   console.log('New width:', this.resize().newRect.width);\n * });\n * ```\n */\nexport function resizeSignal(inputElement?: ElementRef<HTMLElement>): Signal<ResizedEvent> {\n  const element = inputElement ?? inject(ElementRef<HTMLElement>);\n\n  const destroyRef = inject(DestroyRef);\n  const resizeSignal = signal<ResizedEvent>({\n    newRect: element.nativeElement.getBoundingClientRect(),\n    isFirst: true\n  });\n\n  let oldRect: DOMRectReadOnly;\n\n  const observeEvent = (entries: ResizeObserverEntry[]) => {\n    const domSize = entries[0];\n    const resizedEvent: ResizedEvent = {\n      newRect: domSize.contentRect,\n      oldRect,\n      isFirst: !oldRect\n    };\n\n    oldRect = domSize.contentRect;\n    resizeSignal.set(resizedEvent);\n  };\n\n  const observer = new ResizeObserver(observeEvent);\n  observer.observe(element.nativeElement);\n\n  destroyRef.onDestroy(() => {\n    observer.disconnect();\n  });\n\n  return resizeSignal;\n}\n","import { Directive, inject, ElementRef, output, effect } from '@angular/core';\nimport { type ResizedEvent, resizeSignal } from './resize';\n\n/**\n * Emits {@link ResizedEvent} values whenever the host element is resized.\n *\n * Uses a `ResizeObserver` internally via {@link resizeSignal}.\n *\n * @dbxWebComponent\n * @dbxWebSlug resized\n * @dbxWebCategory screen\n * @dbxWebRelated flex-group\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div (dbxResized)=\"handle($event)\"></div>\n * ```\n *\n * @example\n * ```html\n * <div (dbxResized)=\"onResized($event)\" class=\"resizable-panel\"></div>\n * ```\n */\n@Directive({\n  selector: '[dbxResized]'\n})\nexport class DbxResizedDirective {\n  readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n  readonly resizedSignal = resizeSignal(this.elementRef);\n  readonly dbxResized = output<ResizedEvent>();\n\n  protected _resizeEffect = effect(() => {\n    this.dbxResized.emit(this.resizedSignal());\n  });\n}\n","import { BehaviorSubject, throttleTime } from 'rxjs';\nimport { Component } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { type ResizedEvent } from '../../screen/resize';\nimport { DbxResizedDirective } from '../../screen/resize.directive';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\n\n/**\n * Wraps popover body content, providing a resizable container that tracks its height for dynamic sizing.\n *\n * Supports a `[controls]` content projection slot for popover control elements.\n *\n * @example\n * ```html\n * <dbx-popover-content>\n *   <dbx-popover-controls controls></dbx-popover-controls>\n *   <p>Popover body content here.</p>\n * </dbx-popover-content>\n * ```\n */\n@Component({\n  selector: 'dbx-popover-content',\n  template: `\n    <div class=\"d-block dbx-popover-content\" (dbxResized)=\"onResized($event)\" [style.--popoverh]=\"heightSignal()\">\n      <ng-content select=\"[controls]\"></ng-content>\n      <div class=\"dbx-popover-content-container\">\n        <ng-content></ng-content>\n      </div>\n    </div>\n  `,\n  imports: [DbxResizedDirective]\n})\nexport class DbxPopoverContentComponent {\n  readonly hasControls = completeOnDestroy(new BehaviorSubject<boolean>(false));\n  readonly hasHeader = completeOnDestroy(new BehaviorSubject<boolean>(false));\n\n  private readonly _height = completeOnDestroy(new BehaviorSubject<string>(''));\n  readonly height$ = this._height.asObservable().pipe(throttleTime(100, undefined, { leading: true, trailing: true }));\n\n  readonly heightSignal = toSignal(this.height$);\n\n  onResized(event: ResizedEvent): void {\n    this._height.next(`${event.newRect.height}px`);\n  }\n}\n","import { Directive, inject, type OnInit } from '@angular/core';\nimport { DbxPopoverContentComponent } from './popover.content.component';\n\n/**\n * Marks an element as the controls section within a popover content container.\n *\n * Can be used as an element, attribute, or CSS class selector. Notifies the parent {@link DbxPopoverContentComponent} that controls are present.\n *\n * @example\n * ```html\n * <dbx-popover-content>\n *   <dbx-popover-controls>\n *     <dbx-popover-header [header]=\"'Title'\"></dbx-popover-header>\n *   </dbx-popover-controls>\n *   <p>Body content.</p>\n * </dbx-popover-content>\n * ```\n */\n@Directive({\n  selector: 'dbx-popover-controls,[dbxPopoverControls],.dbx-popover-controls',\n  host: {\n    class: 'd-block dbx-popover-controls'\n  }\n})\nexport class DbxPopoverControlsDirective implements OnInit {\n  readonly appPopoverContentComponent = inject(DbxPopoverContentComponent, { optional: true });\n\n  ngOnInit() {\n    if (this.appPopoverContentComponent) {\n      this.appPopoverContentComponent.hasControls.next(true);\n    }\n  }\n}\n","import { Component, type OnInit, inject, input } from '@angular/core';\nimport { DbxPopoverContentComponent } from './popover.content.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDivider } from '@angular/material/divider';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Renders a formatted header bar for a popover with an optional icon and projected action content.\n *\n * @example\n * ```html\n * <dbx-popover-header [header]=\"'Settings'\" [icon]=\"'settings'\">\n *   <dbx-popover-close-button></dbx-popover-close-button>\n * </dbx-popover-header>\n * ```\n */\n@Component({\n  selector: 'dbx-popover-header',\n  template: `\n    <div class=\"dbx-popover-header\">\n      <div class=\"dbx-popover-header-content dbx-flex-bar\">\n        <h3>\n          @if (icon()) {\n            <mat-icon class=\"dbx-icon-spacer\">{{ icon() }}</mat-icon>\n          }\n          {{ header() }}\n        </h3>\n        <span class=\"spacer\"></span>\n        <ng-content></ng-content>\n      </div>\n    </div>\n    <mat-divider></mat-divider>\n  `,\n  imports: [MatIconModule, MatDivider]\n})\nexport class DbxPopoverHeaderComponent implements OnInit {\n  readonly appPopoverContentComponent = inject(DbxPopoverContentComponent, { optional: true });\n\n  readonly header = input<Maybe<string>>();\n  readonly icon = input<Maybe<string>>();\n\n  ngOnInit() {\n    if (this.appPopoverContentComponent) {\n      this.appPopoverContentComponent.hasHeader.next(true);\n    }\n  }\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport { DbxPopoverContentComponent } from './popover.content.component';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Marks a region as scrollable content within a popover, applying dynamic CSS classes based on whether header and controls are present.\n *\n * Can be used as an element, attribute, or CSS class selector.\n *\n * @example\n * ```html\n * <dbx-popover-content>\n *   <dbx-popover-controls controls>...</dbx-popover-controls>\n *   <dbx-popover-scroll-content>\n *     <p>Scrollable content here.</p>\n *   </dbx-popover-scroll-content>\n * </dbx-popover-content>\n * ```\n */\n@Directive({\n  selector: 'dbx-popover-scroll-content,[dbxPopoverScrollContent],.dbx-popover-scroll-content',\n  host: {\n    class: 'd-block dbx-popover-scroll-content',\n    '[class]': 'sizingClassesSignal()'\n  }\n})\nexport class DbxPopoverScrollContentDirective {\n  readonly appPopoverContentComponent = inject(DbxPopoverContentComponent);\n\n  readonly hasControlsSignal = toSignal(this.appPopoverContentComponent.hasControls);\n  readonly hasHeaderSignal = toSignal(this.appPopoverContentComponent.hasHeader);\n\n  readonly sizingClassesSignal = computed(() => {\n    const hasHeader = this.hasHeaderSignal();\n    const hasControls = this.hasControlsSignal();\n\n    const classes: string[] = [];\n\n    if (hasHeader && hasControls) {\n      classes.push('popover-has-controls-and-header');\n    } else if (hasHeader) {\n      classes.push('popover-has-header');\n    } else if (hasControls) {\n      classes.push('popover-has-controls');\n    }\n\n    return classes.join(' ');\n  });\n}\n","import { NgModule } from '@angular/core';\nimport { DbxPopoverContentComponent } from './popover.content.component';\nimport { DbxPopoverControlsDirective } from './popover.controls.directive';\nimport { DbxPopoverHeaderComponent } from './popover.header.component';\nimport { DbxPopoverScrollContentDirective } from './popover.scroll.content.directive';\nimport { DbxPopoverCloseButtonComponent } from './popover.close.component';\n\nconst importsAndExports = [DbxPopoverContentComponent, DbxPopoverControlsDirective, DbxPopoverHeaderComponent, DbxPopoverCloseButtonComponent, DbxPopoverScrollContentDirective];\n\n/**\n * Contains all popover content components, allowing other sibling dbx-web modules to use the directives without referencing the full popover module.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxPopoverInteractionContentModule {}\n","import { NgModule } from '@angular/core';\nimport { DbxPopoverCoordinatorComponent } from './popover.coordinator.component';\nimport { DbxPopoverComponent } from './popover.component';\nimport { DbxPopoverInteractionContentModule } from './popover.content.module';\nimport { DbxActionPopoverDirective } from './popover.action.directive';\n\nconst importsAndExports = [DbxPopoverComponent, DbxPopoverCoordinatorComponent, DbxActionPopoverDirective, DbxPopoverInteractionContentModule];\n\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxPopoverInteractionModule {}\n","import { computed, Injectable, signal } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxButtonStyle } from '../../button/button';\n\n/**\n * A filter view of a filter popover: its preset filter or its custom filter.\n */\nexport type DbxFilterPopoverView = 'preset' | 'custom';\n\n/**\n * Configuration for a {@link DbxFilterPopoverViewService}, set by the filter popover that provides it.\n */\nexport interface DbxFilterPopoverViewServiceConfig {\n  /**\n   * View shown first.\n   */\n  readonly initialView: DbxFilterPopoverView;\n  /**\n   * Whether or not the popover has both a preset and a custom filter to switch between.\n   */\n  readonly canSwitchViews: boolean;\n  /**\n   * Text of the switch button while the preset filter is shown.\n   */\n  readonly customizeButtonText: string;\n  /**\n   * Text of the switch button while the custom filter is shown.\n   */\n  readonly presetsButtonText: string;\n  /**\n   * Style of the switch button.\n   */\n  readonly switchButtonStyle: DbxButtonStyle;\n  /**\n   * Called right before the view changes, while the shown filter still exists.\n   */\n  readonly beforeViewChange?: Maybe<() => void>;\n}\n\n/**\n * Shared view state of a filter popover: which of its filters is shown, and switching between its preset and custom filters.\n *\n * Provided by DbxFilterPopoverComponent to its header, its footer and its filter content, so any of them can read or switch the view.\n */\n@Injectable()\nexport class DbxFilterPopoverViewService {\n  private readonly _config = signal<Maybe<DbxFilterPopoverViewServiceConfig>>(undefined);\n  private readonly _view = signal<DbxFilterPopoverView>('preset');\n\n  readonly viewSignal = this._view.asReadonly();\n  readonly showPresetSignal = computed(() => this._view() === 'preset');\n  readonly canSwitchViewsSignal = computed(() => this._config()?.canSwitchViews ?? false);\n\n  /**\n   * Text of the switch button for the shown view.\n   */\n  readonly switchButtonTextSignal = computed(() => {\n    const config = this._config();\n    return this.showPresetSignal() ? config?.customizeButtonText : config?.presetsButtonText;\n  });\n\n  readonly switchButtonStyleSignal = computed(() => this._config()?.switchButtonStyle);\n\n  /**\n   * Configures the service and shows the initial view.\n   *\n   * @param config - Configuration from the filter popover.\n   */\n  init(config: DbxFilterPopoverViewServiceConfig): void {\n    this._config.set(config);\n    this._view.set(config.initialView);\n  }\n\n  /**\n   * Shows the given view. Does nothing when it is already shown.\n   *\n   * @param view - View to show.\n   */\n  setView(view: DbxFilterPopoverView): void {\n    if (view !== this._view()) {\n      this._config()?.beforeViewChange?.();\n      this._view.set(view);\n    }\n  }\n\n  showPresets(): void {\n    this.setView('preset');\n  }\n\n  showCustom(): void {\n    this.setView('custom');\n  }\n\n  /**\n   * Switches between the preset and custom views.\n   */\n  switchView(): void {\n    this.setView(this.showPresetSignal() ? 'custom' : 'preset');\n  }\n}\n","import { Component, inject } from '@angular/core';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxFilterPopoverViewService } from './filter.popover.view';\n\n/**\n * Button that switches a filter popover between its preset and custom filters. Shows the customize text while the presets are shown, and the presets text while the custom filter is shown.\n *\n * Renders nothing unless the popover has both a preset and a custom filter. The filter popover shows one in its header and/or below\n * its filter content (see `DbxFilterComponentConfig.showButtonsInHeader` / `showButtonsBelowContent`); filter content can also\n * place one itself.\n *\n * @example\n * ```html\n * <dbx-preset-filter-list [presets]=\"presets\"></dbx-preset-filter-list>\n * <dbx-filter-popover-switch-button></dbx-filter-popover-switch-button>\n * ```\n */\n@Component({\n  selector: 'dbx-filter-popover-switch-button',\n  template: `\n    @if (viewService.canSwitchViewsSignal()) {\n      <dbx-button [buttonStyle]=\"viewService.switchButtonStyleSignal()\" [text]=\"viewService.switchButtonTextSignal()\" (buttonClick)=\"viewService.switchView()\"></dbx-button>\n    }\n  `,\n  imports: [DbxButtonComponent]\n})\nexport class DbxFilterPopoverSwitchButtonComponent {\n  readonly viewService = inject(DbxFilterPopoverViewService);\n}\n","import { type DestroyFunction, type Maybe } from '@dereekb/util';\n\n/**\n * Applies a change that filter popover content has not applied yet. Runs synchronously, right before the popover closes and destroys the content.\n */\nexport type DbxFilterPopoverApplyPendingFunction = () => void;\n\n/**\n * Provided by a filter popover to its filter content, so the content can apply a pending change before the popover closes.\n *\n * Inject it optionally; content that is not rendered inside a filter popover gets nothing.\n */\nexport abstract class DbxFilterPopoverPendingChanges {\n  /**\n   * Registers a function that is called before the popover closes on its close button, on a filter change, on a transition or on a click outside.\n   *\n   * @param applyPending - Function that applies the pending change.\n   * @returns Removes the registration when called.\n   */\n  abstract registerApplyPending(applyPending: DbxFilterPopoverApplyPendingFunction): DestroyFunction;\n}\n\n/**\n * Registry of {@link DbxFilterPopoverApplyPendingFunction}s used by a filter popover.\n */\nexport class DbxFilterPopoverPendingChangesInstance implements DbxFilterPopoverPendingChanges {\n  private readonly _applyPendingFunctions = new Set<DbxFilterPopoverApplyPendingFunction>();\n\n  /**\n   * @param handleError - Receives an error thrown by a registered function. The remaining functions still run.\n   */\n  constructor(readonly handleError?: Maybe<(error: unknown) => void>) {}\n\n  /**\n   * Whether or not at least one function is registered.\n   *\n   * @returns `true` while at least one function is registered.\n   */\n  get hasApplyPending(): boolean {\n    return this._applyPendingFunctions.size > 0;\n  }\n\n  registerApplyPending(applyPending: DbxFilterPopoverApplyPendingFunction): DestroyFunction {\n    this._applyPendingFunctions.add(applyPending);\n\n    return () => {\n      this._applyPendingFunctions.delete(applyPending);\n    };\n  }\n\n  /**\n   * Runs every registered function.\n   */\n  applyPending(): void {\n    // a function that fails does not stop the others, so a broken apply never keeps the popover open\n    Array.from(this._applyPendingFunctions).forEach((applyPending) => {\n      try {\n        applyPending();\n      } catch (error) {\n        this.handleError?.(error);\n      }\n    });\n  }\n}\n","import { cleanSubscription, DbxInjectionComponent, type DbxInjectionComponentConfig, mergeStaticProviders } from '@dereekb/dbx-core';\nimport { ApplicationRef, Component, DOCUMENT, ElementRef, ErrorHandler, type Type, computed, inject } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { type NgPopoverRef } from 'ng-overlay-container';\nimport { type Observable, map, skip, first, defaultIfEmpty } from 'rxjs';\nimport { AbstractPopoverDirective } from '../popover/abstract.popover.directive';\nimport { type DbxPopoverService } from '../popover/popover.service';\nimport { type FilterSource, filterMaybe } from '@dereekb/rxjs';\nimport { type DbxPopoverKey } from '../popover/popover';\nimport { type DestroyFunction, type Maybe } from '@dereekb/util';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { type DbxFilterComponentConfig } from './filter.config';\nimport { DbxPopoverInteractionModule } from '../popover';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxButtonSpacerDirective } from '../../button/button.spacer.directive';\nimport { DbxFilterPopoverViewService } from './filter.popover.view';\nimport { DbxFilterPopoverSwitchButtonComponent } from './filter.popover.switch.button.component';\nimport { type DbxButtonStyle } from '../../button/button';\nimport { type DbxFilterPopoverApplyPendingFunction, DbxFilterPopoverPendingChanges, DbxFilterPopoverPendingChangesInstance } from './filter.popover.pending';\n\n/**\n * Configuration for opening a filter popover, extending the base filter config with origin positioning.\n */\nexport interface DbxFilterPopoverComponentConfig<F extends object = object> extends DbxFilterComponentConfig<F> {\n  /**\n   * Origin to add the popover to.\n   */\n  readonly origin: ElementRef;\n}\n\n/**\n * Default popover key used by filter popovers to ensure only one filter popover is open at a time.\n */\nexport const DEFAULT_FILTER_POPOVER_KEY = 'filter';\n\n/**\n * Default style for the popover header's \"Customize\"/\"Presets\" switch buttons.\n */\nexport const DEFAULT_FILTER_POPOVER_SWITCH_BUTTON_STYLE: DbxButtonStyle = { type: 'flat', color: 'accent' };\n\n/**\n * Default style for the popover header's close button.\n */\nexport const DEFAULT_FILTER_POPOVER_CLOSE_BUTTON_STYLE: DbxButtonStyle = { type: 'stroked', color: 'accent' };\n\n/**\n * Popover component that renders custom and/or preset filter components with toggling support.\n *\n * Use the static `openPopover` method to programmatically open the filter popover.\n *\n * With both a preset and a custom filter, the header shows a button to switch between them, and each closes the popover on a filter\n * change as configured: {@link DbxFilterComponentConfig.closeOnFilterChange} for the preset filter, and\n * {@link DbxFilterComponentConfig.closeOnCustomFilterChange} for the custom filter. The close button shows while the shown filter\n * keeps the popover open. The view is shared through {@link DbxFilterPopoverViewService}, which the popover provides to its\n * filter content and switch buttons. The switch and close buttons show in the header and/or below the filter content, as configured\n * by {@link DbxFilterComponentConfig.showButtonsInHeader} and {@link DbxFilterComponentConfig.showButtonsBelowContent}.\n *\n * Provides itself as {@link DbxFilterPopoverPendingChanges} to the filter content. While content has a function registered,\n * this component owns its popover's `getClosingValueFn`: before closing on the close button, on a filter change, on a transition\n * or on a click outside, it blurs the focused element inside the popover (committing typed input), runs pending change detection\n * and effects so that input reaches the content's form value, then calls the registered functions. All of this is synchronous,\n * so the popover closes right away.\n *\n * @example\n * ```ts\n * DbxFilterPopoverComponent.openPopover(popoverService, {\n *   origin: elementRef,\n *   connector: filterConnector,\n *   customFilterComponentClass: MyFilterComponent\n * });\n * ```\n */\n@Component({\n  templateUrl: './filter.popover.component.html',\n  providers: [DbxFilterPopoverViewService],\n  imports: [DbxPopoverInteractionModule, DbxInjectionComponent, DbxButtonComponent, DbxButtonSpacerDirective, DbxFilterPopoverSwitchButtonComponent, NgTemplateOutlet]\n})\nexport class DbxFilterPopoverComponent<F extends object> extends AbstractPopoverDirective<unknown, DbxFilterComponentConfig<F>> implements DbxFilterPopoverPendingChanges {\n  private readonly _elementRef = inject(ElementRef<HTMLElement>);\n  private readonly _document = inject(DOCUMENT);\n  private readonly _appRef = inject(ApplicationRef);\n  private readonly _errorHandler = inject(ErrorHandler);\n  private readonly _pendingChanges = new DbxFilterPopoverPendingChangesInstance((error) => this._errorHandler.handleError(error));\n\n  readonly viewService = inject(DbxFilterPopoverViewService);\n\n  readonly config: DbxFilterComponentConfig<F> = this.popover.data as DbxFilterComponentConfig<F>;\n\n  readonly icon = this.config.icon ?? 'filter_list';\n  readonly header = this.config.header ?? 'Filter';\n\n  readonly closeButtonText = this.config.closeButtonText ?? 'Close';\n  readonly customizeButtonText = this.config.customizeButtonText ?? 'Customize';\n  readonly presetsButtonText = this.config.presetsButtonText ?? 'Presets';\n\n  readonly switchButtonStyle = this.config.switchButtonStyle ?? DEFAULT_FILTER_POPOVER_SWITCH_BUTTON_STYLE;\n  readonly closeButtonStyle = this.config.closeButtonStyle ?? DEFAULT_FILTER_POPOVER_CLOSE_BUTTON_STYLE;\n\n  private readonly _hasCustomFilter = Boolean(this.config.customFilterComponentClass || this.config.customFilterComponentConfig);\n  private readonly _hasPresetFilter = Boolean(this.config.presetFilterComponentClass || this.config.presetFilterComponentConfig);\n\n  readonly closeOnPresetFilterChange = this.config.closeOnFilterChange ?? true;\n  readonly closeOnCustomFilterChange = this.config.closeOnCustomFilterChange ?? this.closeOnPresetFilterChange;\n\n  /**\n   * Whether or not to display buttons to toggle between custom and preset filters.\n   */\n  readonly showSwitchButtons = this._hasCustomFilter && this._hasPresetFilter;\n\n  readonly showButtonsInHeader = this.config.showButtonsInHeader ?? true;\n  readonly showButtonsBelowContent = this.config.showButtonsBelowContent ?? false;\n\n  readonly showPresetSignal = this.viewService.showPresetSignal;\n\n  /**\n   * Whether or not the shown filter closes the popover when the filter changes.\n   */\n  readonly closeOnFilterChangeSignal = computed(() => (this.showPresetSignal() ? this.closeOnPresetFilterChange : this.closeOnCustomFilterChange));\n\n  readonly showCloseButtonSignal = computed(() => {\n    const closeOnFilterChange = this.closeOnFilterChangeSignal();\n    return this.config.showCloseButton ?? !closeOnFilterChange;\n  });\n\n  /**\n   * Whether or not there is a switch or close button to show.\n   */\n  readonly hasButtonsSignal = computed(() => {\n    const showCloseButton = this.showCloseButtonSignal();\n    return this.showSwitchButtons || showCloseButton;\n  });\n\n  readonly config$: Observable<DbxInjectionComponentConfig<FilterSource<F>>> = toObservable(this.showPresetSignal).pipe(\n    map((showPreset) => {\n      const { connector, initialFilterObs, customFilterComponentClass, presetFilterComponentClass, customFilterComponentConfig, presetFilterComponentConfig } = this.config;\n      const closeOnFilterChange = showPreset ? this.closeOnPresetFilterChange : this.closeOnCustomFilterChange;\n      let componentClass: Type<FilterSource<F>>;\n      let baseConfig: Maybe<DbxInjectionComponentConfig<FilterSource<F>>>;\n\n      if (showPreset) {\n        componentClass = (presetFilterComponentConfig?.componentClass ?? presetFilterComponentClass) as Type<FilterSource<F>>;\n        baseConfig = presetFilterComponentConfig;\n      } else {\n        componentClass = (customFilterComponentConfig?.componentClass ?? customFilterComponentClass) as Type<FilterSource<F>>;\n        baseConfig = customFilterComponentConfig;\n      }\n\n      const config: DbxInjectionComponentConfig<FilterSource<F>> = {\n        ...baseConfig,\n        componentClass,\n        providers: mergeStaticProviders(baseConfig?.providers, { provide: DbxFilterPopoverPendingChanges, useValue: this }, { provide: DbxFilterPopoverViewService, useValue: this.viewService }),\n        init: (filterSource) => {\n          // NOTE: the source is seeded before it is connected, as connecting subscribes to filter$ immediately.\n          // A source that carries a default filter would otherwise emit that default at connect time, so merely opening the popover would reset the filter to the default.\n          if (initialFilterObs && filterSource.initWithFilter) {\n            filterSource.initWithFilter(initialFilterObs);\n          }\n\n          connector.connectWithSource(filterSource);\n\n          if (closeOnFilterChange) {\n            cleanSubscription(\n              filterSource.filter$.pipe(skip(1), filterMaybe(), first(), defaultIfEmpty(undefined)).subscribe(() => {\n                this.close();\n              })\n            );\n          }\n\n          // run the next init if provided\n          baseConfig?.init?.(filterSource);\n        }\n      };\n\n      return config;\n    })\n  );\n\n  readonly configSignal = toSignal(this.config$);\n\n  static openPopover<F extends object>(\n    popupService: DbxPopoverService,\n    {\n      width,\n      height,\n      isResizable,\n      origin,\n      header,\n      icon,\n      customFilterComponentClass,\n      presetFilterComponentClass,\n      customFilterComponentConfig,\n      presetFilterComponentConfig,\n      connector,\n      initialFilterObs,\n      closeOnFilterChange,\n      closeOnCustomFilterChange,\n      closeOnTransition,\n      customizeButtonText,\n      presetsButtonText,\n      showCloseButton,\n      closeButtonText,\n      switchButtonStyle,\n      showButtonsInHeader,\n      showButtonsBelowContent,\n      closeButtonStyle\n    }: DbxFilterPopoverComponentConfig<F>,\n    popoverKey?: DbxPopoverKey\n  ): NgPopoverRef {\n    const closesOnPresetFilterChange = closeOnFilterChange ?? true;\n    const closesOnCustomFilterChange = closeOnCustomFilterChange ?? closesOnPresetFilterChange;\n    const hasCustomFilter = Boolean(customFilterComponentClass || customFilterComponentConfig);\n    const hasPresetFilter = Boolean(presetFilterComponentClass || presetFilterComponentConfig);\n\n    // a filter that keeps the popover open across filter changes also keeps it open across the transitions they cause\n    const closesOnEveryFilterChange = (!hasPresetFilter || closesOnPresetFilterChange) && (!hasCustomFilter || closesOnCustomFilterChange);\n\n    return popupService.open({\n      key: popoverKey ?? DEFAULT_FILTER_POPOVER_KEY,\n      origin,\n      componentClass: DbxFilterPopoverComponent,\n      width,\n      height,\n      isResizable,\n      closeOnTransition: closeOnTransition ?? closesOnEveryFilterChange,\n      data: {\n        header,\n        icon,\n        customizeButtonText,\n        presetsButtonText,\n        showCloseButton,\n        closeButtonText,\n        switchButtonStyle,\n        showButtonsInHeader,\n        showButtonsBelowContent,\n        closeButtonStyle,\n        customFilterComponentClass,\n        presetFilterComponentClass,\n        customFilterComponentConfig,\n        presetFilterComponentConfig,\n        connector,\n        initialFilterObs,\n        closeOnFilterChange,\n        closeOnCustomFilterChange\n      } as DbxFilterComponentConfig<F>\n    });\n  }\n\n  constructor() {\n    super();\n\n    let showPreset: boolean = false;\n\n    if (this._hasCustomFilter) {\n      showPreset = false;\n    }\n\n    if (this._hasPresetFilter) {\n      showPreset = true;\n    }\n\n    if (!this._hasCustomFilter && !this._hasPresetFilter) {\n      throw new Error('Requires a preset or custom class provided for DbxFilterPopover.');\n    }\n\n    this.viewService.init({\n      initialView: showPreset ? 'preset' : 'custom',\n      canSwitchViews: this.showSwitchButtons,\n      customizeButtonText: this.customizeButtonText,\n      presetsButtonText: this.presetsButtonText,\n      switchButtonStyle: this.switchButtonStyle,\n      // switching destroys the shown filter, so apply its pending change first\n      beforeViewChange: () => this._applyPending()\n    });\n  }\n\n  /**\n   * Registers a function that is called before the popover closes. See {@link DbxFilterPopoverPendingChanges}.\n   *\n   * @param applyPending - Function that applies the pending change.\n   * @returns Removes the registration when called.\n   */\n  registerApplyPending(applyPending: DbxFilterPopoverApplyPendingFunction): DestroyFunction {\n    const unregister = this._pendingChanges.registerApplyPending(applyPending);\n    this.popover.getClosingValueFn = this._applyPendingBeforeClose;\n\n    return () => {\n      unregister();\n\n      if (!this._pendingChanges.hasApplyPending && this.popover.getClosingValueFn === this._applyPendingBeforeClose) {\n        this.popover.getClosingValueFn = undefined;\n      }\n    };\n  }\n\n  private readonly _applyPendingBeforeClose = (): undefined => {\n    this._applyPending();\n    return undefined;\n  };\n\n  /**\n   * Applies the content's pending changes: blurs the focused element inside the popover (committing typed input), runs pending\n   * change detection and effects, then calls the registered functions.\n   */\n  private _applyPending(): void {\n    if (this._pendingChanges.hasApplyPending) {\n      const active = this._document.activeElement;\n\n      // blurring commits input that is applied on blur, such as a typed date\n      if (active && this._elementRef.nativeElement.contains(active)) {\n        (active as HTMLElement).blur?.();\n      }\n\n      this._runPendingEffects();\n      this._pendingChanges.applyPending();\n    }\n  }\n\n  /**\n   * Runs pending change detection and effects, so input committed by the blur reaches the content's form value before the content is asked for it.\n   */\n  private _runPendingEffects(): void {\n    try {\n      this._appRef.tick();\n    } catch (error) {\n      // a tick that is already running (Angular error 101) runs the pending effects itself\n      if ((error as Maybe<{ code?: unknown }>)?.code !== 101) {\n        this._errorHandler.handleError(error);\n      }\n    }\n  }\n\n  showPresets() {\n    this.viewService.showPresets();\n  }\n\n  showCustom() {\n    this.viewService.showCustom();\n  }\n}\n","<dbx-popover-content>\n  <!-- Header -->\n  <dbx-popover-header [icon]=\"icon\" [header]=\"header\">\n    @if (showButtonsInHeader) {\n      <ng-container [ngTemplateOutlet]=\"buttons\"></ng-container>\n    }\n  </dbx-popover-header>\n  <!-- Content -->\n  <dbx-popover-scroll-content>\n    <dbx-injection [config]=\"configSignal()\"></dbx-injection>\n    @if (showButtonsBelowContent && hasButtonsSignal()) {\n      <div class=\"dbx-filter-popover-content-buttons\">\n        <ng-container [ngTemplateOutlet]=\"buttons\"></ng-container>\n      </div>\n    }\n  </dbx-popover-scroll-content>\n</dbx-popover-content>\n<!-- Buttons, shown in the header and/or below the content -->\n<ng-template #buttons>\n  @if (showSwitchButtons) {\n    <dbx-filter-popover-switch-button></dbx-filter-popover-switch-button>\n  }\n  @if (showCloseButtonSignal()) {\n    @if (showSwitchButtons) {\n      <dbx-button-spacer></dbx-button-spacer>\n    }\n    <dbx-button [buttonStyle]=\"closeButtonStyle\" [text]=\"closeButtonText\" (buttonClick)=\"close()\"></dbx-button>\n  }\n</ng-template>\n","import { Directive, type ElementRef, input, inject } from '@angular/core';\nimport { type NgPopoverRef } from 'ng-overlay-container';\nimport { DbxPopoverService } from '../popover/popover.service';\nimport { DbxFilterPopoverComponent } from './filter.popover.component';\nimport { AbstractPopoverRefDirective } from '../popover/abstract.popover.ref.directive';\nimport { type FilterSource, type PresetFilterSource } from '@dereekb/rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxFilterComponentConfig } from './filter.config';\n\n/**\n * Alias for {@link DbxFilterComponentConfig} used with filter button components.\n */\nexport type DbxFilterButtonConfig<F extends object> = DbxFilterComponentConfig<F>;\n\n/**\n * Filter button config that only uses a custom filter component (no preset filter).\n */\nexport type DbxFilterButtonConfigWithCustomFilter<F extends object, CF extends FilterSource<F> = FilterSource<F>> = Omit<DbxFilterComponentConfig<F, any, CF, any>, 'presetFilter' | 'presetFilterComponentConfig'>;\n\n/**\n * Filter button config that only uses a preset filter component (no custom filter).\n */\nexport type DbxFilterButtonConfigWithPresetFilter<F extends object, PF extends PresetFilterSource<F, any> = PresetFilterSource<F, any>> = Omit<DbxFilterComponentConfig<F, any, any, PF>, 'customFilter' | 'customFilterComponentConfig'>;\n\n/**\n * Abstract base directive for buttons that open a filter popover. Subclasses provide the origin element.\n */\n@Directive()\nexport abstract class AbstractFilterPopoverButtonDirective<F extends object> extends AbstractPopoverRefDirective<unknown, unknown> {\n  private readonly popupService = inject(DbxPopoverService);\n  readonly config = input<Maybe<DbxFilterComponentConfig<F, any, any, any>>>(undefined);\n\n  protected override _makePopoverRef(origin?: ElementRef): NgPopoverRef<unknown, unknown> {\n    const config = this.config();\n\n    if (!config) {\n      throw new Error('AbstractFilterPopoverButtonDirective(): Missing config.');\n    } else if (!origin) {\n      throw new Error('AbstractFilterPopoverButtonDirective(): Missing origin.');\n    }\n\n    return DbxFilterPopoverComponent.openPopover(this.popupService, {\n      origin,\n      ...config\n    });\n  }\n}\n","import { Component, computed, ElementRef, input, viewChild } from '@angular/core';\nimport { AbstractFilterPopoverButtonDirective } from './filter.popover.button.directive';\nimport { type DbxButtonDisplay } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type DbxButtonDisplayStylePair } from '../../button/button';\n\nconst DEFAULT_FILTER_POPOVER_BUTTON_DISPLAY_CONTENT: DbxButtonDisplay = {\n  icon: 'filter_list'\n};\n\n/**\n * Renders an icon button that opens a filter popover when clicked.\n *\n * The popover closes when the filter changes unless `closeOnFilterChange` is false, and closes on a route transition unless\n * `closeOnTransition` (which defaults to `closeOnFilterChange`) is false — so a popover editing a filter that is written to the\n * URL stays open while it is edited. The popover always closes when this button is destroyed, such as when leaving the page.\n * A `dbx-filter-wrapper` without its own Apply button applies its last change before the popover closes on its close button\n * or a click outside.\n *\n * @dbxWebComponent\n * @dbxWebSlug filter-popover-button\n * @dbxWebCategory overlay\n * @dbxWebRelated popover\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-filter-popover-button [config]=\"filterConfig\"></dbx-filter-popover-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-filter-popover-button [config]=\"filterConfig\" [buttonDisplayStyle]=\"{ display: { icon: 'filter_alt' } }\"></dbx-filter-popover-button>\n * ```\n */\n@Component({\n  selector: 'dbx-filter-popover-button',\n  template: `\n    <dbx-button #button (buttonClick)=\"showFilterPopover()\" [buttonDisplay]=\"buttonDisplaySignal()\" [buttonStyle]=\"buttonStyleSignal()\" [disabled]=\"disabled()\"></dbx-button>\n  `,\n  imports: [DbxButtonComponent]\n})\nexport class DbxFilterPopoverButtonComponent<F extends object = object> extends AbstractFilterPopoverButtonDirective<F> {\n  readonly buttonElement = viewChild<string, Maybe<ElementRef>>('button', { read: ElementRef });\n  readonly disabled = input<Maybe<boolean>>();\n\n  readonly buttonDisplayStyle = input<Maybe<DbxButtonDisplayStylePair>>();\n\n  readonly buttonDisplaySignal = computed(() => this.buttonDisplayStyle()?.display ?? DEFAULT_FILTER_POPOVER_BUTTON_DISPLAY_CONTENT);\n  readonly buttonStyleSignal = computed(() => this.buttonDisplayStyle()?.style);\n\n  showFilterPopover(): void {\n    const origin = this.buttonElement()?.nativeElement;\n    this.showPopover(origin);\n  }\n}\n","import { Component, computed, effect, inject, input } from '@angular/core';\nimport { AbstractDbxActionHandlerDirective, FilterSourceDirective, provideActionStoreSource } from '@dereekb/dbx-core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxButtonModule } from '../../button/button.module';\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\nimport { type WorkInstance } from '@dereekb/rxjs';\nimport { areEqualPOJOValues, type Maybe } from '@dereekb/util';\nimport { first } from 'rxjs';\nimport { DbxFilterPopoverPendingChanges } from './filter.popover.pending';\n\n/**\n * Wraps filter form content with apply/reset buttons, integrating with the action system.\n *\n * Provides an ActionContextStoreSource and applies the filter value to the nearest FilterSourceDirective on trigger.\n *\n * Inside a filter popover, a wrapper whose Apply button is hidden applies its last change before the popover closes (see {@link applyOnClose}),\n * so a change made right before clicking the popover's close button or outside of it is not lost.\n *\n * @example\n * ```html\n * <dbx-filter-wrapper [applyText]=\"'Apply'\" [applyIcon]=\"'filter_list'\">\n *   <my-filter-form dbxActionForm></my-filter-form>\n * </dbx-filter-wrapper>\n * ```\n */\n@Component({\n  selector: 'dbx-filter-wrapper',\n  templateUrl: './filter.wrapper.component.html',\n  providers: [provideActionStoreSource(null)],\n  imports: [DbxButtonModule, MatButtonModule, MatIconModule, FlexLayoutModule]\n})\nexport class DbxFilterWrapperComponent<F = unknown> extends AbstractDbxActionHandlerDirective<F> {\n  readonly filterSourceDirective = inject(FilterSourceDirective<F>);\n\n  readonly showButtons = input(true);\n  readonly applyRaised = input(true);\n  readonly applyIcon = input('filter_list');\n  readonly applyText = input('Filter');\n\n  /**\n   * Whether or not to apply a pending change before the filter popover this wrapper is in closes.\n   *\n   * Defaults to `!showButtons`: a wrapper without its own Apply button applies by itself (such as with dbxActionAutoTrigger),\n   * so its last change is kept. With the Apply button shown, closing without clicking it discards the change.\n   */\n  readonly applyOnClose = input<Maybe<boolean>>();\n\n  readonly applyOnCloseSignal = computed(() => {\n    const applyOnClose = this.applyOnClose();\n    const showButtons = this.showButtons();\n    return applyOnClose ?? !showButtons;\n  });\n\n  constructor() {\n    super();\n\n    // TODO: Consider throwing an error if dbxAction is provided at the same time as this, since the source would not be used?\n\n    // configure handler function\n    this._dbxActionHandlerInstance.setHandlerFunction((filter: F, instance: WorkInstance<F, unknown>) => {\n      this.filterSourceDirective.setFilter(filter);\n      instance.success(true);\n    });\n\n    const pendingChanges = inject(DbxFilterPopoverPendingChanges, { optional: true });\n\n    if (pendingChanges) {\n      // inside a filter popover: apply a change the action has not applied yet before the popover closes\n      effect((onCleanup) => {\n        if (this.applyOnCloseSignal()) {\n          onCleanup(pendingChanges.registerApplyPending(() => this.applyPendingFilter()));\n        }\n      });\n    }\n  }\n\n  /**\n   * Applies a change the action has not applied yet, synchronously.\n   *\n   * Takes the value a trigger would ready right now from the action's value source (such as dbxActionForm) and sets it on the filter source\n   * when it differs from the current filter. It skips the action's trigger path and its delays, so it works right before the content is destroyed.\n   */\n  applyPendingFilter(): void {\n    const value = this.source.valueSnapshot()?.value;\n\n    if (value != null) {\n      let currentFilter: Maybe<F>;\n      this.filterSourceDirective.filter$\n        .pipe(first())\n        .subscribe((x) => (currentFilter = x))\n        .unsubscribe();\n\n      if (!areEqualPOJOValues<Maybe<F>>(value, currentFilter)) {\n        this.filterSourceDirective.setFilter(value);\n      }\n    }\n  }\n\n  applyFilter(): void {\n    this.source.setIsModified(true); // Force setting modified.\n    this.source.trigger();\n  }\n\n  resetFilter(): void {\n    this.filterSourceDirective.resetFilter();\n  }\n}\n","<div class=\"dbx-filter-wrapper\">\n  <div class=\"dbx-filter-wrapper-content\">\n    <ng-content></ng-content>\n  </div>\n  @if (showButtons()) {\n    <div fxLayout=\"row\">\n      <dbx-button dbxActionButton [raised]=\"applyRaised()\" [text]=\"applyText()\" [icon]=\"applyIcon()\"></dbx-button>\n      <div class=\"spacer\"></div>\n      <button mat-icon-button (click)=\"resetFilter()\">\n        <mat-icon>clear</mat-icon>\n      </button>\n    </div>\n  }\n</div>\n","import { shareReplay, map, type Observable, combineLatest, distinctUntilChanged, startWith } from 'rxjs';\nimport { Directive, inject, input, output } from '@angular/core';\nimport { type ClickableFilterPreset, type ClickableAnchorLink, FilterSourceDirective, type ClickablePartialFilterPreset, type ClickableFilterPresetOrPartialPreset, isClickableFilterPreset } from '@dereekb/dbx-core';\nimport { getValueFromGetter, type Maybe, objectHasNoKeys } from '@dereekb/util';\nimport { type FilterWithPreset } from '@dereekb/rxjs';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Abstract base directive for preset filter menus that manages full and partial preset selection state.\n *\n * Subclasses render the list of preset anchors as either a list or a dropdown menu.\n */\n@Directive()\nexport abstract class AbstractDbxPresetFilterMenuDirective<F extends FilterWithPreset> {\n  readonly filterSourceDirective = inject(FilterSourceDirective<F>);\n\n  readonly presetSelected = output<ClickableFilterPresetOrPartialPreset<F>>();\n  readonly presets = input<ClickableFilterPresetOrPartialPreset<F>[]>([]);\n\n  readonly presets$ = toObservable(this.presets);\n\n  readonly selected$: Observable<Maybe<F>> = this.filterSourceDirective.filter$.pipe(startWith(undefined), distinctUntilChanged(), shareReplay(1));\n  readonly presetsWithPresetStringOnly$: Observable<ClickableFilterPreset<F>[]> = this.presets$.pipe(map((x) => x.filter((y) => Boolean((y as ClickableFilterPreset<F>).preset)) as ClickableFilterPreset<F>[]));\n\n  readonly selectedPresetString$: Observable<Maybe<string>> = this.selected$.pipe(\n    map((selectedFilter) => (selectedFilter ? selectedFilter.preset : undefined)),\n    distinctUntilChanged()\n  );\n\n  readonly presetAnchorsPairs$: Observable<['preset' | 'partialPreset', ClickableFilterPresetOrPartialPreset<F>, ClickableAnchorLink][]> = combineLatest([this.presets$, this.selected$, this.selectedPresetString$]).pipe(\n    map(([presets, currentFilterValue, selectedPresetString]) => {\n      return presets.map((x) => {\n        let selected: boolean;\n        let type: 'preset' | 'partialPreset';\n\n        if (isClickableFilterPreset(x)) {\n          selected = x.preset === selectedPresetString;\n          type = 'preset';\n        } else {\n          selected = x.isActive(currentFilterValue);\n          type = 'partialPreset';\n        }\n\n        return [\n          type,\n          x,\n          {\n            ...x,\n            selected,\n            onClick: () => {\n              this.selectPreset(x);\n            }\n          }\n        ] as [typeof type, ClickableFilterPresetOrPartialPreset<F>, ClickableAnchorLink];\n      });\n    }),\n    shareReplay(1)\n  );\n\n  readonly presetAnchors$: Observable<ClickableAnchorLink[]> = this.presetAnchorsPairs$.pipe(\n    map((x) => x.map((x) => x[2])),\n    shareReplay(1)\n  );\n\n  readonly firstSelectedAnchorPair$ = this.presetAnchorsPairs$.pipe(\n    map((presets) => {\n      const firstSelected = presets.find((x) => x[2].selected);\n      return firstSelected || undefined;\n    }),\n    shareReplay(1)\n  );\n\n  readonly selectedPreset$: Observable<Maybe<ClickableFilterPreset<F>>> = this.presetAnchorsPairs$.pipe(\n    map((presets) => {\n      const firstSelected = presets.filter((x) => x[0] === 'preset').find((x) => x[2].selected);\n      return firstSelected ? (firstSelected[1] as ClickableFilterPreset<F>) : undefined;\n    }),\n    shareReplay(1)\n  );\n\n  readonly presetAnchorsSignal = toSignal(this.presetAnchors$, { initialValue: [] });\n  readonly selectedPresetSignal = toSignal(this.selectedPreset$);\n\n  selectPreset(preset: ClickableFilterPresetOrPartialPreset<F>) {\n    const presetString = (preset as ClickableFilterPreset<F>).preset;\n    const presetValue = (preset as ClickableFilterPreset<F>).presetValue || (preset as ClickablePartialFilterPreset<F>).partialPresetValue;\n\n    // emit before setting filter, as the view might be destroyed as a result of the filter being set\n    this.presetSelected.emit(preset);\n\n    if (presetValue == null || (typeof presetValue !== 'function' && objectHasNoKeys(presetValue))) {\n      // set and then reset if the value is null or empty\n      this.filterSourceDirective.setFilter(presetValue ?? {});\n      this.filterSourceDirective.resetFilter();\n    } else {\n      let filter = getValueFromGetter(presetValue) as F;\n\n      if (filter.preset !== presetString) {\n        filter = {\n          ...filter,\n          preset: presetString\n        };\n      }\n\n      this.filterSourceDirective.setFilter(filter);\n    }\n  }\n}\n","import { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\n\n/**\n * Abstract configuration that tells the application which component to use for rendering segue-ref anchor links.\n *\n * Use {@link provideDbxRouterWebAngularRouterProviderConfig} for Angular Router or\n * {@link provideDbxRouterWebUiRouterProviderConfig} for UIRouter.\n */\nexport abstract class DbxRouterWebProviderConfig {\n  /**\n   * Component used by the Anchor component to render a SegueRef link.\n   */\n  abstract anchorSegueRefComponent: DbxInjectionComponentConfig;\n}\n","import { DestroyRef, effect, type ElementRef, inject, type Signal } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Configuration for {@link overrideClickElementEffect} specifying the click target\n * and the child element whose clicks should be intercepted.\n */\nexport interface OverrideClickElementEffectConfig {\n  /**\n   * Target to transfer \"click\" events to.\n   */\n  readonly clickTarget?: Maybe<Signal<Maybe<ElementRef<HTMLElement>>>>;\n  /**\n   * The child target to watch and override clicks for.\n   */\n  readonly childClickTarget: Signal<Maybe<ElementRef<HTMLElement>>>;\n  /**\n   * Optional signal to disable the clicking override.\n   */\n  readonly disabledSignal?: Maybe<Signal<boolean>>;\n}\n\n/**\n * Creates an Angular effect that intercepts clicks on a child element and redirects them\n * to a parent click target, while preventing the default browser navigation.\n *\n * Solves the problem where an injected element calls `event.stopPropagation()` without\n * `event.preventDefault()` — for example, a `dbx-button` inside a router anchor would\n * stop the router link from firing but still trigger the anchor's href navigation.\n *\n * Modifier clicks (ctrl, cmd, shift, middle-click) are allowed through for new tab/window behavior.\n *\n * Must be called in an Angular injection context.\n *\n * @param config - Configuration specifying the click target, child element to intercept, and optional disabled signal.\n * @returns The created Angular effect reference.\n *\n * @example\n * ```ts\n * overrideClickElementEffect({\n *   clickTarget: this.anchorElementRef,\n *   childClickTarget: this.buttonElementRef\n * });\n * ```\n */\nexport function overrideClickElementEffect(config: OverrideClickElementEffectConfig) {\n  const { clickTarget, childClickTarget, disabledSignal } = config;\n\n  const destroyRef = inject(DestroyRef);\n\n  let _cleanupClickOverride: Maybe<() => void>;\n\n  destroyRef.onDestroy(() => {\n    _cleanupClickOverride?.();\n  });\n\n  return effect(() => {\n    const clickTargetElement = clickTarget?.();\n    const childClickElement = childClickTarget();\n    const anchorDisabled = disabledSignal?.() ?? false;\n\n    // cleanup/remove the previous/existing click function\n    if (_cleanupClickOverride) {\n      _cleanupClickOverride();\n    }\n\n    if (childClickElement && !anchorDisabled) {\n      const clickOverride = (event: MouseEvent) => {\n        // Allow ctrl+click, cmd+click, shift+click, and middle-click for new tab/window\n        // Don't preventDefault or stopPropagation - let browser handle it naturally\n        if (event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1) {\n          return; // Browser will open in new tab/window\n        }\n\n        // otherwise, also trigger a click on the uiSref anchor element\n        clickTargetElement?.nativeElement.click();\n        // Prevents the default behavior of the anchor element's href from being triggered\n        event.preventDefault();\n        event.stopPropagation();\n      };\n\n      _cleanupClickOverride = () => {\n        childClickElement.nativeElement.removeEventListener('click', clickOverride);\n        _cleanupClickOverride = null;\n      };\n\n      childClickElement.nativeElement.addEventListener('click', clickOverride, {\n        capture: true // Use capture to ensure this event listener is called before any nested child's event listeners\n      });\n    }\n  });\n}\n","import { skipAllInitialMaybe } from '@dereekb/rxjs';\nimport { Component, TemplateRef, HostListener, inject, viewChild, input, computed, ElementRef } from '@angular/core';\nimport { AbstractDbxAnchorDirective, type DbxInjectionComponentConfig, DbxInjectionComponent } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { NgTemplateOutlet, NgClass } from '@angular/common';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { shareReplay } from 'rxjs';\nimport { DbxRouterWebProviderConfig } from '../../provider/router.provider.config';\nimport { overrideClickElementEffect } from '../../../util/click';\n\n/**\n * Renders an anchor element that adapts its presentation based on the type of navigation link provided.\n *\n * Supports plain content, clickable actions, router segue references, external hrefs, and disabled states.\n *\n * @dbxWebComponent\n * @dbxWebSlug anchor\n * @dbxWebCategory router\n * @dbxWebRelated anchor-list, navbar, sidenav\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-anchor [anchor]=\"{ url: '/' }\">Home</dbx-anchor>\n * ```\n *\n * @example\n * ```html\n * <dbx-anchor [anchor]=\"{ ref: 'app.home' }\">\n *   <button mat-button>Home</button>\n * </dbx-anchor>\n * ```\n */\n@Component({\n  selector: 'dbx-anchor, [dbx-anchor]',\n  template: `\n    @switch (typeSignal()) {\n      @case ('plain') {\n        <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n      }\n      @case ('clickable') {\n        <a #clickable class=\"dbx-anchor-a dbx-anchor-click\" [ngClass]=\"selectedClassSignal()\" tabindex=\"0\" (click)=\"clickAnchor()\" (keydown.enter)=\"clickAnchor()\">\n          <span #childClickTarget>\n            <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n          </span>\n        </a>\n      }\n      @case ('sref') {\n        <dbx-injection [config]=\"srefAnchorConfig\">\n          <!-- Injected in child. -->\n        </dbx-injection>\n      }\n      @case ('href') {\n        <a class=\"dbx-anchor-a dbx-anchor-href\" [href]=\"urlSignal()\" [attr.target]=\"targetSignal()\">\n          <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n        </a>\n      }\n      @case ('disabled') {\n        <a class=\"dbx-anchor-a dbx-anchor-disabled\">\n          <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n        </a>\n      }\n    }\n    <!-- Template content -->\n    <ng-template #content>\n      <ng-content></ng-content>\n    </ng-template>\n  `,\n  imports: [NgTemplateOutlet, NgClass, DbxInjectionComponent],\n  host: {\n    class: 'd-inline dbx-anchor',\n    'dbx-anchor-block': 'block()'\n  }\n})\nexport class DbxAnchorComponent extends AbstractDbxAnchorDirective {\n  private readonly _dbNgxRouterWebProviderConfig = inject(DbxRouterWebProviderConfig);\n\n  readonly block = input<Maybe<boolean>>();\n\n  readonly clickableElement = viewChild<string, Maybe<ElementRef<HTMLElement>>>('clickable', { read: ElementRef });\n  readonly childClickTarget = viewChild<string, Maybe<ElementRef<HTMLElement>>>('childClickTarget', { read: ElementRef });\n\n  readonly templateRef = viewChild<string, Maybe<TemplateRef<unknown>>>('content', { read: TemplateRef });\n  readonly templateRef$ = toObservable(this.templateRef).pipe(skipAllInitialMaybe(), shareReplay(1));\n\n  readonly selectedClassSignal = computed(() => (this.selectedSignal() ? 'dbx-anchor-selected' : ''));\n\n  readonly srefAnchorConfig: DbxInjectionComponentConfig = this._dbNgxRouterWebProviderConfig.anchorSegueRefComponent;\n\n  protected readonly _overrideClickElementEffect = overrideClickElementEffect({\n    clickTarget: this.clickableElement,\n    childClickTarget: this.childClickTarget,\n    disabledSignal: computed(() => this.typeSignal() !== 'clickable')\n  });\n\n  clickAnchor(event?: Maybe<MouseEvent>): void {\n    this.anchor()?.onClick?.(event);\n  }\n\n  @HostListener('mouseenter')\n  onMouseEnter(event?: Maybe<MouseEvent>) {\n    this.anchor()?.onMouse?.('enter', event);\n  }\n\n  @HostListener('mouseleave')\n  onMouseLeave(event?: Maybe<MouseEvent>) {\n    this.anchor()?.onMouse?.('leave', event);\n  }\n}\n","import { Component, computed, input, type Signal } from '@angular/core';\nimport { type ClickableAnchorLinkTree, DbxInjectionComponent, type ExpandedClickableAnchorLinkTree, expandClickableAnchorLinkTrees } from '@dereekb/dbx-core';\nimport { type Configurable, type Maybe } from '@dereekb/util';\nimport { DbxAnchorComponent } from '../anchor/anchor.component';\nimport { MatListItem, MatListItemIcon, MatListItemLine, MatListItemTitle, MatNavList } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatDivider } from '@angular/material/divider';\nimport { NgClass } from '@angular/common';\n\n/**\n * An expanded anchor link tree node with computed CSS classes for depth-based styling.\n */\nexport interface DbxAnchorListExpandedAnchor extends ExpandedClickableAnchorLinkTree {\n  readonly classes: string;\n}\n\n/**\n * Displays a hierarchical list of {@link ClickableAnchorLinkTree} items inside a Material navigation list.\n *\n * Each anchor is expanded and assigned depth-based CSS classes for nested styling.\n *\n * @dbxWebComponent\n * @dbxWebSlug anchor-list\n * @dbxWebCategory router\n * @dbxWebRelated anchor, sidenav\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-anchor-list [anchors]=\"anchors\"></dbx-anchor-list>\n * ```\n *\n * @example\n * ```html\n * <dbx-anchor-list [anchors]=\"navAnchors\"></dbx-anchor-list>\n * ```\n */\n@Component({\n  selector: 'dbx-anchor-list',\n  templateUrl: './anchorlist.component.html',\n  imports: [NgClass, MatNavList, MatListItem, MatListItemIcon, MatListItemLine, MatListItemTitle, MatIconModule, MatDivider, DbxAnchorComponent, DbxInjectionComponent]\n})\nexport class DbxAnchorListComponent {\n  readonly anchors = input.required<ClickableAnchorLinkTree[], Maybe<ClickableAnchorLinkTree[]>>({ transform: (x) => x ?? [] });\n\n  readonly expandedAnchorsSignal: Signal<DbxAnchorListExpandedAnchor[]> = computed(() => {\n    const anchors = this.anchors();\n    return expandClickableAnchorLinkTrees(anchors).map((y) => {\n      (y as Configurable<DbxAnchorListExpandedAnchor>).classes = `${y.depth > 0 ? 'dbx-anchor-list-child' : 'dbx-anchor-list-root'} dbx-anchor-list-depth-${y.depth}`;\n      return y as DbxAnchorListExpandedAnchor;\n    });\n  });\n}\n","<mat-nav-list class=\"dbx-anchor-list\">\n  @for (expanded of expandedAnchorsSignal(); track $index; let last = $last) {\n    <dbx-anchor [anchor]=\"expanded.value\" [ngClass]=\"expanded.classes\">\n      <a mat-list-item [disabled]=\"expanded.value.disabled\">\n        @if (expanded.value.icon) {\n          <mat-icon matListItemIcon>{{ expanded.value.icon }}</mat-icon>\n        }\n        <!-- TODO: Add an icon from a letter if anchor.icon is unavailable. -->\n        <div matListItemTitle>{{ expanded.value.title }}</div>\n        @if (expanded.value.hint) {\n          <div matListItemLine class=\"dbx-small\">{{ expanded.value.hint }}</div>\n        }\n        @if (expanded.value.content) {\n          <dbx-injection [config]=\"expanded.value.content\"></dbx-injection>\n        }\n      </a>\n      @if (!last) {\n        <mat-divider></mat-divider>\n      }\n    </dbx-anchor>\n  }\n</mat-nav-list>\n","import { Component } from '@angular/core';\nimport { type FilterWithPreset } from '@dereekb/rxjs';\nimport { AbstractDbxPresetFilterMenuDirective } from './filter.preset.directive';\nimport { DbxAnchorListComponent } from '../../router/layout/anchorlist/anchorlist.component';\n\n/**\n * Displays filter presets as a clickable anchor list.\n *\n * @example\n * ```html\n * <dbx-preset-filter-list [presets]=\"myPresets\" (presetSelected)=\"onPreset($event)\"></dbx-preset-filter-list>\n * ```\n */\n@Component({\n  selector: 'dbx-preset-filter-list',\n  template: `\n    <dbx-anchor-list [anchors]=\"presetAnchorsSignal()\"></dbx-anchor-list>\n  `,\n  imports: [DbxAnchorListComponent]\n})\nexport class DbxPresetFilterListComponent<F extends FilterWithPreset> extends AbstractDbxPresetFilterMenuDirective<F> {}\n","import { type ClickableAnchorLink } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { combineLatest, distinctUntilChanged, map, type Observable, shareReplay, switchMap } from 'rxjs';\n\n/**\n * Configuration for the preset filter menus\n */\nexport interface DbxPresetFilterMenuConfig {\n  /**\n   * The text to display for the unknown selection.\n   */\n  readonly unknownSelectionText?: string;\n  /**\n   * The icon to use for the filter, or false if no icon should be shown.\n   */\n  readonly filterIcon?: Maybe<string> | false;\n  /**\n   * Whether or not to use the preset's icon if one is defined. If filterIcon is false, the icon will only appear when an item is selected.\n   */\n  readonly usePresetIcon?: boolean;\n}\n\n/**\n * Creates an observable that emits the button text for a preset filter menu based on the current selection.\n *\n * @param config$ - Observable of the preset filter menu configuration.\n * @param selection$ - Observable of the currently selected preset, used to derive the display title.\n * @param defaultText - Fallback text when no selection or unknownSelectionText is configured. Defaults to 'Filter'.\n * @returns An observable emitting the resolved button text string.\n *\n * @example\n * ```ts\n * const text$ = dbxPresetFilterMenuButtonTextObservable(config$, selectedPreset$);\n * ```\n */\nexport function dbxPresetFilterMenuButtonTextObservable(config$: Observable<DbxPresetFilterMenuConfig>, selection$: Observable<Maybe<Partial<Pick<ClickableAnchorLink, 'title'>>>>, defaultText = 'Filter') {\n  return combineLatest([config$, selection$]).pipe(\n    map(([config, preset]) => preset?.title ?? config.unknownSelectionText ?? defaultText),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n}\n\n/**\n * Creates an observable that emits the button icon for a preset filter menu based on the current selection and config.\n *\n * @param config$ - Observable of the preset filter menu configuration controlling icon behavior.\n * @param selection$ - Observable of the currently selected preset, used to derive the display icon.\n * @param defaultIcon - Fallback icon when no filterIcon is configured. Defaults to 'arrow_drop_down'.\n * @returns An observable emitting the resolved icon string, or undefined when no icon should be shown.\n *\n * @example\n * ```ts\n * const icon$ = dbxPresetFilterMenuButtonIconObservable(config$, selectedPreset$);\n * ```\n */\nexport function dbxPresetFilterMenuButtonIconObservable(config$: Observable<DbxPresetFilterMenuConfig>, selection$: Observable<Maybe<Partial<Pick<ClickableAnchorLink, 'icon'>>>>, defaultIcon = 'arrow_drop_down') {\n  return config$.pipe(\n    switchMap((config) => {\n      const filterIcon = config.filterIcon === false ? '' : config.filterIcon || defaultIcon;\n\n      return selection$.pipe(\n        map((preset) => {\n          let icon: Maybe<string>;\n\n          if (config.filterIcon === false) {\n            if (config.usePresetIcon) {\n              icon = preset?.icon;\n            }\n          } else if (config.usePresetIcon) {\n            icon = preset?.icon ?? filterIcon;\n          } else {\n            icon = filterIcon;\n          }\n\n          return icon;\n        })\n      );\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n}\n","import { Component, input } from '@angular/core';\nimport { toSignal, toObservable } from '@angular/core/rxjs-interop';\nimport { type FilterWithPreset } from '@dereekb/rxjs';\nimport { AbstractDbxPresetFilterMenuDirective } from './filter.preset.directive';\nimport { dbxPresetFilterMenuButtonIconObservable, dbxPresetFilterMenuButtonTextObservable, type DbxPresetFilterMenuConfig } from './filter.menu';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxAnchorComponent } from '../../router/layout/anchor/anchor.component';\nimport { NgClass } from '@angular/common';\n\n/**\n * Displays a dropdown button menu for selecting filter presets with configurable icon and text.\n *\n * @example\n * ```html\n * <dbx-preset-filter-menu [presets]=\"myPresets\" [config]=\"{ unknownSelectionText: 'All' }\" (presetSelected)=\"onPreset($event)\"></dbx-preset-filter-menu>\n * ```\n */\n@Component({\n  selector: 'dbx-preset-filter-menu',\n  templateUrl: './filter.preset.menu.component.html',\n  imports: [NgClass, MatButtonModule, MatMenuModule, MatIconModule, DbxAnchorComponent]\n})\nexport class DbxPresetFilterMenuComponent<F extends FilterWithPreset> extends AbstractDbxPresetFilterMenuDirective<F> {\n  readonly config = input<DbxPresetFilterMenuConfig>({});\n  readonly config$ = toObservable(this.config);\n\n  readonly buttonText$ = dbxPresetFilterMenuButtonTextObservable(this.config$, this.selectedPreset$);\n  readonly buttonIcon$ = dbxPresetFilterMenuButtonIconObservable(this.config$, this.selectedPreset$);\n\n  readonly buttonTextSignal = toSignal(this.buttonText$);\n  readonly buttonIconSignal = toSignal(this.buttonIcon$);\n}\n","<button mat-button [matMenuTriggerFor]=\"menu\" class=\"dbx-preset-filter-menu-button\" aria-label=\"open filter\">\n  @if (buttonIconSignal()) {\n    <mat-icon class=\"dbx-icon-spacer\">{{ buttonIconSignal() }}</mat-icon>\n  }\n  <span>{{ buttonTextSignal() }}</span>\n</button>\n<mat-menu #menu class=\"dbx-preset-filter-menu\">\n  @for (anchor of presetAnchorsSignal(); track $index) {\n    <dbx-anchor [anchor]=\"anchor\">\n      <button mat-menu-item [ngClass]=\"anchor.selected ? 'active' : ''\">\n        @if (anchor.icon) {\n          <mat-icon>{{ anchor.icon }}</mat-icon>\n        }\n        {{ anchor.title }}\n      </button>\n    </dbx-anchor>\n  }\n</mat-menu>\n","import { shareReplay, map, type Observable, combineLatest, distinctUntilChanged, startWith, first } from 'rxjs';\nimport { Directive, inject, input } from '@angular/core';\nimport { type ClickableAnchorLink, FilterSourceDirective, type ClickablePartialFilterPreset } from '@dereekb/dbx-core';\nimport { filterUndefinedValues, firstValue, getValueFromGetter, type Maybe, objectHasNoKeys } from '@dereekb/util';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Abstract base directive for partial preset filter menus that manages selection state and anchor generation.\n *\n * Subclasses render the list of partial preset anchors as either a list or a dropdown menu.\n */\n@Directive()\nexport abstract class AbstractDbxPartialPresetFilterMenuDirective<F> {\n  readonly filterSourceDirective = inject(FilterSourceDirective<F>);\n\n  readonly partialPresets = input<ClickablePartialFilterPreset<F>[], Maybe<ClickablePartialFilterPreset<F>[]>>([], { transform: (x) => x ?? [] });\n  readonly partialPresets$ = toObservable(this.partialPresets);\n\n  readonly filter$: Observable<Maybe<F>> = this.filterSourceDirective.filter$.pipe(startWith(undefined), distinctUntilChanged(), shareReplay(1));\n\n  readonly selectedPartialPresets$: Observable<ClickablePartialFilterPreset<F>[]> = combineLatest([this.partialPresets$, this.filter$]).pipe(\n    map(([partialPresets, selectedFilter]) => partialPresets.filter((x) => x.isActive(selectedFilter))),\n    distinctUntilChanged()\n  );\n\n  readonly firstSelectedPartialPreset$: Observable<Maybe<ClickablePartialFilterPreset<F>>> = this.selectedPartialPresets$.pipe(\n    map((selectedPartialPresets) => firstValue(selectedPartialPresets)),\n    distinctUntilChanged()\n  );\n\n  readonly presetAnchors$: Observable<ClickableAnchorLink[]> = combineLatest([this.partialPresets$, this.firstSelectedPartialPreset$]).pipe(\n    map(([partialPresets, firstSelectedPartialPreset]) => {\n      return partialPresets.map((x) => {\n        return {\n          ...x,\n          selected: x === firstSelectedPartialPreset,\n          onClick: () => {\n            this.selectPartialPreset(x);\n          }\n        };\n      });\n    }),\n    shareReplay(1)\n  );\n\n  readonly presetAnchorsSignal = toSignal(this.presetAnchors$);\n\n  selectPartialPreset(preset: ClickablePartialFilterPreset<F>) {\n    const presetValue = preset.partialPresetValue;\n\n    if (presetValue == null || (typeof presetValue !== 'function' && objectHasNoKeys(presetValue))) {\n      // set and then reset if the value is null or empty\n      this.filterSourceDirective.setFilter(presetValue ?? {});\n      this.filterSourceDirective.resetFilter();\n    } else {\n      const filter = getValueFromGetter(preset.partialPresetValue) as Partial<F>;\n\n      this.filter$.pipe(first()).subscribe((currentFilter) => {\n        const nextFilter = { ...currentFilter, ...filterUndefinedValues({ ...currentFilter, ...filter }, true) } as F;\n        this.filterSourceDirective.setFilter(nextFilter);\n      });\n    }\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { AbstractDbxPartialPresetFilterMenuDirective } from './filter.partial';\nimport { dbxPresetFilterMenuButtonIconObservable, dbxPresetFilterMenuButtonTextObservable, type DbxPresetFilterMenuConfig } from './filter.menu';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxAnchorComponent } from '../../router/layout/anchor/anchor.component';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { NgClass } from '@angular/common';\n\n/**\n * Displays a dropdown button menu for selecting partial filter presets.\n *\n * @example\n * ```html\n * <dbx-partial-preset-filter-menu [partialPresets]=\"myPartialPresets\" [config]=\"{ filterIcon: 'tune' }\"></dbx-partial-preset-filter-menu>\n * ```\n */\n@Component({\n  selector: 'dbx-partial-preset-filter-menu',\n  templateUrl: './filter.partial.menu.component.html', // share the same template as the preset menu\n  imports: [NgClass, MatMenuModule, MatButtonModule, MatIconModule, DbxAnchorComponent]\n})\nexport class DbxPartialPresetFilterMenuComponent<F> extends AbstractDbxPartialPresetFilterMenuDirective<F> {\n  readonly config = input<DbxPresetFilterMenuConfig>({});\n  readonly config$ = toObservable(this.config);\n\n  readonly buttonText$ = dbxPresetFilterMenuButtonTextObservable(this.config$, this.firstSelectedPartialPreset$);\n  readonly buttonIcon$ = dbxPresetFilterMenuButtonIconObservable(this.config$, this.firstSelectedPartialPreset$);\n\n  readonly buttonTextSignal = toSignal(this.buttonText$);\n  readonly buttonIconSignal = toSignal(this.buttonIcon$);\n}\n","<button mat-button [matMenuTriggerFor]=\"menu\" class=\"dbx-preset-filter-menu-button\" aria-label=\"open filter\">\n  @if (buttonIconSignal()) {\n    <mat-icon class=\"dbx-icon-spacer\">{{ buttonIconSignal() }}</mat-icon>\n  }\n  <span>{{ buttonTextSignal() }}</span>\n</button>\n<mat-menu #menu class=\"dbx-preset-filter-menu\">\n  @for (anchor of presetAnchorsSignal(); track anchor.title) {\n    <dbx-anchor [anchor]=\"anchor\">\n      <button mat-menu-item [ngClass]=\"anchor.selected ? 'active' : ''\">{{ anchor.title }}</button>\n    </dbx-anchor>\n  }\n</mat-menu>\n","import { Component } from '@angular/core';\nimport { AbstractDbxPartialPresetFilterMenuDirective } from './filter.partial';\nimport { DbxAnchorListComponent } from '../../router/layout/anchorlist/anchorlist.component';\n\n/**\n * Displays partial filter presets as a clickable anchor list.\n *\n * @example\n * ```html\n * <dbx-preset-partial-filter-list [partialPresets]=\"myPartialPresets\"></dbx-preset-partial-filter-list>\n * ```\n */\n@Component({\n  selector: 'dbx-preset-partial-filter-list',\n  template: `\n    <dbx-anchor-list [anchors]=\"presetAnchorsSignal()\"></dbx-anchor-list>\n  `,\n  imports: [DbxAnchorListComponent]\n})\nexport class DbxPartialPresetFilterListComponent<F> extends AbstractDbxPartialPresetFilterMenuDirective<F> {}\n","import { NgModule } from '@angular/core';\nimport { DbxFilterPopoverButtonComponent } from './filter.popover.button.component';\nimport { DbxFilterPopoverComponent } from './filter.popover.component';\nimport { DbxFilterWrapperComponent } from './filter.wrapper.component';\nimport { DbxCoreFilterModule } from '@dereekb/dbx-core';\nimport { DbxPresetFilterListComponent } from './filter.preset.list.component';\nimport { DbxPresetFilterMenuComponent } from './filter.preset.menu.component';\nimport { DbxPartialPresetFilterMenuComponent } from './filter.partial.menu.component';\nimport { DbxPartialPresetFilterListComponent } from './filter.partial.list.component';\n\nconst importsAndExports = [DbxPartialPresetFilterListComponent, DbxPartialPresetFilterMenuComponent, DbxFilterPopoverComponent, DbxFilterPopoverButtonComponent, DbxFilterWrapperComponent, DbxPresetFilterListComponent, DbxPresetFilterMenuComponent, DbxCoreFilterModule];\n\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxFilterInteractionModule {}\n","import { Component, viewChild, ElementRef, computed, inject, SecurityContext, output, input, model } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { asyncScheduler, combineLatest, delayWhen, map, Subject, switchMap, timer, startWith } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { cleanSubscription, completeOnDestroy } from '@dereekb/dbx-core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\n\n/**\n * Renders an iframe element with a dynamically configurable content URL and optional URL sanitization.\n *\n * @example\n * ```html\n * <dbx-iframe [contentUrl]=\"'https://example.com'\" [scrolling]=\"'auto'\" [sanitizeUrl]=\"true\"></dbx-iframe>\n * ```\n */\n@Component({\n  selector: 'dbx-iframe',\n  template: `\n    <iframe #iframe src=\"about:blank\" frameborder=\"0\" [scrolling]=\"scrolling()\" allow=\"autoplay\"></iframe>\n  `\n})\nexport class DbxIframeComponent {\n  readonly sanitizer = inject(DomSanitizer);\n\n  readonly iframeLocationChanged = output<ElementRef<HTMLIFrameElement>>();\n  readonly iframe = viewChild<string, ElementRef<HTMLIFrameElement>>('iframe', { read: ElementRef });\n\n  readonly scrolling = input<'auto' | 'no' | 'yes', 'auto' | 'no' | 'yes' | boolean>('no', { transform: (x) => (x == null ? 'no' : typeof x === 'string' ? x : x === true ? 'auto' : 'no') });\n\n  readonly sanitizeUrl = input<boolean>(false);\n  readonly contentUrl = model<Maybe<string | SafeResourceUrl>>();\n\n  readonly contentUrlSignal = computed(() => {\n    let url: Maybe<string | SafeResourceUrl> = this.contentUrl();\n    const sanitizeUrl = this.sanitizeUrl();\n\n    if (url && typeof url === 'string' && sanitizeUrl) {\n      url = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n    }\n\n    return url;\n  });\n\n  readonly iframe$ = toObservable(this.iframe);\n  readonly contentUrl$ = toObservable(this.contentUrl);\n\n  readonly retry = completeOnDestroy(new Subject<void>());\n\n  constructor() {\n    cleanSubscription(() =>\n      combineLatest([this.contentUrl$, this.iframe$])\n        .pipe(\n          // delay retries by 50ms\n          switchMap((x) =>\n            this.retry.pipe(\n              startWith(undefined),\n              delayWhen((_, i) => timer(i ? 50 : 0, asyncScheduler)),\n              map(() => x)\n            )\n          )\n        )\n        .subscribe(([x, iframe]) => {\n          const contentWindow = iframe?.nativeElement.contentWindow;\n\n          if (contentWindow) {\n            let url: Maybe<string> = undefined;\n\n            if (x != null && typeof x !== 'string') {\n              url = this.sanitizer.sanitize(SecurityContext.URL, x);\n            } else {\n              url = x;\n            }\n\n            contentWindow.location.replace(url ?? '');\n          } else {\n            this.retry.next(); // queue up another retry for setting the iframe value\n          }\n        })\n    );\n  }\n}\n","import { type MatDialog, type MatDialogRef, type MatDialogConfig } from '@angular/material/dialog';\nimport { type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { DbxIframeComponent } from './iframe.component';\nimport { DbxInjectionDialogComponent } from '../dialog/dialog.injection.component';\n\n/**\n * Configuration for opening an iframe dialog.\n */\nexport interface DbxIframeDialogConfig extends Omit<MatDialogConfig, 'data'> {\n  readonly contentUrl: WebsiteUrlWithPrefix;\n}\n\n/**\n * Opens a dialog containing a {@link DbxIframeComponent} to display a URL in an iframe.\n *\n * @param matDialog - The Angular Material dialog service used to open the dialog.\n * @param config - Configuration specifying the content URL and dialog options.\n * @returns A reference to the opened dialog for controlling or subscribing to its lifecycle.\n *\n * @example\n * ```ts\n * const ref = openIframeDialog(matDialog, { contentUrl: 'https://example.com' });\n * ```\n */\nexport function openIframeDialog(matDialog: MatDialog, config: DbxIframeDialogConfig): MatDialogRef<DbxInjectionDialogComponent<DbxIframeComponent>, void> {\n  return DbxInjectionDialogComponent.openDialog(matDialog, {\n    ...config,\n    showCloseButton: true,\n    componentConfig: {\n      componentClass: DbxIframeComponent,\n      init: (x) => {\n        const { contentUrl } = config;\n        x.contentUrl.set(contentUrl);\n      }\n    }\n  });\n}\n","import { Component, viewChild, ElementRef, computed, inject, SecurityContext, effect, signal, model } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { combineLatest, throttleTime } from 'rxjs';\nimport { type ContentTypeMimeType, type Maybe } from '@dereekb/util';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { browserObjectUrlRef } from '@dereekb/browser';\nimport { clean, cleanSubscription } from '@dereekb/dbx-core';\n\n/**\n * The HTML element type used by {@link DbxEmbedComponent} to render content.\n */\nexport type DbxEmbedComponentElement = 'embed' | 'img';\n\n/**\n * Embeds external content using an `<embed>` or `<img>` element, supporting both URL and Blob sources.\n *\n * Automatically determines the embed element based on the MIME type (images use `<img>`, others use `<embed>`).\n *\n * @example\n * ```html\n * <dbx-embed [srcUrl]=\"'https://example.com/doc.pdf'\" [type]=\"'application/pdf'\"></dbx-embed>\n * <dbx-embed [blob]=\"myImageBlob\"></dbx-embed>\n * ```\n */\n@Component({\n  selector: 'dbx-embed',\n  template: `\n    <span #root></span>\n  `\n})\nexport class DbxEmbedComponent {\n  private readonly _browserObjectUrlRef = clean(browserObjectUrlRef());\n\n  readonly sanitizer = inject(DomSanitizer);\n\n  readonly root = viewChild<string, ElementRef<HTMLSpanElement>>('root', { read: ElementRef });\n\n  /**\n   * The element to embed. Can be either embed or img. If not provided, will be determined by the input mimetype.\n   *\n   * If set to 'embed', the embed element will be used.\n   * If set to 'img', the img element will be used.\n   */\n  readonly embedElement = model<Maybe<DbxEmbedComponentElement>>();\n\n  readonly sanitizeUrl = model<Maybe<boolean>>();\n\n  readonly srcUrl = model<Maybe<string | SafeResourceUrl>>();\n  readonly type = model<Maybe<ContentTypeMimeType | string>>();\n\n  /**\n   * The input blob or media source to use.\n   *\n   * If set, the srcUrl will be updated with the browser object URL.\n   */\n  readonly blob = model<Maybe<Blob>>();\n\n  readonly srcUrlFromBlob = signal<Maybe<string>>(undefined);\n  readonly typeFromBlob = signal<Maybe<string>>(undefined);\n\n  readonly blobEffect = effect(() => {\n    const blob = this.blob();\n    this.srcUrlFromBlob.set(this._browserObjectUrlRef.createBrowserUrl(blob));\n    this.typeFromBlob.set(blob?.type);\n  });\n\n  readonly srcUrlSignal = computed(() => {\n    const srcUrl = this.srcUrl();\n    const srcUrlFromBlob = this.srcUrlFromBlob();\n\n    const baseUrl = srcUrl ?? srcUrlFromBlob;\n\n    let url: Maybe<string | SafeResourceUrl> = baseUrl;\n    const sanitizeUrl = this.sanitizeUrl();\n\n    if (url && typeof url === 'string' && sanitizeUrl) {\n      url = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n    }\n\n    return url;\n  });\n\n  readonly typeSignal = computed(() => {\n    const type = this.type();\n    const typeFromBlob = this.typeFromBlob();\n    return type ?? typeFromBlob;\n  });\n\n  readonly root$ = toObservable(this.root);\n  readonly srcUrl$ = toObservable(this.srcUrlSignal);\n  readonly type$ = toObservable(this.typeSignal);\n  readonly embedElementName$ = toObservable(this.embedElement);\n\n  constructor() {\n    cleanSubscription(\n      combineLatest([this.srcUrl$, this.root$, this.type$, this.embedElementName$])\n        .pipe(throttleTime(100, undefined, { leading: true, trailing: true }))\n        .subscribe(([srcUrl, root, type, forceEmbedElementName]) => {\n          const element = root?.nativeElement;\n\n          if (element) {\n            // remove all embeds from the element\n            element?.childNodes.forEach((x) => x.remove());\n\n            if (srcUrl) {\n              const isImageType = type?.startsWith('image/');\n              const embedElementName = forceEmbedElementName ?? (isImageType ? 'img' : 'embed');\n\n              // NOTE: We do this because of the following chromium behavior:\n              // https://issues.chromium.org/issues/40508296\n              //\n              // Embed cannot have src change dynamically, so we create a new embed element each time the src changes.\n              //\n              const embed = document.createElement(embedElementName);\n\n              let url: Maybe<string> = undefined;\n\n              if (srcUrl != null && typeof srcUrl !== 'string') {\n                url = this.sanitizer.sanitize(SecurityContext.URL, srcUrl);\n              } else {\n                url = srcUrl;\n              }\n\n              // both embed and img use src\n              embed.setAttribute('src', url ?? '');\n\n              // if the type is an image, add the embed class\n              if (isImageType) {\n                embed.setAttribute('class', 'embed embed-img');\n              } else {\n                embed.setAttribute('class', 'embed');\n              }\n\n              switch (embedElementName) {\n                case 'embed':\n                  // only set the type if it is presented\n                  if (type) {\n                    embed.setAttribute('type', type);\n                  }\n                  break;\n                default:\n                  break;\n              }\n\n              element.appendChild(embed);\n            }\n          }\n        })\n    );\n  }\n}\n","import { type MatDialog, type MatDialogRef, type MatDialogConfig } from '@angular/material/dialog';\nimport { type ContentTypeMimeType, type Maybe, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { DbxEmbedComponent } from './embed.component';\nimport { DbxInjectionDialogComponent } from '../dialog/dialog.injection.component';\n\n/**\n * Configuration for opening an embed dialog, supporting both URL and Blob content sources.\n */\nexport interface DbxEmbedDialogConfig extends Omit<MatDialogConfig, 'data'> {\n  readonly srcUrl?: Maybe<WebsiteUrlWithPrefix>;\n  readonly blob?: Maybe<Blob>;\n  readonly embedMimeType?: Maybe<ContentTypeMimeType | string>;\n  readonly sanitizeUrl?: boolean;\n}\n\n/**\n * Opens a dialog containing a {@link DbxEmbedComponent} to display embedded content from a URL or Blob.\n *\n * @param matDialog - The Angular Material dialog service used to open the dialog.\n * @param config - Configuration specifying the content source (URL or Blob), MIME type, and dialog options.\n * @returns A reference to the opened dialog for controlling or subscribing to its lifecycle.\n *\n * @example\n * ```ts\n * const ref = openEmbedDialog(matDialog, { srcUrl: 'https://example.com/doc.pdf', embedMimeType: 'application/pdf' });\n * ```\n */\nexport function openEmbedDialog(matDialog: MatDialog, config: DbxEmbedDialogConfig): MatDialogRef<DbxInjectionDialogComponent<DbxEmbedComponent>, void> {\n  return DbxInjectionDialogComponent.openDialog(matDialog, {\n    ...config,\n    showCloseButton: false,\n    componentConfig: {\n      componentClass: DbxEmbedComponent,\n      init: (x) => {\n        const { blob, srcUrl, embedMimeType, sanitizeUrl } = config;\n\n        if (blob != null) {\n          x.blob.set(blob);\n        }\n\n        if (srcUrl != null) {\n          x.srcUrl.set(srcUrl);\n        }\n\n        if (embedMimeType != null) {\n          x.type.set(embedMimeType);\n        }\n\n        if (sanitizeUrl != null) {\n          x.sanitizeUrl.set(sanitizeUrl);\n        }\n      }\n    }\n  });\n}\n","import { type Maybe } from '@dereekb/util';\nimport { type Observable } from 'rxjs';\n\n/**\n * Unique key used to identify and coordinate popup instances.\n */\nexport type DbxPopupKey = string;\n\n/**\n * Possible window states for a popup: normal, minimized, or fullscreen.\n */\nexport const DbxPopupWindowState = {\n  NORMAL: 'normal' as const,\n  MINIMIZED: 'minimized' as const,\n  FULLSCREEN: 'fullscreen' as const\n} as const;\n\n/**\n * Union type of all possible popup window state values.\n */\nexport type DbxPopupWindowStateType = (typeof DbxPopupWindowState)[keyof typeof DbxPopupWindowState];\n\n/**\n * Abstract controller for managing a popup's lifecycle, providing close, return, minimize, fullscreen, and normalscreen operations.\n */\nexport abstract class DbxPopupController<O = unknown, I = unknown> {\n  abstract readonly key: DbxPopupKey;\n  abstract readonly data?: Maybe<I>;\n  abstract readonly windowState$: Observable<DbxPopupWindowStateType>;\n  abstract readonly closing$: Observable<boolean>;\n  /**\n   * Signals for the popup to close.\n   */\n  abstract close(): void;\n  /**\n   * Closes the popup and returns the input value.\n   */\n  abstract return(value?: O): void;\n  abstract minimize(): void;\n  abstract normalscreen(): void;\n  abstract fullscreen(): void;\n}\n","import { type DbxPopupKey, type DbxPopupController } from './popup';\nimport { Service } from '@angular/core';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Root-level service that tracks active popups by key, ensuring only one popup per key exists at a time.\n *\n * When a new popup is added with a key that already exists, the previous popup is closed automatically.\n */\n@Service()\nexport class DbxPopupCoordinatorService {\n  private readonly _popups = completeOnDestroy(new BehaviorSubject<Map<DbxPopupKey, DbxPopupController>>(new Map()));\n\n  readonly popups$ = this._popups.asObservable();\n\n  get popups(): Map<DbxPopupKey, DbxPopupController> {\n    return this._popups.value;\n  }\n\n  public addPopup(popup: DbxPopupController): void {\n    const key = popup.key;\n\n    if (key) {\n      this.removePopup(key);\n      this._popups.value.set(key, popup);\n      this._popups.next(this.popups);\n    }\n  }\n\n  public removePopup(key: DbxPopupKey, popup?: DbxPopupController): void {\n    if (key) {\n      const existing = this.popups.get(key);\n\n      // Remove if there is one existing, and if popup is provided it is the same popup.\n      if (existing && (!popup || popup === existing)) {\n        existing.close();\n        this._popups.value.delete(key);\n        this._popups.next(this.popups);\n      }\n    }\n  }\n}\n","import { DbxPopupController } from './popup';\nimport { Component, inject } from '@angular/core';\nimport { DbxPopupCoordinatorService } from './popup.coordinator.service';\nimport { delay, map, shareReplay } from 'rxjs';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { clean } from '@dereekb/dbx-core';\n\n/**\n * Coordinates popup display by registering with {@link DbxPopupCoordinatorService} and only rendering content when this popup is the active one for its key.\n *\n * @example\n * ```html\n * <dbx-popup-coordinator>\n *   <div>Popup content rendered only when active.</div>\n * </dbx-popup-coordinator>\n * ```\n */\n@Component({\n  selector: 'dbx-popup-coordinator',\n  template: `\n    @if (showSignal()) {\n      <ng-content></ng-content>\n    }\n  `\n})\nexport class DbxPopupCoordinatorComponent {\n  private readonly _service = inject(DbxPopupCoordinatorService);\n  private readonly _popup = inject(DbxPopupController);\n\n  readonly isPopupForKey$ = this._service.popups$.pipe(\n    map((x) => x.get(this._popup.key) === this._popup),\n    shareReplay(1)\n  );\n\n  readonly show$ = this.isPopupForKey$.pipe(delay(0));\n  readonly showSignal = toSignal(this.show$);\n\n  constructor() {\n    this._service.addPopup(this._popup);\n    clean(() => this._service.removePopup(this._popup.key, this._popup));\n  }\n}\n","import { Component, type Type, inject } from '@angular/core';\nimport { NgPopoverRef } from 'ng-overlay-container';\nimport { type Maybe, type PixelsString } from '@dereekb/util';\nimport { CompactContextStore } from '../../layout/compact/compact.store';\nimport { CompactMode } from '../../layout/compact/compact';\nimport { BehaviorSubject, Subject, filter, first, map, shareReplay, startWith } from 'rxjs';\nimport { PopupGlobalPositionStrategy, type PopupPosition, type PopupPositionOffset } from './popup.position.strategy';\nimport { AbstractTransitionWatcherDirective, completeOnDestroy, DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DbxPopupController, type DbxPopupKey, DbxPopupWindowState, type DbxPopupWindowStateType } from './popup';\nimport { DbxPopupCoordinatorComponent } from './popup.coordinator.component';\n\nexport const APP_POPUP_NORMAL_WIDTH = '700px';\nexport const APP_POPUP_MINIMIZED_WIDTH = '300px';\nexport const APP_POPUP_NORMAL_HEIGHT = 'auto';\n\n/**\n * Extended popup controller that supports an optional async closing value function.\n */\nexport abstract class DbxPopupComponentController<O, I> extends DbxPopupController<O, I> {\n  readonly getClosingValueFn?: (value?: I) => Promise<O>;\n}\n\n/**\n * Configuration for opening a popup with dynamically injected content.\n */\nexport interface DbxPopupComponentConfig<O, I, T> {\n  /**\n   * Key used for uniquely identifying a limited instance.\n   *\n   * Only one popup should exist at a time given a certain key.\n   */\n  readonly key: DbxPopupKey;\n  readonly position?: Maybe<PopupPosition>;\n  readonly offset?: Maybe<PopupPositionOffset>;\n  readonly closeOnTransition?: Maybe<boolean>;\n  readonly componentClass: Type<T>;\n  readonly data?: Maybe<I>;\n  readonly isDraggable?: Maybe<boolean>;\n  readonly init?: (component: T, controller: DbxPopupController<O, I>) => void;\n  readonly width?: Maybe<PixelsString>;\n  readonly height?: Maybe<PixelsString>;\n}\n\n/**\n * Core popup component that renders injected content with support for minimize, fullscreen, and normal window states.\n *\n * Coordinates with {@link DbxPopupCoordinatorService} to ensure only one popup per key is active at a time.\n *\n * @dbxWebComponent\n * @dbxWebSlug popup\n * @dbxWebCategory overlay\n * @dbxWebRelated popover\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-popup></dbx-popup>\n * ```\n *\n * @example\n * ```html\n * // In a service: this.popupService.open({ content: MyContentComponent })\n * ```\n */\n@Component({\n  template: `\n    <dbx-popup-coordinator>\n      <div class=\"dbx-popup-component\" dbx-injection [config]=\"contentConfig\"></div>\n    </dbx-popup-coordinator>\n  `,\n  providers: [\n    {\n      provide: DbxPopupController,\n      useExisting: DbxPopupComponent\n    },\n    {\n      provide: CompactContextStore\n    }\n  ],\n  imports: [DbxPopupCoordinatorComponent, DbxInjectionComponent]\n})\nexport class DbxPopupComponent<O = unknown, I = unknown, T = unknown> extends AbstractTransitionWatcherDirective implements DbxPopupController<O, I> {\n  private readonly popoverRef = inject(NgPopoverRef<DbxPopupComponentConfig<O, I, T>, O>);\n  private readonly compactContextState = inject(CompactContextStore);\n\n  private _position: PopupGlobalPositionStrategy;\n\n  readonly config: DbxPopupComponentConfig<O, I, T> = this.popoverRef.data;\n  readonly key: DbxPopupKey = this.config.key;\n  readonly data: Maybe<I> = this.config.data;\n\n  readonly contentConfig: DbxInjectionComponentConfig = {\n    componentClass: this.config.componentClass,\n    init: this.config.init ? (instance) => (this.config as Required<DbxPopupComponentConfig<O, I, T>>).init(instance as T, this) : undefined\n  };\n\n  private readonly closing = completeOnDestroy(new Subject<void>());\n  readonly isClosing$ = this.closing.pipe(\n    first(),\n    map(() => true),\n    startWith(false),\n    shareReplay(1)\n  );\n  readonly closing$ = this.isClosing$.pipe(filter((x) => x));\n\n  private readonly _windowState = completeOnDestroy(new BehaviorSubject<DbxPopupWindowStateType>(DbxPopupWindowState.NORMAL));\n  readonly windowState$ = this._windowState.asObservable();\n\n  getClosingValueFn?: (value?: I) => Promise<O>;\n\n  constructor() {\n    super();\n    this.compactContextState.setMode(CompactMode.COMPACT);\n    this._position = new PopupGlobalPositionStrategy(this.config.position ?? undefined, this.config.offset ?? undefined);\n    this.popoverRef.overlay.updatePositionStrategy(this._position);\n  }\n\n  protected updateForSuccessfulTransition(): void {\n    if (this.config.closeOnTransition !== false) {\n      this.close();\n    }\n  }\n\n  // Popup Controls\n  public close(): void {\n    this.closing.next();\n\n    if (this.getClosingValueFn) {\n      this.getClosingValueFn().then(\n        (x) => {\n          this.return(x);\n        },\n        () => {\n          this.return();\n        }\n      );\n    } else {\n      this.return();\n    }\n  }\n\n  return(value?: O): void {\n    this.closing.next();\n    this.popoverRef.close(value);\n  }\n\n  minimize(): void {\n    this.popoverRef.isDraggable = false;\n    this.popoverRef.resize(APP_POPUP_MINIMIZED_WIDTH, APP_POPUP_NORMAL_HEIGHT);\n    this.popoverRef.overlay.updatePosition();\n    this._windowState.next(DbxPopupWindowState.MINIMIZED);\n  }\n\n  normalscreen(): void {\n    this.popoverRef.isDraggable = this.config.isDraggable ?? undefined;\n    this.popoverRef.resize(APP_POPUP_NORMAL_WIDTH, APP_POPUP_NORMAL_HEIGHT);\n    this.popoverRef.overlay.updatePosition();\n    this._windowState.next(DbxPopupWindowState.NORMAL);\n  }\n\n  fullscreen(): void {\n    this.popoverRef.isDraggable = false;\n    this.popoverRef.resize('100%', '100%');\n    this.popoverRef.overlay.updatePosition();\n    this._windowState.next(DbxPopupWindowState.FULLSCREEN);\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { DbxPopupComponent } from './popup.component';\n\n/**\n * Abstract base directive for components rendered inside a popup, providing access to the popup's close operation.\n */\n@Directive()\nexport abstract class AbstractPopupDirective<O = unknown, I = unknown, T = unknown> {\n  readonly popup = inject(DbxPopupComponent<O, I, T>);\n\n  closePopup(): void {\n    this.popup.close();\n  }\n}\n","import { Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { map } from 'rxjs';\nimport { DbxPopupController, DbxPopupWindowState } from './popup';\n\n/**\n * Wraps popup body content, hiding the body when the popup is minimized while keeping the controls visible.\n *\n * @example\n * ```html\n * <dbx-popup-content>\n *   <dbx-popup-controls controls [header]=\"'My Popup'\"></dbx-popup-controls>\n *   <p>Body content here.</p>\n * </dbx-popup-content>\n * ```\n */\n@Component({\n  selector: 'dbx-popup-content',\n  template: `\n    <ng-content select=\"[controls]\"></ng-content>\n    @if (showContentSignal()) {\n      <div class=\"dbx-popup-content-container\">\n        <ng-content></ng-content>\n      </div>\n    }\n  `,\n  host: {\n    class: 'dbx-popup-content'\n  }\n})\nexport class DbxPopupContentComponent {\n  private readonly appPopupController = inject(DbxPopupController);\n\n  readonly showContent$ = this.appPopupController.windowState$.pipe(map((x) => x !== DbxPopupWindowState.MINIMIZED));\n  readonly showContentSignal = toSignal(this.showContent$, { initialValue: true });\n}\n","import { Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { map } from 'rxjs';\nimport { DbxPopupController, DbxPopupWindowState } from './popup';\nimport { DbxButtonModule } from '../../button/button.module';\nimport { DbxButtonSpacerDirective } from '../../button/button.spacer.directive';\n\n/**\n * Renders the minimize, fullscreen/restore, and close buttons for controlling a popup's window state.\n *\n * @example\n * ```html\n * <dbx-popup-control-buttons></dbx-popup-control-buttons>\n * ```\n */\n@Component({\n  selector: 'dbx-popup-control-buttons',\n  template: `\n    @switch (isMinimizedSignal()) {\n      @case (false) {\n        <dbx-button [flat]=\"true\" icon=\"minimize\" (buttonClick)=\"minimizeClicked()\"></dbx-button>\n      }\n      @case (true) {\n        <dbx-button [flat]=\"true\" icon=\"maximize\" (buttonClick)=\"maximizeClicked()\"></dbx-button>\n      }\n    }\n    <dbx-button-spacer></dbx-button-spacer>\n    @switch (isFullscreenSignal()) {\n      @case (false) {\n        <dbx-button [flat]=\"true\" icon=\"open_in_full\" (buttonClick)=\"fullscreenClicked()\"></dbx-button>\n      }\n      @case (true) {\n        <dbx-button [flat]=\"true\" icon=\"close_fullscreen\" (buttonClick)=\"normalscreenClicked()\"></dbx-button>\n      }\n    }\n    <dbx-button-spacer></dbx-button-spacer>\n    <dbx-button [flat]=\"true\" icon=\"close\" color=\"warn\" (buttonClick)=\"closeClicked()\"></dbx-button>\n  `,\n  host: {\n    class: 'dbx-popup-control-buttons'\n  },\n  imports: [DbxButtonModule, DbxButtonSpacerDirective]\n})\nexport class DbxPopupControlButtonsComponent {\n  private readonly _appPopupController = inject(DbxPopupController);\n\n  readonly isMinimized$ = this._appPopupController.windowState$.pipe(map((x) => x === DbxPopupWindowState.MINIMIZED));\n  readonly isFullscreen$ = this._appPopupController.windowState$.pipe(map((x) => x === DbxPopupWindowState.FULLSCREEN));\n\n  readonly isMinimizedSignal = toSignal(this.isMinimized$, { initialValue: false });\n  readonly isFullscreenSignal = toSignal(this.isFullscreen$, { initialValue: false });\n\n  minimizeClicked(): void {\n    this._appPopupController.minimize();\n  }\n\n  maximizeClicked(): void {\n    this._appPopupController.normalscreen();\n  }\n\n  fullscreenClicked(): void {\n    this._appPopupController.fullscreen();\n  }\n\n  normalscreenClicked(): void {\n    this._appPopupController.normalscreen();\n  }\n\n  closeClicked(): void {\n    this._appPopupController.close();\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { DbxPopupControlButtonsComponent } from './popup.controls.buttons.component';\n\n/**\n * Renders the popup control bar with a header title and window management buttons (minimize, fullscreen, close).\n *\n * @example\n * ```html\n * <dbx-popup-controls [header]=\"'My Popup'\"></dbx-popup-controls>\n * ```\n */\n@Component({\n  selector: 'dbx-popup-controls',\n  template: `\n    <span class=\"dbx-popup-controls-header\">{{ header() }}</span>\n    <div class=\"spacer\"></div>\n    <dbx-popup-control-buttons></dbx-popup-control-buttons>\n  `,\n  host: {\n    class: 'dbx-popup-controls'\n  },\n  imports: [DbxPopupControlButtonsComponent]\n})\nexport class DbxPopupControlsComponent {\n  readonly header = input<string>();\n}\n","import { DbxPopupCoordinatorComponent } from './popup.coordinator.component';\nimport { NgModule } from '@angular/core';\nimport { DbxPopupContentComponent } from './popup.content.component';\nimport { DbxPopupComponent } from './popup.component';\nimport { DbxPopupControlsComponent } from './popup.controls.component';\nimport { DbxPopupControlButtonsComponent } from './popup.controls.buttons.component';\n\nconst importsAndExports = [DbxPopupComponent, DbxPopupCoordinatorComponent, DbxPopupContentComponent, DbxPopupControlsComponent, DbxPopupControlButtonsComponent];\n\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxPopupInteractionModule {}\n","import { DbxPopupComponent, type DbxPopupComponentConfig, APP_POPUP_NORMAL_HEIGHT, APP_POPUP_NORMAL_WIDTH } from './popup.component';\nimport { Service, Injector, inject } from '@angular/core';\nimport { NgOverlayContainerService, type NgPopoverRef } from 'ng-overlay-container';\nimport { Overlay } from '@angular/cdk/overlay';\n\n/**\n * Full configuration for opening a popup via {@link DbxPopupService}, extending the component config with an optional injector.\n */\nexport interface DbxPopupConfig<O, I, T> extends DbxPopupComponentConfig<O, I, T> {\n  readonly injector?: Injector;\n}\n\n/**\n * Root-level service for programmatically opening popup overlays with dynamic component content.\n *\n * @example\n * ```ts\n * const ref = popupService.open({\n *   key: 'my-popup',\n *   componentClass: MyPopupContentComponent,\n *   position: 'bottom_right'\n * });\n * ```\n */\n@Service()\nexport class DbxPopupService {\n  private readonly _overlay = inject(Overlay);\n  private readonly _injector = inject(Injector);\n  private readonly _overlayContainerService = new NgOverlayContainerService(this._overlay, this._injector);\n\n  open<O, I, T>(config: DbxPopupConfig<O, I, T>): NgPopoverRef<DbxPopupComponentConfig<O, I, T>, O> {\n    const service = config.injector ? new NgOverlayContainerService(this._overlay, config.injector) : this._overlayContainerService;\n    const isDraggable = config.isDraggable ?? false;\n    const position = config.position ?? 'bottom_right';\n\n    return service.open<DbxPopupComponentConfig<O, I, T>, O>({\n      content: DbxPopupComponent,\n      data: {\n        ...config,\n        isDraggable,\n        position\n      },\n      configuration: {\n        width: config.width ?? APP_POPUP_NORMAL_WIDTH,\n        height: config.height ?? APP_POPUP_NORMAL_HEIGHT,\n        useGlobalPositionStrategy: true,\n        hasBackdrop: false,\n        isResizable: false,\n        isDraggable\n      }\n    });\n  }\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Applies prompt box styling with optional elevation to its host element.\n *\n * @example\n * ```html\n * <dbx-prompt-box [elevate]=\"true\">\n *   <dbx-prompt [header]=\"'Sign In'\"></dbx-prompt>\n * </dbx-prompt-box>\n * ```\n */\n@Directive({\n  selector: 'dbx-prompt-box, [dbxPromptBox]',\n  host: {\n    class: 'd-block dbx-prompt-box',\n    '[class.elevate]': 'elevate()'\n  }\n})\nexport class DbxPromptBoxDirective {\n  readonly elevate = input<boolean>(true);\n}\n","import { forwardRef, type Provider, type Type } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type Observable } from 'rxjs';\n\n/**\n * Abstract class representing a confirmation prompt that shows a dialog and returns the user's decision.\n */\nexport abstract class DbxPromptConfirm {\n  abstract showDialog(): Observable<Maybe<boolean>>;\n}\n\n/**\n * Provides a {@link DbxPromptConfirm} implementation for dependency injection.\n *\n * @param sourceType - The concrete class that implements {@link DbxPromptConfirm}\n * @returns The providers that register the given type as the {@link DbxPromptConfirm} implementation.\n *\n * @Directive ({ providers: provideDbxPromptConfirm(MyConfirmDirective) })\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxPromptConfirm<S extends DbxPromptConfirm>(sourceType: Type<S>): Provider[] {\n  return [\n    {\n      provide: DbxPromptConfirm,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n","import { DbxButton, type DbxButtonInterceptor } from '@dereekb/dbx-core';\nimport { Directive, type OnInit, inject } from '@angular/core';\nimport { type Observable, map } from 'rxjs';\nimport { DbxPromptConfirm } from './prompt.confirm';\n\n/**\n * Intercepts button clicks to show a confirmation dialog before proceeding.\n *\n * Requires both a {@link DbxButton} and a {@link DbxPromptConfirm} on the host element.\n *\n * @example\n * ```html\n * <dbx-button [dbxPromptConfirm]=\"{ title: 'Are you sure?' }\" dbxPromptConfirmButton text=\"Delete\"></dbx-button>\n * ```\n */\n@Directive({\n  selector: '[dbxPromptConfirmButton]'\n})\nexport class DbxPromptConfirmButtonDirective implements OnInit, DbxButtonInterceptor {\n  readonly button = inject(DbxButton, { host: true });\n  readonly prompt = inject(DbxPromptConfirm, { host: true });\n\n  readonly interceptButtonClick: () => Observable<boolean> = () => {\n    return this.prompt.showDialog().pipe(map(Boolean));\n  };\n\n  ngOnInit(): void {\n    this.button.setButtonInterceptor(this);\n  }\n}\n","import { Component, computed, input, signal } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxSectionHeaderConfig, type DbxSectionHeaderHType } from './section';\nimport { MatIconModule } from '@angular/material/icon';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * Renders a section header with a configurable heading level (h1-h5), optional icon, and hint text.\n * Can be used as a standalone element or as an attribute directive on elements with the `.dbx-section-header` class.\n * Serves as the base class for `DbxSectionComponent` and `DbxSectionPageComponent`.\n *\n * @dbxWebComponent\n * @dbxWebSlug section-header\n * @dbxWebCategory layout\n * @dbxWebRelated section, subsection\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-section-header header=\"My Header\"></dbx-section-header>\n * ```\n *\n * @example\n * ```html\n * <div class=\"dbx-section-header\" header=\"Custom Layout\" [h]=\"2\" icon=\"info\"></div>\n * ```\n */\n@Component({\n  selector: 'dbx-section-header,.dbx-section-header',\n  template: `\n    <div class=\"dbx-section-header-content dbx-flex-bar\">\n      @if (showTitleSignal()) {\n        @switch (headerConfigSignal().h ?? 1) {\n          @case (1) {\n            <h1 class=\"dbx-section-header-content-title\">\n              <ng-container *ngTemplateOutlet=\"headerContentTitleTemplate\"></ng-container>\n            </h1>\n          }\n          @case (2) {\n            <h2 class=\"dbx-section-header-content-title\">\n              <ng-container *ngTemplateOutlet=\"headerContentTitleTemplate\"></ng-container>\n            </h2>\n          }\n          @case (3) {\n            <h3 class=\"dbx-section-header-content-title\">\n              <ng-container *ngTemplateOutlet=\"headerContentTitleTemplate\"></ng-container>\n            </h3>\n          }\n          @case (4) {\n            <h4 class=\"dbx-section-header-content-title\">\n              <ng-container *ngTemplateOutlet=\"headerContentTitleTemplate\"></ng-container>\n            </h4>\n          }\n          @case (5) {\n            <h5 class=\"dbx-section-header-content-title\">\n              <ng-container *ngTemplateOutlet=\"headerContentTitleTemplate\"></ng-container>\n            </h5>\n          }\n        }\n        <span class=\"spacer\"></span>\n      }\n      <ng-content></ng-content>\n    </div>\n    <!-- Show Hint Not Inline -->\n    @if (headerConfigSignal().hint && !headerConfigSignal().hintInline) {\n      <p class=\"dbx-section-hint dbx-hint\">{{ headerConfigSignal().hint }}</p>\n    }\n    <ng-template #headerContentTitleTemplate>\n      @if (headerConfigSignal().icon) {\n        <mat-icon aria-hidden=\"true\">{{ headerConfigSignal().icon }}</mat-icon>\n      }\n      <span class=\"title-text\">\n        {{ headerConfigSignal().header }}\n        <!-- Show Hint Inline -->\n        @if (headerConfigSignal().hint && headerConfigSignal().hintInline) {\n          <span class=\"dbx-section-hint-inline dbx-hint\">{{ headerConfigSignal().hint }}</span>\n        }\n      </span>\n    </ng-template>\n  `,\n  imports: [MatIconModule, NgTemplateOutlet],\n  host: {\n    '[class.dbx-section-header-full-title]': 'headerConfigSignal().onlyHeader',\n    '[class.dbx-section-header-padded]': 'headerConfigSignal().paddedHeader'\n  }\n})\nexport class DbxSectionHeaderComponent {\n  readonly headerConfig = input<Maybe<DbxSectionHeaderConfig>>();\n\n  readonly h = input<Maybe<DbxSectionHeaderHType>>();\n  readonly paddedHeader = input<Maybe<boolean>>();\n  readonly header = input<Maybe<string>>();\n  readonly onlyHeader = input<Maybe<boolean>>();\n  readonly icon = input<Maybe<string>>();\n  readonly hint = input<Maybe<string>>();\n  readonly hintInline = input<Maybe<boolean>>();\n\n  readonly hintInlineDefault = signal<Maybe<boolean>>(undefined);\n\n  readonly headerConfigSignal = computed(() => {\n    const hintInlineDefault = this.hintInlineDefault();\n    const headerConfig = this.headerConfig();\n\n    const config: DbxSectionHeaderConfig = {\n      h: this.h() ?? headerConfig?.h,\n      paddedHeader: this.paddedHeader() ?? headerConfig?.paddedHeader,\n      header: this.header() ?? headerConfig?.header,\n      onlyHeader: this.onlyHeader() ?? headerConfig?.onlyHeader,\n      icon: this.icon() ?? headerConfig?.icon,\n      hint: this.hint() ?? headerConfig?.hint,\n      hintInline: this.hintInline() ?? headerConfig?.hintInline ?? hintInlineDefault\n    };\n\n    return config;\n  });\n\n  readonly showTitleSignal = computed(() => {\n    const headerConfig = this.headerConfigSignal();\n    return Boolean(headerConfig.header || headerConfig.icon);\n  });\n}\n","import { Component, computed, input } from '@angular/core';\nimport { DbxSectionHeaderComponent } from './section.header.component';\n\n/**\n * Displays a content section with a header and body area. The header defaults to an h3 heading\n * and supports optional elevation styling.\n *\n * @dbxWebComponent\n * @dbxWebSlug section\n * @dbxWebCategory layout\n * @dbxWebRelated subsection, section-page, section-header, intro-action-section\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks, dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-section header=\"My Section\"><p>Body</p></dbx-section>\n * ```\n *\n * @example\n * ```html\n * <dbx-section header=\"My Section\" icon=\"info\" hint=\"Additional context\">\n *   <p>Section body content here.</p>\n * </dbx-section>\n *\n * <dbx-section header=\"Elevated Section\" [elevate]=\"true\">\n *   <button sectionHeader>Custom Header Action</button>\n *   <p>Body content with elevated card styling.</p>\n * </dbx-section>\n * ```\n */\n@Component({\n  selector: 'dbx-section',\n  template: `\n    <div class=\"dbx-section-header\" [h]=\"headerConfigSignal().h ?? 3\" [header]=\"headerConfigSignal().header\" [onlyHeader]=\"headerConfigSignal().onlyHeader\" [icon]=\"headerConfigSignal().icon\" [hint]=\"headerConfigSignal().hint\" [hintInline]=\"headerConfigSignal().hintInline\">\n      <ng-content select=\"[sectionHeader]\"></ng-content>\n    </div>\n    <div class=\"dbx-section-content\">\n      <ng-content></ng-content>\n    </div>\n  `,\n  host: {\n    class: 'd-block dbx-section',\n    role: 'region',\n    '[class]': 'classConfigSignal()',\n    '[attr.aria-label]': 'headerConfigSignal().header'\n  },\n  imports: [DbxSectionHeaderComponent]\n})\nexport class DbxSectionComponent extends DbxSectionHeaderComponent {\n  /**\n   * Apply elevated card styling.\n   */\n  readonly elevate = input<boolean>(false);\n\n  readonly classConfigSignal = computed(() => {\n    return this.elevate() ? 'dbx-section-elevate dbx-content-elevate' : '';\n  });\n}\n","import { Component } from '@angular/core';\nimport { DbxSectionComponent } from './section.component';\nimport { DbxSectionHeaderComponent } from './section.header.component';\n\n/**\n * Renders a subsection within a parent section, using a smaller heading (defaults to h4).\n * Useful for grouping related content under a `dbx-section`.\n *\n * @dbxWebComponent\n * @dbxWebSlug subsection\n * @dbxWebCategory layout\n * @dbxWebRelated section, section-header\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-subsection header=\"Details\"><p>Body</p></dbx-subsection>\n * ```\n *\n * @example\n * ```html\n * <dbx-section header=\"Settings\">\n *   <dbx-subsection header=\"Notifications\" icon=\"notifications\">\n *     <p>Subsection body.</p>\n *   </dbx-subsection>\n * </dbx-section>\n * ```\n */\n@Component({\n  selector: 'dbx-subsection',\n  template: `\n    <div class=\"dbx-subsection\">\n      <div class=\"dbx-section-header\" [h]=\"headerConfigSignal().h ?? 4\" [header]=\"headerConfigSignal().header\" [onlyHeader]=\"headerConfigSignal().onlyHeader\" [icon]=\"headerConfigSignal().icon\" [hint]=\"headerConfigSignal().hint\" [hintInline]=\"headerConfigSignal().hintInline\">\n        <ng-content select=\"[sectionHeader]\"></ng-content>\n      </div>\n      <div class=\"dbx-section-content\">\n        <ng-content></ng-content>\n      </div>\n    </div>\n  `,\n  imports: [DbxSectionHeaderComponent]\n})\nexport class DbxSubSectionComponent extends DbxSectionComponent {}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxSubSectionComponent } from '../../layout/section/subsection.component';\n\n/**\n * Renders a styled prompt section with a header, descriptive text, and a hero content slot.\n *\n * @dbxWebComponent\n * @dbxWebSlug prompt\n * @dbxWebCategory overlay\n * @dbxWebRelated prompt-confirm, dialog-content\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-prompt header=\"Confirm\"></dbx-prompt>\n * ```\n *\n * @example\n * ```html\n * <dbx-prompt header=\"Delete account\" prompt=\"This cannot be undone.\">\n *   <button mat-button (click)=\"cancel()\">Cancel</button>\n *   <button mat-flat-button color=\"warn\" (click)=\"confirm()\">Delete</button>\n * </dbx-prompt>\n * ```\n */\n@Component({\n  selector: 'dbx-prompt',\n  template: `\n    <div class=\"dbx-prompt\">\n      <ng-content select=\"[hero]\"></ng-content>\n      <dbx-subsection [header]=\"header()\" [hint]=\"prompt()\">\n        <ng-content></ng-content>\n      </dbx-subsection>\n    </div>\n  `,\n  imports: [DbxSubSectionComponent]\n})\nexport class DbxPromptComponent {\n  readonly header = input<Maybe<string>>();\n  readonly prompt = input<Maybe<string>>();\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { DbxPromptComponent } from './prompt.component';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxButtonSpacerDirective } from '../../button/button.spacer.directive';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxButtonStyle } from '../../button/button';\n\n/**\n * Configuration for the confirmation prompt display.\n */\nexport interface DbxPromptConfirmConfig {\n  readonly title?: string;\n  readonly prompt?: string;\n  readonly confirmText?: string;\n  readonly cancelText?: string;\n  /**\n   * (Optional) Style for the confirm button.\n   *\n   * Defaults to {@link DEFAULT_PROMPT_CONFIRM_BUTTON_STYLE}. Set a `color` here to paint the button with an arbitrary\n   * {@link DbxColorInput} (including a registered color template) rather than the default palette.\n   */\n  readonly confirmButtonStyle?: Maybe<DbxButtonStyle>;\n  /**\n   * (Optional) Style for the cancel button.\n   *\n   * Defaults to {@link DEFAULT_PROMPT_CANCEL_BUTTON_STYLE}.\n   */\n  readonly cancelButtonStyle?: Maybe<DbxButtonStyle>;\n}\n\n/**\n * Default style for the confirm button.\n */\nexport const DEFAULT_PROMPT_CONFIRM_BUTTON_STYLE: DbxButtonStyle = { type: 'stroked' };\n\n/**\n * Default style for the cancel button.\n */\nexport const DEFAULT_PROMPT_CANCEL_BUTTON_STYLE: DbxButtonStyle = { type: 'stroked', color: 'warn' };\n\n/**\n * Renders a confirmation prompt with customizable title, message, confirm, and cancel buttons.\n *\n * Projected content shows above the buttons. Content marked with the `buttons` attribute shows in the same row, before the\n * confirm button.\n *\n * @dbxWebComponent\n * @dbxWebSlug prompt-confirm\n * @dbxWebCategory overlay\n * @dbxWebRelated prompt, action-confirm\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-prompt-confirm [config]=\"cfg\"></dbx-prompt-confirm>\n * ```\n *\n * @example\n * ```html\n * <dbx-prompt-confirm [config]=\"{ header: 'Delete?', confirmText: 'Delete', cancelText: 'Cancel' }\"></dbx-prompt-confirm>\n * ```\n */\n@Component({\n  selector: 'dbx-prompt-confirm',\n  template: `\n    <dbx-prompt [header]=\"config()?.title\" [prompt]=\"config()?.prompt\">\n      <ng-content></ng-content>\n      <div class=\"dbx-pt3\">\n        <ng-content select=\"[buttons]\"></ng-content>\n        <dbx-button [buttonStyle]=\"confirmButtonStyleSignal()\" [text]=\"confirmTextSignal()\" (buttonClick)=\"onConfirm()\"></dbx-button>\n        <dbx-button-spacer></dbx-button-spacer>\n        <dbx-button [buttonStyle]=\"cancelButtonStyleSignal()\" [text]=\"cancelTextSignal()\" (buttonClick)=\"onCancel()\"></dbx-button>\n      </div>\n    </dbx-prompt>\n  `,\n  imports: [DbxPromptComponent, DbxButtonComponent, DbxButtonSpacerDirective]\n})\nexport class DbxPromptConfirmComponent {\n  readonly config = input<Maybe<DbxPromptConfirmConfig>>({});\n\n  readonly confirmTextSignal = computed(() => this.config()?.confirmText || 'Confirm');\n  readonly cancelTextSignal = computed(() => this.config()?.cancelText || 'Cancel');\n\n  readonly confirmButtonStyleSignal = computed(() => this.config()?.confirmButtonStyle ?? DEFAULT_PROMPT_CONFIRM_BUTTON_STYLE);\n  readonly cancelButtonStyleSignal = computed(() => this.config()?.cancelButtonStyle ?? DEFAULT_PROMPT_CANCEL_BUTTON_STYLE);\n\n  readonly confirm = output<void>();\n  // eslint-disable-next-line @angular-eslint/no-output-native\n  readonly cancel = output<void>();\n\n  onConfirm(): void {\n    this.confirm.emit();\n  }\n\n  onCancel(): void {\n    this.cancel.emit();\n  }\n}\n","import { type MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { Component } from '@angular/core';\nimport { AbstractDialogDirective } from '../dialog/abstract.dialog.directive';\nimport { DbxPromptConfirmComponent, type DbxPromptConfirmConfig } from './prompt.confirm.component';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxDialogContentDirective } from '../dialog/dialog.content.directive';\n\n/**\n * Default configuration used when no custom config is provided to the confirm dialog.\n */\nexport const DEFAULT_DBX_PROMPT_CONFIRM_DIALOG_CONFIG = {\n  title: 'Confirm?'\n};\n\n/**\n * Configuration for the confirmation dialog, extending prompt config with an optional injected component.\n */\nexport interface DbxPromptConfirmDialogConfig extends DbxPromptConfirmConfig {\n  readonly component?: DbxInjectionComponentConfig;\n}\n\n/**\n * Dialog component that displays a confirmation prompt and returns a boolean result.\n *\n * Use the static `openDialog` method to programmatically open the dialog.\n *\n * @example\n * ```ts\n * const ref = DbxPromptConfirmDialogComponent.openDialog(matDialog, {\n *   title: 'Delete item?',\n *   prompt: 'This action cannot be undone.',\n *   confirmText: 'Delete'\n * });\n * ref.afterClosed().subscribe(confirmed => { ... });\n * ```\n */\n@Component({\n  template: `\n    <dbx-dialog-content>\n      <dbx-prompt-confirm [config]=\"config\" (confirm)=\"confirm()\" (cancel)=\"cancel()\">\n        <dbx-injection [config]=\"injectionConfig\"></dbx-injection>\n      </dbx-prompt-confirm>\n    </dbx-dialog-content>\n  `,\n  imports: [DbxDialogContentDirective, DbxPromptConfirmComponent, DbxInjectionComponent]\n})\nexport class DbxPromptConfirmDialogComponent extends AbstractDialogDirective<boolean, DbxPromptConfirmDialogConfig> {\n  get config(): DbxPromptConfirmDialogConfig {\n    return this.data;\n  }\n\n  get injectionConfig(): Maybe<DbxInjectionComponentConfig> {\n    return this.data.component;\n  }\n\n  static openDialog(matDialog: MatDialog, config?: Maybe<DbxPromptConfirmDialogConfig>): MatDialogRef<DbxPromptConfirmDialogComponent, boolean> {\n    return matDialog.open(DbxPromptConfirmDialogComponent, {\n      data: config ?? DEFAULT_DBX_PROMPT_CONFIRM_DIALOG_CONFIG\n    });\n  }\n\n  confirm(): void {\n    this.close(true);\n  }\n\n  cancel(): void {\n    this.close(false);\n  }\n}\n","import { Directive, inject, input } from '@angular/core';\nimport { MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { type Maybe } from '@dereekb/util';\nimport { type Observable, from } from 'rxjs';\nimport { type DbxPromptConfirm, provideDbxPromptConfirm } from './prompt.confirm';\nimport { type DbxPromptConfirmConfig } from './prompt.confirm.component';\nimport { DbxPromptConfirmDialogComponent } from './prompt.confirm.dialog.component';\n\n// MARK: Abstract\n/**\n * Abstract base directive that opens a confirmation dialog and resolves with the user's boolean decision.\n *\n * Subclasses provide the default dialog configuration.\n */\n@Directive()\nexport abstract class AbstractPromptConfirmDirective implements DbxPromptConfirm {\n  protected readonly matDialog = inject(MatDialog);\n\n  private _currentDialogRef?: MatDialogRef<DbxPromptConfirmDialogComponent, boolean>;\n  private _currentDialogPromise?: Promise<boolean>;\n\n  protected abstract getDefaultDialogConfig(): Maybe<DbxPromptConfirmConfig>;\n\n  showDialog(): Observable<boolean> {\n    return this.showDialogWithConfig(this.getDefaultDialogConfig());\n  }\n\n  protected showDialogWithConfig(config: Maybe<DbxPromptConfirmConfig>): Observable<boolean> {\n    this._currentDialogPromise ??= new Promise<boolean>((resolve) => {\n      this._currentDialogRef = DbxPromptConfirmDialogComponent.openDialog(this.matDialog, config);\n      this._currentDialogRef.afterClosed().subscribe((result: Maybe<boolean>) => {\n        this._currentDialogRef = undefined;\n        this._currentDialogPromise = undefined;\n        resolve(this._handleDialogResult(Boolean(result)));\n      });\n    });\n\n    return from(this._currentDialogPromise);\n  }\n\n  protected _handleDialogResult(result: boolean): boolean {\n    return result;\n  }\n}\n\n// MARK: Directive\n/**\n * Directive that provides a {@link DbxPromptConfirm} implementation, opening a confirmation dialog with the given config.\n *\n * @example\n * ```html\n * <button [dbxPromptConfirm]=\"{ title: 'Delete?', confirmText: 'Yes' }\" dbxPromptConfirmButton>Delete</button>\n * ```\n */\n@Directive({\n  selector: '[dbxPromptConfirm]',\n  providers: provideDbxPromptConfirm(DbxPromptConfirmDirective)\n})\nexport class DbxPromptConfirmDirective extends AbstractPromptConfirmDirective {\n  readonly dbxPromptConfirm = input<Maybe<DbxPromptConfirmConfig>>();\n\n  protected override getDefaultDialogConfig(): Maybe<DbxPromptConfirmConfig> {\n    return this.dbxPromptConfirm();\n  }\n}\n","import { Directive, input, computed } from '@angular/core';\n\n/**\n * Padding options for a content container. Controls the horizontal padding around the content.\n */\nexport type DbxContentContainerPadding = 'none' | 'min' | 'small' | 'normal';\n\n/**\n * Width constraint options for a content container. Controls the maximum width of the content area.\n */\nexport type DbxContentContainerWidth = 'small' | 'medium' | 'large' | 'wide' | 'full';\n\n/**\n * Constrains content to a maximum width with configurable padding. Useful for centering\n * page content and maintaining readable line lengths.\n *\n * @dbxWebComponent\n * @dbxWebSlug content-container\n * @dbxWebCategory layout\n * @dbxWebRelated content, content-page, content-box\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div dbxContentContainer>Body</div>\n * ```\n *\n * @example\n * ```html\n * <dbx-content-container grow=\"full\" padding=\"normal\">\n *   <p>Page body</p>\n * </dbx-content-container>\n * ```\n */\n@Directive({\n  selector: 'dbx-content-container,[dbxContentContainer],.dbx-content-container',\n  host: {\n    class: 'd-block dbx-content-container',\n    '[class]': `classConfigSignal()`\n  }\n})\nexport class DbxContentContainerDirective {\n  readonly grow = input<DbxContentContainerWidth>('wide');\n  readonly padding = input<DbxContentContainerPadding>('normal');\n  readonly topPadding = input<DbxContentContainerPadding>('none');\n\n  readonly classConfigSignal = computed(() => {\n    return 'container-' + this.grow() + ' container-padding-' + this.padding() + ' container-top-padding-' + this.topPadding();\n  });\n}\n","import { Component } from '@angular/core';\nimport { DbxContentContainerDirective } from '../../layout/content/content.container.directive';\n\n/**\n * Full-page prompt layout that centers content within a growing content container.\n *\n * @example\n * ```html\n * <dbx-prompt-page>\n *   <dbx-prompt [header]=\"'Welcome'\" [prompt]=\"'Please sign in.'\"></dbx-prompt>\n * </dbx-prompt-page>\n * ```\n */\n@Component({\n  selector: 'dbx-prompt-page',\n  template: `\n    <dbx-content-container grow=\"full\">\n      <div class=\"dbx-prompt-page-content-wrap\">\n        <ng-content></ng-content>\n      </div>\n    </dbx-content-container>\n  `,\n  host: {\n    class: 'd-block dbx-prompt-page'\n  },\n  imports: [DbxContentContainerDirective]\n})\nexport class DbxPromptPageComponent {}\n","import { DbxPromptComponent } from './prompt.component';\nimport { NgModule } from '@angular/core';\nimport { DbxPromptBoxDirective } from './prompt.box.directive';\nimport { DbxPromptPageComponent } from './prompt.page.component';\nimport { DbxPromptConfirmComponent } from './prompt.confirm.component';\nimport { DbxPromptConfirmDialogComponent } from './prompt.confirm.dialog.component';\nimport { DbxPromptConfirmDirective } from './prompt.confirm.directive';\nimport { DbxPromptConfirmButtonDirective } from './prompt.button.confirm.directive';\n\nconst importsAndExports = [DbxPromptComponent, DbxPromptBoxDirective, DbxPromptPageComponent, DbxPromptConfirmComponent, DbxPromptConfirmButtonDirective, DbxPromptConfirmDialogComponent, DbxPromptConfirmDirective];\n\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxPromptModule {}\n","import { computed, Directive, input, signal } from '@angular/core';\nimport { isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { type FileArrayAcceptMatchConfig, type FileArrayAcceptMatchResult } from './upload.accept';\nimport { type DbxFileUploadActionCompatable } from './upload.action';\nimport { type DbxButtonWorking } from '@dereekb/dbx-core';\n\n// MARK: Abstract\n/**\n * Event emitted when files are selected or dropped, containing both the raw file list and accept match results.\n */\nexport interface DbxFileUploadFilesChangedEvent {\n  readonly allFiles: File[];\n  readonly matchResult: FileArrayAcceptMatchResult;\n}\n\n/**\n * Abstract base component for file upload components, managing disabled, working, multiple, and accept states.\n *\n * Implements {@link DbxFileUploadActionCompatable} for integration with the action system.\n */\n@Directive({\n  standalone: true\n})\nexport abstract class AbstractDbxFileUploadComponent implements DbxFileUploadActionCompatable {\n  /**\n   * Whether or not multiple files can be uploaded.\n   */\n  readonly multiple = input<Maybe<boolean>, Maybe<boolean | ''>>(undefined, { transform: (x) => x === '' || x });\n\n  /**\n   * The most files that can be selected at once.\n   *\n   * Ignored while multiple is false, which is already a limit of one.\n   */\n  readonly maxFiles = input<Maybe<number>>();\n\n  /**\n   * Accepted file types filter.\n   */\n  readonly accept = input<FileArrayAcceptMatchConfig['accept']>([]);\n\n  /**\n   * This disabled is input-only\n   */\n  readonly disabled = input<Maybe<boolean>>();\n\n  /**\n   * This working is input-only\n   */\n  readonly working = input<Maybe<DbxButtonWorking>>();\n\n  /**\n   * This signal is set by setMultiple\n   */\n  private readonly _multipleSignal = signal<Maybe<boolean>>(undefined);\n\n  /**\n   * This signal is set by setMaxFiles\n   */\n  private readonly _maxFilesSignal = signal<Maybe<number>>(undefined);\n\n  /**\n   * This signal is set by setAccept\n   */\n  private readonly _acceptSignal = signal<Maybe<FileArrayAcceptMatchConfig['accept']>>(undefined);\n\n  /**\n   * This signal is set by setDisabled\n   */\n  private readonly _disabledSignal = signal<Maybe<boolean>>(undefined);\n\n  /**\n   * This signal is set by setWorking\n   */\n  private readonly _workingSignal = signal<Maybe<DbxButtonWorking>>(undefined);\n\n  readonly multipleSignal = computed(() => {\n    const multipleInput = this.multiple();\n    const multipleSignal = this._multipleSignal();\n    return multipleSignal ?? multipleInput;\n  });\n\n  readonly maxFilesSignal = computed(() => {\n    const maxFilesInput = this.maxFiles();\n    const maxFilesSignal = this._maxFilesSignal();\n    return maxFilesSignal ?? maxFilesInput;\n  });\n\n  readonly acceptSignal = computed(() => {\n    const acceptInput = this.accept();\n    const acceptSignal = this._acceptSignal();\n    return acceptSignal ?? acceptInput;\n  });\n\n  readonly disabledSignal = computed(() => {\n    const disabledInput = this.disabled();\n    const disabledSignal = this._disabledSignal();\n    const workingSignal = this.isWorkingSignal();\n\n    // disabled if any are true\n    return disabledInput || disabledSignal || workingSignal;\n  });\n\n  readonly workingSignal = computed(() => {\n    const workingInput = this.working();\n    const workingSignal = this._workingSignal();\n    return workingSignal ?? workingInput;\n  });\n\n  readonly isWorkingSignal = computed(() => {\n    const working = this.workingSignal();\n    return isDefinedAndNotFalse(working);\n  });\n\n  // MARK: DbxUploadActionCompatable\n  setDisabled(disabled?: Maybe<boolean>): void {\n    this._disabledSignal.set(disabled);\n  }\n\n  setWorking(working?: Maybe<DbxButtonWorking>): void {\n    this._workingSignal.set(working);\n  }\n\n  setMultiple(multiple?: Maybe<boolean>): void {\n    this._multipleSignal.set(multiple);\n  }\n\n  setMaxFiles(maxFiles?: Maybe<number>): void {\n    this._maxFilesSignal.set(maxFiles);\n  }\n\n  setAccept(accept?: Maybe<FileArrayAcceptMatchConfig['accept']>): void {\n    this._acceptSignal.set(accept);\n  }\n}\n","import { asDecisionFunction, type DecisionFunction, type Maybe, type MimeTypeWithSubtypeWildcardWithoutParameters, type MimeTypeWithoutParameters, separateValues, SLASH_PATH_FILE_TYPE_SEPARATOR, type SlashPathTypedFileSuffix, splitFront, type MimeTypeWildcard } from '@dereekb/util';\n\n/**\n * String used as input for the \"accept\" attribute of a file input element.\n */\nexport type FileAcceptString = string;\n\n/**\n * Returns a string that can be used as the \"accept\" attribute of a file input element.\n *\n * @param accept - A file accept string or array of filter type strings to convert.\n * @returns A comma-separated string suitable for the HTML accept attribute.\n */\nexport function fileAcceptString(accept: FileAcceptString | FileAcceptFilterTypeStringArray): FileAcceptString {\n  return typeof accept === 'string' ? accept : accept.join(',');\n}\n\n/**\n * Describes a type of file that can be selected.\n *\n * Can either be a mime type or a file suffix.\n */\nexport type FileAcceptFilterTypeString = MimeTypeWildcard | MimeTypeWithoutParameters | MimeTypeWithSubtypeWildcardWithoutParameters | SlashPathTypedFileSuffix;\n\n/**\n * The file accept filter type strings.\n */\nexport type FileAcceptFilterTypeStringArray = FileAcceptFilterTypeString[];\n\n/**\n * Converts a comma-separated accept string or array into a {@link FileAcceptFilterTypeStringArray}.\n *\n * @param accept - A file accept string or array of filter type strings to normalize.\n * @returns The individual filter type strings.\n *\n * @example\n * ```ts\n * const types = fileAcceptFilterTypeStringArray('image/png, .pdf');\n * // ['image/png', '.pdf']\n * ```\n */\nexport function fileAcceptFilterTypeStringArray(accept: FileAcceptString | FileAcceptFilterTypeStringArray): FileAcceptFilterTypeStringArray {\n  return typeof accept === 'string' ? accept.split(',').map((x) => x.trim()) : accept;\n}\n\n/**\n * Configuration for matching an array of files against accept criteria with optional multiple file support.\n */\nexport interface FileArrayAcceptMatchConfig extends FileArrayAcceptMaxFilesInput {\n  readonly accept: FileAcceptFunction | FileAcceptString | FileAcceptFilterTypeStringArray;\n}\n\n/**\n * The two values that together decide how many files a selection may accept.\n */\nexport interface FileArrayAcceptMaxFilesInput {\n  /**\n   * If false, then only the first file will be accepted.\n   *\n   * Defaults to true.\n   */\n  readonly multiple?: Maybe<boolean>;\n  /**\n   * The most files that may be accepted at once.\n   *\n   * Files past the limit are REJECTED rather than the whole selection being refused, so a user who picks\n   * more than the limit still gets the first ones instead of nothing at all.\n   *\n   * A limit of 0 accepts nothing — which is how a destination that is already full says so. Ignored while\n   * multiple is false, as that is already a limit of one.\n   */\n  readonly maxFiles?: Maybe<number>;\n}\n\n/**\n * Returns how many files a selection may accept, or undefined when there is no limit.\n *\n * @param input - The multiple/maxFiles pair to resolve.\n * @returns The effective limit, or undefined when unlimited.\n *\n * @example\n * ```ts\n * fileArrayAcceptMaxFiles({ multiple: false }); // 1\n * fileArrayAcceptMaxFiles({ multiple: true, maxFiles: 3 }); // 3\n * fileArrayAcceptMaxFiles({ multiple: true }); // undefined\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function fileArrayAcceptMaxFiles(input: FileArrayAcceptMaxFilesInput): Maybe<number> {\n  const { multiple, maxFiles } = input;\n  let result: Maybe<number>;\n\n  if (multiple === false) {\n    result = 1;\n  } else if (maxFiles != null) {\n    result = Math.max(0, Math.floor(maxFiles));\n  }\n\n  return result;\n}\n\n/**\n * Result of matching files against accept criteria, categorizing them into accepted and rejected lists.\n */\nexport interface FileArrayAcceptMatchResult {\n  /**\n   * If multiple is allowed or not.\n   */\n  readonly multiple: boolean;\n  /**\n   * The limit that was applied, or undefined when the selection was unlimited.\n   */\n  readonly maxFiles?: Maybe<number>;\n  /**\n   * The input files.\n   */\n  readonly input: File[];\n  /**\n   * The final list of accepted files.\n   */\n  readonly accepted: File[];\n  /**\n   * The final list of rejected files.\n   */\n  readonly rejected: File[];\n  /**\n   * The list of accepted files based on the file type.\n   *\n   * If multiple is false, all files that would have been accepted are included here.\n   */\n  readonly acceptedType: File[];\n  /**\n   * The list of rejected files based on the file type.\n   *\n   * If multiple is false, only files that would have been rejected by type are included here.\n   */\n  readonly rejectedType: File[];\n}\n\n/**\n * Matches an array of files based on the internal configuration.\n */\nexport type FileArrayAcceptMatchFunction = (input: File[]) => FileArrayAcceptMatchResult;\n\n/**\n * Creates a {@link FileArrayAcceptMatchFunction} that filters and separates files based on accept criteria and multiple file support.\n *\n * @param config - Configuration specifying the accept criteria and whether multiple files are allowed.\n * @returns Accepts an array of files and returns the categorized match result.\n *\n * @example\n * ```ts\n * const matchFn = fileArrayAcceptMatchFunction({ accept: 'image/*', multiple: false });\n * const result = matchFn(fileList);\n * console.log(result.accepted, result.rejected);\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function fileArrayAcceptMatchFunction(config: FileArrayAcceptMatchConfig): FileArrayAcceptMatchFunction {\n  const multiple = config.multiple ?? true;\n  const maxFiles = fileArrayAcceptMaxFiles(config);\n  const isAcceptedFunction = typeof config.accept === 'function' ? config.accept : fileAcceptFunction(config.accept);\n\n  return (input: File[]) => {\n    const { included: acceptedType, excluded: rejectedType } = separateValues(input, isAcceptedFunction);\n    let accepted = acceptedType;\n    let rejected = rejectedType;\n\n    if (maxFiles != null) {\n      const front = splitFront(acceptedType, maxFiles);\n      accepted = front.front;\n      rejected = [...rejectedType, ...front.remaining];\n    }\n\n    return { multiple, maxFiles, input, accepted, rejected, acceptedType, rejectedType };\n  };\n}\n\n/**\n * Type of input used for a FileAcceptFunction.\n *\n * Isolates the name and type fields from a File.\n */\nexport type FileAcceptFunctionInput = Pick<File, 'name' | 'type'>;\n\n/**\n * Used to determine if a file is an accepted type based on the internal configuration.\n */\nexport type FileAcceptFunction = DecisionFunction<FileAcceptFunctionInput>;\n\n/**\n * Creates a {@link FileAcceptFunction} that checks individual files against accept criteria (MIME types, wildcards, or file extensions).\n *\n * @param accept - A file accept string or array specifying which MIME types, wildcards, or file extensions to allow.\n * @returns A decision function that returns true if a file matches any of the accept criteria.\n *\n * @example\n * ```ts\n * const isAccepted = fileAcceptFunction(['image/*', '.pdf']);\n * isAccepted({ name: 'photo.png', type: 'image/png' }); // true\n * isAccepted({ name: 'doc.txt', type: 'text/plain' }); // false\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function fileAcceptFunction(accept: FileAcceptString | FileAcceptFilterTypeStringArray): FileAcceptFunction {\n  const acceptList = fileAcceptFilterTypeStringArray(accept);\n  let fileAcceptFunction: FileAcceptFunction;\n\n  if (acceptList.length === 0) {\n    fileAcceptFunction = asDecisionFunction(true);\n  } else {\n    const hasWildcard = acceptList.includes('*');\n\n    if (hasWildcard) {\n      fileAcceptFunction = asDecisionFunction(true);\n    } else {\n      const isAcceptedFunctions = acceptList.map((x) => {\n        let matchFn: (input: FileAcceptFunctionInput) => boolean;\n\n        if (x[0] === SLASH_PATH_FILE_TYPE_SEPARATOR) {\n          // is a SlashPathTypedFileSuffix\n          matchFn = (input) => input.name.endsWith(x);\n        } else if (x.endsWith('/*')) {\n          // is a MimeTypeWildcardWithoutParameters\n          const mimeTypePrefix = x.slice(0, -2);\n          matchFn = (input) => input.type.startsWith(mimeTypePrefix);\n        } else {\n          // treat as a MimeTypeWithoutParameters\n          matchFn = (input) => input.type === x;\n        }\n\n        return matchFn;\n      });\n\n      fileAcceptFunction = (input: FileAcceptFunctionInput) => {\n        return isAcceptedFunctions.some((x) => x(input));\n      };\n    }\n  }\n\n  return fileAcceptFunction;\n}\n","import { type Type, type Provider, forwardRef } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type FileArrayAcceptMatchConfig } from './upload.accept';\nimport { DbxActionWorkable, provideDbxActionWorkable } from '@dereekb/dbx-core';\n\n/**\n * Abstract interface for file upload components that can be controlled by the action system (disabled, working, multiple, accept states).\n *\n * Extends {@link DbxActionWorkable} (disabled/working), adding upload-specific multiple/accept controls.\n */\nexport abstract class DbxFileUploadActionCompatable extends DbxActionWorkable {\n  abstract setMultiple(multiple?: Maybe<boolean>): void;\n  abstract setMaxFiles(maxFiles?: Maybe<number>): void;\n  abstract setAccept(accept?: Maybe<FileArrayAcceptMatchConfig['accept']>): void;\n}\n\n/**\n * Provides a {@link DbxFileUploadActionCompatable} for dependency injection from the given component type.\n *\n * @param sourceType - The concrete component class that implements {@link DbxFileUploadActionCompatable}\n * @returns The providers that register the given type as the {@link DbxFileUploadActionCompatable} implementation.\n *\n * @Component ({ providers: provideDbxFileUploadActionCompatable(MyUploadComponent) })\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxFileUploadActionCompatable<S extends DbxFileUploadActionCompatable>(sourceType: Type<S>): Provider[] {\n  return [\n    {\n      provide: DbxFileUploadActionCompatable,\n      useExisting: forwardRef(() => sourceType)\n    },\n    ...provideDbxActionWorkable(sourceType)\n  ];\n}\n","import { Component, computed, HostListener, input, output, signal } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { type Maybe } from '@dereekb/util';\nimport { fileArrayAcceptMatchFunction } from './upload.accept';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AbstractDbxFileUploadComponent, type DbxFileUploadFilesChangedEvent } from './abstract.upload.component';\nimport { provideDbxFileUploadActionCompatable } from './upload.action';\n\n/**\n * Event emitted by {@link DbxFileUploadAreaComponent} when files are dropped.\n */\nexport type DbxFileUploadAreaFilesChangedEvent = DbxFileUploadFilesChangedEvent;\n\n/**\n * Drag-and-drop file upload area that accepts dropped files and emits accepted/rejected results.\n *\n * @example\n * ```html\n * <dbx-file-upload-area [accept]=\"['image/*']\" [multiple]=\"true\" [hint]=\"true\" (filesChanged)=\"onFiles($event)\">\n *   <p>Drop files here</p>\n * </dbx-file-upload-area>\n * ```\n */\n@Component({\n  selector: 'dbx-file-upload-area',\n  template: `\n    @if (show()) {\n      <div class=\"dbx-file-upload-area-content\">\n        <div class=\"dbx-file-upload-area-content-text\">\n          @if (icon()) {\n            <mat-icon>{{ icon() }}</mat-icon>\n          }\n          @if (text()) {\n            <span>{{ text() }}</span>\n          }\n        </div>\n        <div class=\"dbx-file-upload-area-content-wrapped\">\n          <ng-template [ngTemplateOutlet]=\"contentTemplate\"></ng-template>\n        </div>\n      </div>\n      @if (hintSignal()) {\n        <div class=\"dbx-file-upload-area-content-hint dbx-hint dbx-small\">{{ hintSignal() }}</div>\n      }\n    } @else {\n      <ng-template [ngTemplateOutlet]=\"contentTemplate\"></ng-template>\n    }\n\n    <!-- Content Template -->\n    <ng-template #contentTemplate>\n      <ng-content></ng-content>\n    </ng-template>\n  `,\n  host: {\n    class: 'dbx-file-upload-area',\n    '[class.dbx-file-upload-area-with-hint]': 'hintSignal()',\n    '[class.dbx-file-upload-area-disabled]': 'disabledSignal()',\n    '[class.dbx-file-upload-area-working]': 'isWorkingSignal()',\n    '[class.dbx-file-upload-area-drag-over]': '!disabledSignal() && dragOverStateSignal()'\n  },\n  providers: provideDbxFileUploadActionCompatable(DbxFileUploadAreaComponent),\n  imports: [MatIconModule, NgTemplateOutlet]\n})\nexport class DbxFileUploadAreaComponent extends AbstractDbxFileUploadComponent {\n  readonly icon = input<Maybe<string>>();\n  readonly text = input<Maybe<string>>();\n  readonly hint = input<Maybe<string | boolean>>();\n  readonly show = input<boolean>(true);\n\n  readonly hintSignal = computed(() => {\n    const hint = this.hint();\n    return typeof hint === 'string' ? hint : hint === true ? 'Drag to upload' : null;\n  });\n\n  readonly filesChanged = output<DbxFileUploadAreaFilesChangedEvent>();\n  readonly areaClicked = output<void>();\n  readonly areaDragActiveChanged = output<boolean>();\n\n  readonly dragOverStateSignal = signal<boolean>(false);\n  readonly filesAcceptedFunctionSignal = computed(() => fileArrayAcceptMatchFunction({ multiple: this.multipleSignal() ?? false, maxFiles: this.maxFilesSignal(), accept: this.acceptSignal() }));\n\n  @HostListener('click', ['$event'])\n  onClick(evt: MouseEvent) {\n    evt.stopPropagation();\n\n    if (!this.disabled()) {\n      this.areaClicked.emit();\n    }\n  }\n\n  @HostListener('dragover', ['$event'])\n  onDragOver(evt: DragEvent) {\n    evt.preventDefault();\n    evt.stopPropagation();\n    this.dragOverStateSignal.set(true);\n    this.areaDragActiveChanged.emit(true);\n  }\n\n  @HostListener('dragleave', ['$event'])\n  onDragLeave(evt: DragEvent) {\n    evt.preventDefault();\n    evt.stopPropagation();\n    this.dragOverStateSignal.set(false);\n    this.areaDragActiveChanged.emit(false);\n  }\n\n  @HostListener('drop', ['$event'])\n  onDrop(evt: DragEvent) {\n    evt.preventDefault();\n    evt.stopPropagation();\n    this.dragOverStateSignal.set(false);\n\n    if (!this.disabled()) {\n      const allFiles = evt.dataTransfer?.files;\n\n      if (allFiles) {\n        const matchResult = this.filesAcceptedFunctionSignal()(Array.from(allFiles));\n        this.filesChanged.emit({ allFiles: matchResult.input, matchResult });\n      }\n    }\n  }\n}\n","import { Component, computed, ElementRef, input, output, viewChild } from '@angular/core';\nimport { fileAcceptString, fileArrayAcceptMatchFunction, type FileAcceptFunction } from './upload.accept';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type DbxButtonStyle } from '../../button/button';\nimport { type Maybe } from '@dereekb/util';\nimport { AbstractDbxFileUploadComponent, type DbxFileUploadFilesChangedEvent } from './abstract.upload.component';\nimport { provideDbxFileUploadActionCompatable } from './upload.action';\n\n/**\n * Event emitted by {@link DbxFileUploadButtonComponent} when files are selected.\n */\nexport type DbxFileUploadButtonFilesChangedEvent = DbxFileUploadFilesChangedEvent;\n\n// stands in for a type filter the input's own accept attribute has already applied\nconst ACCEPT_EVERY_FILE: FileAcceptFunction = () => true;\n\n/**\n * File upload button that opens a native file picker and emits accepted/rejected file results.\n *\n * @example\n * ```html\n * <dbx-file-upload-button [text]=\"'Upload'\" [icon]=\"'upload'\" [accept]=\"['image/*']\" [multiple]=\"true\" (filesChanged)=\"onFiles($event)\"></dbx-file-upload-button>\n * ```\n */\n@Component({\n  selector: 'dbx-file-upload-button',\n  template: `\n    <dbx-button [buttonStyle]=\"buttonStyle()\" [text]=\"text()\" [icon]=\"icon()\" [ariaLabel]=\"ariaLabel() || text() || 'Upload file'\" (buttonClick)=\"openInput()\" [disabled]=\"disabledSignal()\" [working]=\"workingSignal()\">\n      <ng-content></ng-content>\n    </dbx-button>\n    <input #fileInput hidden type=\"file\" [attr.accept]=\"buttonAcceptSignal() ?? null\" [attr.multiple]=\"multipleAttributeSignal()\" (change)=\"fileInputChanged()\" />\n  `,\n  providers: provideDbxFileUploadActionCompatable(DbxFileUploadButtonComponent),\n  imports: [DbxButtonComponent]\n})\nexport class DbxFileUploadButtonComponent extends AbstractDbxFileUploadComponent {\n  readonly fileInput = viewChild.required<string, ElementRef<HTMLInputElement>>('fileInput', { read: ElementRef });\n\n  readonly text = input<Maybe<string>>();\n  readonly icon = input<Maybe<string>>();\n  readonly ariaLabel = input<Maybe<string>>();\n  readonly buttonStyle = input<Maybe<DbxButtonStyle>>();\n\n  readonly filesChanged = output<DbxFileUploadButtonFilesChangedEvent>();\n\n  readonly buttonAcceptSignal = computed(() => {\n    const accept = this.acceptSignal();\n    return typeof accept === 'function' ? undefined : fileAcceptString(accept);\n  });\n\n  readonly buttonMultipleSignal = computed(() => this.multipleSignal() ?? false);\n\n  /**\n   * The match function the picked files are run through.\n   *\n   * A non-function accept is left to the input's own accept attribute — but the COUNT still has to be\n   * applied here, as the file picker has no concept of a limit and will happily hand back more than the\n   * destination can hold.\n   */\n  readonly filesAcceptedFunctionSignal = computed(() => {\n    const accept = this.acceptSignal();\n    const multiple = this.buttonMultipleSignal();\n    const maxFiles = this.maxFilesSignal();\n    return fileArrayAcceptMatchFunction({ multiple, maxFiles, accept: typeof accept === 'function' ? accept : ACCEPT_EVERY_FILE });\n  });\n\n  /**\n   * The HTML attribute should not be added if it is false, so we return null.\n   */\n  readonly multipleAttributeSignal = computed(() => (this.buttonMultipleSignal() ? '' : null));\n\n  /**\n   * NOTE: A Chrome bug can cause \"File chooser dialog can only be shown with a user activation\" errors\n   * when Chrome's \"Restart to Update\" banner is visible. Restarting Chrome to apply the update resolves it.\n   *\n   * See https://issues.chromium.org/issues/330663542 (scroll to bottom for details).\n   */\n  openInput() {\n    const inputRef = this.fileInput();\n    const input = inputRef.nativeElement;\n\n    const isDisabled = this.disabledSignal();\n\n    if (!isDisabled) {\n      input.click();\n    }\n  }\n\n  fileInputChanged() {\n    const inputRef = this.fileInput();\n    const input = inputRef.nativeElement;\n    const isDisabled = this.disabledSignal();\n\n    if (!isDisabled) {\n      const allFiles = input.files ? Array.from(input.files) : [];\n      const matchResult = this.filesAcceptedFunctionSignal()(allFiles);\n      this.filesChanged.emit({ allFiles, matchResult });\n    }\n\n    // reset the input value\n    if (input.value) {\n      input.value = '';\n    }\n  }\n}\n","import { Component, computed, input, output, viewChild } from '@angular/core';\nimport { type FileArrayAcceptMatchConfig } from './upload.accept';\nimport { type DbxButtonStyle } from '../../button/button';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxFileUploadButtonComponent, type DbxFileUploadButtonFilesChangedEvent } from './upload.button.component';\nimport { DbxFileUploadAreaComponent, type DbxFileUploadAreaFilesChangedEvent } from './upload.area.component';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AbstractDbxFileUploadComponent, type DbxFileUploadFilesChangedEvent } from './abstract.upload.component';\nimport { provideDbxFileUploadActionCompatable } from './upload.action';\nimport { type DbxButtonDisplay } from '@dereekb/dbx-core';\n\n/**\n * Display mode for the file upload component: area-only, button-only, or both (default).\n */\nexport type DbxFileUploadMode = 'area' | 'button' | 'default';\n\n/**\n * Configuration for the combined file upload component, controlling display mode, accept filters, and area/button appearance.\n */\nexport interface DbxFileUploadComponentConfig {\n  readonly mode?: DbxFileUploadMode;\n  readonly accept?: Maybe<FileArrayAcceptMatchConfig['accept']>;\n  readonly multiple?: Maybe<boolean>;\n  /**\n   * The most files that can be selected at once. Ignored while multiple is false.\n   */\n  readonly maxFiles?: Maybe<number>;\n\n  /**\n   * If true, the area will be clickable to open the file picker.\n   */\n  readonly clickAreaToUpload?: Maybe<boolean>;\n\n  readonly area?: Maybe<{\n    readonly icon?: Maybe<string>;\n    readonly text?: Maybe<string>;\n    readonly hint?: Maybe<string | boolean>;\n  }>;\n\n  readonly button?: Maybe<{\n    readonly icon?: Maybe<string>;\n    readonly text?: Maybe<string>;\n    readonly style?: DbxButtonStyle;\n  }>;\n}\n\n/**\n * Combines a drag-and-drop upload area with a file picker button into a single configurable component.\n *\n * Supports area-only, button-only, or combined (default) display modes.\n *\n * @example\n * ```html\n * <dbx-file-upload [mode]=\"'default'\" [accept]=\"['image/*']\" [multiple]=\"true\" [hint]=\"'Drag files here'\" [text]=\"'Browse'\" (filesChanged)=\"onFiles($event)\"></dbx-file-upload>\n * ```\n */\n@Component({\n  selector: 'dbx-file-upload',\n  template: `\n    <dbx-file-upload-area\n      #area\n      [show]=\"showAreaSignal()\"\n      [hint]=\"areaHintSignal()\"\n      [text]=\"areaTextSignal()\"\n      [icon]=\"areaIconSignal()\"\n      [accept]=\"acceptSignal()\"\n      [multiple]=\"multipleSignal()\"\n      [maxFiles]=\"uploadMaxFilesSignal()\"\n      (filesChanged)=\"areaFilesChanged($event)\"\n      (areaClicked)=\"areaClicked()\"\n      [disabled]=\"disabledSignal()\"\n      [working]=\"workingSignal()\">\n      <ng-content></ng-content>\n      @if (showButtonSignal()) {\n        <ng-template [ngTemplateOutlet]=\"buttonTemplate\"></ng-template>\n      }\n    </dbx-file-upload-area>\n    <!-- Button Template -->\n    <ng-template #buttonTemplate>\n      <dbx-file-upload-button\n        #button\n        [text]=\"buttonTextSignal()\"\n        [icon]=\"buttonIconSignal()\"\n        [accept]=\"acceptSignal()\"\n        [multiple]=\"multipleSignal()\"\n        [maxFiles]=\"uploadMaxFilesSignal()\"\n        (filesChanged)=\"buttonFilesChanged($event)\"\n        [disabled]=\"disabledSignal()\"\n        [working]=\"workingSignal()\"\n        [buttonStyle]=\"buttonStyle()\"></dbx-file-upload-button>\n    </ng-template>\n  `,\n  providers: provideDbxFileUploadActionCompatable(DbxFileUploadComponent),\n  imports: [DbxFileUploadAreaComponent, DbxFileUploadButtonComponent, NgTemplateOutlet]\n})\nexport class DbxFileUploadComponent extends AbstractDbxFileUploadComponent {\n  readonly config = input<Maybe<DbxFileUploadComponentConfig>>();\n\n  readonly area = viewChild.required<string, DbxFileUploadAreaComponent>('area', { read: DbxFileUploadAreaComponent });\n  readonly button = viewChild.required<string, DbxFileUploadButtonComponent>('button', { read: DbxFileUploadButtonComponent });\n  readonly buttonStyle = input<Maybe<DbxButtonStyle>>();\n  readonly buttonDisplay = input<Maybe<DbxButtonDisplay>>();\n\n  readonly mode = input<Maybe<DbxFileUploadMode>>();\n  readonly text = input<Maybe<string>>(); // button text\n  readonly icon = input<Maybe<string>>(); // button icon\n  readonly hint = input<Maybe<string | boolean>>(); // area hint\n\n  readonly modeSignal = computed(() => {\n    const config = this.config();\n    const mode = this.mode();\n    return config?.mode ?? mode ?? 'default';\n  });\n\n  readonly showButtonSignal = computed(() => {\n    const mode = this.modeSignal();\n    return mode === 'button' || mode === 'default';\n  });\n\n  readonly showAreaSignal = computed(() => {\n    const mode = this.modeSignal();\n    return mode === 'area' || mode === 'default';\n  });\n\n  readonly clickAreaToUpload = input<Maybe<boolean>>();\n  readonly clickAreaToUploadSignal = computed(() => {\n    const config = this.config();\n    const clickAreaToUpload = this.clickAreaToUpload();\n    return config?.clickAreaToUpload ?? clickAreaToUpload;\n  });\n\n  readonly buttonTextSignal = computed(() => {\n    const config = this.config();\n    const text = this.text();\n    const buttonDisplay = this.buttonDisplay();\n    return config?.button?.text ?? buttonDisplay?.text ?? text;\n  });\n\n  readonly buttonIconSignal = computed(() => {\n    const config = this.config();\n    const icon = this.icon();\n    const buttonDisplay = this.buttonDisplay();\n    return config?.button?.icon ?? buttonDisplay?.icon ?? icon;\n  });\n\n  readonly areaTextSignal = computed(() => this.config()?.area?.text);\n  readonly areaIconSignal = computed(() => this.config()?.area?.icon);\n  readonly areaHintSignal = computed(() => {\n    const config = this.config();\n    const hint = this.hint();\n    return config?.area?.hint ?? hint;\n  });\n\n  readonly uploadMultipleSignal = computed(() => {\n    const config = this.config();\n    const multiple = this.multipleSignal();\n    return multiple ?? config?.multiple;\n  });\n\n  readonly uploadMaxFilesSignal = computed(() => {\n    const config = this.config();\n    const maxFiles = this.maxFilesSignal();\n    return maxFiles ?? config?.maxFiles;\n  });\n\n  readonly uploadAcceptSignal = computed(() => {\n    const config = this.config();\n    const accept = this.acceptSignal();\n    return accept ?? config?.accept;\n  });\n\n  readonly filesChanged = output<DbxFileUploadFilesChangedEvent>();\n\n  areaClicked() {\n    const clickAreaToUpload = this.clickAreaToUploadSignal();\n\n    if (clickAreaToUpload) {\n      const button = this.button();\n      button.openInput();\n    }\n  }\n\n  areaFilesChanged(event: DbxFileUploadAreaFilesChangedEvent) {\n    this.filesChanged.emit(event);\n  }\n\n  buttonFilesChanged(event: DbxFileUploadButtonFilesChangedEvent) {\n    this.filesChanged.emit(event);\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { cleanSubscriptionWithLockSet, DbxActionContextStoreSourceInstance, DbxActionWorkable } from '@dereekb/dbx-core';\n\n/**\n * Syncs the disabled and working states from an ActionContextStoreSource to a {@link DbxActionWorkable} target.\n *\n * The target is any element that provides {@link DbxActionWorkable} -- a {@link DbxFileUploadActionCompatable}\n * file upload component, or a {@link DbxButton} (e.g. `<dbx-button>`).\n *\n * @example\n * ```html\n * <dbx-file-upload-button dbxFileUploadActionSync (filesChanged)=\"onFiles($event)\"></dbx-file-upload-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-button dbxFileUploadActionSync></dbx-button>\n * ```\n */\n@Directive({\n  selector: '[dbxFileUploadActionSync]'\n})\nexport class DbxFileUploadActionSyncDirective {\n  readonly source = inject(DbxActionContextStoreSourceInstance);\n  readonly workable = inject<DbxActionWorkable>(DbxActionWorkable);\n\n  constructor() {\n    cleanSubscriptionWithLockSet({\n      lockSet: this.source.lockSet,\n      sub: this.source.isWorkingOrWorkProgress$.subscribe((working) => {\n        this.workable.setWorking(working);\n      })\n    });\n\n    cleanSubscriptionWithLockSet({\n      lockSet: this.source.lockSet,\n      sub: this.source.isDisabled$.subscribe((disabled) => {\n        this.workable.setDisabled(disabled);\n      })\n    });\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { DBX_INJECTION_COMPONENT_DATA } from '@dereekb/dbx-core';\nimport { type ReadableError, type ReadableErrorWithCode } from '@dereekb/util';\n\n/**\n * Abstract base class for custom error widget components.\n *\n * Provides access to the injected {@link ReadableErrorWithCode} data, including the error code and message.\n * Extend this class when creating custom error widgets registered with {@link DbxErrorWidgetService}.\n *\n * @example\n * ```typescript\n * @Component({ template: `<p>Error: {{ message }}</p>` })\n * export class MyCustomErrorWidget extends AbstractDbxErrorWidgetComponent<MyErrorType> {\n *   // Access this.data, this.code, this.message\n * }\n * ```\n */\n@Directive()\nexport abstract class AbstractDbxErrorWidgetComponent<T extends ReadableError = ReadableError> {\n  readonly data = inject<ReadableErrorWithCode<T>>(DBX_INJECTION_COMPONENT_DATA);\n\n  get code() {\n    return this.data.code;\n  }\n\n  get message() {\n    return this.data.message;\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Displays a label header above projected content, useful for labeling form fields or data sections.\n *\n * @dbxWebComponent\n * @dbxWebSlug label-block\n * @dbxWebCategory text\n * @dbxWebRelated detail-block\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-label-block header=\"Label\">Body</dbx-label-block>\n * ```\n *\n * @example\n * ```html\n * <dbx-label-block header=\"Status\"><span>Active</span></dbx-label-block>\n * ```\n */\n@Component({\n  selector: 'dbx-label-block',\n  template: `\n    <span class=\"d-block dbx-label dbx-label-padded\">{{ header() }}</span>\n    <ng-content></ng-content>\n  `,\n  host: {\n    class: 'dbx-label-block'\n  }\n})\nexport class DbxLabelBlockComponent {\n  readonly header = input<Maybe<string>>();\n}\n","import { Component } from '@angular/core';\nimport { type ServerError, type ServerErrorResponseData } from '@dereekb/util';\nimport { AbstractDbxErrorWidgetComponent } from './error.widget.directive';\nimport { DbxLabelBlockComponent } from '../layout/text/label.block.component';\nimport { JsonPipe } from '@angular/common';\n\n/**\n * Default error widget that displays the error code, message, and optional server error data as JSON.\n *\n * Registered as both the default and unknown error widget in {@link DbxErrorWidgetService}.\n * Extends {@link AbstractDbxErrorWidgetComponent} for access to the injected error data.\n */\n@Component({\n  template: `\n    <dbx-label-block header=\"Error Code\">{{ code }}</dbx-label-block>\n    <dbx-label-block header=\"Error Message\">{{ message }}</dbx-label-block>\n    @if (serverErrorData) {\n      <dbx-label-block header=\"Error Data\">\n        <p class=\"dbx-json\">{{ serverErrorData | json }}</p>\n      </dbx-label-block>\n    }\n  `,\n  host: {\n    class: 'd-block dbx-error-default-error-widget dbx-content-container'\n  },\n  imports: [DbxLabelBlockComponent, JsonPipe]\n})\nexport class DbxErrorDefaultErrorWidgetComponent extends AbstractDbxErrorWidgetComponent<ServerError> {\n  get serverErrorData(): ServerErrorResponseData | undefined {\n    return this.data.data;\n  }\n}\n","import { Service, type Type } from '@angular/core';\nimport { type Maybe, filterMaybeArrayValues, mapIterable, type StringErrorCode } from '@dereekb/util';\nimport { DbxErrorDefaultErrorWidgetComponent } from './default.error.widget.component';\n\n/**\n * Error code used to identify the default error widget entry in {@link DbxErrorWidgetService}.\n */\nexport const DEFAULT_ERROR_WIDGET_CODE = 'DEFAULT_ERROR_WIDGET';\n\n/**\n * Error code used to identify the unknown/fallback error widget entry in {@link DbxErrorWidgetService}.\n */\nexport const UNKNOWN_ERROR_WIDGET_CODE = 'UNKNOWN_ERROR_WIDGET';\n\n/**\n * Registration entry that maps an error code to one or more widget component classes for rendering that error.\n */\nexport interface DbxErrorWidgetEntry {\n  /**\n   * Error code to respond to.\n   */\n  readonly code: StringErrorCode;\n  /**\n   * In-line error widget component class to use.\n   *\n   * This changes how it appears in dbx-error.\n   *\n   * If not provided, dbx-error will display the default output.\n   */\n  readonly errorComponentClass?: Maybe<Type<unknown>>;\n  /**\n   * Custom popup error widget component class to use.\n   *\n   * This changes how it appears in the dbx-error-widget-view.\n   *\n   * If not provided, the widget will display the default entry.\n   */\n  readonly widgetComponentClass?: Maybe<Type<unknown>>;\n}\n\n/**\n * A {@link DbxErrorWidgetEntry} that is guaranteed to have a `popupComponentClass` defined.\n */\nexport type DbxErrorWidgetEntryWithPopupComponentClass = Omit<DbxErrorWidgetEntry, 'popupComponentClass'> & { popupComponentClass: Type<unknown> };\n\n/**\n * Service used to register error widgets.\n *\n * It has two default widgets:\n *\n * - default: used in cases where an error has been registered by its error code\n * - unknown: used in cases where an error has an error code that has not been registered\n *\n * By default the DbxErrorDefaultErrorWidgetComponent is registered to both the default and unknown error entries.\n */\n@Service()\nexport class DbxErrorWidgetService {\n  private readonly _entries = new Map<StringErrorCode, DbxErrorWidgetEntry>();\n\n  constructor() {\n    const defaultEntry = { widgetComponentClass: DbxErrorDefaultErrorWidgetComponent };\n    this.registerDefaultEntry(defaultEntry);\n    this.registerUnknownEntry(defaultEntry);\n  }\n\n  registerDefaultEntry(entry: Omit<DbxErrorWidgetEntry, 'errorComponentClass' | 'code'>) {\n    return this.register({\n      ...entry,\n      errorComponentClass: null, // errorComponentClass is not allowed nor used for the default entry\n      code: DEFAULT_ERROR_WIDGET_CODE\n    });\n  }\n\n  registerUnknownEntry(entry: Omit<DbxErrorWidgetEntry, 'errorComponentClass' | 'code'>) {\n    return this.register({\n      ...entry,\n      errorComponentClass: null, // errorComponentClass is not allowed nor used for the unknown entry\n      code: UNKNOWN_ERROR_WIDGET_CODE\n    });\n  }\n\n  register(entry: DbxErrorWidgetEntry, override: boolean = true): boolean {\n    let registered = false;\n\n    if (override || !this._entries.has(entry.code)) {\n      this._entries.set(entry.code, entry);\n      registered = true;\n    }\n\n    return registered;\n  }\n\n  // MARK: Get\n  getErrorWidgetIdentifiers(): StringErrorCode[] {\n    return Array.from(this._entries.keys());\n  }\n\n  getDefaultErrorWidgetEntry(): Maybe<DbxErrorWidgetEntry> {\n    return this.getErrorWidgetEntry(DEFAULT_ERROR_WIDGET_CODE);\n  }\n\n  getUnknownErrorWidgetEntry(): Maybe<DbxErrorWidgetEntry> {\n    return this.getErrorWidgetEntry(UNKNOWN_ERROR_WIDGET_CODE);\n  }\n\n  getErrorWidgetEntry(code: StringErrorCode): Maybe<DbxErrorWidgetEntry> {\n    return this._entries.get(code);\n  }\n\n  getErrorWidgetEntries(codes: Iterable<StringErrorCode>): DbxErrorWidgetEntry[] {\n    return filterMaybeArrayValues(mapIterable(codes ?? [], (x) => this._entries.get(x)));\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { type Maybe, type ReadableError, type ReadableErrorWithCode } from '@dereekb/util';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DbxErrorWidgetService } from './error.widget.service';\n\n/**\n * Resolves and displays an error widget component based on the error's code.\n *\n * Looks up the appropriate widget component from {@link DbxErrorWidgetService} using the error's code,\n * falling back to the default or unknown widget entry as appropriate. Renders the widget via dynamic injection.\n *\n * @example\n * ```html\n * <dbx-error-widget-view [error]=\"readableError\"></dbx-error-widget-view>\n * ```\n */\n@Component({\n  selector: 'dbx-error-widget-view',\n  template: `\n    <dbx-injection [config]=\"errorWithCodeSignal()\"></dbx-injection>\n  `,\n  host: {\n    class: 'dbx-error-widget-view'\n  },\n  imports: [DbxInjectionComponent]\n})\nexport class DbxErrorWidgetViewComponent {\n  readonly dbxErrorWidgetService = inject(DbxErrorWidgetService);\n\n  readonly error = input<Maybe<ReadableError>>();\n\n  readonly errorWithCodeSignal = computed<Maybe<DbxInjectionComponentConfig>>(() => {\n    const currentError = this.error();\n    const error: Maybe<ReadableErrorWithCode> = currentError?.code ? (currentError as ReadableErrorWithCode) : undefined;\n\n    let config: Maybe<DbxInjectionComponentConfig>;\n\n    if (error != null) {\n      const entry = this.dbxErrorWidgetService.getErrorWidgetEntry(error.code);\n\n      if (entry == null) {\n        const unknownEntry = this.dbxErrorWidgetService.getUnknownErrorWidgetEntry();\n\n        if (unknownEntry?.widgetComponentClass != null) {\n          config = {\n            componentClass: unknownEntry?.widgetComponentClass,\n            data: error\n          };\n        }\n      } else {\n        const defaultEntry = this.dbxErrorWidgetService.getDefaultErrorWidgetEntry();\n        const componentClass = entry.widgetComponentClass ?? defaultEntry?.widgetComponentClass;\n\n        if (componentClass != null) {\n          config = {\n            componentClass,\n            data: error\n          };\n        }\n      }\n    }\n\n    return config;\n  });\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe, type ReadableError } from '@dereekb/util';\nimport { DbxErrorWidgetViewComponent } from './error.widget.component';\n\n/**\n * Displays detailed error information using the error widget system.\n *\n * Wraps {@link DbxErrorWidgetViewComponent} to render a widget for the given {@link ReadableError}.\n * Typically used inside popovers or detail panels to show expanded error data.\n *\n * @example\n * ```html\n * <dbx-error-details [error]=\"readableError\"></dbx-error-details>\n * ```\n */\n@Component({\n  selector: 'dbx-error-details',\n  template: `\n    <dbx-error-widget-view [error]=\"error()\"></dbx-error-widget-view>\n  `,\n  host: {\n    class: 'd-block dbx-error-details'\n  },\n  imports: [DbxErrorWidgetViewComponent]\n})\nexport class DbxErrorDetailsComponent {\n  readonly error = input<Maybe<ReadableError>>();\n}\n","import { Component, type ElementRef } from '@angular/core';\nimport { type ReadableError } from '@dereekb/util';\nimport { AbstractPopoverDirective } from '../interaction/popover/abstract.popover.directive';\nimport { type DbxPopoverKey } from '../interaction/popover/popover';\nimport { type DbxPopoverService } from '../interaction/popover/popover.service';\nimport { DbxPopoverContentComponent, DbxPopoverHeaderComponent, DbxPopoverScrollContentDirective } from '../interaction';\nimport { DbxErrorDetailsComponent } from './error.details.component';\n\n/**\n * Default popover key used when opening an error popover.\n */\nexport const DEFAULT_ERROR_POPOVER_KEY = 'error';\n\n/**\n * Configuration for opening an error popover via {@link DbxErrorPopoverComponent.openPopover}.\n */\nexport interface DbxErrorPopoverConfig {\n  /**\n   * The element that the popover should be anchored to.\n   */\n  readonly origin: ElementRef;\n  /**\n   * The error to display in the popover.\n   */\n  readonly error: ReadableError;\n}\n\n/**\n * Popover component that displays detailed error information including the error code and widget details.\n *\n * Opened programmatically via the static {@link DbxErrorPopoverComponent.openPopover} method rather than\n * being used directly in templates.\n *\n * @example\n * ```typescript\n * DbxErrorPopoverComponent.openPopover(popoverService, {\n *   origin: elementRef,\n *   error: readableError\n * });\n * ```\n */\n@Component({\n  template: `\n    <dbx-popover-content class=\"dbx-error-popover\">\n      <dbx-popover-header [header]=\"code\" icon=\"error\"></dbx-popover-header>\n      <dbx-popover-scroll-content>\n        <dbx-error-details [error]=\"error\"></dbx-error-details>\n      </dbx-popover-scroll-content>\n    </dbx-popover-content>\n  `,\n  imports: [DbxPopoverContentComponent, DbxPopoverHeaderComponent, DbxPopoverScrollContentDirective, DbxErrorDetailsComponent]\n})\nexport class DbxErrorPopoverComponent extends AbstractPopoverDirective<void, ReadableError> {\n  readonly error = this.popover.data as ReadableError;\n  readonly code = this.error.code;\n\n  static openPopover(popoverService: DbxPopoverService, { origin, error }: DbxErrorPopoverConfig, popoverKey?: DbxPopoverKey) {\n    return popoverService.open({\n      key: popoverKey ?? DEFAULT_ERROR_POPOVER_KEY,\n      origin,\n      isResizable: true,\n      componentClass: DbxErrorPopoverComponent,\n      data: error\n    });\n  }\n}\n","import { computed, Directive, inject, input } from '@angular/core';\nimport { type DbxColorConfig, type DbxColorInput, DBX_COLOR_CUSTOM_TEXT_CSS_CLASS, isDbxColorConfig } from './style';\nimport { DbxColorService } from './style.color.service';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Applies a themed text color to the host element.\n *\n * Accepts either a {@link DbxThemeColor} string (e.g. `'primary'`, `'warn'`) or a {@link DbxColorConfig}\n * object carrying an arbitrary CSS color value. Unlike {@link DbxColorDirective} which sets the background,\n * this directive only sets the foreground text color.\n *\n * @dbxWebComponent\n * @dbxWebSlug text-color\n * @dbxWebCategory layout\n * @dbxWebRelated color, color-service\n * @dbxWebMinimalExample ```html\n * <span [dbxTextColor]=\"'primary'\"></span>\n * ```\n *\n * @example\n * ```html\n * <mat-icon [dbxTextColor]=\"'warn'\">error</mat-icon>\n * <span [dbxTextColor]=\"'primary'\">Themed text</span>\n * <span [dbxTextColor]=\"{ color: '#0066ff' }\">Custom hex text</span>\n * ```\n */\n@Directive({\n  selector: '[dbxTextColor]',\n  host: {\n    '[class]': 'cssClassSignal()',\n    '[style.--dbx-color-current]': 'colorStyleSignal()'\n  }\n})\nexport class DbxTextColorDirective {\n  private readonly _colorService = inject(DbxColorService, { optional: true });\n\n  readonly dbxTextColor = input<Maybe<DbxColorInput>>();\n\n  private readonly _configSignal = computed<Maybe<DbxColorConfig>>(() => {\n    const value = this.dbxTextColor();\n    return isDbxColorConfig(value) ? (this._colorService?.expandColorConfig(value) ?? value) : undefined;\n  });\n\n  readonly cssClassSignal = computed(() => {\n    const value = this.dbxTextColor();\n    let result = '';\n\n    if (isDbxColorConfig(value)) {\n      result = DBX_COLOR_CUSTOM_TEXT_CSS_CLASS;\n    } else if (value) {\n      result = `dbx-${value}`;\n    }\n\n    return result;\n  });\n\n  /**\n   * Inline `--dbx-color-current` value applied when a {@link DbxColorConfig} is bound. Resolves to `null` in string mode so the named `.dbx-{color}` class supplies the variable instead.\n   */\n  readonly colorStyleSignal = computed(() => this._configSignal()?.color ?? null);\n}\n","import { Component, ElementRef, input, output, viewChild } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DbxTextColorDirective } from '../layout/style/style.text-color.directive';\n\n/**\n * Event emitted when the error icon button is clicked, containing the button's element reference for popover anchoring.\n */\nexport interface DbxErrorViewButtonEvent {\n  /**\n   * The element reference of the clicked button, used as the popover origin.\n   */\n  readonly origin: ElementRef;\n}\n\n/**\n * Low-level error view that renders a Material icon button and an optional error message.\n *\n * Emits a {@link DbxErrorViewButtonEvent} when the button is clicked, which is typically used\n * to open an error detail popover. Used internally by {@link DbxErrorComponent}.\n *\n * @dbxWebComponent\n * @dbxWebSlug error-view\n * @dbxWebCategory feedback\n * @dbxWebRelated error, error-snackbar\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-error-view [error]=\"error\"></dbx-error-view>\n * ```\n *\n * @example\n * ```html\n * <dbx-error-view [error]=\"error\">\n *   <dbx-button text=\"Retry\" [dbxAction]=\"retryAction\"></dbx-button>\n * </dbx-error-view>\n * ```\n */\n@Component({\n  selector: 'dbx-error-view',\n  template: `\n    <button class=\"dbx-error-button\" [disabled]=\"buttonDisabled()\" [dbxTextColor]=\"'warn'\" #buttonPopoverOrigin mat-icon-button (click)=\"clickError()\" [attr.aria-label]=\"message() ? 'View error details' : 'Error'\">\n      <mat-icon aria-hidden=\"true\">{{ icon() }}</mat-icon>\n    </button>\n    @if (message()) {\n      <span class=\"dbx-error-message\" role=\"alert\">{{ message() }}</span>\n    }\n  `,\n  host: {\n    class: 'dbx-error dbx-warn dbx-b'\n  },\n  imports: [MatIconModule, MatButtonModule, DbxTextColorDirective]\n})\nexport class DbxErrorViewComponent {\n  readonly icon = input<string>('error');\n\n  readonly message = input<Maybe<string>>();\n\n  /**\n   * Whether or not the error button is disabled.\n   */\n  readonly buttonDisabled = input<Maybe<boolean>>();\n\n  readonly buttonClick = output<DbxErrorViewButtonEvent>();\n\n  readonly buttonOrigin = viewChild.required<ElementRef, ElementRef>('buttonPopoverOrigin', { read: ElementRef });\n\n  clickError() {\n    if (!this.buttonDisabled()) {\n      this.buttonClick.emit({\n        origin: this.buttonOrigin()\n      });\n    }\n  }\n}\n","import { Component, computed, input, output, inject, signal } from '@angular/core';\nimport { type Maybe, type ErrorInput, toReadableError, type ReadableError, isDefaultReadableError, type Configurable } from '@dereekb/util';\nimport { DbxErrorPopoverComponent } from './error.popover.component';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type DbxErrorViewButtonEvent, DbxErrorViewComponent } from './error.view.component';\nimport { DbxErrorWidgetService } from './error.widget.service';\nimport { DbxPopoverService } from '../interaction/popover/popover.service';\nimport { type NgPopoverRef } from 'ng-overlay-container';\n\n/**\n * Determines how the error component renders its content.\n *\n * - `'none'` - No error to display.\n * - `'default'` - Uses the built-in error view with icon and message.\n * - `'custom'` - Uses a dynamically injected custom error widget component.\n */\ntype DbxErrorComponentViewType = 'none' | 'default' | 'custom';\n\n/**\n * Internal state used by {@link DbxErrorComponent} to track the current error display configuration.\n */\ninterface DbxErrorComponentState {\n  readonly viewType: DbxErrorComponentViewType;\n  readonly isDefaultError?: Maybe<boolean>;\n  readonly message?: Maybe<string>;\n  readonly rawError?: Maybe<ErrorInput>;\n  readonly error?: Maybe<ReadableError>;\n  readonly customView?: Maybe<DbxInjectionComponentConfig>;\n}\n\n/**\n * Root error component that displays content related to an error.\n *\n * Converts an {@link ErrorInput} into a {@link ReadableError} and renders either a default error view\n * with an icon and message, or a custom error widget registered via {@link DbxErrorWidgetService}.\n * Clicking the error icon opens a popover with detailed error information.\n *\n * @dbxWebComponent\n * @dbxWebSlug error\n * @dbxWebCategory feedback\n * @dbxWebRelated error-snackbar, error-view, loading\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-error [error]=\"error\"></dbx-error>\n * ```\n *\n * @example\n * ```html\n * <dbx-error [error]=\"error$ | async\"></dbx-error>\n * ```\n */\n@Component({\n  selector: 'dbx-error',\n  template: `\n    @switch (viewTypeSignal()) {\n      @case ('default') {\n        <dbx-error-view icon=\"error\" [message]=\"messageSignal()\" [buttonDisabled]=\"isDefaultErrorSignal()\" (buttonClick)=\"openErrorPopover($event)\"></dbx-error-view>\n      }\n      @case ('custom') {\n        <dbx-injection [config]=\"customViewSignal()\"></dbx-injection>\n      }\n    }\n  `,\n  imports: [DbxErrorViewComponent, DbxInjectionComponent]\n})\nexport class DbxErrorComponent {\n  private readonly popoverService = inject(DbxPopoverService);\n  private readonly dbxErrorWidgetService = inject(DbxErrorWidgetService);\n\n  readonly popoverOpened = output<NgPopoverRef>();\n\n  readonly error = input<Maybe<ErrorInput>>();\n  readonly iconOnly = input<Maybe<boolean>>(false);\n\n  private readonly _errorOverrideSignal = signal<Maybe<ErrorInput>>(undefined);\n  readonly errorSignal = computed(() => {\n    const error = this.error();\n    return this._errorOverrideSignal() ?? error;\n  });\n\n  readonly stateSignal = computed<DbxErrorComponentState>(() => {\n    const rawError = this.errorSignal();\n    const iconOnly = this.iconOnly();\n    let result: DbxErrorComponentState;\n\n    if (rawError == null) {\n      result = { viewType: 'none' };\n    } else {\n      const error = toReadableError(rawError);\n      const isDefaultError = iconOnly ? false : isDefaultReadableError(error);\n\n      let state: DbxErrorComponentState = {\n        viewType: 'default',\n        rawError,\n        error,\n        message: (error as ReadableError)?.message || 'An error occurred.',\n        isDefaultError\n      };\n\n      if (iconOnly) {\n        delete (state as Configurable<DbxErrorComponentState>).message;\n      } else {\n        const entry = this.dbxErrorWidgetService.getErrorWidgetEntry(error.code);\n        const componentClass = entry?.errorComponentClass;\n\n        if (componentClass != null) {\n          state = {\n            ...state,\n            viewType: 'custom',\n            customView: {\n              componentClass,\n              data: error\n            }\n          };\n        }\n      }\n\n      result = state;\n    }\n\n    return result;\n  });\n\n  readonly viewTypeSignal = computed(() => this.stateSignal().viewType);\n  readonly isDefaultErrorSignal = computed(() => this.stateSignal().isDefaultError);\n  readonly messageSignal = computed(() => this.stateSignal().message);\n  readonly customViewSignal = computed(() => this.stateSignal().customView);\n\n  setError(error: Maybe<ErrorInput>) {\n    this._errorOverrideSignal.set(error);\n  }\n\n  openErrorPopover(event: DbxErrorViewButtonEvent) {\n    const error = this.stateSignal().error;\n\n    if (error != null) {\n      const popoverRef = DbxErrorPopoverComponent.openPopover(this.popoverService, {\n        origin: event.origin,\n        error\n      });\n\n      this.popoverOpened.emit(popoverRef);\n    }\n  }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { MatProgressBar, type ProgressBarMode } from '@angular/material/progress-bar';\nimport { MatProgressSpinner, type ProgressSpinnerMode } from '@angular/material/progress-spinner';\nimport { type Maybe } from '@dereekb/util';\nimport { NgClass } from '@angular/common';\n\n/**\n * Default diameter in pixels for the progress spinner.\n */\nexport const DEFAULT_LOADING_PROGRESS_DIAMETER = 96;\n\n/**\n * Renders a Material progress spinner or progress bar to indicate loading.\n *\n * Supports both linear (bar) and circular (spinner) modes with configurable\n * diameter and optional hint text below the indicator. To color the indicator,\n * apply `[dbxColor]` directly on the host — its `dbx-loading-progress.dbx-color`\n * SCSS maps the indicator color to the supplied token. Without `[dbxColor]` the\n * indicator uses the Material default color.\n *\n * @dbxWebComponent\n * @dbxWebSlug loading-progress\n * @dbxWebCategory feedback\n * @dbxWebRelated loading, basic-loading\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-loading-progress></dbx-loading-progress>\n * ```\n *\n * @example\n * ```html\n * <dbx-loading-progress mode=\"bar\" dbxColor=\"accent\"></dbx-loading-progress>\n * ```\n */\n@Component({\n  selector: 'dbx-loading-progress',\n  template: `\n    <div class=\"loading-progress-view\" role=\"status\" [attr.aria-label]=\"text() || 'Loading'\">\n      <span class=\"loading-progress-view-indicator\">\n        @switch (linear()) {\n          @case (true) {\n            <mat-progress-bar [mode]=\"bmodeSignal()\" [bufferValue]=\"bufferValue()\" [value]=\"value()\" style=\"margin: auto;\"></mat-progress-bar>\n          }\n          @default {\n            <mat-progress-spinner [diameter]=\"diameterSignal()\" [mode]=\"smodeSignal()\" [value]=\"value()\" style=\"margin: auto;\"></mat-progress-spinner>\n          }\n        }\n      </span>\n      @if (text()) {\n        <div class=\"dbx-loading-progress-hint dbx-hint dbx-small\" [ngClass]=\"{ 'text-center': !linear() }\" aria-hidden=\"true\">{{ text() }}</div>\n      }\n    </div>\n  `,\n  imports: [MatProgressBar, MatProgressSpinner, NgClass]\n})\nexport class DbxLoadingProgressComponent {\n  readonly defaultDiameter = DEFAULT_LOADING_PROGRESS_DIAMETER;\n\n  readonly diameter = input<Maybe<number>>(this.defaultDiameter);\n\n  readonly text = input<Maybe<string>>();\n  readonly linear = input<Maybe<boolean>>();\n  readonly mode = input<ProgressBarMode | ProgressSpinnerMode>('indeterminate');\n  readonly value = input<Maybe<number>>();\n  readonly bufferValue = input<Maybe<number>>();\n\n  readonly bmodeSignal = computed(() => this.mode());\n  readonly smodeSignal = computed(() => this.mode() as ProgressSpinnerMode);\n\n  readonly diameterSignal = computed(() => this.diameter() || this.defaultDiameter);\n}\n","import { Component, ElementRef, input, computed, viewChild, type Signal } from '@angular/core';\nimport { type ProgressBarMode } from '@angular/material/progress-bar';\nimport { type ErrorInput, isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { checkNgContentWrapperHasContent } from '@dereekb/dbx-core';\nimport { type ProgressSpinnerMode } from '@angular/material/progress-spinner';\nimport { DbxErrorComponent } from '../error/error.component';\nimport { DbxLoadingProgressComponent } from './loading-progress.component';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { type DbxLoadingIsLoadingOrProgress, type DbxLoadingProgress } from './loading';\n\n/**\n * Visual state of a {@link DbxBasicLoadingComponent}.\n *\n * - `none` — waiting for initial input (no loading or error yet)\n * - `loading` — spinner/progress bar is visible\n * - `content` — loading complete, projected content is shown\n * - `error` — an error occurred, error view is shown\n */\nexport type LoadingComponentState = 'none' | 'loading' | 'content' | 'error';\n\n/**\n * Low-level loading component that renders a spinner or progress bar, error state, and projected content.\n *\n * Prefer using {@link DbxLoadingComponent} (`<dbx-loading>`) which wraps this component with\n * support for {@link LoadingContext} streams.\n *\n * @dbxWebComponent\n * @dbxWebSlug basic-loading\n * @dbxWebCategory feedback\n * @dbxWebRelated loading, loading-progress, error\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-basic-loading [loading]=\"true\"><p>Content</p></dbx-basic-loading>\n * ```\n *\n * @example\n * ```html\n * <dbx-basic-loading [loading]=\"true\" dbxColor=\"accent\" text=\"Loading data...\">\n *   <p>Content appears here when loading is false.</p>\n * </dbx-basic-loading>\n * ```\n */\n@Component({\n  selector: 'dbx-basic-loading',\n  templateUrl: './basic-loading.component.html',\n  imports: [DbxErrorComponent, DbxLoadingProgressComponent, NgTemplateOutlet]\n})\nexport class DbxBasicLoadingComponent {\n  readonly customError = viewChild<string, Maybe<ElementRef>>('customError', { read: ElementRef });\n  readonly customLoading = viewChild<string, Maybe<ElementRef>>('customLoading', { read: ElementRef });\n\n  readonly diameter = input<Maybe<number>>();\n  readonly mode = input<Maybe<ProgressBarMode | ProgressSpinnerMode>>();\n  readonly text = input<Maybe<string>>();\n  readonly linear = input<Maybe<boolean>>(false);\n\n  readonly show = input<Maybe<boolean>>(true);\n  readonly loading = input<Maybe<DbxLoadingIsLoadingOrProgress>>();\n  readonly error = input<Maybe<ErrorInput>>();\n\n  readonly loadingProgressSignal = computed(() => {\n    const loading = this.loading();\n    let result: Maybe<DbxLoadingProgress>;\n\n    if (typeof loading === 'number') {\n      result = loading;\n    }\n\n    return result;\n  });\n\n  readonly modeSignal: Signal<ProgressBarMode | ProgressSpinnerMode> = computed(() => {\n    const mode = this.mode();\n    const loadingProgress = this.loadingProgressSignal();\n\n    let result: ProgressBarMode | ProgressSpinnerMode;\n\n    if (mode) {\n      result = mode;\n    } else if (loadingProgress == null) {\n      result = 'indeterminate';\n    } else {\n      result = 'determinate';\n    }\n\n    return result;\n  });\n\n  readonly isLoadingSignal = computed(() => isDefinedAndNotFalse(this.loading()));\n\n  readonly stateSignal = computed<LoadingComponentState>(() => {\n    const loading = this.isLoadingSignal();\n    const error = this.error();\n    const show = this.show() ?? true; // default to true if not defined\n\n    let state: LoadingComponentState;\n\n    if (error) {\n      state = 'error';\n    } else if (loading == null) {\n      // If loading has not yet been defined and no error has occured, we're waiting for some input on loading or error.\n      state = 'none';\n    } else if (loading || !show) {\n      state = 'loading';\n    } else {\n      state = 'content';\n    }\n\n    return state;\n  });\n\n  readonly hasNoCustomErrorSignal = computed(() => !checkNgContentWrapperHasContent(this.customError()));\n  readonly hasNoCustomLoadingSignal = computed(() => !checkNgContentWrapperHasContent(this.customLoading()));\n}\n","@switch (stateSignal()) {\n  @case ('none') {\n    <!-- Loading -->\n    <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n  }\n  @case ('loading') {\n    <!-- Loading -->\n    <div role=\"status\" aria-live=\"polite\" [attr.aria-busy]=\"true\">\n      <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n    </div>\n  }\n  @case ('content') {\n    <!-- Content -->\n    <ng-content></ng-content>\n  }\n  @case ('error') {\n    <!-- Error -->\n    <div role=\"alert\" aria-live=\"assertive\">\n      <ng-container *ngTemplateOutlet=\"errorTemplate\"></ng-container>\n    </div>\n  }\n}\n\n<ng-template #loadingTemplate>\n  @if (hasNoCustomLoadingSignal()) {\n    <dbx-loading-progress [mode]=\"modeSignal()\" [value]=\"loadingProgressSignal()\" [text]=\"text()\" [linear]=\"linear()\" [diameter]=\"diameter()\"></dbx-loading-progress>\n  }\n  <div #customLoading>\n    <ng-content select=\"[loading]\"></ng-content>\n  </div>\n</ng-template>\n\n<ng-template #errorTemplate>\n  @if (hasNoCustomErrorSignal()) {\n    <dbx-error [error]=\"error()\"></dbx-error>\n  }\n  <div #customError>\n    <ng-content select=\"[error]\"></ng-content>\n  </div>\n  <ng-content select=\"[errorAction]\"></ng-content>\n</ng-template>\n","import { type Observable, shareReplay } from 'rxjs';\nimport { Component, input, computed, signal, type Signal } from '@angular/core';\nimport { type ProgressBarMode } from '@angular/material/progress-bar';\nimport { type LoadingContext, type LoadingContextEvent, type MaybeObservableOrValue, maybeValueFromObservableOrValue, switchMapMaybeLoadingContextStream } from '@dereekb/rxjs';\nimport { type ErrorInput, type Maybe } from '@dereekb/util';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { DbxBasicLoadingComponent } from './basic-loading.component';\nimport { type DbxLoadingIsLoadingOrProgress } from './loading';\n\n/**\n * Resolved loading and error state consumed by {@link DbxLoadingComponent} internally.\n */\nexport interface DbxLoadingComponentState {\n  readonly loading: DbxLoadingIsLoadingOrProgress;\n  readonly error: Maybe<ErrorInput>;\n}\n\n/**\n * Primary loading wrapper that shows a spinner/progress bar while data is being fetched,\n * then reveals projected content on completion, or displays an error state.\n *\n * Accepts a {@link LoadingContext} observable via the `context` input to automatically\n * track loading and error state from reactive streams. Also supports manual `loading`\n * and `error` inputs for simpler use cases.\n *\n * @dbxWebComponent\n * @dbxWebSlug loading\n * @dbxWebCategory feedback\n * @dbxWebRelated basic-loading, loading-progress, error\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-loading [state]=\"state$ | async\">Body</dbx-loading>\n * ```\n *\n * @example\n * ```html\n * <dbx-loading [state]=\"state$ | async\" text=\"Loading items...\">\n *   <dbx-list [state$]=\"state$\" [config]=\"listConfig\"></dbx-list>\n * </dbx-loading>\n * ```\n */\n@Component({\n  selector: 'dbx-loading',\n  template: `\n    <dbx-basic-loading [show]=\"show()\" [text]=\"text()\" [mode]=\"mode()\" [linear]=\"linear()\" [diameter]=\"diameter()\" [error]=\"stateSignal().error\" [loading]=\"stateSignal().loading\">\n      <ng-content loading select=\"[loading]\"></ng-content>\n      @if (showPaddingSignal()) {\n        <div class=\"dbx-loading-linear-done-padding\"></div>\n      }\n      <ng-content></ng-content>\n      <ng-content error select=\"[error]\"></ng-content>\n      <ng-content errorAction select=\"[errorAction]\"></ng-content>\n    </dbx-basic-loading>\n  `,\n  imports: [DbxBasicLoadingComponent]\n})\nexport class DbxLoadingComponent {\n  private readonly _contextOverrideSignal = signal<MaybeObservableOrValue<LoadingContext>>(undefined);\n\n  /**\n   * Whether or not to add padding to the linear presentation when linear is complete. This prevents the linear bar from pushing content around.\n   */\n  readonly padding = input<Maybe<boolean>>(false);\n  readonly show = input<Maybe<boolean>>();\n  readonly text = input<Maybe<string>>();\n  readonly mode = input<Maybe<ProgressBarMode>>();\n  readonly diameter = input<Maybe<number>>();\n  readonly linear = input<Maybe<boolean>>();\n  readonly loading = input<Maybe<DbxLoadingIsLoadingOrProgress>>();\n  readonly error = input<Maybe<ErrorInput>>();\n\n  readonly context = input<MaybeObservableOrValue<LoadingContext>>();\n\n  readonly contextSignal: Signal<MaybeObservableOrValue<LoadingContext>> = computed(() => {\n    const context = this.context();\n    return this._contextOverrideSignal() ?? context;\n  });\n\n  readonly contextStream$: Observable<Maybe<LoadingContextEvent>> = toObservable(this.contextSignal).pipe(maybeValueFromObservableOrValue(), switchMapMaybeLoadingContextStream(), shareReplay(1));\n  readonly contextStreamSignal = toSignal(this.contextStream$);\n\n  readonly stateSignal = computed<DbxLoadingComponentState>(() => {\n    const loading = this.loading();\n    const error = this.error();\n    const contextStreamEvent = this.contextStreamSignal();\n\n    let loadingState: DbxLoadingComponentState;\n\n    if (contextStreamEvent) {\n      loadingState = {\n        loading: contextStreamEvent.loading === true ? (contextStreamEvent.loadingProgress ?? true) : false,\n        error: contextStreamEvent.error\n      };\n    } else {\n      loadingState = {\n        loading: loading ?? false,\n        error: error\n      };\n    }\n\n    return loadingState;\n  });\n\n  readonly showPaddingSignal = computed(() => {\n    const linear = this.linear();\n    const padding = this.padding();\n    const loading = this.stateSignal()?.loading;\n    return linear && padding && !loading;\n  });\n\n  /**\n   * Sets/overrides the context directly.\n   *\n   * @param context - Context source to use as an override.\n   */\n  setContext(context: MaybeObservableOrValue<LoadingContext>) {\n    this._contextOverrideSignal.set(context);\n  }\n}\n","import { cleanLoadingContext, DbxActionContextStoreSourceInstance } from '@dereekb/dbx-core';\nimport { Directive, inject } from '@angular/core';\nimport { DbxLoadingComponent } from './loading.component';\n\n/**\n * Links a {@link DbxLoadingComponent} to a {@link DbxActionContextStoreSourceInstance} by forwarding its loading state.\n *\n * Apply to a `<dbx-loading>` element that is within an action context to automatically\n * reflect the action's loading state in the loading component.\n *\n * @dbxWebComponent\n * @dbxWebSlug action-loading-context\n * @dbxWebCategory action\n * @dbxWebRelated loading, action-snackbar\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <button [dbxActionLoadingContext]></button>\n * ```\n *\n * @example\n * ```html\n * <dbx-loading [state]=\"ctx.state$ | async\">\n *   <button [dbxAction]=\"saveAction\" dbxActionLoadingContext>Save</button>\n * </dbx-loading>\n * ```\n */\n@Directive({\n  selector: '[dbxActionLoadingContext]'\n})\nexport class DbxActionLoadingContextDirective {\n  readonly loadingComponent = inject(DbxLoadingComponent, { host: true });\n\n  readonly source = inject(DbxActionContextStoreSourceInstance);\n\n  private readonly _context = cleanLoadingContext({ obs: this.source.loadingState$ });\n\n  constructor() {\n    this.loadingComponent.setContext(this._context);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxBasicLoadingComponent } from './basic-loading.component';\nimport { DbxLoadingProgressComponent } from './loading-progress.component';\nimport { DbxLoadingComponent } from './loading.component';\nimport { DbxActionLoadingContextDirective } from './loading.action.directive';\n\nconst importsAndExports = [DbxLoadingComponent, DbxBasicLoadingComponent, DbxLoadingProgressComponent, DbxActionLoadingContextDirective];\n\n/**\n * Convenience NgModule that imports and exports all loading-related components and directives.\n *\n * Includes {@link DbxLoadingComponent}, {@link DbxBasicLoadingComponent},\n * {@link DbxLoadingProgressComponent}, and {@link DbxActionLoadingContextDirective}.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxLoadingModule {}\n","import { Directive } from '@angular/core';\n\n/**\n * Adds flexible spacing between sibling elements in a flex container.\n *\n * @dbxWebComponent\n * @dbxWebSlug spacer\n * @dbxWebCategory layout\n * @dbxWebRelated bar, button-spacer\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-spacer></dbx-spacer>\n * ```\n *\n * @example\n * ```html\n * <dbx-bar>\n *   <span>Title</span>\n *   <dbx-spacer></dbx-spacer>\n *   <button mat-button>Action</button>\n * </dbx-bar>\n * ```\n */\n@Directive({\n  selector: 'dbx-spacer, [dbxSpacer]',\n  host: {\n    class: 'dbx-spacer'\n  }\n})\nexport class DbxSpacerDirective {}\n","import { Component, type AfterViewInit, inject, computed } from '@angular/core';\nimport { filterMaybe, LoadingStateType } from '@dereekb/rxjs';\nimport { shareReplay, switchMap, startWith, Subject, of, filter, map } from 'rxjs';\nimport { MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\nimport { MS_IN_SECOND, type Maybe } from '@dereekb/util';\nimport { type DbxActionSnackbarDisplayConfig, type DbxActionSnackbarActionConfig } from './action.snackbar';\nimport { cleanSubscription, DbxActionDirective, type DbxActionSuccessHandlerFunction, DbxActionSourceDirective, DbxActionSuccessHandlerDirective, completeOnDestroy } from '@dereekb/dbx-core';\nimport { NgClass } from '@angular/common';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxButtonSpacerDirective } from '../../button/button.spacer.directive';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DbxSpacerDirective } from '../../layout/style/spacer.directive';\n\n/**\n * Renders the content of an action snackbar, including a message, optional close button,\n * and an optional interactive action (e.g. \"Undo\"). Automatically dismisses after the\n * configured duration or after the action completes successfully.\n *\n * This component is opened programmatically by {@link DbxActionSnackbarService} and is not used directly in templates.\n */\n@Component({\n  templateUrl: './action.snackbar.component.html',\n  imports: [NgClass, DbxActionSourceDirective, DbxActionSuccessHandlerDirective, DbxButtonComponent, DbxButtonSpacerDirective, DbxSpacerDirective, DbxActionDirective]\n})\nexport class DbxActionSnackbarComponent implements AfterViewInit {\n  readonly snackbarRef = inject(MatSnackBarRef<DbxActionSnackbarComponent>);\n  readonly snackbarData = inject<DbxActionSnackbarDisplayConfig>(MAT_SNACK_BAR_DATA);\n\n  private readonly _durationTimeout = completeOnDestroy(new Subject<void>());\n  private readonly _actionRef = this.snackbarData.action?.reference;\n\n  readonly sourceInstance$ = of(this._actionRef).pipe(\n    filterMaybe(),\n    map((x) => x?.sourceInstance)\n  );\n\n  readonly complete$ = this.sourceInstance$.pipe(\n    switchMap((x) => x.isSuccess$),\n    startWith(false),\n    shareReplay(1)\n  );\n\n  readonly loadingStateType$ = this.sourceInstance$.pipe(\n    switchMap((x) => x.loadingStateType$),\n    startWith(LoadingStateType.IDLE),\n    shareReplay(1)\n  );\n\n  readonly sourceInstanceSignal = toSignal(this.sourceInstance$);\n  readonly completeSignal = toSignal(this.complete$);\n  readonly loadingStateTypeSignal = toSignal(this.loadingStateType$);\n  readonly snackbarStatusClassSignal = computed(() => {\n    let classes = 'dbx-action-snackbar-';\n    const loadingStateType = this.loadingStateTypeSignal();\n\n    switch (loadingStateType) {\n      case LoadingStateType.ERROR:\n        classes += 'error';\n        break;\n      case LoadingStateType.SUCCESS:\n        classes += 'success';\n        break;\n      default:\n        classes += 'idle';\n        break;\n    }\n\n    return classes;\n  });\n\n  readonly button: Maybe<string> = this.snackbarData.action?.button ?? this.snackbarData.button;\n  readonly action: Maybe<DbxActionSnackbarActionConfig> = this.snackbarData.action;\n  readonly hasAction: boolean = Boolean(this.action?.reference);\n  readonly message: Maybe<string> = this.snackbarData.message;\n  readonly actionConfig: Maybe<DbxActionSnackbarActionConfig> = this.snackbarData.action;\n\n  constructor() {\n    // Subscribe and close if the duration is up and the action state is idle.\n    cleanSubscription(\n      this._durationTimeout\n        .pipe(\n          switchMap(() => this.loadingStateType$),\n          filter((x) => x === LoadingStateType.IDLE)\n        )\n        .subscribe(() => {\n          this.dismiss();\n        })\n    );\n  }\n\n  ngAfterViewInit(): void {\n    // Responsible for hiding itself if it has an action.\n    if (this.hasAction) {\n      setTimeout(\n        () => {\n          this._durationTimeout.next();\n        },\n        this.snackbarData.action?.duration ?? MS_IN_SECOND * 10\n      );\n    }\n  }\n\n  dismissAfterActionCompletes: DbxActionSuccessHandlerFunction = (): void => {\n    this.snackbarRef._dismissAfter(MS_IN_SECOND * 3);\n  };\n\n  dismiss = (): void => {\n    this.snackbarRef.dismiss();\n  };\n}\n","<div class=\"dbx-action-snackbar\" [ngClass]=\"snackbarStatusClassSignal()\">\n  <span>{{ message }}</span>\n  <dbx-spacer></dbx-spacer>\n  @switch (completeSignal()) {\n    @case (true) {\n      <dbx-button (buttonClick)=\"dismiss()\" color=\"accent\" icon=\"done\" text=\"Success\"></dbx-button>\n    }\n    @case (false) {\n      @if (hasAction) {\n        <dbx-action dbxActionValue [dbxActionSource]=\"sourceInstanceSignal()\" [dbxActionSuccessHandler]=\"dismissAfterActionCompletes\">\n          <dbx-button dbxActionButton color=\"warn\" [text]=\"button\"></dbx-button>\n        </dbx-action>\n        <dbx-button-spacer></dbx-button-spacer>\n      }\n      <dbx-button (buttonClick)=\"dismiss()\" color=\"accent\" icon=\"close\"></dbx-button>\n    }\n  }\n</div>\n","import { type DbxActionSnackbarEventMakeConfig } from './action.snackbar.service';\n\n/**\n * Built-in default snackbar message configurations for common action types\n * such as create, save, delete, merge, cancel, restore, and refresh.\n * Each type provides loading, success, and error messages.\n */\nexport const DBX_ACTION_SNACKBAR_DEFAULTS: DbxActionSnackbarEventMakeConfig = {\n  create: {\n    loading: {\n      message: 'Creating...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Created'\n    },\n    error: {\n      button: 'X',\n      message: 'Create Failed'\n    }\n  },\n  save: {\n    loading: {\n      message: 'Saving...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Saved'\n    },\n    error: {\n      button: 'X',\n      message: 'Save Failed'\n    }\n  },\n  merge: {\n    loading: {\n      message: 'Merging...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Merged'\n    },\n    error: {\n      button: 'X',\n      message: 'Merge Failed'\n    }\n  },\n  delete: {\n    loading: {\n      message: 'Deleting...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Deleted'\n    },\n    error: {\n      button: 'X',\n      message: 'Delete Failed'\n    }\n  },\n  cancel: {\n    loading: {\n      message: 'Cancelling...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Canceled'\n    },\n    error: {\n      button: 'X',\n      message: 'Cancel Failed'\n    }\n  },\n  restore: {\n    loading: {\n      message: 'Restoring...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Restored'\n    },\n    error: {\n      button: 'X',\n      message: 'Restore Failed'\n    }\n  },\n  refresh: {\n    loading: {\n      message: 'Refreshing...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Refreshed'\n    },\n    error: {\n      button: 'X',\n      message: 'Refresh Failed'\n    }\n  },\n  do: {\n    loading: {\n      message: 'Doing...'\n    },\n    success: {\n      button: 'Ok',\n      message: 'Done'\n    },\n    error: {\n      button: 'X',\n      message: 'Failed'\n    }\n  }\n};\n","import { type DbxActionContextSourceReference } from '@dereekb/dbx-core';\nimport { type Configurable, type Milliseconds, type Maybe, type GetterOrValue, getValueFromGetter, type Getter } from '@dereekb/util';\nimport { type DbxActionSnackbarDisplayConfig, type DbxActionSnackbarEvent } from './action.snackbar';\n\n/**\n * Input passed to a snackbar display config generator function, containing the\n * action event and optional undo configuration.\n */\nexport interface DbxActionSnackbarGeneratorInput<T = unknown, O = unknown> {\n  /**\n   * The action snackbar event that triggered the generator.\n   */\n  readonly event: DbxActionSnackbarEvent<O>;\n  /**\n   * Optional undo action configuration, only applied on success events.\n   */\n  readonly undo?: Maybe<DbxActionSnackbarGeneratorUndoInput<T, O>>;\n}\n\n/**\n * Input for configuring an undo action on the snackbar. Can be either a simple getter\n * that returns the action source reference, or a full config object with duration.\n */\nexport type DbxActionSnackbarGeneratorUndoInput<T = unknown, O = unknown> = Getter<DbxActionContextSourceReference<T, O>> | DbxActionSnackbarGeneratorUndoInputConfig<T, O>;\n\n/**\n * Extended undo configuration that specifies how long to show the undo action\n * and how to obtain the undo action source reference.\n */\nexport interface DbxActionSnackbarGeneratorUndoInputConfig<T = unknown, O = unknown> {\n  /**\n   * How long the undo button remains visible in the snackbar.\n   */\n  readonly duration?: Milliseconds;\n  /**\n   * Factory that returns the action context source reference to trigger for undo.\n   */\n  readonly getUndoAction: Getter<DbxActionContextSourceReference<T, O>>;\n}\n\n/**\n * Function that produces a snackbar display configuration from a generator input.\n * Returns `undefined` to suppress the snackbar for a given event.\n */\nexport type DbxActionSnackbarDisplayConfigGeneratorFunction = <T = unknown, O = unknown>(input: DbxActionSnackbarGeneratorInput<T, O>) => Maybe<DbxActionSnackbarDisplayConfig<T, O>>;\n\n/**\n * Configuration for generating snackbar display configs per loading state type.\n * Each property maps a loading state (idle, loading, success, error) to its message configuration.\n */\nexport interface DbxMakeActionSnackbarGeneratorConfiguration {\n  /**\n   * Configuration shown when the action is idle.\n   */\n  readonly idle?: GetterOrValue<DbxMakeActionSnackbarGeneratorEventConfiguration>;\n  /**\n   * Configuration shown while the action is loading.\n   */\n  readonly loading?: GetterOrValue<DbxMakeActionSnackbarGeneratorEventConfiguration>;\n  /**\n   * Configuration shown when the action succeeds.\n   */\n  readonly success?: GetterOrValue<DbxMakeActionSnackbarGeneratorEventConfiguration>;\n  /**\n   * Configuration shown when the action fails.\n   */\n  readonly error?: GetterOrValue<DbxMakeActionSnackbarGeneratorEventConfiguration>;\n}\n\n/**\n * Per-event snackbar configuration that extends the base display config with undo button text.\n * The `action` field from {@link DbxActionSnackbarDisplayConfig} is omitted because undo actions\n * are configured separately via the generator input.\n */\nexport interface DbxMakeActionSnackbarGeneratorEventConfiguration extends Omit<DbxActionSnackbarDisplayConfig, 'action'> {\n  /**\n   * Label for the undo button. Defaults to \"Undo\" if not specified.\n   */\n  readonly undoButtonText?: string;\n}\n\n/**\n * Creates a generator function that produces snackbar display configurations based on\n * the current loading state type. If an undo input is provided, an undo action button\n * is included in the generated config.\n *\n * @param config - Per-state message configurations (idle, loading, success, error).\n * @returns Maps generator input to a snackbar display configuration.\n *\n * @example\n * ```typescript\n * const generator = makeDbxActionSnackbarDisplayConfigGeneratorFunction({\n *   loading: { message: 'Processing...' },\n *   success: { message: 'Done!', button: 'Ok' },\n *   error: { message: 'Failed', button: 'X' }\n * });\n * ```\n * @__NO_SIDE_EFFECTS__\n */\nexport function makeDbxActionSnackbarDisplayConfigGeneratorFunction(config: DbxMakeActionSnackbarGeneratorConfiguration): DbxActionSnackbarDisplayConfigGeneratorFunction {\n  return <T = unknown, O = unknown>(input: DbxActionSnackbarGeneratorInput<T, O>) => {\n    const { event, undo: undoInput } = input;\n    const type = event.type;\n    const eventConfigGetterOrValue = config[type];\n    const eventConfig = eventConfigGetterOrValue && getValueFromGetter(eventConfigGetterOrValue);\n\n    let result: Maybe<DbxActionSnackbarDisplayConfig<T, O>>;\n\n    if (eventConfig) {\n      const { undoButtonText } = eventConfig;\n      const building: Configurable<DbxActionSnackbarDisplayConfig<T, O>> = {\n        button: eventConfig.button,\n        message: eventConfig.message,\n        snackbar: eventConfig.snackbar\n      };\n\n      if (undoInput) {\n        let reference: DbxActionContextSourceReference<T, O>;\n\n        if (typeof undoInput === 'object') {\n          reference = undoInput.getUndoAction();\n        } else {\n          reference = getValueFromGetter(undoInput);\n        }\n\n        if (reference) {\n          building.action = {\n            button: undoButtonText ?? 'Undo',\n            reference\n          };\n        } else {\n          console.error('Expected action source reference was not provided to undo...');\n        }\n      }\n\n      result = building;\n    }\n\n    return result;\n  };\n}\n","import { DbxActionSnackbarComponent } from './action.snackbar.component';\nimport { DBX_ACTION_SNACKBAR_DEFAULTS } from './action.snackbar.default';\nimport { Service, InjectionToken, type Type, inject } from '@angular/core';\nimport { MatSnackBar, type MatSnackBarConfig, type MatSnackBarRef } from '@angular/material/snack-bar';\nimport { type Milliseconds, type Maybe, mergeObjects, MS_IN_SECOND } from '@dereekb/util';\nimport { type DbxActionSnackbarDisplayConfig, type DbxActionSnackbarType } from './action.snackbar';\nimport { type DbxActionSnackbarGeneratorInput, type DbxMakeActionSnackbarGeneratorConfiguration, makeDbxActionSnackbarDisplayConfigGeneratorFunction } from './action.snackbar.generator';\n\n/**\n * Injection token for providing a custom {@link DbxActionSnackbarServiceConfig}.\n */\nexport const DBX_ACTION_SNACKBAR_SERVICE_CONFIG = new InjectionToken('DbxActionSnackbarServiceConfig');\n\n/**\n * Default snackbar display duration in milliseconds (4 seconds).\n */\nexport const DEFAULT_SNACKBAR_DIRECTIVE_DURATION = MS_IN_SECOND * 4;\n\n/**\n * Maps snackbar type keys (e.g. \"save\", \"delete\") to their generator configurations\n * for producing display configs per loading state.\n */\nexport interface DbxActionSnackbarEventMakeConfig {\n  [key: string]: DbxMakeActionSnackbarGeneratorConfiguration;\n}\n\n/**\n * Root-level configuration for the snackbar service, controlling the component class,\n * positioning, default durations, and per-type message configurations.\n */\nexport interface DbxActionSnackbarServiceConfig<C = unknown> {\n  /**\n   * Component class to render inside the snackbar. Defaults to {@link DbxActionSnackbarComponent}.\n   */\n  readonly componentClass: Type<C>;\n  /**\n   * Snackbar positioning overrides.\n   */\n  readonly snackbar?: Pick<MatSnackBarConfig, 'horizontalPosition' | 'verticalPosition'>;\n  /**\n   * Default duration for snackbars without an action.\n   */\n  readonly defaultDuration?: Milliseconds;\n  /**\n   * Default duration for snackbars that include an undo action.\n   */\n  readonly defaultUndoDuration?: Milliseconds;\n  /**\n   * Per-type message configurations (e.g. \"save\", \"create\", \"delete\").\n   */\n  readonly eventTypeConfigs: DbxActionSnackbarEventMakeConfig;\n}\n\n/**\n * Application-wide service for opening action snackbars and generating display configurations\n * from registered type presets. Merges user-provided config with built-in defaults.\n *\n * @example\n * ```typescript\n * const service = inject(DbxActionSnackbarService);\n * service.openSnackbar({ message: 'Item saved!', button: 'Ok' });\n * ```\n */\n@Service()\nexport class DbxActionSnackbarService<C = DbxActionSnackbarComponent> {\n  readonly matSnackBar = inject(MatSnackBar);\n\n  readonly config: DbxActionSnackbarServiceConfig<C> = ((inputConfig) => {\n    return {\n      ...inputConfig,\n      componentClass: inputConfig.componentClass ?? (DbxActionSnackbarComponent as unknown as Type<C>),\n      defaultDuration: inputConfig.defaultDuration || DEFAULT_SNACKBAR_DIRECTIVE_DURATION,\n      eventTypeConfigs: mergeObjects([DBX_ACTION_SNACKBAR_DEFAULTS, inputConfig.eventTypeConfigs]) as DbxActionSnackbarEventMakeConfig\n    };\n  })(inject<Partial<DbxActionSnackbarServiceConfig<C>>>(DBX_ACTION_SNACKBAR_SERVICE_CONFIG, { optional: true }) ?? {});\n\n  get componentClass(): Type<C> {\n    return this.config.componentClass;\n  }\n\n  get eventTypeConfigs(): DbxActionSnackbarEventMakeConfig {\n    return this.config.eventTypeConfigs;\n  }\n\n  /**\n   * Opens a new snackbar with the given display configuration, merging with global defaults.\n   *\n   * @param config - Display configuration for the snackbar content and behavior.\n   * @returns A reference to the opened Material snackbar.\n   */\n  openSnackbar<T = unknown, O = unknown>(config: DbxActionSnackbarDisplayConfig<T, O>): MatSnackBarRef<C> {\n    const { snackbar: inputSnackbarConfig } = config;\n    const { snackbar: defaultSnackbarConfig, defaultDuration } = this.config;\n\n    const matSnackbarConfig: MatSnackBarConfig = {\n      ...defaultSnackbarConfig,\n      ...inputSnackbarConfig,\n      data: config\n    };\n\n    const duration = config.action?.duration ?? matSnackbarConfig.duration ?? defaultDuration ?? DEFAULT_SNACKBAR_DIRECTIVE_DURATION;\n\n    if (config.action) {\n      // Set the duration on the action and create an updated config for the snackbar data\n      const updatedConfig: DbxActionSnackbarDisplayConfig<T, O> = {\n        ...config,\n        action: {\n          ...config.action,\n          duration\n        }\n      };\n\n      matSnackbarConfig.data = updatedConfig;\n    } else {\n      // The snackbar does not close here. The duration is passed to the component and it will close it.\n      matSnackbarConfig.duration = duration;\n    }\n\n    return this.matSnackBar.openFromComponent(this.componentClass, matSnackbarConfig);\n  }\n\n  /**\n   * Generates a snackbar display configuration for the given type and event input,\n   * using the registered event type configs. Returns `undefined` if no config is found for the type.\n   *\n   * @param type - The snackbar type key (e.g. \"save\", \"delete\"), or undefined to use \"none\".\n   * @param input - The generator input containing the event and optional undo configuration.\n   * @returns The generated display configuration, or `undefined` if no config is registered for the given type.\n   */\n  generateDisplayConfig<T = unknown, O = unknown>(type: Maybe<DbxActionSnackbarType>, input: DbxActionSnackbarGeneratorInput<T, O>): Maybe<DbxActionSnackbarDisplayConfig<T, O>> {\n    const configForType = this.eventTypeConfigs[type ?? 'none'];\n    let result: Maybe<DbxActionSnackbarDisplayConfig<T, O>>;\n\n    if (configForType) {\n      result = makeDbxActionSnackbarDisplayConfigGeneratorFunction(configForType)(input);\n    }\n\n    return result;\n  }\n}\n","import { Directive, type OnInit, inject, input } from '@angular/core';\nimport { cleanSubscriptionWithLockSet, DbxActionContextStoreSourceInstance, transformEmptyStringInputToUndefined } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxActionSnackbarDisplayConfig, type DbxActionSnackbarEvent, type DbxActionSnackbarType } from './action.snackbar';\nimport { DbxActionSnackbarService } from './action.snackbar.service';\nimport { type DbxActionSnackbarDisplayConfigGeneratorFunction, type DbxActionSnackbarGeneratorInput, type DbxActionSnackbarGeneratorUndoInput } from './action.snackbar.generator';\nimport { type LoadingState, LoadingStateType, loadingStateType } from '@dereekb/rxjs';\n\n/**\n * Displays a Material snackbar notification when the parent action transitions between loading states\n * (loading, success, error). Supports built-in message presets via `dbxActionSnackbarDefault` and\n * custom generator functions via the `dbxActionSnackbar` input.\n *\n * @dbxWebComponent\n * @dbxWebSlug action-snackbar\n * @dbxWebCategory action\n * @dbxWebRelated action-snackbar-error, action-confirm, error-snackbar\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <div [dbxActionSnackbar]=\"fn\"></div>\n * ```\n *\n * @example\n * ```html\n * <button [dbxAction]=\"saveAction\" [dbxActionSnackbar]=\"snackbarFn\">Save</button>\n * ```\n */\n@Directive({\n  selector: '[dbxActionSnackbar]'\n})\nexport class DbxActionSnackbarDirective<T = unknown, O = unknown> implements OnInit {\n  readonly source = inject(DbxActionContextStoreSourceInstance<T, O>, { host: true });\n  readonly dbxActionSnackbarService = inject(DbxActionSnackbarService);\n\n  readonly dbxActionSnackbarDefault = input<Maybe<DbxActionSnackbarType>>();\n  readonly dbxActionSnackbarUndo = input<Maybe<DbxActionSnackbarGeneratorUndoInput<T, O>>>();\n  readonly dbxActionSnackbar = input<Maybe<DbxActionSnackbarDisplayConfigGeneratorFunction>, Maybe<DbxActionSnackbarDisplayConfigGeneratorFunction> | ''>(undefined, { transform: transformEmptyStringInputToUndefined });\n\n  protected readonly _sub = cleanSubscriptionWithLockSet({ lockSet: this.source.lockSet });\n\n  ngOnInit(): void {\n    this._sub.setSub(\n      this.source\n        .pipeStore((store) => store.loadingState$)\n        .subscribe((loadingState: LoadingState<O>) => {\n          const event: DbxActionSnackbarEvent<O> = { value: loadingState.value, error: loadingState.error, type: loadingStateType(loadingState) };\n\n          const config = this.buildConfigurationForEvent(event);\n\n          if (config) {\n            this.showSnackbarForConfiguration(config, event);\n          }\n        })\n    );\n  }\n\n  protected buildConfigurationForEvent(event: DbxActionSnackbarEvent<O>): Maybe<DbxActionSnackbarDisplayConfig<T, O>> {\n    const input: DbxActionSnackbarGeneratorInput<T, O> = {\n      event,\n      undo: event.type === LoadingStateType.SUCCESS ? this.dbxActionSnackbarUndo() : undefined // only show undo on success.\n    };\n\n    const snackbarFunction = this.dbxActionSnackbar();\n    return snackbarFunction ? snackbarFunction(input) : this.dbxActionSnackbarService.generateDisplayConfig(this.dbxActionSnackbarDefault(), input);\n  }\n\n  protected showSnackbarForConfiguration(config: DbxActionSnackbarDisplayConfig<T, O>, _event: DbxActionSnackbarEvent<O>) {\n    this.dbxActionSnackbarService.openSnackbar(config);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxActionSnackbarDirective } from './action.snackbar.directive';\nimport { DbxActionSnackbarComponent } from './action.snackbar.component';\n\nconst importsAndExports = [DbxActionSnackbarComponent, DbxActionSnackbarDirective];\n\n/**\n * Bundles the snackbar component and directive for convenient import.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxActionSnackbarModule {}\n","import { Directive, inject } from '@angular/core';\nimport { DbxActionContextStoreSourceInstance, cleanSubscription } from '@dereekb/dbx-core';\nimport { DbxErrorComponent } from './error.component';\n\n/**\n * Links a {@link DbxErrorComponent} to an action context, automatically displaying the action's error state.\n *\n * Place this directive on a `<dbx-error>` element within an action context to have errors\n * from the action automatically forwarded to the error display.\n *\n * @example\n * ```html\n * <dbx-error dbxActionError></dbx-error>\n * ```\n */\n@Directive({\n  selector: '[dbxActionError]'\n})\nexport class DbxActionErrorDirective {\n  readonly error = inject(DbxErrorComponent, { host: true });\n  readonly source = inject(DbxActionContextStoreSourceInstance);\n\n  constructor() {\n    cleanSubscription(\n      this.source.error$.subscribe((error) => {\n        this.error.setError(error);\n      })\n    );\n  }\n}\n","import { Component } from '@angular/core';\nimport { DbxActionButtonDirective } from '@dereekb/dbx-core';\nimport { AbstractDialogDirective } from '../../interaction/dialog/abstract.dialog.directive';\nimport { DbxDialogContentDirective } from '../../interaction/dialog/dialog.content.directive';\nimport { type DbxPromptConfirmConfig, DbxPromptConfirmComponent } from '../../interaction/prompt/prompt.confirm.component';\nimport { DbxErrorComponent } from '../../error/error.component';\nimport { DbxActionErrorDirective } from '../../error/error.action.directive';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxButtonSpacerDirective } from '../../button/button.spacer.directive';\n\n/**\n * Possible outcomes of the transition safety dialog.\n *\n * - `'success'` - The action completed successfully; allow the transition.\n * - `'stay'` - The user chose to stay on the current page.\n * - `'discard'` - The user chose to discard changes and allow the transition.\n * - `'none'` - The dialog was closed programmatically without a user decision.\n */\nexport type DbxActionTransitionSafetyDialogResult = 'success' | 'stay' | 'discard' | 'none';\n\n/**\n * Confirmation dialog displayed by {@link DbxActionTransitionSafetyDirective} when the user\n * attempts to navigate away with unsaved changes. Offers options to stay on the page,\n * leave without saving, or save before leaving.\n */\n@Component({\n  template: `\n    <dbx-dialog-content>\n      <dbx-prompt-confirm [config]=\"config\" (confirm)=\"confirm()\" (cancel)=\"cancel()\">\n        <dbx-error dbxActionError></dbx-error>\n        <dbx-button buttons [raised]=\"true\" color=\"primary\" text=\"Save Changes\" dbxActionButton></dbx-button>\n        <dbx-button-spacer buttons></dbx-button-spacer>\n      </dbx-prompt-confirm>\n    </dbx-dialog-content>\n  `,\n  imports: [DbxDialogContentDirective, DbxPromptConfirmComponent, DbxErrorComponent, DbxActionErrorDirective, DbxButtonComponent, DbxActionButtonDirective, DbxButtonSpacerDirective]\n})\nexport class DbxActionUIRouterTransitionSafetyDialogComponent extends AbstractDialogDirective {\n  readonly config: DbxPromptConfirmConfig = {\n    title: 'Unsaved Changes',\n    prompt: 'You have unsaved changes on this page.',\n    confirmText: 'Stay',\n    cancelText: 'Leave without saving'\n  };\n\n  confirm(): void {\n    this.dialogRef.close('stay');\n  }\n\n  cancel(): void {\n    this.dialogRef.close('discard');\n  }\n}\n","import { Directive, type OnInit, type OnDestroy, ViewContainerRef, inject, input, effect } from '@angular/core';\nimport { MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { type HookResult, type Transition, TransitionService } from '@uirouter/core';\nimport { type Observable, of, race, delay, first, map, mergeMap, tap, BehaviorSubject, combineLatest, firstValueFrom } from 'rxjs';\nimport { DbxActionContextStoreSourceInstance, canTriggerAction, isIdleActionState, completeOnDestroy } from '@dereekb/dbx-core';\nimport { type DbxActionTransitionSafetyDialogResult, DbxActionUIRouterTransitionSafetyDialogComponent } from './transition.safety.dialog.component';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Strategy for handling route transitions when the action has unsaved changes.\n *\n * - `'none'` - Allow the transition without any prompt.\n * - `'dialog'` - Always show a confirmation dialog and act based on the user's choice.\n * - `'auto'` - Attempt to auto-trigger the action if possible. If modified but not triggerable, fall back to showing a dialog. Best used with an auto-save mechanism.\n */\nexport type DbxActionTransitionSafetyType = 'none' | 'dialog' | 'auto';\n\n/**\n * Prevents UI Router transitions when the action has unsaved changes. Depending on the\n * configured safety type, it can auto-trigger the action, show a confirmation dialog,\n * or allow the transition without intervention.\n *\n * NOTE: This directive only works with UI-Router (not Angular Router).\n *\n * @dbxWebComponent\n * @dbxWebSlug action-transition-safety\n * @dbxWebCategory action\n * @dbxWebRelated action-confirm\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <form [dbxActionTransitionSafety]></form>\n * ```\n *\n * @example\n * ```html\n * <form [dbxAction]=\"formAction\" dbxActionTransitionSafety>...</form>\n * ```\n */\n@Directive({\n  selector: '[dbxActionTransitionSafety]'\n})\nexport class DbxActionTransitionSafetyDirective<T, O> implements OnInit, OnDestroy {\n  protected readonly _safetyType = completeOnDestroy(new BehaviorSubject<Maybe<DbxActionTransitionSafetyType>>(undefined));\n\n  readonly dbxActionTransitionSafety = input<DbxActionTransitionSafetyType>();\n\n  protected readonly transitionService = inject(TransitionService);\n  protected readonly viewContainerRef = inject(ViewContainerRef);\n  protected readonly dialog = inject(MatDialog);\n\n  readonly source = inject(DbxActionContextStoreSourceInstance<T, O>);\n  readonly safetyType$ = this._safetyType.pipe(map((x) => x ?? 'dialog'));\n\n  protected readonly _dbxActionTransitionSafetyUpdateEffect = effect(() => this._safetyType.next(this.dbxActionTransitionSafety()));\n\n  private _currentDialogRef?: MatDialogRef<DbxActionUIRouterTransitionSafetyDialogComponent, DbxActionTransitionSafetyDialogResult>;\n  private stopWatchingTransition?: () => void;\n\n  private checkIsDestroyed(): boolean {\n    return !this.stopWatchingTransition;\n  }\n\n  ngOnInit(): void {\n    this.stopWatchingTransition = this.transitionService.onStart({}, (transition: Transition) => {\n      return this._handleOnBeforeTransition(transition);\n    }) as () => void;\n  }\n\n  ngOnDestroy(): void {\n    if (this.stopWatchingTransition) {\n      this.stopWatchingTransition();\n      delete this.stopWatchingTransition;\n    }\n\n    this._closeDialog();\n  }\n\n  protected _handleOnBeforeTransition(transition: Transition): HookResult {\n    type DbxActionTransitionSafetyRaceResult = [boolean | undefined, HookResult | undefined];\n\n    return firstValueFrom(\n      combineLatest([this.source.isModified$, this.safetyType$]).pipe(\n        first(),\n        mergeMap(([isModified, safetyType]) => {\n          return isModified\n            ? race([\n                // Watch for success to occur. At that point, close everything.\n                this.source.success$.pipe(\n                  first(),\n                  map(() => [true, undefined] as DbxActionTransitionSafetyRaceResult)\n                ),\n                this._handleIsModifiedState(transition, safetyType).pipe(\n                  first(),\n                  map((x) => [undefined, x] as DbxActionTransitionSafetyRaceResult)\n                )\n              ]).pipe(\n                map(([saveSuccess, handleResult]: DbxActionTransitionSafetyRaceResult) => {\n                  return saveSuccess ? true : handleResult;\n                }),\n                tap(() => this._closeDialog()), // Close dialog if it is still open.\n                delay(10) // Delay to allow dialog to close before transition.\n              )\n            : of(true);\n        })\n      )\n    ).then((x) => x); // Resolve/Flatten potential promise result.\n  }\n\n  protected _handleIsModifiedState(transition: Transition, safetyType: DbxActionTransitionSafetyType): Observable<HookResult> {\n    let obs: Observable<HookResult>;\n\n    // console.log('Safety type: ', safetyType);\n\n    switch (safetyType) {\n      case 'none':\n        obs = of(true); // Do nothing.\n        break;\n      case 'auto':\n        obs = this._autoTrigger(transition);\n        break;\n      default:\n      case 'dialog':\n        obs = this._showDialog(transition);\n        break;\n    }\n\n    return obs;\n  }\n\n  private _autoTrigger(transition: Transition): Observable<HookResult> {\n    return this.source.pipeStore((store) =>\n      store.state$.pipe(\n        delay(20), // Prevent racing with auto-trigger.\n        first(),\n        mergeMap((state) => {\n          if (\n            isIdleActionState(state.actionState) && // If we're in an idle state, get ready to trigger it.\n            canTriggerAction(state)\n          ) {\n            store.trigger(); // Try and trigger it.\n          }\n\n          // Watch for errors. If an error occurs, show the dialog.\n          // Success will cause the race in _handleOnBeforeTransition() to trigger and close everything.\n          return store.rejected$.pipe(\n            first(),\n            mergeMap(() => this._showDialog(transition))\n          );\n        })\n      )\n    );\n  }\n\n  private _showDialog(_transition: Transition): Observable<HookResult> {\n    let result: Observable<HookResult>;\n\n    if (this.checkIsDestroyed()) {\n      result = of(true);\n    } else {\n      if (!this._currentDialogRef) {\n        this._currentDialogRef = this.dialog.open(DbxActionUIRouterTransitionSafetyDialogComponent, {\n          viewContainerRef: this.viewContainerRef\n        });\n      }\n\n      result = this._currentDialogRef.afterClosed().pipe(\n        first(),\n        map((dialogResult: DbxActionTransitionSafetyDialogResult | undefined = 'stay') => {\n          // Default to Stay if the user clicks outside.\n          let outcome: boolean;\n          switch (dialogResult) {\n            case 'discard':\n            case 'success':\n            case 'none':\n              outcome = true;\n              break;\n            case 'stay':\n              outcome = false;\n              break;\n          }\n          return outcome;\n        })\n      );\n    }\n\n    return result;\n  }\n\n  private _closeDialog(): void {\n    if (this._currentDialogRef) {\n      this._currentDialogRef.close('none');\n    }\n\n    this._currentDialogRef = undefined;\n  }\n}\n","import { Directive, inject, input, booleanAttribute } from '@angular/core';\nimport { AbstractPromptConfirmDirective } from '../interaction/prompt/prompt.confirm.directive';\nimport { type DbxPromptConfirmConfig } from '../interaction/prompt/prompt.confirm.component';\nimport { cleanSubscriptionWithLockSet, DbxActionContextStoreSourceInstance, transformEmptyStringInputToUndefined } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Configuration for the action confirmation dialog, extending the base prompt configuration\n * with an optional value to pass to the action when confirmed.\n */\nexport interface DbxActionConfirmConfig<T = unknown> extends DbxPromptConfirmConfig {\n  /**\n   * Value to pass to the action's ready state when the user confirms.\n   */\n  readonly readyValue?: T;\n  /**\n   * Whether to confirm the action immediately instead of showing the dialog.\n   *\n   * Useful for actions that need no confirmation but are rendered by the same template as actions that do,\n   * and for passing a readyValue through without prompting.\n   *\n   * Defaults to false.\n   */\n  readonly autoConfirm?: boolean;\n}\n\n/**\n * Displays a confirmation dialog when the action is triggered. If the user confirms,\n * the configured ready value is passed to the action. If the user cancels, the action is rejected.\n *\n * A config with `autoConfirm` true shows no dialog and marks the action ready immediately. This lets a\n * template bind the same input for actions that need confirmation and actions that do not.\n *\n * This directive works with action triggering only, not button clicks.\n * For button-based confirmation, use an appPromptConfirmButton directive instead.\n *\n * @dbxWebComponent\n * @dbxWebSlug action-confirm\n * @dbxWebCategory action\n * @dbxWebRelated action-snackbar, prompt-confirm\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <div [dbxActionConfirm]=\"cfg\"></div>\n * ```\n *\n * @example\n * ```html\n * <button [dbxAction]=\"deleteAction\" [dbxActionConfirm]=\"{ header: 'Delete account?', confirmText: 'Delete' }\">Delete</button>\n * ```\n */\n@Directive({\n  selector: '[dbxActionConfirm]'\n})\nexport class DbxActionConfirmDirective<T = unknown, O = unknown> extends AbstractPromptConfirmDirective {\n  readonly source = inject(DbxActionContextStoreSourceInstance<T, O>, { host: true });\n\n  readonly dbxActionConfirm = input<Maybe<DbxActionConfirmConfig<T>>, Maybe<DbxActionConfirmConfig<T> | ''>>(undefined, { transform: transformEmptyStringInputToUndefined });\n\n  /**\n   * When true, the confirmation dialog is disabled and the action proceeds without prompting.\n   */\n  readonly dbxActionConfirmSkip = input<boolean, unknown>(false, { transform: booleanAttribute });\n\n  constructor() {\n    super();\n    cleanSubscriptionWithLockSet({\n      lockSet: this.source.lockSet,\n      sub: this.source.triggered$.subscribe(() => {\n        const skip = this.dbxActionConfirmSkip() || this.dbxActionConfirm()?.autoConfirm === true;\n\n        if (skip) {\n          this._handleDialogResult(true);\n        } else {\n          this.showDialog();\n        }\n      })\n    });\n  }\n\n  protected getDefaultDialogConfig(): Maybe<DbxPromptConfirmConfig> {\n    return this.dbxActionConfirm();\n  }\n\n  protected override _handleDialogResult(result: boolean): boolean {\n    if (result) {\n      this.source.readyValue(this.dbxActionConfirm()?.readyValue as unknown as T);\n    } else {\n      this.source.reject(undefined);\n    }\n\n    return result;\n  }\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxActionContextStoreSourceInstance } from '@dereekb/dbx-core';\n\nconst DEFAULT_ACTION_KEY_TRIGGER = 'enter';\n\n/**\n * Triggers the parent action context when a specific keyboard key is released.\n * Defaults to the \"enter\" key. Key names should be lowercase.\n *\n * @dbxWebComponent\n * @dbxWebSlug action-key-trigger\n * @dbxWebCategory action\n * @dbxWebRelated action-confirm, action-snackbar\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <div [dbxActionKeyTrigger]=\"'enter'\"></div>\n * ```\n *\n * @example\n * ```html\n * <form [dbxAction]=\"saveAction\" [dbxActionKeyTrigger]=\"'cmd+s'\">...</form>\n * ```\n */\n@Directive({\n  selector: '[dbxActionKeyTrigger]'\n})\nexport class DbxActionKeyTriggerDirective<T = unknown, O = unknown> {\n  readonly source = inject(DbxActionContextStoreSourceInstance<T, O>, { host: true });\n\n  readonly key = input<string, Maybe<string>>(DEFAULT_ACTION_KEY_TRIGGER, { alias: 'dbxActionKeyTrigger', transform: (x) => (x ?? DEFAULT_ACTION_KEY_TRIGGER).toLowerCase() });\n\n  @HostListener('document:keyup', ['$event'])\n  onKeyupHandler(event: KeyboardEvent): void {\n    if (event.key?.toLowerCase() === this.key()) {\n      this.source.trigger();\n    }\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxActionKeyTriggerDirective } from './key.trigger.directive';\nimport { DbxActionButtonDirective, DbxCoreActionModule } from '@dereekb/dbx-core';\nimport { DbxActionConfirmDirective } from './action.confirm.directive';\n\nconst importsAndExports = [DbxCoreActionModule, DbxActionButtonDirective, DbxActionKeyTriggerDirective, DbxActionConfirmDirective];\n\n/**\n * Convenience module that bundles all base dbxAction-related directives from\n * both @dereekb/dbx-core and @dereekb/dbx-web, including key triggers and confirmation dialogs.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxActionModule {}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { type ReadableError, type ServerError, ServerErrorResponse, UnauthorizedServerErrorResponse, build } from '@dereekb/util';\n\n/**\n * Converts an HTTP error response into a plain JSON-serializable {@link ServerError} object.\n *\n * Ensures that the error data is safe for serialization by running it through `JSON.stringify`/`JSON.parse`.\n * Non-serializable data is stripped with a console warning.\n *\n * @param httpError - The HTTP error response or generic error object to convert.\n * @returns A plain JSON-serializable {@link ServerError} object.\n *\n * @example\n * ```typescript\n * const pojoError = convertToPOJOServerErrorResponse(httpErrorResponse);\n * console.log(pojoError.message);\n * ```\n */\nexport function convertToPOJOServerErrorResponse(httpError: HttpErrorResponse | object): ServerError {\n  const result: ServerErrorResponse | undefined = convertToServerErrorResponse(httpError);\n  const pojo: ServerErrorResponse = build({\n    base: Object.assign({}, result),\n    build: (x) => {\n      if (x.data) {\n        try {\n          const stringy = JSON.stringify(pojo.data);\n          x.data = JSON.parse(stringy);\n        } catch {\n          console.warn('convertToPOJOServerErrorResponse(): Non-serializable Error Data Detected. It is being removed.: ', pojo.data);\n          x.data = undefined;\n        }\n      }\n    }\n  });\n\n  return pojo;\n}\n\n/**\n * Converts an {@link HttpErrorResponse} or generic error object into a {@link ServerErrorResponse}.\n *\n * Handles HTTP 401 responses specially by returning an {@link UnauthorizedServerErrorResponse}.\n * Returns `undefined` if the input is falsy.\n *\n * @param error - The HTTP error response or generic error object to convert.\n * @returns A {@link ServerErrorResponse} derived from the error, or `undefined` if the input is falsy.\n *\n * @example\n * ```typescript\n * const serverError = convertToServerErrorResponse(httpErrorResponse);\n * if (serverError) {\n *   console.log(serverError.status, serverError.message);\n * }\n * ```\n */\nexport function convertToServerErrorResponse(error: HttpErrorResponse | object): ServerErrorResponse | undefined {\n  let result: ServerErrorResponse | undefined;\n\n  if (error instanceof HttpErrorResponse) {\n    const { status, error: data }: { status: number; error: ServerError } = error;\n\n    const code = data.code;\n    // statusText is deprecated with HTTP/2+ but still needed as a fallback for error messages\n    // eslint-disable-next-line @typescript-eslint/no-deprecated\n    const message = data.message ?? error.statusText;\n\n    switch (status) {\n      case 401:\n        result = new UnauthorizedServerErrorResponse({ message, data, code });\n        break;\n      default:\n        result = new ServerErrorResponse({ code, status, data, message });\n        break;\n    }\n  } else if (error) {\n    result = new ServerErrorResponse({ message: (error as ReadableError).message, status: 0 });\n  }\n\n  return result;\n}\n","import { Directive, effect, inject, input } from '@angular/core';\nimport { type LoadingContext, type MaybeObservableOrValue, maybeValueFromObservableOrValue } from '@dereekb/rxjs';\nimport { cleanSubscription } from '@dereekb/dbx-core';\nimport { DbxErrorComponent } from './error.component';\nimport { distinctUntilChanged, shareReplay, type Subscription } from 'rxjs';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Links a {@link DbxErrorComponent} to a {@link LoadingContext}, automatically displaying loading errors.\n *\n * Subscribes to the loading context's stream and forwards any errors to the host `<dbx-error>` component.\n * Accepts a `LoadingContext` directly or an `Observable<LoadingContext>`.\n *\n * @example\n * ```html\n * <dbx-error [dbxLoadingError]=\"loadingContext\"></dbx-error>\n *\n * <dbx-error [dbxLoadingError]=\"loadingContext$\"></dbx-error>\n * ```\n */\n@Directive({\n  selector: '[dbxLoadingError]'\n})\nexport class DbxLoadingErrorDirective {\n  readonly error = inject(DbxErrorComponent, { host: true });\n\n  readonly context = input.required<MaybeObservableOrValue<LoadingContext>>({ alias: 'dbxLoadingError' });\n\n  readonly context$ = toObservable(this.context).pipe(maybeValueFromObservableOrValue(), distinctUntilChanged(), shareReplay(1));\n  readonly contextSignal = toSignal(this.context$);\n\n  protected readonly _errorEffectSub = cleanSubscription();\n  protected readonly _errorEffect = effect(() => {\n    const context = this.contextSignal();\n    let subscription: Subscription | undefined;\n\n    if (context) {\n      subscription = context.stream$.subscribe((x) => this.error.setError(x.error));\n    }\n\n    this._errorEffectSub.setSub(subscription);\n  });\n}\n","import { Component, inject, signal, effect } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA, type MatSnackBar, type MatSnackBarConfig, MatSnackBarRef } from '@angular/material/snack-bar';\nimport { type ErrorInput, MS_IN_MINUTE, asArray, makeTimer, toggleTimerRunning } from '@dereekb/util';\nimport { type NgPopoverRef } from 'ng-overlay-container';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { from } from 'rxjs';\nimport { DbxErrorComponent } from './error.component';\nimport { clean, cleanSubscription } from '@dereekb/dbx-core';\n\n/**\n * Configuration for error snackbar display, extending Material snackbar config but excluding `data` and `viewContainerRef`.\n */\nexport type DbxErrorSnackbarConfig = Omit<MatSnackBarConfig<unknown>, 'data' | 'viewContainerRef'>;\n\n/**\n * Data passed to the error snackbar component via `MAT_SNACK_BAR_DATA`.\n */\nexport interface DbxErrorSnackbarData<T extends ErrorInput = ErrorInput> {\n  /**\n   * The error to display in the snackbar.\n   */\n  readonly error: T;\n  /**\n   * Optional auto-dismiss duration in milliseconds. If omitted, the snackbar persists until manually dismissed.\n   */\n  readonly duration?: number;\n}\n\n/**\n * Snackbar component that displays an error with a dismiss button.\n *\n * Supports an optional auto-dismiss timer that pauses while an error detail popover is open.\n * Typically opened via {@link DbxErrorSnackbarService} or the static {@link DbxErrorSnackbarComponent.showErrorSnackbar} method.\n *\n * @dbxWebComponent\n * @dbxWebSlug error-snackbar\n * @dbxWebCategory feedback\n * @dbxWebRelated error\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-error-snackbar></dbx-error-snackbar>\n * ```\n *\n * @example\n * ```html\n * // Triggered via DbxErrorSnackbarService.showError(error)\n * ```\n */\n@Component({\n  selector: 'dbx-error-snackbar',\n  template: `\n    <div class=\"dbx-error-snackbar-content\">\n      <dbx-error [error]=\"error\" (popoverOpened)=\"onPopoverOpened($event)\"></dbx-error>\n      <div class=\"dbx-spacer\"></div>\n      <button class=\"dbx-error-snackbar-content-button\" mat-icon-button aria-label=\"dismiss error\" (click)=\"dismiss()\">\n        <mat-icon>close</mat-icon>\n      </button>\n    </div>\n  `,\n  imports: [MatIconModule, MatButtonModule, DbxErrorComponent]\n})\nexport class DbxErrorSnackbarComponent {\n  readonly snackBarRef = inject(MatSnackBarRef<DbxErrorSnackbarComponent>);\n  readonly data = inject<DbxErrorSnackbarData>(MAT_SNACK_BAR_DATA);\n\n  readonly error = this.data.error;\n  private readonly _popoverOpen = signal(false);\n\n  private readonly _timer = clean(makeTimer(this.data.duration ?? MS_IN_MINUTE, Boolean(this.data.duration)));\n  private readonly _allowAutoDismiss = this.data.duration != null;\n\n  protected readonly _popoverSyncEffect = effect(() => toggleTimerRunning(this._timer, !this._popoverOpen()));\n\n  private readonly _popoverAfterClosedSub = cleanSubscription();\n  private readonly _autoDismissSub = cleanSubscription();\n\n  constructor() {\n    if (this._allowAutoDismiss) {\n      this._autoDismissSub.setSub(from(this._timer.promise).subscribe(() => this.dismiss()));\n    } else {\n      this._popoverSyncEffect.destroy();\n    }\n  }\n\n  onPopoverOpened(popover: NgPopoverRef) {\n    this._popoverOpen.set(true);\n    this._popoverAfterClosedSub.setSub(popover.afterClosed$.subscribe(() => this._popoverOpen.set(false)));\n  }\n\n  dismiss() {\n    this.snackBarRef.dismiss();\n  }\n\n  static showErrorSnackbar(matSnackbar: MatSnackBar, error: ErrorInput, config?: DbxErrorSnackbarConfig) {\n    matSnackbar.openFromComponent(DbxErrorSnackbarComponent, {\n      ...config,\n      duration: undefined,\n      panelClass: [...asArray(config?.panelClass), 'dbx-error-snackbar'],\n      data: {\n        error,\n        duration: config?.duration\n      }\n    });\n  }\n}\n","import { Service, inject } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { type ErrorInput, type Maybe } from '@dereekb/util';\nimport { DbxErrorSnackbarComponent, type DbxErrorSnackbarConfig } from './error.snackbar.component';\n\n/**\n * Default configuration for error snackbars, using polite announcements centered at the bottom of the viewport.\n */\nexport const DEFAULT_DBX_ERROR_SNACKBAR_CONFIG: DbxErrorSnackbarConfig = {\n  politeness: 'polite',\n  announcementMessage: 'An error has occurred',\n  horizontalPosition: 'center',\n  verticalPosition: 'bottom'\n};\n\n/**\n * Application-wide service for displaying error notifications in a Material snackbar.\n *\n * Wraps {@link DbxErrorSnackbarComponent} with configurable defaults. Inject this service\n * to programmatically show error snackbars from any component or service.\n *\n * @example\n * ```typescript\n * const snackbarService = inject(DbxErrorSnackbarService);\n * snackbarService.showSnackbarError(error, { duration: 5000 });\n * ```\n */\n@Service()\nexport class DbxErrorSnackbarService {\n  readonly matSnackbar = inject(MatSnackBar);\n\n  private _defaultConfig: DbxErrorSnackbarConfig = DEFAULT_DBX_ERROR_SNACKBAR_CONFIG;\n\n  get defaultConfig() {\n    return this._defaultConfig;\n  }\n\n  setDefaultConfig(defaultConfig: DbxErrorSnackbarConfig) {\n    this._defaultConfig = defaultConfig;\n  }\n\n  showSnackbarError(error: ErrorInput, inputConfig?: Maybe<DbxErrorSnackbarConfig>) {\n    const config = {\n      ...inputConfig,\n      ...this._defaultConfig\n    };\n\n    return DbxErrorSnackbarComponent.showErrorSnackbar(this.matSnackbar, error, config);\n  }\n}\n","import { Directive, inject, input } from '@angular/core';\nimport { DbxActionContextStoreSourceInstance, cleanSubscriptionWithLockSet } from '@dereekb/dbx-core';\nimport { DbxErrorSnackbarService } from './error.snackbar.service';\nimport { type Maybe, type Milliseconds, toReadableError } from '@dereekb/util';\nimport { type DbxErrorSnackbarConfig } from './error.snackbar.component';\nimport { filterMaybe } from '@dereekb/rxjs';\n\n/**\n * Displays action errors in a snackbar notification.\n *\n * Subscribes to the action context's error stream and shows a snackbar via {@link DbxErrorSnackbarService}\n * whenever an error occurs. Accepts an optional configuration or a duration in milliseconds as input.\n *\n * @dbxWebComponent\n * @dbxWebSlug action-snackbar-error\n * @dbxWebCategory action\n * @dbxWebRelated action-snackbar\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <div [dbxActionSnackbarError]></div>\n * ```\n *\n * @example\n * ```html\n * <button [dbxAction]=\"saveAction\" dbxActionSnackbarError>Save</button>\n * ```\n */\n@Directive({\n  selector: '[dbxActionSnackbarError]'\n})\nexport class DbxActionSnackbarErrorDirective {\n  readonly dbxErrorSnackbarService = inject(DbxErrorSnackbarService);\n\n  readonly source = inject(DbxActionContextStoreSourceInstance);\n\n  readonly config = input<Maybe<DbxErrorSnackbarConfig> | Milliseconds | ''>(undefined, { alias: 'dbxActionSnackbarError' });\n\n  constructor() {\n    cleanSubscriptionWithLockSet({\n      lockSet: this.source.lockSet,\n      sub: this.source.error$.pipe(filterMaybe()).subscribe((inputError) => {\n        const config = this.config();\n        const error = toReadableError(inputError);\n\n        const snackbarConfig = config ? (typeof config === 'number' ? { duration: config } : config) : undefined;\n        this.dbxErrorSnackbarService.showSnackbarError(error, snackbarConfig);\n      })\n    });\n  }\n}\n","import { type HttpErrorResponse } from '@angular/common/http';\nimport { convertToPOJOServerErrorResponse } from './error.api';\nimport { catchError, type MonoTypeOperatorFunction, of } from 'rxjs';\nimport { type ActionCreator, type Action } from '@ngrx/store';\nimport { type ServerError } from '@dereekb/util';\n\n/**\n * Wrapper for a {@link ServerError} used as NgRx action props.\n */\nexport interface ServerErrorParams {\n  readonly error: ServerError;\n}\n\n/**\n * Converts an HTTP error response into {@link ServerErrorParams} suitable for dispatching as an NgRx action prop.\n *\n * @param httpError - The HTTP error response or generic error object to convert.\n * @returns A {@link ServerErrorParams} object wrapping the converted server error.\n *\n * @example\n * ```typescript\n * const params = convertServerErrorParams(httpErrorResponse);\n * store.dispatch(myErrorAction(params));\n * ```\n */\nexport function convertServerErrorParams(httpError: HttpErrorResponse | object): ServerErrorParams {\n  const error: ServerError = convertToPOJOServerErrorResponse(httpError);\n  return { error };\n}\n\n/**\n * RxJS operator that catches HTTP errors, converts them to {@link ServerErrorParams}, and dispatches the given NgRx action.\n *\n * @param action - The NgRx action creator to dispatch with the converted error params.\n * @param mapError - Optional function to transform the {@link ServerErrorParams} before dispatching. Defaults to identity.\n * @returns An RxJS operator that catches errors and emits the corresponding error action.\n *\n * @example\n * ```typescript\n * return this.actions$.pipe(\n *   ofType(myAction),\n *   switchMap(() => this.api.getData().pipe(\n *     catchErrorServerParams(myErrorAction)\n *   ))\n * );\n * ```\n */\nexport function catchErrorServerParams<E extends ServerErrorParams, T extends string>(action: ActionCreator<T, (props: E) => E & Action<T>>, mapError: (error: ServerErrorParams) => E = (error) => error as E): MonoTypeOperatorFunction<E & Action<T>> {\n  return catchError((error: HttpErrorResponse | object) => {\n    const serverErrorParams = convertServerErrorParams(error);\n    const mappedError: E = mapError(serverErrorParams);\n    const act = action(mappedError);\n    return of(act);\n  });\n}\n","import { Service } from '@angular/core';\nimport { type BrowserAgentInfo, getCurrentBrowserAgentInfo } from '@dereekb/browser';\n\n/**\n * Provides the {@link BrowserAgentInfo} of the current browser.\n *\n * Replace this service to provide a fixed browser agent in tests or demos.\n *\n * @example\n * ```typescript\n * providers: [{ provide: DbxBrowserAgentService, useValue: { agentInfo: parseBrowserAgentInfo({ userAgent }) } }]\n * ```\n */\n@Service()\nexport class DbxBrowserAgentService {\n  readonly agentInfo: BrowserAgentInfo = getCurrentBrowserAgentInfo();\n}\n","import { type Signal } from '@angular/core';\nimport { type BrowserAgentInfo, type BrowserAgentMatch, type BrowserAgentOsType, makeBrowserAgentMatchFunction } from '@dereekb/browser';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\n\n// MARK: Entry\n/**\n * Unique key of a {@link DbxBrowserAgentViewEntry} within a {@link DbxBrowserAgentViewConfig}.\n */\nexport type DbxBrowserAgentViewEntryKey = string;\n\n/**\n * An entry displayed by the {@link DbxBrowserAgentViewComponent} when its match is the first to match the detected browser agent, or when it is selected manually.\n */\nexport interface DbxBrowserAgentViewEntry {\n  /**\n   * Unique key of the entry. Used to select the entry manually.\n   */\n  readonly key: DbxBrowserAgentViewEntryKey;\n  /**\n   * Label shown in the override menu.\n   */\n  readonly label: string;\n  /**\n   * Optional icon shown in the override menu.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Match used to auto-detect this entry.\n   *\n   * Entries without a match are never auto-detected, but can still be selected manually. Ignored on the default entry.\n   */\n  readonly match?: Maybe<BrowserAgentMatch>;\n  /**\n   * Component to render when this entry is selected.\n   */\n  readonly componentConfig: DbxInjectionComponentConfig;\n}\n\n/**\n * Config for a {@link DbxBrowserAgentViewComponent}.\n */\nexport interface DbxBrowserAgentViewConfig {\n  /**\n   * Ordered entries to match against. The first matching entry wins.\n   */\n  readonly entries?: Maybe<DbxBrowserAgentViewEntry[]>;\n  /**\n   * Entry used when no other entry matches.\n   */\n  readonly defaultEntry: DbxBrowserAgentViewEntry;\n  /**\n   * Whether or not to show the override button that lets the user pick another entry.\n   */\n  readonly showOverrideButton?: Maybe<boolean>;\n}\n\n/**\n * Returns the first entry of the config whose match matches the input browser agent info, otherwise the config's default entry.\n *\n * @param config - The view config to search.\n * @param agentInfo - The browser agent info to match against.\n * @returns The matching entry, or the default entry.\n *\n * @example\n * ```typescript\n * const entry = findDbxBrowserAgentViewEntry(config, getCurrentBrowserAgentInfo());\n * ```\n */\nexport function findDbxBrowserAgentViewEntry(config: DbxBrowserAgentViewConfig, agentInfo: BrowserAgentInfo): DbxBrowserAgentViewEntry {\n  const matchingEntry = (config.entries ?? []).find((entry) => entry.match != null && makeBrowserAgentMatchFunction(entry.match)(agentInfo));\n  return matchingEntry ?? config.defaultEntry;\n}\n\n// MARK: Context\n/**\n * Context provided by the {@link DbxBrowserAgentViewComponent}.\n *\n * Injected components can inject this to read the detected browser agent or to switch to another entry.\n */\nexport abstract class DbxBrowserAgentViewContext {\n  /**\n   * The detected browser agent info.\n   */\n  abstract readonly agentInfo: BrowserAgentInfo;\n  /**\n   * All entries of the config, including the default entry as the last entry.\n   */\n  abstract readonly entriesSignal: Signal<DbxBrowserAgentViewEntry[]>;\n  /**\n   * The entry that matches the detected browser agent.\n   */\n  abstract readonly detectedEntrySignal: Signal<Maybe<DbxBrowserAgentViewEntry>>;\n  /**\n   * The entry currently displayed. This is the override entry when set, otherwise the detected entry.\n   */\n  abstract readonly selectedEntrySignal: Signal<Maybe<DbxBrowserAgentViewEntry>>;\n  /**\n   * Whether or not an override entry is currently selected.\n   */\n  abstract readonly isOverriddenSignal: Signal<boolean>;\n  /**\n   * Selects the entry with the input key. Unknown keys fall back to the detected entry.\n   */\n  abstract setOverride(key: Maybe<DbxBrowserAgentViewEntryKey>): void;\n  /**\n   * Clears the override and returns to the detected entry.\n   */\n  abstract clearOverride(): void;\n}\n\n// MARK: OS\n/**\n * An operating system that can be configured with {@link makeDbxBrowserAgentViewConfigFromOsMap}, or `default` for the default entry.\n */\nexport type DbxBrowserAgentViewOsKey = Exclude<BrowserAgentOsType, 'unknown'> | 'default';\n\n/**\n * Display label and icon for an OS entry.\n */\nexport interface DbxBrowserAgentViewOsDisplay {\n  readonly label: string;\n  readonly icon: string;\n}\n\n/**\n * Default labels and icons for each {@link DbxBrowserAgentViewOsKey}.\n */\nexport const DEFAULT_DBX_BROWSER_AGENT_VIEW_OS_DISPLAY: Readonly<Record<DbxBrowserAgentViewOsKey, DbxBrowserAgentViewOsDisplay>> = {\n  ios: { label: 'iPhone / iPad', icon: 'phone_iphone' },\n  android: { label: 'Android', icon: 'android' },\n  windows: { label: 'Windows', icon: 'desktop_windows' },\n  macos: { label: 'Mac', icon: 'laptop_mac' },\n  linux: { label: 'Linux', icon: 'computer' },\n  chromeos: { label: 'ChromeOS', icon: 'laptop_chromebook' },\n  default: { label: 'Other', icon: 'devices' }\n};\n\n/**\n * Order the OS entries are created in by {@link makeDbxBrowserAgentViewConfigFromOsMap}.\n */\nconst DBX_BROWSER_AGENT_VIEW_OS_MAP_ORDER: readonly Exclude<DbxBrowserAgentViewOsKey, 'default'>[] = ['ios', 'android', 'windows', 'macos', 'linux', 'chromeos'];\n\n/**\n * Component config for an OS entry, with an optional custom label and icon.\n */\nexport interface DbxBrowserAgentViewOsEntryConfig {\n  readonly componentConfig: DbxInjectionComponentConfig;\n  /**\n   * Custom label. Defaults to the {@link DEFAULT_DBX_BROWSER_AGENT_VIEW_OS_DISPLAY} label.\n   */\n  readonly label?: Maybe<string>;\n  /**\n   * Custom icon. Defaults to the {@link DEFAULT_DBX_BROWSER_AGENT_VIEW_OS_DISPLAY} icon.\n   */\n  readonly icon?: Maybe<string>;\n}\n\n/**\n * A component config, or a {@link DbxBrowserAgentViewOsEntryConfig} to customize the display.\n */\nexport type DbxBrowserAgentViewOsMapValue = DbxInjectionComponentConfig | DbxBrowserAgentViewOsEntryConfig;\n\n/**\n * Creates a {@link DbxBrowserAgentViewEntry} for the input OS, using the default label and icon and matching on the OS.\n *\n * The `default` key creates an entry without a match.\n *\n * @param os - The OS to create the entry for.\n * @param componentConfigOrEntry - The component config, or an entry config with a custom label and icon.\n * @returns The entry.\n *\n * @example\n * ```typescript\n * const iosEntry = makeDbxBrowserAgentViewEntryForOs('ios', { componentClass: IosInstructionsComponent });\n * const androidEntry = makeDbxBrowserAgentViewEntryForOs('android', { componentConfig: { componentClass: AndroidInstructionsComponent }, label: 'Android Phone' });\n * ```\n */\nexport function makeDbxBrowserAgentViewEntryForOs(os: DbxBrowserAgentViewOsKey, componentConfigOrEntry: DbxBrowserAgentViewOsMapValue): DbxBrowserAgentViewEntry {\n  const display = DEFAULT_DBX_BROWSER_AGENT_VIEW_OS_DISPLAY[os];\n  const entryConfig: DbxBrowserAgentViewOsEntryConfig = 'componentConfig' in componentConfigOrEntry ? componentConfigOrEntry : { componentConfig: componentConfigOrEntry };\n\n  return {\n    key: os,\n    label: entryConfig.label ?? display.label,\n    icon: entryConfig.icon ?? display.icon,\n    match: os === 'default' ? undefined : { os },\n    componentConfig: entryConfig.componentConfig\n  };\n}\n\n/**\n * Input for {@link makeDbxBrowserAgentViewConfigFromOsMap}.\n */\nexport interface DbxBrowserAgentViewOsMapConfig {\n  readonly ios?: Maybe<DbxBrowserAgentViewOsMapValue>;\n  readonly android?: Maybe<DbxBrowserAgentViewOsMapValue>;\n  readonly windows?: Maybe<DbxBrowserAgentViewOsMapValue>;\n  readonly macos?: Maybe<DbxBrowserAgentViewOsMapValue>;\n  readonly linux?: Maybe<DbxBrowserAgentViewOsMapValue>;\n  readonly chromeos?: Maybe<DbxBrowserAgentViewOsMapValue>;\n  /**\n   * Used when the detected OS has no entry.\n   */\n  readonly default: DbxBrowserAgentViewOsMapValue;\n  readonly showOverrideButton?: Maybe<boolean>;\n}\n\n/**\n * Creates a {@link DbxBrowserAgentViewConfig} with one entry per configured OS, plus the default entry.\n *\n * @param config - The component config for each OS.\n * @returns The view config.\n *\n * @example\n * ```typescript\n * const config = makeDbxBrowserAgentViewConfigFromOsMap({\n *   ios: { componentClass: IosInstructionsComponent },\n *   android: { componentClass: AndroidInstructionsComponent },\n *   default: { componentClass: BookmarkInstructionsComponent },\n *   showOverrideButton: true\n * });\n * ```\n */\nexport function makeDbxBrowserAgentViewConfigFromOsMap(config: DbxBrowserAgentViewOsMapConfig): DbxBrowserAgentViewConfig {\n  const entries: DbxBrowserAgentViewEntry[] = [];\n\n  DBX_BROWSER_AGENT_VIEW_OS_MAP_ORDER.forEach((os) => {\n    const value = config[os];\n\n    if (value != null) {\n      entries.push(makeDbxBrowserAgentViewEntryForOs(os, value));\n    }\n  });\n\n  return {\n    entries,\n    defaultEntry: makeDbxBrowserAgentViewEntryForOs('default', config.default),\n    showOverrideButton: config.showOverrideButton\n  };\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxBrowserAgentViewContext, type DbxBrowserAgentViewEntryKey } from './browser.agent.view';\n\n/**\n * Button that opens a menu to manually select an entry of the parent {@link DbxBrowserAgentViewComponent}, or to return to the auto-detected entry.\n *\n * Rendered by the view when `showOverrideButton` is enabled, but can also be placed inside the injected content to position it manually.\n *\n * @dbxWebComponent\n * @dbxWebSlug browser-agent-view-override-button\n * @dbxWebCategory misc\n * @dbxWebRelated browser-agent-view\n * @dbxWebMinimalExample ```html\n * <dbx-browser-agent-view-override-button></dbx-browser-agent-view-override-button>\n * ```\n *\n * @example\n * ```html\n * <!-- inside a component injected by dbx-browser-agent-view -->\n * <p>Follow these steps to add the app to your home screen.</p>\n * <dbx-browser-agent-view-override-button></dbx-browser-agent-view-override-button>\n * ```\n */\n@Component({\n  selector: 'dbx-browser-agent-view-override-button',\n  template: `\n    <dbx-button class=\"dbx-browser-agent-view-override-button-trigger\" ariaLabel=\"choose device\" [text]=\"selectedEntrySignal()?.label\" [icon]=\"selectedEntrySignal()?.icon\" [matMenuTriggerFor]=\"menu\" allowClickPropagation>\n      <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\n    </dbx-button>\n    <mat-menu #menu>\n      <button mat-menu-item class=\"dbx-browser-agent-view-override-auto\" [class.active]=\"!isOverriddenSignal()\" [attr.aria-current]=\"isOverriddenSignal() ? null : 'true'\" (click)=\"clearOverride()\">\n        <mat-icon aria-hidden=\"true\">auto_awesome</mat-icon>\n        Auto-detect ({{ detectedEntrySignal()?.label }})\n      </button>\n      @for (entry of entriesSignal(); track entry.key) {\n        <button mat-menu-item class=\"dbx-browser-agent-view-override-entry\" [class.active]=\"entry.key === overrideKeySignal()\" [attr.aria-current]=\"entry.key === overrideKeySignal() ? 'true' : null\" (click)=\"setOverride(entry.key)\">\n          @if (entry.icon) {\n            <mat-icon aria-hidden=\"true\">{{ entry.icon }}</mat-icon>\n          }\n          {{ entry.label }}\n        </button>\n      }\n    </mat-menu>\n  `,\n  host: {\n    class: 'dbx-browser-agent-view-override-button'\n  },\n  imports: [DbxButtonComponent, MatMenu, MatMenuItem, MatMenuTrigger, MatIconModule]\n})\nexport class DbxBrowserAgentViewOverrideButtonComponent {\n  readonly context = inject(DbxBrowserAgentViewContext);\n\n  readonly entriesSignal = this.context.entriesSignal;\n  readonly detectedEntrySignal = this.context.detectedEntrySignal;\n  readonly selectedEntrySignal = this.context.selectedEntrySignal;\n  readonly isOverriddenSignal = this.context.isOverriddenSignal;\n\n  readonly overrideKeySignal = computed(() => (this.isOverriddenSignal() ? this.selectedEntrySignal()?.key : undefined));\n\n  setOverride(key: DbxBrowserAgentViewEntryKey): void {\n    this.context.setOverride(key);\n  }\n\n  clearOverride(): void {\n    this.context.clearOverride();\n  }\n}\n","import { Component, computed, forwardRef, inject, input, model } from '@angular/core';\nimport { type BrowserAgentInfo } from '@dereekb/browser';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxBrowserAgentViewConfig, DbxBrowserAgentViewContext, type DbxBrowserAgentViewEntry, type DbxBrowserAgentViewEntryKey, findDbxBrowserAgentViewEntry } from './browser.agent.view';\nimport { DbxBrowserAgentService } from './browser.agent.service';\nimport { DbxBrowserAgentViewOverrideButtonComponent } from './browser.agent.view.override.button.component';\n\n/**\n * Renders the component of the first {@link DbxBrowserAgentViewEntry} whose match matches the current browser agent (OS, browser, and device), falling back to the config's default entry.\n *\n * An optional override button lets the user pick another entry. Injected components can inject {@link DbxBrowserAgentViewContext} to read the detected agent or to switch entries.\n *\n * @dbxWebComponent\n * @dbxWebSlug browser-agent-view\n * @dbxWebCategory misc\n * @dbxWebRelated widget, browser-agent-view-override-button\n * @dbxWebMinimalExample ```html\n * <dbx-browser-agent-view [config]=\"config\"></dbx-browser-agent-view>\n * ```\n *\n * @example\n * ```typescript\n * readonly config = makeDbxBrowserAgentViewConfigFromOsMap({\n *   ios: { componentClass: IosInstructionsComponent },\n *   android: { componentClass: AndroidInstructionsComponent },\n *   default: { componentClass: BookmarkInstructionsComponent },\n *   showOverrideButton: true\n * });\n * ```\n *\n * ```html\n * <dbx-browser-agent-view [config]=\"config\" [(overrideKey)]=\"savedDeviceKey\"></dbx-browser-agent-view>\n * ```\n */\n@Component({\n  selector: 'dbx-browser-agent-view',\n  template: `\n    @if (showOverrideButtonSignal()) {\n      <div class=\"dbx-browser-agent-view-override\">\n        <dbx-browser-agent-view-override-button></dbx-browser-agent-view-override-button>\n      </div>\n    }\n    <dbx-injection [config]=\"injectionConfigSignal()\"></dbx-injection>\n  `,\n  host: {\n    class: 'dbx-browser-agent-view'\n  },\n  providers: [\n    {\n      provide: DbxBrowserAgentViewContext,\n      useExisting: forwardRef(() => DbxBrowserAgentViewComponent)\n    }\n  ],\n  imports: [DbxInjectionComponent, DbxBrowserAgentViewOverrideButtonComponent]\n})\nexport class DbxBrowserAgentViewComponent implements DbxBrowserAgentViewContext {\n  readonly agentInfo: BrowserAgentInfo = inject(DbxBrowserAgentService).agentInfo;\n\n  readonly config = input<Maybe<DbxBrowserAgentViewConfig>>();\n  readonly showOverrideButton = input<Maybe<boolean>>();\n\n  /**\n   * Key of the manually selected entry. Can be bound two-way to persist the user's choice.\n   */\n  readonly overrideKey = model<Maybe<DbxBrowserAgentViewEntryKey>>();\n\n  readonly entriesSignal = computed<DbxBrowserAgentViewEntry[]>(() => {\n    const config = this.config();\n    return config ? [...(config.entries ?? []), config.defaultEntry] : [];\n  });\n\n  readonly detectedEntrySignal = computed<Maybe<DbxBrowserAgentViewEntry>>(() => {\n    const config = this.config();\n    return config ? findDbxBrowserAgentViewEntry(config, this.agentInfo) : undefined;\n  });\n\n  readonly overrideEntrySignal = computed<Maybe<DbxBrowserAgentViewEntry>>(() => {\n    const entries = this.entriesSignal();\n    const key = this.overrideKey();\n    return key == null ? undefined : entries.find((entry) => entry.key === key);\n  });\n\n  readonly selectedEntrySignal = computed<Maybe<DbxBrowserAgentViewEntry>>(() => {\n    const detectedEntry = this.detectedEntrySignal();\n    return this.overrideEntrySignal() ?? detectedEntry;\n  });\n  readonly isOverriddenSignal = computed(() => this.overrideEntrySignal() != null);\n\n  /**\n   * Uses the entry's own config object so the injected component is only recreated when the selected entry changes.\n   */\n  readonly injectionConfigSignal = computed<Maybe<DbxInjectionComponentConfig>>(() => this.selectedEntrySignal()?.componentConfig);\n\n  readonly showOverrideButtonSignal = computed(() => {\n    const config = this.config();\n    return this.showOverrideButton() ?? config?.showOverrideButton ?? false;\n  });\n\n  setOverride(key: Maybe<DbxBrowserAgentViewEntryKey>): void {\n    this.overrideKey.set(key);\n  }\n\n  clearOverride(): void {\n    this.overrideKey.set(undefined);\n  }\n}\n","import { createAction } from '@ngrx/store';\n\n/**\n * NgRx action that resets the model state to its initial configuration.\n */\nexport const dbxModelResetState = createAction('[App/Model] Reset State');\n","import { type Maybe, type ModelKeyTypeNamePair } from '@dereekb/util';\nimport { createAction, props } from '@ngrx/store';\n\n/**\n * Parameters for dispatching a model object viewed event through the NgRx store.\n */\nexport interface DbxModelObjectViewedParams {\n  readonly modelKeyTypeNamePair: ModelKeyTypeNamePair;\n  readonly context?: Maybe<string>;\n}\n\n/**\n * Parameters for navigating to a model object's view.\n */\nexport interface DbxModelGoToObjectViewParams {\n  readonly modelKeyTypeNamePair: ModelKeyTypeNamePair;\n}\n\n/**\n * NgRx action dispatched when a model object is viewed, carrying the model key/type pair and optional context.\n */\nexport const emitObjectViewEvent = createAction('[App/Model/Type] Object Viewed', props<DbxModelObjectViewedParams>());\n","import { createReducer, on } from '@ngrx/store';\n\nimport { DbxModelStateActions } from '../actions';\n\n/**\n * NgRx state slice for model module configuration.\n */\nexport interface DbxModelModuleStateConfiguration {}\n\n/**\n * NgRx feature key for the model module configuration state slice.\n */\nexport const STATE_FEATURE_KEY = 'model.module.config';\n\n/**\n * Initial state for the model module configuration reducer.\n */\nexport const INITIAL_STATE: DbxModelModuleStateConfiguration = {\n  types: {}\n};\n\n/**\n * NgRx reducer for model module configuration. Resets to initial state on {@link DbxModelStateActions.dbxModelResetState}.\n */\nexport const reducer = createReducer(\n  INITIAL_STATE,\n  on(DbxModelStateActions.dbxModelResetState, () => INITIAL_STATE)\n);\n","import { type Action, combineReducers, createFeatureSelector, createSelector } from '@ngrx/store';\n\nimport * as fromObjectModuleConfig from './model.module.config';\nimport { type DbxModelModuleStateConfiguration } from './model.module.config';\n\nexport const FEATURE_KEY = 'app.model';\n\nexport interface DbxModelState {\n  [fromObjectModuleConfig.STATE_FEATURE_KEY]: DbxModelModuleStateConfiguration;\n}\n\nexport interface State {\n  [FEATURE_KEY]: DbxModelState;\n}\n\n/**\n * Combined reducer for the DbxModel NgRx feature state, delegating to sub-reducers for each state slice.\n *\n * @param state - The current DbxModel feature state, or undefined for initial state.\n * @param action - The NgRx action to process.\n * @returns The new DbxModelState produced by the combined sub-reducers.\n */\nexport function reducers(state: DbxModelState | undefined, action: Action) {\n  return combineReducers({\n    [fromObjectModuleConfig.STATE_FEATURE_KEY]: fromObjectModuleConfig.reducer\n  })(state, action);\n}\n\n// MARK: Context\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport const selectDbxModelFeature = createFeatureSelector<State, DbxModelState>(FEATURE_KEY);\n\n// MARK: Module Config\nexport const selectDbxModelFeatureObjectModuleConfig = createSelector(selectDbxModelFeature, (state: DbxModelState) => state[fromObjectModuleConfig.STATE_FEATURE_KEY]);\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { unixDateTimeSecondsNumberForNow, encodeModelKeyTypePair, ModelRelationUtility, type Maybe } from '@dereekb/util';\nimport { completeOnDestroy, type StorageAccessor } from '@dereekb/dbx-core';\nimport { map, mergeMap, catchError, type Observable, of, Subject, tap } from 'rxjs';\nimport { type DbxModelViewTrackerEventSet, type DbxModelViewTrackerEvent } from './model.tracker';\n\n/**\n * Injection token for a {@link StorageAccessor} used by {@link DbxModelViewTrackerStorage} to persist model view events.\n */\nexport const DBX_MODEL_VIEW_TRACKER_STORAGE_ACCESSOR_TOKEN = new InjectionToken('DbxModelViewTrackerStorageAccessor');\n\n/**\n * Manages persistence of {@link DbxModelViewTrackerEvent} items in local storage. Handles deduplication, sorting by date, and folder-based partitioning of events.\n */\n@Injectable()\nexport class DbxModelViewTrackerStorage {\n  static readonly OBJECT_VIEW_TRACKER_STORAGE_LIST_KEY = 'dbxModelViewTrackerEvents';\n  static readonly DEFAULT_MAX_EVENTS = 100;\n\n  readonly storageAccessor = inject<StorageAccessor<DbxModelViewTrackerEventSet>>(DBX_MODEL_VIEW_TRACKER_STORAGE_ACCESSOR_TOKEN);\n\n  private readonly _newEvent = completeOnDestroy(new Subject<DbxModelViewTrackerEvent>());\n\n  readonly newEvent$ = this._newEvent.asObservable();\n\n  protected get storageKey(): string {\n    return DbxModelViewTrackerStorage.OBJECT_VIEW_TRACKER_STORAGE_LIST_KEY;\n  }\n\n  protected get maxEventsToKeep(): number {\n    return DbxModelViewTrackerStorage.DEFAULT_MAX_EVENTS;\n  }\n\n  /**\n   * Persists a view tracker event to storage. Deduplicates by model key, sorts by date, and trims to the max event limit.\n   *\n   * @param event - The event to record.\n   * @returns Observable that completes when the event has been persisted.\n   */\n  addTrackerEvent(event: DbxModelViewTrackerEvent): Observable<void> {\n    const storageKey = this.getStorageKeyForFolder(event.folder);\n    return this._getEventSetForStorageKey(storageKey).pipe(\n      mergeMap((set) => {\n        const nextEvent: DbxModelViewTrackerEvent = {\n          d: event.d ?? unixDateTimeSecondsNumberForNow(),\n          c: event.c,\n          m: event.m\n        };\n\n        const e = ModelRelationUtility.removeDuplicates(set.e, (x) => encodeModelKeyTypePair(x.m), [encodeModelKeyTypePair(nextEvent.m)]);\n        e.push(nextEvent);\n        e.sort((a, b) => (b.d ?? 0) - (a.d ?? 0));\n\n        return this.storageAccessor\n          .set(storageKey, {\n            l: Math.max(set.l ?? 0, nextEvent.d as number),\n            e: e.slice(0, this.maxEventsToKeep)\n          })\n          .pipe(tap(() => this._newEvent.next(nextEvent)));\n      })\n    );\n  }\n\n  /**\n   * Returns all stored view events for the given folder.\n   *\n   * @param folder - Optional folder name; defaults to `'default'`\n   * @returns Observable of all view tracker events in the folder.\n   */\n  getAllEvents(folder?: Maybe<string>): Observable<DbxModelViewTrackerEvent[]> {\n    return this.getEventSet(folder).pipe(map((x) => x.e));\n  }\n\n  /**\n   * Returns the complete event set for the given folder.\n   *\n   * @param folder - Optional folder name; defaults to `'default'`\n   * @returns Observable of the event set containing events and the last-update timestamp.\n   */\n  getEventSet(folder?: Maybe<string>): Observable<DbxModelViewTrackerEventSet> {\n    const storageKey = this.getStorageKeyForFolder(folder);\n    return this._getEventSetForStorageKey(storageKey);\n  }\n\n  private _getEventSetForStorageKey(storageKey: string): Observable<DbxModelViewTrackerEventSet> {\n    return this.storageAccessor.get(storageKey).pipe(\n      catchError(() => {\n        return of(undefined);\n      }),\n      map((result) => result ?? { e: [], l: 0 })\n    );\n  }\n\n  /**\n   * Computes the storage key for a given folder name.\n   *\n   * @param folder - Optional folder name; defaults to `'default'`\n   * @returns The computed storage key string combining the base key and folder name.\n   */\n  getStorageKeyForFolder(folder?: Maybe<string>): string {\n    return `${this.storageKey}_${folder ?? 'default'}`;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { type Maybe, type ModelKeyTypeNamePair } from '@dereekb/util';\nimport { first, type Observable } from 'rxjs';\nimport { type DbxModelViewTrackerEvent, type DbxModelViewTrackerEventSet, type ModelViewContext } from './model.tracker';\nimport { DbxModelViewTrackerStorage } from './model.tracker.view.storage';\n\n/**\n * Service used for tracking/logging different kinds of events on objects.\n */\n@Injectable()\nexport class DbxModelTrackerService {\n  private readonly _viewTrackerStorage = inject(DbxModelViewTrackerStorage);\n\n  private _defaultFolder: Maybe<string>;\n\n  /**\n   * Emits whenever a new view tracker event is recorded.\n   */\n  readonly newEvent$ = this._viewTrackerStorage.newEvent$;\n\n  /**\n   * The default storage folder used when no folder is specified in tracking calls.\n   *\n   * @returns The current default folder name, or undefined if not set.\n   */\n  get defaultFolder(): Maybe<string> {\n    return this._defaultFolder;\n  }\n\n  set defaultFolder(folder: Maybe<string>) {\n    this._defaultFolder = folder ?? undefined;\n  }\n\n  // MARK: View\n  /**\n   * Records a view event for the given model, optionally in a specific context and folder.\n   *\n   * @param modelKeyTypeNamePair - The model identity to track.\n   * @param context - Optional view context metadata.\n   * @param folder - Storage folder; defaults to {@link defaultFolder}\n   */\n  trackViewedObject(modelKeyTypeNamePair: ModelKeyTypeNamePair, context?: Maybe<ModelViewContext>, folder: Maybe<string> = this._defaultFolder): void {\n    this._viewTrackerStorage\n      .addTrackerEvent({\n        m: modelKeyTypeNamePair,\n        c: context,\n        folder\n      })\n      .pipe(first())\n      .subscribe();\n  }\n\n  /**\n   * Returns all recorded view events for the given folder, sorted by most recent first.\n   *\n   * @param folder - Storage folder; defaults to {@link defaultFolder}\n   * @returns Observable of view events sorted by most recent first.\n   */\n  getAllViewEvents(folder: Maybe<string> = this._defaultFolder): Observable<DbxModelViewTrackerEvent[]> {\n    return this._viewTrackerStorage.getAllEvents(folder);\n  }\n\n  /**\n   * Returns the complete event set (events and last-update timestamp) for the given folder.\n   *\n   * @param folder - Storage folder; defaults to {@link defaultFolder}\n   * @returns Observable of the complete event set including events and last-update timestamp.\n   */\n  getViewEventSet(folder: Maybe<string> = this._defaultFolder): Observable<DbxModelViewTrackerEventSet> {\n    return this._viewTrackerStorage.getEventSet(folder);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Actions, ofType, createEffect } from '@ngrx/effects';\nimport { distinctUntilChanged, filter, map, tap } from 'rxjs';\nimport { onDbxAppAuth } from '@dereekb/dbx-core';\nimport { DbxModelTrackerService } from '../../model.tracker.service';\nimport { onDbxModel } from '..';\n\n/**\n * NgRx effects that bridge store actions to the {@link DbxModelTrackerService}. Tracks model view events and updates the tracker's default folder when the authenticated user changes.\n */\n@Injectable()\nexport class DbxModelTrackerEffects {\n  private readonly actions$ = inject(Actions);\n  private readonly dbxModelTrackerService = inject(DbxModelTrackerService);\n\n  readonly trackModelViewed$ = createEffect(\n    () =>\n      this.actions$.pipe(\n        ofType(onDbxModel.DbxModelStateModelActions.emitObjectViewEvent),\n        distinctUntilChanged((a, b) => a?.modelKeyTypeNamePair.key === b?.modelKeyTypeNamePair.key && a?.type === b?.type && a?.context === b?.context),\n        tap((x) => {\n          this.dbxModelTrackerService.trackViewedObject(x.modelKeyTypeNamePair, x.context);\n        })\n      ),\n    { dispatch: false }\n  );\n\n  readonly changeTrackerFolderToMatchAuth$ = createEffect(\n    () =>\n      this.actions$.pipe(\n        ofType(onDbxAppAuth.DbxAppAuthUserActions.setUserIdentifier),\n        map((x) => x.id),\n        filter(Boolean),\n        distinctUntilChanged(),\n        tap((accountId) => {\n          this.dbxModelTrackerService.defaultFolder = accountId;\n        })\n      ),\n    { dispatch: false }\n  );\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { onDbxModel } from './state';\nimport { type DbxModelObjectViewedParams } from './state/actions/model.actions';\nimport { type DbxModelFullState } from './state/state';\n\n/**\n * Service that dispatches model-related NgRx store actions, such as emitting model view events to the store for tracking.\n */\n@Injectable()\nexport class DbxModelObjectStateService {\n  readonly store = inject(Store<DbxModelFullState>);\n\n  /**\n   * Emit a model viewed event.\n   *\n   * @param params - The model viewed event parameters.\n   * @param params.modelKeyTypeNamePair - Identifies the model that was viewed.\n   * @param params.context - Optional context describing how the model was viewed.\n   */\n  emitModelViewEvent({ modelKeyTypeNamePair, context }: DbxModelObjectViewedParams): void {\n    this.store.dispatch(onDbxModel.DbxModelStateModelActions.emitObjectViewEvent({ modelKeyTypeNamePair, context }));\n  }\n}\n","import { type EnvironmentProviders, type Provider, makeEnvironmentProviders } from '@angular/core';\nimport { SimpleStorageAccessorFactory, type StorageAccessor } from '@dereekb/dbx-core';\nimport { provideEffects } from '@ngrx/effects';\nimport { provideState } from '@ngrx/store';\nimport { type DbxModelViewTrackerEventSet } from './model.tracker';\nimport { DbxModelTrackerService } from './model.tracker.service';\nimport { DBX_MODEL_VIEW_TRACKER_STORAGE_ACCESSOR_TOKEN, DbxModelViewTrackerStorage } from './model.tracker.view.storage';\nimport { fromDbxModel } from './state';\nimport { DbxModelTrackerEffects } from './state/effects/tracker.effects';\nimport { DbxModelObjectStateService } from './model.state.service';\n\n/**\n * Creates a {@link StorageAccessor} for persisting model view tracker events using the `mtvs` storage prefix.\n *\n * @param storageAccessorFactory - The factory used to create typed storage accessors.\n * @returns A storage accessor configured with the `mtvs` prefix for model view tracker events.\n *\n * @example\n * ```typescript\n * const accessor = defaultDbxModelViewTrackerStorageAccessorFactory(storageAccessorFactory);\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function defaultDbxModelViewTrackerStorageAccessorFactory(storageAccessorFactory: SimpleStorageAccessorFactory): StorageAccessor<DbxModelViewTrackerEventSet> {\n  return storageAccessorFactory.createStorageAccessor<DbxModelViewTrackerEventSet>({\n    prefix: 'mtvs'\n  });\n}\n\n/**\n * Creates EnvironmentProviders for providing DbxModelTrackerService, DbxModelObjectStateService and sets up the NgRx store for DbxModelTrackerEffects.\n *\n * @returns EnvironmentProviders.\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function provideDbxModelService(): EnvironmentProviders {\n  const providers: (Provider | EnvironmentProviders)[] = [\n    // Storage accessor\n    {\n      provide: DBX_MODEL_VIEW_TRACKER_STORAGE_ACCESSOR_TOKEN,\n      useFactory: defaultDbxModelViewTrackerStorageAccessorFactory,\n      deps: [SimpleStorageAccessorFactory]\n    },\n    // Service\n    DbxModelViewTrackerStorage,\n    DbxModelTrackerService,\n    DbxModelObjectStateService,\n    // NgRx\n    provideEffects([DbxModelTrackerEffects]),\n    provideState(fromDbxModel.FEATURE_KEY, fromDbxModel.reducers)\n  ];\n\n  return makeEnvironmentProviders(providers);\n}\n","import { type Maybe, type ModelKey, type ModelKeyTypeNamePair, type UnixDateTimeSecondsNumber } from '@dereekb/util';\n\n/**\n * String identifier for the context in which a model was viewed (e.g., \"list\", \"detail\").\n */\nexport type ModelViewContext = string;\n\n/**\n * Represents a single model view event, recording when and in what context a specific model was viewed.\n */\nexport interface DbxModelViewTrackerEvent {\n  /**\n   * Event time\n   */\n  readonly d?: UnixDateTimeSecondsNumber;\n  /**\n   * Context\n   */\n  readonly c?: Maybe<ModelViewContext>;\n  /**\n   * Model info\n   */\n  readonly m: ModelKeyTypeNamePair;\n  readonly folder?: Maybe<string>;\n}\n\n/**\n * A set of model view tracker events with a timestamp of the latest event, used for storage and retrieval.\n */\nexport interface DbxModelViewTrackerEventSet {\n  /**\n   * The latest date/time number.\n   */\n  readonly l: UnixDateTimeSecondsNumber;\n  /**\n   * List of events.\n   */\n  readonly e: DbxModelViewTrackerEvent[];\n}\n\n/**\n * Extracts all model keys from a {@link DbxModelViewTrackerEventSet}.\n *\n * @param eventSet - The event set from which to extract model keys.\n * @returns Array of model keys from all events in the set.\n *\n * @example\n * ```typescript\n * const keys = allDbxModelViewTrackerEventSetModelKeys(eventSet);\n * ```\n */\nexport function allDbxModelViewTrackerEventSetModelKeys(eventSet: DbxModelViewTrackerEventSet): ModelKey[] {\n  return allDbxModelViewTrackerEventModelKeys(eventSet.e);\n}\n\n/**\n * Extracts all model keys from an array of {@link DbxModelViewTrackerEvent}.\n *\n * @param events - Array of view tracker events from which to extract model keys.\n * @returns Array of model keys, one per event.\n *\n * @example\n * ```typescript\n * const keys = allDbxModelViewTrackerEventModelKeys(events);\n * ```\n */\nexport function allDbxModelViewTrackerEventModelKeys(events: DbxModelViewTrackerEvent[]): ModelKey[] {\n  return events.map((y) => y.m.key);\n}\n","import { Service, Injector, inject } from '@angular/core';\nimport { capitalCase } from 'change-case-all';\nimport { map, shareReplay, type Observable, BehaviorSubject } from 'rxjs';\nimport { type ArrayOrValue, type Building, type ModelTypeString, useIterableOrValue } from '@dereekb/util';\nimport { type DbxModelTypeConfiguration, type DbxModelTypeConfigurationMap } from './model.types';\n\n/**\n * Resolved model type information, extending configuration with computed properties like navigation capability.\n */\nexport interface DbxModelTypeInfo extends Omit<DbxModelTypeConfiguration, 'srefFactory'> {\n  /**\n   * Whether or not a response is expected for segues\n   * to a view for objects of this type.\n   */\n  readonly canSegueToView: boolean;\n}\n\n/**\n * Map of model type strings to their resolved {@link DbxModelTypeInfo} entries.\n */\nexport interface DbxModelTypesMap<I extends DbxModelTypeInfo> {\n  readonly [type: string]: I;\n}\n\n/**\n * Map of model type strings to their Material icon names.\n */\nexport interface DbxModelIconsMap {\n  readonly [type: string]: string;\n}\n\n/**\n * Registry service for model type configurations. Provides reactive access to model type information, icons, and navigation capability. Resolves labels, analytics names, and segue refs from registered configurations.\n *\n * @example\n * ```typescript\n * modelTypesService.addTypeConfigs({ modelType: 'user', label: 'User', icon: 'person' });\n * ```\n */\n@Service()\nexport class DbxModelTypesService<I extends DbxModelTypeInfo = DbxModelTypeInfo> {\n  static readonly DEFAULT_ICON = 'help_outline';\n\n  readonly injector = inject(Injector);\n\n  private readonly _configs = new BehaviorSubject<DbxModelTypeConfigurationMap>({});\n\n  // MARK: Configuration\n  /**\n   * Registers one or more model type configurations. Merges with any previously registered configs.\n   *\n   * @param configs - Single or array of model type configurations to register.\n   */\n  addTypeConfigs(configs: ArrayOrValue<DbxModelTypeConfiguration>) {\n    const types = {\n      ...this._configs.value\n    };\n\n    useIterableOrValue(configs, (config) => {\n      types[config.modelType] = config;\n    });\n\n    this._configs.next(types);\n  }\n\n  /**\n   * Registers model type configurations from a map, merging with existing configs.\n   *\n   * @param configs - Map of model type strings to their configurations.\n   */\n  addTypeConfigsMap(configs: DbxModelTypeConfigurationMap) {\n    const newConfig: DbxModelTypeConfigurationMap = {\n      ...this._configs.value,\n      ...configs\n    };\n\n    this._configs.next(newConfig);\n  }\n\n  // MARK: Accessors\n  /**\n   * Observable map of all registered model types to their resolved {@link DbxModelTypeInfo} entries.\n   */\n  readonly typesMap$ = this._configs.pipe(\n    map((types) => {\n      const typesMap: Building<DbxModelTypesMap<I>> = {};\n\n      Object.keys(types).forEach((type) => {\n        const config = types[type];\n\n        const label = config.label || capitalCase(type);\n        const analyticsName = config.analyticsName || label;\n        const sref = config.srefBuilder ? config.srefBuilder(this.injector) : config.sref;\n\n        typesMap[type] = {\n          ...config,\n          sref,\n          label,\n          analyticsName,\n          icon: config.icon ?? DbxModelTypesService.DEFAULT_ICON,\n          canSegueToView: Boolean(sref)\n        } as I;\n      });\n\n      return typesMap as DbxModelTypesMap<I>;\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * Observable map of model type strings to their Material icon names.\n   */\n  readonly iconMap$: Observable<DbxModelIconsMap> = this.typesMap$.pipe(\n    map((types) => {\n      const iconsMap: Building<DbxModelIconsMap> = {};\n\n      Object.keys(types).forEach((type) => {\n        iconsMap[type] = types[type].icon;\n      });\n\n      return iconsMap as DbxModelIconsMap;\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * Returns an observable of the Material icon name for the given model type.\n   *\n   * @param type - The model type string to look up.\n   * @returns Observable emitting the icon name for the given model type.\n   */\n  iconForType(type: ModelTypeString): Observable<string> {\n    return this.iconMap$.pipe(map((x) => x[type]));\n  }\n}\n","import { Component, ElementRef, computed, inject, input, viewChild } from '@angular/core';\nimport { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser';\nimport { clean, type DbxButtonDisplay } from '@dereekb/dbx-core';\nimport { DbxButtonComponent } from '../../../button/button.component';\nimport { type DbxButtonDisplayStylePair, type DbxButtonStyle } from '../../../button/button';\nimport { DbxActionModule } from '../../../action/action.module';\nimport { browserObjectUrlRef } from '@dereekb/browser';\nimport { asPromise, type Getter, type Maybe, type PromiseOrValue, safeCompareEquality } from '@dereekb/util';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, from, type Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { NgClass } from '@angular/common';\n\n/**\n * Configuration for the {@link DbxDownloadBlobButtonComponent} that controls what blob to download and how the button appears.\n */\nexport interface DbxDownloadBlobButtonConfig {\n  /**\n   * Custom button style pair to use.\n   */\n  readonly buttonStylePair?: Maybe<DbxButtonDisplayStylePair>;\n  /**\n   * Name of the file to save when downloaded.\n   */\n  readonly fileName?: Maybe<string>;\n  /**\n   * Blob to download.\n   */\n  readonly blob?: Maybe<Blob>;\n  /**\n   * Getter for the blob to download.\n   */\n  readonly loadBlob?: Maybe<Getter<PromiseOrValue<Maybe<Blob>>>>;\n  /**\n   * Whether or not to preload the blob from the blobGetter instead of waiting for the button to be moused over.\n   *\n   * Ignored if blobGetter is not provided.\n   */\n  readonly preloadBlob?: Maybe<boolean>;\n}\n\n/**\n * Button that downloads an arbitrary blob as a file when clicked. Supports both pre-loaded blobs and lazy-loaded blobs via a getter function.\n *\n * @example\n * ```html\n * <dbx-download-blob-button [config]=\"{ blob: myBlob, fileName: 'report.pdf' }\"></dbx-download-blob-button>\n * ```\n */\n@Component({\n  selector: 'dbx-download-blob-button',\n  template: `\n    <a #downloadButton [ngClass]=\"{ 'pointer-disabled': !downloadReadySignal() }\" e [href]=\"fileUrlSignal()\" [attr.download]=\"fileNameSignal()\"><dbx-button [buttonDisplay]=\"buttonDisplaySignal()\" [buttonStyle]=\"buttonStyleSignal()\" [working]=\"!downloadReadySignal()\" [disabled]=\"!downloadReadySignal()\"></dbx-button></a>\n  `,\n  imports: [NgClass, DbxActionModule, DbxButtonComponent]\n})\nexport class DbxDownloadBlobButtonComponent {\n  private readonly _sanitizer = inject(DomSanitizer);\n  private readonly _browserObjectUrl = clean(browserObjectUrlRef());\n\n  readonly config = input<Maybe<DbxDownloadBlobButtonConfig>>(undefined);\n\n  readonly downloadButton = viewChild<string, Maybe<ElementRef>>('downloadButton', { read: ElementRef });\n\n  readonly config$ = toObservable(this.config);\n\n  readonly blob$: Observable<Maybe<Blob>> = this.config$.pipe(\n    distinctUntilChanged((x, y) => safeCompareEquality(x, y, (a, b) => a?.blob === b?.blob && a?.loadBlob === b?.loadBlob)),\n    switchMap((x) => {\n      let obs: Observable<Maybe<Blob>>;\n\n      if (x?.loadBlob) {\n        obs = from(asPromise(x.loadBlob()));\n      } else {\n        obs = of(x?.blob);\n      }\n\n      return obs;\n    }),\n    shareReplay(1)\n  );\n\n  readonly blobSignal = toSignal(this.blob$);\n\n  readonly fileUrlSignal = computed(() => {\n    const blob = this.blobSignal();\n\n    let fileUrl: Maybe<SafeResourceUrl> = undefined;\n\n    if (blob) {\n      const objectUrl = this._browserObjectUrl.createBrowserUrl(blob);\n      fileUrl = this._sanitizer.bypassSecurityTrustResourceUrl(objectUrl);\n    }\n\n    return fileUrl;\n  });\n\n  readonly fileNameSignal = computed(() => this.config()?.fileName ?? 'File');\n\n  readonly downloadReadySignal = computed(() => {\n    const downloadButton = this.downloadButton();\n    const fileName = this.fileNameSignal();\n    const fileUrl = this.fileUrlSignal();\n    return Boolean(downloadButton && fileName && fileUrl);\n  });\n\n  readonly buttonDisplaySignal = computed(() => {\n    const config = this.config();\n    const buttonDisplay = config?.buttonStylePair?.display;\n\n    const display: DbxButtonDisplay = buttonDisplay ?? {\n      icon: 'download',\n      text: 'Download'\n    };\n\n    return display;\n  });\n\n  readonly buttonStyleSignal = computed(() => {\n    const config = this.config();\n    const buttonStyle = config?.buttonStylePair?.style;\n\n    const style: DbxButtonStyle = buttonStyle ?? {\n      type: 'raised'\n    };\n\n    return style;\n  });\n}\n","import { type Maybe } from '@dereekb/util';\nimport { type DbxDownloadBlobButtonConfig } from '../blob/download.blob.button.component';\n\n/**\n * How a file list item renders its details date.\n *\n * `'distance'` renders the date relative to now (\"3 hours ago\", \"in 2 days\"), and `'distance-past'` does\n * the same for a date that describes something that ALREADY HAPPENED — clamping it to now so it can never\n * read as the future. The remaining values are passed through to Angular's DatePipe.\n *\n * Prefer `'distance-past'` for an uploaded-at or created-at date. A stored timestamp lands marginally\n * ahead of the client more often than it looks: a clock a second out will do it, and so will a value\n * stored as whole Unix seconds, which rounds UP. Under `'distance'` such a date reads \"in less than a\n * minute\", which for something that already happened is nonsense.\n */\nexport type DbxFileListItemDetailsDateStyle = 'distance' | 'distance-past' | 'short' | 'medium' | 'long';\n\n/**\n * Default details date style used by a file list item.\n */\nexport const DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_DATE_STYLE: DbxFileListItemDetailsDateStyle = 'short';\n\n/**\n * Default css class applied to a file list item's details line.\n */\nexport const DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_CLASS = 'dbx-hint';\n\n/**\n * Configuration for the {@link DbxFileListItemComponent}.\n */\nexport interface DbxFileListItemComponentConfig {\n  /**\n   * The file's name. Shown on the item's first line.\n   */\n  readonly name?: Maybe<string>;\n  /**\n   * Optional leading icon.\n   *\n   * Leave undefined when the item is rendered inside a dbx-list, as the list renders the\n   * item's own icon itself.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Static text for the second line. Rendered before {@link detailsDate} when both are set.\n   */\n  readonly details?: Maybe<string>;\n  /**\n   * Date for the second line.\n   */\n  readonly detailsDate?: Maybe<Date>;\n  /**\n   * How {@link detailsDate} is rendered. Defaults to {@link DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_DATE_STYLE}.\n   */\n  readonly detailsDateStyle?: Maybe<DbxFileListItemDetailsDateStyle>;\n  /**\n   * Css class applied to the second line. Defaults to {@link DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_CLASS}.\n   *\n   * Use `'dbx-warn'` to mark a file that failed.\n   */\n  readonly detailsClass?: Maybe<string>;\n}\n\n/**\n * A single row of a {@link DbxFileListComponent}.\n */\nexport interface DbxFileListEntry<T = unknown> extends DbxFileListItemComponentConfig {\n  /**\n   * Stable key used to track the entry across updates.\n   */\n  readonly key: string;\n  /**\n   * Configuration for the row's download button. The button is not rendered when this is not set.\n   */\n  readonly download?: Maybe<DbxDownloadBlobButtonConfig>;\n  /**\n   * Arbitrary value the entry was derived from.\n   */\n  readonly data?: T;\n}\n\n/**\n * Configuration for the {@link DbxFileListComponent}.\n */\nexport interface DbxFileListComponentConfig<T = unknown> {\n  /**\n   * The entries to list.\n   */\n  readonly entries?: Maybe<DbxFileListEntry<T>[]>;\n  /**\n   * What is shown in place of the list while it has no entries. Nothing is shown when this is not set.\n   */\n  readonly emptyText?: Maybe<string>;\n}\n","/**\n * Set of screen media width types. Their pixel sizes correspond with the DbxScreenMediaService's configuration.\n *\n * Values:\n * - micro: Screen is considered mobile.\n * - small: Screen is consider small, but larger than mobile.\n * - tablet: Screen is considered tablet size.\n * - large: Screen is considered large than a tablet, but not full size.\n * - full: Screen is greater than large.\n */\nexport type ScreenMediaWidthType = 'micro' | 'small' | 'tablet' | 'large' | 'full';\n\n/**\n * Ordered numeric mapping of {@link ScreenMediaWidthType} for size comparisons.\n */\nexport const SCREEN_MEDIA_WIDTH_TYPE_SIZE_MAP = {\n  micro: 0,\n  small: 1,\n  tablet: 2,\n  large: 3,\n  full: 4\n};\n\n/**\n * Describes the current screen's vertical space.\n *\n * Values:\n * - tiny: Screen height is tiny, potentially the size of the navigation alone.\n * - normal: Screen has a normal height.\n */\nexport type ScreenMediaHeightType = 'tiny' | 'normal';\n\n/**\n * Returns `true` if the current screen width type is at least as wide as the given breakpoint.\n *\n * @param current - The current screen width type.\n * @param breakpoint - The minimum width type to check against.\n * @returns `true` if the current width type meets or exceeds the breakpoint.\n *\n * @example\n * ```ts\n * screenMediaWidthTypeIsActive('tablet', 'small'); // true\n * screenMediaWidthTypeIsActive('micro', 'tablet'); // false\n * ```\n */\nexport function screenMediaWidthTypeIsActive(current: ScreenMediaWidthType, breakpoint: ScreenMediaWidthType) {\n  return compareScreenMediaWidthTypes(current, breakpoint, (a, b) => a >= b);\n}\n\n/**\n * Compares two {@link ScreenMediaWidthType} values using a custom comparator on their numeric sizes.\n *\n * @param a - The first screen width type.\n * @param b - The second screen width type.\n * @param compare - A comparator function applied to the numeric size values of `a` and `b`\n * @returns The result of applying the comparator to the mapped numeric sizes.\n */\nexport function compareScreenMediaWidthTypes(a: ScreenMediaWidthType, b: ScreenMediaWidthType, compare: (a: number, b: number) => boolean) {\n  return compare(SCREEN_MEDIA_WIDTH_TYPE_SIZE_MAP[a], SCREEN_MEDIA_WIDTH_TYPE_SIZE_MAP[b]);\n}\n","import { type Destroyable } from '@dereekb/util';\nimport { MediaMatcher } from '@angular/cdk/layout';\nimport { type ObservableOrValue, asObservable, initialize } from '@dereekb/rxjs';\nimport { Subject, map, shareReplay, distinctUntilChanged, throttleTime, type Observable, combineLatest } from 'rxjs';\nimport { type ScreenMediaWidthType, type ScreenMediaHeightType, screenMediaWidthTypeIsActive } from './screen';\nimport { Injectable, inject } from '@angular/core';\n\n/**\n * Abstract configuration class for {@link DbxScreenMediaService} defining responsive breakpoints.\n *\n * Provide a concrete instance via {@link provideDbxScreenMediaService} or supply values directly.\n */\nexport abstract class DbxScreenMediaServiceConfig {\n  /**\n   * The maximum size of a micro screen. Any size bigger than this is considered a small screen or larger.\n   */\n  abstract microScreenWidthMax: number;\n  /**\n   * The maximum size of a small screen. Any size bigger than this is considered a tablet screen or larger.\n   */\n  abstract smallScreenWidthMax: number;\n  /**\n   * The maximum size of a tablet screen. Any size bigger than this is considered a large screen or larger.\n   */\n  abstract tabletScreenWidthMax: number;\n  /**\n   * The maximum size of a large screen. Any size bigger than this is considered full.\n   */\n  abstract largeScreenWidthMax: number;\n  /**\n   * The maximum size of a tiny screen. Any size bigger than this is considered normal.\n   */\n  abstract tinyScreenHeightMax: number;\n}\n\n/**\n * Default responsive breakpoint configuration with standard mobile/tablet/desktop thresholds.\n */\nexport const DEFAULT_SCREEN_MEDIA_SERVICE_CONFIG: DbxScreenMediaServiceConfig = {\n  microScreenWidthMax: 360,\n  smallScreenWidthMax: 520,\n  tabletScreenWidthMax: 786,\n  largeScreenWidthMax: 1280,\n  tinyScreenHeightMax: 280\n};\n\n/**\n * Reactive service that tracks the current screen width and height categories using CSS media queries.\n *\n * Emits {@link ScreenMediaWidthType} and {@link ScreenMediaHeightType} values that update\n * as the viewport is resized. Use {@link isBreakpointActive} to reactively check whether\n * the screen meets a minimum width breakpoint.\n *\n * @example\n * ```ts\n * readonly screenService = inject(DbxScreenMediaService);\n * readonly isTabletOrLarger$ = this.screenService.isBreakpointActive('tablet');\n * ```\n */\n@Injectable()\nexport class DbxScreenMediaService implements Destroyable {\n  private readonly _media = inject(MediaMatcher);\n\n  private readonly _microQuery: MediaQueryList;\n  private readonly _smallQuery: MediaQueryList;\n  private readonly _tabletQuery: MediaQueryList;\n  private readonly _largeQuery: MediaQueryList;\n\n  private readonly _tinyHeightQuery: MediaQueryList;\n\n  private readonly _updateWidth = new Subject<void>();\n  private readonly _updateHeight = new Subject<void>();\n\n  readonly widthType$: Observable<ScreenMediaWidthType> = this._updateWidth.pipe(\n    initialize(() => this._updateWidth.next()),\n    throttleTime(100, undefined, { leading: true, trailing: true }),\n    map(() => this._readWidthType()),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly heightType$: Observable<ScreenMediaHeightType> = this._updateWidth.pipe(\n    initialize(() => this._updateHeight.next()),\n    throttleTime(100, undefined, { leading: true, trailing: true }),\n    map(() => this._readHeightType()),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  constructor() {\n    const { microScreenWidthMax, smallScreenWidthMax, tabletScreenWidthMax, largeScreenWidthMax } = inject(DbxScreenMediaServiceConfig);\n\n    this._microQuery = this._media.matchMedia(`screen and (max-width:${microScreenWidthMax}px)`);\n    this._smallQuery = this._media.matchMedia(`screen and (max-width:${smallScreenWidthMax}px)`);\n    this._tabletQuery = this._media.matchMedia(`screen and (max-width:${tabletScreenWidthMax}px)`);\n    this._largeQuery = this._media.matchMedia(`screen and (max-width:${largeScreenWidthMax}px)`);\n\n    this._tinyHeightQuery = this._media.matchMedia(`screen and (max-width:${largeScreenWidthMax}px)`);\n\n    const widthHandler: (ev: MediaQueryListEvent) => void = () => this._updateWidth.next();\n    const heightHandler: (ev: MediaQueryListEvent) => void = () => this._updateHeight.next();\n\n    this._microQuery.onchange = widthHandler;\n    this._smallQuery.onchange = widthHandler;\n    this._tabletQuery.onchange = widthHandler;\n    this._largeQuery.onchange = widthHandler;\n    this._tinyHeightQuery.onchange = heightHandler;\n  }\n\n  destroy(): void {\n    this._microQuery.onchange = null;\n    this._smallQuery.onchange = null;\n    this._tabletQuery.onchange = null;\n    this._largeQuery.onchange = null;\n    this._updateWidth.complete();\n    this._updateHeight.complete();\n  }\n\n  /**\n   * Returns an observable that emits `true` when the current screen width is at least as wide as the given breakpoint.\n   *\n   * @param inputBreakpoint - The minimum width type or an observable of it.\n   * @returns Observable of whether the breakpoint is currently active.\n   */\n  isBreakpointActive(inputBreakpoint: ObservableOrValue<ScreenMediaWidthType>): Observable<boolean> {\n    return combineLatest([this.widthType$, asObservable(inputBreakpoint)]).pipe(\n      map(([current, breakpoint]) => screenMediaWidthTypeIsActive(current, breakpoint)),\n      distinctUntilChanged(),\n      shareReplay(1)\n    );\n  }\n\n  private _readWidthType(): ScreenMediaWidthType {\n    let width: ScreenMediaWidthType;\n\n    if (this._microQuery.matches) {\n      width = 'micro';\n    } else if (this._smallQuery.matches) {\n      width = 'small';\n    } else if (this._tabletQuery.matches) {\n      width = 'tablet';\n    } else if (this._largeQuery.matches) {\n      width = 'large';\n    } else {\n      width = 'full';\n    }\n\n    return width;\n  }\n\n  private _readHeightType(): ScreenMediaHeightType {\n    return this._tinyHeightQuery ? 'tiny' : 'normal';\n  }\n}\n","import { Directive, computed, inject, input } from '@angular/core';\nimport { DbxScreenMediaService } from '../../screen/screen.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Calculates and applies a dynamic height to a Material expansion panel header based on text content.\n *\n * Sets the `--mat-expansion-header-collapsed-state-height` and `--mat-expansion-header-expanded-state-height`\n * CSS custom properties. On small screens, the estimated line count is scaled up to account for text wrapping.\n * If the calculated height is zero or nullish, no style override is applied.\n *\n * @example\n * ```html\n * <mat-expansion-panel [dbxAccordionHeaderHeight]=\"64\" [heightText]=\"item.description\" [maxHeaderHeight]=\"120\">\n *   <mat-expansion-panel-header>\n *     {{ item.title }}\n *   </mat-expansion-panel-header>\n *   <p>Panel content</p>\n * </mat-expansion-panel>\n * ```\n */\n@Directive({\n  selector: '[dbxAccordionHeaderHeight]',\n  host: {\n    '[style]': 'expansionPanelStyleSignal()'\n  }\n})\nexport class DbxAccordionHeaderHeightDirective {\n  private readonly _screenMediaService = inject(DbxScreenMediaService);\n\n  /**\n   * The base height of the header.\n   */\n  readonly dbxAccordionHeaderHeight = input<Maybe<number>>(60);\n\n  /**\n   * The amount of height to add to the header when expanded.\n   */\n  readonly expandedHeightIncrease = input<Maybe<number>>(undefined);\n\n  /**\n   * The maximum allowed height of the header.\n   */\n  readonly maxHeaderHeight = input<Maybe<number>>(undefined);\n\n  /**\n   * Text used to help determine the height of the header.\n   *\n   * Height will stay static to the given header height when this is not set.\n   *\n   * Ignored if heightTextLines is set.\n   */\n  readonly heightText = input<Maybe<string>>(undefined);\n\n  /**\n   * The number of characters used for calculating a line.\n   */\n  readonly heightTextLineLength = input<number>(30);\n\n  /**\n   * Number of lines of text to use for the height calculation.\n   */\n  readonly heightTextLines = input<Maybe<number>>(undefined);\n\n  /**\n   * The amount of height to add for every line of text.\n   */\n  readonly heightTextLineHeight = input<number>(20);\n\n  /**\n   * Multiplier to apply to the height on small screens.\n   */\n  readonly heightTextSmallScreenMultiplier = input<Maybe<number>>(1.6);\n\n  readonly widthTypeSignal = toSignal(this._screenMediaService.widthType$);\n\n  readonly expansionPanelHeightSignal = computed(() => {\n    const heightTextSmallScreenMultiplier = this.heightTextSmallScreenMultiplier();\n    const baseHeight = this.dbxAccordionHeaderHeight();\n    const text = this.heightText();\n    const textLines = this.heightTextLines();\n    const textLineLength = this.heightTextLineLength();\n    const textLineHeight = this.heightTextLineHeight();\n    const maxHeaderHeight = this.maxHeaderHeight();\n    const widthType = this.widthTypeSignal();\n    const isSmallScreen = widthType === 'micro' || widthType === 'small';\n\n    let height: Maybe<number>;\n\n    // calculate lines from text content or use the provided line count\n    let lines: Maybe<number> = textLines;\n\n    if (text && textLines == null) {\n      const lineLength = textLineLength;\n      lines = Math.ceil(text.length / lineLength);\n    }\n\n    if (lines != null && lines > 0) {\n      const lineHeight = textLineHeight;\n\n      // on small screens text wraps more, so scale up estimated lines\n      if (isSmallScreen) {\n        const multiplier = heightTextSmallScreenMultiplier ?? 1.6;\n        lines = Math.ceil(lines * multiplier);\n      }\n\n      height = (baseHeight ?? 60) + lines * lineHeight;\n    } else {\n      height = baseHeight;\n    }\n\n    if (maxHeaderHeight != null && height != null && height > maxHeaderHeight) {\n      height = maxHeaderHeight;\n    }\n\n    return height;\n  });\n\n  readonly expansionPanelStyleSignal = computed(() => {\n    const height = this.expansionPanelHeightSignal();\n    const expandedHeightIncrease = this.expandedHeightIncrease() ?? 0;\n\n    let result: Maybe<Record<string, string>>;\n\n    if (height != null && height > 0) {\n      result = {\n        '--mat-expansion-header-collapsed-state-height': `${height}px`,\n        '--mat-expansion-header-expanded-state-height': `${height + expandedHeightIncrease}px`\n      };\n    }\n\n    return result;\n  });\n}\n","import { InjectionToken } from '@angular/core';\nimport { type AuthUserIdentifier } from '@dereekb/dbx-core';\nimport { type Maybe, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { type DbxColorInput, type DbxColorTone } from '../style/style';\n\n/**\n * Arbitrary string selector used to differentiate avatars by category or context.\n */\nexport type DbxAvatarSelector = string;\n\n/**\n * Arbitrary key used to configure an avatar from a predefined set of avatar options.\n */\nexport type DbxAvatarKey = string;\n\n/**\n * Shape style applied to the avatar container. Defaults to `'circle'` when not specified.\n */\nexport type DbxAvatarStyle = 'circle' | 'square';\n\n/**\n * Size variant for the avatar display. Controls the rendered dimensions of the avatar.\n */\nexport type DbxAvatarSize = 'small' | 'normal' | 'large';\n\n/**\n * How an avatar image is fitted into the avatar box.\n *\n * `'cover'` fills the box and crops (the right choice for a photo); `'contain'` fits the whole image\n * inside the box (the right choice for a brand logo, which must never be cropped).\n */\nexport type DbxAvatarImageFit = 'cover' | 'contain';\n\n/**\n * Contextual information for displaying an avatar, including its image URL, fallback icon, style, and user association.\n *\n * Passed to avatar components via the {@link DBX_AVATAR_CONTEXT_DATA_TOKEN} injection token.\n */\nexport interface DbxAvatarContext {\n  /**\n   * An arbitrary discriminator used to differentiate avatars.\n   */\n  readonly selector?: Maybe<DbxAvatarSelector>;\n  /**\n   * User identifier.\n   *\n   * May be used in some cases to display a user-specific avatar.\n   */\n  readonly uid?: Maybe<AuthUserIdentifier>;\n  /**\n   * A full website URL to an avatar image.\n   */\n  readonly url?: Maybe<WebsiteUrlWithPrefix>;\n  /**\n   * Name or characters used to render initials (e.g. `'Michelle B'` -> `'MB'`, `'BB'` -> `'BB'`) on a\n   * curated color background when no avatar image is shown. The same value always maps to the same\n   * curated color.\n   */\n  readonly name?: Maybe<string>;\n  /**\n   * Arbitrary key that is used to configure an avatar.\n   */\n  readonly key?: Maybe<DbxAvatarKey>;\n  /**\n   * The avatar style.\n   */\n  readonly style?: DbxAvatarStyle;\n  /**\n   * Icon name to use for the fallback avatar when no image is provided.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * If true, when the image cannot be loaded then the entire avatar view should be hidden.\n   */\n  readonly hideOnError?: Maybe<boolean>;\n  /**\n   * If true, the avatar renders with the `<dbx-icon-tile>` presentation: the avatar view takes the\n   * `dbx-icon-tile` class, so the `--dbx-icon-tile-*` customizations and the tile's `[dbxColor]`\n   * surface apply. Use it for a branded/iconographic avatar rather than a person's photo.\n   */\n  readonly tile?: Maybe<boolean>;\n  /**\n   * Color painted behind the avatar. Pair with {@link colorTone} for a tonal (muted) surface.\n   */\n  readonly color?: Maybe<DbxColorInput>;\n  /**\n   * Background tone level (0-100) for {@link color}.\n   */\n  readonly colorTone?: Maybe<DbxColorTone>;\n  /**\n   * How the avatar image fills the avatar box. Defaults to `'contain'` in {@link tile} mode (a logo\n   * must not be cropped) and `'cover'` otherwise.\n   */\n  readonly imageFit?: Maybe<DbxAvatarImageFit>;\n  /**\n   * Optional CSS filter applied to the avatar image (e.g. `'brightness(0) invert(1)'` to force a\n   * single-color logo to render white).\n   */\n  readonly imageFilter?: Maybe<string>;\n  /**\n   * If true, `DbxAvatarViewService.defaultAvatarUrl` is not used when no url is available.\n   *\n   * That default is an app-wide *person* placeholder; an avatar that means to fall through to its\n   * {@link icon} (a provider tile, say) has to be able to opt out of it.\n   */\n  readonly ignoreDefaultUrl?: Maybe<boolean>;\n}\n\n// MARK: Injection Token\n/**\n * Injection token for the avatar context data.\n */\nexport const DBX_AVATAR_CONTEXT_DATA_TOKEN = new InjectionToken<DbxAvatarContext>('DbxAvatarContextData');\n","import { Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { type Maybe, nameToInitials, type WebsitePath, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { DbxAvatarViewService } from './avatar.service';\nimport { type DbxAvatarContext, DBX_AVATAR_CONTEXT_DATA_TOKEN, type DbxAvatarImageFit, type DbxAvatarStyle } from './avatar';\nimport { DbxColorDirective } from '../style/style.color.directive';\nimport { DbxColorService } from '../style/style.color.service';\nimport { type DbxColorConfig, type DbxColorInput, type DbxColorTone, dbxCuratedColorConfigForString } from '../style/style';\n\n/**\n * Displays an avatar image with automatic fallback to name initials and then a Material icon when no image is\n * available or when the image fails to load.\n *\n * Supports circle and square styles, and can optionally hide entirely on image error.\n * Receives context via the {@link DBX_AVATAR_CONTEXT_DATA_TOKEN} injection token or direct inputs.\n *\n * In tile mode the host also takes the `dbx-icon-tile` class, so the `--dbx-icon-tile-*` customizations and the\n * tile's own `.dbx-color` surface rule apply to the avatar. The color is pushed into the host\n * {@link DbxColorDirective} rather than bound by the caller, since the avatar view is usually created dynamically\n * by {@link DbxAvatarComponent} and has no template bindings of its own.\n *\n * @example\n * ```html\n * <dbx-avatar-view [avatarUrl]=\"user.photoUrl\" [avatarStyle]=\"'circle'\" [avatarIcon]=\"'account_circle'\"></dbx-avatar-view>\n * ```\n */\n@Component({\n  selector: 'dbx-avatar-view',\n  template: `\n    @if (avatarUrlSignal()) {\n      <img (error)=\"onAvatarImageError($event)\" class=\"dbx-avatar-view-img\" [class.dbx-avatar-view-img-contain]=\"avatarImageFitSignal() === 'contain'\" [style.filter]=\"avatarImageFilterSignal()\" [src]=\"avatarUrlSignal()!\" alt=\".\" loading=\"lazy\" decoding=\"async\" />\n    } @else if (initialsSignal()) {\n      <div class=\"dbx-avatar-view-initials\" [dbxColor]=\"curatedColorSignal()\" aria-hidden=\"true\">{{ initialsSignal() }}</div>\n    } @else {\n      <div class=\"dbx-avatar-view-fallback\" aria-hidden=\"true\">\n        <mat-icon>{{ avatarIconSignal() }}</mat-icon>\n      </div>\n    }\n  `,\n  host: {\n    class: 'dbx-avatar-view',\n    '[class.dbx-avatar-view-error]': 'hasAvatarErrorSignal()',\n    '[class.dbx-avatar-view-circle]': 'avatarStyleClassSignal() === \"circle\"',\n    '[class.dbx-avatar-view-square]': 'avatarStyleClassSignal() === \"square\"',\n    '[class.dbx-avatar-view-with-avatar]': 'hasAvatarSignal()',\n    '[class.dbx-avatar-view-no-avatar]': 'missingAvatarSignal()',\n    '[class.dbx-avatar-view-with-initials]': 'hasInitialsSignal()',\n    '[class.dbx-avatar-view-hide-avatar]': 'hideAvatarSignal()',\n    // both: `dbx-icon-tile` brings the tile's presentation and customization vocabulary, and\n    // `dbx-avatar-view-tile` is the avatar-owned marker its overrides are scoped on.\n    '[class.dbx-icon-tile]': 'avatarTileSignal()',\n    '[class.dbx-avatar-view-tile]': 'avatarTileSignal()'\n  },\n  imports: [MatIconModule, DbxColorDirective],\n  hostDirectives: [DbxColorDirective]\n})\nexport class DbxAvatarViewComponent {\n  readonly defaultContext: Maybe<DbxAvatarContext> = inject(DBX_AVATAR_CONTEXT_DATA_TOKEN, { optional: true });\n\n  readonly avatarService = inject(DbxAvatarViewService);\n  readonly colorService = inject(DbxColorService, { optional: true });\n\n  readonly defaultAvatarUrl = this.avatarService.defaultAvatarUrl;\n\n  readonly avatarUrl = input<Maybe<WebsiteUrlWithPrefix>>();\n  readonly avatarErrorUrlSignal = signal<Maybe<boolean | WebsiteUrlWithPrefix>>(null);\n\n  readonly avatarName = input<Maybe<string>>();\n  readonly avatarStyle = input<Maybe<DbxAvatarStyle>>();\n  readonly avatarIcon = input<Maybe<string>>();\n  readonly avatarHideOnError = input<Maybe<boolean>>();\n  readonly avatarTile = input<Maybe<boolean>>();\n  readonly avatarColor = input<Maybe<DbxColorInput>>();\n  readonly avatarColorTone = input<Maybe<DbxColorTone>>();\n  readonly avatarImageFit = input<Maybe<DbxAvatarImageFit>>();\n  readonly avatarImageFilter = input<Maybe<string>>();\n  readonly avatarIgnoreDefaultUrl = input<Maybe<boolean>>();\n\n  constructor() {\n    const dbxColorDirective = inject(DbxColorDirective, { self: true });\n\n    // Pushes the resolved color/tone into the host DbxColorDirective, which provides the color tokens and the\n    // `.dbx-color` marker the surface paints from. Both are models for exactly this: the avatar view is created\n    // dynamically, so the caller has no element to bind the directive's inputs on.\n    effect(() => {\n      dbxColorDirective.dbxColor.set(this.avatarColorSignal());\n      dbxColorDirective.dbxColorTone.set(this.avatarColorToneSignal());\n    });\n  }\n\n  readonly avatarHideOnErrorSignal = computed(() => {\n    return this.avatarHideOnError() ?? this.defaultContext?.hideOnError ?? false;\n  });\n\n  readonly avatarTileSignal = computed(() => this.avatarTile() ?? this.defaultContext?.tile ?? false);\n\n  readonly avatarColorSignal = computed<Maybe<DbxColorInput>>(() => this.avatarColor() ?? this.defaultContext?.color);\n  readonly avatarColorToneSignal = computed<Maybe<DbxColorTone>>(() => this.avatarColorTone() ?? this.defaultContext?.colorTone);\n  readonly avatarImageFilterSignal = computed<Maybe<string>>(() => this.avatarImageFilter() ?? this.defaultContext?.imageFilter);\n\n  /**\n   * A tile is a branded surface, so its image defaults to `'contain'` — cropping a logo is never right.\n   */\n  readonly avatarImageFitSignal = computed<DbxAvatarImageFit>(() => {\n    const avatarTile = this.avatarTileSignal();\n    return this.avatarImageFit() ?? this.defaultContext?.imageFit ?? (avatarTile ? 'contain' : 'cover');\n  });\n\n  readonly avatarIgnoreDefaultUrlSignal = computed(() => this.avatarIgnoreDefaultUrl() ?? this.defaultContext?.ignoreDefaultUrl ?? false);\n\n  readonly currentAvatarUrlSignal = computed<Maybe<WebsiteUrlWithPrefix | WebsitePath>>(() => {\n    const directUrl = this.avatarUrl();\n    const contextUrl = this.defaultContext?.url;\n    // the service default is an app-wide person placeholder; an avatar that means to fall through to its icon\n    // (a provider tile, say) opts out of it rather than rendering someone else's placeholder.\n    const serviceDefaultUrl = this.avatarIgnoreDefaultUrlSignal() ? undefined : this.defaultAvatarUrl;\n\n    const url: Maybe<WebsiteUrlWithPrefix | WebsitePath> = directUrl ?? contextUrl ?? serviceDefaultUrl ?? undefined;\n    return url;\n  });\n\n  readonly hasAvatarErrorSignal = computed(() => {\n    const errorUrl = this.avatarErrorUrlSignal();\n    const currentUrl = this.currentAvatarUrlSignal();\n    return errorUrl === currentUrl;\n  });\n\n  readonly avatarUrlSignal = computed<Maybe<WebsiteUrlWithPrefix | WebsitePath>>(() => {\n    let url = this.currentAvatarUrlSignal();\n    const hasError = this.hasAvatarErrorSignal();\n\n    if (hasError) {\n      url = null;\n    }\n\n    return url;\n  });\n\n  readonly hasAvatarSignal = computed(() => !!this.avatarUrlSignal());\n  readonly missingAvatarSignal = computed(() => !this.hasAvatarSignal());\n\n  readonly avatarStyleClassSignal = computed<'circle' | 'square'>(() => {\n    return this.avatarStyle() ?? this.defaultContext?.style ?? 'circle';\n  });\n\n  readonly hideAvatarSignal = computed(() => {\n    const hideOnError = this.avatarHideOnErrorSignal();\n    const hasError = this.hasAvatarErrorSignal();\n    return hideOnError && hasError;\n  });\n\n  readonly avatarIconSignal = computed(() => {\n    const hasAvatarError = this.hasAvatarErrorSignal();\n    let icon = this.avatarIcon() ?? this.defaultContext?.icon;\n\n    if (!icon && hasAvatarError) {\n      icon = this.avatarService.defaultAvatarErrorIcon;\n    } else {\n      icon = icon ?? this.avatarService.defaultAvatarIcon;\n    }\n\n    return icon ?? 'person';\n  });\n\n  readonly nameSignal = computed<Maybe<string>>(() => this.avatarName() ?? this.defaultContext?.name);\n\n  readonly initialsSignal = computed<Maybe<string>>(() => {\n    const name = this.nameSignal();\n    return name ? nameToInitials(name) : null;\n  });\n\n  readonly hasInitialsSignal = computed(() => {\n    const initials = this.initialsSignal();\n    return !this.avatarUrlSignal() && !!initials;\n  });\n\n  /**\n   * The curated color the initials are painted on.\n   *\n   * Null when an explicit color is set: the initials surface is 100% of the avatar box, so a curated color would\n   * cover the host's painted surface entirely, and the host's inherited `--dbx-color-bg-tone` would wash it out.\n   */\n  readonly curatedColorSignal = computed<Maybe<DbxColorConfig>>(() => {\n    const name = this.nameSignal();\n    const hasExplicitColor = Boolean(this.avatarColorSignal());\n    return name && !hasExplicitColor ? (this.colorService?.getCuratedColorForValue(name) ?? dbxCuratedColorConfigForString(name)) : null;\n  });\n\n  onAvatarImageError(event: Event) {\n    if (event.target) {\n      const target = event.target as HTMLImageElement;\n      this.avatarErrorUrlSignal.set(target.src);\n    } else {\n      this.avatarErrorUrlSignal.set(true);\n    }\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DbxAvatarViewComponent } from './avatar.view.component';\nimport { type DbxAvatarContext } from './avatar';\nimport { type Maybe, type WebsitePath, type WebsiteUrlWithPrefix } from '@dereekb/util';\n\n/**\n * Injection component configuration for an avatar view, excluding the `injector` property.\n *\n * The injector is managed internally by {@link DbxAvatarComponent} to provide\n * {@link DBX_AVATAR_CONTEXT_DATA_TOKEN} with the current avatar context.\n */\nexport type DbxAvatarInjectionComponentConfig = Omit<DbxInjectionComponentConfig, 'injector'>;\n\n/**\n * Returns a component configuration for the given avatar context, allowing context-specific avatar rendering.\n *\n * Return `null` or `undefined` to fall back to the default avatar component.\n */\nexport type DbxAvatarComponentForContextFunction = (context: DbxAvatarContext) => Maybe<DbxAvatarInjectionComponentConfig>;\n\n/**\n * Abstract configuration class for customizing the avatar view service defaults.\n *\n * Provide this via Angular DI to configure default URLs, icons, and component overrides\n * for all avatar instances in the application.\n */\nexport abstract class DbxAvatarViewServiceConfig {\n  /**\n   * The default avatar URL to use in DbxAvatarViewComponent if no other url is available\n   */\n  readonly defaultAvatarUrl?: Maybe<WebsitePath | WebsiteUrlWithPrefix>;\n  /**\n   * The default fallback icon to use when no avatar image is provided.\n   */\n  readonly defaultAvatarIcon?: Maybe<string>;\n  /**\n   * The default fallback icon to use when an avatar image is provided but fails to load.\n   */\n  readonly defaultAvatarErrorIcon?: Maybe<string>;\n  /**\n   * Overrides the default avatar component.\n   */\n  readonly defaultAvatarComponentConfig?: Maybe<DbxAvatarInjectionComponentConfig>;\n  /**\n   * Custom function that returns a DbxInjectionComponentConfig for the given context.\n   */\n  readonly avatarComponentForContext?: DbxAvatarComponentForContextFunction;\n}\n\n/**\n * Root-level service that manages avatar defaults and resolves the avatar component to render for a given context.\n *\n * Provides fallback URLs, icons, and component configurations used by {@link DbxAvatarComponent}\n * and {@link DbxAvatarViewComponent}. Configure application-wide defaults by providing {@link DbxAvatarViewServiceConfig}.\n */\n@Service()\nexport class DbxAvatarViewService {\n  private readonly _serviceConfig = inject(DbxAvatarViewServiceConfig, { optional: true });\n\n  private _defaultAvatarUrl: Maybe<WebsitePath | WebsiteUrlWithPrefix> = this._serviceConfig?.defaultAvatarUrl;\n  private _defaultAvatarIcon: Maybe<string> = this._serviceConfig?.defaultAvatarIcon ?? 'person';\n  private _defaultAvatarErrorIcon: Maybe<string>;\n\n  private _defaultAvatarComponentConfig: DbxAvatarInjectionComponentConfig = this._serviceConfig?.defaultAvatarComponentConfig ?? {\n    componentClass: DbxAvatarViewComponent\n  };\n\n  private _avatarComponentForContext?: DbxAvatarComponentForContextFunction = this._serviceConfig?.avatarComponentForContext;\n\n  /**\n   * Resolves the injection component configuration for the given avatar context.\n   *\n   * Falls back to the default component config if no custom resolver is configured or if it returns null.\n   *\n   * @param context - The avatar context used to resolve the appropriate component configuration.\n   * @returns The resolved injection component config, or the default if no custom resolver matches.\n   */\n  avatarComponentForContext(context: DbxAvatarContext): DbxAvatarInjectionComponentConfig {\n    let config: DbxAvatarInjectionComponentConfig = this._defaultAvatarComponentConfig;\n\n    if (this._avatarComponentForContext) {\n      config = this._avatarComponentForContext(context) ?? config;\n    }\n\n    return config;\n  }\n\n  get defaultAvatarUrl() {\n    return this._defaultAvatarUrl;\n  }\n\n  get defaultAvatarIcon() {\n    return this._defaultAvatarIcon;\n  }\n\n  get defaultAvatarErrorIcon() {\n    return this._defaultAvatarErrorIcon;\n  }\n\n  /**\n   * Sets the default avatar image URL used when no context-specific URL is provided.\n   *\n   * @param url - The URL to use as the default avatar image, or nullish to clear.\n   */\n  setDefaultAvatarUrl(url: Maybe<WebsitePath | WebsiteUrlWithPrefix>) {\n    this._defaultAvatarUrl = url;\n  }\n\n  /**\n   * Sets the default Material icon name used as a fallback when no avatar image is available.\n   *\n   * @param icon - The Material icon name to use, or nullish to clear.\n   */\n  setDefaultAvatarIcon(icon: Maybe<string>) {\n    this._defaultAvatarIcon = icon;\n  }\n\n  /**\n   * Sets the Material icon name displayed when the avatar image fails to load.\n   *\n   * @param icon - The Material icon name to display on image load error, or nullish to clear.\n   */\n  setDefaultAvatarErrorIcon(icon: Maybe<string>) {\n    this._defaultAvatarErrorIcon = icon;\n  }\n\n  /**\n   * Overrides the default component used to render avatars when no context-specific component is resolved.\n   *\n   * @param config - The injection component config to use as the new default.\n   */\n  setDefaultAvatarComponentConfig(config: DbxAvatarInjectionComponentConfig) {\n    this._defaultAvatarComponentConfig = config;\n  }\n}\n","import { Component, computed, inject, Injector, input } from '@angular/core';\nimport { DBX_AVATAR_CONTEXT_DATA_TOKEN, type DbxAvatarContext, type DbxAvatarImageFit, type DbxAvatarKey, type DbxAvatarSelector, type DbxAvatarSize, type DbxAvatarStyle } from './avatar';\nimport { DbxAvatarViewService } from './avatar.service';\nimport { type AuthUserIdentifier, DbxInjectionComponent, type DbxInjectionComponentConfig, mergeStaticProviders } from '@dereekb/dbx-core';\nimport { type Maybe, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { type DbxColorInput, type DbxColorTone } from '../style/style';\n\n/**\n * Renders an avatar by dynamically injecting the appropriate avatar view component based on the provided context.\n *\n * Merges individual input properties with the optional `context` input and delegates rendering\n * to the component resolved by {@link DbxAvatarViewService}. Supports size variants via CSS classes.\n *\n * Renders an image when one is available, then name initials on a curated color, then a Material icon.\n * With `[avatarTile]` the avatar takes the `<dbx-icon-tile>` presentation — every `--dbx-icon-tile-*`\n * customization applies and `[avatarColor]` / `[avatarColorTone]` paint the tile surface — which makes\n * it the right choice for a branded row (a connected app, an integration) rather than a person.\n *\n * @dbxWebComponent\n * @dbxWebSlug avatar\n * @dbxWebCategory layout\n * @dbxWebRelated icon-tile, dbx-color, avatar-view\n * @dbxWebMinimalExample ```html\n * <dbx-avatar [avatarUrl]=\"user.photoUrl\"></dbx-avatar>\n * ```\n *\n * @example\n * ```html\n * <dbx-avatar [avatarUrl]=\"user.photoUrl\" [avatarStyle]=\"'circle'\" [avatarSize]=\"'large'\"></dbx-avatar>\n * ```\n *\n * @example\n * ```html\n * <!-- branded tile: logo image when there is one, Material icon otherwise -->\n * <dbx-avatar [avatarTile]=\"true\" avatarStyle=\"square\" [avatarUrl]=\"provider.logoUrl\" avatarIcon=\"link\" [avatarIgnoreDefaultUrl]=\"true\" avatarColor=\"success\" [avatarColorTone]=\"18\"></dbx-avatar>\n * ```\n *\n * @example\n * ```html\n * <dbx-avatar [context]=\"avatarContext\"></dbx-avatar>\n * ```\n */\n@Component({\n  selector: 'dbx-avatar',\n  template: `\n    <dbx-injection [config]=\"configSignal()\"></dbx-injection>\n  `,\n  imports: [DbxInjectionComponent],\n  host: {\n    class: 'dbx-avatar',\n    '[class.dbx-avatar-small]': `avatarSize() === 'small'`,\n    '[class.dbx-avatar-large]': `avatarSize() === 'large'`\n  }\n})\nexport class DbxAvatarComponent {\n  readonly injector = inject(Injector);\n  readonly avatarService = inject(DbxAvatarViewService);\n\n  readonly context = input<DbxAvatarContext>();\n\n  readonly avatarSelector = input<Maybe<DbxAvatarSelector>>();\n  readonly avatarUid = input<Maybe<AuthUserIdentifier>>();\n  readonly avatarUrl = input<Maybe<WebsiteUrlWithPrefix>>();\n  readonly avatarName = input<Maybe<string>>();\n  readonly avatarKey = input<Maybe<DbxAvatarKey>>();\n  readonly avatarIcon = input<Maybe<string>>();\n  readonly avatarStyle = input<Maybe<DbxAvatarStyle>>();\n  readonly avatarSize = input<Maybe<DbxAvatarSize>>(undefined);\n  readonly avatarHideOnError = input<Maybe<boolean>>();\n  readonly avatarTile = input<Maybe<boolean>>();\n  readonly avatarColor = input<Maybe<DbxColorInput>>();\n  readonly avatarColorTone = input<Maybe<DbxColorTone>>();\n  readonly avatarImageFit = input<Maybe<DbxAvatarImageFit>>();\n  readonly avatarImageFilter = input<Maybe<string>>();\n  readonly avatarIgnoreDefaultUrl = input<Maybe<boolean>>();\n\n  // NOTE: every DbxAvatarContext field is enumerated here. A field added to the interface and to the\n  // inputs above but forgotten here silently does nothing when bound as an input.\n  readonly contextSignal = computed<DbxAvatarContext>(() => {\n    const inputContext = this.context();\n\n    const selector = this.avatarSelector() ?? inputContext?.selector;\n    const uid = this.avatarUid() ?? inputContext?.uid;\n    const url = this.avatarUrl() ?? inputContext?.url;\n    const name = this.avatarName() ?? inputContext?.name;\n    const key = this.avatarKey() ?? inputContext?.key;\n    const icon = this.avatarIcon() ?? inputContext?.icon;\n    const style = this.avatarStyle() ?? inputContext?.style;\n    const hideOnError = this.avatarHideOnError() ?? inputContext?.hideOnError;\n    const tile = this.avatarTile() ?? inputContext?.tile;\n    const color = this.avatarColor() ?? inputContext?.color;\n    const colorTone = this.avatarColorTone() ?? inputContext?.colorTone;\n    const imageFit = this.avatarImageFit() ?? inputContext?.imageFit;\n    const imageFilter = this.avatarImageFilter() ?? inputContext?.imageFilter;\n    const ignoreDefaultUrl = this.avatarIgnoreDefaultUrl() ?? inputContext?.ignoreDefaultUrl;\n\n    return {\n      selector,\n      uid,\n      url,\n      name,\n      key,\n      icon,\n      style,\n      hideOnError,\n      tile,\n      color,\n      colorTone,\n      imageFit,\n      imageFilter,\n      ignoreDefaultUrl\n    };\n  });\n\n  readonly configSignal = computed(() => {\n    const context = this.contextSignal();\n    const returnedConfig = this.avatarService.avatarComponentForContext(context);\n\n    const dataProvider = {\n      provide: DBX_AVATAR_CONTEXT_DATA_TOKEN,\n      useValue: context\n    };\n\n    const injector = Injector.create({\n      parent: this.injector,\n      providers: mergeStaticProviders(dataProvider, returnedConfig.providers)\n    });\n\n    const config: DbxInjectionComponentConfig = {\n      ...returnedConfig,\n      injector\n    };\n\n    return config;\n  });\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Renders a horizontal bar used to visually group or separate content.\n *\n * To give the bar a themed background apply `[dbxColor]` (optionally with `[dbxColorTone]`) directly on the host —\n * the bar paints itself from the supplied color tokens via its `.dbx-bar.dbx-color` SCSS. The directive itself only\n * applies the `.dbx-bar` layout class.\n *\n * @dbxWebComponent\n * @dbxWebSlug bar\n * @dbxWebCategory layout\n * @dbxWebRelated bar-header, pagebar, button-spacer\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-bar><button>A</button><button>B</button></dbx-bar>\n * ```\n *\n * @example\n * ```html\n * <dbx-bar dbxColor=\"primary\">\n *   <dbx-button text=\"Save\" raised></dbx-button>\n *   <dbx-button-spacer></dbx-button-spacer>\n *   <dbx-button text=\"Cancel\" stroked></dbx-button>\n * </dbx-bar>\n * ```\n */\n@Directive({\n  selector: 'dbx-bar,[dbxBar]',\n  host: {\n    class: 'dbx-bar'\n  }\n})\nexport class DbxBarDirective {}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxBarDirective } from './bar.directive';\n\n/**\n * A header bar displaying an optional icon and text label, useful as a section divider.\n *\n * To give it a themed background apply `[dbxColor]` directly on the host — the inner `<dbx-bar>` paints from the\n * inherited tokens via the `dbx-bar-header.dbx-color .dbx-bar` SCSS.\n *\n * @dbxWebComponent\n * @dbxWebSlug bar-header\n * @dbxWebCategory layout\n * @dbxWebRelated bar, pagebar\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-bar-header header=\"Title\"></dbx-bar-header>\n * ```\n *\n * @example\n * ```html\n * <dbx-bar-header header=\"Members\" icon=\"group\" dbxColor=\"primary\">\n *   <button mat-icon-button><mat-icon>add</mat-icon></button>\n * </dbx-bar-header>\n * ```\n */\n@Component({\n  selector: 'dbx-bar-header',\n  template: `\n    <dbx-bar>\n      @if (icon()) {\n        <mat-icon class=\"button-spacer\">{{ icon() }}</mat-icon>\n      }\n      @if (text()) {\n        <span>{{ text() }}</span>\n      }\n      <ng-content></ng-content>\n    </dbx-bar>\n  `,\n  host: {\n    class: 'dbx-bar-header dbx-hint'\n  },\n  imports: [DbxBarDirective, MatIconModule]\n})\nexport class DbxBarHeaderComponent {\n  readonly text = input<Maybe<string>>();\n  readonly icon = input<Maybe<string>>();\n}\n","import { Component } from '@angular/core';\nimport { MatToolbarModule } from '@angular/material/toolbar';\n\n/**\n * A page-level toolbar with left and right content slots, built on Angular Material's mat-toolbar.\n *\n * To give it a themed background apply `[dbxColor]` directly on the host — the inner `mat-toolbar` maps its\n * `--mat-toolbar-*` colors to the inherited tokens via the `dbx-pagebar.dbx-color mat-toolbar` SCSS.\n *\n * @dbxWebComponent\n * @dbxWebSlug pagebar\n * @dbxWebCategory layout\n * @dbxWebRelated bar, navbar\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks, dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-pagebar>Title</dbx-pagebar>\n * ```\n *\n * @example\n * ```html\n * <dbx-pagebar dbxColor=\"primary\">\n *   <h2>Settings</h2>\n *   <span class=\"spacer\"></span>\n *   <button mat-stroked-button>Save</button>\n * </dbx-pagebar>\n * ```\n */\n@Component({\n  selector: 'dbx-pagebar',\n  template: `\n    <mat-toolbar class=\"dbx-pagebar dbx-flex-bar\">\n      <ng-content select=\"[left]\"></ng-content>\n      <span class=\"spacer\"></span>\n      <ng-content select=\"[right]\"></ng-content>\n    </mat-toolbar>\n  `,\n  imports: [MatToolbarModule]\n})\nexport class DbxPagebarComponent {}\n","import { NgModule } from '@angular/core';\nimport { DbxBarDirective } from './bar.directive';\nimport { DbxBarHeaderComponent } from './bar.header.component';\nimport { DbxPagebarComponent } from './pagebar.component';\n\nconst importsAndExports = [DbxBarDirective, DbxBarHeaderComponent, DbxPagebarComponent];\n\n/**\n * Module for dbx-bar components.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxBarLayoutModule {}\n","import { NgStyle } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\nimport { type ResizedEvent } from '../../screen/resize';\nimport { DbxResizedDirective } from '../../screen/resize.directive';\n\n/**\n * A two-section layout block where the top section has a measured height and the bottom\n * section fills the remaining vertical space.\n *\n * The top section's height is dynamically measured via resize observation. Use the `[top]`\n * content slot for the fixed-height area and default content for the flexible bottom area.\n *\n * @example\n * ```html\n * <dbx-two-block [fixedTop]=\"true\">\n *   <div top>Fixed header area</div>\n *   <div>Scrollable content area</div>\n * </dbx-two-block>\n * ```\n */\n@Component({\n  selector: 'dbx-two-block',\n  template: `\n    <div #two class=\"dbx-two-block-content\" [ngStyle]=\"{ '--dbx-two-block-top-height': topHeightPixelsSignal() }\">\n      <div #top class=\"dbx-two-block-top\" (dbxResized)=\"viewResized($event)\">\n        <ng-content select=\"[top]\"></ng-content>\n      </div>\n      <div #bottom class=\"dbx-two-block-bottom\">\n        <ng-content></ng-content>\n      </div>\n    </div>\n  `,\n  host: {\n    class: 'dbx-two-block d-block',\n    '[class]': '{ \"dbx-two-block-fixed-top\": fixedTop() }'\n  },\n  imports: [DbxResizedDirective, NgStyle]\n})\nexport class DbxTwoBlockComponent {\n  /**\n   * Whether or not the top bar should be fixed in place instead of scrolling with the bottom when content is too tall.\n   */\n  readonly fixedTop = input<boolean>(true);\n\n  readonly topHeightSignal = signal<number>(0);\n  readonly topHeightPixelsSignal = computed(() => `${this.topHeightSignal()}px`);\n\n  viewResized(event: ResizedEvent): void {\n    const height = event.newRect.height;\n    this.topHeightSignal.set(height);\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\n\n/**\n * Displays a card-style box with an optional section header, icon, and projected content.\n *\n * Supports a named content slot `[sectionHeader]` for custom header actions beside the title.\n *\n * @dbxWebComponent\n * @dbxWebSlug card-box\n * @dbxWebCategory card\n * @dbxWebRelated card-box-container, section\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-card-box header=\"Title\"><p>Body</p></dbx-card-box>\n * ```\n *\n * @example\n * ```html\n * <dbx-card-box [header]=\"'Settings'\" [icon]=\"'settings'\">\n *   <button sectionHeader mat-icon-button><mat-icon>edit</mat-icon></button>\n *   <p>Card body content goes here.</p>\n * </dbx-card-box>\n * ```\n */\n@Component({\n  selector: 'dbx-card-box',\n  template: `\n    <div class=\"dbx-card-box\">\n      <div class=\"dbx-section-header\">\n        <div class=\"dbx-section-header-content\">\n          <h4 class=\"dbx-section-header-content-title\">\n            @if (icon()) {\n              <mat-icon>{{ icon() }}</mat-icon>\n            }\n            @if (header()) {\n              <span class=\"title-text\">{{ header() }}</span>\n            }\n          </h4>\n          <span class=\"spacer\"></span>\n          <ng-content select=\"[sectionHeader]\"></ng-content>\n        </div>\n      </div>\n      <div class=\"dbx-card-box-content\">\n        <ng-content></ng-content>\n      </div>\n    </div>\n  `,\n  imports: [MatIconModule]\n})\nexport class DbxCardBoxComponent {\n  readonly header = input<string>();\n  readonly icon = input<string>();\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Adds content padding around a card box section.\n *\n * Can be used as an element or as an attribute directive on any host element.\n *\n * @dbxWebComponent\n * @dbxWebSlug card-box-container\n * @dbxWebCategory card\n * @dbxWebRelated card-box\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div dbxCardBoxContainer><dbx-card-box></dbx-card-box></div>\n * ```\n *\n * @example\n * ```html\n * <dbx-card-box-container>\n *   <dbx-card-box header=\"One\"></dbx-card-box>\n *   <dbx-card-box header=\"Two\"></dbx-card-box>\n * </dbx-card-box-container>\n * ```\n */\n@Directive({\n  selector: 'dbx-card-box-container, [dbxCardBoxContainer]',\n  host: {\n    class: 'd-block dbx-card-box-container'\n  }\n})\nexport class DbxCardBoxContainerDirective {}\n","import { DbxCardBoxContainerDirective } from './card.box.container.directive';\nimport { DbxCardBoxComponent } from './card.box.component';\nimport { NgModule } from '@angular/core';\n\nconst importsAndExports = [DbxCardBoxComponent, DbxCardBoxContainerDirective];\n\n/**\n * Convenience module that imports and exports all card box layout components and directives.\n *\n * Includes {@link DbxCardBoxComponent} and {@link DbxCardBoxContainerDirective}.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxCardBoxLayoutModule {}\n","import { Injectable, type Provider } from '@angular/core';\nimport { ComponentStore } from '@ngrx/component-store';\nimport { Subject, distinct, map } from 'rxjs';\nimport { completeOnDestroy, type SegueRef } from '@dereekb/dbx-core';\nimport { isMaybeNot, type Maybe } from '@dereekb/util';\n\n/**\n * State model for the {@link TwoColumnsContextStore}, containing all configuration\n * flags that control two-column layout visibility and sizing behavior.\n */\nexport interface TwoColumnsState {\n  /**\n   * Whether or not to reverse the sizing.\n   */\n  readonly reverseSizing: boolean;\n  /**\n   * Whether or not the right side should be shown.\n   */\n  readonly showRight: boolean;\n  /**\n   * Overrides showRight if not null.\n   */\n  readonly showRightOverride?: Maybe<boolean>;\n  /**\n   * Whether or not there is any registered right content currently.\n   */\n  readonly hasRight: boolean;\n  /**\n   * Whether or not to allow the left to fill up the screen when no right is shown.\n   */\n  readonly fullLeft: boolean;\n  /**\n   * Optional ref to use with TwoColumns that use an sref for the back button.\n   */\n  readonly backRef?: Maybe<SegueRef>;\n  /**\n   * Size of the view's total width in pixels.\n   */\n  readonly totalWidth?: Maybe<number>;\n  /**\n   * Minimum right side size allowed before hiding the left content.\n   */\n  readonly minRightWidth: number;\n}\n\n/**\n * Default minimum width in pixels for the right column before the left column is hidden.\n */\nexport const DEFAULT_TWO_COLUMNS_MIN_RIGHT_WIDTH = 320;\n\nconst INITIAL_STATE: TwoColumnsState = {\n  reverseSizing: false,\n  showRight: false,\n  hasRight: false,\n  fullLeft: false,\n  minRightWidth: DEFAULT_TWO_COLUMNS_MIN_RIGHT_WIDTH\n};\n\n/**\n * NgRx ComponentStore that manages the reactive state for a two-column layout.\n *\n * Controls column visibility, sizing, back navigation, and responsive behavior.\n * Typically provided via {@link provideTwoColumnsContext} or the {@link DbxTwoColumnContextDirective}.\n */\n@Injectable()\nexport class TwoColumnsContextStore extends ComponentStore<TwoColumnsState> {\n  private readonly _back = completeOnDestroy(new Subject<void>());\n\n  constructor() {\n    super({ ...INITIAL_STATE });\n  }\n\n  // MARK: Accessors\n  readonly hideLeft$ = this.state$.pipe(\n    map((x) => {\n      /**\n       * The right side is less-than or equal to half the total width when resizing, so we can use the total width to guess the best case current scenario.\n       */\n      const expectedRightWidth = (x.totalWidth ?? 0) / 2;\n      return x.showRight && expectedRightWidth < x.minRightWidth;\n    })\n  );\n\n  /**\n   * Pipes the current state of reverseSizing.\n   */\n  readonly reverseSizing$ = this.state$.pipe(map((x) => x.reverseSizing));\n\n  /**\n   * Pipes the current state of hasRight.\n   */\n  readonly hasRight$ = this.state$.pipe(map((x) => x.hasRight));\n\n  /**\n   * Pipes the current state of showRight and showRightOverride.\n   */\n  readonly currentShowRight$ = this.state$.pipe(map((x) => x.showRightOverride ?? x.showRight));\n\n  /**\n   * Pipes the current state of showRight and hasRight\n   */\n  readonly showRight$ = this.state$.pipe(map((x) => x.hasRight && (x.showRightOverride ?? x.showRight)));\n\n  /**\n   * Convenience function for the showRight compliment.\n   */\n  readonly hideRight$ = this.showRight$.pipe(map((x) => !x));\n\n  /**\n   * Pipes the current state of fullLeft.\n   */\n  readonly fullLeft$ = this.state$.pipe(map((x) => x.fullLeft));\n\n  /**\n   * Whether or not to show the full left.\n   */\n  readonly showFullLeft$ = this.state$.pipe(map((x) => !(x.hasRight && (x.showRightOverride ?? x.showRight)) && x.fullLeft));\n\n  /**\n   * Pipes the current backRef value.\n   */\n  readonly backRef$ = this.state$.pipe(\n    map((x) => x.backRef),\n    distinct()\n  );\n\n  /**\n   * Emits back events.\n   */\n  readonly back$ = this._back.asObservable();\n\n  // MARK: State Changes\n  /**\n   * Completely resets the store.\n   */\n  readonly reset = this.updater(() => ({ ...INITIAL_STATE }));\n\n  /**\n   * Changes the state to show right or not.\n   */\n  readonly setReverseSizing = this.updater((state, reverseSizing: Maybe<boolean>) => (isMaybeNot(reverseSizing) ? state : { ...state, reverseSizing }));\n\n  /**\n   * Changes the state to have right content or not.\n   */\n  readonly setHasRight = this.updater((state, hasRight: Maybe<boolean>) => (isMaybeNot(hasRight) ? state : { ...state, hasRight }));\n\n  /**\n   * Changes the state to show right or not.\n   */\n  readonly setShowRight = this.updater((state, showRight: Maybe<boolean>) => (isMaybeNot(showRight) ? state : { ...state, showRight }));\n\n  /**\n   * Changes the override state to show right or not.\n   */\n  readonly setShowRightOverride = this.updater((state, showRightOverride: Maybe<boolean>) => ({ ...state, showRightOverride }));\n\n  /**\n   * Sets the full left. If undefined is passed, no change occurs.\n   */\n  readonly setFullLeft = this.updater((state, fullLeft: Maybe<boolean>) => (isMaybeNot(fullLeft) ? state : { ...state, fullLeft }));\n\n  /**\n   * Sets the new back ref.\n   */\n  readonly setBackRef = this.updater((state, backRef: Maybe<SegueRef>) => ({ ...state, backRef }));\n\n  /**\n   * Sets the new total width.\n   */\n  readonly setTotalWidth = this.updater((state, totalWidth: Maybe<number>) => ({ ...state, totalWidth }));\n\n  /**\n   * Sets the new min right width.\n   */\n  readonly setMinRightWidth = this.updater((state, minRightWidth: Maybe<number>) => ({ ...state, minRightWidth: minRightWidth ?? DEFAULT_TWO_COLUMNS_MIN_RIGHT_WIDTH }));\n\n  /**\n   * Emits a back event.\n   */\n  back(): void {\n    this._back.next();\n  }\n}\n\n/**\n * Creates Angular providers for a new {@link TwoColumnsContextStore} instance.\n *\n * @returns Array of Angular providers that supply a new {@link TwoColumnsContextStore}\n *\n * @Component ({\n *   providers: provideTwoColumnsContext(),\n * })\n * export class MyColumnLayoutComponent { }\n * ```\n *\n * @example\n * ```typescript\n */\nexport function provideTwoColumnsContext(): Provider[] {\n  return [\n    {\n      provide: TwoColumnsContextStore,\n      useClass: TwoColumnsContextStore\n    }\n  ];\n}\n","import { Component, ElementRef, inject, input, effect } from '@angular/core';\n\nimport { type Observable, combineLatest, distinctUntilChanged, map } from 'rxjs';\nimport { TwoColumnsContextStore } from './two.column.store';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { DbxContentContainerDirective } from '../../content/content.container.directive';\nimport { isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { DbxResizedDirective } from '../../../screen/resize.directive';\nimport { type ResizedEvent } from '../../../screen/resize';\n\n/**\n * Represents the computed view state of a {@link DbxTwoColumnComponent}, capturing all layout flags\n * that determine column visibility and sizing behavior.\n */\nexport interface DbxTwoColumnViewState {\n  readonly showRight: boolean;\n  readonly showFullLeft: boolean;\n  readonly hideLeftColumn: boolean;\n  readonly reverseSizing: boolean;\n  readonly inSectionPage: boolean;\n}\n\n/**\n * Responsive two-column layout that splits content into a narrower left column and a wider right column.\n *\n * The right column contains the primary content. When the viewport is too narrow to fit both columns,\n * the left column can be automatically hidden based on the configured minimum right width.\n *\n * Requires a {@link TwoColumnsContextStore} to be provided by a parent component or directive.\n *\n * @dbxWebComponent\n * @dbxWebSlug two-column\n * @dbxWebCategory layout\n * @dbxWebRelated two-column-right\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks, dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-two-column>\n *   <div left>Sidebar</div>\n *   <div right>Main</div>\n * </dbx-two-column>\n * ```\n *\n * @example\n * ```html\n * <dbx-two-column [inSectionPage]=\"true\">\n *   <dbx-list left [state$]=\"state$\" [config]=\"listConfig\" />\n *   <dbx-two-column-right right header=\"Detail\">\n *     <p>Selected item detail.</p>\n *   </dbx-two-column-right>\n * </dbx-two-column>\n * ```\n */\n@Component({\n  selector: 'dbx-two-column',\n  template: `\n    <dbx-content-container grow=\"full\" padding=\"none\" class=\"dbx-content dbx-content-auto-height left-column\">\n      @if (!hideLeftColumnSignal() && reverseSizingSignal()) {\n        <div (dbxResized)=\"viewResized($event)\"></div>\n      }\n      <ng-content select=\"[left]\"></ng-content>\n    </dbx-content-container>\n    @if (showRightSignal()) {\n      <dbx-content-container grow=\"full\" padding=\"none\" class=\"dbx-content dbx-content-auto-height right-column\">\n        @if (hideLeftColumnSignal() || !reverseSizingSignal()) {\n          <div (dbxResized)=\"viewResized($event)\"></div>\n        }\n        <ng-content select=\"[right]\"></ng-content>\n      </dbx-content-container>\n    }\n  `,\n  exportAs: 'columns',\n  host: {\n    class: 'dbx-two-column',\n    '[class]': 'cssClassSignal()'\n  },\n  imports: [DbxResizedDirective, DbxContentContainerDirective]\n})\nexport class DbxTwoColumnComponent {\n  private readonly _elementRef = inject(ElementRef);\n\n  readonly twoColumnsContextStore = inject(TwoColumnsContextStore);\n\n  /**\n   * Whether to reverse the default column sizing so the left column is larger than the right.\n   */\n  readonly reverseSizing = input<boolean>(false);\n\n  /**\n   * Whether this two-column layout is rendered within a section page context.\n   */\n  readonly inSectionPage = input<boolean>(false);\n\n  /**\n   * Acts as an override to show the right column without having to use dbx-two-column-right or update the context store directly.\n   */\n  readonly hasRightContent = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n\n  readonly reverseSizing$ = this.twoColumnsContextStore.reverseSizing$;\n  readonly hideLeftColumn$: Observable<boolean> = this.twoColumnsContextStore.hideLeft$;\n  readonly inSectionPage$: Observable<boolean> = toObservable(this.inSectionPage);\n\n  readonly showRight$: Observable<boolean> = this.twoColumnsContextStore.showRight$;\n  readonly showFullLeft$: Observable<boolean> = this.twoColumnsContextStore.showFullLeft$;\n\n  readonly hideLeftColumnSignal = toSignal(this.hideLeftColumn$);\n  readonly reverseSizingSignal = toSignal(this.reverseSizing$);\n  readonly showRightSignal = toSignal(this.showRight$);\n\n  readonly cssClasses$ = combineLatest([this.showRight$, this.showFullLeft$, this.hideLeftColumn$, this.reverseSizing$, this.inSectionPage$]).pipe(\n    distinctUntilChanged((prev, curr) => {\n      return prev[0] === curr[0] && prev[1] === curr[1] && prev[2] === curr[2] && prev[3] === curr[3] && prev[4] === curr[4];\n    }),\n    map(([showRight, showFullLeft, hideLeftColumn, reverseSizing, inSectionPage]) => ({ 'right-shown': showRight, 'full-left': showFullLeft, 'hide-left-column': hideLeftColumn, 'two-column-reverse-sizing': reverseSizing, 'dbx-section-page-two': inSectionPage }))\n  );\n\n  readonly cssClassSignal = toSignal(this.cssClasses$);\n\n  protected readonly _reverseSizingEffect = effect(() => {\n    this.twoColumnsContextStore.setReverseSizing(this.reverseSizing());\n  });\n\n  protected readonly _hasRightContentEffect = effect(() => {\n    if (this.hasRightContent()) {\n      this.twoColumnsContextStore.setHasRight(true);\n    }\n  });\n\n  viewResized(_event: ResizedEvent): void {\n    const totalWidth = (this._elementRef.nativeElement as HTMLElement).clientWidth;\n    this.twoColumnsContextStore.setTotalWidth(totalWidth);\n  }\n}\n","import { Component, inject, input } from '@angular/core';\nimport { DbxTwoColumnComponent } from '../two/two.column.component';\nimport { provideTwoColumnsContext, TwoColumnsContextStore } from '../two/two.column.store';\n\n/**\n * Pre-configured single-column layout that wraps {@link DbxTwoColumnComponent} with full-left mode enabled.\n *\n * Provides its own {@link TwoColumnsContextStore} and projects content into the left slot only.\n *\n * @example\n * ```html\n * <dbx-one-column>\n *   <div top>Top content</div>\n *   <div left>Main content</div>\n * </dbx-one-column>\n * ```\n */\n@Component({\n  selector: 'dbx-one-column',\n  template: `\n    <ng-container>\n      <dbx-two-column [inSectionPage]=\"inSectionPage()\">\n        <ng-content top select=\"[top]\"></ng-content>\n        <ng-content left></ng-content>\n      </dbx-two-column>\n    </ng-container>\n  `,\n  exportAs: 'columns',\n  providers: provideTwoColumnsContext(),\n  imports: [DbxTwoColumnComponent]\n})\nexport class DbxOneColumnComponent {\n  readonly twoColumnsContextStore = inject(TwoColumnsContextStore);\n\n  /**\n   * Whether this column is within a section page layout. Defaults to `true`.\n   */\n  readonly inSectionPage = input<boolean>(true);\n\n  constructor() {\n    this.twoColumnsContextStore.setFullLeft(true);\n  }\n}\n","import { Directive, inject, output } from '@angular/core';\nimport { cleanSubscription } from '@dereekb/dbx-core';\nimport { TwoColumnsContextStore } from './two.column.store';\n\n/**\n * Listens for back navigation events from the {@link TwoColumnsContextStore} and emits them as an output event.\n * Attach this directive to any element within a two-column context to respond to back button presses.\n *\n * @example\n * ```html\n * <div dbxTwoColumnContext>\n *   <div (dbxTwoColumnBack)=\"onBackNavigation()\">\n *     <dbx-two-column>\n *       <div left>Sidebar</div>\n *       <dbx-two-column-right>Detail</dbx-two-column-right>\n *     </dbx-two-column>\n *   </div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxTwoColumnBack]'\n})\nexport class DbxTwoColumnBackDirective {\n  readonly twoColumnsContextStore = inject(TwoColumnsContextStore);\n\n  /**\n   * Emits when a back navigation event is triggered from the two-column context store.\n   */\n  readonly dbxTwoColumnBack = output();\n\n  constructor() {\n    cleanSubscription(this.twoColumnsContextStore.back$.subscribe(() => this.dbxTwoColumnBack.emit()));\n  }\n\n  public backClicked(): void {\n    this.twoColumnsContextStore.back();\n  }\n}\n","import { Directive, effect, inject, input } from '@angular/core';\nimport { isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { provideTwoColumnsContext, TwoColumnsContextStore } from './two.column.store';\n\n/**\n * Structural directive that provides a new {@link TwoColumnsContextStore} instance to its descendants.\n * Use this to create an isolated two-column context scope.\n *\n * Optionally controls the right column visibility via the `showRight` input.\n *\n * @example\n * ```html\n * <div dbxTwoColumnContext [showRight]=\"hasDetail\">\n *   <dbx-two-column>\n *     <div left>Sidebar</div>\n *     <div right>Detail content</div>\n *   </dbx-two-column>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxTwoColumnContext]',\n  providers: provideTwoColumnsContext()\n})\nexport class DbxTwoColumnContextDirective {\n  readonly twoColumnsContextStore = inject(TwoColumnsContextStore, { self: true });\n\n  /**\n   * Override for the right column visibility state. When set, overrides the store's default `showRight` value.\n   */\n  readonly showRight = input<Maybe<boolean>, Maybe<boolean | ''>>(undefined, { transform: isDefinedAndNotFalse });\n\n  protected readonly _showRightEffect = effect(() => {\n    this.twoColumnsContextStore.setShowRightOverride(this.showRight());\n  });\n}\n","import { Directive, inject, input, effect } from '@angular/core';\nimport { isNotFalse, type Maybe } from '@dereekb/util';\nimport { TwoColumnsContextStore } from './two.column.store';\n\n/**\n * Enables full-left mode on a {@link DbxTwoColumnComponent}, allowing the left column to expand\n * to fill the entire width when the right column is not visible.\n *\n * The directive value defaults to `true` when applied without a binding.\n *\n * @example\n * ```html\n * <dbx-two-column dbxTwoColumnFullLeft>\n *   <div left>Expands to full width when right is hidden</div>\n *   <div right>Detail content</div>\n * </dbx-two-column>\n * ```\n */\n@Directive({\n  selector: '[dbxTwoColumnFullLeft]'\n})\nexport class DbxTwoColumnFullLeftDirective {\n  private readonly _twoColumnsContextStore = inject(TwoColumnsContextStore);\n\n  /**\n   * Whether to enable full-left mode. Defaults to `true`.\n   */\n  readonly fullLeft = input<boolean, Maybe<boolean | ''>>(true, { alias: 'dbxTwoColumnFullLeft', transform: isNotFalse });\n\n  protected readonly _fullLeftEffect = effect(() => {\n    this._twoColumnsContextStore.setFullLeft(this.fullLeft());\n  });\n}\n","import { Directive, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Header bar directive for two-column layouts. Sits at the top of a column's content area\n * and provides a flex container for navigation elements, titles, and action buttons.\n *\n * @example\n * ```html\n * <dbx-two-column-head [block]=\"false\" [full]=\"true\">\n *   <span>Header Title</span>\n *   <button mat-icon-button>Action</button>\n * </dbx-two-column-head>\n * ```\n */\n@Directive({\n  selector: 'dbx-two-column-head,[dbxTwoColumnHead],.dbx-two-column-head',\n  host: {\n    class: 'd-flex dbx-two-column-head',\n    '[class.d-block]': 'block()',\n    '[class.full]': 'full()'\n  }\n})\nexport class DbxTwoColumnColumnHeadDirective {\n  /**\n   * Whether the header should use block-level display instead of flex.\n   */\n  readonly block = input<Maybe<boolean>>(false);\n\n  /**\n   * Whether the header should expand to full width.\n   */\n  readonly full = input<Maybe<boolean>>(false);\n}\n","import { Directive, effect, inject, input } from '@angular/core';\nimport { asSegueRef, type SegueRefOrSegueRefRouterLink } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { TwoColumnsContextStore } from './two.column.store';\n\n/**\n * Sets the back-navigation reference on the {@link TwoColumnsContextStore} from a segue ref or router link.\n * This controls where the back button in {@link DbxTwoColumnRightComponent} navigates to.\n *\n * @example\n * ```html\n * <dbx-two-column [dbxTwoColumnSref]=\"'/items'\">\n *   <div left>Sidebar</div>\n *   <dbx-two-column-right>Detail view with back to /items</dbx-two-column-right>\n * </dbx-two-column>\n * ```\n */\n@Directive({\n  selector: '[dbxTwoColumnSref]'\n})\nexport class DbxTwoColumnSrefDirective {\n  private readonly _twoColumnsContextStore = inject(TwoColumnsContextStore);\n\n  /**\n   * The segue reference or router link to use as the back navigation target.\n   */\n  readonly dbxTwoColumnSref = input.required<Maybe<SegueRefOrSegueRefRouterLink>>();\n\n  protected readonly _dbxTwoColumnSrefEffect = effect(() => {\n    const sref = this.dbxTwoColumnSref();\n    const segueRef = sref ? asSegueRef(sref) : undefined;\n    this._twoColumnsContextStore.setBackRef(segueRef);\n  });\n}\n","import { Component, input } from '@angular/core';\nimport { type ClickableIconAnchorLink } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { DbxAnchorComponent } from './anchor.component';\n\n/**\n * Renders a Material icon button wrapped in a {@link DbxAnchorComponent} for navigation.\n *\n * The icon is sourced from the provided {@link ClickableIconAnchorLink}.\n *\n * @example\n * ```html\n * <dbx-anchor-icon [anchor]=\"{ icon: 'settings', url: '/settings' }\"></dbx-anchor-icon>\n * ```\n */\n@Component({\n  selector: 'dbx-anchor-icon',\n  imports: [MatIconModule, MatButtonModule, DbxAnchorComponent],\n  template: `\n    <dbx-anchor [anchor]=\"anchor()\">\n      <button mat-icon-button>\n        <mat-icon>{{ anchor()?.icon }}</mat-icon>\n      </button>\n    </dbx-anchor>\n  `\n})\nexport class DbxAnchorIconComponent {\n  readonly anchor = input<Maybe<ClickableIconAnchorLink>>();\n}\n","import { Component, computed, input } from '@angular/core';\nimport { type ClickableAnchor } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxAnchorComponent } from './anchor.component';\n\n/**\n * Inline link component that wraps content in a {@link DbxAnchorComponent}. Accepts a router ref, an external href, or a full {@link ClickableAnchor} configuration.\n *\n * @example\n * ```html\n * <dbx-link ref=\"/home\">Go Home</dbx-link>\n * <dbx-link href=\"https://example.com\">External</dbx-link>\n * <dbx-link [anchor]=\"myAnchor\">Custom Link</dbx-link>\n * ```\n */\n@Component({\n  selector: 'dbx-link',\n  imports: [DbxAnchorComponent],\n  template: `\n    <dbx-anchor [anchor]=\"anchorSignal()\">\n      <ng-content></ng-content>\n    </dbx-anchor>\n  `,\n  host: {\n    class: 'd-inline dbx-link'\n  }\n})\nexport class DbxLinkComponent {\n  readonly ref = input<Maybe<string>>();\n  readonly href = input<Maybe<string>>();\n  readonly anchor = input<Maybe<ClickableAnchor>>();\n\n  readonly anchorSignal = computed(() => {\n    const ref = this.ref();\n    const href = this.href();\n    let anchor = this.anchor();\n\n    if (!anchor) {\n      if (ref) {\n        anchor = {\n          ref\n        };\n      } else if (href) {\n        anchor = {\n          url: href\n        };\n      }\n    }\n\n    return anchor;\n  });\n}\n","import { combineLatest, map, type Observable, of, shareReplay } from 'rxjs';\nimport { Component, inject, computed, input } from '@angular/core';\nimport { type ClickableAnchor, type ClickableAnchorLink } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxAnchorComponent } from './anchor.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Displays the icon and title from a {@link ClickableAnchorLink}, either from an explicit input or inherited from a parent {@link DbxAnchorComponent}.\n *\n * Renders a Material icon followed by a title span when available.\n *\n * @example\n * ```html\n * <dbx-anchor [anchor]=\"myAnchor\">\n *   <dbx-anchor-content></dbx-anchor-content>\n * </dbx-anchor>\n *\n * <dbx-anchor-content [anchor]=\"{ icon: 'home', title: 'Home' }\"></dbx-anchor-content>\n * ```\n */\n@Component({\n  selector: 'dbx-anchor-content',\n  imports: [MatIconModule],\n  template: `\n    @if (iconSignal()) {\n      <mat-icon class=\"dbx-icon-spacer\">{{ iconSignal() }}</mat-icon>\n    }\n    @if (titleSignal()) {\n      <span>{{ titleSignal() }}</span>\n    }\n  `,\n  host: {\n    class: 'dbx-anchor-content'\n  }\n})\nexport class DbxAnchorContentComponent {\n  readonly parent = inject(DbxAnchorComponent, { optional: true });\n\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  readonly inputAnchor = input<Maybe<Partial<ClickableAnchorLink>>>(undefined, { alias: 'anchor' });\n\n  private readonly _inputAnchor = toObservable(this.inputAnchor);\n  private readonly _parentAnchor: Observable<Maybe<ClickableAnchor | ClickableAnchorLink>> = this.parent ? this.parent.anchor$ : of(undefined);\n\n  readonly anchor$: Observable<Maybe<Partial<ClickableAnchorLink>>> = combineLatest([this._inputAnchor, this._parentAnchor]).pipe(\n    map(([input, parent]) => input ?? parent),\n    shareReplay(1)\n  );\n\n  readonly anchorSignal = toSignal(this.anchor$);\n\n  readonly iconSignal = computed(() => this.anchorSignal()?.icon);\n  readonly titleSignal = computed(() => this.anchorSignal()?.title);\n}\n","import { NgModule } from '@angular/core';\nimport { DbxAnchorComponent } from './anchor.component';\nimport { DbxAnchorIconComponent } from './anchor.icon.component';\nimport { DbxLinkComponent } from './anchor.link.component';\nimport { DbxAnchorContentComponent } from './anchor.content.component';\n\n/**\n * All standalone components related to anchors and links.\n */\nexport const DBX_ROUTER_ANCHOR_COMPONENTS = [DbxAnchorComponent, DbxAnchorIconComponent, DbxLinkComponent, DbxAnchorContentComponent];\n\n/**\n * NgModule that re-exports all standalone anchor and link components for backward compatibility.\n *\n * Prefer importing individual standalone components directly in new code.\n */\n@NgModule({\n  imports: DBX_ROUTER_ANCHOR_COMPONENTS,\n  exports: DBX_ROUTER_ANCHOR_COMPONENTS\n})\nexport class DbxRouterAnchorModule {}\n","import { computed, Directive, inject } from '@angular/core';\nimport { type DbxInjectionTemplateConfig } from '@dereekb/dbx-core';\nimport { type Observable, distinctUntilChanged, shareReplay, map } from 'rxjs';\nimport { DbxAnchorComponent } from './anchor.component';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Abstract base directive for segue anchor implementations that bridges a parent {@link DbxAnchorComponent}\n * with a router-specific anchor rendering (e.g., Angular Router or UIRouter).\n *\n * Provides access to the parent anchor observable, template configuration, and navigation target.\n */\n@Directive()\nexport abstract class AbstractDbxSegueAnchorDirective {\n  readonly parent = inject(DbxAnchorComponent);\n\n  readonly anchor$ = this.parent.anchor$;\n  readonly templateConfig$: Observable<DbxInjectionTemplateConfig> = this.parent.templateRef$.pipe(\n    distinctUntilChanged(),\n    map((templateRef) => ({\n      templateRef\n    })),\n    shareReplay(1)\n  );\n\n  readonly anchorSignal = toSignal(this.anchor$, { initialValue: undefined });\n  readonly templateConfigSignal = toSignal(this.templateConfig$, { initialValue: undefined });\n\n  readonly targetSignal = computed(() => this.anchorSignal()?.target);\n}\n","import { forwardRef, type Provider, type Type } from '@angular/core';\nimport { type ArrayOrValue, modifier, type Modifier, type ModifierFunction, type ModifierMap } from '@dereekb/util';\nimport { type Observable } from 'rxjs';\nimport { type DbxValueListItem } from './list.view.value';\n\n// MARK: ValueListView\n/**\n * Abstract class and injection token for managing modifiers on value list items. Modifiers allow transforming\n * list item properties (e.g., disabling ripple, marking as selected) before rendering.\n */\nexport abstract class DbxValueListItemModifier<T = unknown, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  abstract readonly modifiers$: Observable<ModifierMap<I>>;\n  abstract addModifiers(modifiers: ArrayOrValue<Modifier<I>>): void;\n  abstract removeModifiers(modifiers: ArrayOrValue<Modifier<I>>): void;\n}\n\n/**\n * Registers a directive as a {@link DbxValueListItemModifier} provider for dependency injection.\n *\n * @param sourceType - The directive class to register as the DbxValueListItemModifier provider.\n * @returns Array of Angular providers that wire up the directive as a DbxValueListItemModifier.\n *\n * @Directive ({\n *   providers: provideDbxValueListViewModifier(MyModifierDirective)\n * })\n * export class MyModifierDirective extends DbxValueListItemModifier<MyItem> { ... }\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxValueListViewModifier<V extends DbxValueListItemModifier>(sourceType: Type<V>): Provider[] {\n  return [\n    {\n      provide: DbxValueListItemModifier,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n\n// MARK: Utility\n/**\n * A {@link Modifier} specialized for {@link DbxValueListItem} instances.\n */\nexport type ListItemModifier<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> = Modifier<I>;\n\n/**\n * Creates a {@link ListItemModifier} with the given key and modification function.\n *\n * @param key - A unique string identifier for this modifier in the modifier map.\n * @param modify - The function that mutates list item properties during rendering.\n * @returns A new ListItemModifier with the given key and modification function.\n *\n * @example\n * ```ts\n * const highlightModifier = listItemModifier<MyItem>('highlight', (item) => {\n *   item.selected = item.itemValue.isImportant;\n * });\n * ```\n */\nexport function listItemModifier<T, I extends DbxValueListItem<T> = DbxValueListItem<T>>(key: string, modify: ModifierFunction<I>): ListItemModifier<T, I> {\n  return modifier(key, modify);\n}\n","import { BehaviorSubject, map, type Observable, shareReplay, combineLatest, distinctUntilChanged } from 'rxjs';\nimport { Directive, inject, input } from '@angular/core';\nimport { type DbxValueListItem } from '../list.view.value';\nimport { addModifiers, type ArrayOrValue, combineMaps, type Maybe, type Modifier, type ModifierMap, removeModifiers } from '@dereekb/util';\nimport { type MaybeObservableOrValue, maybeValueFromObservableOrValue } from '@dereekb/rxjs';\nimport { DbxValueListItemModifier, provideDbxValueListViewModifier } from '../list.view.value.modifier';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { clean, cleanSubscription, completeOnDestroy, transformEmptyStringInputToUndefined } from '@dereekb/dbx-core';\n\n/**\n * Directive that implements {@link DbxValueListItemModifier}, managing a collection of item modifiers\n * that transform list items before rendering. Accepts modifiers via the `dbxListItemModifier` input or programmatically.\n *\n * @example\n * ```html\n * <dbx-list-view [dbxListItemModifier]=\"myModifiers\" [config]=\"listViewConfig\"></dbx-list-view>\n * ```\n */\n@Directive({\n  selector: 'dbxListItemModifier,[dbxListItemModifier]',\n  providers: provideDbxValueListViewModifier(DbxValueListItemModifierDirective)\n})\nexport class DbxValueListItemModifierDirective<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> implements DbxValueListItemModifier<T, I> {\n  readonly inputModifiers = input<Maybe<ArrayOrValue<Modifier<I>>>, Maybe<'' | ArrayOrValue<Modifier<I>>>>(undefined, { alias: 'dbxListItemModifier', transform: transformEmptyStringInputToUndefined });\n\n  private readonly _additionalModifiers = completeOnDestroy(new BehaviorSubject<Maybe<ModifierMap<I>>>(undefined));\n\n  readonly modifiers$ = combineLatest([this._additionalModifiers, toObservable(this.inputModifiers)]).pipe(\n    map(([modifiers, inputModifiers]) => {\n      return combineMaps(modifiers, inputModifiers ? addModifiers(inputModifiers) : undefined);\n    }),\n    shareReplay(1)\n  );\n\n  // MARK: Modifiers\n  addModifiers(modifiers: ArrayOrValue<Modifier<I>>): void {\n    this._additionalModifiers.next(addModifiers(modifiers, this._additionalModifiers.value));\n  }\n\n  removeModifiers(modifiers: ArrayOrValue<Modifier<I>>): void {\n    this._additionalModifiers.next(removeModifiers(modifiers, this._additionalModifiers.value));\n  }\n}\n\n/**\n * Abstract base directive for creating custom list item modifiers. Automatically registers and unregisters\n * its modifiers with the parent {@link DbxValueListItemModifier}. Extend this to build reusable modifier directives.\n */\n@Directive()\nexport abstract class AbstractDbxValueListItemModifierDirective<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  readonly dbxValueListItemModifier = inject(DbxValueListItemModifier<T, I>);\n\n  private _currentLinkedModifiers: Maybe<ArrayOrValue<Modifier<I>>>;\n\n  private readonly _modifiers = completeOnDestroy(new BehaviorSubject<MaybeObservableOrValue<ArrayOrValue<Modifier<I>>>>(undefined));\n  readonly modifiers$: Observable<Maybe<ArrayOrValue<Modifier<I>>>> = this._modifiers.pipe(maybeValueFromObservableOrValue(), distinctUntilChanged());\n\n  constructor() {\n    cleanSubscription(\n      this.modifiers$.subscribe((modifiers) => {\n        this._linkModifiers(modifiers);\n      })\n    );\n\n    clean(() => this._unlinkModifiers());\n  }\n\n  setModifiers(modifiers: MaybeObservableOrValue<ArrayOrValue<Modifier<I>>>) {\n    this._modifiers.next(modifiers);\n  }\n\n  private _linkModifiers(modifiers: Maybe<ArrayOrValue<Modifier<I>>>) {\n    this._unlinkModifiers();\n\n    if (modifiers) {\n      this.dbxValueListItemModifier.addModifiers(modifiers);\n      this._currentLinkedModifiers = modifiers;\n    }\n  }\n\n  private _unlinkModifiers() {\n    if (this._currentLinkedModifiers) {\n      this.dbxValueListItemModifier.removeModifiers(this._currentLinkedModifiers);\n      this._currentLinkedModifiers = undefined;\n    }\n  }\n}\n","import { Directive, input } from '@angular/core';\nimport { type ClickableAnchor } from '@dereekb/dbx-core';\nimport { type ArrayOrValue, type Maybe, type Modifier } from '@dereekb/util';\nimport { map, type Observable } from 'rxjs';\nimport { type DbxValueListItem } from '../../../layout/list/list.view.value';\nimport { AbstractDbxValueListItemModifierDirective } from '../../../layout/list/modifier/list.view.value.modifier.directive';\nimport { toObservable } from '@angular/core/rxjs-interop';\n\n/**\n * Function that produces a {@link ClickableAnchor} for a given list item value, enabling per-item navigation links.\n */\nexport type AnchorForValueFunction<T> = (value: T, item: DbxValueListItem<T>) => Maybe<ClickableAnchor>;\n\n/**\n * Modifier key used to identify the router anchor modifier on list items.\n */\nexport const DBX_ROUTER_VALUE_LIST_ITEM_MODIFIER_KEY = 'router_anchor';\n\n/**\n * Structural directive that attaches a {@link ClickableAnchor} to each item in a {@link DbxValueListView} using a provided mapping function.\n *\n * This enables navigation when clicking list items without modifying the list component itself.\n *\n * @example\n * ```html\n * <dbx-list-view [dbxListItemAnchorModifier]=\"anchorForItem\">\n *   ...\n * </dbx-list-view>\n * ```\n *\n * ```typescript\n * anchorForItem: AnchorForValueFunction<MyItem> = (value) => ({ ref: `/items/${value.id}` });\n * ```\n */\n@Directive({\n  selector: '[dbxListItemAnchorModifier]'\n})\nexport class DbxListItemAnchorModifierDirective<T> extends AbstractDbxValueListItemModifierDirective<T> {\n  readonly anchorForItem = input<Maybe<AnchorForValueFunction<T>>>(undefined, { alias: 'dbxListItemAnchorModifier' });\n\n  readonly anchorForItemModifiers$: Observable<Maybe<ArrayOrValue<Modifier<DbxValueListItem<T>>>>> = toObservable(this.anchorForItem).pipe(\n    map((anchorForItem) => {\n      let modifiers: Maybe<Modifier<DbxValueListItem<T>>>;\n\n      if (anchorForItem) {\n        modifiers = {\n          key: DBX_ROUTER_VALUE_LIST_ITEM_MODIFIER_KEY,\n          modify: (x: DbxValueListItem<T>) => {\n            x.anchor = anchorForItem(x.itemValue, x);\n          }\n        };\n      }\n\n      return modifiers;\n    })\n  );\n\n  constructor() {\n    super();\n    this.setModifiers(this.anchorForItemModifiers$);\n  }\n}\n","import { type Observable, combineLatest, map, shareReplay, distinctUntilChanged, switchMap } from 'rxjs';\nimport { type ScreenMediaWidthType } from '../../../screen/screen';\nimport { DbxScreenMediaService } from '../../../screen/screen.service';\nimport { applyBestFit, findNext, isDefinedAndNotFalse, type Maybe } from '@dereekb/util';\nimport { Component, inject, input } from '@angular/core';\nimport { type ClickableAnchorLinkSegueRef, DbxRouterService, AbstractTransitionDirective, type DbxButtonDisplay } from '@dereekb/dbx-core';\nimport { type HorizontalConnectionPos } from '@angular/cdk/overlay';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { DbxAnchorComponent } from '../anchor';\nimport { MatTabLink, MatTabNav, MatTabNavPanel } from '@angular/material/tabs';\nimport { DbxButtonComponent } from '../../../button/button.component';\nimport { type DbxButtonStyle } from '../../../button/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';\nimport { NgClass } from '@angular/common';\n\n/**\n * A {@link ClickableAnchorLinkSegueRef} used by {@link DbxNavbarComponent} that can also configure the navbar button while the anchor is active.\n */\nexport interface DbxNavbarClickableAnchorLinkSegueRef extends ClickableAnchorLinkSegueRef {\n  /**\n   * Button style used by the navbar button while this anchor is active. Replaces the navbar's buttonStyle.\n   *\n   * Has no effect on the tab bar.\n   */\n  readonly activeButton?: Maybe<DbxButtonStyle>;\n}\n\n/**\n * Internal representation of a navigation anchor with its selection state.\n */\ninterface NavAnchorLink {\n  readonly selected: boolean;\n  readonly anchor: DbxNavbarClickableAnchorLinkSegueRef;\n}\n\n/**\n * Horizontal alignment for navbar content.\n */\nexport type NavBarContentAlign = 'center' | 'left' | 'right';\n\n/**\n * Display mode for the navbar: tab bar, button with dropdown/rotate, or icon-only button.\n */\nexport type NavbarMode = 'bar' | 'button' | 'icon';\n\n/**\n * Button behavior when the navbar collapses to button mode: show a dropdown menu or rotate through anchors on click.\n */\nexport type NavbarButtonMode = 'menu' | 'rotate';\n\n/**\n * Responsive navigation bar that displays anchor links as Material tabs, collapsing to a button menu or icon on smaller screens.\n *\n * Automatically selects the active anchor based on the current route and supports configurable breakpoints.\n *\n * @dbxWebComponent\n * @dbxWebSlug navbar\n * @dbxWebCategory navigation\n * @dbxWebRelated anchor, sidenav, pagebar\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-navbar [anchors]=\"anchors\"></dbx-navbar>\n * ```\n *\n * @example\n * ```html\n * <dbx-navbar [anchors]=\"topNav\"></dbx-navbar>\n * ```\n *\n * @example\n * ```html\n * <dbx-navbar mode=\"button\" [showMenuCaret]=\"true\" [buttonStyle]=\"{ type: 'flat', color: 'primary' }\" [anchors]=\"topNav\"></dbx-navbar>\n * ```\n */\n@Component({\n  selector: 'dbx-navbar',\n  templateUrl: './navbar.component.html',\n  host: {\n    class: 'dbx-navbar'\n  },\n  imports: [DbxAnchorComponent, MatTabNav, MatTabNavPanel, MatTabLink, DbxButtonComponent, MatIconModule, MatMenu, MatMenuItem, NgClass, MatMenuTrigger]\n})\nexport class DbxNavbarComponent extends AbstractTransitionDirective {\n  private readonly _dbxScreenMediaService = inject(DbxScreenMediaService);\n  private readonly _dbxRouterService = inject(DbxRouterService);\n\n  /**\n   * Whether or not to show the dropwdown caret for a menu\n   */\n  readonly showMenuCaret = input<boolean>(false);\n\n  /**\n   * Style passed to the button when the navbar renders as a button (the \"button\" and \"icon\" modes), such as a flat type and a color.\n   *\n   * The active anchor's activeButton style is used instead, if it has one. Has no effect on the tab bar.\n   */\n  readonly buttonStyle = input<Maybe<DbxButtonStyle>>();\n\n  readonly fab = input<boolean, Maybe<boolean | ''>>(false, { transform: isDefinedAndNotFalse });\n\n  readonly navAlign = input<HorizontalConnectionPos>('center');\n\n  readonly icon = input<Maybe<string>>();\n  readonly defaultIcon = input<Maybe<string>>('menu');\n  readonly defaultText = input<Maybe<string>>();\n  readonly mode = input<Maybe<NavbarMode>>();\n  readonly buttonMode = input<NavbarButtonMode>('menu');\n  readonly breakpoint = input<ScreenMediaWidthType>('large');\n  readonly anchors = input<Maybe<DbxNavbarClickableAnchorLinkSegueRef[]>>([]);\n\n  readonly isBreakpointActive$ = this._dbxScreenMediaService.isBreakpointActive(toObservable(this.breakpoint));\n\n  readonly mode$ = combineLatest([toObservable(this.mode), this.isBreakpointActive$]).pipe(\n    map(([inputMode, breakpointActive]) => {\n      return breakpointActive ? (inputMode ?? 'bar') : 'button';\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly anchors$: Observable<NavAnchorLink[]> = combineLatest([toObservable(this.anchors), this.initAndUpdateOnTransitionSuccess$]).pipe(\n    map(([anchors]) => {\n      const results = (anchors || []).map((anchor) => {\n        const selected = this._dbxRouterService.isActive(anchor);\n\n        return {\n          selected,\n          anchor\n        };\n      });\n\n      return applyBestFit(results, {\n        filter: (x) => x.selected,\n        compare: (a, b) => this._dbxRouterService.comparePrecision(a.anchor, b.anchor),\n        updateNonBestFit: (nonBestFit) => ({ ...nonBestFit, selected: false })\n      });\n    }),\n    shareReplay(1)\n  );\n\n  readonly selectedAnchor$: Observable<Maybe<NavAnchorLink>> = this.anchors$.pipe(map((x) => x.find((y) => y.selected)));\n  readonly nextRotateAnchor$: Observable<Maybe<NavAnchorLink>> = this.anchors$.pipe(map((x) => findNext(x, (y) => y.selected) || x[0]));\n\n  readonly hasNoAnchors$ = this.anchors$.pipe(\n    map((x) => x.length === 0),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly buttonNavAnchor$ = toObservable(this.buttonMode).pipe(\n    switchMap((x) => (x === 'menu' ? this.selectedAnchor$ : this.nextRotateAnchor$)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * The button style for the active anchor, falling back to the buttonStyle input.\n   *\n   * Always based on the active anchor, including in the \"rotate\" button mode where the button displays the next anchor.\n   */\n  readonly buttonStyle$: Observable<Maybe<DbxButtonStyle>> = combineLatest([toObservable(this.buttonStyle), this.selectedAnchor$]).pipe(\n    map(([buttonStyle, selectedAnchor]) => selectedAnchor?.anchor.activeButton ?? buttonStyle),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly buttonDisplay$: Observable<DbxButtonDisplay> = combineLatest([toObservable(this.defaultIcon), toObservable(this.icon), toObservable(this.defaultText), this.buttonNavAnchor$, this.mode$]).pipe(\n    map(([defaultIcon, icon, defaultText, selectedAnchor, mode]) => {\n      let content: DbxButtonDisplay;\n\n      if (icon) {\n        content = { icon, text: defaultText };\n      } else if (selectedAnchor) {\n        content = { icon: selectedAnchor.anchor.icon ?? defaultIcon, text: selectedAnchor.anchor.title };\n      } else {\n        content = { icon: defaultIcon ?? 'menu', text: defaultText };\n      }\n\n      return mode === 'icon' ? { icon: content.icon } : content;\n    }),\n    shareReplay(1)\n  );\n\n  readonly modeSignal = toSignal(this.mode$);\n  readonly isIconModeSignal = toSignal(\n    this.mode$.pipe(\n      map((x) => x === 'icon'),\n      distinctUntilChanged()\n    )\n  );\n  readonly anchorsSignal = toSignal(this.anchors$);\n  readonly buttonDisplaySignal = toSignal(this.buttonDisplay$);\n  readonly buttonStyleSignal = toSignal(this.buttonStyle$);\n  readonly hasNoAnchorsSignal = toSignal(this.hasNoAnchors$);\n  readonly nextRotateAnchorSignal = toSignal(this.nextRotateAnchor$);\n\n  // TODO: potentially make the caret depending on the current button display.\n}\n","@switch (modeSignal()) {\n  @case ('bar') {\n    <!-- Bar -->\n    <nav mat-tab-nav-bar [tabPanel]=\"tabPanel\" [attr.mat-align-tabs]=\"navAlign()\" aria-label=\"Main navigation\">\n      @for (x of anchorsSignal(); track x.anchor) {\n        <dbx-anchor [anchor]=\"x.anchor\">\n          <a mat-tab-link [active]=\"x.selected\" [attr.aria-current]=\"x.selected ? 'page' : null\">{{ x.anchor.title }}</a>\n        </dbx-anchor>\n      }\n    </nav>\n    <mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n  }\n  @default {\n    <!-- Button -->\n    @switch (buttonMode()) {\n      <!-- Menu -->\n      @case ('menu') {\n        <dbx-button class=\"nav-menu-button\" ariaLabel=\"open navigation\" [buttonStyle]=\"buttonStyleSignal()\" [buttonDisplay]=\"buttonDisplaySignal()\" [iconOnly]=\"isIconModeSignal()\" [fab]=\"fab()\" [matMenuTriggerFor]=\"menu\" [disabled]=\"hasNoAnchorsSignal()\" allowClickPropagation>\n          @if (showMenuCaret()) {\n            <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\n          }\n        </dbx-button>\n        <mat-menu #menu>\n          @for (x of anchorsSignal(); track x) {\n            <dbx-anchor [anchor]=\"x.anchor\">\n              <button mat-menu-item [ngClass]=\"x.selected ? 'active' : ''\" [attr.aria-current]=\"x.selected ? 'page' : null\">\n                @if (x.anchor.icon) {\n                  <mat-icon aria-hidden=\"true\">{{ x.anchor.icon }}</mat-icon>\n                }\n                {{ x.anchor.title }}\n              </button>\n            </dbx-anchor>\n          }\n        </mat-menu>\n      }\n      <!-- Rotate -->\n      @case ('rotate') {\n        <dbx-anchor [anchor]=\"nextRotateAnchorSignal()?.anchor\">\n          <dbx-button class=\"nav-menu-button\" ariaLabel=\"open navigation\" [buttonStyle]=\"buttonStyleSignal()\" [buttonDisplay]=\"buttonDisplaySignal()\" [iconOnly]=\"isIconModeSignal()\" [fab]=\"fab()\" [disabled]=\"hasNoAnchorsSignal()\"></dbx-button>\n        </dbx-anchor>\n      }\n    }\n  }\n}\n","import { type Maybe } from '@dereekb/util';\n\n/**\n * Display modes for the sidenav based on screen width.\n *\n * - `NONE` - Sidenav is hidden.\n * - `MOBILE` - Sidenav is an overlay drawer, closed by default.\n * - `ICON` - Sidenav is a persistent narrow rail showing icons only.\n * - `FULL` - Sidenav is a persistent full-width panel.\n */\nexport enum SideNavDisplayMode {\n  NONE = 'none',\n  MOBILE = 'mobile',\n  ICON = 'icon',\n  FULL = 'full'\n}\n\n/**\n * Ordered list of {@link SideNavDisplayMode} values from lowest to highest.\n *\n * Used by {@link resolveSideNavDisplayMode} for rounding down to an allowed mode.\n */\nexport const SIDE_NAV_DISPLAY_MODE_ORDER: readonly SideNavDisplayMode[] = [SideNavDisplayMode.NONE, SideNavDisplayMode.MOBILE, SideNavDisplayMode.ICON, SideNavDisplayMode.FULL];\n\n/**\n * String union type matching the {@link SideNavDisplayMode} enum values.\n *\n * Useful for template bindings where string literals are passed directly.\n */\nexport type SideNavDisplayModeString = `${SideNavDisplayMode}`;\n\n/**\n * Position of the sidenav drawer.\n *\n * - `start` - Left side (default, LTR).\n * - `end` - Right side (LTR).\n */\nexport type DbxSidenavPosition = 'start' | 'end';\n\n/**\n * Resolves a {@link SideNavDisplayMode} against a set of allowed modes.\n *\n * If the requested mode is allowed, it is returned as-is. Otherwise, the nearest\n * allowed mode that is lower in the {@link SIDE_NAV_DISPLAY_MODE_ORDER} hierarchy is returned.\n * Falls back to the lowest allowed mode if no lower mode is available, or {@link SideNavDisplayMode.NONE}\n * if the allowed set is empty or undefined.\n *\n * @param mode - The requested display mode to resolve.\n * @param allowedModes - Set of modes that are permitted; if null/undefined, all modes are allowed.\n * @returns The resolved display mode, falling back to the nearest lower allowed mode or NONE.\n *\n * @example\n * ```ts\n * // ICON not allowed, rounds down to MOBILE\n * resolveSideNavDisplayMode(SideNavDisplayMode.ICON, new Set([SideNavDisplayMode.MOBILE, SideNavDisplayMode.FULL]));\n * // => SideNavDisplayMode.MOBILE\n * ```\n */\nexport function resolveSideNavDisplayMode(mode: SideNavDisplayMode, allowedModes: Maybe<Set<SideNavDisplayMode>>): SideNavDisplayMode {\n  let result: SideNavDisplayMode;\n\n  if (!allowedModes || allowedModes.has(mode)) {\n    result = mode;\n  } else {\n    const modeIndex = SIDE_NAV_DISPLAY_MODE_ORDER.indexOf(mode);\n    let resolved: Maybe<SideNavDisplayMode>;\n\n    // search downward for the nearest allowed mode\n    for (let i = modeIndex - 1; i >= 0; i--) {\n      if (allowedModes.has(SIDE_NAV_DISPLAY_MODE_ORDER[i])) {\n        resolved = SIDE_NAV_DISPLAY_MODE_ORDER[i];\n        break;\n      }\n    }\n\n    // fallback to the lowest allowed mode if no lower mode was found\n    if (resolved == null) {\n      for (const m of SIDE_NAV_DISPLAY_MODE_ORDER) {\n        if (allowedModes.has(m)) {\n          resolved = m;\n          break;\n        }\n      }\n    }\n\n    result = resolved ?? SideNavDisplayMode.NONE;\n  }\n\n  return result;\n}\n","import { Component, input, viewChild, inject, computed, type OnInit } from '@angular/core';\nimport { type MatDrawerMode, MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\nimport { DbxScreenMediaService } from '../../../screen/screen.service';\nimport { AbstractTransitionWatcherDirective, cleanSubscription, type ClickableAnchorLinkTree } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxSidenavPosition, resolveSideNavDisplayMode, SideNavDisplayMode, type SideNavDisplayModeString } from './sidenav';\nimport { NgClass } from '@angular/common';\nimport { DbxRouterAnchorModule } from '../anchor/anchor.module';\nimport { DbxAnchorListComponent } from '../anchorlist/anchorlist.component';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { combineLatest, distinctUntilChanged, map, type Observable, shareReplay } from 'rxjs';\n\n/**\n * Describes the current state of the sidenav sidebar, including display mode, Material drawer mode, and open/closed state.\n */\nexport interface DbxSidenavSidebarState {\n  readonly mode: SideNavDisplayMode;\n  readonly drawer: MatDrawerMode;\n  readonly open?: boolean;\n}\n\n/**\n * Responsive side navigation component that adapts its display mode based on screen width.\n *\n * Renders a Material sidenav with an anchor list and automatically transitions between mobile overlay, icon rail, and full sidebar modes.\n * Closes automatically on route transitions in mobile mode.\n *\n * @dbxWebComponent\n * @dbxWebSlug sidenav\n * @dbxWebCategory navigation\n * @dbxWebRelated sidenav-page, anchor-list\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-sidenav [anchors]=\"anchors\"></dbx-sidenav>\n * ```\n *\n * @example\n * ```html\n * <dbx-sidenav [anchors]=\"sidenavAnchors\"></dbx-sidenav>\n * ```\n */\n@Component({\n  selector: 'dbx-sidenav',\n  exportAs: 'sidenav',\n  template: `\n    <mat-sidenav-container class=\"dbx-sidenav\" [ngClass]=\"cssClassesSignal()\">\n      <mat-sidenav [position]=\"position()\" [disableClose]=\"disableBackdropSignal()\" [mode]=\"drawerSignal()\">\n        <ng-content select=\"[top]\"></ng-content>\n        <dbx-anchor-list class=\"dbx-sidenav-anchor-list\" [anchors]=\"anchors()\"></dbx-anchor-list>\n        <span class=\"spacer\"></span>\n        <ng-content select=\"[bottom]\"></ng-content>\n        <div class=\"dbx-sidenav-nav-end\"></div>\n      </mat-sidenav>\n      <mat-sidenav-content>\n        <ng-content></ng-content>\n      </mat-sidenav-content>\n    </mat-sidenav-container>\n  `,\n  imports: [NgClass, MatSidenavModule, DbxRouterAnchorModule, DbxAnchorListComponent]\n})\nexport class DbxSidenavComponent extends AbstractTransitionWatcherDirective implements OnInit {\n  private readonly _sidenavSub = cleanSubscription();\n  private readonly _screenMediaService = inject(DbxScreenMediaService);\n\n  readonly position = input<DbxSidenavPosition>('start');\n\n  /**\n   * Overrides the responsive display mode. When set, the sidenav ignores screen-width breakpoints and uses this mode instead.\n   *\n   * Set to `'mobile'` to keep the sidenav always hidden as an overlay that only opens when toggled.\n   */\n  readonly displayMode = input<Maybe<SideNavDisplayModeString>>(undefined);\n\n  readonly sidenav = viewChild.required<MatSidenav>(MatSidenav);\n\n  /**\n   * Restricts which {@link SideNavDisplayMode} values are permitted.\n   *\n   * When set, any responsive or overridden mode not in this set is rounded down to the nearest\n   * allowed mode in the {@link SIDE_NAV_DISPLAY_MODE_ORDER} hierarchy.\n   *\n   * @example\n   * ```html\n   * <dbx-sidenav [allowedModes]=\"['mobile', 'full']\">\n   * ```\n   */\n  readonly allowedModes = input<Maybe<SideNavDisplayModeString[]>>(undefined);\n\n  readonly anchors = input<Maybe<ClickableAnchorLinkTree[]>>();\n\n  private readonly _allowedModes$ = toObservable(this.allowedModes);\n\n  readonly responsiveMode$: Observable<SideNavDisplayMode> = this._screenMediaService.widthType$.pipe(\n    distinctUntilChanged(),\n    map((width) => {\n      let mode!: SideNavDisplayMode;\n\n      switch (width) {\n        case 'micro':\n        case 'small':\n          mode = SideNavDisplayMode.MOBILE;\n          break;\n        case 'tablet':\n          mode = SideNavDisplayMode.ICON;\n          break;\n        case 'large':\n        case 'full':\n          mode = SideNavDisplayMode.FULL;\n          break;\n        default:\n          break;\n      }\n\n      return mode;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  private readonly _displayMode$ = toObservable(this.displayMode);\n\n  readonly mode$: Observable<SideNavDisplayMode> = combineLatest([this.responsiveMode$, this._displayMode$, this._allowedModes$]).pipe(\n    map(([responsive, override, allowedModes]) => {\n      const raw = (override as SideNavDisplayMode) ?? responsive;\n      const allowedSet = allowedModes ? new Set<SideNavDisplayMode>(allowedModes as SideNavDisplayMode[]) : undefined;\n      return resolveSideNavDisplayMode(raw, allowedSet);\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly modeSignal = toSignal(this.mode$);\n  readonly disableBackdropSignal = computed(() => this.modeSignal() !== SideNavDisplayMode.MOBILE);\n  readonly sizeCssClassSignal = computed(() => `dbx-sidenav-${this.modeSignal()}`);\n  readonly positionCssClassSignal = computed(() => (this.position() === 'end' ? 'dbx-sidenav-end' : 'dbx-sidenav-start'));\n  readonly cssClassesSignal = computed(() => `${this.sizeCssClassSignal()} ${this.positionCssClassSignal()}`);\n\n  readonly state$ = this.mode$.pipe(\n    map((mode) => {\n      let drawer: MatDrawerMode = 'over';\n      let open: boolean = true;\n\n      switch (mode) {\n        case SideNavDisplayMode.MOBILE:\n          drawer = 'over';\n          open = false;\n          break;\n        case SideNavDisplayMode.ICON:\n        case SideNavDisplayMode.FULL:\n          drawer = 'side';\n          open = true; // always show\n          break;\n        default:\n          break;\n      }\n\n      return {\n        mode,\n        drawer,\n        open\n      };\n    }),\n    distinctUntilChanged((a, b) => a.mode === b.mode && a.drawer === b.drawer && a.open === b.open),\n    shareReplay(1)\n  );\n\n  readonly stateSignal = toSignal(this.state$);\n  readonly drawerSignal = computed(() => this.stateSignal()?.drawer ?? 'over');\n\n  ngOnInit() {\n    // wait until the child sidenav has initialized\n    this._sidenavSub.setSub(\n      this.state$.subscribe((state) => {\n        if (state?.open != null) {\n          this._toggleNav(state.open, true);\n        }\n      })\n    );\n  }\n\n  protected updateForSuccessfulTransition(): void {\n    this.closeNav();\n  }\n\n  closeNav(): void {\n    this.toggleNav(false);\n  }\n\n  toggleNav(open?: boolean): void {\n    this._toggleNav(open);\n  }\n\n  private _toggleNav(toggleOpen?: Maybe<boolean>, forced = false): void {\n    toggleOpen = toggleOpen ?? !this.sidenav().opened;\n\n    const mode = this.stateSignal()?.mode;\n\n    let open: Maybe<boolean>;\n\n    if (forced) {\n      open = toggleOpen;\n    } else {\n      switch (mode) {\n        case SideNavDisplayMode.MOBILE:\n          open = toggleOpen;\n          break;\n        case SideNavDisplayMode.ICON:\n        case SideNavDisplayMode.FULL:\n          // Do nothing. Should be always open.\n          break;\n        default:\n          break;\n      }\n    }\n\n    if (open != null) {\n      if (open) {\n        void this.sidenav().open();\n      } else {\n        void this.sidenav().close();\n      }\n    }\n  }\n}\n","import { Component, input, inject } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { map } from 'rxjs';\nimport { DbxSidenavComponent } from './sidenav.component';\nimport { SideNavDisplayMode } from './sidenav';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Default icon displayed on the sidenav toggle button.\n */\nexport const DEFAULT_DBX_SIDENAV_MENU_ICON = 'view_sidebar';\n\n/**\n * Icon button that toggles the parent {@link DbxSidenavComponent} open or closed. Only visible when the sidenav is in mobile display mode.\n *\n * @example\n * ```html\n * <dbx-sidenav-button sidenavMenuIcon=\"menu\"></dbx-sidenav-button>\n * ```\n */\n@Component({\n  selector: 'dbx-sidenav-button',\n  template: `\n    @if (showMenuButtonSignal()) {\n      <button class=\"dbx-sidenav-button\" mat-icon-button (click)=\"toggleNav()\" aria-label=\"Toggle sidebar navigation\">\n        <mat-icon aria-hidden=\"true\">{{ sidenavMenuIcon() }}</mat-icon>\n      </button>\n    }\n  `,\n  imports: [MatIconModule, MatButtonModule]\n})\nexport class DbxSidenavButtonComponent {\n  readonly parent = inject(DbxSidenavComponent);\n  readonly mode$ = this.parent.mode$;\n  readonly showMenuButton$ = this.mode$.pipe(map((x) => x === SideNavDisplayMode.MOBILE));\n  readonly showMenuButtonSignal = toSignal(this.showMenuButton$, { initialValue: false });\n\n  readonly sidenavMenuIcon = input<string, Maybe<string>>(DEFAULT_DBX_SIDENAV_MENU_ICON, {\n    transform: (value: Maybe<string>) => value || DEFAULT_DBX_SIDENAV_MENU_ICON\n  });\n\n  toggleNav() {\n    this.parent.toggleNav();\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxPagebarComponent } from '../../../layout/bar/pagebar.component';\nimport { DbxSidenavButtonComponent } from './sidenav.button.component';\nimport { DbxButtonSpacerDirective } from '../../../button/button.spacer.directive';\n\n/**\n * Pagebar component pre-configured with a sidenav toggle button for use inside a {@link DbxSidenavPageComponent}.\n *\n * Extends {@link DbxPagebarComponent} and adds the sidenav menu button on the left side.\n *\n * @example\n * ```html\n * <dbx-sidenav-pagebar sidenavMenuIcon=\"menu\" dbxColor=\"primary\">\n *   <span left>Left Content</span>\n *   <span>Right Content</span>\n * </dbx-sidenav-pagebar>\n * ```\n */\n@Component({\n  selector: 'dbx-sidenav-pagebar',\n  template: `\n    <dbx-pagebar class=\"dbx-sidenav-pagebar\">\n      <span left>\n        @if (showSidenavButton() !== false) {\n          <dbx-sidenav-button [sidenavMenuIcon]=\"sidenavMenuIcon()\"></dbx-sidenav-button>\n          <dbx-button-spacer></dbx-button-spacer>\n        }\n        <ng-content left></ng-content>\n      </span>\n      <ng-content right></ng-content>\n    </dbx-pagebar>\n  `,\n  imports: [DbxPagebarComponent, DbxSidenavButtonComponent, DbxButtonSpacerDirective]\n})\nexport class DbxSidenavPagebarComponent extends DbxPagebarComponent {\n  /**\n   * The sidenav menu icon\n   */\n  readonly sidenavMenuIcon = input<Maybe<string>>();\n  /**\n   * Whether or not to show the sidenav button.\n   *\n   * Defaults to true.\n   */\n  readonly showSidenavButton = input<Maybe<boolean>>();\n}\n","import { switchMap, shareReplay, map, of } from 'rxjs';\nimport { Component, input, inject } from '@angular/core';\nimport { DbxSidenavComponent } from './sidenav.component';\nimport { type Maybe } from '@dereekb/util';\nimport { SideNavDisplayMode } from './sidenav';\nimport { DbxSidenavPagebarComponent } from './sidenav.pagebar.component';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Page layout component designed for use inside a {@link DbxSidenavComponent}. Includes a sidenav-aware pagebar and a content area.\n *\n * When `mobileOnly` is true, the pagebar is hidden on non-mobile screen sizes.\n *\n * @dbxWebComponent\n * @dbxWebSlug sidenav-page\n * @dbxWebCategory navigation\n * @dbxWebRelated sidenav, navbar\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-sidenav-page>Content</dbx-sidenav-page>\n * ```\n *\n * @example\n * ```html\n * <dbx-sidenav-page>\n *   <ui-view></ui-view>\n * </dbx-sidenav-page>\n * ```\n */\n@Component({\n  selector: 'dbx-sidenav-page',\n  template: `\n    <dbx-sidenav-pagebar [showSidenavButton]=\"showSidenavButton()\" [sidenavMenuIcon]=\"sidenavMenuIcon()\">\n      <ng-content left select=\"[navLeft]\"></ng-content>\n      <ng-content select=\"[navRight]\"></ng-content>\n    </dbx-sidenav-pagebar>\n    <div class=\"dbx-content-page dbx-sidenav-page-content\">\n      <ng-content></ng-content>\n    </div>\n  `,\n  host: {\n    class: 'd-block',\n    '[class.dbx-pagebar-hide]': 'hidePagebarSignal()'\n  },\n  imports: [DbxSidenavPagebarComponent]\n})\nexport class DbxSidenavPageComponent {\n  readonly parent = inject(DbxSidenavComponent);\n  /**\n   * The sidenav menu icon\n   */\n  readonly sidenavMenuIcon = input<Maybe<string>>();\n  /**\n   * Whether or not to show the sidenav button.\n   *\n   * Defaults to true.\n   */\n  readonly showSidenavButton = input<Maybe<boolean>>();\n\n  readonly mobileOnly = input<boolean>(false);\n\n  readonly mobileOnly$ = toObservable(this.mobileOnly);\n\n  readonly hidePagebar$ = this.mobileOnly$.pipe(\n    switchMap((mobileOnly) => (mobileOnly ? this.parent.mode$.pipe(map((x) => x !== SideNavDisplayMode.MOBILE)) : of(false))),\n    shareReplay(1)\n  );\n\n  readonly hidePagebarSignal = toSignal(this.hidePagebar$, { initialValue: false });\n}\n","import { input, Directive, inject, computed, type Signal } from '@angular/core';\nimport { AbstractIfDirective } from '@dereekb/dbx-core';\nimport { type ArrayOrValue, type Maybe, asArray, filterMaybeArrayValues } from '@dereekb/util';\nimport { shareReplay, switchMap, distinctUntilChanged, map } from 'rxjs';\nimport { DbxSidenavComponent } from './sidenav.component';\nimport { type SideNavDisplayMode } from './sidenav';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Structural directive that conditionally renders its host element based on the current {@link SideNavDisplayMode} of the parent {@link DbxSidenavComponent}.\n *\n * Accepts one or more display modes and shows the content only when the sidenav matches.\n *\n * @example\n * ```html\n * <div *dbxIfSidenavDisplayMode=\"'full'\">Visible only in full mode</div>\n * <div *dbxIfSidenavDisplayMode=\"['mobile', 'icon']\">Visible in mobile or icon mode</div>\n * ```\n */\n@Directive({\n  selector: '[dbxIfSidenavDisplayMode]'\n})\nexport class DbxIfSidenavDisplayModeDirective extends AbstractIfDirective {\n  readonly dbxSidenavComponent = inject(DbxSidenavComponent);\n\n  readonly modes = input<Maybe<ArrayOrValue<SideNavDisplayMode | string>>>(undefined, { alias: 'dbxIfSidenavDisplayMode' });\n\n  readonly modesSetSignal: Signal<Set<SideNavDisplayMode>> = computed(() => {\n    const modes = this.modes();\n    return new Set(filterMaybeArrayValues(asArray(modes as SideNavDisplayMode)));\n  });\n\n  readonly modes$ = toObservable(this.modesSetSignal);\n\n  readonly show$ = this.modes$.pipe(\n    switchMap((modes) => {\n      return this.dbxSidenavComponent.mode$.pipe(map((mode) => modes.has(mode)));\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly showSignal = toSignal(this.show$, { initialValue: false });\n}\n","import { NgModule } from '@angular/core';\nimport { DbxSidenavComponent } from './sidenav.component';\nimport { DbxSidenavPagebarComponent } from './sidenav.pagebar.component';\nimport { DbxSidenavPageComponent } from './sidenav.page.component';\nimport { DbxSidenavButtonComponent } from './sidenav.button.component';\nimport { DbxIfSidenavDisplayModeDirective } from './sidenav.ifdisplaymode.directive';\n\nconst importsAndExports = [DbxIfSidenavDisplayModeDirective, DbxSidenavComponent, DbxSidenavButtonComponent, DbxSidenavPagebarComponent, DbxSidenavPageComponent];\n\n/**\n * NgModule that re-exports all standalone sidenav-related components and directives for backward compatibility.\n *\n * Prefer importing individual standalone components directly in new code.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxRouterSidenavModule {}\n","export * from './sidenav.component';\nexport * from './sidenav.module';\nexport * from './sidenav.button.component';\nexport * from './sidenav.pagebar.component';\nexport * from './sidenav.page.component';\nexport * from './sidenav.ifdisplaymode.directive';\nexport * from './sidenav';\n// export * from './side.item.component';\n// export * from './side.title.component';\n// export * from './side.title.content.component';\n","import { NgModule } from '@angular/core';\nimport { DbxRouterAnchorModule } from './anchor/anchor.module';\nimport { DbxRouterSidenavModule } from './sidenav/sidenav.module';\n\n/**\n * Convenience NgModule that re-exports {@link DbxRouterAnchorModule} and {@link DbxRouterSidenavModule}.\n */\n@NgModule({\n  exports: [DbxRouterAnchorModule, DbxRouterSidenavModule]\n})\nexport class DbxRouterLayoutModule {}\n","import { Component, computed, ElementRef, viewChild } from '@angular/core';\nimport { AbstractDbxSegueAnchorDirective } from '../../layout/anchor/anchor.segue.directive';\nimport { DbxInjectionComponent } from '@dereekb/dbx-core';\nimport { overrideClickElementEffect } from '../../../util/click';\n\n/**\n * Segue anchor component that renders a `routerLink`-based anchor element for the Angular Router.\n *\n * Injected by {@link DbxAnchorComponent} via {@link DbxRouterWebProviderConfig} when the app is configured with {@link provideDbxRouterWebAngularRouterProviderConfig}.\n */\n@Component({\n  templateUrl: './anchor.component.html',\n  imports: [DbxInjectionComponent]\n})\nexport class DbxAngularRouterSegueAnchorComponent extends AbstractDbxSegueAnchorDirective {\n  readonly anchorElement = viewChild.required<string, ElementRef<HTMLElement>>('anchor', { read: ElementRef });\n  readonly injectionElement = viewChild.required<string, ElementRef<HTMLElement>>('injection', { read: ElementRef });\n  readonly anchorDisabledSignal = computed(() => this.anchorSignal()?.disabled ?? false);\n\n  protected readonly _overrideClickElementEffect = overrideClickElementEffect({\n    clickTarget: this.anchorElement,\n    childClickTarget: this.injectionElement,\n    disabledSignal: this.anchorDisabledSignal\n  });\n}\n","<a class=\"dbx-anchor-a\" #anchor [attr.target]=\"targetSignal()\">\n  <dbx-injection #injection [template]=\"templateConfigSignal()\"></dbx-injection>\n</a>\n","import { type EnvironmentProviders, makeEnvironmentProviders, type Provider } from '@angular/core';\nimport { DbxRouterWebProviderConfig } from '../router.provider.config';\nimport { DbxAngularRouterSegueAnchorComponent } from './anchor.component';\n\n/**\n * Provides a {@link DbxRouterWebProviderConfig} that configures the application to use Angular Router for rendering segue-ref anchor links.\n *\n * @returns Environment providers that configure the Angular Router-based segue anchor component.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n *   providers: [provideDbxRouterWebAngularRouterProviderConfig()]\n * });\n * ```\n */\nexport function provideDbxRouterWebAngularRouterProviderConfig(): EnvironmentProviders {\n  const config: DbxRouterWebProviderConfig = {\n    anchorSegueRefComponent: {\n      componentClass: DbxAngularRouterSegueAnchorComponent\n    }\n  };\n\n  const providers: Provider[] = [\n    {\n      provide: DbxRouterWebProviderConfig,\n      useValue: config\n    }\n  ];\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Component, computed, ElementRef, viewChild } from '@angular/core';\nimport { AbstractDbxSegueAnchorDirective } from '../../layout/anchor/anchor.segue.directive';\nimport { type Obj, type StateOrName, type TransitionOptions, UIRouterModule } from '@uirouter/angular';\nimport { DbxInjectionComponent } from '@dereekb/dbx-core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { overrideClickElementEffect } from '../../../util/click';\n\n/**\n * Segue anchor component that renders a `uiSref`-based anchor element for UIRouter.\n *\n * Injected by {@link DbxAnchorComponent} via {@link DbxRouterWebProviderConfig} when the app is configured with {@link provideDbxRouterWebUiRouterProviderConfig}.\n */\n@Component({\n  templateUrl: './anchor.component.html',\n  imports: [UIRouterModule, DbxInjectionComponent]\n})\nexport class DbxUIRouterSegueAnchorComponent extends AbstractDbxSegueAnchorDirective {\n  private readonly _parentAnchorSignal = toSignal(this.parent.anchor$, { initialValue: undefined });\n\n  readonly anchorElement = viewChild.required<string, ElementRef<HTMLElement>>('anchor', { read: ElementRef });\n  readonly injectionElement = viewChild.required<string, ElementRef<HTMLElement>>('injection', { read: ElementRef });\n  readonly anchorDisabledSignal = computed(() => this.anchorSignal()?.disabled ?? false);\n\n  protected readonly _overrideClickElementEffect = overrideClickElementEffect({\n    clickTarget: this.anchorElement,\n    childClickTarget: this.injectionElement,\n    disabledSignal: this.anchorDisabledSignal\n  });\n\n  readonly uiSrefSignal = computed<StateOrName>(() => (this._parentAnchorSignal()?.ref ?? '') as StateOrName);\n  readonly uiParamsSignal = computed<Obj | undefined>(() => this._parentAnchorSignal()?.refParams);\n  readonly uiOptionsSignal = computed<TransitionOptions>(() => this._parentAnchorSignal()?.refOptions ?? {});\n}\n","<a class=\"dbx-anchor-a dbx-anchor-sref\" #anchor [attr.target]=\"targetSignal()\" [uiSref]=\"uiSrefSignal()\" [uiParams]=\"uiParamsSignal()\" [uiOptions]=\"uiOptionsSignal()\" uiSrefActive=\"dbx-anchor-active\" uiSrefActiveEq=\"dbx-anchor-active-eq\">\n  <dbx-injection #injection [template]=\"templateConfigSignal()\"></dbx-injection>\n</a>\n","import { type EnvironmentProviders, makeEnvironmentProviders, type Provider } from '@angular/core';\nimport { DbxRouterWebProviderConfig } from '../router.provider.config';\nimport { DbxUIRouterSegueAnchorComponent } from './anchor.component';\n\n/**\n * Provides a {@link DbxRouterWebProviderConfig} that configures the application to use UIRouter for rendering segue-ref anchor links.\n *\n * @returns Environment providers that configure the UIRouter-based segue anchor component.\n *\n * @example\n * ```typescript\n * bootstrapApplication(AppComponent, {\n *   providers: [provideDbxRouterWebUiRouterProviderConfig()]\n * });\n * ```\n */\nexport function provideDbxRouterWebUiRouterProviderConfig(): EnvironmentProviders {\n  const config: DbxRouterWebProviderConfig = {\n    anchorSegueRefComponent: {\n      componentClass: DbxUIRouterSegueAnchorComponent\n    }\n  };\n\n  const providers: Provider[] = [\n    {\n      provide: DbxRouterWebProviderConfig,\n      useValue: config\n    }\n  ];\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Component, computed, effect, inject, input } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { delay, type Observable } from 'rxjs';\nimport { type ClickableAnchor } from '@dereekb/dbx-core';\nimport { TwoColumnsContextStore } from './two.column.store';\nimport { type Maybe } from '@dereekb/util';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxTwoColumnColumnHeadDirective } from './two.column.head.directive';\nimport { DbxAnchorComponent } from '../../../router';\n\n/**\n * Wraps right-column content within a {@link DbxTwoColumnComponent} and renders a navigation bar with a back button.\n *\n * When this component is created, it automatically registers itself with the {@link TwoColumnsContextStore}\n * to indicate that right-side content is present.\n *\n * @dbxWebComponent\n * @dbxWebSlug two-column-right\n * @dbxWebCategory layout\n * @dbxWebRelated two-column\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks, dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-two-column-right>Body</dbx-two-column-right>\n * ```\n *\n * @example\n * ```html\n * <dbx-two-column-right header=\"Item Detail\">\n *   <button nav mat-icon-button><mat-icon>delete</mat-icon></button>\n *   <p>Body content</p>\n * </dbx-two-column-right>\n * ```\n */\n@Component({\n  selector: 'dbx-two-column-right',\n  template: `\n    <dbx-two-column-head [block]=\"block()\" [full]=\"full()\">\n      <!-- Back Buttons -->\n      @if (showBackSignal()) {\n        <button mat-icon-button class=\"back-button\" (click)=\"backClicked()\" aria-label=\"back button\">\n          <mat-icon>navigate_before</mat-icon>\n        </button>\n      }\n      @if (alternativeBackRefSignal()) {\n        <dbx-anchor [anchor]=\"alternativeBackRefSignal()\">\n          <button mat-icon-button class=\"back-button\" aria-label=\"back button\">\n            <mat-icon>navigate_before</mat-icon>\n          </button>\n        </dbx-anchor>\n      }\n      @if (header()) {\n        <span class=\"right-nav-title\">{{ header() }}</span>\n      }\n      <span class=\"right-nav-spacer\"></span>\n      <span class=\"spacer\"></span>\n      <ng-content select=\"[nav]\"></ng-content>\n    </dbx-two-column-head>\n    <div class=\"dbx-two-column-right-content\">\n      <ng-content></ng-content>\n    </div>\n  `,\n  host: {\n    class: 'dbx-two-column-right d-block'\n  },\n  imports: [DbxTwoColumnColumnHeadDirective, MatButtonModule, MatIconModule, DbxAnchorComponent]\n})\nexport class DbxTwoColumnRightComponent {\n  readonly twoColumnsContextStore = inject(TwoColumnsContextStore);\n\n  /**\n   * Whether the header area should expand to full width.\n   */\n  readonly full = input<boolean>(false);\n\n  /**\n   * Optional title text displayed in the navigation bar header.\n   */\n  readonly header = input<Maybe<string>>();\n\n  /**\n   * Whether the header should use block-level display.\n   */\n  readonly block = input<Maybe<boolean>>();\n\n  /**\n   * Whether to show the default back button. Defaults to `true`.\n   * If a `backRef` is set on the store, that anchor is used instead.\n   */\n  readonly showBack = input<boolean>(true);\n\n  readonly alternativeBackRef$: Observable<Maybe<ClickableAnchor>> = this.twoColumnsContextStore.backRef$;\n  readonly alternativeBackRefSignal = toSignal(this.alternativeBackRef$.pipe(delay(0)));\n\n  /**\n   * Minimum right-side width allowed in pixels.\n   */\n  readonly minRightWidth = input<Maybe<number>>();\n\n  protected readonly _setMinRightWidthEffect = effect(() => {\n    this.twoColumnsContextStore.setMinRightWidth(this.minRightWidth());\n  });\n\n  readonly showBackSignal = computed(() => {\n    const showBack = this.showBack();\n    const alternativeBackRef = this.alternativeBackRefSignal();\n\n    // show the back signal if true and there is no alternative back\n    return showBack && !alternativeBackRef;\n  });\n\n  constructor() {\n    this.twoColumnsContextStore.setHasRight(true);\n  }\n\n  public backClicked(): void {\n    this.twoColumnsContextStore.back();\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { cleanSubscription, DbxRouterService, isSegueRefActive } from '@dereekb/dbx-core';\nimport { TwoColumnsContextStore } from './two.column.store';\nimport { shareReplay, distinctUntilChanged, type Subscription } from 'rxjs';\nimport { isNot } from '@dereekb/rxjs';\n\n/**\n * Automatically shows the right column when the current route is a child of the configured `backRef`.\n *\n * Works with {@link DbxTwoColumnSrefDirective} to determine when the user has navigated away from\n * the back reference route, and shows the right column accordingly.\n *\n * @example\n * ```html\n * <dbx-two-column [dbxTwoColumnSref]=\"'/items'\" dbxTwoColumnSrefShowRight>\n *   <div left>Item list</div>\n *   <dbx-two-column-right>Item detail (shown on child routes)</dbx-two-column-right>\n * </dbx-two-column>\n * ```\n */\n@Directive({\n  selector: '[dbxTwoColumnSrefShowRight]'\n})\nexport class DbxTwoColumnSrefShowRightDirective {\n  private readonly _twoColumnsContextStore = inject(TwoColumnsContextStore);\n  private readonly _dbxRouterService = inject(DbxRouterService);\n\n  readonly showRight$ = this._twoColumnsContextStore.backRef$.pipe(\n    // Only show right when the backRef is not exactly active\n    isSegueRefActive({ dbxRouterService: this._dbxRouterService, activeExactly: true }),\n    isNot(),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  constructor() {\n    cleanSubscription(this._twoColumnsContextStore.setShowRight(this.showRight$) as Subscription);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxTwoColumnSrefDirective } from './two.column.sref.directive';\nimport { DbxTwoColumnComponent } from './two.column.component';\nimport { DbxTwoColumnColumnHeadDirective } from './two.column.head.directive';\nimport { DbxTwoColumnRightComponent } from './two.column.right.component';\nimport { DbxTwoColumnBackDirective } from './two.column.back.directive';\nimport { DbxTwoColumnFullLeftDirective } from './two.column.full.left.directive';\nimport { DbxTwoColumnContextDirective } from './two.column.context.directive';\nimport { DbxTwoColumnSrefShowRightDirective } from './two.column.sref.showright.directive';\n\nconst importsAndExports = [DbxTwoColumnComponent, DbxTwoColumnRightComponent, DbxTwoColumnColumnHeadDirective, DbxTwoColumnSrefDirective, DbxTwoColumnBackDirective, DbxTwoColumnFullLeftDirective, DbxTwoColumnContextDirective, DbxTwoColumnSrefShowRightDirective];\n\n/**\n * Module that bundles all two-column layout components and directives for convenient importing.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxTwoColumnLayoutModule {}\n","import { computed, Directive, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxThemeColor, dbxThemeColorCssTokenVar } from '../style/style';\n\n/**\n * Border opacity preset values.\n *\n * - `'lite'` — 50% opacity (default)\n * - `'full'` — 100% opacity\n */\nexport type DbxContentBorderOpacity = 'lite' | 'full';\n\n/**\n * Wraps the host element in a themed dashed border with internal padding. The border color\n * can be set to any theme color (defaults to `'default'`). Only the border is colored —\n * text color is not affected.\n *\n * The border opacity defaults to `'lite'` (50%). Set `borderOpacity` to `'full'` for\n * full opacity, or provide a custom percentage string (e.g., `'75%'`).\n *\n * @example\n * ```html\n * <dbx-content-border color=\"primary\">\n *   <p>Lite primary border (default 50% opacity).</p>\n * </dbx-content-border>\n *\n * <dbx-content-border color=\"warn\" borderOpacity=\"full\">\n *   <p>Full opacity warn border.</p>\n * </dbx-content-border>\n *\n * <div dbxContentBorder color=\"accent\" borderOpacity=\"75%\">\n *   <p>Custom 75% opacity accent border.</p>\n * </div>\n * ```\n */\n@Directive({\n  selector: 'dbx-content-border,[dbxContentBorder]',\n  host: {\n    class: 'd-block dbx-content-border',\n    '[style.--dbx-border-color]': 'borderColorVarSignal()',\n    '[style.--dbx-border-opacity]': 'borderOpacityValueSignal()'\n  }\n})\nexport class DbxContentBorderDirective {\n  readonly color = input<DbxThemeColor>('default');\n\n  readonly borderOpacity = input<Maybe<DbxContentBorderOpacity | string>>('lite');\n\n  readonly borderColorVarSignal = computed(() => dbxThemeColorCssTokenVar(this.color(), true));\n\n  readonly borderOpacityValueSignal = computed(() => {\n    const color = this.color();\n    const opacity = this.borderOpacity();\n    let result: string;\n\n    switch (opacity) {\n      case 'full':\n        result = '100%';\n        break;\n      case 'lite':\n      case undefined:\n      case null:\n        result = color === 'default' ? 'inherit' : '50%';\n        break;\n      default:\n        result = opacity;\n        break;\n    }\n\n    return result;\n  });\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Wraps content in a box container with optional elevation (card-like shadow) and wide layout.\n * Both `elevate` and `wide` default to `true`.\n *\n * @dbxWebComponent\n * @dbxWebSlug content-box\n * @dbxWebCategory layout\n * @dbxWebRelated content, content-elevate, content-pit\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div dbxContentBox>Body</div>\n * ```\n *\n * @example\n * ```html\n * <dbx-content-box>\n *   <p>Summary content</p>\n * </dbx-content-box>\n * ```\n */\n@Directive({\n  selector: 'dbx-content-box, [dbxContentBox]',\n  host: {\n    class: 'd-block dbx-content-box',\n    '[class.dbx-content-elevate]': 'elevate()',\n    '[class.dbx-content-box-wide]': 'wide()'\n  }\n})\nexport class DbxContentBoxDirective {\n  readonly elevate = input<boolean>(true);\n  readonly wide = input<boolean>(true);\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Sets the host element to fill the available page height. Use as a wrapper for page-level content blocks.\n *\n * @dbxWebComponent\n * @dbxWebSlug content\n * @dbxWebCategory layout\n * @dbxWebRelated content-container, content-page, content-box\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-content>Body</dbx-content>\n * ```\n *\n * @example\n * ```html\n * <div dbxContent>\n *   <p>Standard content body</p>\n * </div>\n * ```\n */\n@Directive({\n  selector: 'dbx-content,[dbxContent]',\n  host: {\n    class: 'd-block dbx-content'\n  }\n})\nexport class DbxContentDirective {}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Applies elevation (box-shadow) styling to the host element, giving it a raised card appearance.\n * Elevation is enabled by default and can be toggled off.\n *\n * @dbxWebComponent\n * @dbxWebSlug content-elevate\n * @dbxWebCategory layout\n * @dbxWebRelated content-box, content-pit\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-content-elevate>Body</dbx-content-elevate>\n * ```\n *\n * @example\n * ```html\n * <div dbxContentElevate>Highlighted block</div>\n * ```\n */\n@Directive({\n  selector: 'dbx-content-elevate,[dbxContentElevate]',\n  host: {\n    class: 'd-block',\n    '[class.dbx-content-elevate]': 'elevate()'\n  }\n})\nexport class DbxContentElevateDirective {\n  readonly elevate = input<boolean>(true);\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Sets the host element to fill the full page height with page-level content styling.\n * Similar to `DbxContentDirective` but applies the `dbx-content-page` class for page-specific layout.\n *\n * @dbxWebComponent\n * @dbxWebSlug content-page\n * @dbxWebCategory layout\n * @dbxWebRelated content-container, section-page\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-content-page>Page</dbx-content-page>\n * ```\n *\n * @example\n * ```html\n * <div dbxContentPage>\n *   <dbx-section-page header=\"Dashboard\"><p>...</p></dbx-section-page>\n * </div>\n * ```\n */\n@Directive({\n  selector: 'dbx-content-page,[dbxContentPage]',\n  host: {\n    class: 'd-block dbx-content-page'\n  }\n})\nexport class DbxContentPageDirective {}\n","import { computed, Directive, input } from '@angular/core';\nimport { type Pixels, type PixelsString, type Maybe } from '@dereekb/util';\n\n/**\n * Input type for the pit's scrollable behavior. Pass `true` for default medium height,\n * `false` to disable scrolling, or a specific height value.\n */\nexport type DbxContentPitScrollableInput = boolean | DbxContentPitScrollableHeight;\n\n/**\n * Height specification for a scrollable pit. Accepts a pixel number, a CSS pixel string, or a named preset.\n */\nexport type DbxContentPitScrollableHeight = Pixels | PixelsString | DbxContentPitScrollableHeightSetting;\n\n/**\n * Named height presets for a scrollable pit: `'small'` (120px), `'medium'` (320px), or `'large'` (460px).\n */\nexport type DbxContentPitScrollableHeightSetting = 'small' | 'medium' | 'large';\n\n/**\n * Wraps content in a recessed \"pit\" container with optional scrollable overflow and rounded corners.\n * Useful for displaying bounded content areas such as lists or previews with a constrained height.\n *\n * Pits round their corners by default. Pass `[square]=\"true\"` to square the pit — this applies the\n * common `.dbx-corners-none` opt-out utility rather than a pit-specific class.\n *\n * When `[scrollable]` is set the pit frame (padding, background, corners) stays fixed and an inner\n * `.dbx-content-pit-scrollable-content` wrapper does the scrolling — wrap the body in that element so\n * the frame doesn't shift at the scroll extremes. The resolved max height is published as the\n * `--dbx-content-pit-scrollable-max-height` custom property, which the inner wrapper reads.\n *\n * @dbxWebComponent\n * @dbxWebSlug content-pit\n * @dbxWebCategory layout\n * @dbxWebRelated content-box, content-elevate\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-content-pit>Body</dbx-content-pit>\n * ```\n *\n * @example\n * ```html\n * <div dbxContentPit>Inset block</div>\n * ```\n */\n@Directive({\n  selector: 'dbx-content-pit, [dbxContentPit]',\n  host: {\n    class: 'd-block dbx-content-pit',\n    '[class.dbx-content-pit-scrollable]': 'scrollableHeightSignal() != null',\n    '[class.dbx-corners-none]': 'square()',\n    '[style.--dbx-content-pit-scrollable-max-height]': 'scrollableMaxHeightSignal()'\n  }\n})\nexport class DbxContentPitDirective {\n  readonly scrollable = input<Maybe<DbxContentPitScrollableInput>>();\n  readonly square = input<boolean>(false);\n\n  readonly scrollableHeightSignal = computed(() => {\n    let scrollable = this.scrollable();\n    let scrollableHeight: PixelsString | undefined;\n\n    if (typeof scrollable === 'boolean') {\n      scrollable = scrollable ? 'medium' : undefined; // defaults to medium\n    }\n\n    if (scrollable) {\n      if (typeof scrollable === 'string') {\n        switch (scrollable) {\n          case 'small':\n            scrollable = 120;\n            break;\n          case 'medium':\n            scrollable = 320;\n            break;\n          case 'large':\n            scrollable = 460;\n            break;\n          default:\n            scrollableHeight = scrollable; // use as-is\n            break;\n        }\n      }\n\n      if (typeof scrollable === 'number') {\n        scrollableHeight = `${scrollable}px`;\n      }\n    }\n\n    return scrollableHeight ?? null;\n  });\n\n  // The pit always publishes its own scroll cap so the `.dbx-content-pit-scrollable-content`\n  // wrapper reads it directly rather than inheriting the global `--dbx-content-pit-scrollable-max-height`\n  // default (140px) from the theme root. `none` when not scrollable lets the wrapper grow freely.\n  readonly scrollableMaxHeightSignal = computed<PixelsString | 'none'>(() => this.scrollableHeightSignal() ?? 'none');\n}\n","import { DbxContentElevateDirective } from './content.elevate.directive';\nimport { NgModule } from '@angular/core';\nimport { DbxContentDirective } from './content.directive';\nimport { DbxContentBorderDirective } from './content.border.directive';\nimport { DbxContentContainerDirective } from './content.container.directive';\nimport { DbxContentBoxDirective } from './content.box.directive';\nimport { DbxContentPageDirective } from './content.page.directive';\nimport { DbxContentPitDirective } from './content.pit.directive';\n\nconst importsAndExports = [\n  //\n  DbxContentDirective,\n  DbxContentContainerDirective,\n  DbxContentBorderDirective,\n  DbxContentElevateDirective,\n  DbxContentBoxDirective,\n  DbxContentPageDirective,\n  DbxContentPitDirective\n];\n\n/**\n * Bundles all content layout directives including content containers, borders, elevation,\n * boxes, pits, and page-filling directives for convenient import.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxContentLayoutModule {}\n","import { Component, input } from '@angular/core';\nimport { type ThemePalette } from '@angular/material/core';\nimport { MatToolbarModule } from '@angular/material/toolbar';\n\n/**\n * A themed toolbar banner that wraps projected content, typically placed at the top of a page to highlight status or actions.\n *\n * @example\n * ```html\n * <dbx-flag color=\"warn\">\n *   <span>Important notice</span>\n * </dbx-flag>\n * ```\n */\n@Component({\n  selector: 'dbx-flag',\n  template: `\n    <div class=\"dbx-flag\">\n      <mat-toolbar [color]=\"color()\">\n        <ng-content></ng-content>\n      </mat-toolbar>\n    </div>\n  `,\n  imports: [MatToolbarModule]\n})\nexport class DbxFlagComponent {\n  readonly color = input<ThemePalette>('accent');\n}\n","import { Component, input } from '@angular/core';\nimport { type ThemePalette } from '@angular/material/core';\nimport { DbxFlagComponent } from './flag.component';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * A themed banner with a text prompt and a slot for action content (e.g., buttons).\n *\n * Built on {@link DbxFlagComponent}, this is convenient for call-to-action banners.\n *\n * @example\n * ```html\n * <dbx-flag-prompt text=\"Complete your profile\" color=\"accent\">\n *   <button mat-button>Go</button>\n * </dbx-flag-prompt>\n * ```\n */\n@Component({\n  selector: 'dbx-flag-prompt',\n  template: `\n    <dbx-flag [color]=\"color()\">\n      <span class=\"dbx-flag-prompt\">{{ text() }}</span>\n      <span class=\"dbx-flag-spacer\"></span>\n      <ng-content></ng-content>\n    </dbx-flag>\n  `,\n  imports: [DbxFlagComponent]\n})\nexport class DbxFlagPromptComponent {\n  readonly color = input<ThemePalette>('accent');\n  readonly text = input<Maybe<string>>();\n}\n","import { NgModule } from '@angular/core';\nimport { DbxFlagComponent } from './flag.component';\nimport { DbxFlagPromptComponent } from './flag.prompt.component';\n\nconst importsAndExports = [DbxFlagComponent, DbxFlagPromptComponent];\n\n/**\n * Angular module that bundles {@link DbxFlagComponent} and {@link DbxFlagPromptComponent}.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxFlagLayoutModule {}\n","import { type ScreenMediaWidthType } from '../../screen/screen';\nimport { DbxScreenMediaService } from '../../screen/screen.service';\nimport { Directive, inject, input } from '@angular/core';\nimport { map, distinctUntilChanged, shareReplay } from 'rxjs';\n\nimport { type Maybe } from '@dereekb/util';\nimport { toSignal, toObservable } from '@angular/core/rxjs-interop';\n\n/**\n * Creates a flex group container that arranges child elements in a responsive row layout.\n *\n * On small screens (below the configured breakpoint), the group applies a small-screen CSS class\n * that can be used to adjust styling. When `breakToColumn` is enabled, items will stack vertically\n * on small screens.\n *\n * @dbxWebComponent\n * @dbxWebSlug flex-group\n * @dbxWebCategory layout\n * @dbxWebRelated flex-size, bar\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div dbxFlexGroup><div dbxFlexSize=\"1\">A</div></div>\n * ```\n *\n * @example\n * ```html\n * <div dbxFlexGroup breakpoint=\"sm\">\n *   <div dbxFlexSize=\"2\">Wide</div>\n *   <div dbxFlexSize=\"1\">Narrow</div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxFlexGroup]',\n  host: {\n    '[class.dbx-flex-group]': 'content()',\n    '[class.dbx-flex-group-break-to-column]': 'breakToColumn()',\n    '[class.dbx-flex-group-relative]': 'relative()',\n    '[class.dbx-flex-group-small]': 'smallSignal()'\n  }\n})\nexport class DbxFlexGroupDirective {\n  private readonly _dbxScreenMediaService = inject(DbxScreenMediaService);\n\n  /**\n   * Whether to apply the flex group content styling. Defaults to `true`.\n   */\n  readonly content = input<boolean>(true);\n\n  /**\n   * Whether child items should break to a column layout on small screens.\n   */\n  readonly breakToColumn = input<boolean>(false);\n\n  /**\n   * Whether the flex group should use relative positioning.\n   */\n  readonly relative = input<boolean>(false);\n\n  /**\n   * Screen width breakpoint below which the group is considered \"small\". Defaults to `'tablet'`.\n   */\n  readonly breakpoint = input<ScreenMediaWidthType, Maybe<ScreenMediaWidthType>>('tablet', { transform: (x) => x ?? 'tablet' });\n\n  readonly isSmallScreen$ = this._dbxScreenMediaService.isBreakpointActive(toObservable(this.breakpoint)).pipe(\n    map((x) => !x),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly smallSignal = toSignal(this.isSmallScreen$, { initialValue: false });\n}\n","import { Directive, input, computed } from '@angular/core';\nimport { type DbxFlexSize } from './flex';\n\n/**\n * Applies a `dbx-flex-{size}` CSS class to the host element based on the given {@link DbxFlexSize} value.\n * Use within a {@link DbxFlexGroupDirective} to control how much row width this element occupies.\n *\n * @dbxWebComponent\n * @dbxWebSlug flex-size\n * @dbxWebCategory layout\n * @dbxWebRelated flex-group\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div dbxFlexSize=\"1\"></div>\n * ```\n *\n * @example\n * ```html\n * <div dbxFlexGroup>\n *   <div dbxFlexSize=\"2\">Twice as wide</div>\n *   <div dbxFlexSize=\"1\">Narrow</div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxFlexSize]',\n  host: {\n    '[class]': 'cssClassSignal()'\n  }\n})\nexport class DbxFlexSizeDirective {\n  /**\n   * The flex size to apply, from 1 (1/6 width) to 6 (full width).\n   */\n  readonly dbxFlexSize = input.required<DbxFlexSize>();\n  readonly cssClassSignal = computed(() => `dbx-flex-${this.dbxFlexSize()}`);\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { MatIconModule } from '@angular/material/icon';\n\n/**\n * Displays an icon on the left with a header and projected content on the right.\n *\n * Useful for building descriptive list items or info rows where each entry is identified by a Material icon.\n *\n * @example\n * ```html\n * <dbx-icon-item [icon]=\"'email'\" [header]=\"'Contact'\">\n *   <a href=\"mailto:hello@example.com\">hello@example.com</a>\n * </dbx-icon-item>\n * ```\n */\n@Component({\n  selector: 'dbx-icon-item',\n  template: `\n    <div class=\"dbx-icon-item\">\n      @if (icon()) {\n        <div class=\"left\">\n          <mat-icon>{{ icon() }}</mat-icon>\n        </div>\n      }\n      <div class=\"right\">\n        @if (header()) {\n          <h3 class=\"dbx-icon-item-header\">{{ header() }}</h3>\n        }\n        <div class=\"right-content\">\n          <ng-content></ng-content>\n        </div>\n      </div>\n    </div>\n  `,\n  imports: [MatIconModule]\n})\nexport class DbxIconItemComponent {\n  readonly icon = input<Maybe<string>>();\n  readonly header = input<Maybe<string>>();\n}\n","import { type Observable } from 'rxjs';\nimport { type ListLoadingState, type ListLoadingStateContext } from '@dereekb/rxjs';\nimport { forwardRef, type OutputEmitterRef, type Provider, type TrackByFunction, type Type } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Determines how list items behave when interacted with. In 'select' mode, items can be selected/deselected.\n * In 'view' mode, items are simply clickable for navigation or viewing.\n */\nexport type DbxListSelectionMode = 'select' | 'view';\n\n/**\n * Represents the selection state of a single list item, including whether it is disabled or selected.\n */\nexport interface ListSelectionStateItem<T> {\n  readonly disabled?: boolean;\n  readonly selected?: boolean;\n  readonly itemValue: T;\n}\n\n/**\n * Represents the aggregate selection state of all items in a list, emitted when selection changes occur.\n */\nexport interface ListSelectionState<T> {\n  readonly items: ListSelectionStateItem<T>[];\n}\n\n/**\n * Interface for a view that renders the items of a DbxList.\n */\nexport abstract class DbxListView<T, S extends ListLoadingState<T> = ListLoadingState<T>> {\n  /**\n   * Current disabled state.\n   */\n  abstract readonly disabled$: Observable<boolean>;\n  /**\n   * (Optional) current selection mode.\n   */\n  abstract readonly selectionMode$?: Observable<Maybe<DbxListSelectionMode>>;\n  /**\n   * Values of the list view.\n   */\n  abstract readonly values$: Observable<T[]>;\n  /**\n   * Track by configuration.\n   */\n  abstract readonly trackBy$?: Observable<Maybe<TrackByFunction<T>>>;\n  /**\n   * (Optional) clicked event emitter.\n   *\n   * If available, the DbxList will subscribe to it automatically.\n   */\n  abstract clickValue?: OutputEmitterRef<T>;\n  /**\n   * (Optional) selection changed event emitter.\n   *\n   * If available, the DbxList will subscribe to it automatically.\n   */\n  abstract selectionChange?: OutputEmitterRef<ListSelectionState<T>>;\n  /**\n   * Sets the models input loading state context for the view to render from.\n   */\n  abstract setListContext(state: ListLoadingStateContext<T, S>): void;\n  /**\n   * Sets the disabled state of the list view.\n   */\n  abstract setDisabled(disabled: boolean): void;\n  /**\n   * Sets the selection mode of the list view.\n   */\n  abstract setSelectionMode(selectionMode: Maybe<DbxListSelectionMode>): void;\n}\n\n/**\n * Registers a component as a {@link DbxListView} provider so it can be injected by parent list components.\n *\n * @param sourceType - The component class to register as the DbxListView provider.\n * @returns Array of Angular providers that wire up the component as a DbxListView.\n *\n * @Component ({\n *   providers: provideDbxListView(MyCustomListViewComponent)\n * })\n * export class MyCustomListViewComponent extends DbxListView<MyItem> { ... }\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxListView<V extends DbxListView<any>>(sourceType: Type<V>): Provider[] {\n  // use of any here is allowed as typings are not relevant for providers\n  return [\n    {\n      provide: DbxListView,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n","import { forwardRef, InjectionToken, type Provider, type StaticProvider, type Type } from '@angular/core';\nimport { type ClickableAnchor, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { map, type Observable } from 'rxjs';\nimport { type Configurable, type DecisionFunction, type Maybe, type ModelKeyRef, type UniqueModel } from '@dereekb/util';\nimport { type DbxValueListViewSeparatorConfig } from './list.view.value.separator';\n\n/**\n * Injection token that provides the current {@link DbxValueListItem} to dynamically injected item components.\n */\nexport const DBX_VALUE_LIST_VIEW_ITEM = new InjectionToken<unknown>('DbxValueListViewItem');\n\n/**\n * Describes a single item within a value-based list view, including its value, display options, and interaction state.\n */\nexport interface DbxValueListItem<T, M = unknown> {\n  /**\n   * The underlying value for this list item.\n   *\n   * The default trackBy function checks this value for a `key` ({@link ModelKeyRef}) or `id` ({@link UniqueModel})\n   * property to use as a stable tracking identity. To override this behavior, set {@link DbxValueListItem.key} explicitly\n   * or provide a custom trackBy via the list view directive.\n   */\n  itemValue: T;\n  /**\n   * Stable key for tracking this item across data updates.\n   *\n   * The default trackBy function uses this instead of the item's index\n   * or the `itemValue`'s `key`, preventing unnecessary component recreation when\n   * the list re-renders.\n   */\n  key: string;\n  /**\n   * Arbitrary meta details available to the meta component.\n   */\n  meta?: M;\n  /**\n   * Optional icon to display for the item.\n   */\n  icon?: string;\n  /**\n   * Whether the item is disabled.\n   */\n  disabled?: boolean;\n  /**\n   * Whether the ripple effect is disabled.\n   */\n  rippleDisabled?: boolean;\n  /**\n   * Whether the item is selected.\n   */\n  selected?: boolean;\n  /**\n   * Optional anchor for the item.\n   */\n  anchor?: Maybe<ClickableAnchor>;\n}\n\n/**\n * A decision function that operates on a {@link DbxValueListItem}, used to determine item-level behavior such as selection or ripple state.\n */\nexport type DbxValueListItemDecisionFunction<T> = DecisionFunction<DbxValueListItem<T>>;\n\n/**\n * Convenience function for mapping a DecisionFunction for a value to a DecisionFunction for a DbxValueListItem with the same value type.\n *\n * @param decisionFunction\n * @returns\n * @__NO_SIDE_EFFECTS__\n */\nexport function dbxValueListItemDecisionFunction<T>(decisionFunction: DecisionFunction<T>): DbxValueListItemDecisionFunction<T> {\n  return (item) => decisionFunction(item.itemValue);\n}\n\n/**\n * Utility type for values that embed {@link DbxValueListItem} properties directly, avoiding the extra `itemValue` wrapper.\n */\n/**\n * Utility type for values that embed {@link DbxValueListItem} properties directly, avoiding the extra `itemValue` wrapper.\n *\n * The `key` property is optional here because it is typically added during the `mapValuesToItemValues` step\n * rather than being present on the raw value.\n */\nexport type DbxValueAsListItem<T> = T & Omit<DbxValueListItem<DbxValueListItem<T>>, 'itemValue' | 'key'> & { key?: string };\n\n/**\n * Base configuration for a value list view, defining the component to render each item and a mapping function for transforming raw values into list items.\n */\nexport interface AbstractDbxValueListViewConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> extends DbxInjectionComponentConfig<V> {\n  mapValuesToItemValues(values: T[]): Observable<I[]>;\n  /**\n   * @see DbxListViewMetaIconComponent.metaConfig()\n   */\n  readonly metaConfig?: DbxInjectionComponentConfig<any>;\n  /**\n   * (Optional) Separator component injected between two neighbouring items when its `showSeparator` function returns\n   * true. Separators are evaluated within each group, in display order.\n   *\n   * Rendered by the list, selection list, and accordion views. The grid view ignores it.\n   *\n   * @see DbxValueListViewSeparatorConfig\n   */\n  readonly separatorConfig?: Maybe<DbxValueListViewSeparatorConfig<T, I>>;\n  /**\n   * Whether group headers should stick to the top of the scroll container.\n   *\n   * Defaults to `true` for list, selection list, and grid views, `false` for accordion views.\n   */\n  readonly stickyHeaders?: boolean;\n}\n\n/**\n * Extracts a stable tracking key from an item value by checking for `key` ({@link ModelKeyRef}),\n * `id` ({@link UniqueModel}), or falling back to a prefixed index string.\n *\n * @param itemValue - The raw value to extract a key from.\n * @param index - The item's position index, used as fallback.\n * @returns Key for tracking the item. (string)\n *\n * @example\n * ```ts\n * const key = dbxValueListItemKeyForItemValue({ key: 'abc' }, 0); // 'abc'\n * const key2 = dbxValueListItemKeyForItemValue({ id: '123' }, 0); // '123'\n * const key3 = dbxValueListItemKeyForItemValue({}, 5); // '__i_5'\n * ```\n */\nexport function dbxValueListItemKeyForItemValue(itemValue: unknown, index: number): string {\n  return (itemValue as Partial<ModelKeyRef>)?.key ?? (itemValue as Partial<UniqueModel>)?.id ?? `__i_${index}`;\n}\n\n/**\n * A {@link DbxValueListItem} combined with its injection component configuration, ready for rendering by the list view.\n */\nexport type DbxValueListItemConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> = I & {\n  config: DbxInjectionComponentConfig<V>;\n  metaConfig?: DbxInjectionComponentConfig<any>;\n};\n\n/**\n * Maps raw values into an observable of {@link DbxValueListItemConfig} items, applying the list view config's mapping function and attaching injection configuration.\n *\n * @param listViewConfig - The list view configuration containing the component and optional mapping function.\n * @param itemValues - The raw values to map into configured list items.\n * @returns An observable emitting the mapped and configured list item configs.\n *\n * @example\n * ```ts\n * const items$ = mapValuesToValuesListItemConfigObs(listViewConfig, rawValues);\n * ```\n */\nexport function mapValuesToValuesListItemConfigObs<T, I extends DbxValueListItem<T>, V = unknown>(listViewConfig: AbstractDbxValueListViewConfig<T, I, V>, itemValues: T[]): Observable<DbxValueListItemConfig<T, I, V>[]> {\n  return listViewConfig.mapValuesToItemValues(itemValues).pipe(\n    map((listItems: I[]) => {\n      const listItemConfigs: DbxValueListItemConfig<T, I, V>[] = addConfigToValueListItems<T, I, V>(listViewConfig, listItems);\n      return listItemConfigs;\n    })\n  );\n}\n\n/**\n * Adds injection component configuration and meta configuration to each list item, producing fully configured {@link DbxValueListItemConfig} entries ready for rendering.\n *\n * @param listViewConfig - The list view configuration providing injection component config and optional meta config.\n * @param listItems - The list items to augment with configuration.\n * @returns The list items extended with injection component configuration attached.\n */\nexport function addConfigToValueListItems<T, I extends DbxValueListItem<T>, V = unknown>(listViewConfig: Omit<AbstractDbxValueListViewConfig<T, I, V>, 'mapValuesToItemValues'>, listItems: I[]): DbxValueListItemConfig<T, I, V>[] {\n  const itemConfigs: DbxValueListItemConfig<T, I, V>[] = listItems.map((listItem: I) => {\n    const anchor = listItem.anchor;\n\n    (listItem as Configurable<DbxValueListItem<T>>).disabled = listItem.disabled || anchor?.disabled;\n    (listItem as DbxValueListItemConfig<T, I, V>).config = Object.assign({}, listViewConfig, {\n      providers: [\n        {\n          provide: DBX_VALUE_LIST_VIEW_ITEM,\n          useValue: listItem\n        },\n        ...(listViewConfig.providers ?? [])\n      ] as StaticProvider[]\n    });\n\n    // only attach meta config if it is configured\n    if (listViewConfig.metaConfig) {\n      (listItem as DbxValueListItemConfig<T, I, V>).metaConfig = Object.assign({}, listViewConfig.metaConfig, {\n        providers: [\n          {\n            provide: DBX_VALUE_LIST_VIEW_ITEM,\n            useValue: listItem\n          },\n          ...(listViewConfig.metaConfig?.providers ?? [])\n        ] as StaticProvider[]\n      });\n    }\n\n    return listItem as DbxValueListItemConfig<T, I, V>;\n  });\n\n  return itemConfigs;\n}\n\n// MARK: ValueListView\n/**\n * Abstract class representing a view that provides a stream of value list items. Used as an injection token\n * so parent components can access the current list items.\n */\nexport abstract class DbxValueListView<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  abstract readonly items$: Observable<I[]>;\n}\n\n/**\n * Registers a component as a {@link DbxValueListView} provider for dependency injection.\n *\n * @param sourceType - The component class type to register as the list view provider.\n * @returns Array of Angular providers that bind the given component to {@link DbxValueListView}\n *\n * @Component ({\n *   providers: provideDbxValueListView(MyValueListViewComponent)\n * })\n * export class MyValueListViewComponent extends DbxValueListView<MyItem> { ... }\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxValueListView<V extends DbxValueListView<unknown>>(sourceType: Type<V>): Provider[] {\n  return [\n    {\n      provide: DbxValueListView,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n","import { type Maybe, maybeModifierMapToFunction, type ModifierFunction } from '@dereekb/util';\nimport { Directive, inject, input } from '@angular/core';\nimport { filterMaybe, mapForEach } from '@dereekb/rxjs';\nimport { distinctUntilChanged, shareReplay, combineLatest, switchMap, map, type Observable, of } from 'rxjs';\nimport { DbxListView } from './list.view';\nimport { type AbstractDbxValueListViewConfig, type DbxValueListItem, type DbxValueListItemConfig, type DbxValueListView, mapValuesToValuesListItemConfigObs } from './list.view.value';\nimport { DbxValueListItemModifier } from './list.view.value.modifier';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\n\n/**\n * Abstract directive that transforms raw list values into configured {@link DbxValueListItemConfig} items, applying any active modifiers.\n * Requires a parent {@link DbxListView} and optionally uses a {@link DbxValueListItemModifier} to modify items before rendering.\n */\n@Directive()\nexport abstract class AbstractDbxValueListViewDirective<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown, C extends AbstractDbxValueListViewConfig<T, I, V> = AbstractDbxValueListViewConfig<T, I, V>> implements DbxValueListView<T, I> {\n  readonly dbxListView = inject(DbxListView<T>);\n  readonly dbxValueListViewModifier = inject(DbxValueListItemModifier<T, I>, { optional: true });\n\n  readonly config = input.required<C>();\n\n  readonly config$ = toObservable(this.config).pipe(filterMaybe(), distinctUntilChanged(), shareReplay(1));\n  readonly modifyFn$: Observable<Maybe<ModifierFunction<I>>> = this.dbxValueListViewModifier ? this.dbxValueListViewModifier.modifiers$.pipe(map(maybeModifierMapToFunction)) : of(undefined);\n\n  readonly items$: Observable<DbxValueListItemConfig<T, I>[]> = combineLatest([this.config$, this.dbxListView.values$, this.modifyFn$]).pipe(\n    switchMap(([listViewConfig, values, modifyFn]) => mapValuesToValuesListItemConfigObs<T, I, V>(listViewConfig, values).pipe(mapForEach(modifyFn)) as Observable<DbxValueListItemConfig<T, I>[]>),\n    shareReplay(1)\n  );\n\n  readonly itemsSignal = toSignal(this.items$);\n\n  onClickValue(value: T) {\n    this.dbxListView.clickValue?.emit(value);\n  }\n}\n","import { InjectionToken, type StaticProvider } from '@angular/core';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxValueListItem } from './list.view.value';\n\n/**\n * Injection token that provides the {@link DbxValueListItemSeparatorContext} to a separator component injected by a\n * {@link DbxValueListViewSeparatorConfig}.\n */\nexport const DBX_VALUE_LIST_VIEW_ITEM_SEPARATOR = new InjectionToken<DbxValueListItemSeparatorContext<unknown>>('DbxValueListViewItemSeparator');\n\n/**\n * Decides whether a separator is rendered between two neighbouring list items.\n *\n * Called for every adjacent pair within a group, plus once before the group's first item (`previous` is undefined)\n * and once after its last item (`next` is undefined), so a separator can also lead or trail a group. Return `false`\n * when either side is missing to only separate items from each other.\n */\nexport type DbxValueListItemSeparatorDecisionFunction<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> = (previous: Maybe<I>, next: Maybe<I>) => boolean;\n\n/**\n * Configures a separator component that a value list view injects between two neighbouring items when\n * {@link showSeparator} returns true.\n *\n * The injection config fields (`componentClass`, `providers`, `init`, …) describe the separator component. The\n * component can inject {@link DBX_VALUE_LIST_VIEW_ITEM_SEPARATOR} to read the items it sits between.\n *\n * @example\n * ```ts\n * const separatorConfig: DbxValueListViewSeparatorConfig<Day> = {\n *   componentClass: DayGapComponent,\n *   showSeparator: dbxValueListItemSeparatorDecisionFunction((previous, next) => previous != null && next != null && !isNextDay(previous, next))\n * };\n * ```\n */\nexport interface DbxValueListViewSeparatorConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, S = unknown> extends DbxInjectionComponentConfig<S> {\n  /**\n   * Whether to render the separator between the two items.\n   */\n  readonly showSeparator: DbxValueListItemSeparatorDecisionFunction<T, I>;\n}\n\n/**\n * The two neighbouring items a separator is rendered between.\n */\nexport interface DbxValueListItemSeparatorContext<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  /**\n   * The item before the separator. Undefined for a separator that leads a group.\n   */\n  readonly previous: Maybe<I>;\n  /**\n   * The item after the separator. Undefined for a separator that trails a group.\n   */\n  readonly next: Maybe<I>;\n}\n\n/**\n * Convenience function for mapping a decision function for two item values to a {@link DbxValueListItemSeparatorDecisionFunction}.\n *\n * @param decisionFunction - Decides whether to separate the two item values. Each value is undefined when that side has no item.\n * @returns A separator decision function that operates on the list items.\n *\n * @example\n * ```ts\n * const showSeparator = dbxValueListItemSeparatorDecisionFunction<Day>((previous, next) => previous != null && next != null && !isNextDay(previous, next));\n * ```\n */\nexport function dbxValueListItemSeparatorDecisionFunction<T>(decisionFunction: (previous: Maybe<T>, next: Maybe<T>) => boolean): DbxValueListItemSeparatorDecisionFunction<T> {\n  return (previous, next) => decisionFunction(previous?.itemValue, next?.itemValue);\n}\n\n/**\n * Computes the separators to render around a run of rendered list items.\n *\n * The result has `items.length + 1` entries: entry `i` is the separator rendered before `items[i]`, and the last entry\n * is the separator rendered after the last item. An entry is undefined where no separator is shown. Each separator\n * config is the input config without `showSeparator`, with a {@link DBX_VALUE_LIST_VIEW_ITEM_SEPARATOR} provider added\n * ahead of the config's own providers.\n *\n * Each call returns configs with a fresh `init` wrapper (which still calls the input config's `init`).\n * `dbx-injection` ignores `providers` when comparing configs, so without it a reused separator would keep the neighbour\n * items it was created with; the new `init` makes the separator re-create with its current neighbours.\n *\n * @param items - The rendered items, in display order.\n * @param separatorConfig - The separator configuration. When not provided, no separators are rendered.\n * @returns The separator injection configs for each position around the items.\n *\n * @example\n * ```ts\n * const separators = dbxValueListItemSeparatorConfigs(items, separatorConfig);\n * // separators[0] leads the first item, separators[items.length] trails the last item.\n * ```\n */\nexport function dbxValueListItemSeparatorConfigs<T, I extends DbxValueListItem<T> = DbxValueListItem<T>>(items: I[], separatorConfig: Maybe<DbxValueListViewSeparatorConfig<T, I>>): Maybe<DbxInjectionComponentConfig>[] {\n  let result: Maybe<DbxInjectionComponentConfig>[];\n\n  if (separatorConfig == null) {\n    result = [];\n  } else {\n    const { showSeparator, init, ...injectionConfig } = separatorConfig;\n    result = [];\n\n    for (let i = 0; i <= items.length; i += 1) {\n      const previous = items[i - 1] as Maybe<I>;\n      const next = items[i] as Maybe<I>;\n      let separator: Maybe<DbxInjectionComponentConfig>;\n\n      if (showSeparator(previous, next)) {\n        const context: DbxValueListItemSeparatorContext<T, I> = { previous, next };\n        const providers: StaticProvider[] = [{ provide: DBX_VALUE_LIST_VIEW_ITEM_SEPARATOR, useValue: context }, ...(injectionConfig.providers ?? [])];\n        separator = { ...injectionConfig, providers, init: (instance: unknown) => init?.(instance) } as DbxInjectionComponentConfig;\n      }\n\n      result.push(separator);\n    }\n  }\n\n  return result;\n}\n","import { type CssClassesArray, type Maybe, type UniqueModel } from '@dereekb/util';\nimport { type DbxValueListItem, type DbxValueListItemConfig } from '../list.view.value';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type Provider, type Type, forwardRef } from '@angular/core';\nimport { type ObservableOrValue } from '@dereekb/rxjs';\n\n/**\n * A group of DbxValueListItem values, grouped by common data, name, and id.\n */\nexport interface DbxValueListItemGroup<G, T, I extends DbxValueListItem<T>, H = unknown, F = unknown> extends Omit<DbxValueListItem<unknown>, 'itemValue' | 'icon' | 'key'>, Readonly<Required<UniqueModel>> {\n  readonly data: G;\n  readonly items: DbxValueListItemConfig<T, I>[];\n  /**\n   * (Optional) View configuration for the group's header.\n   */\n  readonly headerConfig?: Maybe<DbxInjectionComponentConfig<H>>;\n  /**\n   * (Optional) View configuration for the group's header.\n   */\n  readonly footerConfig?: Maybe<DbxInjectionComponentConfig<F>>;\n  /**\n   * Whether or not to show the group's items. Defaults to true.\n   */\n  readonly showGroupItems?: boolean;\n  /**\n   * Custom CSS classes to apply to all groups.\n   */\n  readonly cssClasses?: CssClassesArray;\n}\n\n/**\n * Function type that partitions a flat list of configured items into an array of {@link DbxValueListItemGroup} values.\n */\nexport type DbxValueListViewGroupValuesFunction<G, T, I extends DbxValueListItem<T>, H = unknown, F = unknown> = (items: DbxValueListItemConfig<T, I>[]) => ObservableOrValue<DbxValueListItemGroup<G, T, I, H, F>[]>;\n\n/**\n * Default grouping function that places all items into a single unnamed group.\n *\n * @param items - The flat list of configured list items to group.\n * @returns An array containing a single group with all input items.\n */\nexport const defaultDbxValueListViewGroupValuesFunction = <T, I extends DbxValueListItem<T>>(items: DbxValueListItemConfig<T, I>[]) => {\n  const data = {};\n  const result: DbxValueListItemGroup<unknown, T, I> = {\n    id: '_',\n    data,\n    items\n  };\n\n  return [result];\n};\n\n/**\n * Abstract delegate responsible for grouping list items into {@link DbxValueListItemGroup} instances.\n * Provide a custom implementation to control how items are organized into visual groups.\n */\nexport abstract class DbxValueListViewGroupDelegate<G, T, I extends DbxValueListItem<T> = DbxValueListItem<T>, H = unknown, F = unknown> {\n  /**\n   * Groups all input items into groups.\n   */\n  abstract readonly groupValues: DbxValueListViewGroupValuesFunction<G, T, I, H, F>;\n}\n\n/**\n * Creates a default {@link DbxValueListViewGroupDelegate} that places all items into a single ungrouped list.\n *\n * @returns A group delegate that places all items into one unnamed group.\n *\n * @example\n * ```ts\n * const delegate = defaultDbxValueListViewGroupDelegate<MyItem>();\n * ```\n */\nexport function defaultDbxValueListViewGroupDelegate<T, I extends DbxValueListItem<T>>(): DbxValueListViewGroupDelegate<unknown, T, I> {\n  return {\n    groupValues: defaultDbxValueListViewGroupValuesFunction\n  };\n}\n\n/**\n * Registers a class as a {@link DbxValueListViewGroupDelegate} provider for dependency injection.\n *\n * @param sourceType - The class type to register as the group delegate provider.\n * @returns Array of Angular providers that bind the given class to {@link DbxValueListViewGroupDelegate}\n *\n * @Directive ({\n *   providers: provideDbxValueListViewGroupDelegate(MyGroupDelegate)\n * })\n * export class MyGroupDelegate extends DbxValueListViewGroupDelegate<MyGroup, MyItem> { ... }\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxValueListViewGroupDelegate<D extends DbxValueListViewGroupDelegate<any, any, any, any>>(sourceType: Type<D>): Provider[] {\n  // use of any here is allowed as typings are not relevant for providers\n  return [\n    {\n      provide: DbxValueListViewGroupDelegate,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n","import { toSignal, toObservable } from '@angular/core/rxjs-interop';\nimport { Component, type Signal, type TrackByFunction, computed, inject, input } from '@angular/core';\nimport { shareReplay, map, type Observable, switchMap, of } from 'rxjs';\nimport { type DbxValueListItem, type AbstractDbxValueListViewConfig, type DbxValueListItemConfig } from './list.view.value';\nimport { AbstractDbxValueListViewDirective } from './list.view.value.directive';\nimport { DbxInjectionComponent, anchorTypeForAnchor } from '@dereekb/dbx-core';\nimport { type DbxValueListViewSeparatorConfig, dbxValueListItemSeparatorConfigs } from './list.view.value.separator';\nimport { DbxListView } from './list.view';\nimport { type Maybe, spaceSeparatedCssClasses } from '@dereekb/util';\nimport { type DbxValueListItemGroup, DbxValueListViewGroupDelegate, defaultDbxValueListViewGroupDelegate } from './group/list.view.value.group';\nimport { asObservable } from '@dereekb/rxjs';\nimport { MatListModule, MatNavList } from '@angular/material/list';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxAnchorComponent } from '../../router/layout/anchor/anchor.component';\n\n/**\n * Configuration for a {@link DbxValueListViewComponent}. Extends the base config with an option to emit click events for all items, including those with anchors.\n */\nexport interface DbxValueListViewConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> extends AbstractDbxValueListViewConfig<T, I, V> {\n  /**\n   * When true, emits click events for all items regardless of whether they have anchors.\n   */\n  readonly emitAllClicks?: boolean;\n  /**\n   * @see AbstractDbxValueListViewConfig.stickyHeaders\n   */\n  readonly stickyHeaders?: boolean;\n}\n\n/**\n * Renders a single group of list items within a {@link DbxValueListViewContentComponent}. Displays an optional header,\n * a list of items using `mat-list-item`, and an optional footer. When the content component has a separator config,\n * separators are injected between (and around) the group's items wherever its `showSeparator` function returns true.\n *\n * @example\n * ```html\n * <dbx-list-view-content-group [group]=\"group\"></dbx-list-view-content-group>\n * ```\n */\n@Component({\n  selector: 'dbx-list-view-content-group',\n  template: `\n    <div class=\"dbx-list-view-group-content\">\n      @if (headerConfigSignal()) {\n        <div class=\"dbx-list-view-group-header\">\n          <dbx-injection [config]=\"headerConfigSignal()\"></dbx-injection>\n        </div>\n      }\n      @for (item of itemsSignal(); track trackByFunctionSignal()($index, item)) {\n        @if (separatorsSignal()[$index]; as separator) {\n          <div class=\"dbx-list-view-item-separator\">\n            <dbx-injection [config]=\"separator\"></dbx-injection>\n          </div>\n        }\n        <dbx-anchor [anchor]=\"item.anchor\" [disabled]=\"item.disabled\">\n          <a mat-list-item class=\"dbx-list-view-item\" [disabled]=\"item.disabled\" [disableRipple]=\"rippleDisabledOnItem(item)\" (click)=\"onClickItem(item)\" (keydown.enter)=\"onClickItem(item)\">\n            @if (item.icon) {\n              <mat-icon matListItemIcon>{{ item.icon }}</mat-icon>\n            }\n            <dbx-injection [config]=\"item.config\"></dbx-injection>\n            @if (item.metaConfig) {\n              <span matListItemMeta>\n                <dbx-injection [config]=\"item.metaConfig\"></dbx-injection>\n              </span>\n            }\n          </a>\n        </dbx-anchor>\n      }\n      @if (trailingSeparatorSignal(); as trailingSeparator) {\n        <div class=\"dbx-list-view-item-separator\">\n          <dbx-injection [config]=\"trailingSeparator\"></dbx-injection>\n        </div>\n      }\n      @if (footerConfigSignal()) {\n        <div class=\"dbx-list-view-group-footer\">\n          <dbx-injection [config]=\"footerConfigSignal()\"></dbx-injection>\n        </div>\n      }\n    </div>\n  `,\n  host: {\n    class: 'dbx-list-view-group',\n    '[class]': 'cssClassSignal()'\n  },\n  imports: [DbxInjectionComponent, DbxAnchorComponent, MatListModule, MatIconModule]\n})\nexport class DbxValueListViewContentGroupComponent<G, T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  readonly dbxValueListViewContentComponent = inject(DbxValueListViewContentComponent<T>);\n  readonly group = input<Maybe<DbxValueListItemGroup<G, T, I>>>();\n\n  readonly trackByFunctionSignal = toSignal(this.dbxValueListViewContentComponent.trackBy$, { initialValue: DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION });\n\n  readonly itemsSignal = computed(() => this.group()?.items ?? []);\n  readonly separatorsSignal = computed(() => dbxValueListItemSeparatorConfigs<T, I>(this.itemsSignal(), this.dbxValueListViewContentComponent.separatorConfig()));\n  readonly trailingSeparatorSignal = computed(() => this.separatorsSignal()[this.itemsSignal().length]);\n  readonly headerConfigSignal = computed(() => this.group()?.headerConfig);\n  readonly footerConfigSignal = computed(() => this.group()?.footerConfig);\n  readonly cssClassSignal = computed(() => spaceSeparatedCssClasses(this.group()?.cssClasses));\n\n  onClickItem(item: I) {\n    this.dbxValueListViewContentComponent.onClickItem(item);\n  }\n\n  onClickValue(value: T) {\n    this.dbxValueListViewContentComponent.onClickValue(value);\n  }\n\n  rippleDisabledOnItem(item: I): boolean {\n    return this.dbxValueListViewContentComponent.rippleDisabledOnItem(item);\n  }\n}\n\n// MARK: DbxValueListViewContentComponent\n/**\n * Default track-by function for list view content components.\n *\n * Uses the item's {@link DbxValueListItem.key} when available for stable identity across\n * data updates, falling back to a prefixed index string to avoid collisions with key values.\n *\n * @param index - The item's position index in the list.\n * @param item - The list item whose identity key is resolved.\n * @returns The item's key, itemValue key/id, or a prefixed index string as a fallback.\n */\nexport const DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION: TrackByFunction<DbxValueListItem<unknown>> = (index: number, item: DbxValueListItem<unknown>) => item.key;\n\n/**\n * Renders a Material nav list of grouped value list items. Can be used directly when items are pre-configured,\n * or as part of the standard list rendering pipeline via {@link DbxValueListViewComponent}.\n *\n * @example\n * ```html\n * <dbx-list-view-content [items]=\"configuredItems\" [emitAllClicks]=\"true\"></dbx-list-view-content>\n * ```\n */\n@Component({\n  selector: 'dbx-list-view-content',\n  template: `\n    <mat-nav-list [disabled]=\"disabledSignal()\">\n      @for (group of groupsSignal(); track group.id) {\n        <dbx-list-view-content-group [group]=\"group\"></dbx-list-view-content-group>\n      }\n    </mat-nav-list>\n  `,\n  host: {\n    class: 'dbx-list-view',\n    '[class.dbx-list-sticky-headers]': 'stickyHeaders()'\n  },\n  imports: [MatNavList, DbxValueListViewContentGroupComponent]\n})\nexport class DbxValueListViewContentComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  readonly dbxListView = inject(DbxListView<T>);\n  private readonly _dbxListGroupDelegate: DbxValueListViewGroupDelegate<any, T, I> = inject<Maybe<DbxValueListViewGroupDelegate<any, T, I>>>(DbxValueListViewGroupDelegate, { optional: true }) ?? defaultDbxValueListViewGroupDelegate();\n\n  private readonly _trackBy$ = this.dbxListView.trackBy$ ?? of(undefined);\n  readonly trackBy$ = this._trackBy$.pipe(map((trackBy) => (trackBy ? (index: number, item: DbxValueListItemConfig<T, I>) => trackBy(index, item.itemValue) : DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION)));\n\n  readonly items = input<Maybe<DbxValueListItemConfig<T, I>[]>>();\n  readonly emitAllClicks = input<Maybe<boolean>>();\n  readonly stickyHeaders = input<Maybe<boolean>>(false);\n  readonly separatorConfig = input<Maybe<DbxValueListViewSeparatorConfig<T, I>>>();\n\n  readonly groups$: Observable<DbxValueListItemGroup<any, T, I>[]> = toObservable(this.items).pipe(\n    switchMap((items) => asObservable(this._dbxListGroupDelegate.groupValues(items ?? []))),\n    shareReplay(1)\n  );\n\n  readonly groupsSignal = toSignal(this.groups$);\n  readonly disabledSignal = toSignal(this.dbxListView.disabled$);\n\n  onClickItem(item: I) {\n    // do not emit clicks for disabled items.\n    if (!item.disabled && (this.emitAllClicks() || !item.anchor || anchorTypeForAnchor(item.anchor) === 'plain')) {\n      // only emit clicks for items with no anchor, or plain anchors.\n      this.onClickValue(item.itemValue);\n    }\n  }\n\n  onClickValue(value: T) {\n    this.dbxListView.clickValue?.emit(value);\n  }\n\n  rippleDisabledOnItem(item: I): boolean {\n    return item.rippleDisabled || (!this.emitAllClicks() && !item.anchor);\n  }\n}\n\n// MARK: DbxValueListViewComponent\n/**\n * Renders a value-based list view using a configuration input. Must be used within a parent {@link DbxListView} context.\n *\n * @dbxWebComponent\n * @dbxWebSlug list-view\n * @dbxWebCategory list\n * @dbxWebRelated list, selection-list-view, list-grid-view, list-accordion-view\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-list-view [config]=\"rowConfig\"></dbx-list-view>\n * ```\n *\n * @example\n * ```html\n * <dbx-list-view [config]=\"rowConfig\"></dbx-list-view>\n * ```\n */\n@Component({\n  selector: 'dbx-list-view',\n  template: `\n    <dbx-list-view-content [items]=\"itemsSignal()\" [emitAllClicks]=\"emitAllClicksSignal()\" [stickyHeaders]=\"stickyHeadersSignal() ?? true\" [separatorConfig]=\"separatorConfigSignal()\"></dbx-list-view-content>\n  `,\n  imports: [DbxValueListViewContentComponent]\n})\nexport class DbxValueListViewComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown, C extends DbxValueListViewConfig<T, I, V> = DbxValueListViewConfig<T, I, V>> extends AbstractDbxValueListViewDirective<T, I, V, C> {\n  readonly emitAllClicksSignal: Signal<Maybe<boolean>> = computed(() => this.config()?.emitAllClicks);\n  readonly stickyHeadersSignal: Signal<Maybe<boolean>> = computed(() => this.config()?.stickyHeaders);\n  readonly separatorConfigSignal: Signal<Maybe<DbxValueListViewSeparatorConfig<T, I>>> = computed(() => this.config()?.separatorConfig);\n}\n","import { Component, computed, input, type TrackByFunction } from '@angular/core';\nimport { type DbxValueListItem, type DbxValueListItemConfig } from '../list.view.value';\nimport { AbstractDbxValueListViewDirective } from '../list.view.value.directive';\nimport { type Maybe, spaceSeparatedCssClasses } from '@dereekb/util';\nimport { DbxValueListViewContentComponent, type DbxValueListViewConfig, DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION } from '../list.view.value.component';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { MatAccordion } from '@angular/material/expansion';\nimport { type DbxValueListItemGroup } from '../group/list.view.value.group';\nimport { type DbxValueListViewSeparatorConfig, dbxValueListItemSeparatorConfigs } from '../list.view.value.separator';\n\n// MARK: Config\n/**\n * Configuration for a {@link DbxValueListAccordionViewComponent}. Extends the standard list view config with accordion-specific options.\n */\nexport interface DbxValueListAccordionViewConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> extends DbxValueListViewConfig<T, I, V> {\n  /**\n   * Whether the accordion allows multiple expanded panels simultaneously.\n   */\n  readonly multi?: boolean;\n}\n\n// MARK: Render Entries\n/**\n * Render entry for an item within the flat accordion list.\n */\nexport interface DbxAccordionRenderItemEntry<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  readonly type: 'item';\n  readonly trackId: string;\n  readonly item: DbxValueListItemConfig<T, I>;\n}\n\n/**\n * Render entry for a group header within the flat accordion list.\n */\nexport interface DbxAccordionRenderGroupHeaderEntry {\n  readonly type: 'group-header';\n  readonly trackId: string;\n  readonly headerConfig: DbxInjectionComponentConfig;\n  readonly cssClasses?: string;\n}\n\n/**\n * Render entry for a group footer within the flat accordion list.\n */\nexport interface DbxAccordionRenderGroupFooterEntry {\n  readonly type: 'group-footer';\n  readonly trackId: string;\n  readonly footerConfig: DbxInjectionComponentConfig;\n}\n\n/**\n * Render entry for a separator between (or around) items within the flat accordion list.\n */\nexport interface DbxAccordionRenderSeparatorEntry {\n  readonly type: 'separator';\n  readonly trackId: string;\n  readonly separatorConfig: DbxInjectionComponentConfig;\n}\n\n/**\n * Discriminated union of all render entry types used by the flat accordion list.\n */\nexport type DbxAccordionRenderEntry<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> = DbxAccordionRenderItemEntry<T, I> | DbxAccordionRenderGroupHeaderEntry | DbxAccordionRenderGroupFooterEntry | DbxAccordionRenderSeparatorEntry;\n\n/**\n * Flattens grouped accordion items into a single array of render entries with stable track IDs.\n *\n * @param groups - The grouped items to flatten.\n * @param trackByFn - The track-by function used to derive stable item identity.\n * @param separatorConfig - (Optional) separator configuration. Separators are evaluated within each group.\n * @returns A flat array of render entries for use in a single `@for` loop.\n *\n * @example\n * ```ts\n * const entries = flattenAccordionGroups(groups, trackByFn);\n * ```\n */\nexport function flattenAccordionGroups<T, I extends DbxValueListItem<T> = DbxValueListItem<T>>(groups: DbxValueListItemGroup<unknown, T, I>[], trackByFn: TrackByFunction<DbxValueListItemConfig<T, I>>, separatorConfig?: Maybe<DbxValueListViewSeparatorConfig<T, I>>): DbxAccordionRenderEntry<T, I>[] {\n  const entries: DbxAccordionRenderEntry<T, I>[] = [];\n\n  for (const group of groups) {\n    if (group.headerConfig) {\n      entries.push({\n        type: 'group-header',\n        trackId: `__gh__${group.id}`,\n        headerConfig: group.headerConfig,\n        cssClasses: spaceSeparatedCssClasses(group.cssClasses)\n      });\n    }\n\n    if (group.showGroupItems !== false) {\n      const separators = dbxValueListItemSeparatorConfigs<T, I>(group.items, separatorConfig);\n\n      for (let i = 0; i <= group.items.length; i++) {\n        const item = group.items[i] as Maybe<DbxValueListItemConfig<T, I>>;\n        const separator = separators[i];\n\n        if (separator) {\n          const previous = group.items[i - 1] as Maybe<DbxValueListItemConfig<T, I>>;\n          const previousTrackId = previous ? trackByFn(i - 1, previous) : '';\n          const nextTrackId = item ? trackByFn(i, item) : '';\n\n          entries.push({\n            type: 'separator',\n            trackId: `__s__${group.id}__${previousTrackId}__${nextTrackId}`,\n            separatorConfig: separator\n          });\n        }\n\n        if (item) {\n          entries.push({\n            type: 'item',\n            trackId: `__i__${group.id}__${trackByFn(i, item)}`,\n            item\n          });\n        }\n      }\n    }\n\n    if (group.footerConfig) {\n      entries.push({\n        type: 'group-footer',\n        trackId: `__gf__${group.id}`,\n        footerConfig: group.footerConfig\n      });\n    }\n  }\n\n  return entries;\n}\n\n// MARK: DbxValueListAccordionViewContentComponent\n/**\n * Content view that renders grouped list items inside a `mat-accordion`. Uses a single flat `@for` loop\n * with stable item identity tracking so that items moving between groups trigger DOM moves instead of\n * destroy+create cycles.\n *\n * @example\n * ```html\n * <dbx-list-accordion-view-content [items]=\"configuredItems\" [multi]=\"true\"></dbx-list-accordion-view-content>\n * ```\n */\n@Component({\n  selector: 'dbx-list-accordion-view-content',\n  template: `\n    <mat-accordion [multi]=\"multi() ?? false\">\n      @for (entry of flatEntriesSignal(); track entry.trackId) {\n        @switch (entry.type) {\n          @case ('group-header') {\n            <div class=\"dbx-list-view-group dbx-list-view-group-header\" [class]=\"entry.cssClasses\">\n              <dbx-injection [config]=\"entry.headerConfig\"></dbx-injection>\n            </div>\n          }\n          @case ('item') {\n            <div dbx-injection [config]=\"entry.item.config\"></div>\n          }\n          @case ('separator') {\n            <div class=\"dbx-list-view-item-separator\">\n              <dbx-injection [config]=\"entry.separatorConfig\"></dbx-injection>\n            </div>\n          }\n          @case ('group-footer') {\n            <div class=\"dbx-list-view-group dbx-list-view-group-footer\">\n              <dbx-injection [config]=\"entry.footerConfig\"></dbx-injection>\n            </div>\n          }\n        }\n      }\n    </mat-accordion>\n  `,\n  host: {\n    class: 'dbx-list-accordion-view'\n  },\n  imports: [MatAccordion, DbxInjectionComponent]\n})\nexport class DbxValueListAccordionViewContentComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> extends DbxValueListViewContentComponent<T, I> {\n  readonly multi = input<Maybe<boolean>>();\n\n  readonly trackByFunctionSignal = toSignal(this.trackBy$, { initialValue: DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION });\n\n  readonly flatEntriesSignal = computed(() => {\n    const groups = this.groupsSignal() ?? [];\n    const trackByFn = this.trackByFunctionSignal();\n\n    return flattenAccordionGroups<T, I>(groups as DbxValueListItemGroup<unknown, T, I>[], trackByFn, this.separatorConfig());\n  });\n}\n\n// MARK: DbxValueListAccordionViewComponent\n/**\n * Renders a value list as an accordion using a configuration input. Each item renders its own expansion panel.\n * Requires a parent {@link DbxListView} context.\n *\n * @dbxWebComponent\n * @dbxWebSlug list-accordion-view\n * @dbxWebCategory list\n * @dbxWebRelated list, list-view\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-list-accordion-view [config]=\"rowConfig\"></dbx-list-accordion-view>\n * ```\n *\n * @example\n * ```html\n * <dbx-list-accordion-view [config]=\"rowConfig\"></dbx-list-accordion-view>\n * ```\n */\n@Component({\n  selector: 'dbx-list-accordion-view',\n  template: `\n    <dbx-list-accordion-view-content [items]=\"itemsSignal()\" [multi]=\"config().multi\" [emitAllClicks]=\"config().emitAllClicks\" [stickyHeaders]=\"config().stickyHeaders ?? false\" [separatorConfig]=\"config().separatorConfig\"></dbx-list-accordion-view-content>\n  `,\n  imports: [DbxValueListAccordionViewContentComponent]\n})\nexport class DbxValueListAccordionViewComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown, C extends DbxValueListAccordionViewConfig<T, I, V> = DbxValueListAccordionViewConfig<T, I, V>> extends AbstractDbxValueListViewDirective<T, I, V, C> {}\n","import { type ListLoadingStateContext, type MaybeObservableOrValue, asObservable, maybeValueFromObservableOrValue } from '@dereekb/rxjs';\nimport { combineLatest, distinctUntilChanged, map, type Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { Directive, input, NgModule, output, signal, type TrackByFunction } from '@angular/core';\nimport { type DbxListSelectionMode, type DbxListView } from './list.view';\nimport { type Maybe } from '@dereekb/util';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { DbxValueListViewComponent } from './list.view.value.component';\n\n/**\n * Default template string for value list view components that renders a `dbx-list-view` with a `config` binding.\n */\nexport const DEFAULT_DBX_VALUE_LIST_COMPONENT_CONFIGURATION_TEMPLATE = '<dbx-list-view [config]=\"config\"></dbx-list-view>';\n\n/**\n * Convenience module that imports and exports {@link DbxValueListViewComponent}.\n */\n@NgModule({\n  exports: [DbxValueListViewComponent],\n  imports: [DbxValueListViewComponent]\n})\nexport class DbxValueListViewComponentImportsModule {}\n\n// MARK: Value List View\n/**\n * Abstract base directive implementing {@link DbxListView}. Manages values, disabled state, selection mode, and click events.\n *\n * Extend this to create custom list view directives. If selection support is needed,\n * consider extending {@link AbstractDbxSelectionListViewDirective} instead.\n */\n@Directive()\nexport abstract class AbstractDbxListViewDirective<T> implements DbxListView<T> {\n  readonly valuesArray = input<Maybe<T[]>>();\n  readonly values = input<MaybeObservableOrValue<T[]>>();\n\n  readonly clickValue = output<T>();\n\n  private readonly _trackBySignal = signal<Maybe<TrackByFunction<T>>>(undefined);\n  private readonly _disabledSignal = signal<boolean>(false);\n  private readonly _selectionModeSignal = signal<Maybe<DbxListSelectionMode>>(undefined);\n  private readonly _valuesOverrideSignal = signal<MaybeObservableOrValue<T[]>>(undefined);\n\n  readonly trackBy$ = toObservable(this._trackBySignal);\n  readonly disabled$ = toObservable(this._disabledSignal);\n  readonly selectionMode$ = toObservable(this._selectionModeSignal);\n\n  readonly _inputValuesArray$ = toObservable(this.valuesArray);\n  readonly _inputValues$ = toObservable(this.values);\n\n  readonly _values$: Observable<Maybe<T[]>> = toObservable(this._valuesOverrideSignal).pipe(\n    switchMap((x) => {\n      let valuesObs: Observable<Maybe<T[]>>;\n\n      if (x) {\n        valuesObs = asObservable(x);\n      } else {\n        valuesObs = combineLatest([this._inputValues$, this._inputValuesArray$]).pipe(switchMap(([x, y]) => (y == null ? asObservable(x) : of(y))));\n      }\n\n      return valuesObs;\n    })\n  );\n\n  readonly values$: Observable<T[]> = this._values$.pipe(\n    maybeValueFromObservableOrValue(),\n    map((x) => x ?? []),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  onClickValue(value: T) {\n    this.clickValue.emit(value);\n  }\n\n  setListContext(state: ListLoadingStateContext<T>): void {\n    this.setValues(state.currentList$);\n  }\n\n  setValues(values: MaybeObservableOrValue<T[]>): void {\n    this._valuesOverrideSignal.set(values);\n  }\n\n  setDisabled(disabled: boolean): void {\n    this._disabledSignal.set(disabled);\n  }\n\n  setSelectionMode(selectionMode: Maybe<DbxListSelectionMode>): void {\n    this._selectionModeSignal.set(selectionMode);\n  }\n\n  setTrackBy(trackBy: Maybe<TrackByFunction<T>>) {\n    this._trackBySignal.set(trackBy);\n  }\n}\n","import { Directive, NgModule } from '@angular/core';\nimport { AbstractDbxListViewDirective } from '../list.view.directive';\nimport { DbxValueListAccordionViewComponent, type DbxValueListAccordionViewConfig } from './list.accordion.view.component';\nimport { type DbxValueAsListItem } from '../list.view.value';\n\n/**\n * Default template string for accordion list view components that renders a `dbx-list-accordion-view` with a `config` binding.\n */\nexport const DEFAULT_DBX_LIST_ACCORDION_VIEW_COMPONENT_CONFIGURATION_TEMPLATE = '<dbx-list-accordion-view [config]=\"config\"></dbx-list-accordion-view>';\n\nexport const DBX_LIST_ACCORDION_VIEW_COMPONENT_IMPORTS_AND_EXPORTS = [DbxValueListAccordionViewComponent];\n\n/**\n * Convenience module that imports and exports {@link DbxValueListAccordionViewComponent}.\n */\n@NgModule({\n  exports: DBX_LIST_ACCORDION_VIEW_COMPONENT_IMPORTS_AND_EXPORTS,\n  imports: DBX_LIST_ACCORDION_VIEW_COMPONENT_IMPORTS_AND_EXPORTS\n})\nexport class DbxListAccordionViewComponentImportsModule {}\n\n/**\n * Abstract base directive for accordion-based list views. Extend this to create custom accordion list views\n * that provide a {@link DbxValueListAccordionViewConfig}.\n */\n@Directive()\nexport abstract class AbstractDbxListAccordionViewDirective<T> extends AbstractDbxListViewDirective<T> {\n  abstract readonly config: DbxValueListAccordionViewConfig<DbxValueAsListItem<T>>;\n}\n","import { Component, Directive, type Signal, computed, inject, input } from '@angular/core';\nimport { of } from 'rxjs';\nimport { type DbxValueListItem } from '../list.view.value';\nimport { AbstractDbxValueListViewDirective } from '../list.view.value.directive';\nimport { type Maybe, mergeObjects, spaceSeparatedCssClasses } from '@dereekb/util';\nimport { DbxValueListViewContentComponent, type DbxValueListViewConfig, DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION } from '../list.view.value.component';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { MatRipple } from '@angular/material/core';\nimport { DbxInjectionComponent } from '@dereekb/dbx-core';\nimport { DbxAnchorComponent } from '../../../router/layout/anchor/anchor.component';\nimport { FlexLayoutModule } from '@ngbracket/ngx-layout';\nimport { type DbxValueListItemGroup } from '../group/list.view.value.group';\n\n/**\n * Configuration for a {@link DbxValueListGridViewComponent}. Extends the standard list view config with optional grid layout sizing.\n */\nexport interface DbxValueListGridViewConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> extends DbxValueListViewConfig<T, I, V> {\n  /**\n   * Optional grid sizing configuration for column layout and gap spacing.\n   */\n  readonly grid?: Maybe<Partial<DbxValueListGridItemViewGridSizeConfig>>;\n}\n\n/**\n * Defines the CSS grid layout dimensions for a grid-based list view.\n */\nexport interface DbxValueListGridItemViewGridSizeConfig {\n  /**\n   * Gap size in %, px, vw, vh\n   */\n  readonly gap: string;\n  /**\n   * Columns configuration.\n   *\n   * Example: repeat(auto-fill, minmax(200px, 1fr))\n   */\n  readonly columns: string;\n}\n\n/**\n * Default grid size configuration with responsive auto-fill columns (minimum 320px) and 8px gap.\n */\nexport const DEFAULT_LIST_GRID_SIZE_CONFIG: DbxValueListGridItemViewGridSizeConfig = {\n  columns: 'repeat(auto-fill, minmax(320px, 1fr))',\n  gap: '8px'\n};\n\n/**\n * Structural directive that provides grid size configuration to descendant {@link DbxValueListGridViewContentComponent} instances.\n *\n * @example\n * ```html\n * <div [dbxListGridSize]=\"{ columns: 'repeat(3, 1fr)', gap: '16px' }\">\n *   <dbx-list-grid-view-content [items]=\"items\"></dbx-list-grid-view-content>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxListGridSize]'\n})\nexport class DbxValueListGridSizeDirective {\n  readonly gridSize = input.required<Maybe<Partial<DbxValueListGridItemViewGridSizeConfig>>>({ alias: 'dbxListGridSize' });\n  readonly gridSize$ = toObservable(this.gridSize);\n}\n\n// MARK: DbxValueListGridViewContentGroupComponent\n/**\n * Renders a single group of items within a CSS grid layout, including optional header/footer and ripple effects on items.\n *\n * @example\n * ```html\n * <dbx-list-grid-view-content-group [group]=\"group\"></dbx-list-grid-view-content-group>\n * ```\n */\n@Component({\n  selector: 'dbx-list-grid-view-content-group',\n  template: `\n    <div class=\"dbx-list-view-group-content\">\n      @if (headerConfigSignal()) {\n        <div class=\"dbx-list-view-group-header\">\n          <dbx-injection [config]=\"headerConfigSignal()\"></dbx-injection>\n        </div>\n      }\n      <div [gdGap]=\"gridConfigSignal().gap\" [gdColumns]=\"gridConfigSignal().columns\">\n        @for (item of itemsSignal(); track trackByFunctionSignal()($index, item)) {\n          <dbx-anchor class=\"dbx-list-grid-view-item\" matRipple [matRippleDisabled]=\"rippleDisabledOnItem(item)\" [anchor]=\"item.anchor\" [disabled]=\"item.disabled\" (click)=\"onClickItem(item)\">\n            <div dbx-injection [config]=\"item.config\"></div>\n          </dbx-anchor>\n        }\n      </div>\n      @if (footerConfigSignal()) {\n        <div class=\"dbx-list-view-group-footer\">\n          <dbx-injection [config]=\"footerConfigSignal()\"></dbx-injection>\n        </div>\n      }\n    </div>\n  `,\n  host: {\n    class: 'dbx-list-view-group',\n    '[class]': 'cssClassSignal()'\n  },\n  imports: [DbxInjectionComponent, DbxAnchorComponent, FlexLayoutModule, MatRipple]\n})\nexport class DbxValueListGridViewContentGroupComponent<G, T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  readonly dbxValueListGridViewContentComponent = inject(DbxValueListGridViewContentComponent<T>);\n  readonly group = input<Maybe<DbxValueListItemGroup<G, T, I>>>();\n\n  readonly trackByFunctionSignal = toSignal(this.dbxValueListGridViewContentComponent.trackBy$, { initialValue: DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION });\n  readonly gridConfigSignal = this.dbxValueListGridViewContentComponent.gridConfigSignal;\n\n  readonly itemsSignal = computed(() => this.group()?.items ?? []);\n  readonly headerConfigSignal = computed(() => this.group()?.headerConfig);\n  readonly footerConfigSignal = computed(() => this.group()?.footerConfig);\n  readonly cssClassSignal = computed(() => spaceSeparatedCssClasses(this.group()?.cssClasses));\n\n  onClickItem(item: I) {\n    this.dbxValueListGridViewContentComponent.onClickItem(item);\n  }\n\n  rippleDisabledOnItem(item: I): boolean {\n    return this.dbxValueListGridViewContentComponent.rippleDisabledOnItem(item);\n  }\n}\n\n// MARK: DbxValueListGridViewContentComponent\n/**\n * Renders grouped list items in a CSS grid layout. Supports configurable grid sizing via the `grid` input\n * or a parent {@link DbxValueListGridSizeDirective}.\n *\n * @example\n * ```html\n * <dbx-list-grid-view-content [items]=\"configuredItems\" [grid]=\"{ columns: 'repeat(4, 1fr)', gap: '12px' }\"></dbx-list-grid-view-content>\n * ```\n */\n@Component({\n  selector: 'dbx-list-grid-view-content',\n  template: `\n    @for (group of groupsSignal(); track group.id) {\n      <dbx-list-grid-view-content-group [group]=\"group\"></dbx-list-grid-view-content-group>\n    }\n  `,\n  host: {\n    class: 'dbx-list-grid-view'\n  },\n  imports: [DbxValueListGridViewContentGroupComponent]\n})\nexport class DbxValueListGridViewContentComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> extends DbxValueListViewContentComponent<T, I> {\n  private readonly _gridSizeOverride = inject(DbxValueListGridSizeDirective, { optional: true });\n\n  // eslint-disable-next-line @angular-eslint/no-input-rename\n  readonly inputGridConfig = input<Maybe<Partial<DbxValueListGridItemViewGridSizeConfig>>>(undefined, { alias: 'grid' });\n  readonly gridConfigFromGridSizeSignal = toSignal(this._gridSizeOverride?.gridSize$ ?? of(undefined));\n\n  readonly gridConfigSignal: Signal<DbxValueListGridItemViewGridSizeConfig> = computed(() => {\n    return mergeObjects<DbxValueListGridItemViewGridSizeConfig>([DEFAULT_LIST_GRID_SIZE_CONFIG, this.inputGridConfig(), this.gridConfigFromGridSizeSignal()]) as DbxValueListGridItemViewGridSizeConfig;\n  });\n}\n\n// MARK: DbxValueListGridViewComponent\n/**\n * Renders a value list as a CSS grid using a configuration input. Requires a parent {@link DbxListView} context.\n *\n * @dbxWebComponent\n * @dbxWebSlug list-grid-view\n * @dbxWebCategory list\n * @dbxWebRelated list, list-view\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-list-grid-view [config]=\"cellConfig\"></dbx-list-grid-view>\n * ```\n *\n * @example\n * ```html\n * <dbx-list-grid-view [config]=\"cellConfig\" dbxListGridSize=\"md\"></dbx-list-grid-view>\n * ```\n */\n@Component({\n  selector: 'dbx-list-grid-view',\n  template: `\n    <dbx-list-grid-view-content [items]=\"itemsSignal()\" [grid]=\"config().grid\" [emitAllClicks]=\"config().emitAllClicks\" [stickyHeaders]=\"config().stickyHeaders ?? true\"></dbx-list-grid-view-content>\n  `,\n  imports: [DbxValueListGridViewContentComponent]\n})\nexport class DbxValueListGridViewComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown, C extends DbxValueListGridViewConfig<T, I, V> = DbxValueListGridViewConfig<T, I, V>> extends AbstractDbxValueListViewDirective<T, I, V, C> {}\n","import { Directive, NgModule } from '@angular/core';\nimport { AbstractDbxListViewDirective } from '../list.view.directive';\nimport { DbxValueListGridViewComponent, type DbxValueListGridViewConfig } from './list.grid.view.component';\nimport { type DbxValueAsListItem } from '../list.view.value';\n\n/**\n * Default template string for grid list view components that renders a `dbx-list-grid-view` with a `config` binding.\n */\nexport const DEFAULT_DBX_LIST_GRID_VIEW_COMPONENT_CONFIGURATION_TEMPLATE = '<dbx-list-grid-view [config]=\"config\"></dbx-list-grid-view>';\n\nexport const DBX_LIST_GRID_VIEW_COMPONENT_IMPORTS_AND_EXPORTS = [DbxValueListGridViewComponent];\n\n/**\n * Convenience module that imports and exports {@link DbxValueListGridViewComponent}.\n */\n@NgModule({\n  exports: DBX_LIST_GRID_VIEW_COMPONENT_IMPORTS_AND_EXPORTS,\n  imports: DBX_LIST_GRID_VIEW_COMPONENT_IMPORTS_AND_EXPORTS\n})\nexport class DbxListGridViewComponentImportsModule {}\n\n/**\n * Abstract base directive for grid-based list views. Extend this to create custom grid list views\n * that provide a {@link DbxValueListGridViewConfig}.\n */\n@Directive()\nexport abstract class AbstractDbxListGridViewDirective<T> extends AbstractDbxListViewDirective<T> {\n  abstract readonly config: DbxValueListGridViewConfig<DbxValueAsListItem<T>>;\n}\n","import { Component, InjectionToken, inject } from '@angular/core';\nimport { DBX_VALUE_LIST_VIEW_ITEM, type DbxValueListItem } from '../list.view.value';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { MatIconModule } from '@angular/material/icon';\n\n/**\n * Injection token for providing a default meta icon string to {@link DbxListViewMetaIconComponent} instances.\n */\nexport const DEFAULT_DBX_LIST_VIEW_META_ICON = new InjectionToken<string>('DEFAULT_DBX_LIST_VIEW_META_ICON');\n\n/**\n * Configuration interface for the meta icon, specifying which Material icon to display.\n */\nexport interface DbxListViewMetaIconConfig {\n  readonly icon?: Maybe<string>;\n}\n\n/**\n * Displays a Material icon in the meta (trailing) area of a list item. Reads its icon from the item's meta\n * configuration or falls back to a default provided via {@link DEFAULT_DBX_LIST_VIEW_META_ICON}.\n *\n * Use the static `metaConfig()` method to create the injection component config for use in list view configurations.\n *\n * @example\n * ```html\n * <dbx-list-view-meta-icon></dbx-list-view-meta-icon>\n * ```\n */\n@Component({\n  selector: 'dbx-list-view-meta-icon',\n  template: `\n    <mat-icon class=\"dbx-list-view-meta-icon\">{{ icon }}</mat-icon>\n  `,\n  imports: [MatIconModule]\n})\nexport class DbxListViewMetaIconComponent {\n  readonly item = inject<DbxValueListItem<unknown, DbxListViewMetaIconConfig>>(DBX_VALUE_LIST_VIEW_ITEM, { optional: true });\n  readonly defaultIcon = inject<Maybe<string>>(DEFAULT_DBX_LIST_VIEW_META_ICON, { optional: true });\n\n  readonly icon: Maybe<string> = this.item?.meta?.icon ?? this.defaultIcon;\n\n  static metaConfig(defaultIcon?: Maybe<string>): DbxInjectionComponentConfig<DbxListViewMetaIconConfig> {\n    return {\n      componentClass: DbxListViewMetaIconComponent,\n      providers: [\n        {\n          provide: DEFAULT_DBX_LIST_VIEW_META_ICON,\n          useValue: defaultIcon\n        }\n      ]\n    };\n  }\n}\n","import { InjectionToken, Component, inject } from '@angular/core';\nimport { type PrimativeKey } from '@dereekb/util';\nimport { type DbxListTitleGroupData } from './list.view.value.group.title';\nimport { MatIconModule } from '@angular/material/icon';\nimport { NgClass } from '@angular/common';\n\n/**\n * Injection token that provides the {@link DbxListTitleGroupData} to group header components.\n */\nexport const DBX_LIST_TITLE_GROUP_DATA = new InjectionToken<unknown>('DbxListTitleGroupData');\n\n/**\n * Abstract base class for group header components. Automatically injects the {@link DbxListTitleGroupData}\n * via the {@link DBX_LIST_TITLE_GROUP_DATA} token. Extend this to create custom group header renderers.\n */\nexport abstract class AbstractDbxListTitleGroupHeaderComponent<O extends PrimativeKey, D extends DbxListTitleGroupData<O>> {\n  readonly data = inject<D>(DBX_LIST_TITLE_GROUP_DATA);\n}\n\n/**\n * Default group header component that displays a title, optional icon, and optional hint text.\n * Used automatically by {@link DbxListTitleGroupDirective} unless a custom header component is specified.\n *\n * @dbxWebComponent\n * @dbxWebSlug list-title-group-header\n * @dbxWebCategory list\n * @dbxWebRelated list, list-view\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-list-title-group-header></dbx-list-title-group-header>\n * ```\n *\n * @example\n * ```html\n * <dbx-list-view [config]=\"rowConfig\" dbxListTitleGroup></dbx-list-view>\n * ```\n */\n@Component({\n  selector: 'dbx-list-title-group-header',\n  template: `\n    <div class=\"dbx-list-item-padded dbx-list-two-line-item\" [ngClass]=\"{ 'dbx-list-two-line-item-with-icon': icon }\">\n      @if (icon) {\n        <mat-icon class=\"item-icon\">{{ icon }}</mat-icon>\n      }\n      <div class=\"item-left\">\n        <div class=\"mat-subtitle-2\">{{ title }}</div>\n        @if (hint) {\n          <div class=\"item-details\">{{ hint }}</div>\n        }\n      </div>\n    </div>\n  `,\n  imports: [NgClass, MatIconModule],\n  host: {\n    class: 'dbx-list-title-group-header'\n  }\n})\nexport class DbxListTitleGroupHeaderComponent<O extends PrimativeKey, D extends DbxListTitleGroupData<O>> extends AbstractDbxListTitleGroupHeaderComponent<O, D> {\n  readonly icon = this.data.icon;\n  readonly title = this.data.title;\n  readonly hint = this.data.hint;\n}\n","import { Directive, input, type StaticProvider } from '@angular/core';\nimport { type DbxValueListItem, type DbxValueListItemConfig } from '../list.view.value';\nimport { type DbxValueListItemGroup, type DbxValueListViewGroupDelegate, type DbxValueListViewGroupValuesFunction, provideDbxValueListViewGroupDelegate } from './list.view.value.group';\nimport { map } from 'rxjs';\nimport { type Building, type Maybe, type PrimativeKey, asArray, compareWithMappedValuesFunction, makeValuesGroupMap } from '@dereekb/util';\nimport { type DbxListTitleGroupData, type DbxListTitleGroupTitleDelegate } from './list.view.value.group.title';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { DbxListTitleGroupHeaderComponent, DBX_LIST_TITLE_GROUP_DATA } from './list.view.value.group.title.header.component';\n\n/**\n * Directive that groups list items into titled sections based on a {@link DbxListTitleGroupTitleDelegate}.\n * Automatically provides itself as a {@link DbxValueListViewGroupDelegate} so list views can consume the grouping.\n *\n * @example\n * ```html\n * <dbx-list-view [dbxListTitleGroup]=\"myGroupDelegate\" [config]=\"listViewConfig\"></dbx-list-view>\n * ```\n */\n@Directive({\n  selector: '[dbxListTitleGroup]',\n  providers: [provideDbxValueListViewGroupDelegate(DbxListTitleGroupDirective)]\n})\nexport class DbxListTitleGroupDirective<T, O extends PrimativeKey = PrimativeKey, D extends DbxListTitleGroupData<O> = DbxListTitleGroupData<O>, I extends DbxValueListItem<T> = DbxValueListItem<T>> implements DbxValueListViewGroupDelegate<D, T, I> {\n  readonly delegate = input<Maybe<DbxListTitleGroupTitleDelegate<T, O, D, I>>>(undefined, { alias: 'dbxListTitleGroup' });\n\n  private readonly _delegate$ = toObservable(this.delegate);\n\n  readonly groupValues: DbxValueListViewGroupValuesFunction<D, T, I, unknown, unknown> = (items: DbxValueListItemConfig<T, I>[]) => {\n    return this._delegate$.pipe(\n      map((delegate) => {\n        let groups: DbxValueListItemGroup<D, T, I>[];\n\n        if (delegate == null) {\n          groups = [\n            {\n              id: '_',\n              data: { value: null as unknown, title: '' } as D,\n              items\n            }\n          ];\n        } else {\n          const groupsValuesMap = makeValuesGroupMap(items, delegate.groupValueForItem);\n          const { sortGroupsByData, cssClasses: inputCssClasses } = delegate;\n          const cssClassesForAllGroups = inputCssClasses ?? [];\n\n          const componentClass = delegate.headerComponentClass ?? DbxListTitleGroupHeaderComponent;\n          const { dataForGroupValue, footerComponentClass } = delegate;\n\n          groups = Array.from(groupsValuesMap.entries()).map(([value, items]) => {\n            const data = dataForGroupValue(value as O, items);\n            (data as Building<D>).value = value as O;\n            const cssClasses = data.cssClasses ? [...asArray(cssClassesForAllGroups), ...asArray(data.cssClasses)] : cssClassesForAllGroups;\n\n            const providers: StaticProvider[] = [\n              {\n                provide: DBX_LIST_TITLE_GROUP_DATA,\n                useValue: data\n              }\n            ];\n\n            const group: DbxValueListItemGroup<D, T, I> = {\n              id: String(value),\n              data,\n              items,\n              headerConfig: { componentClass, providers },\n              footerConfig: footerComponentClass ? { componentClass: footerComponentClass, providers } : undefined,\n              cssClasses\n            };\n\n            return group;\n          });\n\n          if (sortGroupsByData) {\n            groups.sort(compareWithMappedValuesFunction((x) => x.data, sortGroupsByData));\n          }\n        }\n\n        return groups;\n      })\n    );\n  };\n}\n","import { Directive, input } from '@angular/core';\nimport { type Maybe, type ArrayOrValue, type Modifier } from '@dereekb/util';\nimport { type Observable, map } from 'rxjs';\nimport { type DbxValueListItem, type DbxValueListItemDecisionFunction } from '../list.view.value';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { AbstractDbxValueListItemModifierDirective } from './list.view.value.modifier.directive';\nimport { transformEmptyStringInputToUndefined } from '@dereekb/dbx-core';\n\n/**\n * Modifier key used to identify the ripple-disable modifier in the modifier map.\n */\nexport const DBX_LIST_ITEM_DISABLE_RIPPLE_LIST_ITEM_MODIFIER_KEY = 'disable_ripple_anchor';\n\n/**\n * Default decision function that disables ripple on items that already have ripple disabled,\n * lack an anchor, or have an anchor with no navigation target.\n *\n * @param item - The list item to evaluate for ripple disabling.\n * @returns `true` if the ripple should be disabled for this item.\n */\nexport const DEFAULT_DBX_LIST_ITEM_DISABLE_FUNCTION: DbxValueListItemDecisionFunction<unknown> = <T>(item: DbxValueListItem<T>) => {\n  return item.rippleDisabled || !item.anchor || (!item.anchor.ref && !item.anchor.url && !item.anchor.onClick);\n};\n\n/**\n * Modifier directive that disables the Material ripple effect on list items based on a decision function.\n * By default, disables ripple on items without meaningful anchor navigation targets.\n *\n * @example\n * ```html\n * <dbx-list-view dbxListItemDisableRippleModifier [config]=\"listViewConfig\"></dbx-list-view>\n * ```\n */\n@Directive({\n  selector: 'dbxListItemDisableRippleModifier,[dbxListItemDisableRippleModifier]'\n})\nexport class DbxListItemDisableRippleModifierDirective<T> extends AbstractDbxValueListItemModifierDirective<T> {\n  readonly disableRippleForItem = input<Maybe<DbxValueListItemDecisionFunction<T>>, Maybe<'' | DbxValueListItemDecisionFunction<T>>>(undefined, { alias: 'dbxListItemDisableRippleModifier', transform: transformEmptyStringInputToUndefined });\n\n  readonly disableRippleForItemModifiers$: Observable<Maybe<ArrayOrValue<Modifier<DbxValueListItem<T>>>>> = toObservable(this.disableRippleForItem).pipe(\n    map((x) => x ?? DEFAULT_DBX_LIST_ITEM_DISABLE_FUNCTION),\n    map((disableRippleForItem) => {\n      const modifiers: Modifier<DbxValueListItem<T>> = {\n        key: DBX_LIST_ITEM_DISABLE_RIPPLE_LIST_ITEM_MODIFIER_KEY,\n        modify: (x: DbxValueListItem<T>) => {\n          if (disableRippleForItem(x)) {\n            x.rippleDisabled = true;\n          }\n        }\n      };\n\n      return modifiers;\n    })\n  );\n\n  constructor() {\n    super();\n    this.setModifiers(this.disableRippleForItemModifiers$);\n  }\n}\n","import { Directive, input } from '@angular/core';\nimport { type Maybe, type ArrayOrValue, type Modifier } from '@dereekb/util';\nimport { type Observable, map } from 'rxjs';\nimport { type DbxValueListItem, type DbxValueListItemDecisionFunction } from '../list.view.value';\nimport { AbstractDbxValueListItemModifierDirective } from './list.view.value.modifier.directive';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { transformEmptyStringInputToUndefined } from '@dereekb/dbx-core';\n\n/**\n * Modifier key used to identify the selection modifier in the modifier map.\n */\nexport const DBX_LIST_ITEM_IS_SELECTED_ITEM_MODIFIER_KEY = 'is_selected_item_modifier';\n\n/**\n * Default decision function that returns the item's current `selected` state (defaulting to false).\n *\n * @param item - The list item to check for selection.\n * @returns `true` if the item is currently selected, `false` otherwise.\n */\nexport const DEFAULT_DBX_LIST_ITEM_IS_SELECTED_FUNCTION: DbxValueListItemDecisionFunction<unknown> = <T>(item: DbxValueListItem<T>) => {\n  return item.selected ?? false;\n};\n\n/**\n * Modifier directive that sets the `selected` property on list items based on a custom decision function.\n * Useful for programmatically controlling which items appear selected in a list view.\n *\n * @example\n * ```html\n * <dbx-list-view [dbxListItemIsSelectedModifier]=\"isItemSelected\" [config]=\"listViewConfig\"></dbx-list-view>\n * ```\n */\n@Directive({\n  selector: 'dbxListItemIsSelectedModifier,[dbxListItemIsSelectedModifier]'\n})\nexport class DbxListItemIsSelectedModifierDirective<T> extends AbstractDbxValueListItemModifierDirective<T> {\n  readonly listItemIsSelected = input.required<Maybe<DbxValueListItemDecisionFunction<T>>, Maybe<'' | DbxValueListItemDecisionFunction<T>>>({ alias: 'dbxListItemIsSelectedModifier', transform: transformEmptyStringInputToUndefined });\n\n  readonly listItemIsSelectedModifiers$: Observable<Maybe<ArrayOrValue<Modifier<DbxValueListItem<T>>>>> = toObservable(this.listItemIsSelected).pipe(\n    map((x) => x ?? DEFAULT_DBX_LIST_ITEM_IS_SELECTED_FUNCTION),\n    map((listItemIsSelected) => {\n      const modifiers: Modifier<DbxValueListItem<T>> = {\n        key: DBX_LIST_ITEM_IS_SELECTED_ITEM_MODIFIER_KEY,\n        modify: (x: DbxValueListItem<T>) => {\n          x.selected = listItemIsSelected(x);\n        }\n      };\n\n      return modifiers;\n    })\n  );\n\n  constructor() {\n    super();\n    this.setModifiers(this.listItemIsSelectedModifiers$);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxValueListItemModifierDirective } from './list.view.value.modifier.directive';\nimport { DbxListItemDisableRippleModifierDirective } from './list.view.value.modifier.ripple.directive';\nimport { DbxListItemIsSelectedModifierDirective } from './list.view.value.modifier.selection.directive';\n\nconst importsAndExports = [DbxValueListItemModifierDirective, DbxListItemDisableRippleModifierDirective, DbxListItemIsSelectedModifierDirective];\n\n/**\n * Exports all dbx-list modifier-related directives.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxListModifierModule {}\n","import { Component } from '@angular/core';\n\n/**\n * Displays centered placeholder content within an empty list. Projects its content into a styled container.\n *\n * @dbxWebComponent\n * @dbxWebSlug list-empty-content\n * @dbxWebCategory list\n * @dbxWebRelated list\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-list-empty-content>Empty</dbx-list-empty-content>\n * ```\n *\n * @example\n * ```html\n * <dbx-list [state$]=\"items$\" [config]=\"listConfig\">\n *   <dbx-list-empty-content>\n *     <p>No items yet — add one to get started.</p>\n *   </dbx-list-empty-content>\n * </dbx-list>\n * ```\n */\n@Component({\n  selector: 'dbx-list-empty-content',\n  template: `\n    <div class=\"dbx-list-empty-content\">\n      <ng-content></ng-content>\n    </div>\n  `\n})\nexport class DbxListEmptyContentComponent {}\n","import { InfiniteScrollDirective } from 'ngx-infinite-scroll';\nimport { catchError, filter, exhaustMap, merge, map, Subject, switchMap, shareReplay, of, type Observable, first, distinctUntilChanged, combineLatest } from 'rxjs';\nimport { Component, type OnDestroy, ElementRef, HostListener, Directive, inject, input, output, signal, computed } from '@angular/core';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig, completeOnDestroy, cleanSubscription } from '@dereekb/dbx-core';\nimport { type ListLoadingState, filterMaybe, isLoadingStateFinishedLoading, startWithBeginLoading, listLoadingStateContext, switchMapMaybe, loadingStateHasNextPage } from '@dereekb/rxjs';\nimport { invertMaybeBoolean, type Maybe, type Milliseconds } from '@dereekb/util';\nimport { type DbxListSelectionMode, type DbxListView, type ListSelectionState } from './list.view';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { DbxLoadingComponent } from '../../loading/loading.component';\n\n// MARK: DbxListInternalContentDirective\n/**\n * Internal directive used by {@link DbxListComponent} to track the scrollable content area and forward scroll events.\n *\n * @example\n * ```html\n * <div dbxListInternalContent [hide]=\"hideContent\">...</div>\n * ```\n */\n@Directive({\n  selector: '[dbxListInternalContent]',\n  host: {\n    class: 'd-block dbx-list-content',\n    '[class.dbx-list-content-hidden]': 'hide()'\n  }\n})\nexport class DbxListInternalContentDirective {\n  private readonly parent = inject(DbxListComponent);\n\n  readonly elementRef = inject(ElementRef);\n\n  readonly hide = input<Maybe<boolean>>(false);\n\n  constructor() {\n    this.parent.setInternalContent(this);\n  }\n\n  @HostListener('scroll', ['$event'])\n  onScrollEvent($event: Event): void {\n    const position = ($event.target as Element).scrollTop;\n    this.parent.contentScrolled.emit(position);\n  }\n}\n\n// MARK: DbxList\n/**\n * Direction the scroll was triggered moving.\n */\nexport type DbxListScrollDirectionTrigger = 'up' | 'down';\n\n/**\n * Used to trigger the loading of additional items.\n *\n * If an observable is returned it is used to throttle the loading of more items until it returns.\n */\nexport type DbxListLoadMoreHandler = () => Observable<void> | void;\n\n/**\n * DbxListComponent configuration.\n */\nexport interface DbxListConfig<T = unknown, V extends DbxListView<T> = DbxListView<T>> extends DbxInjectionComponentConfig<V> {\n  /**\n   * Whether or not to hide the list content when it is an empty list.\n   */\n  readonly hideOnEmpty?: boolean;\n\n  /**\n   * Whether or not this list should scroll upward from the bottom, like a message list.\n   */\n  readonly invertedList?: boolean;\n\n  /**\n   * Distance to scroll.\n   */\n  readonly scrollDistance?: number;\n\n  /**\n   * Number of ms to throttle scrolling events.\n   */\n  readonly throttle?: Milliseconds;\n\n  /**\n   * (Optional) onClick handler\n   */\n  readonly onClick?: (value: T) => void;\n\n  /**\n   * (Optional) onSelection handler\n   */\n  readonly onSelectionChange?: (selection: ListSelectionState<T>) => void;\n\n  /**\n   * (Optional) handler function to load more items.\n   */\n  readonly loadMore?: DbxListLoadMoreHandler;\n\n  /**\n   * Default selection list value. If not defined, will default to 'view'.\n   */\n  readonly defaultSelectionMode?: Maybe<DbxListSelectionMode>;\n}\n\n/**\n * Numeric scroll position emitted by the {@link DbxListComponent} when its content area is scrolled.\n */\nexport type DbxListComponentScrolledEventPosition = number;\n\n/**\n * Default infinite scroll distance multiplier for triggering load-more events.\n */\nexport const DEFAULT_DBX_LIST_SCROLL_DISTANCE = 1.5;\n\n/**\n * Default throttle duration in milliseconds for scroll events.\n */\nexport const DEFAULT_DBX_LIST_THROTTLE_SCROLL = 50;\n\n/**\n * Displays a potentially infinitely scrollable list of content. Supports load-more triggers, selection modes, and empty/loading states.\n *\n * This component is typically wrapped by a higher-level component that provides its configuration via the `config` input.\n *\n * @dbxWebComponent\n * @dbxWebSlug list\n * @dbxWebCategory list\n * @dbxWebRelated list-view, list-empty-content, list-grid-view, list-accordion-view, selection-list-view\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-list [state$]=\"items$\" [config]=\"listConfig\"></dbx-list>\n * ```\n *\n * @example\n * ```html\n * <dbx-list [state$]=\"items$\" [config]=\"listConfig\" (contentScrolled)=\"onScroll($event)\"></dbx-list>\n * ```\n */\n@Component({\n  selector: 'dbx-list',\n  templateUrl: './list.component.html',\n  host: {\n    class: 'd-block dbx-list',\n    role: 'list',\n    '[class.dbx-list-padded]': 'padded()'\n  },\n  imports: [DbxInjectionComponent, InfiniteScrollDirective, DbxListInternalContentDirective, DbxLoadingComponent]\n})\nexport class DbxListComponent<T = unknown, V extends DbxListView<T> = DbxListView<T>, S extends ListLoadingState<T> = ListLoadingState<T>> implements OnDestroy {\n  /**\n   * Emitted when content is scrolled.\n   */\n  readonly contentScrolled = output<DbxListComponentScrolledEventPosition>();\n\n  /**\n   * Whether or not to add bottom padding to the list content.\n   */\n  readonly padded = input<boolean>(true);\n\n  readonly state = input<Maybe<Observable<Maybe<S>>>>(undefined);\n  readonly config = input<Maybe<DbxListConfig<T, V>>>(undefined);\n\n  readonly disabled = input<Maybe<boolean>>(false);\n  readonly selectionMode = input<Maybe<DbxListSelectionMode>>(undefined);\n\n  readonly hasMore = input<Maybe<boolean>>(undefined);\n  readonly hasMore$ = toObservable(this.hasMore);\n\n  private readonly _internalContentSignal = signal<Maybe<DbxListInternalContentDirective>>(undefined);\n  readonly nativeElementSignal = computed(() => (this._internalContentSignal()?.elementRef as Maybe<ElementRef<HTMLElement>>)?.nativeElement);\n\n  private readonly _loadMoreTrigger = completeOnDestroy(new Subject<void>());\n  private readonly _scrollTrigger = completeOnDestroy(new Subject<DbxListScrollDirectionTrigger>());\n\n  private readonly _loadMoreSub = cleanSubscription();\n  private readonly _onClickSub = cleanSubscription();\n  private readonly _disabledSub = cleanSubscription();\n  private readonly _selectionModeSub = cleanSubscription();\n  private readonly _onSelectionChangeSub = cleanSubscription();\n\n  readonly currentState$: Observable<Maybe<S>> = toObservable(this.state).pipe(switchMapMaybe());\n  readonly context = listLoadingStateContext<T, S>({ obs: this.currentState$, showLoadingOnNoValue: false });\n\n  readonly hasMoreFromCurrentState$ = this.currentState$.pipe(map(loadingStateHasNextPage));\n  readonly isEnd$ = combineLatest([this.hasMore$, this.hasMoreFromCurrentState$]).pipe(\n    map((x) => invertMaybeBoolean(x[0] ?? x[1])),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly isEmpty$ = this.context.isEmpty$;\n  readonly isEmptyLoading$ = this.context.isEmptyLoading$;\n  readonly isEmptyAndNotLoading$ = this.context.isEmptyAndNotLoading$;\n\n  readonly config$ = toObservable(this.config);\n  readonly disabled$ = toObservable(this.disabled).pipe(map(Boolean), distinctUntilChanged(), shareReplay(1));\n\n  readonly selectionMode$ = toObservable(this.selectionMode).pipe(distinctUntilChanged(), shareReplay(1));\n\n  readonly hideOnEmpty$: Observable<boolean> = this.config$.pipe(\n    filterMaybe(),\n    map((x) => Boolean(x.hideOnEmpty)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly invertedList$: Observable<boolean> = this.config$.pipe(\n    filterMaybe(),\n    map((x) => Boolean(x?.throttle)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly throttleScroll$: Observable<number> = this.config$.pipe(\n    map((x) => x?.throttle ?? DEFAULT_DBX_LIST_THROTTLE_SCROLL),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly scrollDistance$: Observable<number> = this.config$.pipe(\n    map((x) => x?.scrollDistance ?? DEFAULT_DBX_LIST_SCROLL_DISTANCE),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly scrollLoadMoreTrigger$ = this.config$.pipe(\n    switchMap((config) => {\n      const loadNextDirection = config?.invertedList ? 'up' : 'down';\n      return this._scrollTrigger.pipe(filter((x) => x === loadNextDirection));\n    })\n  );\n\n  readonly loadMore$ = merge(this.scrollLoadMoreTrigger$, this._loadMoreTrigger);\n\n  readonly injectedComponentConfig$: Observable<Maybe<DbxInjectionComponentConfig<V>>> = this.config$.pipe(\n    distinctUntilChanged(),\n    map((config) => {\n      let injectedComponentConfig: Maybe<DbxInjectionComponentConfig<V>>;\n\n      if (config) {\n        const { componentClass, init, onClick, onSelectionChange, loadMore, defaultSelectionMode = 'view' } = config;\n\n        injectedComponentConfig = {\n          componentClass: config.componentClass,\n          injector: config.injector,\n          init: (instance: V) => {\n            // Synchronize disabled\n            this._disabledSub.subscription = this.disabled$.subscribe((disabled) => instance.setDisabled(disabled));\n            this._selectionModeSub.subscription = this.selectionMode$.subscribe((selectionMode) => instance.setSelectionMode(selectionMode ?? defaultSelectionMode));\n\n            if (init) {\n              init(instance);\n            }\n\n            instance.setListContext(this.context);\n\n            if (loadMore) {\n              this._loadMoreSub.subscription = this.loadMore$\n                .pipe(\n                  // Throttle additional loading calls using exhaustMap until observable returns, if one is returned.\n                  exhaustMap(() => {\n                    const result = loadMore();\n                    let obs: Observable<void>;\n\n                    if (result) {\n                      obs = result.pipe(catchError(() => of()));\n                    } else {\n                      obs = of();\n                    }\n\n                    return obs;\n                  })\n                )\n                .subscribe();\n            }\n\n            if (onClick) {\n              if (instance.clickValue) {\n                this._onClickSub.subscription = instance.clickValue.subscribe(onClick);\n              } else {\n                console.error(`onClick() was passed to listConfig, but target class ${componentClass} has no clicked event emitter.`);\n              }\n            }\n\n            if (onSelectionChange) {\n              if (instance.selectionChange) {\n                this._onSelectionChangeSub.subscription = instance.selectionChange.subscribe(onSelectionChange);\n              } else {\n                console.error(`onSelectionChange() was passed to listConfig, but target class ${componentClass} has no selectionChange event emitter.`);\n              }\n            }\n          }\n        };\n      }\n\n      return injectedComponentConfig;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly hideContent$: Observable<boolean> = this.context.currentStateStream$.pipe(\n    switchMap(() =>\n      this.context.state$.pipe(\n        filter((x) => isLoadingStateFinishedLoading(x)),\n        first(),\n        startWithBeginLoading()\n      )\n    ),\n    switchMap((state) => {\n      if (state?.loading) {\n        return of(true);\n      }\n\n      return this.hideOnEmpty$.pipe(\n        switchMap((hide) => (hide === false ? of(false) : this.isEmpty$)),\n        distinctUntilChanged(),\n        shareReplay(1)\n      );\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly infiniteScrollDistanceSignal = toSignal(this.scrollDistance$, { initialValue: DEFAULT_DBX_LIST_SCROLL_DISTANCE });\n  readonly infiniteScrollThrottleSignal = toSignal(this.throttleScroll$, { initialValue: DEFAULT_DBX_LIST_THROTTLE_SCROLL });\n  readonly hideContentSignal = toSignal(this.hideContent$);\n  readonly injectedComponentConfigSignal = toSignal(this.injectedComponentConfig$);\n  readonly isEmptyAndNotLoadingSignal = toSignal(this.isEmptyAndNotLoading$);\n  readonly isEmptyLoadingSignal = toSignal(this.isEmptyLoading$);\n  readonly isEndSignal = toSignal(this.isEnd$);\n\n  ngOnDestroy(): void {\n    this.context.destroy();\n  }\n\n  getScrollPositionRelativeToBottom(): number {\n    const element = this.nativeElementSignal();\n    let result = 0;\n\n    if (element) {\n      try {\n        // At max scroll, scrollHeight = scrollTop + clientHeight;\n        const { scrollTop, scrollHeight, clientHeight } = element;\n        result = scrollHeight - (scrollTop + clientHeight);\n      } catch {\n        /* ignored */\n      }\n    }\n\n    return result;\n  }\n\n  jumpToBottom(): void {\n    const element = this.nativeElementSignal();\n\n    if (element) {\n      try {\n        element.scrollTop = element.scrollHeight;\n      } catch {\n        // do nothing.\n      }\n    }\n  }\n\n  jumpToPositionRelativeToBottom(pos: number): void {\n    const element = this.nativeElementSignal();\n\n    if (element) {\n      try {\n        const { scrollHeight, clientHeight } = element;\n        element.scrollTop = scrollHeight - (clientHeight + pos);\n      } catch {\n        // do nothing.\n      }\n    }\n  }\n\n  onScrollDown(): void {\n    this._scrollTrigger.next('down');\n  }\n\n  onScrollUp(): void {\n    this._scrollTrigger.next('up');\n  }\n\n  loadMore(): void {\n    this._loadMoreTrigger.next();\n  }\n\n  // MARK: Internal\n  setInternalContent(content: DbxListInternalContentDirective) {\n    if (this._internalContentSignal() == null) {\n      this._internalContentSignal.set(content);\n    } else {\n      throw new Error('Attempted to set internal content in DbxListComponent when it was already set.');\n    }\n  }\n}\n","<dbx-loading [context]=\"context\" [linear]=\"true\"></dbx-loading>\n<div\n  dbxListInternalContent\n  [hide]=\"hideContentSignal()\"\n  infinite-scroll\n  [infiniteScrollDistance]=\"infiniteScrollDistanceSignal()\"\n  [infiniteScrollUpDistance]=\"infiniteScrollDistanceSignal()\"\n  [infiniteScrollThrottle]=\"infiniteScrollThrottleSignal()\"\n  [scrollWindow]=\"false\"\n  (scrolled)=\"onScrollDown()\"\n  (scrolledUp)=\"onScrollUp()\">\n  <ng-content select=\"[top]\"></ng-content>\n  <dbx-injection [config]=\"injectedComponentConfigSignal()\"></dbx-injection>\n  <ng-content select=\"[bottom]\"></ng-content>\n  @if (isEndSignal()) {\n    <ng-content select=\"[end]\"></ng-content>\n  }\n</div>\n@if (isEmptyAndNotLoadingSignal()) {\n  <ng-content select=\"[empty]\"></ng-content>\n}\n@if (isEmptyLoadingSignal()) {\n  <ng-content select=\"[emptyLoading]\"></ng-content>\n}\n","import { type ListLoadingState, type ObservableOrValue, maybeValueFromObservableOrValue, type MaybeObservableOrValue } from '@dereekb/rxjs';\nimport { BehaviorSubject, map, shareReplay, combineLatest } from 'rxjs';\nimport { Directive, input, output, computed, type Signal, NgModule } from '@angular/core';\nimport { DbxListComponent, type DbxListConfig } from './list.component';\nimport { type DbxListSelectionMode, type DbxListView, type ListSelectionState } from './list.view';\nimport { type Configurable, type Maybe } from '@dereekb/util';\nimport { type DbxListViewWrapper } from './list.wrapper';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\n\n// MARK: Wrapper\n/**\n * Default HTML template for list wrapper components. Passes through state, config, and content projection slots to a child `dbx-list`.\n */\nexport const DEFAULT_LIST_WRAPPER_COMPONENT_CONFIGURATION_TEMPLATE = `\n  <dbx-list [state]=\"currentState$\" [config]=\"configSignal()\" [hasMore]=\"hasMore()\" [disabled]=\"disabledSignal()\" [selectionMode]=\"selectionModeSignal()\">\n    <ng-content top select=\"[top]\"></ng-content>\n    <ng-content bottom select=\"[bottom]\"></ng-content>\n    <ng-content empty select=\"[empty]\"></ng-content>\n    <ng-content emptyLoading select=\"[emptyLoading]\"></ng-content>\n    <ng-content end select=\"[end]\"></ng-content>\n  </dbx-list>`;\n\nconst dbxListWrapperComponentImportsAndExports = [DbxListComponent];\n\n/**\n * Convenience module that imports and exports {@link DbxListComponent} for use in list wrapper component templates.\n */\n@NgModule({\n  exports: dbxListWrapperComponentImportsAndExports,\n  imports: dbxListWrapperComponentImportsAndExports\n})\nexport class DbxListWrapperComponentImportsModule {}\n\n/**\n * Configuration type for list wrapper directives. Omits `onClick` and `loadMore` since the wrapper converts those to output events.\n */\nexport type DbxListWrapperConfig<T, V extends DbxListView<T> = DbxListView<T>> = Omit<DbxListConfig<T, V>, 'onClick' | 'loadMore'>;\n\n/**\n * Abstract base directive for components that wrap a {@link DbxListComponent}. Manages state, config, selection mode,\n * and emits `clickItem` and `loadMore` output events. Extend this to build custom list wrapper components.\n */\n@Directive()\nexport abstract class AbstractDbxListWrapperDirective<T, V extends DbxListView<T> = DbxListView<T>, C extends DbxListWrapperConfig<T, V> = DbxListWrapperConfig<T, V>, S extends ListLoadingState<T> = ListLoadingState<T>> implements DbxListViewWrapper<T, S> {\n  private readonly _config = completeOnDestroy(new BehaviorSubject<MaybeObservableOrValue<C>>(undefined));\n  private readonly _stateOverride = completeOnDestroy(new BehaviorSubject<MaybeObservableOrValue<S>>(undefined));\n  private readonly _selectionModeOverride = completeOnDestroy(new BehaviorSubject<MaybeObservableOrValue<DbxListSelectionMode>>(undefined));\n  private readonly _disabledOverride = completeOnDestroy(new BehaviorSubject<MaybeObservableOrValue<boolean>>(undefined));\n\n  private readonly _selectionModeOverrideSignal = toSignal(this._selectionModeOverride.pipe(maybeValueFromObservableOrValue()));\n  private readonly _disabledOverrideSignal = toSignal(this._disabledOverride.pipe(maybeValueFromObservableOrValue()));\n\n  readonly hasMore = input<Maybe<boolean>>(undefined);\n\n  readonly clickItem = output<T>();\n  readonly loadMore = output<void>();\n\n  readonly disabled = input<Maybe<boolean>>();\n  readonly selectionMode = input<Maybe<DbxListSelectionMode>>();\n  readonly state = input<Maybe<ObservableOrValue<S>>>();\n\n  readonly selectionModeSignal: Signal<Maybe<DbxListSelectionMode>> = computed(() => {\n    const selectionMode = this.selectionMode();\n    return this._selectionModeOverrideSignal() ?? selectionMode;\n  });\n\n  readonly disabledSignal: Signal<Maybe<boolean>> = computed(() => {\n    const disabled = this.disabled();\n    return this._disabledOverrideSignal() ?? disabled;\n  });\n\n  readonly currentState$ = combineLatest([this._stateOverride, toObservable(this.state)]).pipe(\n    map(([stateOverride, state]) => stateOverride ?? state),\n    maybeValueFromObservableOrValue(),\n    shareReplay(1)\n  );\n\n  readonly config$ = this._config.pipe(\n    maybeValueFromObservableOrValue(),\n    map((x: Maybe<C>) => (x ? this._buildListConfig(x) : undefined)),\n    shareReplay(1)\n  );\n\n  readonly configSignal = toSignal(this.config$);\n\n  // eslint-disable-next-line @angular-eslint/prefer-inject\n  constructor(initConfig: ObservableOrValue<C>) {\n    this._config.next(initConfig);\n  }\n\n  setState(stateObs: MaybeObservableOrValue<S>): void {\n    this._stateOverride.next(stateObs);\n  }\n\n  setSelectionMode(selectionMode: MaybeObservableOrValue<DbxListSelectionMode>): void {\n    this._selectionModeOverride.next(selectionMode);\n  }\n\n  setDisabled(disabled: MaybeObservableOrValue<boolean>): void {\n    this._disabledOverride.next(disabled);\n  }\n\n  protected _buildListConfig(config: C): DbxListConfig<T, V> {\n    return {\n      ...config,\n      onClick: (x) => this.clickItem.emit(x),\n      loadMore: () => this.loadMore.emit()\n    };\n  }\n}\n\n// MARK: Selection Wrapper\n/**\n * Configuration type for selection list wrappers. Further omits `onSelectionChange` since the wrapper emits it as an output event.\n */\nexport type DbxSelectionListWrapperConfig<T, V extends DbxListView<T> = DbxListView<T>> = Omit<DbxListWrapperConfig<T, V>, 'onSelectionChange'>;\n\n/**\n * Abstract base directive for list wrappers that also support selection change events. Extends {@link AbstractDbxListWrapperDirective}\n * with a `selectionChange` output that emits whenever the user changes item selection.\n */\n@Directive()\nexport abstract class AbstractDbxSelectionListWrapperDirective<T, V extends DbxListView<T> = DbxListView<T>, C extends DbxSelectionListWrapperConfig<T, V> = DbxSelectionListWrapperConfig<T, V>, S extends ListLoadingState<T> = ListLoadingState<T>> extends AbstractDbxListWrapperDirective<T, V, C, S> {\n  readonly selectionChange = output<ListSelectionState<T>>();\n\n  protected override _buildListConfig(config: C): DbxListConfig<T, V> {\n    const result = super._buildListConfig(config) as Configurable<DbxListConfig<T, V>>;\n    result.onSelectionChange = (x) => this.selectionChange.emit(x);\n    return result;\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxListEmptyContentComponent } from './list.content.empty.component';\nimport { DbxListTitleGroupDirective } from './group/list.view.value.group.title.directive';\nimport { DbxListViewMetaIconComponent } from './meta/list.view.meta.icon.component';\nimport { DbxListModifierModule } from './modifier/list.modifier.module';\n\nconst importsAndExports = [\n  // directives\n  DbxListEmptyContentComponent,\n  DbxListViewMetaIconComponent,\n  DbxListTitleGroupDirective,\n  DbxListModifierModule\n];\n\n/**\n * Contains all supporting list components and directives.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxListModule {}\n","import { type TrackByFunction } from '@angular/core';\nimport { type ModelKeyRef, type UniqueModel } from '@dereekb/util';\n\n/**\n * Angular {@link TrackByFunction} that tracks {@link UniqueModel} items by their `id` property.\n *\n * @param index - The item's index in the iterable.\n * @param model - The model whose `id` is used as the tracking identity.\n * @returns The model's unique `id` value.\n */\nexport const TRACK_BY_MODEL_ID: TrackByFunction<UniqueModel> = (index, model) => model.id;\n\n/**\n * Returns a {@link TrackByFunction} that tracks items by their unique `id` property.\n *\n * @returns A TrackByFunction that uses the item's `id` for identity tracking.\n *\n * @example\n * ```ts\n * readonly trackBy = trackByUniqueIdentifier<MyModel>();\n * ```\n */\nexport function trackByUniqueIdentifier<T extends UniqueModel>(): TrackByFunction<T> {\n  return TRACK_BY_MODEL_ID;\n}\n\n/**\n * Angular {@link TrackByFunction} that tracks {@link ModelKeyRef} items by their `key` property.\n *\n * @param index - The item's index in the iterable.\n * @param model - The model whose `key` is used as the tracking identity.\n * @returns The model's `key` value.\n */\nexport const TRACK_BY_MODEL_KEY: TrackByFunction<ModelKeyRef> = (index, model) => model.key;\n\n/**\n * Returns a {@link TrackByFunction} that tracks items by their model `key` property.\n *\n * @returns A TrackByFunction that uses the item's `key` for identity tracking.\n *\n * @example\n * ```ts\n * readonly trackBy = trackByModelKeyRef<MyModelRef>();\n * ```\n */\nexport function trackByModelKeyRef<T extends ModelKeyRef>(): TrackByFunction<T> {\n  return TRACK_BY_MODEL_KEY;\n}\n","import { map, shareReplay, distinctUntilChanged, of } from 'rxjs';\nimport { Component, computed, input } from '@angular/core';\nimport { MatListModule, MatSelectionList, type MatSelectionListChange } from '@angular/material/list';\nimport { type DbxListSelectionMode, type ListSelectionStateItem } from './list.view';\nimport { type DbxValueListItem, type AbstractDbxValueListViewConfig } from './list.view.value';\nimport { AbstractDbxValueListViewDirective } from './list.view.value.directive';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxValueListViewContentComponent, DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION } from './list.view.value.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { DbxInjectionComponent } from '@dereekb/dbx-core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { dbxValueListItemSeparatorConfigs } from './list.view.value.separator';\n\n/**\n * Configuration for a {@link DbxSelectionValueListViewComponent}. Extends the base config with an option for single or multiple selection.\n */\nexport interface DbxSelectionValueListViewConfig<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> extends AbstractDbxValueListViewConfig<T, I, V> {\n  /**\n   * Whether multiple items can be selected at once. Defaults to true.\n   */\n  readonly multiple?: boolean;\n}\n\n// MARK: DbxSelectionValueListViewContentComponent\n/**\n * Renders a selection-capable list view. In 'select' mode, displays a `mat-selection-list` with checkboxes.\n * In 'view' mode, falls back to the standard {@link DbxValueListViewContentComponent} rendering.\n *\n * @example\n * ```html\n * <dbx-selection-list-view-content [items]=\"items\" [selectionMode]=\"'select'\" [multiple]=\"true\"></dbx-selection-list-view-content>\n * ```\n */\n@Component({\n  selector: 'dbx-selection-list-view-content',\n  template: `\n    @switch (selectionMode()) {\n      @case ('view') {\n        <dbx-list-view-content [items]=\"items()\" [stickyHeaders]=\"stickyHeaders()\" [separatorConfig]=\"separatorConfig()\"></dbx-list-view-content>\n      }\n      @default {\n        <mat-selection-list [disabled]=\"disabledSignal()\" [multiple]=\"multiple()\" (selectionChange)=\"matSelectionChanged($event)\">\n          @for (item of items(); track trackByFunctionSignal()($index, item)) {\n            @if (separatorsSignal()[$index]; as separator) {\n              <div class=\"dbx-list-view-item-separator\">\n                <dbx-injection [config]=\"separator\"></dbx-injection>\n              </div>\n            }\n            <mat-list-option class=\"dbx-list-view-item\" [selected]=\"item.selected\" [disabled]=\"item.disabled\" [value]=\"item.itemValue\" (click)=\"onClickValue(item.itemValue)\">\n              @if (item.icon) {\n                <mat-icon matListItemIcon>{{ item.icon }}</mat-icon>\n              }\n              <dbx-injection [config]=\"item.config\"></dbx-injection>\n            </mat-list-option>\n          }\n          @if (trailingSeparatorSignal(); as trailingSeparator) {\n            <div class=\"dbx-list-view-item-separator\">\n              <dbx-injection [config]=\"trailingSeparator\"></dbx-injection>\n            </div>\n          }\n        </mat-selection-list>\n      }\n    }\n  `,\n  host: {\n    class: 'dbx-list-view dbx-selection-list-view'\n  },\n  imports: [MatSelectionList, MatListModule, MatIconModule, DbxInjectionComponent, DbxValueListViewContentComponent]\n})\nexport class DbxSelectionValueListViewContentComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> extends DbxValueListViewContentComponent<T, I> {\n  readonly multiple = input<Maybe<boolean>>();\n  readonly selectionMode = input<Maybe<DbxListSelectionMode>>();\n  readonly trackByFunctionSignal = toSignal(this.trackBy$, { initialValue: DEFAULT_VALUE_LIST_VIEW_CONTENT_COMPONENT_TRACK_BY_FUNCTION });\n\n  /**\n   * Separators for the 'select' mode list, which renders its items without grouping. The 'view' mode list renders its own.\n   */\n  readonly separatorsSignal = computed(() => dbxValueListItemSeparatorConfigs<T, I>(this.items() ?? [], this.separatorConfig()));\n  readonly trailingSeparatorSignal = computed(() => this.separatorsSignal()[(this.items() ?? []).length]);\n\n  constructor() {\n    super();\n    if (!this.dbxListView.selectionChange) {\n      throw new Error('DbxSelectionValueListViewContentComponent(): Parent dbxListView is missing a required selectionChange output ref.');\n    }\n  }\n\n  matSelectionChanged(selection: MatSelectionListChange): void {\n    const options = selection.source.selectedOptions.selected;\n    const items: ListSelectionStateItem<T>[] = options.map((x) => {\n      const { value: itemValue, selected, disabled } = x;\n      return { itemValue, selected, disabled };\n    });\n\n    // asserted in constructor\n    this.dbxListView.selectionChange?.emit({ items });\n  }\n}\n\n// MARK: DbxSelectionValueListViewComponent\n/**\n * Renders a selection-capable list view using a configuration input. Requires a parent {@link DbxListView} context.\n * Switches between selection mode (with checkboxes) and view mode (standard list) based on the parent's selection mode.\n *\n * @dbxWebComponent\n * @dbxWebSlug selection-list-view\n * @dbxWebCategory list\n * @dbxWebRelated list, list-view\n * @dbxWebSkillRefs dbx__ref__dbx-component-patterns\n * @dbxWebMinimalExample ```html\n * <dbx-selection-list-view [config]=\"rowConfig\"></dbx-selection-list-view>\n * ```\n *\n * @example\n * ```html\n * <dbx-selection-list-view [config]=\"rowConfig\" selectionMode=\"multi\"></dbx-selection-list-view>\n * ```\n */\n@Component({\n  selector: 'dbx-selection-list-view',\n  template: `\n    <dbx-selection-list-view-content [selectionMode]=\"selectionModeSignal()\" [multiple]=\"multipleSignal()\" [items]=\"itemsSignal()\" [stickyHeaders]=\"stickyHeadersSignal() ?? true\" [separatorConfig]=\"separatorConfigSignal()\"></dbx-selection-list-view-content>\n  `,\n  imports: [DbxSelectionValueListViewContentComponent]\n})\nexport class DbxSelectionValueListViewComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>, V = unknown> extends AbstractDbxValueListViewDirective<T, I, V, DbxSelectionValueListViewConfig<T, I, V>> {\n  readonly selectionMode$ = (this.dbxListView.selectionMode$ ?? of('select')).pipe(\n    map((x) => x ?? 'select'),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly selectionModeSignal = toSignal(this.selectionMode$, { initialValue: 'select' });\n  readonly multipleSignal = computed(() => this.config()?.multiple ?? true);\n  readonly stickyHeadersSignal = computed(() => this.config()?.stickyHeaders);\n  readonly separatorConfigSignal = computed(() => this.config()?.separatorConfig);\n}\n","import { Directive, NgModule, output } from '@angular/core';\nimport { type MatSelectionListChange } from '@angular/material/list';\nimport { type ListSelectionState, type ListSelectionStateItem } from './list.view';\nimport { AbstractDbxListViewDirective } from './list.view.directive';\nimport { DbxSelectionValueListViewComponent } from './list.view.value.selection.component';\n\n/**\n * Default template string for selection list view components that renders a `dbx-selection-list-view` with a `config` binding.\n */\nexport const DEFAULT_DBX_SELECTION_VALUE_LIST_COMPONENT_CONFIGURATION_TEMPLATE = '<dbx-selection-list-view [config]=\"config\"></dbx-selection-list-view>';\n\n/**\n * Convenience module that imports and exports {@link DbxSelectionValueListViewComponent}.\n */\n@NgModule({\n  exports: [DbxSelectionValueListViewComponent],\n  imports: [DbxSelectionValueListViewComponent]\n})\nexport class DbxSelectionValueListViewComponentImportsModule {}\n\n// MARK: Selection List View\n/**\n * Abstract list view directive with built-in selection change support. Converts Angular Material {@link MatSelectionListChange}\n * events into {@link ListSelectionState} emissions. Extend this for list views that need item selection.\n */\n@Directive()\nexport abstract class AbstractDbxSelectionListViewDirective<T> extends AbstractDbxListViewDirective<T> {\n  readonly selectionChange = output<ListSelectionState<T>>();\n\n  selectionChanged(selection: ListSelectionState<T>): void {\n    this.selectionChange.emit(selection);\n  }\n\n  matSelectionChanged(selection: MatSelectionListChange): void {\n    const options = selection.source.selectedOptions.selected;\n    const items: ListSelectionStateItem<T>[] = options.map((x) => {\n      const { value: itemValue, selected, disabled } = x;\n      return { itemValue, selected, disabled };\n    });\n\n    this.selectionChanged({ items });\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { type DbxValueListItem, DBX_VALUE_LIST_VIEW_ITEM } from './list.view.value';\nimport { type ClickableAnchor } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Abstract base component for individual list item views. Automatically injects the current {@link DbxValueListItem}\n * via the {@link DBX_VALUE_LIST_VIEW_ITEM} token and provides convenient accessors for item properties.\n *\n * Extend this to create custom item rendering components used within value list views.\n */\n@Directive()\nexport abstract class AbstractDbxValueListViewItemComponent<T, I extends DbxValueListItem<T> = DbxValueListItem<T>> {\n  readonly item = inject<I>(DBX_VALUE_LIST_VIEW_ITEM);\n\n  get itemValue(): T {\n    return this.item.itemValue;\n  }\n\n  get itemIcon(): string | undefined {\n    return this.item.icon;\n  }\n\n  get itemDisabled(): boolean | undefined {\n    return this.item.disabled;\n  }\n\n  get itemRippleDisabled(): boolean | undefined {\n    return this.item.rippleDisabled;\n  }\n\n  get itemSelected(): boolean | undefined {\n    return this.item.selected;\n  }\n\n  get itemAnchor(): Maybe<ClickableAnchor> | undefined {\n    return this.item.anchor;\n  }\n}\n","import { type Observable } from 'rxjs';\nimport { type ListLoadingState, type MaybeObservableOrValue } from '@dereekb/rxjs';\nimport { forwardRef, type OutputRef, type Provider, type Type } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxListSelectionMode } from './list.view';\n\n/**\n * Common interface for views that may wrap a DbxListView, and pass values through to it.\n */\nexport abstract class DbxListViewWrapper<T = unknown, S extends ListLoadingState<T> = ListLoadingState<T>> {\n  abstract readonly currentState$: Observable<Maybe<S>>;\n  abstract readonly loadMore?: OutputRef<void>;\n  /**\n   * Sets/overrides the state for this view.\n   */\n  abstract setState(state: MaybeObservableOrValue<S>): void;\n  /**\n   * Sets/overrides the selection mode for this view.\n   */\n  abstract setSelectionMode(selectionMode: MaybeObservableOrValue<DbxListSelectionMode>): void;\n}\n\n/**\n * Registers a component as a {@link DbxListViewWrapper} provider for dependency injection.\n *\n * @param sourceType - The component class to register as the DbxListViewWrapper provider.\n * @returns Array of Angular providers that wire up the component as a DbxListViewWrapper.\n *\n * @Component ({\n *   providers: provideDbxListViewWrapper(MyListWrapperComponent)\n * })\n * export class MyListWrapperComponent extends DbxListViewWrapper<MyItem> { ... }\n * ```\n *\n * @example\n * ```ts\n */\nexport function provideDbxListViewWrapper<V extends DbxListViewWrapper>(sourceType: Type<V>): Provider[] {\n  return [\n    {\n      provide: DbxListViewWrapper,\n      useExisting: forwardRef(() => sourceType)\n    }\n  ];\n}\n","import { Component, computed, input, output } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type DbxButtonStyle } from '../../button/button';\n\n/**\n * Default style for the intro action button.\n */\nexport const DEFAULT_INTRO_ACTION_SECTION_BUTTON_STYLE: DbxButtonStyle = { type: 'raised', color: 'accent' };\n\n/**\n * Displays an introductory message with a call-to-action button. When the button is clicked,\n * the intro is replaced by the projected content. Useful for onboarding or first-time-use flows.\n *\n * @dbxWebComponent\n * @dbxWebSlug intro-action-section\n * @dbxWebCategory feedback\n * @dbxWebRelated section, list-empty-content\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-intro-action-section hint=\"Welcome\" action=\"Start\"><p>Body</p></dbx-intro-action-section>\n * ```\n *\n * @example\n * ```html\n * <dbx-intro-action-section\n *   hint=\"Welcome! Click below to get started.\"\n *   action=\"Get Started\"\n *   [showIntro]=\"!hasOnboarded\"\n *   (showAction)=\"markOnboarded()\">\n *   <p>Main content shown after the action.</p>\n * </dbx-intro-action-section>\n * ```\n */\n@Component({\n  selector: 'dbx-intro-action-section',\n  template: `\n    <div class=\"dbx-intro-action-section\">\n      @switch (showIntro()) {\n        @case (true) {\n          <div class=\"dbx-intro-action-section-intro\">\n            <p>{{ hint() }}</p>\n            <div>\n              <ng-content select=\"[info]\"></ng-content>\n            </div>\n            <div>\n              <dbx-button [buttonStyle]=\"buttonStyleSignal()\" [text]=\"action()\" (buttonClick)=\"actionClicked()\"></dbx-button>\n            </div>\n          </div>\n        }\n        @case (false) {\n          <ng-content></ng-content>\n        }\n      }\n    </div>\n  `,\n  imports: [DbxButtonComponent]\n})\nexport class DbxIntroActionSectionComponent {\n  readonly hint = input<Maybe<string>>();\n  readonly showIntro = input<Maybe<boolean>>(true);\n  readonly action = input<Maybe<string>>();\n\n  /**\n   * (Optional) Style for the action button.\n   *\n   * Defaults to {@link DEFAULT_INTRO_ACTION_SECTION_BUTTON_STYLE}. Set a `color` here to paint the button with an\n   * arbitrary {@link DbxColorInput} (including a registered color template) rather than the default accent palette.\n   */\n  readonly buttonStyle = input<Maybe<DbxButtonStyle>>();\n\n  readonly buttonStyleSignal = computed(() => this.buttonStyle() ?? DEFAULT_INTRO_ACTION_SECTION_BUTTON_STYLE);\n\n  readonly showAction = output<void>();\n\n  actionClicked() {\n    this.showAction.emit();\n  }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { DbxSectionHeaderComponent } from './section.header.component';\n\n/**\n * Scroll locking modes for a section page.\n *\n * - `'all'` - The entire header and body scroll together.\n * - `'body'` - The header stays fixed while the body scrolls.\n * - `'locked'` - All overflow is hidden and scrolling is disabled.\n */\nexport type DbxSectionPageScrollLockedMode = 'all' | 'body' | 'locked';\n\n/**\n * Renders a full page section with a header (defaulting to h2) and scrollable body area.\n * Supports nested section pages that retain proper fixed-height layout. Use for top-level\n * page content that needs a prominent heading.\n *\n * @dbxWebComponent\n * @dbxWebSlug section-page\n * @dbxWebCategory layout\n * @dbxWebRelated section, content-page\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks, dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <dbx-section-page header=\"Page\"><p>Body</p></dbx-section-page>\n * ```\n *\n * @example\n * ```html\n * <dbx-section-page header=\"Dashboard\" icon=\"dashboard\" scroll=\"body\">\n *   <p>Top-level page content.</p>\n * </dbx-section-page>\n * ```\n */\n@Component({\n  selector: 'dbx-section-page',\n  template: `\n    <div class=\"dbx-section-header\" [h]=\"headerConfigSignal().h ?? 2\" [header]=\"headerConfigSignal().header\" [onlyHeader]=\"headerConfigSignal().onlyHeader\" [icon]=\"headerConfigSignal().icon\" [hint]=\"headerConfigSignal().hint\" [hintInline]=\"headerConfigSignal().hintInline\">\n      <ng-content select=\"[sectionHeader]\"></ng-content>\n    </div>\n    <div class=\"dbx-section-page-content\">\n      <ng-content></ng-content>\n    </div>\n  `,\n  host: {\n    class: 'd-block dbx-content-page dbx-section-page',\n    '[class]': 'classConfigSignal()'\n  },\n  imports: [DbxSectionHeaderComponent]\n})\nexport class DbxSectionPageComponent extends DbxSectionHeaderComponent {\n  readonly scroll = input<DbxSectionPageScrollLockedMode>('all');\n\n  readonly classConfigSignal = computed(() => {\n    return `dbx-section-page-scroll-${this.scroll()}`;\n  });\n\n  constructor() {\n    super();\n    this.hintInlineDefault.set(true);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxSectionComponent } from './section.component';\nimport { DbxSubSectionComponent } from './subsection.component';\nimport { DbxSectionPageComponent } from './section.page.component';\nimport { DbxIntroActionSectionComponent } from './section.intro.component';\nimport { DbxSectionHeaderComponent } from './section.header.component';\n\nconst importsAndExports = [DbxSectionHeaderComponent, DbxSectionPageComponent, DbxSectionComponent, DbxSubSectionComponent, DbxIntroActionSectionComponent];\n\n/**\n * Bundles all section layout components including section headers, sections, subsections,\n * section pages, and the intro action section for convenient import.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxSectionLayoutModule {}\n","import { DASH_CHARACTER_PREFIX_INSTANCE, type Destroyable, type Maybe } from '@dereekb/util';\nimport { asObservable, filterMaybe, type ObservableOrValue } from '@dereekb/rxjs';\nimport { BehaviorSubject, type Observable, combineLatest, distinctUntilChanged, map, of, switchMap, shareReplay } from 'rxjs';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { DBX_DARK_STYLE_CLASS_SUFFIX, type DbxStyleApplication, type DbxStyleClass, dbxStyleClassCleanSuffix, type DbxStyleClassCleanSuffix, type DbxStyleClassSuffix, type DbxStyleConfig, type DbxStyleSupplement } from './style';\n\n/**\n * Injection token for providing the default {@link DbxStyleConfig} to {@link DbxStyleService}.\n */\nexport const DEFAULT_DBX_STYLE_CONFIG_TOKEN = new InjectionToken('DbxStyleServiceDefaultConfig');\n\n/**\n * Manages application-wide style classes and suffix modes (e.g., dark mode).\n *\n * Consumers can set a default style config, override it with an observable config,\n * and toggle style suffixes to switch between style variants at runtime.\n *\n * Provided via `provideDbxStyleService()` from `style.providers`.\n *\n * @dbxWebComponent\n * @dbxWebSlug style-service\n * @dbxWebCategory layout\n * @dbxWebRelated style, set-style, style-body, color-service\n *\n * @example\n * ```ts\n * const styleService = inject(DbxStyleService);\n * styleService.toggleDarkSuffix();           // toggle dark mode on/off\n * styleService.setStyleClassSuffix('dark');  // force dark mode\n * ```\n */\n@Injectable()\nexport class DbxStyleService implements Destroyable {\n  private readonly _defaultConfig = new BehaviorSubject<Maybe<DbxStyleConfig>>(inject<DbxStyleConfig>(DEFAULT_DBX_STYLE_CONFIG_TOKEN));\n\n  private readonly _config = new BehaviorSubject<Maybe<Observable<DbxStyleConfig>>>(undefined);\n  private readonly _styleClassSuffix = new BehaviorSubject<Maybe<DbxStyleClassCleanSuffix>>(undefined);\n  private readonly _supplement = new BehaviorSubject<Maybe<Observable<Maybe<DbxStyleSupplement>>>>(undefined);\n\n  readonly config$ = this._config.pipe(\n    switchMap((x) => x ?? this._defaultConfig),\n    filterMaybe(),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly styleClassSuffix$ = this._styleClassSuffix.pipe(distinctUntilChanged(), shareReplay(1));\n  readonly styleClassName$ = this.getStyleClassWithConfig(this.config$);\n\n  /**\n   * The currently active style supplement, or undefined when none is set.\n   */\n  readonly supplement$: Observable<Maybe<DbxStyleSupplement>> = this._supplement.pipe(\n    switchMap((x) => x ?? of(undefined)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * The flattened body application: the root style class plus any supplement classes, alongside the supplement inline styles.\n   */\n  readonly styleApplication$: Observable<DbxStyleApplication> = combineLatest([this.styleClassName$, this.supplement$]).pipe(\n    map(([styleClassName, supplement]) => ({\n      classes: [styleClassName, ...(supplement?.classes ?? [])],\n      style: supplement?.style ?? {}\n    })),\n    shareReplay(1)\n  );\n\n  /**\n   * Returns the style class given the input configuration.\n   *\n   * @param configObs - Observable containing the configuration to use.\n   * @returns DbxStyleClass.\n   */\n  getStyleClassWithConfig(configObs: Observable<DbxStyleConfig>): Observable<DbxStyleClass> {\n    return combineLatest([configObs, this.styleClassSuffix$]).pipe(\n      map(([config, suffix]) => {\n        let styleClass = config.style;\n\n        if (suffix != null && config.suffixes?.has(suffix)) {\n          styleClass = `${styleClass}${DASH_CHARACTER_PREFIX_INSTANCE.prefixSuffixString(suffix)}`;\n        }\n\n        return styleClass;\n      }),\n      distinctUntilChanged(),\n      shareReplay(1)\n    );\n  }\n\n  /**\n   * Toggles the dark suffix on/off for the service.\n   *\n   * @param toggle - Whether to toggle the suffix on or off.\n   */\n  toggleDarkSuffix(toggle?: Maybe<boolean>) {\n    this.toggleSuffix(DBX_DARK_STYLE_CLASS_SUFFIX, toggle);\n  }\n\n  /**\n   * Toggles the arbitrary suffix on/off for the service.\n   *\n   * @param suffix - The suffix to toggle.\n   * @param toggle - Whether to toggle the suffix on or off.\n   */\n  toggleSuffix(suffix: DbxStyleClassSuffix, toggle?: Maybe<boolean>) {\n    // clean the suffix\n    suffix = dbxStyleClassCleanSuffix(suffix);\n\n    const toggleValue: boolean = toggle == null ? this.currentStyleClassSuffix !== suffix : toggle;\n    let suffixValue: Maybe<DbxStyleClassSuffix> = undefined;\n\n    if (toggleValue) {\n      suffixValue = suffix;\n    } else {\n      suffixValue = undefined;\n    }\n\n    this._styleClassSuffix.next(suffixValue);\n  }\n\n  /**\n   * Returns the current style class suffix, if one is set.\n   *\n   * @returns The currently active style class suffix, or undefined if none is set.\n   */\n  get currentStyleClassSuffix(): Maybe<DbxStyleClassCleanSuffix> {\n    return this._styleClassSuffix.value;\n  }\n\n  /**\n   * Directly sets the active style class suffix, or clears it if null/undefined.\n   *\n   * @param suffix - The suffix to activate, or nullish to clear the current suffix.\n   */\n  setStyleClassSuffix(suffix: Maybe<DbxStyleClassSuffix>) {\n    this._styleClassSuffix.next(suffix ? dbxStyleClassCleanSuffix(suffix) : undefined);\n  }\n\n  /**\n   * Updates the default style configuration used when no override config is set.\n   *\n   * @param defaultConfig - The style configuration to use as the new default.\n   */\n  setDefaultConfig(defaultConfig: DbxStyleConfig) {\n    this._defaultConfig.next(defaultConfig);\n  }\n\n  /**\n   * Overrides the active style configuration with the given value or observable.\n   *\n   * @param config - A style configuration value or observable to set as the active override.\n   */\n  setConfig(config: ObservableOrValue<DbxStyleConfig>) {\n    this._config.next(asObservable(config));\n  }\n\n  /**\n   * Clears the active config override if it matches the given reference, reverting to the default config.\n   *\n   * @param config - The config reference to compare against the current override.\n   */\n  unsetConfig(config: ObservableOrValue<DbxStyleConfig>) {\n    if (this._config.value === config) {\n      this._config.next(undefined);\n    }\n  }\n\n  /**\n   * Sets the active style supplement (classes + inline styles) layered on top of the configured style on the body.\n   *\n   * @param supplement - A supplement value or observable, or nullish to clear the current supplement.\n   */\n  setSupplement(supplement: Maybe<ObservableOrValue<Maybe<DbxStyleSupplement>>>) {\n    this._supplement.next(supplement == null ? undefined : asObservable(supplement));\n  }\n\n  /**\n   * Clears the active supplement if it matches the given reference.\n   *\n   * @param supplement - The supplement reference to compare against the current supplement.\n   */\n  unsetSupplement(supplement: ObservableOrValue<Maybe<DbxStyleSupplement>>) {\n    if (this._supplement.value === supplement) {\n      this._supplement.next(undefined);\n    }\n  }\n\n  destroy(): void {\n    this._defaultConfig.complete();\n    this._config.complete();\n    this._styleClassSuffix.complete();\n    this._supplement.complete();\n  }\n}\n","import { cleanSubscription } from '@dereekb/dbx-core';\nimport { splitCommaSeparatedStringToSet, type Maybe } from '@dereekb/util';\nimport { type Observable, distinctUntilChanged, map, shareReplay, delay, combineLatest, type Subscription } from 'rxjs';\nimport { filterMaybe } from '@dereekb/rxjs';\nimport { Directive, inject, signal, input, effect, type OnDestroy } from '@angular/core';\nimport { DbxStyleService } from './style.service';\nimport { type DbxStyleConfig, type DbxStyleClass, type DbxStyleName } from './style';\nimport { toObservable } from '@angular/core/rxjs-interop';\n\n/**\n * Determines how the style is applied by {@link DbxSetStyleDirective}.\n *\n * - `'global'` - Sets the style on the parent {@link DbxStyleService} for the entire app.\n * - `'self'` - Applies the style class only to the host element.\n * - `'both'` - Applies the style both globally and to the host element.\n */\nexport type DbxSetStyleMode = 'both' | 'global' | 'self';\n\n/**\n * Sets the active application style for child elements and/or the global {@link DbxStyleService}.\n *\n * Accepts a {@link DbxStyleName} and optional suffixes, then applies the computed style class\n * depending on the configured {@link DbxSetStyleMode}.\n *\n * @dbxWebComponent\n * @dbxWebSlug set-style\n * @dbxWebCategory layout\n * @dbxWebRelated style, style-service, style-body\n * @dbxWebMinimalExample ```html\n * <div [dbxSetStyle]=\"'my-app'\"></div>\n * ```\n *\n * @example\n * ```html\n * <div [dbxSetStyle]=\"'my-app'\" [setStyleMode]=\"'both'\" [suffixes]=\"'dark'\">\n *   <!-- Children inherit 'my-app' or 'my-app-dark' styling -->\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxSetStyle]',\n  host: {\n    class: 'dbx-style-root',\n    '[class]': 'outputStyleClassSignal()'\n  }\n})\nexport class DbxSetStyleDirective implements OnDestroy {\n  private readonly _styleService = inject(DbxStyleService);\n\n  /**\n   * The mode for the style.\n   *\n   * - global: The style will be set on the parent DbxStyleService.\n   * - self: The style will be applied to the host element.\n   */\n  readonly setStyleMode = input<DbxSetStyleMode>('self');\n\n  /**\n   * The input DbxStyleName to style the host element with.\n   */\n  readonly dbxSetStyle = input<DbxStyleName>();\n\n  /**\n   * The input suffixes to allow to be applied to the\n   */\n  readonly suffixes = input<Maybe<string>>(undefined);\n\n  /**\n   * The output style class to apply to the host element.\n   */\n  readonly outputStyleClassSignal = signal<DbxStyleClass>('');\n\n  readonly style$ = toObservable(this.dbxSetStyle).pipe(filterMaybe());\n  readonly suffixes$ = toObservable(this.suffixes).pipe(distinctUntilChanged(), map(splitCommaSeparatedStringToSet));\n\n  readonly config$: Observable<DbxStyleConfig> = combineLatest([this.style$, this.suffixes$]).pipe(\n    map(([style, suffixes]) => ({ style, suffixes })),\n    shareReplay(1)\n  );\n\n  readonly styleClass$: Observable<DbxStyleClass> = this._styleService.getStyleClassWithConfig(this.config$);\n\n  readonly _outputStyleClassSubscription = cleanSubscription();\n\n  protected readonly _modeEffect = effect(() => {\n    const mode = this.setStyleMode();\n    let nextOutputStyleClassSubscription: Maybe<Subscription>;\n\n    if (mode === 'self' || mode === 'both') {\n      nextOutputStyleClassSubscription = this.styleClass$.pipe(delay(0)).subscribe((style) => {\n        this.outputStyleClassSignal.set(style);\n      });\n    }\n\n    this._outputStyleClassSubscription.setSub(nextOutputStyleClassSubscription);\n\n    if (mode === 'global' || mode === 'both') {\n      this._styleService.setConfig(this.config$);\n    } else {\n      this._styleService.unsetConfig(this.config$);\n    }\n  });\n\n  ngOnDestroy() {\n    // clear/unset this config if it is still set\n    this._styleService.unsetConfig(this.config$);\n  }\n}\n","import { Directive, inject, signal } from '@angular/core';\nimport { DbxStyleService } from './style.service';\nimport { cleanSubscription } from '@dereekb/dbx-core';\nimport { delay } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxStyleClass } from './style';\n\n/**\n * Applies the current application style class from {@link DbxStyleService} to the host element.\n *\n * Use this directive to propagate the active style class onto any element or component.\n *\n * @dbxWebComponent\n * @dbxWebSlug style\n * @dbxWebCategory layout\n * @dbxWebRelated style-service, style-body, set-style\n * @dbxWebMinimalExample ```html\n * <div dbxStyle></div>\n * ```\n *\n * @example\n * ```html\n * <div dbxStyle>Styled content</div>\n * ```\n */\n@Directive({\n  selector: 'dbx-style, [dbxStyle], .dbx-style',\n  host: {\n    '[class]': 'styleClassNameSignal()'\n  }\n})\nexport class DbxStyleDirective {\n  private readonly _styleService = inject(DbxStyleService);\n\n  readonly styleClassNameSignal = signal<Maybe<DbxStyleClass>>(undefined);\n\n  constructor() {\n    cleanSubscription(\n      this._styleService.styleClassName$.pipe(delay(0)).subscribe((classes) => {\n        this.styleClassNameSignal.set(classes);\n      })\n    );\n  }\n}\n","import { Directive, Renderer2, inject } from '@angular/core';\nimport { DbxStyleService } from './style.service';\nimport { cleanSubscription } from '@dereekb/dbx-core';\nimport { delay } from 'rxjs';\nimport { type CssClass } from '@dereekb/util';\n\n/**\n * Applies the current {@link DbxStyleService} body application — the active style class, any supplement classes, and\n * supplement inline styles (CSS custom properties) — to the document `<body>` element.\n *\n * Place this directive on a root-level element so that the body tag receives the active style.\n *\n * @dbxWebComponent\n * @dbxWebSlug style-body\n * @dbxWebCategory layout\n * @dbxWebRelated style, style-service, set-style\n * @dbxWebMinimalExample ```html\n * <div dbxStyleBody></div>\n * ```\n *\n * @example\n * ```html\n * <div dbxStyleBody></div>\n * ```\n */\n@Directive({\n  selector: '[dbxStyleBody]'\n})\nexport class DbxStyleBodyDirective {\n  private readonly _styleService = inject(DbxStyleService);\n  private readonly _renderer = inject(Renderer2);\n\n  private _classes: CssClass[] = [];\n  private _styleKeys: string[] = [];\n\n  constructor() {\n    cleanSubscription(\n      this._styleService.styleApplication$.pipe(delay(0)).subscribe((application) => {\n        const nextClasses = application.classes.filter(Boolean);\n        const nextClassSet = new Set(nextClasses);\n\n        // Diff classes: remove ones no longer present, add new ones.\n        this._classes.forEach((currentClass) => {\n          if (!nextClassSet.has(currentClass)) {\n            this._renderer.removeClass(document.body, currentClass);\n          }\n        });\n\n        const currentClassSet = new Set(this._classes);\n\n        nextClasses.forEach((nextClass) => {\n          if (!currentClassSet.has(nextClass)) {\n            this._renderer.addClass(document.body, nextClass);\n          }\n        });\n\n        this._classes = nextClasses;\n\n        // Diff inline styles: custom properties (e.g. --mat-sys-*) require setProperty/removeProperty.\n        const bodyStyle = document.body.style;\n        const nextStyle = application.style;\n        const nextStyleKeys = Object.keys(nextStyle).filter((key) => nextStyle[key] != null);\n        const nextStyleKeySet = new Set(nextStyleKeys);\n\n        this._styleKeys.forEach((currentKey) => {\n          if (!nextStyleKeySet.has(currentKey)) {\n            bodyStyle.removeProperty(currentKey);\n          }\n        });\n\n        nextStyleKeys.forEach((key) => {\n          bodyStyle.setProperty(key, String(nextStyle[key]));\n        });\n\n        this._styleKeys = nextStyleKeys;\n      })\n    );\n  }\n}\n","import { DbxSetStyleDirective } from './style.set.directive';\nimport { DbxStyleDirective } from './style.directive';\nimport { NgModule } from '@angular/core';\nimport { DbxSpacerDirective } from './spacer.directive';\nimport { DbxStyleBodyDirective } from './style.body.directive';\nimport { DbxColorDirective } from './style.color.directive';\n\nconst importsAndExports = [DbxColorDirective, DbxSpacerDirective, DbxStyleDirective, DbxSetStyleDirective, DbxStyleBodyDirective];\n\n/**\n * Angular module that bundles all style-related directives: {@link DbxColorDirective}, {@link DbxSpacerDirective},\n * {@link DbxStyleDirective}, {@link DbxSetStyleDirective}, and {@link DbxStyleBodyDirective}.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxStyleLayoutModule {}\n","import { type EnvironmentProviders, makeEnvironmentProviders, type Provider } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DEFAULT_DBX_STYLE_CONFIG_TOKEN, DbxStyleService } from './style.service';\nimport { DbxColorService, DbxColorServiceConfig } from './style.color.service';\nimport { type DbxStyleConfig } from './style';\n\n/**\n * Configuration for provideDbxStyleService().\n */\nexport interface ProvideDbxStyleServiceConfig {\n  /**\n   * Default style configuration, if applicable.\n   *\n   * If null, the DbxStyleService will not have a default style\n   */\n  readonly dbxStyleConfig: Maybe<DbxStyleConfig>;\n  /**\n   * Optional initial configuration for the {@link DbxColorService}.\n   *\n   * When provided, seeds the color service with the supplied templates.\n   */\n  readonly dbxColorServiceConfig?: Maybe<DbxColorServiceConfig>;\n}\n\n/**\n * Provides environment-level providers for {@link DbxStyleService}, {@link DbxColorService}, and their default configurations.\n *\n * @param config - Configuration specifying the default style and optional color templates.\n * @returns Environment providers for the style and color services and their default config tokens.\n *\n * @example\n * ```ts\n * provideDbxStyleService({\n *   dbxStyleConfig: { style: 'my-app', suffixes: new Set(['dark']) },\n *   dbxColorServiceConfig: {\n *     templates: [{ key: 'brand-positive', config: { color: '#1f9b59', contrast: 'white', tone: 18 } }]\n *   }\n * });\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function provideDbxStyleService(config: ProvideDbxStyleServiceConfig): EnvironmentProviders {\n  const { dbxStyleConfig, dbxColorServiceConfig } = config;\n\n  const providers: Provider[] = [\n    // config\n    {\n      provide: DEFAULT_DBX_STYLE_CONFIG_TOKEN,\n      useValue: dbxStyleConfig\n    },\n    // services\n    DbxStyleService,\n    DbxColorService\n  ];\n\n  if (dbxColorServiceConfig) {\n    providers.push({\n      provide: DbxColorServiceConfig,\n      useValue: dbxColorServiceConfig\n    });\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe, type UnitedStatesAddressWithContact } from '@dereekb/util';\n\n/**\n * Displays a formatted United States address with optional contact fields (name, phone).\n *\n * @example\n * ```html\n * <dbx-us-address [address]=\"{ name: 'John', line1: '123 Main St', city: 'Austin', state: 'TX', zip: '78701' }\"></dbx-us-address>\n * ```\n */\n// oxfmt-ignore\n@Component({\n  selector: 'dbx-us-address',\n  template: `\n    @if (address()) {\n      @if (address()?.name) {\n        <div class=\"addr-name\">{{ address()?.name }}</div>\n      }\n      @if (address()?.phone) {\n        <div class=\"addr-phone\">{{ address()?.phone }}</div>\n      }\n      @if (address()?.line1) {\n        <div class=\"addr-line1\">{{ address()?.line1 }}</div>\n      }\n      @if (address()?.line2) {\n        <div class=\"addr-line2\">{{ address()?.line2 }}</div>\n      }\n      <div class=\"city-state-zip\">\n        <span class=\"addr-city\">{{ address()?.city }}</span>\n        @if (address()?.state || address()?.zip) {\n          <span>, </span>\n        }\n        <span class=\"addr-state\">{{ address()?.state }} </span>\n        <span class=\"addr-zip\">{{ address()?.zip }}</span>\n      </div>\n    }\n  `,\n  host: {\n    class: 'dbx-us-address'\n  }\n})\nexport class DbxUnitedStatesAddressComponent {\n\n  readonly address = input<Maybe<Partial<UnitedStatesAddressWithContact>>>()\n\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Header row for a detail block, displaying an optional icon and label with projected content.\n *\n * Used internally by {@link DbxDetailBlockComponent} but can also be used standalone.\n *\n * @example\n * ```html\n * <dbx-detail-block-header icon=\"email\" header=\"Contact\">\n *   <button mat-button>Edit</button>\n * </dbx-detail-block-header>\n * ```\n */\n@Component({\n  selector: 'dbx-detail-block-header',\n  template: `\n    @if (icon()) {\n      <mat-icon>{{ icon() }}</mat-icon>\n    }\n    @if (header()) {\n      <span class=\"dbx-detail-block-header-label\">{{ header() }}</span>\n    }\n    @if (alignHeader()) {\n      <div class=\"dbx-flex dbx-w100\">\n        <span class=\"dbx-spacer\"></span>\n        <ng-template *ngTemplateOutlet=\"content\"></ng-template>\n      </div>\n    } @else {\n      <ng-template *ngTemplateOutlet=\"content\"></ng-template>\n    }\n    <ng-template #content>\n      <ng-content></ng-content>\n    </ng-template>\n  `,\n  host: {\n    class: 'dbx-detail-block-header',\n    '[class]': '{ \"dbx-detail-block-header-no-icon\": !icon(), \"dbx-detail-block-header-align\": alignHeader() }'\n  },\n  imports: [MatIconModule, NgTemplateOutlet]\n})\nexport class DbxDetailBlockHeaderComponent {\n  readonly icon = input<Maybe<string>>();\n  readonly header = input<Maybe<string>>();\n  readonly alignHeader = input<boolean>(false);\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxDetailBlockHeaderComponent } from './detail.block.header.component';\n\n/**\n * A structured content block with a header row (icon + label) and a detail content area below.\n *\n * Use the `[header]` content slot for extra header-level content and default content for the detail area.\n *\n * The component provides the structure only. Add the `dbx-detail-block-tile` class for the tile styling: the icon in a\n * round tile beside the content, an uppercase label, and `dbx-detail-block-tile-value` / `dbx-detail-block-tile-hint`\n * lines for the value and its supporting text.\n *\n * @dbxWebComponent\n * @dbxWebSlug detail-block\n * @dbxWebCategory text\n * @dbxWebRelated label-block\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-detail-block header=\"Label\">Body</dbx-detail-block>\n * ```\n *\n * @example\n * ```html\n * <dbx-detail-block header=\"Email\" icon=\"mail\">\n *   <p>{{ user.email }}</p>\n * </dbx-detail-block>\n * ```\n *\n * @example\n * ```html\n * <dbx-detail-block class=\"dbx-detail-block-tile\" header=\"Hours\" icon=\"schedule\">\n *   <span class=\"dbx-detail-block-tile-value\">7:45 AM – 3:30 PM</span>\n *   <span class=\"dbx-detail-block-tile-hint\">Full day · 8 hrs</span>\n * </dbx-detail-block>\n * ```\n */\n@Component({\n  selector: 'dbx-detail-block',\n  template: `\n    <dbx-detail-block-header [icon]=\"icon()\" [header]=\"header()\" [alignHeader]=\"alignHeader()\">\n      <ng-content select=\"[header]\"></ng-content>\n    </dbx-detail-block-header>\n    <div class=\"dbx-detail-block-content\">\n      <ng-content></ng-content>\n    </div>\n  `,\n  host: {\n    class: 'dbx-detail-block d-block',\n    '[class.dbx-detail-block-big-header]': 'bigHeader()'\n  },\n  imports: [DbxDetailBlockHeaderComponent]\n})\nexport class DbxDetailBlockComponent {\n  readonly icon = input<Maybe<string>>();\n  readonly header = input<Maybe<string>>();\n  readonly alignHeader = input<boolean>(false);\n  readonly bigHeader = input<boolean>(false);\n}\n","import { Component, input } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { type Maybe } from '@dereekb/util';\n\n/**\n * Rounded, padded leading-icon tile. Renders a `<mat-icon>` from the\n * `icon` input centered inside a flex tile, or projects custom content\n * when `icon` is not supplied. Apply `[dbxColor]` (optionally with\n * `[dbxColorTone]`) directly on the host to give the tile a tonal or\n * full-color background — the tile itself sets layout only.\n *\n * Set `[round]=\"true\"` to apply the `dbx-icon-tile-round` modifier and\n * render a circle instead of the default 12px-rounded square.\n *\n * Equivalent to writing `<div dbxIconTile [dbxColor]=\"'…'\"><mat-icon>…</mat-icon></div>`,\n * but with the icon name as a single input. Backed by the same\n * `dbx-icon-tile` host class as {@link DbxIconTileDirective}, so the CSS\n * utility, the directive form, and this component all share styling.\n *\n * Sizing, padding, border radius, font, and inner `.mat-icon` size are\n * all configurable via CSS custom properties on the host:\n * `--dbx-icon-tile-width`, `--dbx-icon-tile-height`,\n * `--dbx-icon-tile-min-width`, `--dbx-icon-tile-padding`,\n * `--dbx-icon-tile-border-radius`, `--dbx-icon-tile-font-size`,\n * `--dbx-icon-tile-font-weight`, `--dbx-icon-tile-icon-size`.\n *\n * @dbxWebComponent\n * @dbxWebSlug icon-tile\n * @dbxWebCategory layout\n * @dbxWebRelated icon-tile-host, dbx-color, list-two-line-item\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebContentProjection Optional fallback content rendered when `icon` is not supplied (e.g. a custom icon component).\n * @dbxWebMinimalExample ```html\n * <dbx-icon-tile [icon]=\"'verified'\" dbxColor=\"success\"></dbx-icon-tile>\n * ```\n *\n * @example\n * ```html\n * <dbx-icon-tile [icon]=\"'check'\" dbxColor=\"primary\" [dbxColorTone]=\"18\"></dbx-icon-tile>\n *\n * <dbx-icon-tile [icon]=\"'star'\" [round]=\"true\" dbxColor=\"accent\"></dbx-icon-tile>\n *\n * <dbx-icon-tile dbxColor=\"accent\">\n *   <my-custom-glyph></my-custom-glyph>\n * </dbx-icon-tile>\n * ```\n */\n@Component({\n  selector: 'dbx-icon-tile',\n  template: `\n    @if (icon(); as iconValue) {\n      <mat-icon>{{ iconValue }}</mat-icon>\n    } @else {\n      <ng-content></ng-content>\n    }\n  `,\n  host: {\n    class: 'dbx-icon-tile',\n    '[class.dbx-icon-tile-round]': 'round()'\n  },\n  imports: [MatIconModule]\n})\nexport class DbxIconTileComponent {\n  readonly icon = input<Maybe<string>>();\n  readonly round = input<boolean>(false);\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Host-class form of the icon tile — applies the `dbx-icon-tile` utility\n * (flex-centered, 12px rounded, 8px padded) to an existing element. Use\n * this when an existing slot (e.g. a list row's `.item-icon` div) needs\n * the tile presentation without introducing a wrapping component, or\n * when stacking with another component that already owns the host (so a\n * `<dbx-icon-tile>` child element isn't possible).\n *\n * Pair with `[dbxColor]` (optionally `[dbxColorTone]`) on the same host\n * for a tonal/full-color background. The host has no background of its\n * own — only layout. For the convenient component form that renders the\n * `<mat-icon>` for you, use {@link DbxIconTileComponent} (`<dbx-icon-tile>`).\n *\n * Sizing, padding, border radius, font, and inner `.mat-icon` size are\n * all configurable via CSS custom properties on the host:\n * `--dbx-icon-tile-width`, `--dbx-icon-tile-height`,\n * `--dbx-icon-tile-min-width`, `--dbx-icon-tile-padding`,\n * `--dbx-icon-tile-border-radius`, `--dbx-icon-tile-font-size`,\n * `--dbx-icon-tile-font-weight`, `--dbx-icon-tile-icon-size`.\n *\n * @dbxWebComponent\n * @dbxWebSlug icon-tile-host\n * @dbxWebCategory layout\n * @dbxWebRelated icon-tile, dbx-color, list-two-line-item\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <div dbxIconTile dbxColor=\"primary\" [dbxColorTone]=\"18\">\n *   <mat-icon>star</mat-icon>\n * </div>\n * ```\n *\n * @example\n * ```html\n * <div class=\"dbx-list-two-line-item dbx-list-two-line-item-with-icon\">\n *   <div class=\"item-icon\" dbxIconTile dbxColor=\"primary\" [dbxColorTone]=\"18\">\n *     <mat-icon>check_circle</mat-icon>\n *   </div>\n *   <div class=\"item-left\">\n *     <span class=\"item-title\">Title</span>\n *     <span class=\"item-details\">Details</span>\n *   </div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxIconTile]',\n  host: {\n    class: 'dbx-icon-tile',\n    '[class.dbx-icon-tile-round]': 'dbxIconTileRound()'\n  }\n})\nexport class DbxIconTileDirective {\n  /**\n   * When `true`, applies the `dbx-icon-tile-round` modifier to render the\n   * tile as a circle instead of a 12px-rounded square.\n   */\n  readonly dbxIconTileRound = input<boolean>(false);\n}\n","import { Component, computed, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxColorInput } from '../style/style';\nimport { DbxColorDirective } from '../style/style.color.directive';\nimport { DbxIconTileComponent } from './icon-tile.component';\n\n/**\n * Configuration object for {@link DbxStepBlockComponent}.\n *\n * Pass via the `config` input as an alternative to setting individual inputs.\n * Individual inputs take precedence over config values.\n *\n * @example\n * ```typescript\n * const stepConfig: DbxStepBlockComponentConfig = {\n *   step: 1,\n *   header: 'Create Account',\n *   hint: 'Fill in the registration form.',\n *   color: 'primary'\n * };\n * ```\n */\nexport interface DbxStepBlockComponentConfig {\n  readonly step?: Maybe<number>;\n  readonly icon?: Maybe<string>;\n  readonly header?: Maybe<string>;\n  readonly hint?: Maybe<string>;\n  readonly color?: Maybe<DbxColorInput>;\n  readonly center?: Maybe<boolean>;\n}\n\n/**\n * A step-oriented content block that displays a numbered circle badge on the left\n * with header, hint, and projected content on the right.\n *\n * Use the `icon` input to replace the step number with a Material icon.\n * Use the `[header]` content slot for extra header-level content (like `dbx-detail-block`).\n * Use the `color` input to customize the badge color (defaults to `'primary'`).\n *\n * Use the `center` input to vertically center the badge with the content.\n *\n * Accepts either individual inputs or a single `config` object. Individual inputs\n * take precedence over config values when both are provided.\n *\n * @example\n * ```html\n * <dbx-step-block [step]=\"1\" header=\"Create Account\" hint=\"Fill in the registration form.\">\n *   <p>Enter your email and password to get started.</p>\n * </dbx-step-block>\n *\n * <dbx-step-block [config]=\"stepConfig\">\n *   <p>Content using a config object.</p>\n * </dbx-step-block>\n *\n * <dbx-step-block [step]=\"2\" color=\"accent\" header=\"Custom Header Content\">\n *   <span header>Extra header content</span>\n *   <p>Detail content goes here.</p>\n * </dbx-step-block>\n * ```\n */\n@Component({\n  selector: 'dbx-step-block',\n  template: `\n    <dbx-icon-tile class=\"dbx-step-block-badge\" [icon]=\"iconSignal()\" [dbxColor]=\"colorSignal()\">\n      @if (!iconSignal()) {\n        {{ stepSignal() }}\n      }\n    </dbx-icon-tile>\n    <div class=\"dbx-step-block-content dbx-flex-fill-0\">\n      @if (headerSignal()) {\n        <div class=\"dbx-step-block-header\">\n          <span class=\"dbx-step-block-header-label\">{{ headerSignal() }}</span>\n          <ng-content select=\"[header]\"></ng-content>\n        </div>\n      }\n      @if (hintSignal()) {\n        <span class=\"dbx-step-block-hint\">{{ hintSignal() }}</span>\n      }\n      <ng-content></ng-content>\n    </div>\n  `,\n  host: {\n    class: 'dbx-step-block d-block',\n    '[class.dbx-step-block-center]': 'centerSignal()'\n  },\n  imports: [DbxIconTileComponent, DbxColorDirective]\n})\nexport class DbxStepBlockComponent {\n  readonly config = input<Maybe<DbxStepBlockComponentConfig>>();\n  readonly step = input<Maybe<number>>();\n  readonly icon = input<Maybe<string>>();\n  readonly header = input<Maybe<string>>();\n  readonly hint = input<Maybe<string>>();\n  readonly color = input<Maybe<DbxColorInput>>();\n  readonly center = input<Maybe<boolean>>();\n\n  readonly stepSignal = computed(() => {\n    const config = this.config();\n    return this.step() ?? config?.step ?? 1;\n  });\n  readonly iconSignal = computed(() => {\n    const config = this.config();\n    return this.icon() ?? config?.icon;\n  });\n  readonly headerSignal = computed(() => {\n    const config = this.config();\n    return this.header() ?? config?.header;\n  });\n  readonly hintSignal = computed(() => {\n    const config = this.config();\n    return this.hint() ?? config?.hint;\n  });\n  readonly colorSignal = computed(() => {\n    const config = this.config();\n    return this.color() ?? config?.color ?? 'primary';\n  });\n  readonly centerSignal = computed(() => {\n    const config = this.config();\n    return this.center() ?? config?.center ?? false;\n  });\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Adds inline spacing sized for icons, typically used to align text that sits next to icon-bearing siblings.\n *\n * @example\n * ```html\n * <dbx-icon-spacer></dbx-icon-spacer>\n * <span>Text aligned with icon spacing</span>\n * ```\n */\n@Directive({\n  selector: 'dbx-icon-spacer,[dbxIconSpacer]',\n  host: {\n    class: 'dbx-icon-spacer d-inline'\n  }\n})\nexport class DbxIconSpacerDirective {}\n","import type linkifyStr from 'linkify-string';\n\n/**\n * The default linkify string type.\n */\nexport const DEFAULT_DBX_LINKIFY_STRING_TYPE: DbxLinkifyStringType = 'DEFAULT';\n\n/**\n * Custom key used to identify a type of linkify string.\n *\n * I.E. how-to-section, product-description, etc.\n */\nexport type DbxLinkifyStringType = string;\n\n/**\n * Customization options used by DbxLinkifyComponent.\n */\nexport type DbxLinkifyStringOptions = Parameters<typeof linkifyStr>[1];\n","import { inject, Service } from '@angular/core';\nimport { DEFAULT_DBX_LINKIFY_STRING_TYPE, type DbxLinkifyStringType, type DbxLinkifyStringOptions } from './linkify';\nimport { type ArrayOrValue, type Maybe, useIterableOrValue } from '@dereekb/util';\n\n/**\n * A registered linkify configuration keyed by type, holding the linkify-string options for that type.\n */\nexport interface DbxLinkifyServiceEntry {\n  readonly type: DbxLinkifyStringType;\n  readonly options: DbxLinkifyStringOptions;\n}\n\n/**\n * Default entry type without the type field.\n *\n * Used for registerDefaultEntry() and DbxLinkifyServiceConfig.\n */\nexport type DbxLinkifyServiceDefaultEntry = Omit<DbxLinkifyServiceEntry, 'type'>;\n\n/**\n * Configuration provided in the root module for configuring entries.\n */\nexport abstract class DbxLinkifyServiceConfig {\n  /**\n   * Optional default entry override.\n   */\n  abstract defaultEntry?: Maybe<DbxLinkifyServiceDefaultEntry>;\n  /**\n   * Entries to register.\n   */\n  abstract entries?: Maybe<ArrayOrValue<DbxLinkifyServiceEntry>>;\n}\n\n/**\n * Service used to register and retrieve linkify configurations by type.\n *\n * It has a default entry that is used when no type is specified or the requested type is not found.\n * By default, the default entry uses `{ defaultProtocol: 'https', target: { url: '_blank' } }`.\n *\n * Apps can override the default and register additional types via DbxLinkifyServiceConfig\n * (provided by provideDbxLinkify()) or by calling register()/registerDefaultEntry() directly.\n */\n@Service() // does not need to be strictly provided/configured. Works out of the box.\nexport class DbxLinkifyService {\n  private readonly _entries = new Map<DbxLinkifyStringType, DbxLinkifyServiceEntry>();\n\n  constructor() {\n    const initialConfig = inject(DbxLinkifyServiceConfig, { optional: true });\n\n    if (initialConfig?.defaultEntry) {\n      this.registerDefaultEntry(initialConfig.defaultEntry);\n    }\n\n    if (initialConfig?.entries) {\n      this.register(initialConfig.entries);\n    }\n\n    // If no default was provided, register inline defaults\n    if (!this._entries.has(DEFAULT_DBX_LINKIFY_STRING_TYPE)) {\n      this.registerDefaultEntry({ options: { defaultProtocol: 'https', target: { url: '_blank' } } });\n    }\n  }\n\n  /**\n   * Registers the default entry.\n   *\n   * @param entry - Entry without the type field.\n   */\n  registerDefaultEntry(entry: DbxLinkifyServiceDefaultEntry): void {\n    this._entries.set(DEFAULT_DBX_LINKIFY_STRING_TYPE, {\n      ...entry,\n      type: DEFAULT_DBX_LINKIFY_STRING_TYPE\n    });\n  }\n\n  /**\n   * Registers one or more entries by type.\n   *\n   * @param entries - One or more entries to register.\n   * @param override - Whether to override existing entries (default: true)\n   */\n  register(entries: ArrayOrValue<DbxLinkifyServiceEntry>, override: boolean = true): void {\n    useIterableOrValue(entries, (entry) => {\n      if (override || !this._entries.has(entry.type)) {\n        this._entries.set(entry.type, entry);\n      }\n    });\n  }\n\n  // MARK: Get\n  /**\n   * Returns the default entry.\n   *\n   * @returns The default linkify service entry, or undefined if none is registered.\n   */\n  getDefaultEntry(): Maybe<DbxLinkifyServiceEntry> {\n    return this._entries.get(DEFAULT_DBX_LINKIFY_STRING_TYPE);\n  }\n\n  /**\n   * Returns the entry for the given type.\n   *\n   * @param type - The linkify string type to look up.\n   * @returns The registered entry for the given type, or undefined if not found.\n   */\n  getEntryRegisteredForType(type: DbxLinkifyStringType): Maybe<DbxLinkifyServiceEntry> {\n    return this._entries.get(type);\n  }\n\n  /**\n   * Returns the entry for the given type, or the default type if there is no entry registered or the input type is null/undefined.\n   *\n   * @param type - The linkify string type to look up, or nullish to retrieve the default entry.\n   * @returns The matching entry, or the default entry if the type is not provided.\n   */\n  getEntry(type?: Maybe<DbxLinkifyStringType>): Maybe<DbxLinkifyServiceEntry> {\n    return type ? this._entries.get(type) : this.getDefaultEntry();\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport linkifyStr from 'linkify-string';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { mergeObjects, type Maybe } from '@dereekb/util';\nimport { type DbxLinkifyStringType, type DbxLinkifyStringOptions } from './linkify';\nimport { DbxLinkifyService } from './linkify.service';\n\n/**\n * Inline configuration for {@link DbxLinkifyComponent}, allowing a type key and/or custom linkify options.\n */\nexport interface DbxLinkifyConfig {\n  /**\n   * The type to use for retrieving pre-configured configuration.\n   */\n  readonly type?: Maybe<DbxLinkifyStringType>;\n  /**\n   * Additional options to use for linkification. These options override the default options.\n   */\n  readonly options?: DbxLinkifyStringOptions;\n}\n\n/**\n * Converts URLs and email addresses in plain text into clickable HTML links using the linkify-string library.\n *\n * Options are resolved from {@link DbxLinkifyService} by type, then merged with any inline config overrides.\n *\n * @example\n * ```html\n * <dbx-linkify [text]=\"'Visit https://example.com for more info.'\"></dbx-linkify>\n * <dbx-linkify [text]=\"description\" [type]=\"'product-description'\"></dbx-linkify>\n * ```\n */\n@Component({\n  selector: 'dbx-linkify',\n  template: `\n    <span [innerHTML]=\"linkifiedBodySignal()\"></span>\n  `,\n  host: {\n    class: 'dbx-i dbx-linkify'\n  }\n})\nexport class DbxLinkifyComponent {\n  private readonly sanitizer = inject(DomSanitizer);\n  private readonly dbxLinkifyService = inject(DbxLinkifyService);\n\n  readonly text = input<Maybe<string>>();\n  readonly type = input<Maybe<DbxLinkifyStringType>>();\n  readonly config = input<Maybe<DbxLinkifyConfig>>();\n\n  readonly linkifiedTextSignal = computed(() => {\n    const text = this.text();\n    const type = this.type();\n    const config = this.config();\n\n    // Resolve base options from the service\n    const entry = this.dbxLinkifyService.getEntry(type ?? config?.type);\n    const baseOptions = entry?.options;\n\n    // Merge base options with inline options (inline overrides base)\n    const options: DbxLinkifyStringOptions = mergeObjects([baseOptions, config?.options]);\n\n    return text ? linkifyStr(text, options) : undefined;\n  });\n\n  readonly linkifiedBodySignal = computed(() => {\n    const linkifiedText = this.linkifiedTextSignal();\n    return linkifiedText ? this.sanitizer.bypassSecurityTrustHtml(linkifiedText) : undefined;\n  });\n}\n","import { type EnvironmentProviders, type Injector, type Provider, makeEnvironmentProviders } from '@angular/core';\nimport { DbxLinkifyServiceConfig } from './linkify.service';\n\n/**\n * Factory for DbxLinkifyServiceConfig.\n */\nexport type DbxLinkifyServiceConfigFactory = (injector: Injector) => DbxLinkifyServiceConfig;\n\n/**\n * Configuration for provideDbxLinkify().\n */\nexport interface ProvideDbxLinkifyConfig {\n  /**\n   * Factory for DbxLinkifyServiceConfig.\n   */\n  readonly dbxLinkifyServiceConfigFactory: DbxLinkifyServiceConfigFactory;\n}\n\n/**\n * Creates environment-level providers for configuring {@link DbxLinkifyService} with a custom factory.\n *\n * @param config - Configuration containing the factory function for creating the linkify service config.\n * @returns Environment providers that register the DbxLinkifyServiceConfig.\n *\n * @example\n * ```ts\n * provideDbxLinkify({\n *   dbxLinkifyServiceConfigFactory: (injector) => ({\n *     defaultEntry: { options: { defaultProtocol: 'https' } },\n *     entries: [{ type: 'bio', options: { target: { url: '_blank' } } }]\n *   })\n * });\n * ```\n */\nexport function provideDbxLinkify(config: ProvideDbxLinkifyConfig): EnvironmentProviders {\n  const { dbxLinkifyServiceConfigFactory } = config;\n\n  const providers: Provider[] = [\n    {\n      provide: DbxLinkifyServiceConfig,\n      useFactory: dbxLinkifyServiceConfigFactory\n    }\n  ];\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Directive, computed, effect, inject, input, untracked } from '@angular/core';\nimport { type LabeledValue, type Maybe } from '@dereekb/util';\nimport { type DbxColorInput, type DbxColorTone } from '../style/style';\nimport { DbxColorDirective } from '../style/style.color.directive';\n\n/**\n * Display configuration for a single colored chip.\n *\n * Combines a labeled value with a theme color for rendering a styled chip.\n */\nexport interface DbxChipDisplay extends LabeledValue<string> {\n  /**\n   * Optional unique key for tracking in `@for` loops. Falls back to `label` when not provided.\n   */\n  readonly key?: string;\n  /**\n   * Theme color or {@link DbxColorConfig} applied to the chip background.\n   */\n  readonly color?: Maybe<DbxColorInput>;\n  /**\n   * Whether to render the chip in small mode.\n   */\n  readonly small?: Maybe<boolean>;\n  /**\n   * Whether to render the chip in block mode (no border-radius).\n   */\n  readonly block?: Maybe<boolean>;\n  /**\n   * Background tone level controlling the opacity of the chip color.\n   */\n  readonly tone?: Maybe<DbxColorTone>;\n}\n\n/**\n * Default background tone percentage for tonal chip coloring.\n */\nexport const DEFAULT_DBX_CHIP_TONE = 18;\n\n/**\n * Renders a styled chip element with optional small, block, and color modes.\n *\n * Hosts a {@link DbxColorDirective} that provides the color tokens + `.dbx-color` marker the chip's\n * `.dbx-chip.dbx-color` SCSS paints from. The color can be supplied either through the {@link color}/{@link display}\n * inputs (pushed into the host directive) or by binding `[dbxColor]` directly; the chip's tone handling (default\n * {@link DEFAULT_DBX_CHIP_TONE} → tonal text) applies to both.\n *\n * @dbxWebComponent\n * @dbxWebSlug chip\n * @dbxWebCategory text\n * @dbxWebRelated chip-list\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-chip text=\"Tag\"></dbx-chip>\n * ```\n *\n * @example\n * ```html\n * <dbx-chip text=\"Active\" icon=\"check\" color=\"primary\"></dbx-chip>\n * ```\n */\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: 'dbx-chip',\n  host: {\n    class: 'dbx-chip',\n    '[class]': 'styleSignal()',\n    '[class.dbx-color-tonal]': 'isTonalSignal()',\n    '[style.--dbx-color-bg-tone]': 'bgToneStyleSignal()'\n  },\n  hostDirectives: [DbxColorDirective]\n})\nexport class DbxChipDirective {\n  private readonly _dbxColorDirective = inject(DbxColorDirective, { self: true });\n\n  constructor() {\n    let originalColor: Maybe<DbxColorInput>;\n    let overridden = false;\n\n    // Pushes the chip's resolved color (color input > display config) into the host DbxColorDirective so it stays the\n    // single token provider on the element. The directive's own value is restored once the chip stops supplying a color.\n    effect(() => {\n      const color = this.colorSignal();\n\n      if (color != null) {\n        if (!overridden) {\n          originalColor = untracked(this._dbxColorDirective.dbxColor);\n          overridden = true;\n        }\n\n        this._dbxColorDirective.dbxColor.set(color);\n      } else if (overridden) {\n        this._dbxColorDirective.dbxColor.set(originalColor);\n        overridden = false;\n      }\n    });\n  }\n\n  readonly small = input<Maybe<boolean>>();\n  readonly block = input<Maybe<boolean>>();\n\n  /**\n   * Theme color or {@link DbxColorConfig} applied to the chip, pushed into the host {@link DbxColorDirective}.\n   *\n   * When {@link display} is also set, its color is used as a fallback.\n   */\n  readonly color = input<Maybe<DbxColorInput>>();\n  /**\n   * Display configuration that provides color (and optionally label/value metadata).\n   *\n   * The color from `display` is used as a fallback when `color` is not explicitly set.\n   */\n  readonly display = input<Maybe<DbxChipDisplay>>();\n  /**\n   * Background tone level for tonal appearance. Defaults to {@link DEFAULT_DBX_CHIP_TONE}.\n   *\n   * Set to `100` for fully opaque background.\n   */\n  readonly tone = input<Maybe<DbxColorTone>>();\n\n  readonly colorSignal = computed(() => {\n    const display = this.display();\n    return this.color() ?? display?.color;\n  });\n\n  /**\n   * The effective color on the host {@link DbxColorDirective} — either pushed from {@link colorSignal} or bound\n   * directly via `[dbxColor]`. Drives the chip's tone/tonal handling.\n   */\n  readonly effectiveColorSignal = computed(() => this._dbxColorDirective.dbxColor());\n\n  readonly toneSignal = computed(() => {\n    const display = this.display();\n    return this.tone() ?? display?.tone ?? this._dbxColorDirective.effectiveToneSignal() ?? DEFAULT_DBX_CHIP_TONE;\n  });\n\n  readonly styleSignal = computed(() => {\n    const display = this.display();\n    const small = this.small() ?? display?.small;\n    const block = this.block() ?? display?.block;\n\n    let style = small ? 'dbx-chip-small' : '';\n\n    if (block) {\n      style = style + ' dbx-chip-block';\n    }\n\n    return style;\n  });\n\n  /**\n   * Sets `--dbx-color-bg-tone` on the host to control the background opacity of the painted chip surface.\n   * Only applied when a color is set.\n   */\n  readonly bgToneStyleSignal = computed(() => {\n    const tone = this.toneSignal();\n    const color = this.effectiveColorSignal();\n\n    if (color) {\n      return `${tone}%`;\n    }\n\n    return null;\n  });\n\n  /**\n   * Whether tonal mode is active (color is set and tone < 100). Adds the `dbx-color-tonal`\n   * CSS class which overrides text color to the vibrant theme color via CSS rather than\n   * an inline style binding (which would conflict with `[ngStyle]`).\n   */\n  readonly isTonalSignal = computed(() => {\n    const tone = this.toneSignal();\n    const color = this.effectiveColorSignal();\n    return Boolean(color) && tone < 100;\n  });\n}\n","import { Component, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxChipDisplay, DbxChipDirective } from './text.chip.directive';\n\n/**\n * Renders a row of colored chips from an array of {@link DbxChipDisplay} items.\n *\n * Uses {@link DbxChipDirective} internally with `dbx-chip-spacer` class for spacing.\n *\n * @dbxWebComponent\n * @dbxWebSlug chip-list\n * @dbxWebCategory text\n * @dbxWebRelated chip\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-chip-list></dbx-chip-list>\n * ```\n *\n * @example\n * ```html\n * <dbx-chip-list>\n *   <dbx-chip text=\"Tag1\"></dbx-chip>\n *   <dbx-chip text=\"Tag2\"></dbx-chip>\n * </dbx-chip-list>\n * ```\n */\n@Component({\n  selector: 'dbx-chip-list',\n  template: `\n    @for (chip of chips(); track chip.key ?? chip.label) {\n      <dbx-chip class=\"dbx-chip-spacer\" [display]=\"chip\" [small]=\"small()\">{{ chip.label }}</dbx-chip>\n    }\n  `,\n  host: {\n    class: 'dbx-chip-list',\n    '[style.display]': '\"inline\"'\n  },\n  imports: [DbxChipDirective]\n})\nexport class DbxChipListComponent {\n  readonly chips = input<Maybe<DbxChipDisplay[]>>();\n  readonly small = input<Maybe<boolean>>();\n}\n","import { Component, inject, input } from '@angular/core';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { type LabeledValue, type Maybe } from '@dereekb/util';\nimport { type DbxColorConfig, type DbxColorInput, dbxColorBackground, isDbxColorConfig } from '../style/style';\nimport { DbxColorService } from '../style/style.color.service';\n\n/**\n * Configuration for a single chip displayed by {@link DbxTextChipsComponent}.\n *\n * Extends {@link LabeledValue} for the chip label and value.\n */\nexport interface TextChip extends LabeledValue<string> {\n  /**\n   * Optional unique key for tracking in `@for` loops. Falls back to `label` when not provided.\n   */\n  readonly key?: string;\n  /**\n   * Optional tooltip shown on hover.\n   */\n  readonly tooltip?: string;\n  /**\n   * Whether the chip appears selected.\n   */\n  readonly selected?: boolean;\n  /**\n   * Theme color or {@link DbxColorConfig} applied to the chip background via {@link dbxColorBackground}.\n   */\n  readonly color?: Maybe<DbxColorInput>;\n}\n\n/**\n * Renders a read-only list of Material chip options from an array of {@link TextChip} objects.\n *\n * @example\n * ```html\n * <dbx-text-chips [chips]=\"[{ label: 'Active', value: 'active', selected: true, color: 'primary' }]\"></dbx-text-chips>\n * ```\n */\n@Component({\n  selector: 'dbx-text-chips',\n  template: `\n    @if (chips()) {\n      <mat-chip-listbox class=\"dbx-text-chips-listbox\">\n        @for (chip of chips(); track chip.key ?? chip.label) {\n          <mat-chip-option [selected]=\"chip.selected ?? defaultSelection()\" [class]=\"chipColorClass(chip)\" [style.--dbx-bg-color-current]=\"chipBgColorStyle(chip)\" [style.--dbx-color-current]=\"chipColorStyle(chip)\" [matTooltip]=\"chip.tooltip!\" matTooltipPosition=\"above\">\n            {{ chip.label }}\n          </mat-chip-option>\n        }\n      </mat-chip-listbox>\n    }\n  `,\n  imports: [MatChipsModule, MatTooltipModule]\n})\nexport class DbxTextChipsComponent {\n  private readonly _colorService = inject(DbxColorService, { optional: true });\n\n  readonly defaultSelection = input<Maybe<boolean>>();\n  readonly chips = input<Maybe<TextChip[]>>();\n\n  /**\n   * Returns the themed background CSS class for a chip's color.\n   *\n   * @param chip - The chip to get the color class for.\n   * @returns The CSS class name for the chip's background color, or empty string if no color.\n   */\n  chipColorClass(chip: TextChip): string {\n    return chip.color ? dbxColorBackground(chip.color) : '';\n  }\n\n  /**\n   * Returns the inline `--dbx-bg-color-current` value for a chip when its color is a {@link DbxColorConfig}; otherwise null.\n   *\n   * @param chip - The chip.\n   * @returns The background color CSS value, or null for named-color strings.\n   */\n  chipBgColorStyle(chip: TextChip): Maybe<string> {\n    return this._expandedChipConfig(chip)?.color ?? null;\n  }\n\n  /**\n   * Returns the inline `--dbx-color-current` value for a chip when its color is a {@link DbxColorConfig}; otherwise null.\n   *\n   * @param chip - The chip.\n   * @returns The contrast color CSS value, or null for named-color strings.\n   */\n  chipColorStyle(chip: TextChip): Maybe<string> {\n    return this._expandedChipConfig(chip)?.contrast ?? null;\n  }\n\n  private _expandedChipConfig(chip: TextChip): Maybe<DbxColorConfig> {\n    const value = chip.color;\n    return isDbxColorConfig(value) ? (this._colorService?.expandColorConfig(value) ?? value) : undefined;\n  }\n}\n","import { Component, computed, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxColorDirective } from '../style/style.color.directive';\nimport { type DbxThemeColor } from '../style/style';\n\n/**\n * Configuration for the DbxNumberWithLimitComponent.\n */\nexport interface NumberWithLimit<T extends number = number> {\n  /**\n   * Number to display, if applicable.\n   */\n  readonly value: T;\n  /**\n   * Limit to display, if applicable.\n   */\n  readonly limit?: Maybe<T>;\n  /**\n   * Function to format the input number(s) to a string before being displayed, if applicable.\n   */\n  readonly formatNumber?: Maybe<(number: T) => string>;\n  /**\n   * Prefix to add before the value\n   */\n  readonly prefix?: Maybe<string>;\n  /**\n   * Suffix to add after the value\n   */\n  readonly suffix?: Maybe<string>;\n}\n\n/**\n * Displays a number value with an optional limit, automatically applying color-coded\n * theming based on the ratio of value to limit (ok, notice, warn).\n *\n * @example\n * ```html\n * <dbx-number-with-limit [number]=\"{ value: 7, limit: 10 }\"></dbx-number-with-limit>\n * <dbx-number-with-limit [number]=\"{ value: 3, limit: 5, prefix: '$' }\" [rounded]=\"true\"></dbx-number-with-limit>\n * ```\n */\n@Component({\n  selector: 'dbx-number-with-limit',\n  template: `\n    <span class=\"dbx-number-with-limit\" [class]=\"{ 'dbx-number-with-limit-rounded': rounded() }\" [dbxColor]=\"colorSignal()\">\n      <span>{{ prefixSignal() }}</span>\n      <span>{{ valueSignal() }}</span>\n      @if (hasLimitSignal()) {\n        <span class=\"dbx-number-with-limit-divider\">/</span>\n        <span>{{ limitSignal() }}</span>\n      }\n      <span>{{ suffixSignal() }}</span>\n    </span>\n  `,\n  imports: [DbxColorDirective]\n})\nexport class DbxNumberWithLimitComponent<T extends number = number> {\n  readonly number = input<NumberWithLimit<T>>();\n  readonly rounded = input<boolean>();\n\n  readonly valueSignal = computed(() => {\n    const number = this.number();\n    return number?.formatNumber ? number.formatNumber(number.value) : number?.value;\n  });\n\n  readonly limitSignal = computed(() => {\n    const number = this.number();\n    return number?.limit == null ? undefined : number?.formatNumber ? number.formatNumber(number.limit) : number?.limit;\n  });\n\n  readonly hasLimitSignal = computed(() => {\n    return this.number()?.limit != null;\n  });\n\n  readonly prefixSignal = computed(() => {\n    return this.number()?.prefix;\n  });\n\n  readonly suffixSignal = computed(() => {\n    return this.number()?.suffix;\n  });\n\n  readonly colorSignal = computed(() => {\n    const number = this.number();\n    let color: Maybe<DbxThemeColor>;\n\n    if (number != null) {\n      const { value, limit } = number;\n\n      if (limit != null) {\n        if (value > limit) {\n          color = 'warn';\n        } else if (value === limit) {\n          color = 'notice';\n        } else {\n          const ratio = limit === 0 ? 1 : value / limit;\n\n          if (ratio > 0.8) {\n            color = 'notice';\n          } else {\n            color = 'ok';\n          }\n        }\n      }\n    }\n\n    return color;\n  });\n}\n","import { Clipboard } from '@angular/cdk/clipboard';\nimport { inject } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { addMilliseconds, type Configurable, type GetterOrValueWithInput, getValueFromGetter, isPast, type Maybe, type Milliseconds, MS_IN_SECOND, type Seconds } from '@dereekb/util';\n\n/**\n * Whether copying to the clipboard succeeded.\n */\nexport type CopyToClipboardSuccess = boolean;\n\n/**\n * Content that can be copied to the clipboard (strings only).\n */\nexport type CopyToClipboardContent = string;\n\n/**\n * Function that copies text content to the clipboard with retry support.\n *\n * @example\n * ```ts\n * const copy = copyToClipboardFunction(clipboard);\n * const success = await copy('Hello world');\n * ```\n */\nexport type CopyToClipboardFunction = ((content: CopyToClipboardContent) => Promise<CopyToClipboardSuccess>) & {\n  readonly _clipboard: Clipboard;\n};\n\n/**\n * Configuration for {@link copyToClipboardFunction} controlling timeout and retry behavior.\n */\nexport interface CopyToClipboardFunctionConfig {\n  readonly copyTimeoutSeconds?: Maybe<Seconds>;\n  readonly delayBetweenCopyAttempts?: Maybe<Milliseconds>;\n  readonly onCopyResult?: Maybe<(success: CopyToClipboardSuccess, content: CopyToClipboardContent) => void>;\n}\n\n/**\n * Creates a {@link CopyToClipboardFunction} that retries the copy operation until success or timeout.\n *\n * @param clipboard - The Angular CDK Clipboard instance.\n * @param config - Optional timeout and retry settings.\n * @returns Copies text to the clipboard.\n *\n * @example\n * ```ts\n * const copy = copyToClipboardFunction(clipboard, { copyTimeoutSeconds: 10 });\n * const success = await copy('some text');\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function copyToClipboardFunction(clipboard: Clipboard, config?: CopyToClipboardFunctionConfig): CopyToClipboardFunction {\n  const copyTimeoutSeconds = config?.copyTimeoutSeconds ?? 15;\n  const delayBetweenCopyAttempts = config?.delayBetweenCopyAttempts ?? MS_IN_SECOND;\n  const onCopyResult = config?.onCopyResult;\n\n  const copyFunction = ((content: CopyToClipboardContent) => {\n    return new Promise<CopyToClipboardSuccess>((resolve, reject) => {\n      const pending = clipboard.beginCopy(content);\n\n      const copyTimeoutAt = addMilliseconds(new Date(), copyTimeoutSeconds * MS_IN_SECOND);\n\n      const attempt = () => {\n        const copyIsFinished = pending.copy();\n\n        if (!copyIsFinished && !isPast(copyTimeoutAt)) {\n          setTimeout(attempt, delayBetweenCopyAttempts);\n        } else {\n          // Destroy the pending copy\n          pending.destroy();\n\n          if (copyIsFinished) {\n            resolve(true);\n            onCopyResult?.(true, content);\n          } else {\n            reject(new Error('Failed to copy content to clipboard'));\n            onCopyResult?.(false, content);\n          }\n        }\n      };\n\n      attempt();\n    });\n  }) as unknown as CopyToClipboardFunction;\n  (copyFunction as Configurable<CopyToClipboardFunction>)._clipboard = clipboard;\n  return copyFunction;\n}\n\n/**\n * Injects a {@link CopyToClipboardFunction} using Angular's dependency injection.\n *\n * Must be called in an Angular injection context.\n *\n * @param config - Optional timeout and retry settings.\n * @returns The clipboard copy function.\n *\n * @example\n * ```ts\n * const copy = injectCopyToClipboardFunction();\n * await copy('copied text');\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function injectCopyToClipboardFunction(config?: CopyToClipboardFunctionConfig) {\n  return copyToClipboardFunction(inject(Clipboard), config);\n}\n\n// MARK: Snackbar Message On Copy\n/**\n * Extended clipboard copy function that shows a Material snackbar notification on success or failure.\n */\nexport type CopyToClipboardFunctionWithSnackbarMessage = CopyToClipboardFunction & {\n  setSnackbarMessagesConfig(config: Maybe<CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig>): void;\n  setSnackbarMessagesEnabled(enabled: boolean): void;\n};\n\nexport interface CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig {\n  /**\n   * The duration to show the snackbar for.\n   *\n   * Defaults to 3 seconds.\n   */\n  readonly snackbarDuration?: Milliseconds;\n  /**\n   * The message to show when the content is copied successfully.\n   */\n  readonly successMessage?: GetterOrValueWithInput<string, CopyToClipboardContent>;\n  /**\n   * The message to show when the content fails to copy.\n   */\n  readonly failureMessage?: GetterOrValueWithInput<string, CopyToClipboardContent>;\n}\n\n/**\n * Combined configuration for the clipboard copy function and its snackbar notification behavior.\n */\nexport interface CopyToClipboardFunctionWithSnackbarMessageConfig extends CopyToClipboardFunctionConfig, CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig {}\n\n/**\n * Injects a {@link CopyToClipboardFunctionWithSnackbarMessage} that copies text to the clipboard\n * and shows a Material snackbar with a success or failure message.\n *\n * Must be called in an Angular injection context.\n *\n * @param config - Optional configuration for copy behavior and snackbar messages.\n * @returns Clipboard copy function with snackbar notification support.\n *\n * @example\n * ```ts\n * const copy = injectCopyToClipboardFunctionWithSnackbarMessage({\n *   successMessage: 'Link copied!',\n *   snackbarDuration: 2000\n * });\n * await copy('https://example.com');\n * ```\n */\nexport function injectCopyToClipboardFunctionWithSnackbarMessage(config?: CopyToClipboardFunctionWithSnackbarMessageConfig) {\n  // TODO: Add service for configuring global defaults for snackbar messages\n\n  const snackbar = inject(MatSnackBar);\n\n  const DEFAULT_SUCCESS_MESSAGE = 'Copied to clipboard';\n  const DEFAULT_FAILURE_MESSAGE = 'Content failed to copy...';\n  const DEFAULT_SNACKBAR_DURATION = 3 * MS_IN_SECOND;\n\n  let snackbarMessagesEnabled = true;\n  let successMessage: GetterOrValueWithInput<string, CopyToClipboardContent> = DEFAULT_SUCCESS_MESSAGE;\n  let failureMessage: GetterOrValueWithInput<string, CopyToClipboardContent> = DEFAULT_FAILURE_MESSAGE;\n  let snackbarDuration: Milliseconds = DEFAULT_SNACKBAR_DURATION;\n\n  const _setSnackbarMessagesConfig = (config: Maybe<CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig>) => {\n    if (config != null) {\n      const { successMessage: inputSuccessMessage, failureMessage: inputFailureMessage, snackbarDuration: inputSnackbarDuration } = config;\n\n      successMessage = inputSuccessMessage ?? successMessage ?? DEFAULT_SUCCESS_MESSAGE;\n      failureMessage = inputFailureMessage ?? failureMessage ?? DEFAULT_FAILURE_MESSAGE;\n      snackbarDuration = inputSnackbarDuration ?? snackbarDuration ?? DEFAULT_SNACKBAR_DURATION;\n    }\n  };\n\n  if (config) {\n    _setSnackbarMessagesConfig(config);\n  }\n\n  const onCopyResult = (success: CopyToClipboardSuccess, content: CopyToClipboardContent) => {\n    config?.onCopyResult?.(success, content);\n\n    if (snackbarMessagesEnabled) {\n      const message = success ? getValueFromGetter(successMessage, content) : getValueFromGetter(failureMessage, content);\n      snackbar.open(message, undefined, { duration: snackbarDuration });\n    }\n  };\n\n  const result = copyToClipboardFunction(inject(Clipboard), { ...config, onCopyResult }) as CopyToClipboardFunctionWithSnackbarMessage;\n\n  (result as Configurable<CopyToClipboardFunctionWithSnackbarMessage>).setSnackbarMessagesConfig = _setSnackbarMessagesConfig;\n  (result as Configurable<CopyToClipboardFunctionWithSnackbarMessage>).setSnackbarMessagesEnabled = (enabled: boolean) => {\n    snackbarMessagesEnabled = enabled;\n  };\n\n  return result;\n}\n","import { Directive, effect, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { type CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig, injectCopyToClipboardFunctionWithSnackbarMessage } from './clipboard';\n\n/**\n * Abstract base class for clipboard directives that provides copy-to-clipboard\n * functionality with configurable snackbar notifications.\n *\n * Subclasses should call `this._copyToClipboard(text)` to trigger a copy operation.\n */\n@Directive()\nexport class AbstractDbxClipboardDirective {\n  protected readonly _copyToClipboard = injectCopyToClipboardFunctionWithSnackbarMessage();\n\n  readonly clipboardSnackbarMessagesConfig = input<Maybe<CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig>>(undefined);\n  readonly clipboardSnackbarMessagesEnabled = input<boolean>(true);\n\n  protected readonly _configEffect = effect(() => {\n    this._copyToClipboard.setSnackbarMessagesConfig(this.clipboardSnackbarMessagesConfig());\n  });\n\n  protected readonly _enabledEffect = effect(() => {\n    this._copyToClipboard.setSnackbarMessagesEnabled(this.clipboardSnackbarMessagesEnabled());\n  });\n}\n","import { Directive, type ElementRef, HostListener, input, model } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { AbstractDbxClipboardDirective } from '../../util/clipboard.directive';\n\n/**\n * Makes the host element clickable to copy text to the clipboard.\n *\n * If no explicit `dbxClickToCopyText` value is provided, copies the element's text content.\n * Optionally highlights the element to indicate it is copyable.\n *\n * @example\n * ```html\n * <span [dbxClickToCopyText]=\"'Copy this value'\">Copy this value</span>\n * <span dbxClickToCopyText [highlighted]=\"false\">Subtle copy</span>\n * ```\n */\n@Directive({\n  selector: '[dbxClickToCopyText]',\n  host: {\n    class: 'dbx-click-to-copy-text',\n    '[class.dbx-click-to-copy-text-highlighted]': 'highlighted()'\n  }\n})\nexport class DbxClickToCopyTextDirective extends AbstractDbxClipboardDirective {\n  readonly copyTextFromElement = model<ElementRef<HTMLElement>>();\n\n  /**\n   * If the input is null, then copy from the element's text content.\n   */\n  readonly copyText = input<Maybe<Maybe<string>>>(undefined, { alias: 'dbxClickToCopyText' });\n\n  /**\n   * If true, the click events will be ignored.\n   */\n  readonly disableCopy = input<boolean>(false);\n\n  /**\n   * Highlight the text visually.\n   */\n  readonly highlighted = input<boolean>(true);\n\n  @HostListener('click', ['$event'])\n  public handleClick(event: MouseEvent): void {\n    const disabled = this.disableCopy();\n\n    if (!disabled) {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const eventElement = event.currentTarget as HTMLElement;\n      this._copyText(eventElement);\n    }\n  }\n\n  _copyText(eventElement?: Maybe<HTMLElement>): Maybe<string> {\n    let copyText = this.copyText();\n\n    // If the input is null, then copy from the element's text content.\n    if (copyText !== null && !copyText) {\n      const element = this.copyTextFromElement()?.nativeElement;\n      copyText = (element ?? eventElement)?.textContent ?? undefined;\n    }\n\n    if (copyText) {\n      void this._copyToClipboard(copyText);\n    }\n\n    return copyText;\n  }\n}\n","import { Component, computed, type ElementRef, input, viewChild } from '@angular/core';\nimport { DbxClickToCopyTextDirective } from './copy.text.directive';\nimport { type Maybe } from '@dereekb/util';\nimport { type CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig } from '../../util';\nimport { MatIcon } from '@angular/material/icon';\n\n/**\n * Icon shown by {@link DbxClickToCopyTextComponent} when no icon is configured.\n */\nexport const DEFAULT_DBX_CLICK_TO_COPY_TEXT_ICON = 'content_copy';\n\n/**\n * Configuration object for {@link DbxClickToCopyTextComponent}.\n *\n * Pass via the `config` input as an alternative to setting individual inputs. Individual inputs take precedence over config values.\n */\nexport interface DbxClickToCopyTextComponentConfig {\n  /**\n   * Text to copy. Defaults to the projected content's text.\n   */\n  readonly copyText?: Maybe<string>;\n  /**\n   * Whether to show the copy icon. Defaults to true.\n   */\n  readonly showIcon?: Maybe<boolean>;\n  /**\n   * Whether to underline the content. Defaults to false.\n   */\n  readonly highlighted?: Maybe<boolean>;\n  /**\n   * Snackbar messages shown after copying.\n   */\n  readonly clipboardSnackbarMessagesConfig?: Maybe<CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig>;\n  /**\n   * Whether to show a snackbar after copying. Defaults to true.\n   */\n  readonly clipboardSnackbarMessagesEnabled?: Maybe<boolean>;\n  /**\n   * The copy icon. Defaults to {@link DEFAULT_DBX_CLICK_TO_COPY_TEXT_ICON}.\n   */\n  readonly clickToCopyIcon?: Maybe<string>;\n  /**\n   * Whether only the icon copies, leaving the content selectable. Defaults to false.\n   */\n  readonly clickIconToCopyOnly?: Maybe<boolean>;\n}\n\n/**\n * Wraps projected content with click-to-copy functionality and a copy icon button.\n *\n * Clicking the text or the icon copies the text to the clipboard and optionally shows a snackbar confirmation.\n *\n * Accepts either individual inputs or a single `config` object. Individual inputs take precedence over config values.\n *\n * @dbxWebComponent\n * @dbxWebSlug click-to-copy-text\n * @dbxWebCategory text\n * @dbxWebRelated chip, click-to-copy-field\n * @dbxWebSkillRefs dbx__ref__dbx-ui-building-blocks\n * @dbxWebMinimalExample ```html\n * <dbx-click-to-copy-text>{{ value }}</dbx-click-to-copy-text>\n * ```\n *\n * @example\n * ```html\n * <dbx-click-to-copy-text [copyText]=\"userId\">User {{ userId }}</dbx-click-to-copy-text>\n * ```\n */\n@Component({\n  selector: 'dbx-click-to-copy-text',\n  template: `\n    <span\n      #content\n      [dbxClickToCopyText]=\"copyTextSignal()\"\n      [disableCopy]=\"clickIconToCopyOnlySignal()\"\n      [highlighted]=\"highlightedSignal()\"\n      [clipboardSnackbarMessagesEnabled]=\"clipboardSnackbarMessagesEnabledSignal()\"\n      [clipboardSnackbarMessagesConfig]=\"clipboardSnackbarMessagesConfigSignal()\"\n      [copyTextFromElement]=\"contentElementRef()\">\n      <ng-content></ng-content>\n    </span>\n    @if (showIconSignal()) {\n      <mat-icon class=\"dbx-click-to-copy-text-icon\" (click)=\"dbxClickToCopyText()?._copyText()\">{{ clickToCopyIconSignal() }}</mat-icon>\n    }\n  `,\n  host: {\n    class: 'dbx-click-to-copy-text-component'\n  },\n  imports: [DbxClickToCopyTextDirective, MatIcon]\n})\nexport class DbxClickToCopyTextComponent {\n  readonly contentElementRef = viewChild<ElementRef<HTMLElement>>('content');\n  readonly dbxClickToCopyText = viewChild<DbxClickToCopyTextDirective>(DbxClickToCopyTextDirective);\n\n  readonly config = input<Maybe<DbxClickToCopyTextComponentConfig>>();\n  readonly copyText = input<Maybe<string>>();\n  readonly showIcon = input<Maybe<boolean>>();\n  readonly highlighted = input<Maybe<boolean>>();\n  readonly clipboardSnackbarMessagesConfig = input<Maybe<CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig>>();\n  readonly clipboardSnackbarMessagesEnabled = input<Maybe<boolean>>();\n  readonly clickToCopyIcon = input<Maybe<string>>();\n  readonly clickIconToCopyOnly = input<Maybe<boolean>>();\n\n  readonly copyTextSignal = computed(() => {\n    const config = this.config();\n    return this.copyText() ?? config?.copyText;\n  });\n  readonly showIconSignal = computed(() => {\n    const config = this.config();\n    return this.showIcon() ?? config?.showIcon ?? true;\n  });\n  readonly highlightedSignal = computed(() => {\n    const config = this.config();\n    return this.highlighted() ?? config?.highlighted ?? false;\n  });\n  readonly clipboardSnackbarMessagesConfigSignal = computed(() => {\n    const config = this.config();\n    return this.clipboardSnackbarMessagesConfig() ?? config?.clipboardSnackbarMessagesConfig;\n  });\n  readonly clipboardSnackbarMessagesEnabledSignal = computed(() => {\n    const config = this.config();\n    return this.clipboardSnackbarMessagesEnabled() ?? config?.clipboardSnackbarMessagesEnabled ?? true;\n  });\n  readonly clickToCopyIconSignal = computed(() => {\n    const config = this.config();\n    return this.clickToCopyIcon() ?? config?.clickToCopyIcon ?? DEFAULT_DBX_CLICK_TO_COPY_TEXT_ICON;\n  });\n  readonly clickIconToCopyOnlySignal = computed(() => {\n    const config = this.config();\n    return this.clickIconToCopyOnly() ?? config?.clickIconToCopyOnly ?? false;\n  });\n}\n","import { Component, computed, input, model } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { type Maybe } from '@dereekb/util';\nimport { type CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig } from '../../util';\nimport { DbxClickToCopyTextComponent, type DbxClickToCopyTextComponentConfig } from './copy.text.component';\n\n/**\n * Text shown in place of a secret {@link DbxClickToCopyFieldComponent} value until it is revealed.\n */\nexport const DEFAULT_DBX_CLICK_TO_COPY_FIELD_HIDDEN_TEXT = '••••••••••••••••';\n\n/**\n * Configuration object for {@link DbxClickToCopyFieldComponent}.\n *\n * Extends the {@link DbxClickToCopyTextComponentConfig} the field passes to its `dbx-click-to-copy-text`, except `highlighted`, which\n * underlines inline text and does not suit a field. `copyText` defaults to {@link text}.\n *\n * Pass via the `config` input as an alternative to setting individual inputs. Individual inputs take precedence over config values.\n */\nexport interface DbxClickToCopyFieldComponentConfig extends Omit<DbxClickToCopyTextComponentConfig, 'highlighted'> {\n  /**\n   * The value shown in the field, and copied unless `copyText` is set.\n   */\n  readonly text?: Maybe<string>;\n  /**\n   * Icon shown before the value.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Whether to show the value in a monospace font, for urls, ids, keys, and codes.\n   */\n  readonly monospace?: Maybe<boolean>;\n  /**\n   * Whether the value is a secret. It is then hidden behind {@link hiddenText} until the user reveals it with the field's show/hide button.\n   * Copying always copies the real value.\n   */\n  readonly secret?: Maybe<boolean>;\n  /**\n   * Text shown in place of a hidden secret. Defaults to {@link DEFAULT_DBX_CLICK_TO_COPY_FIELD_HIDDEN_TEXT}.\n   */\n  readonly hiddenText?: Maybe<string>;\n}\n\n/**\n * A read-only field that shows a value, such as a url, id, or key, and copies it when clicked or when its copy icon is clicked.\n *\n * Copying is done by a wrapped `dbx-click-to-copy-text`, and the field passes its copy options (`copyText`, `showIcon`, `clickToCopyIcon`,\n * `clickIconToCopyOnly`, and the clipboard snackbar options) through to it. Set `clickIconToCopyOnly` to leave the value selectable.\n *\n * Set `secret` to hide the value until the user reveals it with the field's show/hide button. Bind `[(revealed)]` to follow or control\n * whether the secret is shown, such as to hide the same secret elsewhere on the page.\n *\n * Accepts either individual inputs or a single `config` object. Individual inputs take precedence over config values.\n *\n * @dbxWebComponent\n * @dbxWebSlug click-to-copy-field\n * @dbxWebCategory text\n * @dbxWebRelated click-to-copy-text\n * @dbxWebMinimalExample ```html\n * <dbx-click-to-copy-field [text]=\"value\"></dbx-click-to-copy-field>\n * ```\n *\n * @example\n * ```html\n * <dbx-click-to-copy-field icon=\"key\" [monospace]=\"true\" [text]=\"clientId\"></dbx-click-to-copy-field>\n * <dbx-click-to-copy-field icon=\"lock\" [monospace]=\"true\" [secret]=\"true\" [text]=\"clientSecret\"></dbx-click-to-copy-field>\n * ```\n */\n@Component({\n  selector: 'dbx-click-to-copy-field',\n  template: `\n    <dbx-click-to-copy-text [config]=\"clickToCopyTextConfigSignal()\">\n      @if (iconSignal()) {\n        <mat-icon class=\"dbx-click-to-copy-field-icon\" aria-hidden=\"true\">{{ iconSignal() }}</mat-icon>\n      }\n      <span class=\"dbx-click-to-copy-field-text\">{{ displayTextSignal() }}</span>\n    </dbx-click-to-copy-text>\n    @if (secretSignal()) {\n      <button type=\"button\" class=\"dbx-click-to-copy-field-reveal\" (click)=\"toggleRevealed()\" [attr.aria-label]=\"revealed() ? 'Hide value' : 'Show value'\" [attr.aria-pressed]=\"revealed()\">\n        <mat-icon aria-hidden=\"true\">{{ revealed() ? 'visibility_off' : 'visibility' }}</mat-icon>\n      </button>\n    }\n  `,\n  host: {\n    class: 'dbx-click-to-copy-field',\n    '[class.dbx-click-to-copy-field-monospace]': 'monospaceSignal()',\n    '[class.dbx-click-to-copy-field-icon-only]': 'clickToCopyTextConfigSignal().clickIconToCopyOnly'\n  },\n  imports: [DbxClickToCopyTextComponent, MatIcon]\n})\nexport class DbxClickToCopyFieldComponent {\n  readonly config = input<Maybe<DbxClickToCopyFieldComponentConfig>>();\n  readonly text = input<Maybe<string>>();\n  readonly icon = input<Maybe<string>>();\n  readonly monospace = input<Maybe<boolean>>();\n  readonly secret = input<Maybe<boolean>>();\n  readonly hiddenText = input<Maybe<string>>();\n\n  // passed through to dbx-click-to-copy-text\n  readonly copyText = input<Maybe<string>>();\n  readonly showIcon = input<Maybe<boolean>>();\n  readonly clickToCopyIcon = input<Maybe<string>>();\n  readonly clickIconToCopyOnly = input<Maybe<boolean>>();\n  readonly clipboardSnackbarMessagesEnabled = input<Maybe<boolean>>();\n  readonly clipboardSnackbarMessagesConfig = input<Maybe<CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig>>();\n\n  /**\n   * Whether a secret value is shown. Hidden at first.\n   */\n  readonly revealed = model<boolean>(false);\n\n  readonly textSignal = computed(() => {\n    const config = this.config();\n    return this.text() ?? config?.text;\n  });\n  readonly iconSignal = computed(() => {\n    const config = this.config();\n    return this.icon() ?? config?.icon;\n  });\n  readonly monospaceSignal = computed(() => {\n    const config = this.config();\n    return this.monospace() ?? config?.monospace ?? false;\n  });\n  readonly secretSignal = computed(() => {\n    const config = this.config();\n    return this.secret() ?? config?.secret ?? false;\n  });\n  readonly hiddenTextSignal = computed(() => {\n    const config = this.config();\n    return this.hiddenText() ?? config?.hiddenText ?? DEFAULT_DBX_CLICK_TO_COPY_FIELD_HIDDEN_TEXT;\n  });\n\n  /**\n   * The copy options passed to the wrapped `dbx-click-to-copy-text`, which applies its own defaults to the unset ones.\n   */\n  readonly clickToCopyTextConfigSignal = computed<DbxClickToCopyTextComponentConfig>(() => {\n    const text = this.textSignal();\n    const config = this.config();\n\n    return {\n      copyText: this.copyText() ?? config?.copyText ?? text,\n      showIcon: this.showIcon() ?? config?.showIcon,\n      clickToCopyIcon: this.clickToCopyIcon() ?? config?.clickToCopyIcon,\n      clickIconToCopyOnly: this.clickIconToCopyOnly() ?? config?.clickIconToCopyOnly,\n      clipboardSnackbarMessagesEnabled: this.clipboardSnackbarMessagesEnabled() ?? config?.clipboardSnackbarMessagesEnabled,\n      clipboardSnackbarMessagesConfig: this.clipboardSnackbarMessagesConfig() ?? config?.clipboardSnackbarMessagesConfig\n    };\n  });\n\n  readonly displayTextSignal = computed(() => {\n    const revealed = this.revealed();\n    const hiddenText = this.hiddenTextSignal();\n    const text = this.textSignal();\n    return this.secretSignal() && !revealed ? hiddenText : text;\n  });\n\n  toggleRevealed(): void {\n    this.revealed.update((x) => !x);\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { DbxUnitedStatesAddressComponent } from './address.component';\nimport { DbxDetailBlockComponent } from './detail.block.component';\nimport { DbxDetailBlockHeaderComponent } from './detail.block.header.component';\nimport { DbxIconSpacerDirective } from './icon.spacer.component';\nimport { DbxLabelBlockComponent } from './label.block.component';\nimport { DbxLinkifyComponent } from './linkify/linkify.component';\nimport { DbxChipDirective } from './text.chip.directive';\nimport { DbxChipListComponent } from './text.chip.list.component';\nimport { DbxTextChipsComponent } from './text.chips.component';\nimport { DbxNumberWithLimitComponent } from './number.limit.component';\nimport { DbxClickToCopyTextDirective } from './copy.text.directive';\nimport { DbxClickToCopyTextComponent } from './copy.text.component';\nimport { DbxClickToCopyFieldComponent } from './copy.field.component';\nimport { DbxStepBlockComponent } from './step.block.component';\n\nconst importsAndExports = [\n  DbxUnitedStatesAddressComponent,\n  DbxNumberWithLimitComponent,\n  DbxClickToCopyTextDirective,\n  DbxClickToCopyTextComponent,\n  DbxClickToCopyFieldComponent,\n  DbxChipDirective,\n  DbxChipListComponent,\n  DbxDetailBlockComponent,\n  DbxDetailBlockHeaderComponent,\n  DbxStepBlockComponent,\n  DbxLabelBlockComponent,\n  DbxLinkifyComponent,\n  DbxTextChipsComponent,\n  DbxIconSpacerDirective\n];\n\n/**\n * Angular module that bundles all text-related layout components and directives, including\n * address display, chips, detail blocks, copy-to-clipboard, linkify, and number-with-limit.\n */\n@NgModule({\n  imports: importsAndExports,\n  exports: importsAndExports\n})\nexport class DbxTextModule {}\n","import { Component, computed, input } from '@angular/core';\nimport { DatePipe, NgClass } from '@angular/common';\nimport { MatIconModule } from '@angular/material/icon';\nimport { TimeDistancePipe } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxSpacerDirective } from '../../../layout';\nimport { DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_CLASS, DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_DATE_STYLE, type DbxFileListItemComponentConfig, type DbxFileListItemDetailsDateStyle } from './download.file.list';\n\n/**\n * One row of a file listing: an optional leading icon, the file's name, an optional details line, and\n * whatever controls the caller projects into the row's trailing slot.\n *\n * Renders the `dbx-list-two-line-item` layout, which is a flat utility rather than something scoped to a\n * dbx-list, so the same row works both as the item component of a dbx-list and inside a plain list of its\n * own. That is the point of the component: the two file listings that exist differ in their list machinery\n * and in their controls, and share only this row.\n *\n * @example\n * ```html\n * <dbx-file-list-item name=\"report.pdf\" details=\"Uploaded\" [detailsDate]=\"uploadedAt\" detailsDateStyle=\"distance\">\n *   <dbx-download-blob-button [config]=\"downloadConfig\"></dbx-download-blob-button>\n * </dbx-file-list-item>\n * ```\n */\n@Component({\n  selector: 'dbx-file-list-item',\n  template: `\n    <div class=\"dbx-list-item-padded dbx-list-two-line-item\">\n      @if (iconSignal(); as icon) {\n        <mat-icon class=\"item-icon\">{{ icon }}</mat-icon>\n      }\n      <div class=\"item-left\">\n        <div class=\"mat-subtitle-2 dbx-text-truncate\" [title]=\"nameSignal()\">{{ nameSignal() }}</div>\n        @if (hasDetailsSignal()) {\n          <div class=\"item-details\" [ngClass]=\"detailsClassSignal()\">\n            @if (detailsSignal(); as details) {\n              <!-- The trailing &ngsp; is the separator from the date that follows, and belongs to the text\n                   rather than sitting between the spans: the details read as one sentence with the date\n                   (\"Uploaded 3 hours ago\"), and Angular drops a whitespace-only text node between two\n                   elements, running the words together. Carried here rather than led on the date so a row\n                   with only a date does not open on a space. -->\n              <span>{{ details }}&ngsp;</span>\n            }\n            @if (renderedDetailsDateSignal(); as detailsDate) {\n              @if (isDetailsDateDistanceSignal()) {\n                <span>{{ detailsDate | timeDistance }}</span>\n              } @else {\n                <span>{{ detailsDate | date: detailsDateStyleSignal() }}</span>\n              }\n            }\n          </div>\n        }\n      </div>\n      <dbx-spacer></dbx-spacer>\n      <div class=\"item-right\"><ng-content></ng-content></div>\n    </div>\n  `,\n  host: {\n    class: 'dbx-file-list-item d-block'\n  },\n  imports: [DatePipe, NgClass, MatIconModule, TimeDistancePipe, DbxSpacerDirective]\n})\nexport class DbxFileListItemComponent {\n  readonly config = input<Maybe<DbxFileListItemComponentConfig>>();\n\n  readonly name = input<Maybe<string>>();\n  readonly icon = input<Maybe<string>>();\n  readonly details = input<Maybe<string>>();\n  readonly detailsDate = input<Maybe<Date>>();\n  readonly detailsDateStyle = input<Maybe<DbxFileListItemDetailsDateStyle>>();\n  readonly detailsClass = input<Maybe<string>>();\n\n  readonly nameSignal = computed(() => {\n    const config = this.config();\n    return this.name() ?? config?.name;\n  });\n\n  readonly iconSignal = computed(() => {\n    const config = this.config();\n    return this.icon() ?? config?.icon;\n  });\n\n  readonly detailsSignal = computed(() => {\n    const config = this.config();\n    return this.details() ?? config?.details;\n  });\n\n  readonly detailsDateSignal = computed(() => {\n    const config = this.config();\n    return this.detailsDate() ?? config?.detailsDate;\n  });\n\n  readonly detailsDateStyleSignal = computed<DbxFileListItemDetailsDateStyle>(() => {\n    const config = this.config();\n    return this.detailsDateStyle() ?? config?.detailsDateStyle ?? DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_DATE_STYLE;\n  });\n\n  readonly detailsClassSignal = computed(() => {\n    const config = this.config();\n    return this.detailsClass() ?? config?.detailsClass ?? DEFAULT_DBX_FILE_LIST_ITEM_DETAILS_CLASS;\n  });\n\n  readonly isDetailsDateDistanceSignal = computed(() => {\n    const detailsDateStyle = this.detailsDateStyleSignal();\n    return detailsDateStyle === 'distance' || detailsDateStyle === 'distance-past';\n  });\n\n  /**\n   * The date the row actually renders.\n   *\n   * A `'distance-past'` date is pinned to now once it runs ahead of the clock, so a timestamp that landed\n   * marginally in the future reads as \"less than a minute ago\" rather than as something yet to happen.\n   */\n  readonly renderedDetailsDateSignal = computed(() => {\n    const detailsDateStyle = this.detailsDateStyleSignal();\n    const detailsDate = this.detailsDateSignal();\n    const now = new Date();\n    let result = detailsDate;\n\n    if (detailsDate != null && detailsDateStyle === 'distance-past' && detailsDate > now) {\n      result = now;\n    }\n\n    return result;\n  });\n\n  readonly hasDetailsSignal = computed(() => {\n    const detailsDate = this.detailsDateSignal();\n    return Boolean(this.detailsSignal() || detailsDate);\n  });\n}\n","import { Component, computed, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxListEmptyContentComponent } from '../../../layout';\nimport { DbxDownloadBlobButtonComponent } from '../blob/download.blob.button.component';\nimport { type DbxFileListComponentConfig, type DbxFileListEntry } from './download.file.list';\nimport { DbxFileListItemComponent } from './download.file.list.item.component';\n\n/**\n * Lists files described by {@link DbxFileListEntry} values, giving each entry that carries a download\n * configuration a download button.\n *\n * For a listing whose rows need controls of their own, build the list from {@link DbxFileListItemComponent}\n * directly and project those controls into each row.\n *\n * @example\n * ```html\n * <dbx-file-list [entries]=\"entriesSignal()\" emptyText=\"No files yet.\"></dbx-file-list>\n * ```\n */\n@Component({\n  selector: 'dbx-file-list',\n  template: `\n    @if (entriesSignal().length) {\n      @for (entry of entriesSignal(); track entry.key) {\n        <dbx-file-list-item [config]=\"entry\">\n          @if (entry.download; as download) {\n            <dbx-download-blob-button [config]=\"download\"></dbx-download-blob-button>\n          }\n        </dbx-file-list-item>\n      }\n    } @else if (emptyTextSignal(); as emptyText) {\n      <dbx-list-empty-content>{{ emptyText }}</dbx-list-empty-content>\n    }\n  `,\n  host: {\n    class: 'dbx-file-list d-block'\n  },\n  imports: [DbxFileListItemComponent, DbxDownloadBlobButtonComponent, DbxListEmptyContentComponent]\n})\nexport class DbxFileListComponent<T = unknown> {\n  readonly config = input<Maybe<DbxFileListComponentConfig<T>>>();\n\n  readonly entries = input<Maybe<DbxFileListEntry<T>[]>>();\n  readonly emptyText = input<Maybe<string>>();\n\n  readonly entriesSignal = computed<DbxFileListEntry<T>[]>(() => {\n    const config = this.config();\n    return this.entries() ?? config?.entries ?? [];\n  });\n\n  readonly emptyTextSignal = computed(() => {\n    const config = this.config();\n    return this.emptyText() ?? config?.emptyText;\n  });\n}\n","import { Component, ElementRef, computed, input, model, viewChild } from '@angular/core';\nimport { type WorkUsingObservable, type LoadingState, loadingStateContext, successResult, valueFromFinishedLoadingState, type MaybeObservableOrValue, maybeValueFromObservableOrValue } from '@dereekb/rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { type Observable, first, of, shareReplay, switchMap } from 'rxjs';\nimport { type DownloadTextContent } from './download.text';\nimport { DbxActionButtonDirective } from '@dereekb/dbx-core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { DbxLoadingComponent } from '../../../loading/loading.component';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { DbxButtonComponent } from '../../../button/button.component';\nimport { DbxActionModule } from '../../../action/action.module';\nimport { DbxButtonSpacerDirective } from '../../../button/button.spacer.directive';\nimport { DbxDownloadBlobButtonComponent, type DbxDownloadBlobButtonConfig } from '../blob/download.blob.button.component';\nimport { AbstractDbxClipboardDirective } from '../../../util/clipboard.directive';\nimport { DbxContentPitDirective } from '../../../layout/content/content.pit.directive';\nimport { DbxActionSnackbarErrorDirective } from '../../../error/error.snackbar.action.directive';\n\n/**\n * Displays a preview of text content with options to copy to clipboard and download as a file. Supports loading states for async content retrieval.\n *\n * @example\n * ```html\n * <dbx-download-text-view [content]=\"{ content: 'Hello World', name: 'greeting.txt', mimeType: 'text/plain' }\" [showPreview]=\"true\"></dbx-download-text-view>\n * ```\n */\n@Component({\n  templateUrl: './download.text.component.html',\n  selector: 'dbx-download-text-view',\n  imports: [DbxActionSnackbarErrorDirective, NgTemplateOutlet, DbxLoadingComponent, DbxActionModule, DbxActionButtonDirective, DbxButtonComponent, DbxButtonSpacerDirective, DbxDownloadBlobButtonComponent, DbxContentPitDirective]\n})\nexport class DbxDownloadTextViewComponent extends AbstractDbxClipboardDirective {\n  readonly downloadButton = viewChild<string, Maybe<ElementRef>>('downloadButton', { read: ElementRef });\n  readonly showDownloadButton = input<boolean>(true);\n\n  readonly loadingText = input<Maybe<string>>(undefined);\n  readonly linear = input<Maybe<boolean>>(undefined);\n  readonly showTitle = input<boolean>(true);\n  readonly showPreview = input<boolean>(true);\n  readonly showExpandPreviewButton = input<boolean>(true);\n\n  readonly expandPreview = model<boolean>(false);\n\n  readonly content = input<Maybe<DownloadTextContent>>(undefined);\n  readonly contentState = input<MaybeObservableOrValue<LoadingState<DownloadTextContent>>>(undefined);\n\n  readonly contentState$ = toObservable(this.contentState).pipe(maybeValueFromObservableOrValue(), shareReplay(1));\n\n  readonly contentStateSignal = toSignal(this.contentState$);\n\n  readonly contentLoadingStateSignal = computed(() => {\n    const content = this.content();\n    const contentState = this.contentStateSignal();\n\n    let result: Maybe<LoadingState<DownloadTextContent>>;\n\n    if (contentState) {\n      result = contentState;\n    } else if (content) {\n      result = successResult(content);\n    }\n\n    return result;\n  });\n\n  readonly contentLoadingState$ = toObservable(this.contentLoadingStateSignal);\n  readonly content$: Observable<Maybe<DownloadTextContent>> = this.contentLoadingState$.pipe(\n    switchMap((x) => {\n      return x ? of(x).pipe(valueFromFinishedLoadingState()) : of(undefined);\n    })\n  );\n\n  readonly contentSignal = toSignal(this.content$);\n  readonly contentDataSignal = computed(() => this.contentSignal()?.content);\n  readonly fileNameSignal = computed(() => this.contentSignal()?.name ?? 'download.txt');\n\n  readonly downloadConfigSignal = computed(() => {\n    const content = this.contentSignal();\n    const fileName = this.fileNameSignal();\n    let result: Maybe<DbxDownloadBlobButtonConfig> = undefined;\n\n    if (content) {\n      result = {\n        blob: new Blob([content.content], { type: content.mimeType ?? 'application/octet-stream' }),\n        fileName\n      };\n    }\n\n    return result;\n  });\n\n  readonly context = loadingStateContext({ obs: this.contentLoadingState$ });\n\n  readonly handleCopyToClipboard: WorkUsingObservable = () => {\n    return this.content$.pipe(\n      first(),\n      switchMap((downloadTextContent: Maybe<DownloadTextContent>) => {\n        return downloadTextContent ? this._copyToClipboard(downloadTextContent.content) : of(false);\n      })\n    );\n  };\n\n  toggleExpandPreview() {\n    this.expandPreview.update((value) => !value);\n  }\n}\n","<div class=\"dbx-download-text-view\">\n  <dbx-loading [context]=\"context\" [linear]=\"linear()\" [text]=\"loadingText()\">\n    <ng-container *ngTemplateOutlet=\"contentView\"></ng-container>\n  </dbx-loading>\n</div>\n\n<!-- Template -->\n<ng-template #contentView>\n  <div class=\"dbx-download-text-view-content\">\n    @if (showTitle()) {\n      <div class=\"dbx-download-text-view-content-title dbx-mb2 mat-subtitle-2\">{{ fileNameSignal() }}</div>\n    }\n    @if (showPreview()) {\n      <dbx-content-pit [scrollable]=\"!expandPreview()\" class=\"dbx-download-text-preview dbx-json dbx-mb3\">\n        <div class=\"dbx-content-pit-scrollable-content\">\n          @if (showExpandPreviewButton()) {\n            <dbx-button class=\"dbx-content-pit-floating-button\" [raised]=\"true\" [icon]=\"expandPreview() ? 'unfold_less' : 'unfold_more'\" (buttonClick)=\"toggleExpandPreview()\"></dbx-button>\n          }\n          {{ contentDataSignal() }}\n        </div>\n      </dbx-content-pit>\n    }\n    <div class=\"dbx-download-text-view-actions\">\n      <dbx-button dbxAction dbxActionValue [raised]=\"true\" [dbxActionHandler]=\"handleCopyToClipboard\" icon=\"content_copy\" dbxActionButton text=\"Copy To Clipboard\" dbxActionSnackbarError></dbx-button>\n      @if (showDownloadButton()) {\n        <dbx-button-spacer></dbx-button-spacer>\n        <dbx-download-blob-button [config]=\"downloadConfigSignal()\"></dbx-download-blob-button>\n      }\n    </div>\n  </div>\n</ng-template>\n","import { inject, Service, InjectionToken } from '@angular/core';\nimport { MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { type MimeTypeWithoutParameters, type ArrayOrValue, asArray } from '@dereekb/util';\nimport {\n  type DbxWebFilePreviewServiceEntry,\n  type DbxWebFilePreviewServicePreviewComponentFunction,\n  type DbxWebFilePreviewServicePreviewComponentFunctionInput,\n  type DbxWebFilePreviewServicePreviewDialogFunction,\n  type DbxWebFilePreviewServicePreviewDialogFunctionInput,\n  type DbxWebFilePreviewServicePreviewDialogWithComponentFunction\n} from './webfilepreview';\nimport { DbxInjectionDialogComponent } from '../../interaction/dialog/dialog.injection.component';\nimport { DbxEmbedComponent, type DbxEmbedComponentElement } from '../../interaction/iframe/embed.component';\n\n/**\n * Default entries to inject.\n */\nexport const DBX_WEB_FILE_PREVIEW_SERVICE_ENTRIES_TOKEN = new InjectionToken<DbxWebFilePreviewServiceEntry[]>('DefaultDbxWebFilePreviewServiceEntries');\n\n/**\n * Creates a provider that registers the given entries with the {@link DbxWebFilePreviewService} via the {@link DBX_WEB_FILE_PREVIEW_SERVICE_ENTRIES_TOKEN}.\n *\n * @param entries - Array of preview service entries to register, each mapping a MIME type to its preview component.\n * @returns A provider configuration that supplies the entries via the injection token.\n *\n * @example\n * ```typescript\n * provideDbxWebFilePreviewServiceEntries([DBX_WEB_FILE_PREVIEW_SERVICE_ZIP_PRESET_ENTRY]);\n * ```\n */\nexport function provideDbxWebFilePreviewServiceEntries(entries: DbxWebFilePreviewServiceEntry[]) {\n  return {\n    provide: DBX_WEB_FILE_PREVIEW_SERVICE_ENTRIES_TOKEN,\n    useValue: entries\n  };\n}\n\n// MARK: Default Functions\n/**\n * Default preview component function that embeds files using {@link DbxEmbedComponent}. Images are rendered with an `img` element; all other types use `embed`.\n *\n * @param input - The preview input containing blob data, source URL, and MIME type information.\n * @returns An injection component config that initializes a {@link DbxEmbedComponent} with the appropriate embed element and content.\n */\nexport const DEFAULT_DBX_WEB_FILE_PREVIEW_SERVICE_PREVIEW_COMPONENT_FUNCTION: DbxWebFilePreviewServicePreviewComponentFunction = (input) => {\n  const { blob, srcUrl, embedMimeType, sanitizeSrcUrl } = input;\n\n  let embedElement: DbxEmbedComponentElement = 'embed';\n\n  if (embedMimeType) {\n    // embed any image mime types to img\n    embedElement = embedMimeType.startsWith('image/') ? 'img' : 'embed';\n  }\n\n  return {\n    componentClass: DbxEmbedComponent,\n    init: (x) => {\n      x.embedElement.set(embedElement);\n\n      if (blob != null) {\n        x.blob.set(blob);\n      }\n\n      if (srcUrl != null) {\n        x.srcUrl.set(srcUrl);\n        x.sanitizeUrl.set(sanitizeSrcUrl ?? true);\n      }\n\n      if (embedMimeType != null) {\n        x.type.set(embedMimeType);\n      }\n    }\n  };\n};\n\n/**\n * Default dialog-with-component function that opens the preview component inside a {@link DbxInjectionDialogComponent} with a close button.\n *\n * @param input - The dialog input containing the MatDialog instance and the component config to display.\n * @returns A MatDialogRef for the opened injection dialog.\n */\nexport const DEFAULT_DBX_WEB_FILE_PREVIEW_SERVICE_DIALOG_WITH_COMPONENT_FUNCTION: DbxWebFilePreviewServicePreviewDialogWithComponentFunction = (input) => {\n  const { matDialog, componentConfig } = input;\n  return DbxInjectionDialogComponent.openDialog(matDialog, {\n    componentConfig,\n    showCloseButton: true\n  });\n};\n\n// MARK: Service\n/**\n * Service used for previewing files with given mime types.\n */\n@Service()\nexport class DbxWebFilePreviewService {\n  readonly matDialog = inject(MatDialog);\n\n  private readonly _entries = new Map<MimeTypeWithoutParameters | string, DbxWebFilePreviewServiceEntry>();\n\n  constructor() {\n    const entries = inject(DBX_WEB_FILE_PREVIEW_SERVICE_ENTRIES_TOKEN, { optional: true });\n    if (entries) {\n      entries.forEach((x) => this.registerPreviewEntry(x));\n    }\n  }\n\n  private _defaultPreviewComponentFunction: DbxWebFilePreviewServicePreviewComponentFunction = DEFAULT_DBX_WEB_FILE_PREVIEW_SERVICE_PREVIEW_COMPONENT_FUNCTION;\n  private _defaultPreviewDialogWithComponentFunction: DbxWebFilePreviewServicePreviewDialogWithComponentFunction = DEFAULT_DBX_WEB_FILE_PREVIEW_SERVICE_DIALOG_WITH_COMPONENT_FUNCTION;\n\n  // Configuration\n  /**\n   * Registers one or more file preview entries, mapping MIME types to their preview components.\n   *\n   * @param entries - Single or array of preview entries to register.\n   */\n  registerPreviewEntries(entries: ArrayOrValue<DbxWebFilePreviewServiceEntry>) {\n    asArray(entries).forEach((entry) => this.registerPreviewEntry(entry));\n  }\n\n  /**\n   * Registers a single file preview entry for its MIME type(s).\n   *\n   * @param entry - The preview entry to register.\n   */\n  registerPreviewEntry(entry: DbxWebFilePreviewServiceEntry) {\n    asArray(entry.mimeType).forEach((mimeType) => this._entries.set(mimeType, entry));\n  }\n\n  /**\n   * Overrides the default preview component function used when no MIME-specific entry is registered.\n   *\n   * @param previewFunction - The preview component function to use as the new default.\n   */\n  setDefaultPreviewComponentFunction(previewFunction: DbxWebFilePreviewServicePreviewComponentFunction) {\n    this._defaultPreviewComponentFunction = previewFunction;\n  }\n\n  /**\n   * Overrides the default dialog-with-component function used when no MIME-specific dialog handler is registered.\n   *\n   * @param previewDialogWithComponentFunction - The dialog-with-component function to use as the new default.\n   */\n  setDefaultPreviewDialogWithComponentFunction(previewDialogWithComponentFunction: DbxWebFilePreviewServicePreviewDialogWithComponentFunction) {\n    this._defaultPreviewDialogWithComponentFunction = previewDialogWithComponentFunction;\n  }\n\n  // Service\n  /**\n   * Creates an injection component config for previewing a file. Uses a MIME-specific preview function if registered, otherwise falls back to the default.\n   *\n   * @param input - The preview input containing blob, URL, and MIME type information.\n   * @returns An injection component config suitable for rendering the file preview.\n   */\n  createPreviewConfig(input: DbxWebFilePreviewServicePreviewComponentFunctionInput) {\n    const { embedMimeType } = input;\n\n    const previewFunction = (embedMimeType ? this._entries.get(embedMimeType)?.previewComponentFunction : undefined) ?? this._defaultPreviewComponentFunction;\n    return previewFunction(input);\n  }\n\n  /**\n   * Opens a Material dialog to preview a file. Uses a MIME-specific dialog function if registered, otherwise creates a preview component and wraps it in the default dialog.\n   *\n   * @param input - The dialog input containing file data and MIME type.\n   * @returns Reference to the opened dialog.\n   */\n  openPreviewDialog(input: DbxWebFilePreviewServicePreviewDialogFunctionInput): MatDialogRef<unknown, unknown> {\n    const { embedMimeType } = input;\n    const previewDialogFunction: DbxWebFilePreviewServicePreviewDialogFunction | undefined = embedMimeType ? this._entries.get(embedMimeType)?.previewDialogFunction : undefined;\n    let matDialogRef: MatDialogRef<unknown, unknown>;\n\n    if (previewDialogFunction) {\n      matDialogRef = previewDialogFunction({\n        matDialog: this.matDialog,\n        ...input\n      });\n    } else {\n      const componentConfig = this.createPreviewConfig(input);\n      matDialogRef = this._defaultPreviewDialogWithComponentFunction({\n        matDialog: this.matDialog,\n        ...input,\n        componentConfig\n      });\n    }\n\n    return matDialogRef;\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DbxWebFilePreviewService } from './webfilepreview.service';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxWebFilePreviewServicePreviewComponentFunctionInput } from './webfilepreview';\n\n/**\n * Config for DbxWebFilePreviewComponent.\n */\nexport type DbxWebFilePreviewComponentConfig = DbxWebFilePreviewServicePreviewComponentFunctionInput;\n\n/**\n * Previews a file by delegating to the {@link DbxWebFilePreviewService} to resolve the appropriate preview component for the given MIME type.\n *\n * @example\n * ```html\n * <dbx-web-file-preview [config]=\"{ srcUrl: 'https://example.com/doc.pdf', embedMimeType: 'application/pdf' }\"></dbx-web-file-preview>\n * ```\n */\n@Component({\n  selector: 'dbx-web-file-preview',\n  template: `\n    <dbx-injection [config]=\"componentConfigSignal()\"></dbx-injection>\n  `,\n  imports: [DbxInjectionComponent]\n})\nexport class DbxWebFilePreviewComponent {\n  readonly webFilePreviewService = inject(DbxWebFilePreviewService);\n\n  readonly config = input<Maybe<DbxWebFilePreviewComponentConfig>>();\n\n  readonly componentConfigSignal = computed(() => {\n    const config = this.config();\n\n    let componentConfig: Maybe<DbxInjectionComponentConfig<any>>;\n\n    if (config) {\n      componentConfig = this.webFilePreviewService.createPreviewConfig(config);\n    }\n\n    return componentConfig;\n  });\n}\n","import { mimeTypeForFileExtension, type MimeTypeWithoutParameters, slashPathDetails, slashPathDirectoryTree, type SlashPathDirectoryTreeNode, type SlashPathDirectoryTreeNodeValue, type SlashPathDirectoryTreeRoot, type Maybe, type Getter } from '@dereekb/util';\nimport { BlobWriter, type Entry, type FileEntry } from '@zip.js/zip.js';\n\n/**\n * Extends {@link SlashPathDirectoryTreeNodeValue} with MIME type detection and optional blob retrieval for a zip archive entry.\n */\nexport type DbxZipBlobPreviewEntryNodeValue<T extends Entry = Entry> = SlashPathDirectoryTreeNodeValue<T> & {\n  readonly mimeType: Maybe<MimeTypeWithoutParameters>;\n  readonly getBlob?: Getter<Promise<Blob>>;\n};\n\n/**\n * Tree node representing a single entry (file or directory) within a zip archive preview.\n */\nexport type DbxZipBlobPreviewEntryTreeNode<T extends Entry = Entry> = SlashPathDirectoryTreeNode<T, DbxZipBlobPreviewEntryNodeValue<T>>;\n\n/**\n * Root node of the directory tree built from zip archive entries.\n */\nexport type DbxZipBlobPreviewEntryTreeRoot = SlashPathDirectoryTreeRoot<Entry, DbxZipBlobPreviewEntryNodeValue<Entry>>;\n\n/**\n * Builds a directory tree from an array of zip archive entries, enriching each node with MIME type detection and blob retrieval capability.\n *\n * @param entries - Array of zip archive entries to build the tree from, or null/undefined for an empty tree.\n * @returns The root node of the constructed directory tree with MIME types and blob getters attached.\n *\n * @example\n * ```typescript\n * const root = dbxZipBlobPreviewEntryTreeFromEntries(zipEntries);\n * // root.children contains the top-level files and directories\n * ```\n */\nexport function dbxZipBlobPreviewEntryTreeFromEntries(entries: Maybe<Entry[]>): DbxZipBlobPreviewEntryTreeRoot {\n  const nodeValues: DbxZipBlobPreviewEntryNodeValue[] = (entries ?? []).map((value) => {\n    const nodeSlashPathDetails = slashPathDetails(value.filename);\n    const mimeType = mimeTypeForFileExtension(nodeSlashPathDetails.typedFileExtension);\n\n    return {\n      value,\n      mimeType,\n      slashPathDetails: nodeSlashPathDetails,\n      getBlob: (value as FileEntry).getData ? () => (value as FileEntry).getData(new BlobWriter(mimeType ?? undefined)) : undefined\n    };\n  });\n\n  return slashPathDirectoryTree(nodeValues);\n}\n","import { Component } from '@angular/core';\nimport {\n  type DbxValueAsListItem,\n  DEFAULT_LIST_WRAPPER_COMPONENT_CONFIGURATION_TEMPLATE,\n  DbxListWrapperComponentImportsModule,\n  provideDbxListViewWrapper,\n  AbstractDbxSelectionListWrapperDirective,\n  DEFAULT_DBX_SELECTION_VALUE_LIST_COMPONENT_CONFIGURATION_TEMPLATE,\n  DbxSelectionValueListViewComponentImportsModule,\n  provideDbxListView,\n  AbstractDbxSelectionListViewDirective,\n  type DbxSelectionValueListViewConfig,\n  AbstractDbxValueListViewItemComponent\n} from '../../layout';\nimport { of } from 'rxjs';\nimport { type DbxZipBlobPreviewEntryTreeNode } from './zip.blob';\nimport { DbxDownloadBlobButtonComponent, type DbxDownloadBlobButtonConfig } from '../download/blob/download.blob.button.component';\nimport { DbxFileListItemComponent } from '../download/list/download.file.list.item.component';\n\n/**\n * A zip preview entry tree node wrapped as a list item for use in selection-based list views.\n */\nexport type DbxZipPreviewEntryWithSelection = DbxValueAsListItem<DbxZipBlobPreviewEntryTreeNode>;\n\n/**\n * Returns the appropriate Material icon name for a zip entry tree node: \"folder\" for directories, \"note\" for files with a known MIME type, or \"question_mark\" for unknown files.\n *\n * @param entry - The zip entry tree node to determine the icon for.\n * @returns The Material icon name: \"folder\", \"note\", or \"question_mark\".\n *\n * @example\n * ```typescript\n * const icon = iconForDbxZipPreviewEntryWithSelection(treeNode); // 'folder', 'note', or 'question_mark'\n * ```\n */\nexport function iconForDbxZipPreviewEntryWithSelection(entry: DbxZipBlobPreviewEntryTreeNode) {\n  return entry.value.value.directory ? 'folder' : entry.value.mimeType ? 'note' : 'question_mark';\n}\n\n/**\n * Selection list wrapper for displaying zip file entries with icons for directories and files.\n *\n * @example\n * ```html\n * <dbx-zip-preview-file-entry-list [values$]=\"entries$\"></dbx-zip-preview-file-entry-list>\n * ```\n */\n@Component({\n  selector: 'dbx-zip-preview-file-entry-list',\n  template: DEFAULT_LIST_WRAPPER_COMPONENT_CONFIGURATION_TEMPLATE,\n  imports: [DbxListWrapperComponentImportsModule],\n  providers: provideDbxListViewWrapper(DbxZipPreviewEntryListComponent)\n})\nexport class DbxZipPreviewEntryListComponent extends AbstractDbxSelectionListWrapperDirective<DbxZipPreviewEntryWithSelection> {\n  constructor() {\n    super({\n      componentClass: DbxZipPreviewEntryListViewComponent,\n      defaultSelectionMode: 'view'\n    });\n  }\n}\n\n/**\n * Internal list view component for rendering zip file entry items with selection support. Used by {@link DbxZipPreviewEntryListComponent}.\n */\n@Component({\n  selector: 'dbx-zip-preview-file-entry-list-view',\n  template: DEFAULT_DBX_SELECTION_VALUE_LIST_COMPONENT_CONFIGURATION_TEMPLATE,\n  imports: [DbxSelectionValueListViewComponentImportsModule],\n  providers: provideDbxListView(DbxZipPreviewEntryListViewComponent)\n})\nexport class DbxZipPreviewEntryListViewComponent extends AbstractDbxSelectionListViewDirective<DbxZipPreviewEntryWithSelection> {\n  readonly config: DbxSelectionValueListViewConfig<DbxZipPreviewEntryWithSelection> = {\n    componentClass: DbxZipPreviewEntryListViewItemComponent,\n    mapValuesToItemValues: (x) => of(x.map((y) => ({ ...y, key: y.value.slashPathDetails.path, icon: iconForDbxZipPreviewEntryWithSelection(y), itemValue: y })))\n  };\n}\n\n/**\n * Individual list item component for a zip entry, displaying the file name, last modified date, and a download button for non-directory entries.\n */\n@Component({\n  selector: 'dbx-zip-preview-file-entry-list-view-item',\n  template: `\n    <dbx-file-list-item [name]=\"name\" [detailsDate]=\"lastModDate\">\n      @if (canDownload) {\n        <dbx-download-blob-button [config]=\"downloadBlobButtonConfig\"></dbx-download-blob-button>\n      }\n    </dbx-file-list-item>\n  `,\n  imports: [DbxFileListItemComponent, DbxDownloadBlobButtonComponent]\n})\nexport class DbxZipPreviewEntryListViewItemComponent extends AbstractDbxValueListViewItemComponent<DbxZipPreviewEntryWithSelection> {\n  get name() {\n    return this.itemValue.value.value.filename;\n  }\n\n  get lastModDate() {\n    return this.itemValue.value.value.lastModDate ?? undefined;\n  }\n\n  get isDirectory() {\n    return this.itemValue.value.value.directory;\n  }\n\n  get canDownload() {\n    return !this.isDirectory;\n  }\n\n  get downloadBlobButtonConfig(): DbxDownloadBlobButtonConfig {\n    return {\n      loadBlob: this.itemValue.value.getBlob,\n      fileName: this.itemValue.value.slashPathDetails.fileName,\n      buttonStylePair: {\n        display: {\n          icon: 'download',\n          text: 'Download'\n        },\n        style: {\n          type: 'stroked'\n        }\n      }\n    };\n  }\n}\n","import { Component, computed, input, type Signal, signal } from '@angular/core';\nimport { cleanLoadingContext } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { ZipReader, BlobReader, type Entry, type FileEntry } from '@zip.js/zip.js';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { DbxLoadingComponent } from '../../loading';\nimport { distinctUntilChanged, map, type Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { type LoadingState, loadingStateFromObs, valueFromFinishedLoadingState } from '@dereekb/rxjs';\nimport { dbxZipBlobPreviewEntryTreeFromEntries, type DbxZipBlobPreviewEntryTreeNode } from './zip.blob';\nimport { DbxZipPreviewEntryListComponent } from './zip.blob.preview.list.component';\nimport { DbxBarHeaderComponent, type DbxListTitleGroupData, DbxListTitleGroupDirective, type DbxListTitleGroupTitleDelegate, DbxSpacerDirective, DbxValueListItemModifierDirective } from '../../layout';\nimport { type AnchorForValueFunction, DbxListItemAnchorModifierDirective } from '../../router';\nimport { DbxEmbedComponent } from '../../interaction';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { DbxButtonSpacerDirective, DbxButtonComponent } from '../../button';\nimport { DbxDownloadBlobButtonComponent, type DbxDownloadBlobButtonConfig } from '../download/blob/download.blob.button.component';\n\n/**\n * Display mode for the zip blob preview: browsing directories or viewing a specific file entry.\n */\nexport type DbxZipBlobPreviewMode = 'view_directory' | 'view_entry';\n\n/**\n * Group classification for zip preview entries: either a directory or a file.\n */\nexport type DbxZipBlobPreviewGroupValue = 'directory' | 'file';\n\n/**\n * Group data used for sorting and titling directory/file groups in the zip preview list.\n */\nexport type DbxZipBlobPreviewGroupData = DbxListTitleGroupData<DbxZipBlobPreviewGroupValue> & { sort: number };\n\n/**\n * Displays an interactive file browser for a zip archive blob, allowing navigation through directories and previewing/downloading individual files.\n *\n * @example\n * ```html\n * <dbx-zip-blob-preview [blob]=\"zipBlob\" [downloadFileName]=\"'archive.zip'\"></dbx-zip-blob-preview>\n * ```\n */\n@Component({\n  selector: 'dbx-zip-blob-preview',\n  templateUrl: './zip.blob.preview.component.html',\n  imports: [\n    MatToolbarModule,\n    DbxButtonSpacerDirective,\n    DbxButtonComponent,\n    DbxBarHeaderComponent,\n    DbxListTitleGroupDirective,\n    DbxZipPreviewEntryListComponent,\n    DbxEmbedComponent,\n    DbxLoadingComponent,\n    DbxValueListItemModifierDirective,\n    DbxListItemAnchorModifierDirective,\n    DbxListTitleGroupDirective,\n    DbxDownloadBlobButtonComponent,\n    DbxSpacerDirective\n  ]\n})\nexport class DbxZipBlobPreviewComponent {\n  readonly blob = input<Maybe<Blob>>();\n\n  /**\n   * The download file name for the zip file.\n   *\n   * If not defined, then the file cannot be downloaded directly.\n   */\n  readonly downloadFileName = input<Maybe<string>>();\n\n  readonly hasBlobSignal = computed(() => !!this.blob());\n\n  readonly zipReaderSignal = computed(() => {\n    const blob = this.blob();\n    return blob ? new ZipReader(new BlobReader(blob)) : undefined;\n  });\n\n  readonly downloadZipFileBlobButtonConfigSignal = computed(() => {\n    const blob = this.blob();\n    const fileName = this.downloadFileName();\n\n    let result: Maybe<DbxDownloadBlobButtonConfig> = undefined;\n\n    if (blob && fileName) {\n      result = {\n        blob,\n        fileName: fileName ?? 'download.zip',\n        buttonStylePair: {\n          display: {\n            icon: 'download_for_offline',\n            text: 'Download Zip'\n          },\n          style: {\n            type: 'stroked'\n          }\n        }\n      };\n    }\n\n    return result;\n  });\n\n  readonly zipReader$ = toObservable(this.zipReaderSignal);\n\n  readonly allEntriesLoadingState$: Observable<LoadingState<Entry[]>> = loadingStateFromObs(this.zipReader$.pipe(switchMap((x) => (x ? x.getEntries() : of([])))));\n  readonly allEntries$ = this.allEntriesLoadingState$.pipe(valueFromFinishedLoadingState(), distinctUntilChanged(), shareReplay(1));\n  readonly allEntriesRoot$ = this.allEntries$.pipe(\n    map((x) => dbxZipBlobPreviewEntryTreeFromEntries(x)),\n    shareReplay(1)\n  );\n\n  readonly allEntriesRootSignal = toSignal(this.allEntriesRoot$);\n\n  readonly selectedNodeSignal = signal<Maybe<DbxZipBlobPreviewEntryTreeNode>>(undefined);\n\n  readonly listTitleGroupDelegate: DbxListTitleGroupTitleDelegate<DbxZipBlobPreviewEntryTreeNode, DbxZipBlobPreviewGroupValue, DbxZipBlobPreviewGroupData> = {\n    groupValueForItem: (item) => {\n      const group: DbxZipBlobPreviewGroupValue = item.itemValue.value.value.directory ? 'directory' : 'file';\n      return group;\n    },\n    dataForGroupValue: (value: DbxZipBlobPreviewGroupValue, items) => {\n      const data: DbxZipBlobPreviewGroupData = {\n        title: (value === 'directory' ? 'Directories' : 'Files') + ` (${items.length})`,\n        value,\n        sort: value === 'directory' ? 0 : 1,\n        cssClasses: ['dbx-zip-blob-preview-list-group']\n      };\n\n      return data;\n    },\n    sortGroupsByData: (a, b) => {\n      return a.sort - b.sort;\n    }\n  };\n\n  readonly modeSignal = computed(() => {\n    const selectedNode = this.selectedNodeSignal();\n\n    let mode = 'view_directory';\n\n    if (selectedNode && !selectedNode.value.value.directory) {\n      mode = 'view_entry';\n    }\n\n    return mode;\n  });\n\n  readonly listEntriesSignal = computed(() => {\n    const allEntries = this.allEntriesRootSignal();\n    const selectedNode = this.selectedNodeSignal();\n\n    let entries: Maybe<DbxZipBlobPreviewEntryTreeNode[]>;\n\n    if (selectedNode) {\n      if (selectedNode.value.value.directory) {\n        entries = selectedNode.children;\n      } else {\n        entries = selectedNode.parent?.children;\n      }\n    } else {\n      entries = allEntries?.children;\n    }\n\n    return entries ?? [];\n  });\n\n  readonly listEntries$ = toObservable(this.listEntriesSignal);\n  readonly listEntriesState$ = loadingStateFromObs(this.listEntries$);\n\n  readonly selectedNodeIconSignal = computed(() => {\n    const selectedNode = this.selectedNodeSignal();\n\n    let icon: string;\n\n    if (selectedNode) {\n      if (selectedNode.value.value.directory) {\n        icon = 'folder';\n      } else {\n        icon = 'note';\n      }\n    } else {\n      icon = 'home';\n    }\n\n    return icon;\n  });\n\n  readonly selectedNodePathSignal = computed(() => {\n    const selectedNode = this.selectedNodeSignal();\n    return ['Home', ...(selectedNode?.value.slashPathDetails.parts ?? [])].join(' > ');\n  });\n\n  readonly selectedFileNodeSignal: Signal<Maybe<DbxZipBlobPreviewEntryTreeNode<FileEntry>>> = computed(() => {\n    const selectedNode = this.selectedNodeSignal();\n    return selectedNode?.value.value.directory ? undefined : (selectedNode as DbxZipBlobPreviewEntryTreeNode<FileEntry>);\n  });\n\n  readonly selectedFileEntry$ = toObservable(this.selectedFileNodeSignal);\n  readonly selectedFileEntryBlob$: Observable<Maybe<Blob>> = this.selectedFileEntry$.pipe(\n    switchMap((x) => (x?.value.getBlob ? x.value.getBlob() : of(undefined))),\n    shareReplay(1)\n  );\n  readonly selectedFileEntryBlobSignal: Signal<Maybe<Blob>> = toSignal(this.selectedFileEntryBlob$);\n\n  readonly context = cleanLoadingContext({ obs: this.allEntriesLoadingState$ });\n\n  readonly makeEntryAnchor: AnchorForValueFunction<DbxZipBlobPreviewEntryTreeNode> = (itemValue) => {\n    return {\n      onClick: () => {\n        this.selectedNodeSignal.set(itemValue);\n      }\n    };\n  };\n\n  readonly homeClicked = () => {\n    this.selectedNodeSignal.set(undefined);\n  };\n\n  readonly backClicked = () => {\n    const selectedNode = this.selectedNodeSignal();\n    this.selectedNodeSignal.set(selectedNode?.parent);\n  };\n}\n","<dbx-loading [context]=\"context\">\n  <div class=\"dbx-flex-bar dbx-zip-blob-preview-toolbar\">\n    <dbx-button [disabled]=\"!selectedNodeSignal()\" icon=\"arrow_upward\" text=\"Back\" (buttonClick)=\"backClicked()\"></dbx-button>\n    <dbx-button-spacer></dbx-button-spacer>\n    <dbx-button [disabled]=\"!selectedNodeSignal()\" icon=\"home\" text=\"Home\" (buttonClick)=\"homeClicked()\"></dbx-button>\n    <dbx-spacer></dbx-spacer>\n    @if (downloadZipFileBlobButtonConfigSignal()) {\n      <dbx-download-blob-button [config]=\"downloadZipFileBlobButtonConfigSignal()\"></dbx-download-blob-button>\n    }\n  </div>\n  <dbx-bar-header class=\"dbx-zip-blob-preview-header\" [icon]=\"selectedNodeIconSignal()\" [text]=\"selectedNodePathSignal()\"></dbx-bar-header>\n  <div class=\"dbx-zip-blob-preview-content\">\n    @switch (modeSignal()) {\n      @case ('view_directory') {\n        <dbx-zip-preview-file-entry-list [state]=\"listEntriesState$\" [dbxListTitleGroup]=\"listTitleGroupDelegate\" [dbxListItemModifier] [dbxListItemAnchorModifier]=\"makeEntryAnchor\"></dbx-zip-preview-file-entry-list>\n      }\n      @case ('view_entry') {\n        <dbx-embed class=\"dbx-zip-blob-preview-content-embed\" [blob]=\"selectedFileEntryBlobSignal()\"></dbx-embed>\n      }\n    }\n  </div>\n</dbx-loading>\n","import { Component, model } from '@angular/core';\nimport { cleanLoadingContext } from '@dereekb/dbx-core';\nimport { DbxLoadingComponent } from '../../loading';\nimport { type Maybe, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { combineLatest, distinctUntilChanged, from, type Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { beginLoading, errorResult, type LoadingState, startWithBeginLoading, successResult, valueFromFinishedLoadingState } from '@dereekb/rxjs';\nimport { DbxZipBlobPreviewComponent } from './zip.blob.preview.component';\n\n/**\n * Previews the contents of a zip archive from either a URL or a blob. Fetches and parses the zip file, then delegates rendering to {@link DbxZipBlobPreviewComponent}.\n *\n * @example\n * ```html\n * <dbx-zip-preview [srcUrl]=\"'https://example.com/archive.zip'\" [downloadFileName]=\"'archive.zip'\"></dbx-zip-preview>\n * ```\n */\n@Component({\n  selector: 'dbx-zip-preview',\n  template: `\n    <dbx-loading [context]=\"context\">\n      <dbx-zip-blob-preview [downloadFileName]=\"downloadFileName()\" [blob]=\"zipFileBlobSignal()\"></dbx-zip-blob-preview>\n    </dbx-loading>\n  `,\n  imports: [DbxLoadingComponent, DbxZipBlobPreviewComponent]\n})\nexport class DbxZipPreviewComponent {\n  /**\n   * The URL to download the zip file from, if applicable.\n   */\n  readonly srcUrl = model<Maybe<WebsiteUrlWithPrefix>>();\n\n  /**\n   * The blob to use for the zip file, if applicable.\n   */\n  readonly blob = model<Maybe<Blob>>();\n\n  /**\n   * The file name to use for the zip file.\n   */\n  readonly downloadFileName = model<Maybe<string>>();\n\n  readonly srcUrl$ = toObservable(this.srcUrl);\n  readonly blob$ = toObservable(this.blob);\n\n  readonly zipFileBlobLoadingState$ = combineLatest([this.srcUrl$, this.blob$]).pipe(\n    switchMap(([srcUrl, blob]) => {\n      let obs: Observable<LoadingState<Blob>>;\n\n      if (blob) {\n        obs = of(successResult(blob));\n      } else if (srcUrl) {\n        obs = from(\n          fetch(srcUrl, { method: 'GET' }).then((x) =>\n            x\n              .blob()\n              .then((y) => successResult(y))\n              .catch((e) => errorResult<Blob>(e))\n          )\n        ).pipe(startWithBeginLoading());\n      } else {\n        obs = of(beginLoading<Blob>());\n      }\n\n      return obs;\n    })\n  );\n\n  readonly zipFileBlob$ = this.zipFileBlobLoadingState$.pipe(valueFromFinishedLoadingState(), distinctUntilChanged(), shareReplay(1));\n  readonly zipFileBlobSignal = toSignal(this.zipFileBlob$);\n\n  readonly context = cleanLoadingContext({ obs: this.zipFileBlobLoadingState$ });\n}\n","import { type MatDialog, type MatDialogRef, type MatDialogConfig } from '@angular/material/dialog';\nimport { type WebsiteUrlWithPrefix, type Maybe } from '@dereekb/util';\nimport { DbxInjectionDialogComponent } from '../../interaction/dialog';\nimport { DbxZipPreviewComponent } from './zip.preview.component';\n\n/**\n * Configuration for opening a zip preview dialog, extending Material dialog config with zip-specific source options.\n */\nexport interface DbxZipPreviewDialogConfig extends Omit<MatDialogConfig, 'data'> {\n  readonly srcUrl?: Maybe<WebsiteUrlWithPrefix>;\n  readonly blob?: Maybe<Blob>;\n  readonly downloadFileName?: Maybe<string>;\n}\n\n/**\n * Opens a dialog with DbxZipPreviewComponent.\n *\n * @param matDialog - The MatDialog instance to use.\n * @param config - The configuration for the dialog.\n * @returns The MatDialogRef for the dialog.\n */\nexport function openZipPreviewDialog(matDialog: MatDialog, config: DbxZipPreviewDialogConfig): MatDialogRef<DbxInjectionDialogComponent<DbxZipPreviewComponent>, void> {\n  return DbxInjectionDialogComponent.openDialog(matDialog, {\n    ...config,\n    showCloseButton: false,\n    componentConfig: {\n      componentClass: DbxZipPreviewComponent,\n      init: (x) => {\n        const { blob, srcUrl, downloadFileName } = config;\n\n        if (blob != null) {\n          x.blob.set(blob);\n        }\n\n        if (srcUrl != null) {\n          x.srcUrl.set(srcUrl);\n        }\n\n        if (downloadFileName != null) {\n          x.downloadFileName.set(downloadFileName);\n        }\n      }\n    }\n  });\n}\n","import { ZIP_FILE_MIME_TYPE } from '@dereekb/util';\nimport { DbxZipPreviewComponent } from '../zip';\nimport { type DbxWebFilePreviewServicePreviewComponentFunction, type DbxWebFilePreviewServiceEntry } from './webfilepreview';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\n\n// MARK: Zip\n/**\n * Preview component function preset that renders zip files using {@link DbxZipPreviewComponent}.\n *\n * @param input - The preview input containing the source URL and MIME type of the zip file.\n * @returns An injection component config that initializes a {@link DbxZipPreviewComponent} with the given source URL.\n */\nexport const DBX_WEB_FILE_PREVIEW_SERVICE_ZIP_COMPONENT_PRESET: DbxWebFilePreviewServicePreviewComponentFunction = (input) => {\n  const { srcUrl } = input;\n  const config: DbxInjectionComponentConfig<DbxZipPreviewComponent> = {\n    componentClass: DbxZipPreviewComponent,\n    init: (x) => {\n      x.srcUrl.set(srcUrl);\n    }\n  };\n\n  return config;\n};\n\n/**\n * DbxWebFilePreviewServiceEntry for previewing a zip file using a DbxZipPreviewDialogComponent.\n */\nexport const DBX_WEB_FILE_PREVIEW_SERVICE_ZIP_PRESET_ENTRY: DbxWebFilePreviewServiceEntry = {\n  mimeType: ZIP_FILE_MIME_TYPE,\n  previewComponentFunction: DBX_WEB_FILE_PREVIEW_SERVICE_ZIP_COMPONENT_PRESET\n};\n","import { Directive, ElementRef, Injector, inject } from '@angular/core';\n\n/**\n * Exposes the Angular {@link Injector} and {@link ElementRef} at the host element, enabling child components to inject a reference to a well-placed parent element.\n *\n * @example\n * ```html\n * <div dbxStructure>\n *   <!-- Children can inject DbxStructureDirective to access this element's injector -->\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxStructure]'\n})\nexport class DbxStructureDirective {\n  readonly injector = inject(Injector);\n  readonly element = inject(ElementRef);\n}\n","import { Directive } from '@angular/core';\nimport { DbxStructureDirective } from './structure.structure.directive';\n\n/**\n * Specialized {@link DbxStructureDirective} intended for the application body element. Provides itself as a `DbxStructureDirective` so child components can inject a reference to the body's injector and element.\n *\n * @example\n * ```html\n * <div dbxBody>\n *   <!-- App content that can inject DbxStructureDirective -->\n * </div>\n * ```\n */\n@Directive({\n  selector: 'dbxBody,[dbxBody]',\n  providers: [\n    {\n      provide: DbxStructureDirective,\n      useExisting: DbxBodyDirective\n    }\n  ]\n})\nexport class DbxBodyDirective extends DbxStructureDirective {}\n","import { type Maybe } from '@dereekb/util';\nimport { type DbxWebPageTitleDetails, type DbxWebPageTitleInfoConfig } from './title';\n\n/**\n * Input handed to {@link DbxWebPageTitleDelegate#buildPageTitleDetails}.\n *\n * The directive {@link chain} (root → leaf) and the service-level {@link rootConfig} are kept separate so a delegate can apply different rules\n * to the app-wide root config than to the directive-supplied chain (e.g., always render the root config last regardless of leaf order, or skip it entirely).\n */\nexport interface DbxWebPageTitleDelegateInput {\n  /**\n   * Hierarchical chain supplied by `[dbxWebPageTitleInfo]` directives, ordered root → leaf. Excludes the service-level root config.\n   */\n  readonly chain: readonly DbxWebPageTitleInfoConfig[];\n  /**\n   * Service-level root config, if one was provided via {@link DbxWebPageTitleServiceConfig#rootConfig}. `undefined` when no root config is set.\n   */\n  readonly rootConfig?: Maybe<DbxWebPageTitleInfoConfig>;\n}\n\n/**\n * Combines the directive chain plus the optional service-level root config into the final {@link DbxWebPageTitleDetails}.\n * Apps may swap in a custom delegate via {@link DbxWebPageTitleService#setDelegate}.\n */\nexport interface DbxWebPageTitleDelegate {\n  buildPageTitleDetails(input: DbxWebPageTitleDelegateInput): DbxWebPageTitleDetails;\n}\n\n/**\n * Configuration for {@link dbxWebDefaultPageTitleDelegate}.\n */\nexport interface DbxWebDefaultPageTitleDelegateConfig {\n  /**\n   * Final fallback title used when the combined chain produces no non-empty title segments. Defaults to ''.\n   */\n  readonly defaultTitle?: string;\n  /**\n   * Separator between non-empty title segments. Defaults to ' | '.\n   */\n  readonly separator?: string;\n  /**\n   * If true, segments are joined leaf-first (e.g. 'Page | Section | App').\n   * If false, root-first (e.g. 'App | Section | Page'). Defaults to true.\n   */\n  readonly leafFirst?: boolean;\n  /**\n   * If set, appended to the final title using the same separator (e.g. ' | MyApp'). Useful when neither the chain nor the rootConfig carries an app-name segment.\n   */\n  readonly appNameSuffix?: Maybe<string>;\n}\n\n/**\n * Builds a {@link DbxWebPageTitleDelegate} that prepends the optional rootConfig to the directive chain, then joins non-empty title segments with a separator.\n *\n * - Title: rootConfig (if set) sits at the root; the chain extends from there toward the leaf. Non-empty `title` values are joined using `separator`,\n *   leaf-first by default. When the combined chain has no non-empty segments, `defaultTitle` is used. When `appNameSuffix` is set, it is appended with the same separator.\n * - Description: the leaf-most non-empty `description` across the combined chain wins. Falls back to `undefined` if no segment provides one.\n *\n * @param config - Delegate configuration.\n * @returns A configured {@link DbxWebPageTitleDelegate}.\n *\n * @example\n * ```ts\n * const delegate = dbxWebDefaultPageTitleDelegate({ separator: ' · ' });\n * delegate.buildPageTitleDetails({ chain: [{ title: 'Inbox' }], rootConfig: { title: 'MyApp' } }); // { title: 'Inbox · MyApp' }\n * ```\n */\nexport function dbxWebDefaultPageTitleDelegate(config: DbxWebDefaultPageTitleDelegateConfig = {}): DbxWebPageTitleDelegate {\n  const { defaultTitle = '', separator = ' | ', leafFirst = true, appNameSuffix } = config;\n\n  return {\n    buildPageTitleDetails({ chain, rootConfig }) {\n      const fullChain: readonly DbxWebPageTitleInfoConfig[] = rootConfig ? [rootConfig, ...chain] : chain;\n\n      const segments: string[] = [];\n      for (const item of fullChain) {\n        const t = item.title?.trim();\n        if (t) segments.push(t);\n      }\n\n      const ordered = leafFirst ? [...segments].reverse() : segments;\n      let title = ordered.length > 0 ? ordered.join(separator) : defaultTitle;\n      if (appNameSuffix) {\n        title = `${title}${separator}${appNameSuffix}`;\n      }\n\n      let description: Maybe<string>;\n      for (let i = fullChain.length - 1; i >= 0; i -= 1) {\n        const d = fullChain[i].description;\n        if (d) {\n          description = d;\n          break;\n        }\n      }\n\n      return { title, description };\n    }\n  };\n}\n","import { DestroyRef, Injectable, InjectionToken, inject } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { BehaviorSubject, NEVER, type Observable, combineLatest, distinctUntilChanged, map, of, shareReplay, switchMap } from 'rxjs';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxWebPageTitleDelegate, dbxWebDefaultPageTitleDelegate } from './title.delegate';\nimport { type DbxWebPageTitleDetails, type DbxWebPageTitleInfoConfig, type DbxWebPageTitleInfoReference } from './title';\n\n/**\n * Configuration for {@link DbxWebPageTitleService}, supplied via {@link DBX_WEB_PAGE_TITLE_SERVICE_CONFIG}.\n */\nexport interface DbxWebPageTitleServiceConfig {\n  /**\n   * Initial delegate to use. If omitted, the default {@link dbxWebDefaultPageTitleDelegate} is used.\n   */\n  readonly initialDelegate?: DbxWebPageTitleDelegate;\n  /**\n   * Initial value for `isTitleSyncEnabled$`. Defaults to true.\n   */\n  readonly initialTitleSyncEnabled?: boolean;\n  /**\n   * Default/root config that the service prepends to every chain handed to the delegate. Lets apps supply app-wide title/description metadata\n   * without requiring a top-level `[dbxWebPageTitleInfo]` directive. Defaults to `{}` (no contribution).\n   */\n  readonly rootConfig?: DbxWebPageTitleInfoConfig;\n}\n\n/**\n * Injection token for {@link DbxWebPageTitleServiceConfig}.\n */\nexport const DBX_WEB_PAGE_TITLE_SERVICE_CONFIG = new InjectionToken<DbxWebPageTitleServiceConfig>('DBX_WEB_PAGE_TITLE_SERVICE_CONFIG');\n\n/**\n * Tracks all {@link DbxWebPageTitleInfoReference} values registered by `[dbxWebPageTitleInfo]` directives, identifies the active leaf,\n * composes its hierarchical chain, and feeds the chain through a swappable {@link DbxWebPageTitleDelegate} to produce {@link DbxWebPageTitleDetails}.\n *\n * When `isTitleSyncEnabled$` is true, the service applies `titleDetails$.title` to the document via Angular's {@link Title} service.\n */\n@Injectable()\nexport class DbxWebPageTitleService {\n  private readonly _titleService = inject(Title);\n  private readonly _config: DbxWebPageTitleServiceConfig = inject(DBX_WEB_PAGE_TITLE_SERVICE_CONFIG, { optional: true }) ?? {};\n\n  private readonly _references = completeOnDestroy(new BehaviorSubject<Set<DbxWebPageTitleInfoReference>>(new Set()));\n  private readonly _delegate = completeOnDestroy(new BehaviorSubject<DbxWebPageTitleDelegate>(this._config.initialDelegate ?? dbxWebDefaultPageTitleDelegate()));\n  private readonly _isTitleSyncEnabled = completeOnDestroy(new BehaviorSubject<boolean>(this._config.initialTitleSyncEnabled ?? true));\n  private readonly _rootConfig = completeOnDestroy(new BehaviorSubject<Maybe<DbxWebPageTitleInfoConfig>>(this._config.rootConfig));\n\n  /**\n   * Observable of all currently registered references.\n   */\n  readonly references$: Observable<ReadonlySet<DbxWebPageTitleInfoReference>> = this._references.asObservable();\n\n  /**\n   * Observable of the active delegate.\n   */\n  readonly delegate$: Observable<DbxWebPageTitleDelegate> = this._delegate.asObservable();\n\n  /**\n   * Whether the service applies `titleDetails$.title` to the document via {@link Title}.\n   */\n  readonly isTitleSyncEnabled$: Observable<boolean> = this._isTitleSyncEnabled.asObservable();\n\n  /**\n   * The default/root config supplied to the delegate alongside the directive chain. `undefined` when no root config is configured.\n   */\n  readonly rootConfig$: Observable<Maybe<DbxWebPageTitleInfoConfig>> = this._rootConfig.asObservable();\n\n  /**\n   * The active leaf reference: the most recently registered reference whose `isLeaf$` is currently true. Emits `undefined` when no leaves exist.\n   */\n  readonly leafReference$: Observable<Maybe<DbxWebPageTitleInfoReference>> = this._references.pipe(\n    switchMap((set) => {\n      const refs = Array.from(set);\n      const obs: Observable<Maybe<DbxWebPageTitleInfoReference>> =\n        refs.length === 0\n          ? of<Maybe<DbxWebPageTitleInfoReference>>(undefined)\n          : combineLatest(refs.map((ref) => ref.isLeaf$.pipe(map((isLeaf) => ({ ref, isLeaf }))))).pipe(\n              map((items) =>\n                items\n                  .filter((x) => x.isLeaf)\n                  .map((x) => x.ref)\n                  .at(-1)\n              )\n            );\n      return obs;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * The directive-supplied chain (root → leaf) for the active leaf. Empty when there is no active leaf. Excludes the service-level rootConfig (delivered separately to the delegate).\n   */\n  readonly chain$: Observable<readonly DbxWebPageTitleInfoConfig[]> = this.leafReference$.pipe(\n    switchMap((leaf) => leaf?.chain$ ?? of<readonly DbxWebPageTitleInfoConfig[]>([])),\n    shareReplay(1)\n  );\n\n  /**\n   * Final page title details produced by feeding `{ chain, rootConfig }` through the active delegate.\n   */\n  readonly titleDetails$: Observable<DbxWebPageTitleDetails> = combineLatest([this.chain$, this._rootConfig, this._delegate]).pipe(\n    map(([chain, rootConfig, delegate]) => delegate.buildPageTitleDetails({ chain, rootConfig })),\n    shareReplay(1)\n  );\n\n  constructor() {\n    const sub = this._isTitleSyncEnabled.pipe(switchMap((enabled) => (enabled ? this.titleDetails$ : NEVER))).subscribe((details) => this._titleService.setTitle(details.title));\n\n    inject(DestroyRef).onDestroy(() => sub.unsubscribe());\n  }\n\n  /**\n   * Replaces the active delegate.\n   *\n   * @param delegate - The new delegate.\n   */\n  setDelegate(delegate: DbxWebPageTitleDelegate): void {\n    this._delegate.next(delegate);\n  }\n\n  /**\n   * Enables or disables auto-application of the computed title to the document.\n   *\n   * @param enabled - True to enable, false to disable.\n   */\n  setTitleSyncEnabled(enabled: boolean): void {\n    this._isTitleSyncEnabled.next(enabled);\n  }\n\n  /**\n   * Replaces (or clears, when `undefined`) the root/default config delivered to the delegate alongside the directive chain.\n   *\n   * @param config - The new root config, or `undefined` to clear it.\n   */\n  setRootConfig(config: Maybe<DbxWebPageTitleInfoConfig>): void {\n    this._rootConfig.next(config);\n  }\n\n  /**\n   * Registers a reference. Called by {@link DbxWebPageTitleInfoDirective} on construction.\n   *\n   * @param reference - The reference to register.\n   */\n  register(reference: DbxWebPageTitleInfoReference): void {\n    const set = this._references.value;\n    set.add(reference);\n    this._references.next(set);\n  }\n\n  /**\n   * Unregisters a reference. Called by {@link DbxWebPageTitleInfoDirective} on destroy.\n   *\n   * @param reference - The reference to unregister.\n   */\n  unregister(reference: DbxWebPageTitleInfoReference): void {\n    const set = this._references.value;\n    set.delete(reference);\n    this._references.next(set);\n  }\n}\n","import { DestroyRef, Directive, inject, input } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, type Observable, combineLatest, map, of, shareReplay } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { type DbxWebPageTitleInfoConfig, type DbxWebPageTitleInfoReference } from './title';\nimport { DbxWebPageTitleService } from './title.service';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\n\n/**\n * Registers a hierarchical page title segment with {@link DbxWebPageTitleService}. Multiple directives nested in the host tree\n * form a chain (root → leaf); the leaf's segment takes priority through the active delegate.\n *\n * The directive locates its parent of the same type via element-injector ascent (`{ skipSelf: true, optional: true }`),\n * mirroring Angular CDK's tree-node hierarchy pattern. Each directive maintains its own `children` set so the service can\n * compute which directives are leaves at any moment.\n *\n * Requires {@link provideDbxWebPageTitleService} to be set up at the application or feature scope.\n *\n * @dbxWebComponent\n * @dbxWebSlug page-title-info\n * @dbxWebCategory navigation\n * @dbxWebSkillRefs dbx__ref__dbx-app-structure\n * @dbxWebMinimalExample ```html\n * <div [dbxWebPageTitleInfo]=\"{ title: 'Docs' }\"></div>\n * ```\n *\n * @example\n * ```html\n * <div [dbxWebPageTitleInfo]=\"appTitleConfigSignal()\">\n *   <ui-view>\n *     <div [dbxWebPageTitleInfo]=\"pageTitleConfigSignal()\">\n *       <!-- leaf -->\n *     </div>\n *   </ui-view>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxWebPageTitleInfo]',\n  exportAs: 'dbxWebPageTitleInfo'\n})\nexport class DbxWebPageTitleInfoDirective implements DbxWebPageTitleInfoReference {\n  private readonly _service = inject(DbxWebPageTitleService);\n  private readonly _parent = inject(DbxWebPageTitleInfoDirective, { skipSelf: true, optional: true });\n  private readonly _destroyRef = inject(DestroyRef);\n\n  readonly dbxWebPageTitleInfo = input<Maybe<DbxWebPageTitleInfoConfig>>();\n\n  private readonly _children = completeOnDestroy(new BehaviorSubject<Set<DbxWebPageTitleInfoDirective>>(new Set()));\n\n  readonly config$: Observable<Maybe<DbxWebPageTitleInfoConfig>> = toObservable(this.dbxWebPageTitleInfo);\n\n  readonly chain$: Observable<readonly DbxWebPageTitleInfoConfig[]> = combineLatest([this._parent?.chain$ ?? of<readonly DbxWebPageTitleInfoConfig[]>([]), this.config$]).pipe(\n    map(([parentChain, config]) => (config ? [...parentChain, config] : parentChain)),\n    shareReplay(1)\n  );\n\n  readonly isLeaf$: Observable<boolean> = this._children.pipe(\n    map((c) => c.size === 0),\n    shareReplay(1)\n  );\n\n  constructor() {\n    this._service.register(this);\n\n    if (this._parent) {\n      this._parent._addChild(this);\n    }\n\n    this._destroyRef.onDestroy(() => {\n      this._service.unregister(this);\n      this._parent?._removeChild(this);\n      this._children.complete();\n    });\n  }\n\n  /**\n   * @param child - The descendant directive to register as a child.\n   *\n   * @internal Maintained by descendant directives to keep `isLeaf$` accurate.\n   */\n  _addChild(child: DbxWebPageTitleInfoDirective): void {\n    const next = new Set(this._children.value);\n    next.add(child);\n    this._children.next(next);\n  }\n\n  /**\n   * @param child - The descendant directive to unregister.\n   *\n   * @internal\n   */\n  _removeChild(child: DbxWebPageTitleInfoDirective): void {\n    const next = new Set(this._children.value);\n    next.delete(child);\n    this._children.next(next);\n  }\n}\n","import { type EnvironmentProviders, type Provider, makeEnvironmentProviders } from '@angular/core';\nimport { DBX_WEB_PAGE_TITLE_SERVICE_CONFIG, DbxWebPageTitleService, type DbxWebPageTitleServiceConfig } from './title.service';\n\n/**\n * Configuration for {@link provideDbxWebPageTitleService}.\n */\nexport interface ProvideDbxWebPageTitleServiceConfig extends DbxWebPageTitleServiceConfig {}\n\n/**\n * Creates {@link EnvironmentProviders} that wire up {@link DbxWebPageTitleService} (and an optional\n * {@link DbxWebPageTitleServiceConfig}) for an app or feature scope.\n *\n * @param config - Optional service configuration.\n * @returns Environment providers ready to pass to `bootstrapApplication` or another `provide*` factory.\n *\n * @example\n * ```ts\n * provideDbxWebPageTitleService({ defaultTitle: 'MyApp' })\n * ```\n * @__NO_SIDE_EFFECTS__\n */\nexport function provideDbxWebPageTitleService(config?: ProvideDbxWebPageTitleServiceConfig): EnvironmentProviders {\n  const providers: Provider[] = [DbxWebPageTitleService];\n\n  if (config) {\n    providers.push({ provide: DBX_WEB_PAGE_TITLE_SERVICE_CONFIG, useValue: config });\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Service, type Type } from '@angular/core';\nimport { type Maybe, filterMaybeArrayValues, mapIterable } from '@dereekb/util';\nimport { type DbxWidgetType } from './widget';\n\n/**\n * Maps a widget type identifier to its corresponding Angular component class for rendering by the {@link DbxWidgetService}.\n */\nexport interface DbxWidgetEntry {\n  /**\n   * Widget type to respond to.\n   */\n  readonly type: DbxWidgetType;\n  /**\n   * Widget component class to use.\n   */\n  readonly componentClass: Type<unknown>;\n}\n\n/**\n * Registry service for widget components. Components are registered by type identifier and resolved by {@link DbxWidgetViewComponent} to render the appropriate widget for a given type/data pair.\n *\n * @example\n * ```typescript\n * widgetService.register({ type: 'my-widget', componentClass: MyWidgetComponent });\n * ```\n */\n@Service()\nexport class DbxWidgetService {\n  private readonly _entries = new Map<DbxWidgetType, DbxWidgetEntry>();\n\n  /**\n   * Used to register an entry. If an entry with the same type is already registered, this will override it by default.\n   *\n   * @param entry - The widget entry mapping a type identifier to its component class.\n   * @param override - Whether to replace an existing entry with the same type. Defaults to true.\n   * @returns True if the entry was registered, false if an entry with the same type already exists and override is false.\n   */\n  register(entry: DbxWidgetEntry, override: boolean = true): boolean {\n    let registered = false;\n\n    if (override || !this._entries.has(entry.type)) {\n      this._entries.set(entry.type, entry);\n      registered = true;\n    }\n\n    return registered;\n  }\n\n  // MARK: Get\n  getWidgetIdentifiers(): DbxWidgetType[] {\n    return Array.from(this._entries.keys());\n  }\n\n  getWidgetEntry(type: DbxWidgetType): Maybe<DbxWidgetEntry> {\n    return this._entries.get(type);\n  }\n\n  getWidgetEntries(types: Iterable<DbxWidgetType>): DbxWidgetEntry[] {\n    return filterMaybeArrayValues(mapIterable(types ?? [], (x) => this._entries.get(x)));\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type DbxWidgetViewComponentConfig } from './widget';\nimport { DbxWidgetService } from './widget.service';\nimport { NgTemplateOutlet } from '@angular/common';\n\n/**\n * Resolves and renders a widget component based on the input type using the {@link DbxWidgetService}. Falls back to a `defaultType` if the primary type is not registered, and projects `[unknownWidget]` content when no matching widget is found.\n *\n * @example\n * ```html\n * <dbx-widget-view [config]=\"{ type: 'my-widget', data: someData }\">\n *   <span unknownWidget>Widget not found</span>\n * </dbx-widget-view>\n * ```\n */\n@Component({\n  selector: 'dbx-widget-view',\n  template: `\n    @switch (widgetConfigExistsSignal()) {\n      @case (true) {\n        <ng-container *ngTemplateOutlet=\"widget\"></ng-container>\n      }\n      @default {\n        <ng-container *ngTemplateOutlet=\"unknown\"></ng-container>\n      }\n    }\n    <ng-template #widget>\n      <dbx-injection [config]=\"configSignal()\"></dbx-injection>\n    </ng-template>\n    <ng-template #unknown>\n      <ng-content empty select=\"[unknownWidget]\"></ng-content>\n    </ng-template>\n  `,\n  host: {\n    class: 'dbx-widget-view'\n  },\n  imports: [DbxInjectionComponent, NgTemplateOutlet]\n})\nexport class DbxWidgetViewComponent {\n  readonly dbxWidgetService = inject(DbxWidgetService);\n\n  readonly config = input<Maybe<DbxWidgetViewComponentConfig>>();\n\n  readonly configSignal = computed(() => {\n    const pair = this.config();\n    let config: Maybe<DbxInjectionComponentConfig> = undefined;\n\n    if (pair != null) {\n      let entry = this.dbxWidgetService.getWidgetEntry(pair.type);\n\n      if (!entry && pair.defaultType) {\n        entry = this.dbxWidgetService.getWidgetEntry(pair.defaultType);\n      }\n\n      if (entry) {\n        config = {\n          componentClass: entry.componentClass,\n          data: pair.data\n        };\n      } else {\n        config = null;\n      }\n    }\n\n    return config;\n  });\n\n  readonly widgetConfigExistsSignal = computed(() => this.configSignal() !== null);\n}\n","import { Directive, inject } from '@angular/core';\nimport { DBX_INJECTION_COMPONENT_DATA } from '@dereekb/dbx-core';\n\n/**\n * Abstract base directive for widget components that automatically injects the widget data from the {@link DBX_INJECTION_COMPONENT_DATA} token.\n * Subclasses access the typed data through `this.data`.\n *\n * @example\n * ```typescript\n * @Component({ template: '<p>{{ data.name }}</p>' })\n * class MyWidget extends AbstractDbxWidgetComponent<MyData> {}\n * ```\n */\n@Directive()\nexport abstract class AbstractDbxWidgetComponent<T> {\n  readonly data = inject<T>(DBX_INJECTION_COMPONENT_DATA);\n}\n","import { Component } from '@angular/core';\nimport { of } from 'rxjs';\nimport { type DbxWidgetDataPair } from './widget';\nimport { DbxWidgetViewComponent } from './widget.component';\nimport { AbstractDbxValueListViewItemComponent } from '../../layout/list/list.view.value.item.directive';\nimport { type DbxValueAsListItem } from '../../layout/list/list.view.value';\nimport { AbstractDbxListGridViewDirective, DbxListGridViewComponentImportsModule, DEFAULT_DBX_LIST_GRID_VIEW_COMPONENT_CONFIGURATION_TEMPLATE } from '../../layout/list/grid/list.grid.view.directive';\nimport { type DbxValueListGridViewConfig } from '../../layout/list/grid/list.grid.view.component';\nimport { provideDbxListView } from '../../layout/list/list.view';\nimport { AbstractDbxListWrapperDirective, DbxListWrapperComponentImportsModule, DEFAULT_LIST_WRAPPER_COMPONENT_CONFIGURATION_TEMPLATE } from '../../layout/list/list.directive';\n\n/**\n * A {@link DbxWidgetDataPair} wrapped as a list item for use in selection-based list views.\n */\nexport type DbxWidgetDataPairWithSelection = DbxValueAsListItem<DbxWidgetDataPair>;\n\n/**\n * Grid-based list component that renders {@link DbxWidgetDataPair} items as widgets in a responsive grid layout.\n *\n * @example\n * ```html\n * <dbx-widget-grid [values$]=\"widgetPairs$\"></dbx-widget-grid>\n * ```\n */\n@Component({\n  selector: 'dbx-widget-grid',\n  template: DEFAULT_LIST_WRAPPER_COMPONENT_CONFIGURATION_TEMPLATE,\n  imports: [DbxListWrapperComponentImportsModule]\n})\nexport class DbxWidgetListGridComponent extends AbstractDbxListWrapperDirective<DbxWidgetDataPair> {\n  constructor() {\n    super({\n      componentClass: DbxWidgetListGridViewComponent,\n      defaultSelectionMode: 'view'\n    });\n  }\n}\n\n/**\n * Grid view component for rendering {@link DbxWidgetDataPair} items. Used internally by {@link DbxWidgetListGridComponent}.\n */\n@Component({\n  selector: 'dbx-widget-grid-view',\n  template: DEFAULT_DBX_LIST_GRID_VIEW_COMPONENT_CONFIGURATION_TEMPLATE,\n  imports: [DbxListGridViewComponentImportsModule],\n  providers: provideDbxListView(DbxWidgetListGridViewComponent)\n})\nexport class DbxWidgetListGridViewComponent extends AbstractDbxListGridViewDirective<DbxWidgetDataPair> {\n  readonly config: DbxValueListGridViewConfig<DbxWidgetDataPairWithSelection> = {\n    grid: {\n      // TODO: Make configurable.\n      columns: 'repeat(auto-fill, minmax(120px, 1fr))',\n      gap: '8px'\n    },\n    componentClass: DbxWidgetListGridViewItemComponent,\n    mapValuesToItemValues: (x) => of(x.map((y, i) => ({ ...y, key: `${y.type}_${i}`, itemValue: y })))\n  };\n}\n\n/**\n * Individual grid item component that renders a single widget via {@link DbxWidgetViewComponent}.\n */\n@Component({\n  template: `\n    <dbx-widget-view [config]=\"itemValue\"></dbx-widget-view>\n  `,\n  imports: [DbxWidgetViewComponent]\n})\nexport class DbxWidgetListGridViewItemComponent extends AbstractDbxValueListViewItemComponent<DbxWidgetDataPair> {}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, type Observable, combineLatest, defaultIfEmpty, map, shareReplay, switchMap } from 'rxjs';\nimport { type DbxHelpContextKey, type DbxHelpContextReference } from './help';\nimport { distinctUntilHasDifferentValues } from '@dereekb/rxjs';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\n\n/**\n * Tracks all active help context keys across the component tree. Directives and components register/unregister their help context references,\n * and consumers can observe the aggregated set of active keys.\n */\n@Injectable()\nexport class DbxHelpContextService {\n  private readonly _contextReferences = completeOnDestroy(new BehaviorSubject<Set<DbxHelpContextReference>>(new Set()));\n\n  /**\n   * Observable of all currently active help context strings.\n   */\n  readonly activeHelpContextKeys$: Observable<Set<DbxHelpContextKey>> = this._contextReferences.pipe(\n    switchMap((allReferences) =>\n      combineLatest(Array.from(allReferences).map((ref) => ref.helpContextKeys$)).pipe(\n        map((x) => x.flat()),\n        defaultIfEmpty([]),\n        map((x) => new Set(x))\n      )\n    ),\n    distinctUntilHasDifferentValues(),\n    shareReplay(1)\n  );\n\n  /**\n   * Observable array of all currently active help context key strings.\n   */\n  readonly activeHelpContextKeysArray$ = this.activeHelpContextKeys$.pipe(\n    map((x) => Array.from(x)),\n    shareReplay(1)\n  );\n\n  /**\n   * Registers a help context reference, adding its keys to the active set.\n   *\n   * @param reference - The help context reference to register.\n   */\n  register(reference: DbxHelpContextReference): void {\n    const referenceSet = this._contextReferences.value;\n    referenceSet.add(reference);\n    this._contextReferences.next(referenceSet);\n  }\n\n  /**\n   * Unregisters a help context reference, removing its keys from the active set.\n   *\n   * @param reference - The help context reference to unregister.\n   */\n  unregister(reference: DbxHelpContextReference): void {\n    const referenceSet = this._contextReferences.value;\n    referenceSet.delete(reference);\n    this._contextReferences.next(referenceSet);\n  }\n}\n","import { asObservable, type ObservableOrValue } from '@dereekb/rxjs';\nimport { type DbxHelpContextReference, type DbxHelpContextKey } from './help';\nimport { DestroyRef, inject } from '@angular/core';\nimport { DbxHelpContextService } from './help.context.service';\nimport { type DestroyFunction } from '@dereekb/util';\n\n/**\n * Registers the given help context keys observable with the {@link DbxHelpContextService}. Must be called within an Angular injection context.\n * Automatically unregisters on destroy, but also returns a destroy function for manual cleanup.\n *\n * @param helpContextKeys - Observable or static array of help context keys to register with the service.\n * @returns A destroy function that unregisters the help context keys when called.\n *\n * @example\n * ```typescript\n * // In a component or directive constructor\n * const destroy = registerHelpContextKeysWithDbxHelpContextService(of(['feature-help', 'general-help']));\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function registerHelpContextKeysWithDbxHelpContextService(helpContextKeys: ObservableOrValue<DbxHelpContextKey[]>): DestroyFunction {\n  const helpContextService = inject(DbxHelpContextService);\n  const destroyRef = inject(DestroyRef);\n\n  const helpContextReference: DbxHelpContextReference = {\n    helpContextKeys$: asObservable(helpContextKeys)\n  };\n\n  helpContextService.register(helpContextReference);\n\n  function _destroy() {\n    helpContextService.unregister(helpContextReference);\n  }\n\n  destroyRef.onDestroy(_destroy);\n\n  return _destroy;\n}\n","import { Directive, input } from '@angular/core';\nimport { type DbxHelpContextKey } from './help';\nimport { type ArrayOrValue, asArray } from '@dereekb/util';\nimport { map, type Observable } from 'rxjs';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { registerHelpContextKeysWithDbxHelpContextService } from './help.context';\n\n/**\n * Directive that registers one or more help context keys with the {@link DbxHelpContextService}. Automatically unregisters when the host element is destroyed.\n *\n * @example\n * ```html\n * <div [dbxHelpContext]=\"'my-feature-help'\">\n *   <!-- Content with help context -->\n * </div>\n *\n * <div [dbxHelpContext]=\"['topic-a', 'topic-b']\">\n *   <!-- Content with multiple help contexts -->\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxHelpContext]'\n})\nexport class DbxHelpContextDirective {\n  /**\n   * The input help context string(s) to add.\n   */\n  readonly dbxHelpContext = input.required<ArrayOrValue<DbxHelpContextKey>>();\n  readonly helpContextKeys$: Observable<DbxHelpContextKey[]> = toObservable(this.dbxHelpContext).pipe(map(asArray));\n\n  constructor() {\n    registerHelpContextKeysWithDbxHelpContextService(this.helpContextKeys$);\n  }\n}\n","import { inject, Injectable, type Type } from '@angular/core';\nimport { type ArrayOrValue, type Maybe, asArray, cachedGetter, mapIterable } from '@dereekb/util';\nimport { type DbxHelpContextKey } from './help';\nimport { type DbxHelpWidgetServiceEntry } from './help.widget';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\n\n/**\n * Abstract configuration class for providing initial settings to the {@link DbxHelpWidgetService}, including default entries, icons, and component configs.\n */\nexport abstract class DbxHelpWidgetServiceConfig {\n  /**\n   * All help widget service entries.\n   */\n  abstract readonly entries?: Maybe<DbxHelpWidgetServiceEntry[]>;\n  /**\n   * Default icon to use for unknown help topics.\n   */\n  abstract readonly defaultIcon?: Maybe<string>;\n  /**\n   * Default/Unknown help topic component class.\n   */\n  abstract readonly defaultWidgetComponentClass?: Maybe<Type<unknown>>;\n  /**\n   * Optional header component class to use for the list view.\n   */\n  abstract readonly helpListHeaderComponentConfig?: Maybe<DbxInjectionComponentConfig>;\n  /**\n   * Optional footer component class to use for the list view.\n   */\n  abstract readonly helpListFooterComponentConfig?: Maybe<DbxInjectionComponentConfig>;\n  /**\n   * Optional header component class to use for the popover view.\n   */\n  abstract readonly popoverHeaderComponentConfig?: Maybe<DbxInjectionComponentConfig>;\n}\n\n/**\n * Service used to register help widgets.\n *\n * Similar to DbxErrorWidgetService, this maintains a registry of help widgets\n * that can be displayed for specific help context strings.\n */\n@Injectable()\nexport class DbxHelpWidgetService {\n  private readonly _entries = new Map<DbxHelpContextKey, DbxHelpWidgetServiceEntry>();\n\n  private readonly _sortPriorityMap = cachedGetter(() => {\n    return new Map<DbxHelpContextKey, number>(mapIterable(this._entries.values(), (entry) => [entry.helpContextKey, entry.sortPriority ?? -1]));\n  });\n\n  private _defaultWidgetComponentClass: Maybe<Type<unknown>>;\n  private _helpListHeaderComponentConfig: Maybe<DbxInjectionComponentConfig>;\n  private _helpListFooterComponentConfig: Maybe<DbxInjectionComponentConfig>;\n\n  private _defaultIcon: Maybe<string>;\n  private _popoverHeaderComponentConfig: Maybe<DbxInjectionComponentConfig>;\n\n  constructor() {\n    const initialConfig = inject(DbxHelpWidgetServiceConfig, { optional: true });\n    this.setDefaultWidgetComponentClass(initialConfig?.defaultWidgetComponentClass);\n    this.setDefaultIcon(initialConfig?.defaultIcon);\n    this.setPopoverHeaderComponentConfig(initialConfig?.popoverHeaderComponentConfig);\n    this.setHelpListHeaderComponentConfig(initialConfig?.helpListHeaderComponentConfig);\n    this.setHelpListFooterComponentConfig(initialConfig?.helpListFooterComponentConfig);\n\n    if (initialConfig?.entries) {\n      this.register(initialConfig.entries);\n    }\n  }\n\n  /**\n   * Returns the component class used for unrecognized help context keys.\n   *\n   * @returns The default widget component class, or undefined if not set.\n   */\n  getDefaultWidgetComponentClass(): Maybe<Type<unknown>> {\n    return this._defaultWidgetComponentClass;\n  }\n\n  setDefaultWidgetComponentClass(componentClass: Maybe<Type<unknown>>): void {\n    this._defaultWidgetComponentClass = componentClass;\n  }\n\n  /**\n   * Returns the default icon used for help entries without a specific icon.\n   *\n   * @returns The default icon string, or undefined if not set.\n   */\n  getDefaultIcon(): Maybe<string> {\n    return this._defaultIcon;\n  }\n\n  setDefaultIcon(icon: Maybe<string>): void {\n    this._defaultIcon = icon;\n  }\n\n  /**\n   * Returns the component config displayed in the popover header, if set.\n   *\n   * @returns The popover header component config, or undefined if not set.\n   */\n  getPopoverHeaderComponentConfig(): Maybe<DbxInjectionComponentConfig> {\n    return this._popoverHeaderComponentConfig;\n  }\n\n  setPopoverHeaderComponentConfig(componentConfig: Maybe<DbxInjectionComponentConfig>): void {\n    this._popoverHeaderComponentConfig = componentConfig;\n  }\n\n  /**\n   * Returns the component config displayed at the top of the help list view, if set.\n   *\n   * @returns The help list header component config, or undefined if not set.\n   */\n  getHelpListHeaderComponentConfig(): Maybe<DbxInjectionComponentConfig> {\n    return this._helpListHeaderComponentConfig;\n  }\n\n  setHelpListHeaderComponentConfig(componentConfig: Maybe<DbxInjectionComponentConfig>): void {\n    this._helpListHeaderComponentConfig = componentConfig;\n  }\n\n  /**\n   * Returns the component config displayed at the bottom of the help list view, if set.\n   *\n   * @returns The help list footer component config, or undefined if not set.\n   */\n  getHelpListFooterComponentConfig(): Maybe<DbxInjectionComponentConfig> {\n    return this._helpListFooterComponentConfig;\n  }\n\n  setHelpListFooterComponentConfig(componentConfig: Maybe<DbxInjectionComponentConfig>): void {\n    this._helpListFooterComponentConfig = componentConfig;\n  }\n\n  /**\n   * Used to register one or more entries.\n   *\n   * If an entry with the same identity is already registered, this will override it by default.\n   *\n   * @param entries - The entries to register.\n   * @param override - Whether to override existing entries (default: true)\n   * @returns Always returns true after registration completes.\n   */\n  register(entries: ArrayOrValue<DbxHelpWidgetServiceEntry>, override: boolean = true): boolean {\n    const entriesArray = asArray(entries);\n\n    entriesArray.forEach((entry) => {\n      if (override || !this._entries.has(entry.helpContextKey)) {\n        this._entries.set(entry.helpContextKey, entry);\n      }\n    });\n\n    return true;\n  }\n\n  // MARK: Get\n  /**\n   * Returns all currently registered help context keys.\n   *\n   * @returns Array of all registered help context keys.\n   */\n  getAllRegisteredHelpContextKeys(): DbxHelpContextKey[] {\n    return Array.from(this._entries.keys());\n  }\n\n  /**\n   * Retrieves the widget entry for a given help context key. Falls back to a default entry if a default widget component class is configured.\n   *\n   * @param helpContextKey - The help context key to look up.\n   * @returns The matching widget entry, a default entry if a default component class is configured, or undefined.\n   */\n  getHelpWidgetEntry(helpContextKey: DbxHelpContextKey): Maybe<DbxHelpWidgetServiceEntry> {\n    return this._entries.get(helpContextKey) ?? (this._defaultWidgetComponentClass ? { helpContextKey, title: '<Missing Help Topic>', widgetComponentClass: this._defaultWidgetComponentClass } : undefined);\n  }\n\n  /**\n   * Retrieves widget entries for multiple help context keys, filtering out any unresolvable keys.\n   *\n   * @param helpContextKeys - Array of help context keys to look up.\n   * @returns Array of resolved widget entries, excluding any keys that could not be resolved.\n   */\n  getHelpWidgetEntriesForHelpContextKeys(helpContextKeys: DbxHelpContextKey[]): DbxHelpWidgetServiceEntry[] {\n    return helpContextKeys.map((context) => this.getHelpWidgetEntry(context)).filter((entry) => !!entry);\n  }\n\n  /**\n   * Checks whether a widget entry is registered for the given help context key.\n   *\n   * @param context - The help context key to check.\n   * @returns True if a widget entry exists for the given key.\n   */\n  hasHelpWidgetEntry(context: DbxHelpContextKey): boolean {\n    return this._entries.has(context);\n  }\n\n  /**\n   * Returns a cached map of help context keys to their sort priority values.\n   *\n   * @returns Map of help context keys to their numeric sort priorities.\n   */\n  getSortPriorityMap() {\n    return this._sortPriorityMap();\n  }\n}\n","import { type EnvironmentProviders, type Injector, type Provider, makeEnvironmentProviders } from '@angular/core';\nimport { DbxHelpWidgetService, DbxHelpWidgetServiceConfig } from './help.widget.service';\nimport { DbxHelpContextService } from './help.context.service';\n\n/**\n * Factory for DbxHelpWidgetServiceConfig.\n */\nexport type DbxHelpWidgetServiceConfigFactory = (injector: Injector) => DbxHelpWidgetServiceConfig;\n\n/**\n * Configuration for provideDbxHelpServices().\n */\nexport interface ProvideDbxHelpServicesConfig {\n  /**\n   * Initial help widget entries to register.\n   */\n  readonly dbxHelpWidgetServiceConfigFactory?: DbxHelpWidgetServiceConfigFactory;\n}\n\n/**\n * Creates EnvironmentProviders for the help context system.\n *\n * @param config - Optional configuration.\n * @returns EnvironmentProviders.\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function provideDbxHelpServices(config?: ProvideDbxHelpServicesConfig): EnvironmentProviders {\n  const providers: Provider[] = [DbxHelpWidgetService, DbxHelpContextService];\n\n  if (config?.dbxHelpWidgetServiceConfigFactory) {\n    providers.push({\n      provide: DbxHelpWidgetServiceConfig,\n      useFactory: config.dbxHelpWidgetServiceConfigFactory\n    });\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n","import { InjectionToken, type Type } from '@angular/core';\nimport { type GetterOrValue, type Maybe } from '@dereekb/util';\nimport { type DbxHelpContextKey } from './help';\n\n/**\n * Entry defining a help widget for a specific context\n */\nexport interface DbxHelpWidgetServiceEntry<D = unknown> {\n  /**\n   * Help context string specific to this entry.\n   */\n  readonly helpContextKey: DbxHelpContextKey;\n  /**\n   * Title/Label for the help topic.\n   */\n  readonly title: string;\n  /**\n   * Icon for the help topic, if applicable.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Arbitrary metadata associated with the entry.\n   */\n  readonly meta?: Maybe<D>;\n  /**\n   * The priority to use when sorting the entities.\n   *\n   * Higher values are displayed first in the list.\n   */\n  readonly sortPriority?: Maybe<number>;\n  /**\n   * Custom help widget component class to use.\n   *\n   * The component will receive the context string as data.\n   */\n  readonly widgetComponentClass: GetterOrValue<Type<unknown>>;\n  /**\n   * Custom header component class to use that shows up on the widget.\n   *\n   * The component will receive the context string as data.\n   */\n  readonly headerComponentClass?: GetterOrValue<Maybe<Type<unknown>>>;\n}\n\n// MARK: Injection\n/**\n * Data injected into help widget components via {@link DBX_HELP_WIDGET_ENTRY_DATA_TOKEN}, providing access to the corresponding widget entry.\n */\nexport interface DbxHelpWidgetEntryData<D = unknown> {\n  /**\n   * Corresponding widget entry.\n   */\n  readonly helpWidgetEntry: DbxHelpWidgetServiceEntry<D>;\n}\n\n/**\n * Injection token for DbxHelpWidgetData.\n */\nexport const DBX_HELP_WIDGET_ENTRY_DATA_TOKEN = new InjectionToken<DbxHelpWidgetEntryData>('DbxHelpWidgetEntryData');\n","import { Directive, inject } from '@angular/core';\nimport { DBX_HELP_WIDGET_ENTRY_DATA_TOKEN, type DbxHelpWidgetEntryData } from './help.widget';\nimport { type DbxHelpContextKey } from './help';\n\n/**\n * Abstract base directive for help widget components that automatically injects the {@link DbxHelpWidgetEntryData} for the current help context.\n * Subclasses can access the widget entry and its associated help context key.\n *\n * @example\n * ```typescript\n * @Directive()\n * class MyHelpWidget extends AbstractDbxHelpWidgetDirective<MyData> {\n *   // Access this.helpWidgetData, this.helpWidgetEntry, this.helpContextKey\n * }\n * ```\n */\n@Directive({})\nexport abstract class AbstractDbxHelpWidgetDirective<D = unknown> {\n  readonly helpWidgetData = inject<DbxHelpWidgetEntryData<D>>(DBX_HELP_WIDGET_ENTRY_DATA_TOKEN);\n  readonly helpWidgetEntry = this.helpWidgetData.helpWidgetEntry;\n\n  get helpContextKey(): DbxHelpContextKey {\n    return this.helpWidgetEntry.helpContextKey;\n  }\n}\n","import { Component, computed, inject, input, type Signal } from '@angular/core';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatExpansionPanelDescription, MatExpansionPanelContent } from '@angular/material/expansion';\nimport { MatIcon } from '@angular/material/icon';\nimport { DBX_HELP_WIDGET_ENTRY_DATA_TOKEN, type DbxHelpWidgetEntryData, type DbxHelpWidgetServiceEntry } from './help.widget';\nimport { getValueFromGetter, type Maybe } from '@dereekb/util';\nimport { DbxHelpWidgetService } from './help.widget.service';\n\n/**\n * Renders a single help widget entry as a Material expansion panel. Dynamically injects the widget component and optional header component for the given help entry.\n *\n * @example\n * ```html\n * <dbx-help-view-list-entry [helpWidgetEntry]=\"entry\"></dbx-help-view-list-entry>\n * ```\n */\n@Component({\n  selector: 'dbx-help-view-list-entry',\n  templateUrl: './help.view.list.entry.component.html',\n  imports: [DbxInjectionComponent, MatExpansionPanel, MatExpansionPanelHeader, MatExpansionPanelTitle, MatExpansionPanelDescription, MatExpansionPanelContent, MatIcon]\n})\nexport class DbxHelpViewListEntryComponent {\n  readonly helpWidgetEntry = input.required<DbxHelpWidgetServiceEntry>();\n  readonly helpWidgetService = inject(DbxHelpWidgetService);\n\n  readonly titleSignal = computed(() => this.helpWidgetEntry().title);\n  readonly iconSignal = computed(() => this.helpWidgetEntry().icon ?? this.helpWidgetService.getDefaultIcon());\n\n  readonly widgetInjectionConfigSignal: Signal<DbxInjectionComponentConfig> = computed(() => {\n    const helpWidgetEntry = this.helpWidgetEntry();\n    const widgetComponentClass = getValueFromGetter(helpWidgetEntry.widgetComponentClass);\n\n    const widgetData: DbxHelpWidgetEntryData = {\n      helpWidgetEntry\n    };\n\n    const config: DbxInjectionComponentConfig = {\n      componentClass: widgetComponentClass,\n      providers: [\n        {\n          provide: DBX_HELP_WIDGET_ENTRY_DATA_TOKEN,\n          useValue: widgetData\n        }\n      ]\n    };\n\n    return config;\n  });\n\n  readonly headerInjectionConfigSignal: Signal<Maybe<DbxInjectionComponentConfig>> = computed(() => {\n    const helpWidgetEntry = this.helpWidgetEntry();\n    const headerComponentClass = getValueFromGetter(helpWidgetEntry.headerComponentClass);\n\n    let config: Maybe<DbxInjectionComponentConfig> = undefined;\n\n    if (headerComponentClass) {\n      const widgetData: DbxHelpWidgetEntryData = {\n        helpWidgetEntry\n      };\n\n      config = {\n        componentClass: headerComponentClass,\n        providers: [\n          {\n            provide: DBX_HELP_WIDGET_ENTRY_DATA_TOKEN,\n            useValue: widgetData\n          }\n        ]\n      };\n    }\n\n    return config;\n  });\n}\n","<mat-expansion-panel>\n  <mat-expansion-panel-header>\n    <mat-panel-title>\n      @if (iconSignal(); as icon) {\n        <mat-icon class=\"dbx-button-spacer\">{{ icon }}</mat-icon>\n      }\n      <span>{{ titleSignal() }}</span>\n    </mat-panel-title>\n    <ng-container>\n      @if (headerInjectionConfigSignal(); as headerInjectionConfig) {\n        <mat-panel-description>\n          <span class=\"dbx-spacer\"></span>\n          <dbx-injection [config]=\"headerInjectionConfig\"></dbx-injection>\n        </mat-panel-description>\n      }\n    </ng-container>\n  </mat-expansion-panel-header>\n  <ng-template matExpansionPanelContent>\n    <div class=\"dbx-help-view-list-entry-content\">\n      <dbx-injection [config]=\"widgetInjectionConfigSignal()\"></dbx-injection>\n    </div>\n  </ng-template>\n</mat-expansion-panel>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { type DbxHelpContextKey } from './help';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { asObservable, distinctUntilHasDifferentValues, type ObservableOrValue } from '@dereekb/rxjs';\nimport { map, type Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { DbxHelpWidgetService } from './help.widget.service';\nimport { DbxHelpViewListEntryComponent } from './help.view.list.entry.component';\nimport { type ArrayOrValue, asArray, type Maybe, sortByNumberFunction } from '@dereekb/util';\nimport { MatAccordion } from '@angular/material/expansion';\nimport { DbxListEmptyContentComponent } from '../../layout/list/list.content.empty.component';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\n\n/**\n * Displays a list of help widget entries in a Material accordion, resolved from the given help context keys. Supports optional header and footer injection, empty state content, and multi-expand mode.\n *\n * @example\n * ```html\n * <dbx-help-view-list [helpContextKeys]=\"['feature-a', 'feature-b']\" [multi]=\"true\">\n *   <span empty>No help topics available.</span>\n * </dbx-help-view-list>\n * ```\n */\n@Component({\n  selector: 'dbx-help-view-list',\n  template: `\n    <div class=\"dbx-help-view-list-header\">\n      <dbx-injection [config]=\"helpListHeaderComponentConfigSignal()\"></dbx-injection>\n    </div>\n    <mat-accordion [multi]=\"multi()\">\n      @for (widgetEntry of helpWidgetEntriesSignal(); track widgetEntry.helpContextKey) {\n        <dbx-help-view-list-entry [helpWidgetEntry]=\"widgetEntry\"></dbx-help-view-list-entry>\n      }\n    </mat-accordion>\n    @if (hasNoHelpWidgetEntriesSignal()) {\n      <dbx-list-empty-content>\n        <ng-content select=\"[empty]\"></ng-content>\n      </dbx-list-empty-content>\n    }\n    <div class=\"dbx-help-view-list-footer\">\n      <dbx-injection [config]=\"helpListFooterComponentConfigSignal()\"></dbx-injection>\n    </div>\n  `,\n  host: {\n    class: 'dbx-help-view-list dbx-block'\n  },\n  imports: [MatAccordion, DbxHelpViewListEntryComponent, DbxListEmptyContentComponent, DbxInjectionComponent]\n})\nexport class DbxHelpViewListComponent {\n  readonly helpWidgetService = inject(DbxHelpWidgetService);\n\n  /**\n   * Whether the accordion should allow multiple expanded panels.\n   */\n  readonly multi = input<Maybe<boolean>>();\n\n  /**\n   * Whether or not to show the empty list content.\n   */\n  readonly allowEmptyListContent = input<boolean>(true);\n\n  /**\n   * Optional header component config to inject before the list.\n   *\n   * If set null, then will not show any header.\n   */\n  readonly helpListHeaderComponentConfig = input<Maybe<DbxInjectionComponentConfig>>(undefined);\n\n  /**\n   * Optional header component config to inject before the list.\n   *\n   * If set null, then will not show any header.\n   */\n  readonly helpListFooterComponentConfig = input<Maybe<DbxInjectionComponentConfig>>(undefined);\n\n  readonly helpContextKeys = input.required<ObservableOrValue<ArrayOrValue<DbxHelpContextKey>>>();\n  readonly helpContextKeys$: Observable<DbxHelpContextKey[]> = toObservable(this.helpContextKeys).pipe(\n    switchMap((x) => asObservable(x) ?? of([])),\n    map(asArray),\n    distinctUntilHasDifferentValues(),\n    map((x) => {\n      const sortPriorityMap = this.helpWidgetService.getSortPriorityMap();\n      return [...x].sort(sortByNumberFunction((x) => sortPriorityMap.get(x) ?? -2));\n    }),\n    shareReplay(1)\n  );\n\n  readonly helpContextKeysSignal = toSignal(this.helpContextKeys$, { initialValue: [] });\n  readonly helpWidgetEntriesSignal = computed(() => this.helpWidgetService.getHelpWidgetEntriesForHelpContextKeys(this.helpContextKeysSignal()));\n\n  readonly hasNoHelpWidgetEntriesSignal = computed(() => !this.helpWidgetEntriesSignal()?.length);\n\n  readonly helpListHeaderComponentConfigSignal = computed(() => {\n    let config: Maybe<DbxInjectionComponentConfig> = this.helpListHeaderComponentConfig();\n\n    if (config !== null) {\n      config = this.helpWidgetService.getHelpListHeaderComponentConfig();\n    }\n\n    return config;\n  });\n\n  readonly helpListFooterComponentConfigSignal = computed(() => {\n    let config: Maybe<DbxInjectionComponentConfig> = this.helpListFooterComponentConfig();\n\n    if (config !== null) {\n      config = this.helpWidgetService.getHelpListFooterComponentConfig();\n    }\n\n    return config;\n  });\n}\n","import { Component, type ElementRef, inject } from '@angular/core';\nimport { type ArrayOrValue, type Maybe } from '@dereekb/util';\nimport { AbstractPopoverDirective } from '../../interaction/popover/abstract.popover.directive';\nimport { type DbxPopoverKey } from '../../interaction/popover/popover';\nimport { type DbxPopoverConfigSizing, type DbxPopoverService } from '../../interaction/popover/popover.service';\nimport { DbxPopoverContentComponent, DbxPopoverHeaderComponent, DbxPopoverScrollContentDirective } from '../../interaction';\nimport { DbxHelpViewListComponent } from './help.view.list.component';\nimport { type DbxHelpContextKey } from './help';\nimport { type NgPopoverRef } from 'ng-overlay-container';\nimport { type ObservableOrValue } from '@dereekb/rxjs';\nimport { DbxHelpContextService } from './help.context.service';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DbxHelpWidgetService } from './help.widget.service';\n\n/**\n * Default popover key used when opening the help view popover.\n */\nexport const DEFAULT_DBX_HELP_VIEW_POPOVER_KEY = 'help';\n\n/**\n * Configuration for the {@link DbxHelpViewPopoverComponent}, controlling which help contexts to show, the popover appearance, and sizing.\n */\nexport interface DbxHelpViewPopoverConfig {\n  /**\n   * Custom icon\n   *\n   * Defaults to \"help\"\n   */\n  readonly icon?: string;\n  /**\n   * Custom header text\n   *\n   * Defaults to \"Help\"\n   */\n  readonly header?: string;\n  /**\n   * Custom empty text when no help contexts are available.\n   */\n  readonly emptyText?: string;\n  /**\n   * Origin element to attach the popover to.\n   */\n  readonly origin: ElementRef;\n  /**\n   * Specific contexts to display. If not provided, shows all active contexts from the DbxHelpContextService.\n   */\n  readonly helpContextKeys?: Maybe<ObservableOrValue<ArrayOrValue<DbxHelpContextKey>>>;\n\n  /**\n   * Optional footer component config to inject after the list.\n   */\n  readonly helpListFooterComponentConfig?: Maybe<DbxInjectionComponentConfig>;\n\n  /**\n   * Whether the accordion should allow multiple expanded panels.\n   */\n  readonly multi?: Maybe<boolean>;\n\n  /**\n   * Whether to show the empty list content.\n   *\n   * Defaults to true.\n   */\n  readonly allowEmptyListContent?: Maybe<boolean>;\n\n  /**\n   * Overrides the default popover header config.\n   *\n   * If not provided, the default popover header config will be used from DbxHelpWidgetService.\n   */\n  readonly popoverHeaderConfig?: Maybe<DbxInjectionComponentConfig>;\n  /**\n   * Additional popover configuration.\n   */\n  readonly popoverSizingConfig?: Maybe<DbxPopoverConfigSizing>;\n}\n\n/**\n * {@link DbxHelpViewPopoverConfig} without the `origin` property, used when the origin element is provided separately.\n */\nexport type DbxHelpViewPopoverConfigWithoutOrigin = Omit<DbxHelpViewPopoverConfig, 'origin'>;\n\n/**\n * Popover that displays a scrollable list of help widget entries for the active or specified help context keys.\n * Opened via {@link DbxHelpViewPopoverComponent.openPopover} or through the {@link DbxHelpViewPopoverButtonComponent}.\n *\n * @example\n * ```typescript\n * DbxHelpViewPopoverComponent.openPopover(popoverService, { origin: elementRef, header: 'Help' });\n * ```\n */\n@Component({\n  templateUrl: './help.view.popover.component.html',\n  imports: [DbxPopoverContentComponent, DbxPopoverHeaderComponent, DbxPopoverScrollContentDirective, DbxHelpViewListComponent, DbxInjectionComponent]\n})\nexport class DbxHelpViewPopoverComponent extends AbstractPopoverDirective<unknown, DbxHelpViewPopoverConfig> {\n  private readonly _helpContextService = inject(DbxHelpContextService);\n  private readonly _helpWidgetService = inject(DbxHelpWidgetService);\n\n  readonly helpContextKeys$ = this.popover.data?.helpContextKeys ?? this._helpContextService.activeHelpContextKeysArray$;\n\n  static openPopover(popoverService: DbxPopoverService, config: DbxHelpViewPopoverConfig, popoverKey?: DbxPopoverKey): NgPopoverRef {\n    const { origin, popoverSizingConfig, ...data } = config;\n\n    return popoverService.open({\n      height: '500px',\n      width: '600px',\n      ...popoverSizingConfig,\n      key: popoverKey ?? DEFAULT_DBX_HELP_VIEW_POPOVER_KEY,\n      componentClass: DbxHelpViewPopoverComponent,\n      data,\n      isResizable: true,\n      origin\n    });\n  }\n\n  get config(): DbxHelpViewPopoverConfig {\n    return this.popover.data as DbxHelpViewPopoverConfig;\n  }\n\n  readonly icon = this.config.icon ?? 'help';\n  readonly header = this.config.header ?? 'Help';\n  readonly multi = this.config.multi;\n  readonly emptyText = this.config.emptyText ?? 'No help topics available in current context.';\n  readonly allowEmptyListContent = this.config.allowEmptyListContent ?? true;\n  readonly helpListFooterComponentConfig = this.config.helpListFooterComponentConfig;\n\n  readonly popoverHeaderConfig: Maybe<DbxInjectionComponentConfig> = (() => {\n    let config: Maybe<DbxInjectionComponentConfig> = this.config.popoverHeaderConfig;\n\n    config ??= this._helpWidgetService.getPopoverHeaderComponentConfig();\n\n    return config;\n  })();\n}\n","<dbx-popover-content>\n  <!-- Header -->\n  <dbx-popover-header [icon]=\"icon\" [header]=\"header\">\n    <dbx-injection [config]=\"popoverHeaderConfig\"></dbx-injection>\n  </dbx-popover-header>\n  <!-- Content -->\n  <dbx-popover-scroll-content>\n    <dbx-help-view-list [helpContextKeys]=\"helpContextKeys$\" [multi]=\"multi\" [allowEmptyListContent]=\"allowEmptyListContent\" [helpListFooterComponentConfig]=\"helpListFooterComponentConfig\">\n      <p empty>{{ emptyText }}</p>\n    </dbx-help-view-list>\n  </dbx-popover-scroll-content>\n</dbx-popover-content>\n","import { Component, computed, ElementRef, inject, input, viewChild } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { AbstractPopoverRefDirective } from '../../interaction/popover/abstract.popover.ref.directive';\nimport { DbxPopoverService } from '../../interaction/popover/popover.service';\nimport { type NgPopoverRef } from 'ng-overlay-container';\nimport { DbxHelpViewPopoverComponent, type DbxHelpViewPopoverConfigWithoutOrigin } from './help.view.popover.component';\nimport { type DbxButtonDisplay } from '@dereekb/dbx-core';\nimport { DbxButtonComponent, type DbxButtonStyle } from '../../button';\n\n/**\n * Configuration for the {@link DbxHelpViewPopoverButtonComponent}, combining popover settings with button display and style options.\n */\nexport interface DbxHelpViewPopoverButtonConfig extends DbxHelpViewPopoverConfigWithoutOrigin {\n  /**\n   * The display configuration for the button.\n   */\n  readonly buttonDisplay?: Maybe<DbxButtonDisplay>;\n  /**\n   * The style configuration for the button.\n   */\n  readonly buttonStyle?: Maybe<DbxButtonStyle>;\n}\n\n/**\n * Button that opens a help popover displaying the currently active help context topics. Defaults to a \"help_center\" icon button.\n *\n * @example\n * ```html\n * <dbx-help-view-popover-button [config]=\"{ header: 'Help', icon: 'help' }\"></dbx-help-view-popover-button>\n * ```\n */\n@Component({\n  selector: 'dbx-help-view-popover-button',\n  template: `\n    <dbx-button #button (buttonClick)=\"showHelpPopover()\" [buttonStyle]=\"buttonStyleSignal()\" [buttonDisplay]=\"buttonDisplaySignal()\"></dbx-button>\n  `,\n  imports: [DbxButtonComponent]\n})\nexport class DbxHelpViewPopoverButtonComponent extends AbstractPopoverRefDirective<unknown, unknown> {\n  private readonly _dbxPopoverService = inject(DbxPopoverService);\n\n  readonly buttonElement = viewChild.required<string, ElementRef>('button', { read: ElementRef });\n\n  readonly config = input<Maybe<DbxHelpViewPopoverButtonConfig>>();\n\n  readonly buttonDisplaySignal = computed(() => {\n    const config = this.config();\n    return config?.buttonDisplay ?? { icon: config?.icon ?? 'help_center' };\n  });\n\n  readonly buttonStyleSignal = computed(() => this.config()?.buttonStyle);\n\n  protected override _makePopoverRef(origin?: Maybe<ElementRef>): NgPopoverRef<unknown, unknown> {\n    if (!origin) {\n      throw new Error('Missing origin.');\n    }\n\n    const config = this.config();\n\n    return DbxHelpViewPopoverComponent.openPopover(this._dbxPopoverService, {\n      origin,\n      ...config\n    });\n  }\n\n  showHelpPopover(): void {\n    const origin = this.buttonElement();\n    this.showPopover(origin);\n  }\n}\n","import { JPEG_MIME_TYPE, JPEG_MIME_TYPES, PNG_MIME_TYPE, type FileSize, type Maybe, type MimeTypeWithoutParameters } from '@dereekb/util';\n\n/**\n * Describes whether an image file went through client-side compression.\n *\n * - `unchanged` — the original file is returned as-is.\n * - `resized` — the image was downscaled but its MIME type was preserved.\n * - `converted` — the image's MIME type was converted (e.g. PNG → JPEG) without resizing.\n * - `resized_and_converted` — the image was both downscaled and converted.\n */\nexport type ImageCompressionStatus = 'unchanged' | 'resized' | 'converted' | 'resized_and_converted';\n\n/**\n * Configures client-side image compression for an image `File`.\n */\nexport interface DbxImageCompressionConfig {\n  /**\n   * Maximum allowed value for the larger image dimension in pixels. Images larger than this are scaled down so neither width nor height exceeds the limit, preserving aspect ratio. `null`/undefined disables resizing.\n   */\n  readonly maxDimension?: Maybe<number>;\n  /**\n   * Convert PNG inputs to JPEG. Defaults to `false`. JPEGs that need resizing are always re-encoded as JPEG.\n   */\n  readonly convertPngToJpeg?: Maybe<boolean>;\n  /**\n   * JPEG encode quality in [0,1]. Defaults to `0.85`. Used for PNG→JPEG conversion and for resized JPEG re-encoding.\n   */\n  readonly jpegQuality?: Maybe<number>;\n  /**\n   * Skip compression when the file is already smaller than this many bytes. `null`/undefined applies no minimum.\n   */\n  readonly minSizeBytes?: Maybe<FileSize>;\n}\n\n/**\n * Default JPEG quality used when re-encoding images during compression.\n */\nexport const DEFAULT_IMAGE_JPEG_QUALITY = 0.85;\n\n/**\n * Pixel dimensions captured from a decoded image.\n */\nexport interface CompressImageDimensions {\n  readonly width: number;\n  readonly height: number;\n}\n\n/**\n * Result of {@link compressImageFile}. Holds the (possibly unchanged) file alongside a status describing what happened.\n */\nexport interface CompressImageFileResult {\n  /**\n   * Final file. When `compression === 'unchanged'`, this is the same `File` reference passed in.\n   */\n  readonly file: File;\n  /**\n   * Final MIME type. May differ from the input file's type when conversion occurred.\n   */\n  readonly mimeType: MimeTypeWithoutParameters;\n  /**\n   * What happened to the file. `'unchanged'` when no compression was applied.\n   */\n  readonly compression: ImageCompressionStatus;\n  /**\n   * Dimensions of the source image, captured during decoding. Only set when the source was decoded (i.e. compression actually ran).\n   */\n  readonly originalDimensions?: Maybe<CompressImageDimensions>;\n  /**\n   * Dimensions of the final image. When the source was decoded but the original file was kept (e.g. recompression grew the file), this equals {@link originalDimensions}. Only set when the source was decoded.\n   */\n  readonly finalDimensions?: Maybe<CompressImageDimensions>;\n}\n\ninterface ImageEncodeTarget {\n  readonly mimeType: MimeTypeWithoutParameters;\n  readonly extension: string;\n}\n\n/**\n * Inputs supplied to an {@link ImageBitmapToBlobEncoder} when {@link compressImageFile} needs to emit a compressed image.\n */\nexport interface ImageBitmapToBlobEncoderInput {\n  readonly bitmap: ImageBitmap;\n  readonly targetWidth: number;\n  readonly targetHeight: number;\n  readonly mimeType: MimeTypeWithoutParameters;\n  readonly quality: number;\n}\n\n/**\n * Strategy responsible for turning an {@link ImageBitmap} into a `Blob` of the requested MIME type and quality. The default implementation uses {@link OffscreenCanvas} (or a `HTMLCanvasElement` fallback) — tests can pass a stub to avoid touching real canvas APIs.\n */\nexport type ImageBitmapToBlobEncoder = (input: ImageBitmapToBlobEncoderInput) => Promise<Maybe<Blob>>;\n\nconst PNG_EXTENSION = '.png';\nconst JPG_EXTENSION = '.jpg';\n\nfunction isJpegMime(mimeType: MimeTypeWithoutParameters): boolean {\n  return JPEG_MIME_TYPES.includes(mimeType);\n}\n\nfunction decideEncodeTarget(sourceMimeType: MimeTypeWithoutParameters, convertPngToJpeg: boolean): ImageEncodeTarget {\n  let mimeType: MimeTypeWithoutParameters;\n  let extension: string;\n\n  if (isJpegMime(sourceMimeType)) {\n    mimeType = JPEG_MIME_TYPE;\n    extension = JPG_EXTENSION;\n  } else if (sourceMimeType === PNG_MIME_TYPE) {\n    if (convertPngToJpeg) {\n      mimeType = JPEG_MIME_TYPE;\n      extension = JPG_EXTENSION;\n    } else {\n      mimeType = PNG_MIME_TYPE;\n      extension = PNG_EXTENSION;\n    }\n  } else {\n    // Unsupported source — let caller short-circuit.\n    mimeType = sourceMimeType;\n    extension = '';\n  }\n\n  return { mimeType, extension };\n}\n\nfunction computeScale(width: number, height: number, maxDimension: Maybe<number>): number {\n  let scale: number;\n\n  if (maxDimension == null || maxDimension <= 0) {\n    scale = 1;\n  } else {\n    const largest = Math.max(width, height);\n\n    if (largest <= maxDimension) {\n      scale = 1;\n    } else {\n      scale = maxDimension / largest;\n    }\n  }\n\n  return scale;\n}\n\n/**\n * Default {@link ImageBitmapToBlobEncoder} that draws the bitmap onto an {@link OffscreenCanvas} (or `HTMLCanvasElement` fallback) and encodes to a blob via `convertToBlob` / `toBlob`.\n *\n * @param input - Bitmap and target dimensions to encode.\n * @returns A blob with the encoded image, or `null` if encoding failed.\n */\nexport const DEFAULT_IMAGE_BITMAP_TO_BLOB_ENCODER: ImageBitmapToBlobEncoder = async (input) => {\n  const { bitmap, targetWidth, targetHeight, mimeType, quality } = input;\n  let canvas: OffscreenCanvas | HTMLCanvasElement;\n\n  if (typeof OffscreenCanvas === 'undefined') {\n    const htmlCanvas = document.createElement('canvas');\n    htmlCanvas.width = targetWidth;\n    htmlCanvas.height = targetHeight;\n    canvas = htmlCanvas;\n  } else {\n    canvas = new OffscreenCanvas(targetWidth, targetHeight);\n  }\n\n  const ctx = (canvas as OffscreenCanvas).getContext('2d') as Maybe<CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D>;\n\n  if (!ctx) {\n    throw new Error('Failed to acquire 2D canvas context for image compression.');\n  }\n\n  ctx.drawImage(bitmap, 0, 0, targetWidth, targetHeight);\n\n  let blob: Maybe<Blob>;\n\n  if (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n    blob = await canvas.convertToBlob({ type: mimeType, quality });\n  } else {\n    blob = await new Promise<Maybe<Blob>>((resolve) => {\n      (canvas as HTMLCanvasElement).toBlob((b) => resolve(b), mimeType, quality);\n    });\n  }\n\n  return blob;\n};\n\nfunction rewriteFileName(originalName: string, targetExtension: string): string {\n  let result: string;\n\n  if (targetExtension === '') {\n    result = originalName;\n  } else {\n    const lastDot = originalName.lastIndexOf('.');\n    const base = lastDot >= 0 ? originalName.slice(0, lastDot) : originalName;\n    result = `${base}${targetExtension}`;\n  }\n\n  return result;\n}\n\nfunction determineStatus(resized: boolean, converted: boolean): ImageCompressionStatus {\n  let status: ImageCompressionStatus;\n\n  if (resized && converted) {\n    status = 'resized_and_converted';\n  } else if (resized) {\n    status = 'resized';\n  } else if (converted) {\n    status = 'converted';\n  } else {\n    status = 'unchanged';\n  }\n\n  return status;\n}\n\n/**\n * Compresses an image `File` according to the supplied {@link DbxImageCompressionConfig}.\n *\n * Behavior:\n * - When the file is not a PNG/JPEG, or the config disables every compression path, returns the file unchanged.\n * - When the file fits inside `maxDimension` and no PNG→JPEG conversion is required, returns the file unchanged.\n * - Otherwise decodes via `createImageBitmap`, draws onto an {@link OffscreenCanvas} (or HTMLCanvasElement fallback), encodes the result using {@link DEFAULT_IMAGE_JPEG_QUALITY} or the configured `jpegQuality`, and wraps the blob into a new `File` with rewritten extension.\n * - Safety: if the encoded output is larger than the original, returns the original (compression is reported as `'unchanged'`).\n *\n * @param file - Source image file.\n * @param config - Compression configuration.\n * @param encoder - Optional injectable encoder used by tests to bypass real canvas APIs. Defaults to {@link DEFAULT_IMAGE_BITMAP_TO_BLOB_ENCODER}.\n * @returns Result describing the final file plus the {@link ImageCompressionStatus} for it.\n */\nexport async function compressImageFile(file: File, config: Maybe<DbxImageCompressionConfig>, encoder: ImageBitmapToBlobEncoder = DEFAULT_IMAGE_BITMAP_TO_BLOB_ENCODER): Promise<CompressImageFileResult> {\n  const mimeType = (file.type ?? '').toLowerCase();\n  const maxDimension = config?.maxDimension;\n  const convertPngToJpeg = config?.convertPngToJpeg ?? false;\n  const jpegQuality = config?.jpegQuality ?? DEFAULT_IMAGE_JPEG_QUALITY;\n  const minSizeBytes: Maybe<FileSize> = config?.minSizeBytes;\n\n  const isPng = mimeType === PNG_MIME_TYPE;\n  const isJpeg = isJpegMime(mimeType);\n  const isSupported = isPng || isJpeg;\n\n  let result: CompressImageFileResult;\n  const shouldConvertPng = isPng && convertPngToJpeg;\n\n  if (!isSupported || config == null) {\n    result = { file, mimeType: mimeType || file.type, compression: 'unchanged' };\n  } else if ((maxDimension == null || maxDimension <= 0) && !shouldConvertPng) {\n    // No-op config for this file.\n    result = { file, mimeType, compression: 'unchanged' };\n  } else if (minSizeBytes != null && file.size <= minSizeBytes && !shouldConvertPng) {\n    // File is already small enough; skip when conversion is not required.\n    result = { file, mimeType, compression: 'unchanged' };\n  } else {\n    result = await encodeCompressedImage({ file, mimeType, maxDimension, convertPngToJpeg, jpegQuality, isPng, encoder });\n  }\n\n  return result;\n}\n\ninterface EncodeCompressedImageInput {\n  readonly file: File;\n  readonly mimeType: MimeTypeWithoutParameters;\n  readonly maxDimension: Maybe<number>;\n  readonly convertPngToJpeg: boolean;\n  readonly jpegQuality: number;\n  readonly isPng: boolean;\n  readonly encoder: ImageBitmapToBlobEncoder;\n}\n\nasync function encodeCompressedImage(input: EncodeCompressedImageInput): Promise<CompressImageFileResult> {\n  const { file, mimeType, maxDimension, convertPngToJpeg, jpegQuality, isPng, encoder } = input;\n  let bitmap: Maybe<ImageBitmap> = null;\n  let result: CompressImageFileResult;\n\n  try {\n    bitmap = await createImageBitmap(file);\n    const originalDimensions: CompressImageDimensions = { width: bitmap.width, height: bitmap.height };\n    const scale = computeScale(bitmap.width, bitmap.height, maxDimension);\n    const targetWidth = Math.max(1, Math.round(bitmap.width * scale));\n    const targetHeight = Math.max(1, Math.round(bitmap.height * scale));\n    const needsResize = scale < 1;\n    const needsConvert = isPng && convertPngToJpeg;\n\n    if (!needsResize && !needsConvert) {\n      result = { file, mimeType, compression: 'unchanged', originalDimensions, finalDimensions: originalDimensions };\n    } else {\n      const target = decideEncodeTarget(mimeType, convertPngToJpeg);\n      const blob = await encoder({ bitmap, targetWidth, targetHeight, mimeType: target.mimeType, quality: jpegQuality });\n      result = buildEncodeResult({ blob, file, mimeType, originalDimensions, targetWidth, targetHeight, target, needsResize, needsConvert });\n    }\n  } finally {\n    bitmap?.close?.();\n  }\n\n  return result;\n}\n\ninterface BuildEncodeResultInput {\n  readonly blob: Maybe<Blob>;\n  readonly file: File;\n  readonly mimeType: MimeTypeWithoutParameters;\n  readonly originalDimensions: CompressImageDimensions;\n  readonly targetWidth: number;\n  readonly targetHeight: number;\n  readonly target: ImageEncodeTarget;\n  readonly needsResize: boolean;\n  readonly needsConvert: boolean;\n}\n\nfunction buildEncodeResult(input: BuildEncodeResultInput): CompressImageFileResult {\n  const { blob, file, mimeType, originalDimensions, targetWidth, targetHeight, target, needsResize, needsConvert } = input;\n\n  if (blob == null || blob.size <= 0 || blob.size >= file.size) {\n    // No blob, empty blob, or recompression grew the file; keep the original.\n    return { file, mimeType, compression: 'unchanged', originalDimensions, finalDimensions: originalDimensions };\n  }\n\n  const nextName = needsConvert ? rewriteFileName(file.name, target.extension) : file.name;\n  const nextFile = new File([blob], nextName, { type: target.mimeType, lastModified: file.lastModified });\n  const status = determineStatus(needsResize, needsConvert);\n  const finalDimensions: CompressImageDimensions = { width: targetWidth, height: targetHeight };\n  return { file: nextFile, mimeType: target.mimeType, compression: status, originalDimensions, finalDimensions };\n}\n","import { InjectionToken, type Provider } from '@angular/core';\nimport { JPEG_MIME_TYPE, PDF_MIME_TYPE, PNG_MIME_TYPE, type FileSize, type Maybe, type MimeTypeWithoutParameters } from '@dereekb/util';\nimport { type Observable } from 'rxjs';\nimport { type DbxImageCompressionConfig, type ImageCompressionStatus } from '../image';\nimport { type FileArrayAcceptMatchConfig } from '../../interaction/upload/upload.accept';\nimport { type DbxButtonDisplayStylePair } from '../../button/button';\nimport { type DbxActionConfirmConfig } from '../../action/action.confirm.directive';\n\n/**\n * Identifies which kind of source file a {@link PdfMergeEntry} represents.\n *\n * - `pdf` — an existing PDF document whose pages are copied into the merged output.\n * - `image` — a raster image (PNG/JPEG) embedded as a single page in the merged output.\n */\nexport type PdfMergeEntryKind = 'pdf' | 'image';\n\n/**\n * Captured pre-compression metadata for a {@link PdfMergeEntry}. When no compression ran, the values match the post-compression entry fields.\n */\nexport interface PdfMergeEntryOriginal {\n  readonly name: string;\n  readonly mimeType: MimeTypeWithoutParameters;\n  readonly size: FileSize;\n  /**\n   * Pixel dimensions of the source image. Only set for images that were decoded during compression.\n   */\n  readonly dimensions?: Maybe<{ readonly width: number; readonly height: number }>;\n}\n\n/**\n * Lifecycle status of a {@link PdfMergeEntry} as it is added, validated, and (potentially) merged.\n *\n * - `validating` — the entry has been added but its bytes have not yet been verified.\n * - `ready` — validation succeeded; the entry can participate in a merge.\n * - `error` — validation failed (corrupt, unsupported, password protected, etc.).\n */\nexport type PdfMergeEntryStatus = 'validating' | 'ready' | 'error';\n\n/**\n * Validation result for a single {@link PdfMergeEntry}.\n */\nexport interface PdfMergeEntryValidationResult {\n  readonly ok: boolean;\n  readonly errorMessage?: Maybe<string>;\n  /**\n   * Whether the file appears to be encrypted (contains a `/Encrypt` dictionary). Reported as a fact independent of `ok` so consumers can decide whether to focus on, ignore, or reject the entry. Validation does not fail an entry purely because it is encrypted.\n   */\n  readonly encrypted?: Maybe<boolean>;\n}\n\n/**\n * Strategy for how the editor reacts when an encrypted PDF is added.\n *\n * - `focus` (default) — the encrypted entry stays `ready` and all non-encrypted entries are hidden from the merge (greyed out in the list). The merge output is the encrypted file's bytes passed through unchanged so downstream upload flows still receive a usable blob. This holds with page editing enabled: an encrypted document cannot be opened, so it lists no editable pages and the empty page plan does not gate the output (see `pdfMergeEntriesUseEncryptedPassthrough`). Every {@link DbxPdfMergeEditorFileUploadComponent} slot other than the one holding the encrypted file withdraws its add affordances and waives its `required` check, since nothing put there could reach the output.\n * - `error` — encrypted entries are marked as `error` with a \"Password-protected PDFs cannot be merged.\" message. Preserves the legacy hard-reject behavior.\n * - `allow` — encrypted entries stay `ready` and participate in the merge alongside other entries. The client-side `pdf-lib` merge will fail; useful only for consumers that bypass `mergeOutput$` and upload raw entries themselves.\n */\nexport type DbxPdfMergeEncryptedHandling = 'focus' | 'error' | 'allow';\n\n/**\n * Default {@link DbxPdfMergeEncryptedHandling} when no consumer or token overrides it.\n */\nexport const DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING: DbxPdfMergeEncryptedHandling = 'focus';\n\n/**\n * Error message used when an encrypted entry is projected to the `error` status under {@link DbxPdfMergeEncryptedHandling} `'error'` mode.\n */\nexport const DBX_PDF_MERGE_ENCRYPTED_ERROR_MESSAGE = 'Password-protected PDFs cannot be merged.';\n\n/**\n * Default value for {@link DbxPdfMergeEditorConfig.pageEditing}. Off, so the editor's default behavior is unchanged.\n */\nexport const DEFAULT_DBX_PDF_MERGE_PAGE_EDITING = false;\n\n/**\n * Default value for {@link DbxPdfMergeEditorConfig.sidecar}. Off, so merged output bytes are unchanged.\n */\nexport const DEFAULT_DBX_PDF_MERGE_SIDECAR = false;\n\n/**\n * Default value for {@link DbxPdfMergeEditorConfig.restoreImportOnClear}. On, so an editor the app populated programmatically is reset to that document by Clear rather than left empty.\n */\nexport const DEFAULT_DBX_PDF_MERGE_RESTORE_IMPORT_ON_CLEAR = true;\n\n/**\n * Message shown on an encrypted entry's row while page editing is enabled. Encrypted documents cannot be opened by `pdf-lib`, so their pages cannot be listed or edited — the entry stays a single opaque row, and the merge emits the file unchanged.\n */\nexport const DBX_PDF_MERGE_ENCRYPTED_NOT_EDITABLE_MESSAGE = 'This file cannot be edited; it will be used as-is.';\n\n/**\n * Message shown on a row the active {@link DbxPdfMergeEncryptedHandling} is ignoring, i.e. a non-focused entry under `focus` mode. Kept in the list (rather than dropped) so a file the user added never disappears without an explanation.\n */\nexport const DBX_PDF_MERGE_IGNORED_ENTRY_MESSAGE = 'Ignored since an encrypted file is used instead.';\n\n/**\n * Message shown on a {@link DbxPdfMergeEditorFileUploadComponent} slot whose section cannot contribute to the document because an encrypted PDF elsewhere in the editor is being used as the whole output under `focus` handling.\n */\nexport const DBX_PDF_MERGE_SUPERSEDED_SLOT_MESSAGE = 'An encrypted PDF is being used as the whole document.';\n\n/**\n * MIME types accepted by the PDF merge editor by default: PDF documents and PNG/JPEG images.\n */\nexport const DEFAULT_PDF_MERGE_ACCEPT: readonly MimeTypeWithoutParameters[] = [PDF_MIME_TYPE, PNG_MIME_TYPE, JPEG_MIME_TYPE];\n\n/**\n * MIME type emitted by the merged result blob.\n */\nexport const PDF_MERGE_RESULT_MIME_TYPE: MimeTypeWithoutParameters = PDF_MIME_TYPE;\n\n/**\n * A single source file that has been added to the PDF merge editor.\n */\nexport interface PdfMergeEntry extends Pick<PdfMergeEntryValidationResult, 'errorMessage'> {\n  /**\n   * Stable identifier for this entry, generated when the entry is created.\n   */\n  readonly id: string;\n  /**\n   * Original file selected by the user. Retained for both validation and merging.\n   */\n  readonly file: File;\n  /**\n   * Display name (the file's `name`).\n   */\n  readonly name: string;\n  /**\n   * Resolved MIME type. Falls back to extension-based inference when the file did not provide one.\n   */\n  readonly mimeType: MimeTypeWithoutParameters;\n  /**\n   * File size in bytes.\n   */\n  readonly size: FileSize;\n  /**\n   * Whether the entry contributes pages from a PDF or from an image.\n   */\n  readonly kind: PdfMergeEntryKind;\n  /**\n   * Current validation/merge readiness status.\n   */\n  readonly status: PdfMergeEntryStatus;\n  /**\n   * The validation promise.\n   */\n  readonly validation: Promise<PdfMergeEntryValidationResult>;\n  /**\n   * Optional slot identifier. Set when the entry was added through a {@link DbxPdfMergeEditorFileUploadComponent} slot, used by the store to filter entries per slot and clean them up when the slot component is destroyed. Entries added through the editor's default upload area have no slot id.\n   */\n  readonly slotId?: Maybe<string>;\n  /**\n   * Metadata captured from the user-supplied file before any client-side compression. When no compression ran, the values match {@link PdfMergeEntry.name}, {@link PdfMergeEntry.mimeType}, {@link PdfMergeEntry.size}.\n   */\n  readonly original: PdfMergeEntryOriginal;\n  /**\n   * Result of the client-side compression step on upload. `'unchanged'` when no compression ran.\n   */\n  readonly compression: ImageCompressionStatus;\n  /**\n   * Whether the entry's source file appears to be encrypted (contains a `/Encrypt` dictionary). Set during validation; defaults to `false`. The store decides how to react via {@link DbxPdfMergeEncryptedHandling}.\n   */\n  readonly encrypted: boolean;\n}\n\n/**\n * Read-only view of a {@link PdfMergeEntry} enriched with the `ignored` flag derived by the store from the active {@link DbxPdfMergeEncryptedHandling}. When `ignored` is `true`, the entry is still present in the list but is excluded from the merge output and rendered in a greyed-out state.\n */\nexport interface PdfMergeEntryView extends PdfMergeEntry {\n  /**\n   * Whether the editor is currently ignoring this entry for merge purposes. Only `true` under `focus` mode when at least one encrypted entry exists and this entry is not itself the encrypted focus target.\n   */\n  readonly ignored: boolean;\n}\n\n/**\n * Rotation the user has applied to a page, in degrees clockwise.\n */\nexport type PdfMergePageRotation = 0 | 90 | 180 | 270;\n\n/**\n * Group key used for pages whose source entry has no slot id.\n */\nexport const DEFAULT_PDF_MERGE_PAGE_GROUP_KEY = '_';\n\n/**\n * Returns the group key a page reorders within — its entry's slot id, or {@link DEFAULT_PDF_MERGE_PAGE_GROUP_KEY} when the entry is unslotted.\n *\n * @param slotId - Slot id of the owning entry, if any.\n * @returns The group key.\n * @__NO_SIDE_EFFECTS__\n */\nexport function pdfMergePageGroupKeyForSlotId(slotId: Maybe<string>): string {\n  return slotId ?? DEFAULT_PDF_MERGE_PAGE_GROUP_KEY;\n}\n\n/**\n * Separator between the entry id and the page index inside a page id.\n */\nexport const PDF_MERGE_PAGE_ID_SEPARATOR = ':';\n\n/**\n * Builds the stable identifier for a page within the editor.\n *\n * @param entryId - Id of the owning {@link PdfMergeEntry}.\n * @param sourceIndex - Zero-based page index within that entry's source document.\n * @returns The page id.\n * @__NO_SIDE_EFFECTS__\n */\nexport function makePdfMergePageId(entryId: string, sourceIndex: number): string {\n  return `${entryId}${PDF_MERGE_PAGE_ID_SEPARATOR}${sourceIndex}`;\n}\n\n/**\n * Returns the id of the entry a page id belongs to. Used to prune page state when an entry leaves the list.\n *\n * @param pageId - Page id produced by {@link makePdfMergePageId}.\n * @returns The owning entry's id.\n * @__NO_SIDE_EFFECTS__\n */\nexport function entryIdForPdfMergePageId(pageId: string): string {\n  return pageId.slice(0, pageId.indexOf(PDF_MERGE_PAGE_ID_SEPARATOR));\n}\n\n/**\n * Per-page metadata captured when a {@link PdfMergeEntry} is expanded for page editing. Read once per entry by the store's hydration pass and cached for as long as the entry stays in the list.\n */\nexport interface PdfMergePageMeta {\n  /**\n   * Zero-based index of this page within its source document.\n   */\n  readonly sourceIndex: number;\n  /**\n   * Page width in PDF points.\n   */\n  readonly width: number;\n  /**\n   * Page height in PDF points.\n   */\n  readonly height: number;\n  /**\n   * Rotation already baked into the source page, in degrees. User rotation composes on top of this at merge time rather than replacing it, so rotating an already-sideways scan behaves as the user expects.\n   */\n  readonly sourceRotation: number;\n}\n\n/**\n * A user's edits to a single page, held sparsely in {@link PdfMergeEditorState.pageOverrides}. Only pages the user has actually touched appear, so adding or removing an entry needs no page bookkeeping.\n */\nexport interface PdfMergePageOverride {\n  readonly rotation: PdfMergePageRotation;\n  readonly removed: boolean;\n}\n\n/**\n * A single page in the editor's page plan, derived by the store from the current entries plus any {@link PdfMergePageOverride}. Only produced while page editing is enabled.\n */\nexport interface PdfMergePageView {\n  /**\n   * Stable identifier — see {@link makePdfMergePageId}.\n   */\n  readonly id: string;\n  /**\n   * Id of the {@link PdfMergeEntry} this page came from.\n   */\n  readonly entryId: string;\n  /**\n   * Slot that owns the source entry, or `null` when unslotted.\n   */\n  readonly slotId: Maybe<string>;\n  /**\n   * Key of the group this page reorders within — see {@link pdfMergePageGroupKeyForSlotId}.\n   */\n  readonly groupKey: string;\n  /**\n   * Name of the source file the page came from.\n   */\n  readonly sourceName: string;\n  /**\n   * Whether the page came from a PDF or from an embedded image. Also determines how {@link PdfMergePageMeta} dimensions should be read — PDF pages are measured in points, image pages in pixels.\n   */\n  readonly kind: PdfMergeEntryKind;\n  /**\n   * Zero-based index of this page within its source document.\n   */\n  readonly sourceIndex: number;\n  /**\n   * Total page count of the source document. Drives the \"page 2 of 3\" label.\n   */\n  readonly sourcePageCount: number;\n  /**\n   * Metadata read from the source page.\n   */\n  readonly meta: PdfMergePageMeta;\n  /**\n   * User-applied rotation, composed with {@link PdfMergePageMeta.sourceRotation} at merge time.\n   */\n  readonly rotation: PdfMergePageRotation;\n  /**\n   * Whether the user marked this page for deletion. Marked pages stay visible in the list (struck through, restorable) but are excluded from the merge output.\n   */\n  readonly removed: boolean;\n}\n\n/**\n * A set of pages that reorder together — every page contributed by one slot's entries, or every unslotted page. Pages never move between groups: the page list renders one CDK drop list per group, and unconnected drop lists cannot accept each other's drags, so the rule is enforced by construction rather than by a guard.\n */\nexport interface PdfMergePageGroup {\n  readonly groupKey: string;\n  /**\n   * Slot the group belongs to, or `null` for the unslotted group.\n   */\n  readonly slotId: Maybe<string>;\n  readonly pages: readonly PdfMergePageView[];\n}\n\n/**\n * Validation delegate registered on the {@link DbxPdfMergeEditorStore}. Receives the live {@link PdfMergeEntry} stream and returns a stream of `boolean` values controlling whether the store may emit a merge result. Emitting `false` causes {@link DbxPdfMergeEditorStore.currentMergeOutput$} to emit `undefined` and prevents {@link DbxPdfMergeEditorStore.mergeOutput$} from emitting.\n */\nexport type DbxPdfMergeEditorValidator = (entries$: Observable<PdfMergeEntry[]>) => Observable<boolean>;\n\n/**\n * Minimal interface that a slot upload component exposes to {@link DbxPdfMergeEditorFileUploadValidatorDirective}. Implemented by {@link DbxPdfMergeEditorFileUploadComponent}.\n */\nexport interface DbxPdfMergeEditorFileUploadValidatorSlot {\n  /**\n   * Identifies the slot. Used by the validator directive only for diagnostics — the directive aggregates by reference, not by id.\n   */\n  readonly slotId: () => string;\n  /**\n   * Stream that emits `true` while this slot is satisfied (per its own config and the validator's required/optional rules) and `false` otherwise.\n   */\n  readonly isValid$: Observable<boolean>;\n}\n\n/**\n * State managed by the PDF merge editor's component store.\n */\nexport interface PdfMergeEditorState {\n  /**\n   * Ordered list of entries the user has added. Order determines page order in the merged output.\n   */\n  readonly rawEntries: PdfMergeEntry[];\n  /**\n   * Sparse per-page edit overrides keyed by {@link PdfMergePageView.id}. Only pages the user has touched appear here. Overrides for pages that no longer resolve are ignored by the derived page stream and pruned when their owning entry leaves the list. Stays empty while page editing is disabled.\n   */\n  readonly pageOverrides: Record<string, PdfMergePageOverride>;\n  /**\n   * Explicit page ordering per group key, holding {@link PdfMergePageView.id} values. A group absent from this record uses natural order. Ids that no longer resolve are ignored, and pages missing from a stored list are appended in natural order — so the ordering self-heals as entries come and go. Stays empty while page editing is disabled.\n   */\n  readonly pageOrder: Record<string, string[]>;\n}\n\n/**\n * Index movement payload used by the editor's reorder updater.\n */\nexport interface PdfMergeEntryMove {\n  readonly previousIndex: number;\n  readonly currentIndex: number;\n}\n\n/**\n * Index movement payload used by the editor's page reorder updater. Indices are group-local — the positions the group's CDK drop list sees, not positions in the overall page plan.\n */\nexport interface PdfMergePageMove {\n  readonly groupKey: string;\n  /**\n   * The group's page ids in the order they were rendered when the drag started.\n   *\n   * Supplied by the caller rather than recomputed by the store: the plan is derived state, so the store cannot see the exact order the user was looking at. Rewriting the array the component rendered keeps the stored order and the visible order in step.\n   */\n  readonly pageIds: readonly string[];\n  readonly previousIndex: number;\n  readonly currentIndex: number;\n}\n\n/**\n * Payload for setting a page's rotation.\n */\nexport interface PdfMergePageRotationChange {\n  readonly pageId: string;\n  readonly rotation: PdfMergePageRotation;\n}\n\n/**\n * Payload for marking a page as removed or restoring it.\n */\nexport interface PdfMergePageRemovedChange {\n  readonly pageId: string;\n  readonly removed: boolean;\n}\n\n/**\n * Output size limits enforced by {@link DbxPdfMergeEditorComponent} on its merged blob.\n */\nexport interface DbxPdfMergeOutputSizeLimitsConfig {\n  /**\n   * Soft cap in bytes. Above this the editor surfaces a warning banner but Preview/Download stay enabled.\n   */\n  readonly warnBytes?: Maybe<FileSize>;\n  /**\n   * Hard cap in bytes. Above this the editor blocks Preview/Download via the store's validity pipeline.\n   */\n  readonly errorBytes?: Maybe<FileSize>;\n}\n\n/**\n * Top-level configuration object accepted by {@link DbxPdfMergeEditorComponent} (via input) and by {@link DBX_PDF_MERGE_EDITOR_CONFIG} (via dependency injection).\n */\nexport interface DbxPdfMergeEditorConfig {\n  /**\n   * Image compression to run on uploads. When omitted, files enter the entry list unchanged.\n   */\n  readonly imageCompression?: Maybe<DbxImageCompressionConfig>;\n  /**\n   * Soft/hard output-size limits surfaced via warning/error banners and (for `errorBytes`) the store's validity gate.\n   */\n  readonly outputSizeLimits?: Maybe<DbxPdfMergeOutputSizeLimitsConfig>;\n  /**\n   * Accept filter for the editor's default \"Add files\" upload area. Defaults to {@link DEFAULT_PDF_MERGE_ACCEPT}.\n   */\n  readonly accept?: Maybe<FileArrayAcceptMatchConfig['accept']>;\n  /**\n   * Whether the default upload area accepts multiple files. Defaults to `true`.\n   */\n  readonly multiple?: Maybe<boolean>;\n  /**\n   * File name used for the merged output (download + preview). Defaults to `merged.pdf`.\n   */\n  readonly fileName?: Maybe<string>;\n  /**\n   * Whether to show the embedded download button. Defaults to `false`.\n   */\n  readonly showDownloadButton?: Maybe<boolean>;\n  /**\n   * Whether to show the Preview button. Defaults to `true`.\n   */\n  readonly showPreviewButton?: Maybe<boolean>;\n  /**\n   * Display/style pair for the embedded download button.\n   */\n  readonly downloadButton?: Maybe<DbxButtonDisplayStylePair>;\n  /**\n   * When `false`, hides the default \"Add files\" upload area. Use when projecting {@link DbxPdfMergeEditorFileUploadComponent} slots through `<ng-content>` instead of the unscoped uploader. Defaults to `true`.\n   */\n  readonly showAddFiles?: Maybe<boolean>;\n  /**\n   * When `false`, hides the shared file list below the slot content. Useful when each slot displays its owned files inline. Defaults to `true`.\n   */\n  readonly showFileList?: Maybe<boolean>;\n  /**\n   * Strategy for how encrypted PDFs are handled — see {@link DbxPdfMergeEncryptedHandling}. Defaults to {@link DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING} (`'focus'`).\n   */\n  readonly encryptedHandling?: Maybe<DbxPdfMergeEncryptedHandling>;\n  /**\n   * Enables page editing mode. When `true`, the editor's list shows the individual pages of each uploaded PDF instead of one row per file, letting the user reorder, rotate, and mark pages for deletion with the merged output updating live.\n   *\n   * Pages reorder only within their own slot — a slot is one logical document, so letting a page cross slots would silently move content between documents.\n   *\n   * Defaults to {@link DEFAULT_DBX_PDF_MERGE_PAGE_EDITING} (`false`), in which case the editor behaves exactly as it does without this option: the page list is never instantiated and no source document is parsed.\n   */\n  readonly pageEditing?: Maybe<boolean>;\n  /**\n   * Embeds a sidecar manifest and per-page tags into the merged output, recording which pages came from which slot so downstream code can target them later via `readPdfMergeSidecar`. Independent of {@link pageEditing} — a plain slot merge benefits from the record too.\n   *\n   * Defaults to {@link DEFAULT_DBX_PDF_MERGE_SIDECAR} (`false`), in which case the output bytes are unchanged.\n   */\n  readonly sidecar?: Maybe<boolean>;\n  /**\n   * Overrides merged over the default confirmation shown before the editor's footer Clear button empties every entry. Set `autoConfirm: true` to clear without prompting, restoring the pre-confirmation behavior.\n   */\n  readonly clearConfirm?: Maybe<DbxActionConfirmConfig>;\n  /**\n   * Whether the footer Clear button resets a programmatically-supplied document to that document rather than discarding it. Defaults to `true`.\n   *\n   * See {@link DbxPdfMergeEditorStore.clearEntries} — the point is that an app that populated the editor via `importMergedPdf` (or `[source]`) never ends up looking at an empty editor it did not ask for. Set `false` for an editor whose Clear should empty everything, baseline included.\n   */\n  readonly restoreImportOnClear?: Maybe<boolean>;\n}\n\n/**\n * Injection token for a workspace-wide default {@link DbxPdfMergeEditorConfig}. Use {@link provideDbxPdfMergeEditorConfig} to register a value.\n */\nexport const DBX_PDF_MERGE_EDITOR_CONFIG = new InjectionToken<DbxPdfMergeEditorConfig>('DBX_PDF_MERGE_EDITOR_CONFIG');\n\n/**\n * Helper that returns a {@link Provider} binding {@link DBX_PDF_MERGE_EDITOR_CONFIG} to the given config value.\n *\n * @param config - Configuration to register.\n * @returns Provider entry suitable for inclusion in `providers`.\n */\nexport function provideDbxPdfMergeEditorConfig(config: DbxPdfMergeEditorConfig): Provider {\n  return { provide: DBX_PDF_MERGE_EDITOR_CONFIG, useValue: config };\n}\n\n/**\n * Injection token that, when bound to `true`, makes `<dbx-pdf-merge-editor-file-upload>` slots skip their default `ngOnDestroy` cleanup (which removes the slot's entries from the shared store). Use when slots are hosted inside an ephemeral container — for example, the PDF merge upload dialog — and the store outlives that container, so the user's selection should survive when the container is torn down. Defaults to `false` (slot destroy removes its entries) which keeps the in-page editor's behavior for the common case where adding/removing a slot via `@if` should drop its entries with it.\n */\nexport const DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY = new InjectionToken<boolean>('DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY');\n\n/**\n * Helper that returns a {@link Provider} binding {@link DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY}.\n *\n * @param preserve - When `true`, descendant `<dbx-pdf-merge-editor-file-upload>` slots skip the destroy-time entry removal. Defaults to `true` because that is the value callers typically want when they bother to reach for the helper.\n * @returns Provider entry suitable for inclusion in `providers`.\n */\nexport function provideDbxPdfMergeEditorPreserveEntriesOnSlotDestroy(preserve: boolean = true): Provider {\n  return { provide: DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY, useValue: preserve };\n}\n","import { PDFDocument, PDFHexString, PDFName, PDFString, type PDFPage } from '@cantoo/pdf-lib';\nimport { JSON_MIME_TYPE, PDF_MIME_TYPE, type ISO8601DateString, type Maybe } from '@dereekb/util';\n\n/**\n * Name of the JSON manifest attached to a merged PDF that records which pages came from which slot.\n */\nexport const PDF_MERGE_SIDECAR_FILE_NAME = 'dbx-pdf-merge.json';\n\n/**\n * Key set on each output page's dictionary holding that page's {@link PdfMergeSidecarPage.tag}.\n *\n * Custom page-dictionary keys travel with the page: they survive `copyPages` (including subsetting and reordering), a save/load round trip, and further edits. That is what makes tags — rather than the manifest's recorded indices — the authoritative record of which document a page belongs to.\n */\nexport const PDF_MERGE_PAGE_TAG_KEY = 'DbxPageTag';\n\n/**\n * Schema version of the emitted {@link PdfMergeSidecar}.\n */\nexport const PDF_MERGE_SIDECAR_VERSION = 1;\n\n/**\n * Description recorded on the attached manifest.\n */\nexport const PDF_MERGE_SIDECAR_DESCRIPTION = 'dbx-pdf-merge page manifest';\n\n/**\n * Record of a single page in the merged output.\n */\nexport interface PdfMergeSidecarPage {\n  /**\n   * Identifier written onto the page's own dictionary. Unique within the output document.\n   */\n  readonly tag: string;\n  /**\n   * Slot the page's source file was uploaded into, or `null` when unslotted.\n   */\n  readonly slotId: Maybe<string>;\n  /**\n   * Name of the source file the page came from.\n   */\n  readonly sourceName: string;\n  /**\n   * Zero-based index of the page within its source document.\n   */\n  readonly sourceIndex: number;\n  /**\n   * Total rotation applied to the page in the output, in degrees.\n   */\n  readonly rotation: number;\n  /**\n   * Position of the page in the output at the time the manifest was written.\n   *\n   * A hint only. Anything that reorders the document afterwards leaves this stale, so {@link readPdfMergeSidecar} resolves positions from page tags and falls back to this value only when a tag is missing.\n   */\n  readonly outputIndex: number;\n}\n\n/**\n * One logical document within the merged output — in practice, one editor slot.\n */\nexport interface PdfMergeSidecarDocument {\n  /**\n   * Slot id, or `null` for the unslotted group.\n   */\n  readonly slotId: Maybe<string>;\n  /**\n   * Tags of the pages belonging to this document, in output order at write time. This membership list is authoritative and survives reordering; resolve each tag to a current page index rather than trusting positions.\n   */\n  readonly pageTags: readonly string[];\n}\n\n/**\n * Manifest embedded in a merged PDF describing which pages came from which document.\n */\nexport interface PdfMergeSidecar {\n  readonly version: number;\n  readonly createdAt: ISO8601DateString;\n  readonly documents: readonly PdfMergeSidecarDocument[];\n  readonly pages: readonly PdfMergeSidecarPage[];\n}\n\n/**\n * A manifest page resolved against the document actually being read.\n */\nexport interface PdfMergeSidecarResolvedPage extends PdfMergeSidecarPage {\n  /**\n   * Current zero-based index of the page in the document being read.\n   */\n  readonly pageIndex: number;\n  /**\n   * Whether {@link pageIndex} came from the page's own tag (`true`) or fell back to the manifest's recorded {@link PdfMergeSidecarPage.outputIndex} because the tag was missing (`false`). A `false` here means something stripped the page tags — treat the position as best-effort.\n   */\n  readonly resolvedByTag: boolean;\n}\n\n/**\n * A manifest document resolved against the document actually being read.\n */\nexport interface PdfMergeSidecarResolvedDocument {\n  readonly slotId: Maybe<string>;\n  readonly pages: readonly PdfMergeSidecarResolvedPage[];\n}\n\n/**\n * Result of reading a merged PDF's embedded manifest.\n */\nexport interface PdfMergeSidecarReadResult {\n  /**\n   * The manifest exactly as it was embedded.\n   */\n  readonly sidecar: PdfMergeSidecar;\n  /**\n   * Documents with each page resolved to its current index in the file that was read.\n   */\n  readonly documents: readonly PdfMergeSidecarResolvedDocument[];\n  /**\n   * Tags listed in the manifest that could not be resolved to any page — the page was removed after the manifest was written, or its tag was stripped and no fallback index was usable.\n   */\n  readonly missingTags: readonly string[];\n  /**\n   * Number of pages in the document that carry no tag. Non-zero means pages were added outside the merge editor, or a third-party tool dropped the tags.\n   */\n  readonly untaggedPageCount: number;\n}\n\n/**\n * Builds the tag written onto an output page.\n *\n * @param slotId - Slot the page's source entry belongs to, or `null` when unslotted.\n * @param ordinal - Zero-based position of the page within its own slot's pages.\n * @returns A tag unique within the output document.\n * @__NO_SIDE_EFFECTS__\n */\nexport function makePdfMergeSidecarPageTag(slotId: Maybe<string>, ordinal: number): string {\n  return `${slotId ?? '_'}-${ordinal}`;\n}\n\n/**\n * Writes a page's tag onto its page dictionary so the association survives later reordering.\n *\n * @param page - Page in the output document.\n * @param tag - Tag to record.\n */\nexport function writePdfMergePageTag(page: PDFPage, tag: string): void {\n  page.node.set(PDFName.of(PDF_MERGE_PAGE_TAG_KEY), PDFString.of(tag));\n}\n\n/**\n * Reads the tag previously written onto a page, if any.\n *\n * Uses `get` plus an instance check rather than a typed `lookup`, because `PDFDict.lookup(key, PDFString)` throws when the key is absent — which is the normal case for any PDF that did not come out of this editor.\n *\n * @param page - Page to inspect.\n * @returns The tag, or `null` when the page carries none.\n */\nexport function readPdfMergePageTag(page: PDFPage): Maybe<string> {\n  const value = page.node.get(PDFName.of(PDF_MERGE_PAGE_TAG_KEY));\n  let tag: Maybe<string>;\n\n  if (value instanceof PDFString || value instanceof PDFHexString) {\n    tag = value.decodeText();\n  } else {\n    tag = null;\n  }\n\n  return tag;\n}\n\n/**\n * Attaches a manifest to the output document as an embedded JSON file.\n *\n * @param document - Output document being saved.\n * @param sidecar - Manifest to embed.\n */\nexport async function attachPdfMergeSidecar(document: PDFDocument, sidecar: PdfMergeSidecar): Promise<void> {\n  // Re-wrap with this module's Uint8Array: pdf-lib validates its input with `instanceof`, and a\n  // TextEncoder supplied by another realm (Node's, under jsdom) produces an array that fails that\n  // check even though it is a genuine Uint8Array.\n  const bytes = new Uint8Array(new TextEncoder().encode(JSON.stringify(sidecar)));\n  await document.attach(bytes, PDF_MERGE_SIDECAR_FILE_NAME, {\n    mimeType: JSON_MIME_TYPE,\n    description: PDF_MERGE_SIDECAR_DESCRIPTION\n  });\n}\n\n/**\n * Builds a {@link PdfMergeSidecar} from the pages written to an output document.\n *\n * @param pages - Page records in output order.\n * @returns The manifest, with one document per distinct slot in first-appearance order.\n * @__NO_SIDE_EFFECTS__\n */\nexport function makePdfMergeSidecar(pages: readonly PdfMergeSidecarPage[]): PdfMergeSidecar {\n  const tagsBySlot = new Map<Maybe<string>, string[]>();\n\n  pages.forEach((page) => {\n    const existing = tagsBySlot.get(page.slotId);\n\n    if (existing == null) {\n      tagsBySlot.set(page.slotId, [page.tag]);\n    } else {\n      existing.push(page.tag);\n    }\n  });\n\n  const documents: PdfMergeSidecarDocument[] = Array.from(tagsBySlot.entries()).map(([slotId, pageTags]) => ({ slotId, pageTags }));\n\n  return {\n    version: PDF_MERGE_SIDECAR_VERSION,\n    createdAt: new Date().toISOString(),\n    documents,\n    pages\n  };\n}\n\n/**\n * Source bytes accepted by {@link readPdfMergeSidecar}.\n */\nexport type PdfMergeSidecarReadInput = Blob | ArrayBuffer | Uint8Array;\n\nasync function bytesForSidecarReadInput(input: PdfMergeSidecarReadInput): Promise<ArrayBuffer | Uint8Array> {\n  return input instanceof Blob ? input.arrayBuffer() : input;\n}\n\nfunction parseSidecarBytes(data: Uint8Array): Maybe<PdfMergeSidecar> {\n  let sidecar: Maybe<PdfMergeSidecar>;\n\n  try {\n    const parsed = JSON.parse(new TextDecoder().decode(data)) as PdfMergeSidecar;\n    sidecar = Array.isArray(parsed?.documents) && Array.isArray(parsed?.pages) ? parsed : null;\n  } catch {\n    sidecar = null;\n  }\n\n  return sidecar;\n}\n\n/**\n * Reads the manifest embedded in a merged PDF and resolves each recorded page to its current position in that file.\n *\n * Resolution prefers each page's own tag, which follows the page through reordering. The manifest's {@link PdfMergeSidecarPage.outputIndex} is used only as a fallback for pages whose tag has been stripped, and any index that no longer exists is reported through {@link PdfMergeSidecarReadResult.missingTags} instead.\n *\n * @param input - The merged PDF's bytes.\n * @returns The manifest and its resolved documents, or `null` when the file carries no manifest, is unreadable, or is encrypted.\n */\nexport async function readPdfMergeSidecar(input: PdfMergeSidecarReadInput): Promise<Maybe<PdfMergeSidecarReadResult>> {\n  let result: Maybe<PdfMergeSidecarReadResult>;\n\n  try {\n    const bytes = await bytesForSidecarReadInput(input);\n    const document = await PDFDocument.load(bytes);\n    result = resolvePdfMergeSidecar(document);\n  } catch {\n    result = null;\n  }\n\n  return result;\n}\n\n/**\n * Resolves the manifest of an already-loaded document. Split out from {@link readPdfMergeSidecar} so {@link splitPdfMergeSidecarDocuments} can reuse the resolution without parsing the same bytes twice.\n *\n * @param document - Loaded merged document.\n * @returns The resolved manifest, or `null` when the document carries none.\n */\nfunction resolvePdfMergeSidecar(document: PDFDocument): Maybe<PdfMergeSidecarReadResult> {\n  let result: Maybe<PdfMergeSidecarReadResult>;\n\n  {\n    const attachment = document.getAttachments().find((x) => x.name === PDF_MERGE_SIDECAR_FILE_NAME);\n    const sidecar = attachment == null ? null : parseSidecarBytes(attachment.data);\n\n    if (sidecar == null) {\n      result = null;\n    } else {\n      const pageCount = document.getPageCount();\n      const indexByTag = new Map<string, number>();\n      let untaggedPageCount = 0;\n\n      document.getPages().forEach((page, index) => {\n        const tag = readPdfMergePageTag(page);\n\n        if (tag == null) {\n          untaggedPageCount += 1;\n        } else {\n          indexByTag.set(tag, index);\n        }\n      });\n\n      const recordByTag = new Map(sidecar.pages.map((page) => [page.tag, page]));\n      const missingTags: string[] = [];\n\n      const documents = sidecar.documents.map((sidecarDocument) => {\n        const pages: PdfMergeSidecarResolvedPage[] = [];\n\n        sidecarDocument.pageTags.forEach((tag) => {\n          const record = recordByTag.get(tag);\n          const taggedIndex = indexByTag.get(tag);\n\n          if (record == null) {\n            missingTags.push(tag);\n          } else if (taggedIndex != null) {\n            pages.push({ ...record, pageIndex: taggedIndex, resolvedByTag: true });\n          } else if (record.outputIndex >= 0 && record.outputIndex < pageCount) {\n            pages.push({ ...record, pageIndex: record.outputIndex, resolvedByTag: false });\n          } else {\n            missingTags.push(tag);\n          }\n        });\n\n        return { slotId: sidecarDocument.slotId, pages };\n      });\n\n      result = { sidecar, documents, missingTags, untaggedPageCount };\n    }\n  }\n\n  return result;\n}\n\n/**\n * One logical document reconstructed out of a merged PDF as a standalone file.\n */\nexport interface PdfMergeSidecarDocumentFile {\n  /**\n   * Slot the document belongs to, or `null` for the unslotted group.\n   */\n  readonly slotId: Maybe<string>;\n  /**\n   * The document's pages extracted into their own PDF, in manifest order. Named after the source file recorded in the manifest so the original file name is restored.\n   */\n  readonly file: File;\n  readonly pageCount: number;\n}\n\n/**\n * Result of splitting a merged PDF back into its constituent documents.\n */\nexport interface SplitPdfMergeSidecarResult {\n  readonly sidecar: PdfMergeSidecar;\n  readonly documents: readonly PdfMergeSidecarDocumentFile[];\n  readonly missingTags: readonly string[];\n  readonly untaggedPageCount: number;\n}\n\n/**\n * Splits a previously-merged PDF back into one file per document, using the embedded manifest to decide which pages belong to which slot.\n *\n * This is the inverse of a merge with `sidecar: true`, and is what lets a completed document be re-imported into the editor with its slots repopulated instead of arriving as one opaque file. Page order and any rotation baked in at merge time are preserved, and each document's pages are resolved by tag so a document that was reordered after export still splits correctly.\n *\n * @param input - Bytes of a merged PDF.\n * @returns One file per document plus the manifest, or `null` when the input carries no manifest, is unreadable, or is encrypted.\n */\nexport async function splitPdfMergeSidecarDocuments(input: PdfMergeSidecarReadInput): Promise<Maybe<SplitPdfMergeSidecarResult>> {\n  let result: Maybe<SplitPdfMergeSidecarResult>;\n\n  try {\n    const bytes = await bytesForSidecarReadInput(input);\n    const source = await PDFDocument.load(bytes);\n    const read = resolvePdfMergeSidecar(source);\n\n    if (read == null) {\n      result = null;\n    } else {\n      const documents: PdfMergeSidecarDocumentFile[] = [];\n\n      for (const document of read.documents) {\n        if (document.pages.length > 0) {\n          const target = await PDFDocument.create();\n          const copied = await target.copyPages(\n            source,\n            document.pages.map((page) => page.pageIndex)\n          );\n\n          copied.forEach((page) => target.addPage(page));\n\n          const outputBytes = await target.save();\n          const name = document.pages[0].sourceName || `${document.slotId ?? 'document'}.pdf`;\n          const file = new File([outputBytes as BlobPart], name, { type: PDF_MIME_TYPE });\n\n          documents.push({ slotId: document.slotId, file, pageCount: document.pages.length });\n        }\n      }\n\n      result = { sidecar: read.sidecar, documents, missingTags: read.missingTags, untaggedPageCount: read.untaggedPageCount };\n    }\n  } catch {\n    result = null;\n  }\n\n  return result;\n}\n","import { degrees, PDFDocument } from '@cantoo/pdf-lib';\nimport {\n  JPEG_MIME_TYPE,\n  JPEG_MIME_TYPES,\n  makeValuesGroupMap,\n  mimeTypeForFileExtension,\n  PDF_ENCRYPT_MARKER,\n  PDF_EOF_MARKER,\n  PDF_HEADER,\n  PDF_MIME_TYPE,\n  PNG_MIME_TYPE,\n  sequentialIncrementingNumberStringModelIdFactory,\n  slashPathDetails,\n  type Building,\n  type FileSize,\n  type Maybe,\n  type MimeTypeWithoutParameters,\n  type ModelIdFactory\n} from '@dereekb/util';\nimport { makePdfMergePageId, PDF_MERGE_RESULT_MIME_TYPE, pdfMergePageGroupKeyForSlotId, type PdfMergeEntry, type PdfMergeEntryKind, type PdfMergeEntryOriginal, type PdfMergeEntryValidationResult, type PdfMergeEntryView, type PdfMergePageMeta, type PdfMergePageOverride, type PdfMergePageView } from './pdf.merge';\nimport { attachPdfMergeSidecar, makePdfMergeSidecar, makePdfMergeSidecarPageTag, splitPdfMergeSidecarDocuments, writePdfMergePageTag, type PdfMergeSidecar, type PdfMergeSidecarPage } from './pdf.merge.sidecar';\nimport { compressImageFile, type CompressImageDimensions, type DbxImageCompressionConfig, type ImageCompressionStatus } from '../image';\n\nconst FULL_ROTATION_DEGREES = 360;\n\nconst TEXT_DECODER = new TextDecoder('latin1');\n\nconst FORMAT_KILOBYTE = 1024;\nconst FORMAT_MEGABYTE = FORMAT_KILOBYTE * 1024;\n\n/**\n * Formats a byte count as a short human-readable string (`B` / `KB` / `MB`). Used by the merge editor banner and entry rows.\n *\n * @param size - Byte count to format.\n * @returns Human-readable string.\n * @__NO_SIDE_EFFECTS__\n */\nexport function formatPdfMergeEntrySize(size: FileSize): string {\n  let result: string;\n\n  if (size >= FORMAT_MEGABYTE) {\n    result = `${(size / FORMAT_MEGABYTE).toFixed(1)} MB`;\n  } else if (size >= FORMAT_KILOBYTE) {\n    result = `${(size / FORMAT_KILOBYTE).toFixed(1)} KB`;\n  } else {\n    result = `${size} B`;\n  }\n\n  return result;\n}\n\nconst DEFAULT_BLOB_FILE_NAMES: Readonly<Record<string, string>> = {\n  [PDF_MIME_TYPE]: 'document.pdf',\n  [PNG_MIME_TYPE]: 'image.png',\n  [JPEG_MIME_TYPE]: 'image.jpg'\n};\n\nconst DEFAULT_BLOB_FILE_NAME = DEFAULT_BLOB_FILE_NAMES[PDF_MIME_TYPE];\n\n/**\n * Normalizes a {@link Blob} into a {@link File} so it can become a {@link PdfMergeEntry}, which needs a name to display.\n *\n * A {@link File} passes through untouched unless an explicit `fileName` overrides it. A bare {@link Blob} is named from `fileName`, else from its MIME type (`document.pdf` / `image.png` / `image.jpg`), else `document.pdf` — the name only has to be plausible and correctly suffixed, since {@link classifyPdfMergeFile} falls back to the extension when a blob carries no type.\n *\n * @param input - Blob or File to normalize.\n * @param fileName - Optional name, overriding a File's own name and naming a bare Blob.\n * @returns A File carrying the resolved name.\n */\nexport function asPdfMergeFile(input: Blob | File, fileName?: Maybe<string>): File {\n  const mimeType = (input.type ?? '').toLowerCase();\n  let file: File;\n\n  if (input instanceof File && fileName == null) {\n    file = input;\n  } else {\n    const name = fileName ?? DEFAULT_BLOB_FILE_NAMES[mimeType] ?? DEFAULT_BLOB_FILE_NAME;\n    file = new File([input], name, { type: input.type || mimeTypeForFileExtension(slashPathDetails(name.toLowerCase()).typedFileExtension) || PDF_MIME_TYPE });\n  }\n\n  return file;\n}\n\n/**\n * Returns the {@link PdfMergeEntryKind} for a file based on its MIME type, with a small fallback to file-extension matching when the browser provided no MIME type.\n *\n * @param file - File picked from the upload component.\n * @returns The classified kind, or `null` if the file is not a supported PDF/PNG/JPEG.\n */\nexport function classifyPdfMergeFile(file: File): Maybe<PdfMergeEntryKind> {\n  const mimeType = (file.type ?? '').toLowerCase();\n  const lower = file.name.toLowerCase();\n  let kind: Maybe<PdfMergeEntryKind>;\n\n  if (mimeType === PDF_MIME_TYPE || lower.endsWith('.pdf')) {\n    kind = 'pdf';\n  } else if (mimeType === PNG_MIME_TYPE || JPEG_MIME_TYPES.includes(mimeType) || lower.endsWith('.png') || lower.endsWith('.jpg') || lower.endsWith('.jpeg')) {\n    kind = 'image';\n  } else {\n    kind = null;\n  }\n\n  return kind;\n}\n\n/**\n * Returns the resolved MIME type for a file, falling back to a kind-derived default when the browser supplied no `type`.\n *\n * @param file - File whose MIME type should be resolved.\n * @param kind - Classification used as the basis for fallback resolution.\n * @returns The MIME type string the merge editor should use for this file.\n */\nfunction resolvePdfMergeMimeType(file: File, kind: PdfMergeEntryKind): MimeTypeWithoutParameters {\n  let mimeType: MimeTypeWithoutParameters;\n\n  if (file.type) {\n    mimeType = file.type;\n  } else {\n    const { typedFileExtension } = slashPathDetails(file.name.toLowerCase());\n    mimeType = mimeTypeForFileExtension(typedFileExtension) ?? (kind === 'pdf' ? PDF_MIME_TYPE : JPEG_MIME_TYPE);\n  }\n\n  return mimeType;\n}\n\n/**\n * Default factory used to generate stable per-instance entry IDs.\n */\nconst DEFAULT_ENTRY_ID_FACTORY: ModelIdFactory = sequentialIncrementingNumberStringModelIdFactory();\n\n/**\n * Optional input for {@link buildPdfMergeEntry} / {@link buildPdfMergeEntrySync}.\n */\nexport interface BuildPdfMergeEntryConfig {\n  /**\n   * Optional slot identifier to attach to the entry. Used by the store to attribute the entry to a {@link DbxPdfMergeEditorFileUploadComponent} slot.\n   */\n  readonly slotId?: Maybe<string>;\n  /**\n   * Optional id factory override (used by tests for deterministic ids).\n   */\n  readonly idFactory?: ModelIdFactory;\n  /**\n   * Optional client-side image compression config to apply to image files before the entry is constructed. Ignored for PDFs.\n   */\n  readonly imageCompression?: Maybe<DbxImageCompressionConfig>;\n}\n\ninterface BuildEntryFromFileInput {\n  readonly file: File;\n  readonly kind: PdfMergeEntryKind;\n  readonly original: PdfMergeEntryOriginal;\n  readonly compression: ImageCompressionStatus;\n  readonly idFactory: ModelIdFactory;\n  readonly slotId: Maybe<string>;\n}\n\nfunction buildEntryFromFile(input: BuildEntryFromFileInput): PdfMergeEntry {\n  const { file, kind, original, compression, idFactory, slotId } = input;\n  const nextEntry = {\n    id: idFactory(),\n    file,\n    name: file.name,\n    mimeType: resolvePdfMergeMimeType(file, kind),\n    size: file.size,\n    kind,\n    status: 'validating' as const,\n    slotId,\n    original,\n    compression,\n    encrypted: false\n  };\n\n  (nextEntry as Building<PdfMergeEntry>).validation = validatePdfMergeEntry(nextEntry);\n  return nextEntry as PdfMergeEntry;\n}\n\nfunction originalFromFile(file: File, kind: PdfMergeEntryKind, dimensions?: Maybe<CompressImageDimensions>): PdfMergeEntryOriginal {\n  return {\n    name: file.name,\n    mimeType: resolvePdfMergeMimeType(file, kind),\n    size: file.size,\n    dimensions\n  };\n}\n\n/**\n * Builds a {@link PdfMergeEntry} synchronously from a user-provided file, classifying its kind and assigning a fresh id. Skips image compression — callers that need it must use the async {@link buildPdfMergeEntry}. Returns `null` for unsupported file types so the caller can drop them.\n *\n * @param file - File the user added.\n * @param config - Optional config for slot attribution and id factory override. `imageCompression` is ignored here.\n * @returns The new entry with `validating` status, or `null` when the file is not a supported PDF/PNG/JPEG.\n * @__NO_SIDE_EFFECTS__\n */\nexport function buildPdfMergeEntrySync(file: File, config?: Maybe<BuildPdfMergeEntryConfig>): Maybe<PdfMergeEntry> {\n  const kind = classifyPdfMergeFile(file);\n  const idFactory = config?.idFactory ?? DEFAULT_ENTRY_ID_FACTORY;\n  const slotId = config?.slotId;\n  let entry: Maybe<PdfMergeEntry>;\n\n  if (kind == null) {\n    entry = null;\n  } else {\n    const original = originalFromFile(file, kind);\n    entry = buildEntryFromFile({ file, kind, original, compression: 'unchanged', idFactory, slotId });\n  }\n\n  return entry;\n}\n\n/**\n * Builds a {@link PdfMergeEntry} from a user-provided file, classifying its kind and assigning a fresh id. For image files with an `imageCompression` config the source is downscaled and/or PNG→JPEG converted before the entry is constructed; the original file metadata is captured under {@link PdfMergeEntry.original} regardless. Returns `null` for unsupported file types so the caller can drop them.\n *\n * @param file - File the user added.\n * @param config - Optional config for slot attribution, id factory override, and image compression.\n * @returns The new entry with `validating` status, or `null` when the file is not a supported PDF/PNG/JPEG.\n */\nexport async function buildPdfMergeEntry(file: File, config?: Maybe<BuildPdfMergeEntryConfig>): Promise<Maybe<PdfMergeEntry>> {\n  const kind = classifyPdfMergeFile(file);\n  const idFactory = config?.idFactory ?? DEFAULT_ENTRY_ID_FACTORY;\n  const slotId = config?.slotId;\n  const imageCompression = config?.imageCompression;\n  let entry: Maybe<PdfMergeEntry>;\n\n  if (kind == null) {\n    entry = null;\n  } else if (kind === 'image' && imageCompression != null) {\n    const compressionResult = await compressImageFile(file, imageCompression);\n    const original = originalFromFile(file, kind, compressionResult.originalDimensions);\n    entry = buildEntryFromFile({ file: compressionResult.file, kind, original, compression: compressionResult.compression, idFactory, slotId });\n  } else {\n    const original = originalFromFile(file, kind);\n    entry = buildEntryFromFile({ file, kind, original, compression: 'unchanged', idFactory, slotId });\n  }\n\n  return entry;\n}\n\n/**\n * Lightly inspects a file's bytes to confirm the entry can participate in a merge. PDFs are checked for the standard `%PDF-` header and the `%%EOF` marker. Encrypted PDFs (presence of `/Encrypt`) are still reported as `ok: true` with `encrypted: true` so the editor can decide whether to focus, ignore, or reject the entry — see {@link DbxPdfMergeEncryptedHandling}. Images are accepted as-is — the actual decode happens during merge.\n *\n * @param entry - Entry to validate.\n * @returns Result indicating whether the entry can be merged, optional error message when validation fails, and whether the entry is encrypted.\n */\nexport async function validatePdfMergeEntry(entry: Omit<PdfMergeEntry, 'validation'>): Promise<PdfMergeEntryValidationResult> {\n  let result: PdfMergeEntryValidationResult;\n\n  if (entry.kind === 'image') {\n    if (entry.file.size <= 0) {\n      result = { ok: false, errorMessage: 'Image file is empty.' };\n    } else {\n      result = { ok: true };\n    }\n  } else {\n    try {\n      const buffer = await entry.file.arrayBuffer();\n      const text = TEXT_DECODER.decode(buffer);\n\n      if (!text.startsWith(PDF_HEADER) || !text.includes(PDF_EOF_MARKER)) {\n        result = { ok: false, errorMessage: 'File does not appear to be a valid PDF.' };\n      } else if (text.includes(PDF_ENCRYPT_MARKER)) {\n        result = { ok: true, encrypted: true };\n      } else {\n        result = { ok: true };\n      }\n    } catch (e) {\n      result = { ok: false, errorMessage: (e as Error)?.message ?? 'Failed to read PDF.' };\n    }\n  }\n\n  return result;\n}\n\n/**\n * Whether merging these entries will take the encrypted-passthrough branch of {@link mergePdfMergeEntries} — the only `ready` entry is a single encrypted PDF, so the merge emits its original bytes unchanged instead of assembling a document.\n *\n * Exported because the passthrough is not merely an implementation detail of the merge: `pdf-lib` cannot open an encrypted document at all, so such an entry can never be expanded into pages and the editor's page plan is necessarily empty for it. Anything that gates the merge on having pages has to consult this, or enabling page editing would silently block every encrypted document. Keeping the condition here is what keeps those gates aligned with what the merge actually does.\n *\n * @param entries - Entries about to be merged, already narrowed to the ones participating (ignored entries excluded).\n * @returns `true` when the merge will pass a single encrypted file through unchanged.\n * @__NO_SIDE_EFFECTS__\n */\nexport function pdfMergeEntriesUseEncryptedPassthrough(entries: readonly PdfMergeEntry[]): boolean {\n  const ready = entries.filter((entry) => entry.status === 'ready');\n  return ready.length === 1 && ready[0].encrypted === true;\n}\n\n/**\n * Normalizes an arbitrary degree value into the `[0, 360)` range.\n *\n * @param angle - Angle in degrees, possibly negative or over a full turn.\n * @returns The equivalent angle in `[0, 360)`.\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalizeRotationDegrees(angle: number): number {\n  return ((angle % FULL_ROTATION_DEGREES) + FULL_ROTATION_DEGREES) % FULL_ROTATION_DEGREES;\n}\n\n/**\n * Reads per-page metadata from an entry's source document so the editor can list its pages individually.\n *\n * Only called while page editing is enabled — the normal upload path never parses the document, it only scans for the PDF header and markers (see {@link validatePdfMergeEntry}).\n *\n * @param entry - Entry to inspect.\n * @returns One {@link PdfMergePageMeta} per source page, or `null` when the entry is encrypted or cannot be parsed. Image entries report a single synthetic page.\n */\nexport async function readPdfMergeEntryPageMetas(entry: PdfMergeEntry): Promise<Maybe<PdfMergePageMeta[]>> {\n  let metas: Maybe<PdfMergePageMeta[]>;\n\n  if (entry.encrypted) {\n    // pdf-lib cannot open an encrypted document at all, so its pages can never be listed or edited.\n    metas = null;\n  } else if (entry.kind === 'image') {\n    const dimensions = entry.original.dimensions;\n    metas = [{ sourceIndex: 0, width: dimensions?.width ?? 0, height: dimensions?.height ?? 0, sourceRotation: 0 }];\n  } else {\n    try {\n      const bytes = await entry.file.arrayBuffer();\n      const source = await PDFDocument.load(bytes);\n\n      metas = source.getPages().map((page, sourceIndex) => {\n        const { width, height } = page.getSize();\n        return { sourceIndex, width, height, sourceRotation: normalizeRotationDegrees(page.getRotation().angle) };\n      });\n    } catch {\n      metas = null;\n    }\n  }\n\n  return metas;\n}\n\n/**\n * Why a call to {@link buildPdfMergeEntriesFromSidecar} could not produce entries.\n *\n * - `unreadable` — the bytes are not a PDF this library can open (corrupt, or encrypted).\n * - `no_sidecar` — a readable PDF that carries no manifest, so there is nothing to attribute its pages to. This is the expected outcome for any PDF that did not come out of a merge with `sidecar: true`.\n * - `no_documents` — a manifest is present but resolved to no pages at all.\n */\nexport type PdfMergeSidecarImportErrorReason = 'unreadable' | 'no_sidecar' | 'no_documents';\n\n/**\n * Outcome of importing a previously-exported merged PDF.\n */\nexport interface PdfMergeSidecarImportResult {\n  /**\n   * Entries reconstructed from the file, one per document, each tagged with the slot recorded in the manifest.\n   */\n  readonly entries: readonly PdfMergeEntry[];\n  /**\n   * The manifest that was read, or `null` when the file carried none and was imported through the {@link BuildPdfMergeEntriesFromSidecarConfig.allowWithoutSidecar} fallback. Check {@link fromSidecar} rather than testing this for null when the distinction matters.\n   */\n  readonly sidecar: Maybe<PdfMergeSidecar>;\n  /**\n   * Whether the entries came from an embedded manifest (`true`) or from the whole-file fallback (`false`). Everything derived from a manifest — per-slot attribution, {@link missingTags}, {@link untaggedPageCount} — is meaningless when this is `false`.\n   */\n  readonly fromSidecar: boolean;\n  /**\n   * Slot ids present in the imported file, in manifest order. `null` represents the unslotted group.\n   */\n  readonly slotIds: readonly Maybe<string>[];\n  /**\n   * Manifest tags that no longer resolve to a page — pages removed from the file after it was exported.\n   */\n  readonly missingTags: readonly string[];\n  /**\n   * Pages in the file carrying no tag, i.e. added outside the editor after export.\n   */\n  readonly untaggedPageCount: number;\n}\n\n/**\n * Config for {@link buildPdfMergeEntriesFromSidecar}.\n */\nexport interface BuildPdfMergeEntriesFromSidecarConfig extends BuildPdfMergeEntryConfig {\n  /**\n   * When `true`, a readable PDF carrying no manifest is imported as a single unslotted entry instead of failing with `no_sidecar`. Defaults to `false`.\n   *\n   * Intended for documents stored before the manifest existed: loading one as a whole still lets the user page-edit it (rotate or drop a bad page) rather than being turned away. It cannot recover per-slot attribution — there is nothing recorded to attribute.\n   */\n  readonly allowWithoutSidecar?: Maybe<boolean>;\n  /**\n   * File name given to the entry built by the {@link allowWithoutSidecar} fallback when `input` is a bare {@link Blob}. Ignored when `input` is a {@link File} (its own name wins) or when a manifest is present.\n   */\n  readonly fileName?: Maybe<string>;\n}\n\n/**\n * Reconstructs editor entries from a PDF previously exported with an embedded manifest.\n *\n * Each document recorded in the manifest becomes one entry carrying its original slot id, so dropping the result into the store repopulates the same slots the file was built from. This is the re-import half of the sidecar: without it a completed document can only come back as a single opaque file.\n *\n * @param input - Bytes of a merged PDF, typically the file the user just chose.\n * @param config - Optional entry-building config (id factory override, and the sidecar-less fallback).\n * @returns The reconstructed entries and manifest, or a reason when the file cannot be imported.\n */\nexport async function buildPdfMergeEntriesFromSidecar(input: Blob, config?: Maybe<BuildPdfMergeEntriesFromSidecarConfig>): Promise<PdfMergeSidecarImportResult | { readonly error: PdfMergeSidecarImportErrorReason }> {\n  const split = await splitPdfMergeSidecarDocuments(input);\n  let result: PdfMergeSidecarImportResult | { readonly error: PdfMergeSidecarImportErrorReason };\n\n  if (split == null) {\n    // A readable PDF without a manifest and an unreadable one are distinguished so the UI can\n    // explain the difference — \"not exported from here\" reads very differently from \"corrupt\".\n    const readable = await isReadablePdf(input);\n\n    if (!readable) {\n      result = { error: 'unreadable' };\n    } else if (config?.allowWithoutSidecar) {\n      // No manifest to attribute pages with, so the whole file becomes one unslotted entry. An\n      // `unreadable` file never reaches here — the fallback widens which readable PDFs are\n      // accepted, it does not accept broken ones.\n      const entry = buildPdfMergeEntrySync(asPdfMergeFile(input, config?.fileName), { ...config, slotId: null });\n      result = entry == null ? { error: 'unreadable' } : { entries: [entry], sidecar: null, fromSidecar: false, slotIds: [null], missingTags: [], untaggedPageCount: 0 };\n    } else {\n      result = { error: 'no_sidecar' };\n    }\n  } else if (split.documents.length === 0) {\n    result = { error: 'no_documents' };\n  } else {\n    const entries = split.documents.map((document) => buildPdfMergeEntrySync(document.file, { ...config, slotId: document.slotId })).filter((entry): entry is PdfMergeEntry => entry != null);\n\n    result = {\n      entries,\n      sidecar: split.sidecar,\n      fromSidecar: true,\n      slotIds: split.documents.map((document) => document.slotId),\n      missingTags: split.missingTags,\n      untaggedPageCount: split.untaggedPageCount\n    };\n  }\n\n  return result;\n}\n\nasync function isReadablePdf(input: Blob): Promise<boolean> {\n  let readable: boolean;\n\n  try {\n    await PDFDocument.load(await input.arrayBuffer());\n    readable = true;\n  } catch {\n    readable = false;\n  }\n\n  return readable;\n}\n\n/**\n * Input for {@link buildPdfMergePagePlan}.\n */\nexport interface BuildPdfMergePagePlanInput {\n  /**\n   * Current entries, already projected by the store's encryption handling. Only `ready`, non-`ignored` entries contribute pages.\n   */\n  readonly entries: readonly PdfMergeEntryView[];\n  /**\n   * Hydrated page metadata keyed by entry id. A `null` value means the entry could not be expanded (encrypted, or unparseable) and contributes no pages.\n   */\n  readonly pageMetas: Record<string, Maybe<PdfMergePageMeta[]>>;\n  /**\n   * Sparse per-page edits keyed by page id.\n   */\n  readonly pageOverrides: Record<string, PdfMergePageOverride>;\n  /**\n   * Stored page ordering per group key.\n   */\n  readonly pageOrder: Record<string, string[]>;\n}\n\nfunction applyPdfMergePageGroupOrder(natural: readonly PdfMergePageView[], orderedIds: Maybe<readonly string[]>): PdfMergePageView[] {\n  let ordered: PdfMergePageView[];\n\n  if (orderedIds == null || orderedIds.length === 0) {\n    ordered = [...natural];\n  } else {\n    const byId = new Map(natural.map((page) => [page.id, page]));\n    const taken = new Set<string>();\n    const result: PdfMergePageView[] = [];\n\n    // Stored ids that still resolve keep their stored order; anything else is ignored.\n    orderedIds.forEach((id) => {\n      const page = byId.get(id);\n\n      if (page != null && !taken.has(id)) {\n        result.push(page);\n        taken.add(id);\n      }\n    });\n\n    // Pages the stored order does not mention are new since it was written — append them in natural order.\n    natural.forEach((page) => {\n      if (!taken.has(page.id)) {\n        result.push(page);\n      }\n    });\n\n    ordered = result;\n  }\n\n  return ordered;\n}\n\n/**\n * Builds the editor's page plan from the current entries plus the user's sparse edits.\n *\n * The result is self-healing: stored ordering ids that no longer resolve are dropped, pages the stored ordering does not mention are appended in natural order, and overrides for departed pages are ignored. That means entries can be added and removed without any page-level bookkeeping.\n *\n * Entries whose metadata is `null` contribute no pages — they are encrypted (which `pdf-lib` cannot open) or unparseable. Callers should surface those separately rather than letting them disappear silently.\n *\n * @param input - Entries, hydrated metadata, and the stored edits.\n * @returns The ordered page plan across every group.\n * @__NO_SIDE_EFFECTS__\n */\nexport function buildPdfMergePagePlan(input: BuildPdfMergePagePlanInput): PdfMergePageView[] {\n  const { entries, pageMetas, pageOverrides, pageOrder } = input;\n  const eligible = entries.filter((entry) => entry.status === 'ready' && !entry.ignored && pageMetas[entry.id] != null);\n  const groups = makeValuesGroupMap(eligible, (entry) => pdfMergePageGroupKeyForSlotId(entry.slotId));\n  const plan: PdfMergePageView[] = [];\n\n  groups.forEach((groupEntries, groupKey) => {\n    const natural: PdfMergePageView[] = [];\n\n    groupEntries.forEach((entry) => {\n      const metas = pageMetas[entry.id] as PdfMergePageMeta[];\n\n      metas.forEach((meta) => {\n        const id = makePdfMergePageId(entry.id, meta.sourceIndex);\n        const override = pageOverrides[id];\n\n        natural.push({\n          id,\n          entryId: entry.id,\n          slotId: entry.slotId ?? null,\n          groupKey: groupKey as string,\n          sourceName: entry.name,\n          kind: entry.kind,\n          sourceIndex: meta.sourceIndex,\n          sourcePageCount: metas.length,\n          meta,\n          rotation: override?.rotation ?? 0,\n          removed: override?.removed ?? false\n        });\n      });\n    });\n\n    applyPdfMergePageGroupOrder(natural, pageOrder[groupKey as string]).forEach((page) => plan.push(page));\n  });\n\n  return plan;\n}\n\n/**\n * One page appended to the output, paired with where it came from. Positionally aligned with the output document's pages, so the sidecar writer can tag them without a second lookup.\n */\ninterface AppendedPageRecord {\n  readonly entry: PdfMergeEntry;\n  readonly sourceIndex: number;\n  readonly rotation: number;\n}\n\n/**\n * Resolves an entry to its parsed source document, caching per merge.\n */\ntype PdfSourceDocumentLoader = (entry: PdfMergeEntry) => Promise<PDFDocument>;\n\n/**\n * Returns a loader that parses each entry's source document at most once per merge. A page plan routinely pulls several non-adjacent pages from the same file, so without this the same bytes would be parsed repeatedly.\n *\n * @returns Loader that resolves an entry to its parsed source document.\n */\nfunction makePdfSourceDocumentLoader(): PdfSourceDocumentLoader {\n  const cache = new Map<string, Promise<PDFDocument>>();\n\n  return (entry: PdfMergeEntry) => {\n    let loaded = cache.get(entry.id);\n\n    if (loaded == null) {\n      loaded = entry.file.arrayBuffer().then((bytes) => PDFDocument.load(bytes));\n      cache.set(entry.id, loaded);\n    }\n\n    return loaded;\n  };\n}\n\nasync function appendImagePage(target: PDFDocument, entry: PdfMergeEntry, rotation: number): Promise<AppendedPageRecord> {\n  const bytes = await entry.file.arrayBuffer();\n  const isPng = entry.mimeType === PNG_MIME_TYPE || entry.name.toLowerCase().endsWith('.png');\n  const image = isPng ? await target.embedPng(bytes) : await target.embedJpg(bytes);\n  const page = target.addPage([image.width, image.height]);\n  page.drawImage(image, { x: 0, y: 0, width: image.width, height: image.height });\n\n  if (rotation !== 0) {\n    page.setRotation(degrees(rotation));\n  }\n\n  return { entry, sourceIndex: 0, rotation };\n}\n\n/**\n * Shared input for the two page-appending strategies.\n */\ninterface AppendPagesInput {\n  /**\n   * Document being assembled.\n   */\n  readonly target: PDFDocument;\n  /**\n   * Ready entries participating in the merge.\n   */\n  readonly entries: readonly PdfMergeEntry[];\n  /**\n   * Per-merge cached source document loader.\n   */\n  readonly loadSource: PdfSourceDocumentLoader;\n}\n\n/**\n * Input for {@link appendPlannedPages}.\n */\ninterface AppendPlannedPagesInput extends AppendPagesInput {\n  /**\n   * Ordered page plan driving the output.\n   */\n  readonly plan: readonly PdfMergePageView[];\n}\n\n/**\n * Appends every page of every entry, in entry order — the behavior used when no page plan is supplied.\n *\n * @param input - Target document, entries, and source loader.\n * @returns One record per appended page, aligned with the target's pages.\n */\nasync function appendAllEntryPages(input: AppendPagesInput): Promise<AppendedPageRecord[]> {\n  const { target, entries, loadSource } = input;\n  const records: AppendedPageRecord[] = [];\n\n  for (const entry of entries) {\n    if (entry.kind === 'pdf') {\n      const source = await loadSource(entry);\n      const indices = source.getPageIndices();\n      const copied = await target.copyPages(source, indices);\n\n      copied.forEach((page, index) => {\n        target.addPage(page);\n        records.push({ entry, sourceIndex: indices[index], rotation: normalizeRotationDegrees(page.getRotation().angle) });\n      });\n    } else {\n      records.push(await appendImagePage(target, entry, 0));\n    }\n  }\n\n  return records;\n}\n\n/**\n * Appends pages according to an explicit plan — honoring subsetting, reordering, and per-page rotation.\n *\n * Consecutive pages from the same entry are batched into a single `copyPages` call. `copyPages` returns pages in the order of the indices it is given, which is what lets subsetting and reordering happen in one operation.\n *\n * @param input - Target document, entries, page plan, and source loader.\n * @returns One record per appended page, aligned with the target's pages.\n */\nasync function appendPlannedPages(input: AppendPlannedPagesInput): Promise<AppendedPageRecord[]> {\n  const { target, entries, plan, loadSource } = input;\n  const entriesById = new Map(entries.map((entry) => [entry.id, entry]));\n  const visible = plan.filter((page) => !page.removed && entriesById.has(page.entryId));\n  const records: AppendedPageRecord[] = [];\n  let index = 0;\n\n  while (index < visible.length) {\n    const first = visible[index];\n    const entry = entriesById.get(first.entryId) as PdfMergeEntry;\n    let end = index + 1;\n\n    while (end < visible.length && visible[end].entryId === first.entryId) {\n      end += 1;\n    }\n\n    const run = visible.slice(index, end);\n\n    if (entry.kind === 'image') {\n      for (const planned of run) {\n        records.push(await appendImagePage(target, entry, normalizeRotationDegrees(planned.rotation)));\n      }\n    } else {\n      const source = await loadSource(entry);\n      const copied = await target.copyPages(\n        source,\n        run.map((planned) => planned.sourceIndex)\n      );\n\n      copied.forEach((page, runIndex) => {\n        const planned = run[runIndex];\n        // Compose rather than replace: a scan already stored at 90° that the user rotates by 90° must land at 180°.\n        const rotation = normalizeRotationDegrees(planned.meta.sourceRotation + planned.rotation);\n\n        target.addPage(page);\n        page.setRotation(degrees(rotation));\n        records.push({ entry, sourceIndex: planned.sourceIndex, rotation });\n      });\n    }\n\n    index = end;\n  }\n\n  return records;\n}\n\n/**\n * Tags each output page and attaches the manifest describing which pages belong to which slot.\n *\n * @param target - Document being assembled, whose pages align with `records`.\n * @param records - One record per appended page, in output order.\n */\nasync function writePdfMergeSidecarForRecords(target: PDFDocument, records: readonly AppendedPageRecord[]): Promise<void> {\n  const ordinalBySlotKey = new Map<string, number>();\n  const outputPages = target.getPages();\n\n  const sidecarPages: PdfMergeSidecarPage[] = records.map((record, outputIndex) => {\n    // Normalize to null so the value survives JSON.stringify, which drops undefined.\n    const slotId = record.entry.slotId ?? null;\n    const slotKey = slotId ?? '';\n    const ordinal = ordinalBySlotKey.get(slotKey) ?? 0;\n    const tag = makePdfMergeSidecarPageTag(slotId, ordinal);\n\n    ordinalBySlotKey.set(slotKey, ordinal + 1);\n    writePdfMergePageTag(outputPages[outputIndex], tag);\n\n    return { tag, slotId, sourceName: record.entry.name, sourceIndex: record.sourceIndex, rotation: record.rotation, outputIndex };\n  });\n\n  await attachPdfMergeSidecar(target, makePdfMergeSidecar(sidecarPages));\n}\n\n/**\n * Options for {@link mergePdfMergeEntries}. Both are optional, and omitting them reproduces the original every-page-of-every-entry merge byte for byte.\n */\nexport interface MergePdfMergeEntriesOptions {\n  /**\n   * Explicit page plan driving the output. When supplied, only the plan's non-removed pages are emitted, in plan order, with each page's rotation composed onto its source rotation. When omitted, every page of every entry is emitted in entry order.\n   */\n  readonly pages?: Maybe<readonly PdfMergePageView[]>;\n  /**\n   * Whether to tag each output page and embed a manifest recording which pages came from which slot. See `readPdfMergeSidecar`.\n   */\n  readonly sidecar?: Maybe<boolean>;\n}\n\n/**\n * Merges every `ready` entry in the provided array order into a single PDF and returns it as a `Blob`. PDF entries contribute their full set of pages in order; image entries contribute one page sized to the image.\n *\n * Supplying {@link MergePdfMergeEntriesOptions.pages} replaces that default with an explicit page plan, so pages can be subsetted, reordered, and rotated. Supplying {@link MergePdfMergeEntriesOptions.sidecar} additionally embeds a manifest of which pages came from which slot.\n *\n * Special case: when the only `ready` entry is a single encrypted PDF, returns a passthrough `Blob` of its original bytes — `pdf-lib` cannot read encrypted PDFs even with `ignoreEncryption: true`, and downstream upload flows still need a usable blob. Neither the page plan nor the sidecar applies on that path, since the document cannot be opened.\n *\n * Throws if no `ready` entries are provided, if multiple encrypted entries are passed in (the editor only routes here under focus mode where it has narrowed to one), or if the page plan leaves no pages to emit.\n *\n * @param entries - Ordered entries to merge.\n * @param options - Optional page plan and sidecar switch.\n * @returns A Blob with `application/pdf` MIME type.\n */\nexport async function mergePdfMergeEntries(entries: readonly PdfMergeEntry[], options?: Maybe<MergePdfMergeEntriesOptions>): Promise<Blob> {\n  const ready = entries.filter((entry) => entry.status === 'ready');\n  let result: Blob;\n\n  if (ready.length === 0) {\n    throw new Error('No ready entries to merge.');\n  } else if (pdfMergeEntriesUseEncryptedPassthrough(ready)) {\n    const bytes = await ready[0].file.arrayBuffer();\n    result = new Blob([bytes], { type: PDF_MERGE_RESULT_MIME_TYPE });\n  } else if (ready.some((entry) => entry.encrypted)) {\n    throw new Error('Encrypted PDFs cannot be merged with other files.');\n  } else {\n    const target = await PDFDocument.create();\n    const loadSource = makePdfSourceDocumentLoader();\n    const plan = options?.pages;\n    const records = plan == null ? await appendAllEntryPages({ target, entries: ready, loadSource }) : await appendPlannedPages({ target, entries: ready, plan, loadSource });\n\n    if (records.length === 0) {\n      throw new Error('No pages to merge.');\n    }\n\n    if (options?.sidecar) {\n      await writePdfMergeSidecarForRecords(target, records);\n    }\n\n    const bytes = await target.save();\n    result = new Blob([bytes as BlobPart], { type: PDF_MERGE_RESULT_MIME_TYPE });\n  }\n\n  return result;\n}\n","import { Injectable } from '@angular/core';\nimport { moveItemInArray } from '@angular/cdk/drag-drop';\nimport { ComponentStore } from '@ngrx/component-store';\nimport { BehaviorSubject, catchError, combineLatest, defaultIfEmpty, distinctUntilChanged, from, map, type Observable, of, shareReplay, startWith, switchMap } from 'rxjs';\nimport { makeValuesGroupMap, type Building, type FileSize, type Maybe } from '@dereekb/util';\nimport {\n  DBX_PDF_MERGE_ENCRYPTED_ERROR_MESSAGE,\n  DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING,\n  DEFAULT_DBX_PDF_MERGE_PAGE_EDITING,\n  DEFAULT_DBX_PDF_MERGE_SIDECAR,\n  entryIdForPdfMergePageId,\n  pdfMergePageGroupKeyForSlotId,\n  type DbxPdfMergeEditorValidator,\n  type DbxPdfMergeEncryptedHandling,\n  type PdfMergeEditorState,\n  type PdfMergeEntry,\n  type PdfMergeEntryMove,\n  type PdfMergeEntryStatus,\n  type PdfMergeEntryView,\n  type PdfMergePageGroup,\n  type PdfMergePageMeta,\n  type PdfMergePageMove,\n  type PdfMergePageRemovedChange,\n  type PdfMergePageRotationChange,\n  type PdfMergePageView\n} from './pdf.merge';\nimport {\n  asPdfMergeFile,\n  buildPdfMergeEntriesFromSidecar,\n  buildPdfMergeEntry,\n  buildPdfMergeEntrySync,\n  buildPdfMergePagePlan,\n  mergePdfMergeEntries,\n  pdfMergeEntriesUseEncryptedPassthrough,\n  readPdfMergeEntryPageMetas,\n  type BuildPdfMergeEntriesFromSidecarConfig,\n  type PdfMergeSidecarImportErrorReason,\n  type PdfMergeSidecarImportResult\n} from './pdf.merge.utility';\nimport { type DbxImageCompressionConfig } from '../image';\nimport { filterMaybe } from '@dereekb/rxjs';\n\n/**\n * Initial state used by {@link DbxPdfMergeEditorStore} — no entries and no page edits.\n */\nexport const DBX_PDF_MERGE_EDITOR_INITIAL_STATE: PdfMergeEditorState = {\n  rawEntries: [],\n  pageOverrides: {},\n  pageOrder: {}\n};\n\n/**\n * Drops page overrides and stored orderings that belong to entries no longer in the list.\n *\n * The derived plan already ignores stale ids, so this is hygiene rather than correctness — it keeps the two records from growing without bound as the user adds and removes files.\n *\n * @param state - Current state.\n * @param liveEntryIds - Ids of the entries that remain.\n * @returns The pruned page-state slice.\n * @__NO_SIDE_EFFECTS__\n */\nfunction prunePdfMergePageState(state: PdfMergeEditorState, liveEntryIds: Set<string>): Pick<PdfMergeEditorState, 'pageOverrides' | 'pageOrder'> {\n  const pageOverrides: Record<string, PdfMergeEditorState['pageOverrides'][string]> = {};\n  const pageOrder: Record<string, string[]> = {};\n\n  Object.entries(state.pageOverrides).forEach(([pageId, override]) => {\n    if (liveEntryIds.has(entryIdForPdfMergePageId(pageId))) {\n      pageOverrides[pageId] = override;\n    }\n  });\n\n  Object.entries(state.pageOrder).forEach(([groupKey, pageIds]) => {\n    const kept = pageIds.filter((pageId) => liveEntryIds.has(entryIdForPdfMergePageId(pageId)));\n\n    if (kept.length > 0) {\n      pageOrder[groupKey] = kept;\n    }\n  });\n\n  return { pageOverrides, pageOrder };\n}\n\n/**\n * Why a store-level import failed. Extends the parse-level reasons from {@link buildPdfMergeEntriesFromSidecar} with the store's own slot check.\n *\n * - `unexpected_slots` — the file's manifest names a section the caller said this editor does not have. The offending ids are on {@link DbxPdfMergeEditorImportState.unexpectedSlotIds}.\n */\nexport type DbxPdfMergeEditorImportErrorReason = PdfMergeSidecarImportErrorReason | 'unexpected_slots';\n\n/**\n * Result of a successful store-level import — the sidecar result plus what the caller's expectation did not cover.\n */\nexport interface DbxPdfMergeEditorImportResult extends PdfMergeSidecarImportResult {\n  /**\n   * Expected sections the imported file did not fill. Always empty when no `expectedSlotIds` was supplied. A non-empty list is informational, not a failure — the import still replaced the store's entries.\n   */\n  readonly missingSlotIds: readonly string[];\n}\n\n/**\n * Who initiated an import.\n *\n * - `programmatic` — app code called {@link DbxPdfMergeEditorStore.importMergedPdf} directly, or a blob was bound to `[source]` on {@link DbxPdfMergeEditorStoreDirective}. This is the editor's *baseline*: the document the surrounding app decided the editor should be showing.\n * - `user` — the person picked a file through {@link DbxPdfMergeImportComponent}. Discardable; the baseline is not.\n *\n * The distinction exists for {@link DbxPdfMergeEditorStore.clearEntries}: emptying a programmatically-supplied editor would leave it in a state the app never asked for and cannot easily detect, so a clear restores the baseline instead of destroying it.\n */\nexport type DbxPdfMergeEditorImportOrigin = 'programmatic' | 'user';\n\n/**\n * Lifecycle of the most recent {@link DbxPdfMergeEditorStore.importMergedPdf} call, exposed via {@link DbxPdfMergeEditorStore.importState$}.\n */\nexport interface DbxPdfMergeEditorImportState {\n  readonly status: 'importing' | 'imported' | 'failed';\n  /**\n   * Who initiated this import. See {@link DbxPdfMergeEditorImportOrigin}.\n   */\n  readonly origin: DbxPdfMergeEditorImportOrigin;\n  /**\n   * Present with status `imported`.\n   */\n  readonly result?: Maybe<DbxPdfMergeEditorImportResult>;\n  /**\n   * Present with status `failed`.\n   */\n  readonly error?: Maybe<DbxPdfMergeEditorImportErrorReason>;\n  /**\n   * Sections the file named that the caller's `expectedSlotIds` did not allow. Present with error `unexpected_slots`; `null` entries represent unsectioned documents.\n   */\n  readonly unexpectedSlotIds?: readonly Maybe<string>[];\n}\n\n/**\n * Input for {@link DbxPdfMergeEditorStore.importMergedPdf}.\n */\nexport interface DbxPdfMergeEditorImportMergedPdfInput {\n  /**\n   * Bytes of a merged PDF previously exported from the editor.\n   */\n  readonly source: Blob;\n  /**\n   * Sections the file is allowed to name. **Omit to skip the check entirely** — the default for a programmatic import.\n   *\n   * The check is opt-in here rather than derived from {@link DbxPdfMergeEditorStore.registeredSlotIds$} because a programmatic import routinely runs before any slot exists (a store mounted on an `<ng-container>` whose editor only opens later in a dialog), where the registry is legitimately empty. Entries land in the store regardless and slots pick them up on mount, so importing early is safe; it is the caller who knows whether the document is trusted. {@link DbxPdfMergeImportComponent} passes its own resolved list, preserving the picker's behavior.\n   */\n  readonly expectedSlotIds?: Maybe<readonly string[]>;\n  /**\n   * When `true`, a readable PDF with no manifest is imported as one unslotted entry rather than failing with `no_sidecar`. Defaults to `false`. See {@link BuildPdfMergeEntriesFromSidecarConfig.allowWithoutSidecar}.\n   */\n  readonly allowWithoutSidecar?: Maybe<boolean>;\n  /**\n   * File name for the entry built by the `allowWithoutSidecar` fallback when `source` is a bare {@link Blob}.\n   */\n  readonly fileName?: Maybe<string>;\n  /**\n   * Who initiated this import. Defaults to `programmatic` — the picker passes `user` explicitly, so any other caller is app code by construction.\n   *\n   * A successful `programmatic` import becomes the editor's restore point for {@link DbxPdfMergeEditorStore.clearEntries}.\n   */\n  readonly origin?: Maybe<DbxPdfMergeEditorImportOrigin>;\n}\n\n/**\n * Input for {@link DbxPdfMergeEditorStore.clearEntries}.\n */\nexport interface DbxPdfMergeEditorClearEntriesInput {\n  /**\n   * Whether a programmatic import is restored rather than discarded. Defaults to `true`.\n   *\n   * Bind `false` for an editor whose clear really should empty everything, baseline included.\n   */\n  readonly restoreImport?: Maybe<boolean>;\n}\n\n/**\n * Outcome of {@link DbxPdfMergeEditorStore.clearEntries}.\n */\nexport interface DbxPdfMergeEditorClearEntriesResult {\n  /**\n   * Whether the editor was reset to its programmatic baseline (`true`) or emptied (`false`).\n   */\n  readonly restored: boolean;\n  /**\n   * Terminal state of the restoring re-import. Only present when a restore was attempted.\n   */\n  readonly importState?: Maybe<DbxPdfMergeEditorImportState>;\n}\n\n/**\n * Input for {@link DbxPdfMergeEditorStore.addFileToSlot}.\n */\nexport interface DbxPdfMergeEditorAddFileToSlotInput {\n  /**\n   * The document to add. A bare {@link Blob} is named via {@link fileName}.\n   */\n  readonly file: Blob | File;\n  /**\n   * Slot to attribute the entry to. Omit for an unslotted entry.\n   */\n  readonly slotId?: Maybe<string>;\n  /**\n   * Name for a bare {@link Blob}, or an override for a {@link File}'s own name.\n   */\n  readonly fileName?: Maybe<string>;\n  /**\n   * Image-compression override. Defaults to the store-level config set via {@link DbxPdfMergeEditorStore.setImageCompression}, matching what a slot uploader would apply to the same file.\n   */\n  readonly imageCompression?: Maybe<DbxImageCompressionConfig>;\n}\n\n/**\n * Input accepted by {@link DbxPdfMergeEditorStore.addFiles}: either a bare list of files (treated as unscoped, synchronously wrapped into entries) or `{ files, slotId }` to attribute the new entries to a slot. Callers that need client-side compression should construct entries via the async `buildPdfMergeEntry` and pass `{ entries }` instead.\n */\nexport type DbxPdfMergeEditorAddFilesInput =\n  | readonly File[]\n  | {\n      readonly files: readonly File[];\n      readonly slotId?: Maybe<string>;\n    }\n  | {\n      readonly entries: readonly PdfMergeEntry[];\n    };\n\n/**\n * Component-scoped {@link ComponentStore} that owns the list of files staged for merging in the PDF merge editor. Each {@link PdfMergeEntry} carries its own validation promise from the moment it is built; {@link entries$} composes those promises into a live stream — emitting the entry first in `validating` state and then again as each promise resolves to `ready` or `error`. {@link mergeOutput$} emits the merged PDF blob once every entry has finished validating, at least one is `ready`, and the registered validator delegate (if any) reports `true`.\n */\n@Injectable()\nexport class DbxPdfMergeEditorStore extends ComponentStore<PdfMergeEditorState> {\n  private readonly _validator$ = new BehaviorSubject<Maybe<DbxPdfMergeEditorValidator>>(undefined);\n  private readonly _outputSizeLimit$ = new BehaviorSubject<Maybe<FileSize>>(undefined);\n  private readonly _imageCompression$ = new BehaviorSubject<Maybe<DbxImageCompressionConfig>>(undefined);\n  private readonly _encryptedHandling$ = new BehaviorSubject<Maybe<DbxPdfMergeEncryptedHandling>>(undefined);\n  private readonly _pageEditing$ = new BehaviorSubject<Maybe<boolean>>(undefined);\n  private readonly _sidecar$ = new BehaviorSubject<Maybe<boolean>>(undefined);\n  /**\n   * Per-entry page metadata, parsed at most once per entry. Keyed by entry id; a resolved `null` means the entry could not be expanded. Only populated while page editing is enabled.\n   */\n  private readonly _pageMetaCache = new Map<string, Promise<Maybe<PdfMergePageMeta[]>>>();\n  /**\n   * Mount count per registered slot id. See {@link registerSlotId} for why this is a count rather than a set.\n   */\n  private readonly _slotIdCounts = new Map<string, number>();\n  private readonly _registeredSlotIds$ = new BehaviorSubject<readonly string[]>([]);\n  private readonly _importState$ = new BehaviorSubject<Maybe<DbxPdfMergeEditorImportState>>(undefined);\n  /**\n   * Input of the most recent successful `programmatic` import, replayed by {@link clearEntries} to reset the editor to the document the app supplied. `null` until one succeeds; a user's pick never overwrites it.\n   */\n  private _restorableImport: Maybe<DbxPdfMergeEditorImportMergedPdfInput>;\n\n  constructor() {\n    super(DBX_PDF_MERGE_EDITOR_INITIAL_STATE);\n  }\n\n  // MARK: Selectors\n  /**\n   * Live entry list. Each raw entry's {@link PdfMergeEntry.validation} promise is mapped onto its status: while pending, the entry is emitted with status `validating`; once resolved, the entry is mutated to `ready`/`error` and re-emitted. Subsequent emissions of the underlying state pass already-resolved entries through unchanged.\n   */\n  readonly entries$: Observable<PdfMergeEntry[]> = this.select((state) => state.rawEntries).pipe(\n    switchMap((rawEntries) =>\n      combineLatest(\n        rawEntries.map((entry) => {\n          let entry$: Observable<PdfMergeEntry>;\n\n          if (entry.status === 'validating') {\n            entry$ = from(entry.validation).pipe(\n              map((validationResult) => {\n                let status: PdfMergeEntryStatus;\n\n                if (validationResult.ok) {\n                  status = 'ready';\n                } else {\n                  status = 'error';\n                }\n\n                // Mutate the rawEntries entry so subsequent state re-emissions (e.g. when another\n                // file is added) take the `of(entry)` branch below and skip re-validation.\n                (entry as Building<PdfMergeEntry>).status = status;\n                (entry as Building<PdfMergeEntry>).errorMessage = validationResult.errorMessage;\n                (entry as Building<PdfMergeEntry>).encrypted = validationResult.encrypted ?? false;\n\n                // Emit a new reference so consumer signal inputs notice the status transition —\n                // returning `entry` would leave `DbxPdfMergeEntryComponent.entry` pointing at the\n                // same object and its computeds wouldn't re-run, stranding the row at \"Checking…\".\n                return { ...entry };\n              }),\n              startWith(entry)\n            );\n          } else {\n            entry$ = of(entry);\n          }\n\n          return entry$;\n        })\n      ).pipe(defaultIfEmpty([] as PdfMergeEntry[]))\n    ),\n    shareReplay(1)\n  );\n\n  readonly entryCount$: Observable<number> = this.entries$.pipe(\n    map((entries) => entries.length),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits the active {@link DbxPdfMergeEncryptedHandling} mode (defaults to {@link DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING}). Pushed onto the store via {@link setEncryptedHandling} by the editor component or {@link DbxPdfMergeEditorStoreDirective}.\n   */\n  readonly encryptedHandling$: Observable<DbxPdfMergeEncryptedHandling> = this._encryptedHandling$.pipe(\n    map((handling) => handling ?? DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Entries enriched with the `ignored` flag derived from {@link encryptedHandling$}. Under `focus` mode (the default) the *first* ready encrypted entry is the focus target — every other entry (encrypted or not) is marked `ignored`, so the merge stream always sees a single encrypted entry and routes through the passthrough branch in {@link mergePdfMergeEntries}. Under `error` mode, encrypted entries are demoted to `status: 'error'` with the standard \"Password-protected\" message. Under `allow` mode, entries pass through unchanged.\n   */\n  readonly displayEntries$: Observable<PdfMergeEntryView[]> = combineLatest([this.entries$, this.encryptedHandling$]).pipe(\n    map(([entries, handling]) => {\n      const focusTarget = handling === 'focus' ? entries.find((entry) => entry.encrypted && entry.status === 'ready') : undefined;\n      return entries.map((entry) => {\n        let view: PdfMergeEntryView;\n\n        if (handling === 'error' && entry.encrypted && entry.status !== 'validating') {\n          view = { ...entry, status: 'error', errorMessage: DBX_PDF_MERGE_ENCRYPTED_ERROR_MESSAGE, ignored: false };\n        } else if (focusTarget != null && entry !== focusTarget) {\n          view = { ...entry, ignored: true };\n        } else {\n          view = { ...entry, ignored: false };\n        }\n\n        return view;\n      });\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits `true` while {@link encryptedHandling$} is `'focus'` and at least one ready encrypted entry exists. Drives the editor's focus banner and is the same condition used to mark non-encrypted entries as `ignored` in {@link displayEntries$}.\n   */\n  readonly focusActive$: Observable<boolean> = combineLatest([this.entries$, this.encryptedHandling$]).pipe(\n    map(([entries, handling]) => handling === 'focus' && entries.some((entry) => entry.encrypted && entry.status === 'ready')),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * The single entry `focus` handling has narrowed the merge to — the first ready encrypted entry — or `null` whenever focus is not active (another handling mode, or no encrypted entry).\n   *\n   * Consumed by {@link DbxPdfMergeEditorFileUploadComponent} to answer \"is my section still part of this document\": while this entry exists, the output is that file alone, so every other slot's contents are ignored no matter what is put in them. Slots compare their own id against {@link PdfMergeEntry.slotId} here — a `null`/absent slot id means the focus target came from the editor's own upload area and supersedes every slot.\n   */\n  readonly encryptedFocusEntry$: Observable<Maybe<PdfMergeEntryView>> = combineLatest([this.displayEntries$, this.focusActive$]).pipe(\n    map(([entries, focusActive]) => (focusActive ? (entries.find((entry) => entry.encrypted && entry.status === 'ready' && !entry.ignored) ?? null) : null)),\n    // By id, not by reference: `displayEntries$` rebuilds its views on every emission, so the same\n    // focus target arrives as a fresh object each time.\n    distinctUntilChanged((a, b) => a?.id === b?.id),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits the encrypted, `ready` entries currently in the list. Useful for consumers that want to surface UI specifically for encrypted files.\n   */\n  readonly encryptedEntries$: Observable<PdfMergeEntry[]> = this.entries$.pipe(\n    map((entries) => entries.filter((entry) => entry.encrypted && entry.status === 'ready')),\n    shareReplay(1)\n  );\n\n  readonly hasReadyEntries$: Observable<boolean> = this.displayEntries$.pipe(\n    map((entries) => entries.some((entry) => entry.status === 'ready' && !entry.ignored)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits `true` while the merge will take the encrypted-passthrough branch — the only entry participating is a single ready encrypted PDF, whose original bytes become the output unchanged. See {@link pdfMergeEntriesUseEncryptedPassthrough}.\n   *\n   * This is what keeps page editing compatible with encrypted documents. `pdf-lib` cannot open an encrypted file, so it can never be expanded into pages and the page plan is necessarily empty for it — meaning every page-plan gate ({@link hasMergeablePages$} and the merge stream's own check) would otherwise read \"the user deleted every page\" and disable Preview, Download, and the upload/accept flows for the entire document. The passthrough has no plan to satisfy, so those gates consult this instead.\n   */\n  readonly encryptedPassthrough$: Observable<boolean> = this.displayEntries$.pipe(\n    map((entries) => pdfMergeEntriesUseEncryptedPassthrough(entries.filter((entry) => !entry.ignored))),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  // MARK: Page editing\n  /**\n   * Raw {@link DbxPdfMergeEditorConfig.pageEditing} value pushed onto the store, before defaulting. Consumed by the editor as the middle tier of its resolution chain (own `[config]` input → store → {@link DBX_PDF_MERGE_EDITOR_CONFIG} token), so a store-level default does not shadow the token.\n   */\n  readonly pageEditingSetting$: Observable<Maybe<boolean>> = this._pageEditing$.asObservable();\n\n  /**\n   * Whether page editing is active, defaulted to {@link DEFAULT_DBX_PDF_MERGE_PAGE_EDITING}. Every page-related stream is inert while this is `false`.\n   */\n  readonly pageEditing$: Observable<boolean> = this.pageEditingSetting$.pipe(\n    map((pageEditing) => pageEditing ?? DEFAULT_DBX_PDF_MERGE_PAGE_EDITING),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Raw {@link DbxPdfMergeEditorConfig.sidecar} value pushed onto the store, before defaulting.\n   */\n  readonly sidecarSetting$: Observable<Maybe<boolean>> = this._sidecar$.asObservable();\n\n  /**\n   * Whether the merged output should carry an embedded manifest, defaulted to {@link DEFAULT_DBX_PDF_MERGE_SIDECAR}. Independent of {@link pageEditing$}.\n   */\n  readonly sidecar$: Observable<boolean> = this.sidecarSetting$.pipe(\n    map((sidecar) => sidecar ?? DEFAULT_DBX_PDF_MERGE_SIDECAR),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Hydrated page metadata keyed by entry id.\n   *\n   * Short-circuits to an empty record while page editing is off, so the default configuration never parses a source document — the upload path's cheap header scan stays the only inspection performed. Each entry is parsed at most once thanks to {@link _pageMetaCache}, and metadata for departed entries is pruned on each pass.\n   */\n  readonly pageMetas$: Observable<Record<string, Maybe<PdfMergePageMeta[]>>> = combineLatest([this.entries$, this.pageEditing$]).pipe(\n    switchMap(([entries, pageEditing]) => {\n      const ready = pageEditing ? entries.filter((entry) => entry.status === 'ready') : [];\n      let next$: Observable<Record<string, Maybe<PdfMergePageMeta[]>>>;\n\n      if (ready.length === 0) {\n        next$ = of({});\n      } else {\n        const readyIds = new Set(ready.map((entry) => entry.id));\n\n        Array.from(this._pageMetaCache.keys()).forEach((entryId) => {\n          if (!readyIds.has(entryId)) {\n            this._pageMetaCache.delete(entryId);\n          }\n        });\n\n        const loaded = ready.map(async (entry) => {\n          let metas = this._pageMetaCache.get(entry.id);\n\n          if (metas == null) {\n            metas = readPdfMergeEntryPageMetas(entry);\n            this._pageMetaCache.set(entry.id, metas);\n          }\n\n          return [entry.id, await metas] as const;\n        });\n\n        next$ = from(Promise.all(loaded)).pipe(map((pairs) => Object.fromEntries(pairs)));\n      }\n\n      return next$;\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * The editor's ordered page plan, or `null` while page editing is disabled. Passing `null` through to the merge is what makes the default path emit every page of every entry exactly as it did before page editing existed.\n   */\n  readonly pages$: Observable<Maybe<PdfMergePageView[]>> = combineLatest([this.displayEntries$, this.pageEditing$, this.pageMetas$, this.select((state) => state.pageOverrides), this.select((state) => state.pageOrder)]).pipe(\n    map(([entries, pageEditing, pageMetas, pageOverrides, pageOrder]) => {\n      let pages: Maybe<PdfMergePageView[]>;\n\n      if (pageEditing) {\n        pages = buildPdfMergePagePlan({ entries, pageMetas, pageOverrides, pageOrder });\n      } else {\n        pages = null;\n      }\n\n      return pages;\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * The page plan split into the groups the UI renders, one per slot plus one for unslotted entries. Empty while page editing is disabled.\n   */\n  readonly pageGroups$: Observable<PdfMergePageGroup[]> = this.pages$.pipe(\n    map((pages) => {\n      const grouped = makeValuesGroupMap(pages ?? [], (page) => page.groupKey);\n      const groups: PdfMergePageGroup[] = [];\n\n      grouped.forEach((groupPages, groupKey) => {\n        groups.push({ groupKey: groupKey as string, slotId: groupPages[0]?.slotId ?? null, pages: groupPages });\n      });\n\n      return groups;\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * Entries that are ready but contribute no pages to the plan: encrypted documents (which `pdf-lib` cannot open), anything unparseable, and entries the active {@link DbxPdfMergeEncryptedHandling} is ignoring. Surfaced so the UI can explain why those rows are not expandable instead of letting them silently vanish from the page list. Always empty while page editing is disabled.\n   *\n   * Ignored entries belong here rather than nowhere: the file-granular list greys them out and still offers a remove button, so omitting them under page editing would make a file the user just added disappear with no explanation and no way to take it back out.\n   */\n  readonly unexpandableEntries$: Observable<PdfMergeEntryView[]> = combineLatest([this.displayEntries$, this.pageEditing$, this.pageMetas$]).pipe(\n    map(([entries, pageEditing, pageMetas]) => (pageEditing ? entries.filter((entry) => entry.status === 'ready' && (entry.ignored || pageMetas[entry.id] === null)) : [])),\n    shareReplay(1)\n  );\n\n  /**\n   * Number of pages that will reach the merged output — the plan minus anything marked for removal. Zero while page editing is disabled, where the count is not meaningful.\n   */\n  readonly mergeablePageCount$: Observable<number> = this.pages$.pipe(\n    map((pages) => (pages ?? []).filter((page) => !page.removed).length),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Whether at least one page survives the user's edits. Emits `true` while page editing is disabled so it never gates the default path, and while {@link encryptedPassthrough$} is active, where the output is the encrypted file itself and there is no plan to satisfy.\n   */\n  readonly hasMergeablePages$: Observable<boolean> = combineLatest([this.pages$, this.encryptedPassthrough$]).pipe(\n    map(([pages, encryptedPassthrough]) => encryptedPassthrough || pages == null || pages.some((page) => !page.removed)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Returns the pages belonging to one group, for a slot rendering its own pages inline.\n   *\n   * @param slotId - Slot identifier, or `null` for the unslotted group.\n   * @returns Observable of that group's ordered pages.\n   */\n  pagesForSlotId$(slotId: Maybe<string>): Observable<PdfMergePageView[]> {\n    const groupKey = pdfMergePageGroupKeyForSlotId(slotId);\n    return this.pages$.pipe(\n      map((pages) => (pages ?? []).filter((page) => page.groupKey === groupKey)),\n      shareReplay(1)\n    );\n  }\n\n  /**\n   * Emits `true` while any entry's validation promise has not yet resolved (i.e. one or more entries are still in `validating` status). Reads from {@link entries$} (not {@link displayEntries$}) so validation gating ignores the `ignored`/`error` projection done by encryption handling.\n   */\n  readonly isValidating$: Observable<boolean> = this.entries$.pipe(\n    map((entries) => entries.some((entry) => entry.status === 'validating')),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits the boolean output of the registered {@link DbxPdfMergeEditorValidator} delegate, or a constant `true` when no delegate is registered. Composed with {@link sizeLimitValid$} into {@link isValid$} to gate {@link currentMergeOutput$}.\n   */\n  readonly validatorValid$: Observable<boolean> = this._validator$.pipe(\n    switchMap((validator) => (validator ? validator(this.entries$) : of(true))),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Internal pre-validity merge stream produced without consulting {@link isValid$}. Drives both {@link outputSize$} and the eventual {@link currentMergeOutput$} so size-based gating can observe the would-be blob without creating a cycle. Consumes {@link displayEntries$} so the merge respects the active {@link DbxPdfMergeEncryptedHandling} (encrypted-focused entries pass through, ignored entries are dropped, `error` mode demotions are honored).\n   */\n  private readonly _candidateMergeOutput$: Observable<Maybe<Blob>> = combineLatest([this.displayEntries$, this.isValidating$, this.validatorValid$, this.pages$, this.sidecar$, this.encryptedPassthrough$]).pipe(\n    switchMap(([entries, isValidating, validatorValid, pages, sidecar, encryptedPassthrough]) => {\n      const mergeable = entries.filter((entry) => !entry.ignored);\n      const hasReady = mergeable.some((entry) => entry.status === 'ready');\n      // A `null` plan means page editing is off, in which case the merge takes its original every-page\n      // path. A passthrough has no plan either — the encrypted document cannot be opened, so its empty\n      // plan must not read as \"every page deleted\" and suppress the output.\n      const hasPages = encryptedPassthrough || pages == null || pages.some((page) => !page.removed);\n      let next$: Observable<Maybe<Blob>>;\n\n      if (isValidating || !hasReady || !validatorValid || !hasPages) {\n        next$ = of(undefined);\n      } else {\n        next$ = from(mergePdfMergeEntries(mergeable, { pages, sidecar })).pipe(catchError(() => of(undefined)));\n      }\n\n      return next$;\n    }),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits the byte size of the most recent candidate merge output, or `undefined` while there is none.\n   */\n  readonly outputSize$: Observable<Maybe<FileSize>> = this._candidateMergeOutput$.pipe(\n    map((blob) => blob?.size),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits `true` while the candidate merge fits inside the active output-size limit (or when no limit is set). Cleared when the merge has not yet produced a blob — emits `true` in that case to avoid blocking the UI before there is anything to gate on.\n   */\n  readonly sizeLimitValid$: Observable<boolean> = combineLatest([this._outputSizeLimit$, this.outputSize$]).pipe(\n    map(([limit, size]) => {\n      let valid: boolean;\n\n      if (limit == null || size == null) {\n        valid = true;\n      } else {\n        valid = size <= limit;\n      }\n\n      return valid;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits `true` while the registered {@link DbxPdfMergeEditorValidator} delegate (if any), the optional output-size limit, and the page plan are all satisfied. {@link currentMergeOutput$} gates merge emissions on this stream.\n   *\n   * The page-plan term is `true` whenever page editing is disabled, so this stream is unchanged on the default path. With page editing on it blocks the merge once the user has marked every page for deletion.\n   */\n  readonly isValid$: Observable<boolean> = combineLatest([this.validatorValid$, this.sizeLimitValid$, this.hasMergeablePages$]).pipe(\n    map(([validatorValid, sizeLimitValid, hasMergeablePages]) => validatorValid && sizeLimitValid && hasMergeablePages),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits the merged PDF blob whenever every entry has finished validating (see {@link isValidating$}), at least one is `ready`, and {@link isValid$} reports `true`. Emits `undefined` while validation is in flight, when the list is empty, when the delegate or size limit reports invalid, or when the most recent merge failed.\n   */\n  readonly currentMergeOutput$: Observable<Maybe<Blob>> = combineLatest([this._candidateMergeOutput$, this.sizeLimitValid$]).pipe(\n    map(([blob, sizeLimitValid]) => (sizeLimitValid ? blob : undefined)),\n    shareReplay(1)\n  );\n\n  readonly mergeOutput$: Observable<Blob> = this.currentMergeOutput$.pipe(filterMaybe());\n\n  /**\n   * Emits the active client-side image-compression config pushed via {@link setImageCompression}, or `undefined` when none is set. Consumed by the editor and its slot uploaders as the middle tier of compression resolution (own `[config]` input → store → {@link DBX_PDF_MERGE_EDITOR_CONFIG} token), letting {@link DbxPdfMergeEditorStoreDirective} supply a store-level default that flows through the upload dialog's bare editor.\n   */\n  readonly imageCompression$: Observable<Maybe<DbxImageCompressionConfig>> = this._imageCompression$.asObservable();\n\n  /**\n   * Returns an observable of entries belonging to the given slot id. The result is filtered from {@link displayEntries$} so per-slot rows honor the active {@link DbxPdfMergeEncryptedHandling} (ignored / error projection).\n   *\n   * @param slotId - Slot identifier to filter for.\n   * @returns Observable of entries whose `slotId` matches, enriched with the `ignored` flag.\n   */\n  entriesForSlotId$(slotId: string): Observable<PdfMergeEntryView[]> {\n    return this.displayEntries$.pipe(\n      map((entries) => entries.filter((entry) => entry.slotId === slotId)),\n      shareReplay(1)\n    );\n  }\n\n  // MARK: Slot registry\n  /**\n   * Slot ids currently mounted against this store, i.e. the sections this editor declares.\n   *\n   * This is what makes `<dbx-pdf-merge-import>` a zero-configuration drop-in: it derives the set of sections a re-imported file is allowed to name (and whether it renders at all) from the slots actually on screen, rather than from a hand-maintained list duplicating them.\n   *\n   * Emitted **sorted ascending**, which is deterministic but is NOT declaration order. Sorting is what lets the guard below collapse slot churn: a set cycling through `@if` (`['a','b']` → `['b']` → `['b','a']`) ends up equal to the array it started with, where registration order would emit a spuriously different array for an identical set.\n   *\n   * Registered by {@link DbxPdfMergeEditorFileUploadComponent} from its own lifecycle. Kept here rather than on the optional {@link DbxPdfMergeEditorFileUploadValidatorDirective} because it must be available whether or not a validator is present — and because a separately-provided registry could be provided at a different level than the store, letting slots register with one instance while a reader sees another.\n   */\n  readonly registeredSlotIds$: Observable<readonly string[]> = this._registeredSlotIds$.pipe(\n    distinctUntilChanged((a, b) => a.length === b.length && a.every((slotId, i) => slotId === b[i])),\n    shareReplay(1)\n  );\n\n  /**\n   * Registers a slot id as mounted, adding it to {@link registeredSlotIds$}.\n   *\n   * Reference-counted rather than a set: the same `slotId` can legitimately be mounted twice at once — the PDF merge upload dialog hosts its slots against an ancestor store while inline slots may still exist under {@link DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY} — and one unmount must not deregister a still-mounted id.\n   *\n   * @param slotId - Slot identifier being mounted.\n   */\n  registerSlotId(slotId: string): void {\n    this._slotIdCounts.set(slotId, (this._slotIdCounts.get(slotId) ?? 0) + 1);\n    this._emitRegisteredSlotIds();\n  }\n\n  /**\n   * Deregisters one mount of a slot id, removing it from {@link registeredSlotIds$} once the last mount is gone. Unknown ids are ignored.\n   *\n   * Callers must pair this with their own {@link registerSlotId} exactly once. The store frequently outlives its slots (a dialog-hosted slot is destroyed on every close while the page-level store lives on), so a missed call leaves the editor permanently claiming a section that is not on screen.\n   *\n   * @param slotId - Slot identifier being unmounted.\n   */\n  unregisterSlotId(slotId: string): void {\n    const count = this._slotIdCounts.get(slotId);\n\n    if (count != null) {\n      if (count > 1) {\n        this._slotIdCounts.set(slotId, count - 1);\n      } else {\n        this._slotIdCounts.delete(slotId);\n      }\n\n      this._emitRegisteredSlotIds();\n    }\n  }\n\n  private _emitRegisteredSlotIds(): void {\n    const next = Array.from(this._slotIdCounts.keys()).sort();\n    const current = this._registeredSlotIds$.value;\n\n    if (next.length !== current.length || next.some((slotId, i) => slotId !== current[i])) {\n      this._registeredSlotIds$.next(next);\n    }\n  }\n\n  // MARK: Import\n  /**\n   * Lifecycle of the most recent {@link importMergedPdf} call, or `undefined` before the first. Lets a consumer that triggered a programmatic import observe its outcome — the picker component is not the only entry point.\n   */\n  readonly importState$: Observable<Maybe<DbxPdfMergeEditorImportState>> = this._importState$.asObservable();\n\n  /**\n   * The most recent successful import, or `null` while none has succeeded.\n   */\n  readonly importResult$: Observable<Maybe<DbxPdfMergeEditorImportResult>> = this.importState$.pipe(\n    map((state) => (state?.status === 'imported' ? state.result : null)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Why the most recent import failed, or `null` when it did not.\n   */\n  readonly importError$: Observable<Maybe<DbxPdfMergeEditorImportErrorReason>> = this.importState$.pipe(\n    map((state) => (state?.status === 'failed' ? state.error : null)),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Emits `true` while an import is in flight.\n   */\n  readonly isImporting$: Observable<boolean> = this.importState$.pipe(\n    map((state) => state?.status === 'importing'),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  /**\n   * Whether a programmatic baseline exists for {@link clearEntries} to restore. Lets a consumer word its own confirmation honestly — \"reset to the imported document\" rather than \"remove everything\".\n   *\n   * @returns `true` once a programmatic import has succeeded.\n   */\n  hasRestorableImport(): boolean {\n    return this._restorableImport != null;\n  }\n\n  /**\n   * Imports a previously-exported merged PDF, replacing every entry currently in the store with the per-slot documents recorded in its manifest.\n   *\n   * This is the programmatic equivalent of what {@link DbxPdfMergeImportComponent} does with a picked file, and that component delegates here — so a stored document loaded by an app and a file chosen by a user go through one implementation with one set of error semantics. Progress and outcome are published on {@link importState$} as well as returned.\n   *\n   * @param input - The source blob plus the optional slot check and sidecar-less fallback.\n   * @returns The terminal state of this import.\n   */\n  async importMergedPdf(input: DbxPdfMergeEditorImportMergedPdfInput): Promise<DbxPdfMergeEditorImportState> {\n    const { source, expectedSlotIds, allowWithoutSidecar, fileName } = input;\n    const origin = input.origin ?? 'programmatic';\n    const config: BuildPdfMergeEntriesFromSidecarConfig = { allowWithoutSidecar, fileName };\n\n    this._importState$.next({ status: 'importing', origin });\n\n    const outcome = await buildPdfMergeEntriesFromSidecar(source, config);\n    let state: DbxPdfMergeEditorImportState;\n\n    if ('error' in outcome) {\n      state = { status: 'failed', origin, error: outcome.error };\n    } else {\n      // An unsectioned document counts as unexpected too: in a slots-only editor it would render\n      // nowhere, so rejecting it beats importing pages the user can never see again.\n      const unexpected = expectedSlotIds == null ? [] : outcome.slotIds.filter((slotId) => slotId == null || !expectedSlotIds.includes(slotId));\n\n      if (unexpected.length > 0) {\n        state = { status: 'failed', origin, error: 'unexpected_slots', unexpectedSlotIds: unexpected };\n      } else {\n        const missingSlotIds = expectedSlotIds == null ? [] : expectedSlotIds.filter((slotId) => !outcome.slotIds.includes(slotId));\n\n        this.replaceEntries(outcome.entries);\n        state = { status: 'imported', origin, result: { ...outcome, missingSlotIds } };\n\n        // A programmatic import is the app telling the editor what it should be showing, so it\n        // becomes the restore point. A user's pick deliberately does NOT overwrite it: the person\n        // replaced what is on screen, not what the app configured.\n        if (origin === 'programmatic') {\n          this._restorableImport = input;\n        }\n      }\n    }\n\n    this._importState$.next(state);\n    return state;\n  }\n\n  /**\n   * Discards the current import lifecycle, so consumers rendering its notices (the picker's \"Imported N section(s)\" success line, its missing-section warning, its error) fall back to showing nothing.\n   *\n   * Separate from the entry list — this clears the *record* of an import, not its contents.\n   */\n  clearImportState(): void {\n    this._importState$.next(undefined);\n  }\n\n  /**\n   * Empties the editor, or resets it to its programmatic baseline when one exists.\n   *\n   * This is the \"Clear\" affordance's operation, and it deliberately is not a plain {@link clearAll}. When the surrounding app supplied the document (a programmatic {@link importMergedPdf}, or `[source]` on {@link DbxPdfMergeEditorStoreDirective}), emptying the editor would strand it in a state the app never asked for and has no obvious way to notice. Instead the original import is re-run, landing the view exactly where it was when the document first arrived — page edits, section removals, and any user-picked file on top of it all discarded.\n   *\n   * With no baseline — the ordinary case, including an editor whose only import came from {@link DbxPdfMergeImportComponent} — the entries and the import state both go, so no stale success/warning notice outlives the content it described.\n   *\n   * @param input - Optional override for the restore behavior.\n   * @returns Whether the baseline was restored, plus the re-import's terminal state when one ran.\n   */\n  async clearEntries(input?: Maybe<DbxPdfMergeEditorClearEntriesInput>): Promise<DbxPdfMergeEditorClearEntriesResult> {\n    const restorable = this._restorableImport;\n    const shouldRestore = (input?.restoreImport ?? true) && restorable != null;\n    let result: DbxPdfMergeEditorClearEntriesResult;\n\n    if (shouldRestore) {\n      const importState = await this.importMergedPdf(restorable);\n\n      // A baseline that no longer imports (unreadable retained blob) must not leave the old\n      // entries sitting there — the user asked for a clear and got neither.\n      if (importState.status === 'imported') {\n        result = { restored: true, importState };\n      } else {\n        this.clearAll();\n        result = { restored: false, importState };\n      }\n    } else {\n      this.clearAll();\n      this.clearImportState();\n      result = { restored: false };\n    }\n\n    return result;\n  }\n\n  /**\n   * Adds a single document to a slot, without any sidecar involvement — the programmatic equivalent of a user dropping one file onto a slot uploader. Existing entries are left alone.\n   *\n   * Unlike {@link importMergedPdf} this neither reads nor requires a manifest; it is the plain \"put this file in that slot\" primitive, for e.g. an admin appending one document to an existing set. The entry can be added before its slot mounts — {@link entriesForSlotId$} picks it up when the slot renders.\n   *\n   * @param input - The blob or file, its target slot, and an optional name for a bare blob.\n   * @returns The entry that was added, or `null` when the file is not a supported PDF/PNG/JPEG (in which case nothing was added).\n   */\n  async addFileToSlot(input: DbxPdfMergeEditorAddFileToSlotInput): Promise<Maybe<PdfMergeEntry>> {\n    const { file, slotId, fileName, imageCompression } = input;\n    const entry = await buildPdfMergeEntry(asPdfMergeFile(file, fileName), { slotId, imageCompression: imageCompression ?? this._imageCompression$.value });\n\n    if (entry != null) {\n      this.addFiles({ entries: [entry] });\n    }\n\n    return entry;\n  }\n\n  // MARK: Validator\n  /**\n   * Registers a {@link DbxPdfMergeEditorValidator} delegate that gates merge emissions. Only one delegate is active at a time — calling this replaces any previously registered delegate.\n   *\n   * @param validator - Delegate to register, or a falsy value to clear.\n   */\n  setValidator(validator: Maybe<DbxPdfMergeEditorValidator>): void {\n    this._validator$.next(validator);\n  }\n\n  /**\n   * Clears any registered validator delegate so {@link validatorValid$} returns to its default `true` stream.\n   */\n  clearValidator(): void {\n    this._validator$.next(undefined);\n  }\n\n  /**\n   * Sets the maximum allowed output blob size in bytes. When the candidate merge exceeds this limit, {@link sizeLimitValid$} (and therefore {@link isValid$}) emits `false` and {@link currentMergeOutput$} suppresses the blob. Pass `null`/`undefined` to clear the limit.\n   *\n   * @param maxBytes - Output byte ceiling, or a falsy value to remove the limit.\n   */\n  setOutputSizeLimit(maxBytes: Maybe<FileSize>): void {\n    this._outputSizeLimit$.next(maxBytes ?? undefined);\n  }\n\n  /**\n   * Sets the store-level client-side image-compression config exposed via {@link imageCompression$}. The editor and its slot uploaders apply it as the middle tier of compression resolution (own `[config]` input → store → {@link DBX_PDF_MERGE_EDITOR_CONFIG} token), so a value pushed here by {@link DbxPdfMergeEditorStoreDirective} reaches the upload dialog's bare editor while a per-input/per-slot override still wins. Pass `null`/`undefined` to clear the store-level default.\n   *\n   * @param config - Image-compression config, or a falsy value to clear the store-level default.\n   */\n  setImageCompression(config: Maybe<DbxImageCompressionConfig>): void {\n    this._imageCompression$.next(config ?? undefined);\n  }\n\n  /**\n   * Sets the active {@link DbxPdfMergeEncryptedHandling} mode, exposed via {@link encryptedHandling$}. Pass `null`/`undefined` to clear the value and fall back to {@link DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING}.\n   *\n   * @param handling - Encryption handling mode, or a falsy value to clear.\n   */\n  setEncryptedHandling(handling: Maybe<DbxPdfMergeEncryptedHandling>): void {\n    this._encryptedHandling$.next(handling ?? undefined);\n  }\n\n  /**\n   * Enables or disables page editing, exposed via {@link pageEditing$}. Turning it on expands each ready entry into its individual pages; turning it off returns the editor to its file-granular behavior while preserving any page edits in state, so toggling back on restores them.\n   *\n   * @param pageEditing - Whether page editing is active, or a falsy value to clear and fall back to {@link DEFAULT_DBX_PDF_MERGE_PAGE_EDITING}.\n   */\n  setPageEditing(pageEditing: Maybe<boolean>): void {\n    this._pageEditing$.next(pageEditing ?? undefined);\n  }\n\n  /**\n   * Enables or disables the embedded manifest, exposed via {@link sidecar$}.\n   *\n   * @param sidecar - Whether to embed the manifest, or a falsy value to clear and fall back to {@link DEFAULT_DBX_PDF_MERGE_SIDECAR}.\n   */\n  setSidecar(sidecar: Maybe<boolean>): void {\n    this._sidecar$.next(sidecar ?? undefined);\n  }\n\n  // MARK: Updaters\n  /**\n   * Appends entries (already constructed) or builds them from raw files and appends them to state. Each entry's validation promise starts when the entry is built; {@link entries$} reflects each result as it resolves. When `input` is an object with `files` and `slotId`, the resulting entries are tagged with that slot id. When `input` is `{ entries }`, the entries are appended as-is — use this shape for entries that went through async client-side compression upstream.\n   */\n  readonly addFiles = this.updater((state, input: DbxPdfMergeEditorAddFilesInput) => {\n    let newEntries: PdfMergeEntry[];\n\n    if (Array.isArray(input)) {\n      newEntries = (input as readonly File[]).map((file) => buildPdfMergeEntrySync(file)).filter((entry): entry is PdfMergeEntry => entry != null);\n    } else {\n      const objectInput = input as { readonly files?: readonly File[]; readonly slotId?: Maybe<string>; readonly entries?: readonly PdfMergeEntry[] };\n\n      if (objectInput.entries == null) {\n        const files = objectInput.files ?? [];\n        const slotId = objectInput.slotId;\n        newEntries = files.map((file) => buildPdfMergeEntrySync(file, { slotId })).filter((entry): entry is PdfMergeEntry => entry != null);\n      } else {\n        newEntries = [...objectInput.entries];\n      }\n    }\n\n    return newEntries.length > 0 ? { ...state, rawEntries: [...state.rawEntries, ...newEntries] } : state;\n  });\n\n  readonly removeEntry = this.updater((state, id: string) => {\n    const rawEntries = state.rawEntries.filter((entry) => entry.id !== id);\n    return { ...state, rawEntries, ...prunePdfMergePageState(state, new Set(rawEntries.map((entry) => entry.id))) };\n  });\n\n  /**\n   * Removes every entry whose `slotId` matches the given id. Used by {@link DbxPdfMergeEditorFileUploadComponent} on destroy so a slot's entries leave with it.\n   */\n  readonly removeEntriesBySlotId = this.updater((state, slotId: string) => {\n    const rawEntries = state.rawEntries.filter((entry) => entry.slotId !== slotId);\n    return { ...state, rawEntries, ...prunePdfMergePageState(state, new Set(rawEntries.map((entry) => entry.id))) };\n  });\n\n  readonly moveEntry = this.updater((state, move: PdfMergeEntryMove) => {\n    let nextState: PdfMergeEditorState;\n\n    if (move.previousIndex === move.currentIndex) {\n      nextState = state;\n    } else {\n      const next = [...state.rawEntries];\n      moveItemInArray(next, move.previousIndex, move.currentIndex);\n      nextState = { ...state, rawEntries: next };\n    }\n\n    return nextState;\n  });\n\n  /**\n   * Reorders entries inside a single slot. The `previousIndex`/`currentIndex` are slot-local — the indices a {@link DbxPdfMergeEditorFileUploadComponent} sees in its filtered view of {@link entries$}. The updater translates them to global `rawEntries` positions and applies an in-place {@link moveItemInArray}, leaving entries from other slots untouched.\n   */\n  readonly moveEntryWithinSlot = this.updater((state, payload: { readonly slotId: string; readonly previousIndex: number; readonly currentIndex: number }) => {\n    const { slotId, previousIndex, currentIndex } = payload;\n    let nextState: PdfMergeEditorState;\n\n    if (previousIndex === currentIndex) {\n      nextState = state;\n    } else {\n      const ownedIndices: number[] = [];\n      state.rawEntries.forEach((entry, index) => {\n        if (entry.slotId === slotId) {\n          ownedIndices.push(index);\n        }\n      });\n\n      if (previousIndex < 0 || previousIndex >= ownedIndices.length || currentIndex < 0 || currentIndex >= ownedIndices.length) {\n        nextState = state;\n      } else {\n        const next = [...state.rawEntries];\n        moveItemInArray(next, ownedIndices[previousIndex], ownedIndices[currentIndex]);\n        nextState = { ...state, rawEntries: next };\n      }\n    }\n\n    return nextState;\n  });\n\n  readonly clearAll = this.updater((state) => ({ ...state, rawEntries: [], pageOverrides: {}, pageOrder: {} }));\n\n  /**\n   * Replaces the entire entry list, discarding any page edits.\n   *\n   * Used by the sidecar import path, which reconstructs a fresh set of slot-tagged entries from a previously-exported file. Done as a single state change so subscribers never observe an intermediate empty list.\n   */\n  readonly replaceEntries = this.updater((state, entries: readonly PdfMergeEntry[]) => ({ ...state, rawEntries: [...entries], pageOverrides: {}, pageOrder: {} }));\n\n  // MARK: Page updaters\n  /**\n   * Reorders a page inside its own group. Groups never exchange pages — the page list renders one CDK drop list per group, so a cross-group drag is impossible to express.\n   *\n   * The move rewrites the id array the caller rendered rather than recomputing it from state, keeping the stored order aligned with what the user saw.\n   */\n  readonly movePageWithinGroup = this.updater((state, move: PdfMergePageMove) => {\n    let nextState: PdfMergeEditorState;\n\n    if (move.previousIndex === move.currentIndex || move.previousIndex < 0 || move.currentIndex < 0 || move.previousIndex >= move.pageIds.length || move.currentIndex >= move.pageIds.length) {\n      nextState = state;\n    } else {\n      const pageIds = [...move.pageIds];\n      moveItemInArray(pageIds, move.previousIndex, move.currentIndex);\n      nextState = { ...state, pageOrder: { ...state.pageOrder, [move.groupKey]: pageIds } };\n    }\n\n    return nextState;\n  });\n\n  /**\n   * Sets a page's rotation. The value is composed onto the page's own source rotation at merge time, so this is the rotation the user applied rather than the page's absolute orientation.\n   */\n  readonly setPageRotation = this.updater((state, change: PdfMergePageRotationChange) => {\n    const current = state.pageOverrides[change.pageId];\n    return { ...state, pageOverrides: { ...state.pageOverrides, [change.pageId]: { rotation: change.rotation, removed: current?.removed ?? false } } };\n  });\n\n  /**\n   * Marks a page for deletion or restores it. Marked pages stay in the list so the choice can be undone, but are excluded from the merged output.\n   */\n  readonly setPageRemoved = this.updater((state, change: PdfMergePageRemovedChange) => {\n    const current = state.pageOverrides[change.pageId];\n    return { ...state, pageOverrides: { ...state.pageOverrides, [change.pageId]: { rotation: current?.rotation ?? 0, removed: change.removed } } };\n  });\n\n  /**\n   * Discards every page edit, returning the plan to natural order with no rotations or deletions. Leaves the entries themselves untouched.\n   */\n  readonly clearPageEdits = this.updater((state) => ({ ...state, pageOverrides: {}, pageOrder: {} }));\n}\n","import { Directive, computed, effect, inject, input, untracked } from '@angular/core';\nimport { type FileSize, type Maybe } from '@dereekb/util';\nimport { DBX_PDF_MERGE_EDITOR_CONFIG, type DbxPdfMergeEditorConfig } from './pdf.merge';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\n\n/**\n * Options applied to the blob bound to {@link DbxPdfMergeEditorStoreDirective.source}. Mirrors the tail of {@link DbxPdfMergeEditorImportMergedPdfInput}.\n */\nexport interface DbxPdfMergeEditorSourceConfig {\n  /**\n   * Sections the source is allowed to name. Omit to skip the check — the default, since a bound source usually arrives before any slot has mounted.\n   */\n  readonly expectedSlotIds?: Maybe<readonly string[]>;\n  /**\n   * When `true`, a readable PDF with no manifest loads as one unslotted entry instead of failing. Defaults to `false`.\n   */\n  readonly allowWithoutSidecar?: Maybe<boolean>;\n  /**\n   * File name to give a bare {@link Blob} loaded through the sidecar-less fallback.\n   */\n  readonly fileName?: Maybe<string>;\n}\n\n/**\n * Provides a {@link DbxPdfMergeEditorStore} on its host element so descendant components (including {@link DbxPdfMergeUploadButtonComponent} and any dialog opened with the host's injector) share the same store instance. Optionally pushes configuration onto the store via inputs.\n *\n * The directive only writes to {@link DbxPdfMergeEditorStore.setOutputSizeLimit} when {@link outputSizeLimit} or {@link config}'s `outputSizeLimits.errorBytes` is explicitly bound — leaving the embedded {@link DbxPdfMergeEditorComponent}'s own effect free to handle the case where the editor is configured directly. Falls back to the workspace-wide {@link DBX_PDF_MERGE_EDITOR_CONFIG} token when neither input is set.\n *\n * @example\n * ```html\n * <div dbxPdfMergeEditorStore [config]=\"{ outputSizeLimits: { errorBytes: 8 * 1024 * 1024 } }\">\n *   <dbx-pdf-merge-upload-button></dbx-pdf-merge-upload-button>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxPdfMergeEditorStore]',\n  providers: [DbxPdfMergeEditorStore],\n  exportAs: 'dbxPdfMergeEditorStore'\n})\nexport class DbxPdfMergeEditorStoreDirective {\n  readonly store = inject(DbxPdfMergeEditorStore);\n  private readonly _injectedConfig = inject(DBX_PDF_MERGE_EDITOR_CONFIG, { optional: true });\n\n  readonly config = input<Maybe<DbxPdfMergeEditorConfig>>();\n  readonly outputSizeLimit = input<Maybe<FileSize>>();\n  /**\n   * A previously-exported merged PDF to load into the store, for an app that fetches a stored document itself and wants the editor to open already populated — no picker involved.\n   *\n   * Imported once per distinct blob instance: re-emitting the same object does nothing, so a template re-render or an unrelated input change cannot re-import. Emitting a *different* blob imports again and replaces the entries, even if the bytes are identical.\n   *\n   * Watch {@link DbxPdfMergeEditorStore.importState$} for the outcome — a failure surfaces there rather than throwing.\n   */\n  readonly source = input<Maybe<Blob>>();\n  readonly sourceConfig = input<Maybe<DbxPdfMergeEditorSourceConfig>>();\n\n  /**\n   * The blob instance most recently handed to the store, so the same one is never imported twice.\n   */\n  private _importedSource: Maybe<Blob>;\n\n  readonly effectiveErrorBytesSignal = computed<Maybe<FileSize>>(() => {\n    const direct = this.outputSizeLimit();\n\n    if (direct != null) {\n      return direct;\n    }\n\n    const fromInput = this.config()?.outputSizeLimits?.errorBytes;\n\n    if (fromInput != null) {\n      return fromInput;\n    }\n\n    return this._injectedConfig?.outputSizeLimits?.errorBytes;\n  });\n\n  constructor() {\n    effect(() => {\n      const errorBytes = this.effectiveErrorBytesSignal();\n\n      if (errorBytes != null) {\n        this.store.setOutputSizeLimit(errorBytes);\n      }\n    });\n\n    // Push the directive's image-compression config onto the store so it reaches the\n    // upload dialog's bare <dbx-pdf-merge-editor> (which renders with no own [config]).\n    // Only the store directive pushes — the editor reads the store as the middle tier of\n    // its resolution chain (own [config] → store → token) — so the bare editor never\n    // clobbers this value with an empty config.\n    effect(() => {\n      this.store.setImageCompression(this.config()?.imageCompression);\n    });\n\n    // Same channel for encryptedHandling — pushes the directive-level mode onto the store\n    // so any descendant editor (including the upload dialog's bare editor) picks it up.\n    effect(() => {\n      this.store.setEncryptedHandling(this.config()?.encryptedHandling);\n    });\n\n    // Same channel for pageEditing, so a dialog-hosted editor opens straight into page\n    // editing mode when the host directive asked for it.\n    effect(() => {\n      this.store.setPageEditing(this.config()?.pageEditing);\n    });\n\n    // Same channel for the embedded manifest. Gated separately from pageEditing — a plain\n    // slot merge benefits from recording which pages came from which slot too.\n    effect(() => {\n      this.store.setSidecar(this.config()?.sidecar);\n    });\n\n    // Loading a source is not idempotent the way the setters above are — it REPLACES the store's\n    // entries — so this tracks only `source` and guards on instance identity. `sourceConfig` is\n    // read untracked so changing it never re-imports; it is read at the moment a new blob arrives.\n    effect(() => {\n      const source = this.source();\n\n      if (source != null && source !== this._importedSource) {\n        this._importedSource = source;\n\n        const sourceConfig = untracked(() => this.sourceConfig());\n        void this.store.importMergedPdf({ source, expectedSlotIds: sourceConfig?.expectedSlotIds, allowWithoutSidecar: sourceConfig?.allowWithoutSidecar, fileName: sourceConfig?.fileName });\n      }\n    });\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport type { Maybe } from '@dereekb/util';\nimport { CdkDrag, CdkDragHandle, CdkDragPlaceholder } from '@angular/cdk/drag-drop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { type PdfMergeEntry, type PdfMergeEntryView } from './pdf.merge';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\nimport { formatPdfMergeEntrySize } from './pdf.merge.utility';\nimport { DbxChipDirective } from '../../layout/text/text.chip.directive';\n\nconst PDF_ICON = 'picture_as_pdf';\nconst IMAGE_ICON = 'image';\nconst ERROR_ICON = 'error';\n\n/**\n * Single row inside the {@link DbxPdfMergeListComponent}: shows the file's icon, name, formatted size, status, drag handle, and a remove button. The component's template is itself a `cdkDrag` element so each row can be reordered inside the parent's `cdkDropList`.\n */\n@Component({\n  selector: 'dbx-pdf-merge-entry',\n  template: `\n    <div class=\"dbx-pdf-merge-entry-row\" cdkDrag cdkDragLockAxis=\"y\">\n      <ng-template cdkDragPlaceholder>\n        <div class=\"dbx-pdf-merge-entry-placeholder\"></div>\n      </ng-template>\n      <button mat-icon-button type=\"button\" cdkDragHandle class=\"dbx-pdf-merge-entry-handle\" aria-label=\"Drag to reorder\">\n        <mat-icon>drag_indicator</mat-icon>\n      </button>\n      <mat-icon class=\"dbx-pdf-merge-entry-icon\" [class.dbx-warn]=\"isErrorSignal()\">{{ iconSignal() }}</mat-icon>\n      <div class=\"dbx-pdf-merge-entry-info dbx-flex-fill-0\">\n        <div class=\"dbx-pdf-merge-entry-name dbx-text-truncate\" [title]=\"entry().name\">{{ entry().name }}</div>\n        <div class=\"dbx-pdf-merge-entry-meta dbx-hint dbx-small\">\n          <span>{{ sizeSignal() }}</span>\n          @if (isEncryptedSignal()) {\n            <dbx-chip class=\"dbx-pdf-merge-entry-encrypted-chip\" color=\"warn\" [small]=\"true\">\n              <mat-icon class=\"dbx-pdf-merge-entry-encrypted-icon\">lock</mat-icon>\n              <span>Encrypted</span>\n            </dbx-chip>\n          }\n          @if (compressionLabelSignal(); as compressionLabel) {\n            <span class=\"dbx-pdf-merge-entry-compression\">{{ compressionLabel }}</span>\n          }\n          @if (statusLabelSignal(); as label) {\n            <span class=\"dbx-pdf-merge-entry-status\" [class.dbx-warn]=\"isErrorSignal()\">{{ label }}</span>\n          }\n        </div>\n      </div>\n      @if (isValidatingSignal()) {\n        <mat-progress-spinner mode=\"indeterminate\" diameter=\"20\"></mat-progress-spinner>\n      }\n      <button mat-icon-button type=\"button\" class=\"dbx-pdf-merge-entry-remove\" (click)=\"onRemove()\" aria-label=\"Remove file\">\n        <mat-icon>close</mat-icon>\n      </button>\n    </div>\n  `,\n  host: {\n    class: 'dbx-pdf-merge-entry d-block',\n    '[class.dbx-pdf-merge-entry--error]': 'isErrorSignal()',\n    '[class.dbx-pdf-merge-entry--validating]': 'isValidatingSignal()',\n    '[class.dbx-pdf-merge-entry--ignored]': 'isIgnoredSignal()',\n    '[class.dbx-pdf-merge-entry--encrypted]': 'isEncryptedSignal()'\n  },\n  imports: [CdkDrag, CdkDragHandle, CdkDragPlaceholder, MatIconModule, MatButtonModule, MatProgressSpinnerModule, DbxChipDirective]\n})\nexport class DbxPdfMergeEntryComponent {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  readonly entry = input.required<PdfMergeEntry | PdfMergeEntryView>();\n\n  readonly isIgnoredSignal = computed(() => (this.entry() as PdfMergeEntryView).ignored === true);\n  readonly isEncryptedSignal = computed(() => this.entry().encrypted === true);\n\n  readonly iconSignal = computed(() => {\n    const entry = this.entry();\n    let icon: string;\n\n    if (entry.status === 'error') {\n      icon = ERROR_ICON;\n    } else if (entry.kind === 'pdf') {\n      icon = PDF_ICON;\n    } else {\n      icon = IMAGE_ICON;\n    }\n\n    return icon;\n  });\n\n  readonly sizeSignal = computed(() => formatPdfMergeEntrySize(this.entry().size));\n\n  readonly isValidatingSignal = computed(() => this.entry().status === 'validating');\n  readonly isErrorSignal = computed(() => this.entry().status === 'error');\n\n  readonly statusLabelSignal = computed(() => {\n    const entry = this.entry();\n    let label: Maybe<string>;\n\n    if (entry.status === 'validating') {\n      label = 'Checking…';\n    } else if (entry.status === 'error') {\n      label = entry.errorMessage ?? 'Cannot merge';\n    } else {\n      label = null;\n    }\n\n    return label;\n  });\n\n  readonly compressionLabelSignal = computed<Maybe<string>>(() => {\n    const entry = this.entry();\n    const compression = entry.compression;\n    let label: Maybe<string>;\n\n    if (compression === 'unchanged') {\n      label = null;\n    } else {\n      const wasSize = formatPdfMergeEntrySize(entry.original.size);\n      let prefix: string;\n\n      if (compression === 'resized') {\n        prefix = 'Resized';\n      } else if (compression === 'converted') {\n        prefix = 'Converted PNG → JPEG';\n      } else {\n        prefix = 'Resized + converted';\n      }\n\n      label = `${prefix} (was ${wasSize})`;\n    }\n\n    return label;\n  });\n\n  onRemove(): void {\n    this.store.removeEntry(this.entry().id);\n  }\n}\n","import { Component, inject } from '@angular/core';\nimport { AsyncPipe } from '@angular/common';\nimport { type CdkDragDrop, CdkDropList } from '@angular/cdk/drag-drop';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\nimport { DbxPdfMergeEntryComponent } from './pdf.merge.entry.component';\n\n/**\n * Renders the staged entries inside a CDK drop list. Each row is a {@link DbxPdfMergeEntryComponent} that hosts its own `cdkDrag`, so reordering events bubble up here as `cdkDropListDropped` and forward to the store's `moveEntry` updater.\n */\n@Component({\n  selector: 'dbx-pdf-merge-list',\n  template: `\n    @if (entries$ | async; as entries) {\n      @if (entries.length === 0) {\n        <div class=\"dbx-list-empty-content dbx-hint dbx-p4\">No files added yet.</div>\n      } @else {\n        <div class=\"dbx-pdf-merge-list-items\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n          @for (entry of entries; track entry.id) {\n            <dbx-pdf-merge-entry [entry]=\"entry\"></dbx-pdf-merge-entry>\n          }\n        </div>\n      }\n    }\n  `,\n  host: {\n    class: 'dbx-pdf-merge-list'\n  },\n  imports: [AsyncPipe, CdkDropList, DbxPdfMergeEntryComponent]\n})\nexport class DbxPdfMergeListComponent {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  readonly entries$ = this.store.displayEntries$;\n\n  onDrop(event: CdkDragDrop<unknown>): void {\n    this.store.moveEntry({ previousIndex: event.previousIndex, currentIndex: event.currentIndex });\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { CdkDrag, CdkDragHandle, CdkDragPlaceholder } from '@angular/cdk/drag-drop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport type { Maybe } from '@dereekb/util';\nimport { type PdfMergePageRotation, type PdfMergePageView } from './pdf.merge';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\nimport { DbxChipDirective } from '../../layout/text/text.chip.directive';\n\nconst PDF_ICON = 'picture_as_pdf';\nconst IMAGE_ICON = 'image';\n\n/**\n * Degrees added by one press of the rotate control.\n */\nconst ROTATION_STEP_DEGREES = 90;\n\n/**\n * PDF points per inch. PDF page dimensions are expressed in points; inches read better on a scanned document.\n */\nconst POINTS_PER_INCH = 72;\n\nconst ROTATION_VALUES: readonly PdfMergePageRotation[] = [0, 90, 180, 270];\n\n/**\n * Single page row inside a {@link DbxPdfMergePageListComponent} group: shows which source file and page it came from, its dimensions and rotation, and controls to rotate it, mark it for removal, and drag it to a new position.\n *\n * The template's root element is itself a `cdkDrag`, matching {@link DbxPdfMergeEntryComponent}, so rows reorder inside their group's drop list.\n */\n@Component({\n  selector: 'dbx-pdf-merge-page',\n  template: `\n    <div class=\"dbx-pdf-merge-page-row\" cdkDrag cdkDragLockAxis=\"y\">\n      <ng-template cdkDragPlaceholder>\n        <div class=\"dbx-pdf-merge-page-placeholder\"></div>\n      </ng-template>\n      <button mat-icon-button type=\"button\" cdkDragHandle class=\"dbx-pdf-merge-page-handle\" aria-label=\"Drag to reorder page\">\n        <mat-icon>drag_indicator</mat-icon>\n      </button>\n      <mat-icon class=\"dbx-pdf-merge-page-icon\">{{ iconSignal() }}</mat-icon>\n      <div class=\"dbx-pdf-merge-page-info dbx-flex-fill-0\">\n        <div class=\"dbx-pdf-merge-page-name dbx-text-truncate\" [title]=\"page().sourceName\">{{ page().sourceName }}</div>\n        <div class=\"dbx-pdf-merge-page-meta dbx-hint dbx-small\">\n          <span class=\"dbx-pdf-merge-page-position\">{{ positionLabelSignal() }}</span>\n          @if (dimensionsLabelSignal(); as dimensions) {\n            <span class=\"dbx-pdf-merge-page-dimensions\">{{ dimensions }}</span>\n          }\n          @if (rotationLabelSignal(); as rotation) {\n            <dbx-chip class=\"dbx-pdf-merge-page-rotation-chip\" [small]=\"true\">\n              <mat-icon class=\"dbx-pdf-merge-page-rotation-icon\">rotate_right</mat-icon>\n              <span>{{ rotation }}</span>\n            </dbx-chip>\n          }\n          @if (removedSignal()) {\n            <span class=\"dbx-pdf-merge-page-removed-label dbx-warn\">Will be removed</span>\n          }\n        </div>\n      </div>\n      <button mat-icon-button type=\"button\" class=\"dbx-pdf-merge-page-rotate\" [disabled]=\"removedSignal()\" (click)=\"onRotate()\" aria-label=\"Rotate page 90 degrees\">\n        <mat-icon>rotate_right</mat-icon>\n      </button>\n      <button mat-icon-button type=\"button\" class=\"dbx-pdf-merge-page-remove\" (click)=\"onToggleRemoved()\" [attr.aria-label]=\"removeLabelSignal()\">\n        <mat-icon>{{ removedSignal() ? 'undo' : 'close' }}</mat-icon>\n      </button>\n    </div>\n  `,\n  host: {\n    class: 'dbx-pdf-merge-page d-block',\n    '[class.dbx-pdf-merge-page--removed]': 'removedSignal()'\n  },\n  imports: [CdkDrag, CdkDragHandle, CdkDragPlaceholder, MatIconModule, MatButtonModule, DbxChipDirective]\n})\nexport class DbxPdfMergePageComponent {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  readonly page = input.required<PdfMergePageView>();\n\n  readonly removedSignal = computed(() => this.page().removed);\n  readonly iconSignal = computed(() => (this.page().kind === 'pdf' ? PDF_ICON : IMAGE_ICON));\n  readonly removeLabelSignal = computed(() => (this.removedSignal() ? 'Restore page' : 'Mark page for removal'));\n\n  readonly positionLabelSignal = computed(() => {\n    const page = this.page();\n    let label: string;\n\n    if (page.kind === 'image') {\n      label = 'Image';\n    } else {\n      label = `Page ${page.sourceIndex + 1} of ${page.sourcePageCount}`;\n    }\n\n    return label;\n  });\n\n  readonly dimensionsLabelSignal = computed<Maybe<string>>(() => {\n    const { kind, meta } = this.page();\n    let label: Maybe<string>;\n\n    if (meta.width <= 0 || meta.height <= 0) {\n      label = null;\n    } else if (kind === 'image') {\n      label = `${Math.round(meta.width)} × ${Math.round(meta.height)} px`;\n    } else {\n      label = `${(meta.width / POINTS_PER_INCH).toFixed(1)} × ${(meta.height / POINTS_PER_INCH).toFixed(1)} in`;\n    }\n\n    return label;\n  });\n\n  readonly rotationLabelSignal = computed<Maybe<string>>(() => {\n    const rotation = this.page().rotation;\n    return rotation === 0 ? null : `${rotation}°`;\n  });\n\n  onRotate(): void {\n    const page = this.page();\n    const next = ROTATION_VALUES[((page.rotation + ROTATION_STEP_DEGREES) / ROTATION_STEP_DEGREES) % ROTATION_VALUES.length];\n    this.store.setPageRotation({ pageId: page.id, rotation: next });\n  }\n\n  onToggleRemoved(): void {\n    const page = this.page();\n    this.store.setPageRemoved({ pageId: page.id, removed: !page.removed });\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { type CdkDragDrop, CdkDropList } from '@angular/cdk/drag-drop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { combineLatest, map, type Observable, shareReplay, switchMap } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { DBX_PDF_MERGE_ENCRYPTED_NOT_EDITABLE_MESSAGE, DBX_PDF_MERGE_IGNORED_ENTRY_MESSAGE, pdfMergePageGroupKeyForSlotId, type PdfMergeEntryView, type PdfMergePageGroup } from './pdf.merge';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\nimport { DbxPdfMergePageComponent } from './pdf.merge.page.component';\nimport { formatPdfMergeEntrySize } from './pdf.merge.utility';\n\n/**\n * Message shown for an entry that is not encrypted but still could not be parsed into pages.\n */\nconst UNREADABLE_PAGES_MESSAGE = 'Pages could not be read.';\n\nconst IGNORED_ICON = 'block';\nconst ENCRYPTED_ICON = 'lock';\nconst UNREADABLE_ICON = 'error';\n\n/**\n * Renders the editor's page plan while page editing is enabled, one CDK drop list per group.\n *\n * Separate, unconnected drop lists are what confine reordering to a single slot: CDK will not let a drag cross into a list it is not connected to, so the rule needs no guard code. Bind {@link slotId} to render only that slot's group — used by {@link DbxPdfMergeEditorFileUploadComponent} to show its own pages inline. Leave it unbound to render every group.\n *\n * Entries that could not be expanded into pages (encrypted, or unparseable) are listed separately below the groups rather than silently omitted.\n */\n@Component({\n  selector: 'dbx-pdf-merge-page-list',\n  template: `\n    @if (groupsSignal(); as groups) {\n      @if (groups.length === 0 && unexpandableSignal().length === 0) {\n        <div class=\"dbx-list-empty-content dbx-hint dbx-p4\">No pages yet.</div>\n      } @else {\n        @for (group of groups; track group.groupKey) {\n          <div class=\"dbx-pdf-merge-page-group\">\n            @if (labelForGroup(group); as label) {\n              <div class=\"dbx-pdf-merge-page-group-label dbx-hint dbx-small\">{{ label }}</div>\n            }\n            <div class=\"dbx-pdf-merge-page-group-items\" cdkDropList (cdkDropListDropped)=\"onDrop(group, $event)\">\n              @for (page of group.pages; track page.id) {\n                <dbx-pdf-merge-page [page]=\"page\"></dbx-pdf-merge-page>\n              }\n            </div>\n          </div>\n        }\n      }\n    }\n    @for (entry of unexpandableSignal(); track entry.id) {\n      <div class=\"dbx-pdf-merge-page-unexpandable\" [class.dbx-pdf-merge-page-unexpandable--ignored]=\"entry.ignored\">\n        <mat-icon class=\"dbx-pdf-merge-page-unexpandable-icon\">{{ iconForUnexpandable(entry) }}</mat-icon>\n        <div class=\"dbx-pdf-merge-page-unexpandable-info dbx-flex-fill-0\">\n          <div class=\"dbx-pdf-merge-page-unexpandable-name dbx-text-truncate\" [title]=\"entry.name\">{{ entry.name }}</div>\n          <div class=\"dbx-pdf-merge-page-unexpandable-meta dbx-hint dbx-small\">\n            <span>{{ sizeForUnexpandable(entry) }}</span>\n            <span>{{ messageForUnexpandable(entry) }}</span>\n          </div>\n        </div>\n        <button mat-icon-button type=\"button\" class=\"dbx-pdf-merge-page-unexpandable-remove\" (click)=\"onRemove(entry)\" [attr.aria-label]=\"'Remove ' + entry.name\">\n          <mat-icon>close</mat-icon>\n        </button>\n      </div>\n    }\n  `,\n  host: {\n    class: 'dbx-pdf-merge-page-list d-block'\n  },\n  imports: [CdkDropList, MatIconModule, MatButtonModule, DbxPdfMergePageComponent]\n})\nexport class DbxPdfMergePageListComponent {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  /**\n   * Renders only this slot's group when bound. Leave unbound to render every group.\n   */\n  readonly slotId = input<Maybe<string>>();\n  /**\n   * Whether to show each group's slot name above its pages. Defaults to `true` when rendering every group and `false` when scoped to one slot, where the slot already has its own heading.\n   */\n  readonly showGroupLabels = input<Maybe<boolean>>();\n\n  private readonly _slotId$ = toObservable(this.slotId);\n\n  readonly groups$: Observable<PdfMergePageGroup[]> = this._slotId$.pipe(\n    switchMap((slotId) => {\n      let groups$: Observable<PdfMergePageGroup[]>;\n\n      if (slotId == null) {\n        groups$ = this.store.pageGroups$;\n      } else {\n        const groupKey = pdfMergePageGroupKeyForSlotId(slotId);\n        groups$ = this.store.pagesForSlotId$(slotId).pipe(map((pages) => (pages.length === 0 ? [] : [{ groupKey, slotId, pages }])));\n      }\n\n      return groups$;\n    }),\n    shareReplay(1)\n  );\n\n  readonly unexpandable$: Observable<PdfMergeEntryView[]> = combineLatest([this.store.unexpandableEntries$, this._slotId$]).pipe(\n    map(([entries, slotId]) => (slotId == null ? entries : entries.filter((entry) => entry.slotId === slotId))),\n    shareReplay(1)\n  );\n\n  readonly groupsSignal = toSignal(this.groups$, { initialValue: [] as PdfMergePageGroup[] });\n  readonly unexpandableSignal = toSignal(this.unexpandable$, { initialValue: [] as PdfMergeEntryView[] });\n\n  readonly showGroupLabelsSignal = computed(() => {\n    const slotId = this.slotId();\n    return this.showGroupLabels() ?? slotId == null;\n  });\n\n  labelForGroup(group: PdfMergePageGroup): Maybe<string> {\n    return this.showGroupLabelsSignal() ? group.slotId : null;\n  }\n\n  /**\n   * Explains why the entry has no pages in the list. The `ignored` check comes first: an ignored encrypted entry is out of the merge because something else is the focus target, which is the more actionable of the two facts.\n   *\n   * @param entry - Entry contributing no pages.\n   * @returns Message for the row.\n   */\n  messageForUnexpandable(entry: PdfMergeEntryView): string {\n    let message: string;\n\n    if (entry.ignored) {\n      message = DBX_PDF_MERGE_IGNORED_ENTRY_MESSAGE;\n    } else if (entry.encrypted) {\n      message = DBX_PDF_MERGE_ENCRYPTED_NOT_EDITABLE_MESSAGE;\n    } else {\n      message = UNREADABLE_PAGES_MESSAGE;\n    }\n\n    return message;\n  }\n\n  iconForUnexpandable(entry: PdfMergeEntryView): string {\n    let icon: string;\n\n    if (entry.ignored) {\n      icon = IGNORED_ICON;\n    } else if (entry.encrypted) {\n      icon = ENCRYPTED_ICON;\n    } else {\n      icon = UNREADABLE_ICON;\n    }\n\n    return icon;\n  }\n\n  sizeForUnexpandable(entry: PdfMergeEntryView): string {\n    return formatPdfMergeEntrySize(entry.size);\n  }\n\n  onRemove(entry: PdfMergeEntryView): void {\n    this.store.removeEntry(entry.id);\n  }\n\n  onDrop(group: PdfMergePageGroup, event: CdkDragDrop<unknown>): void {\n    this.store.movePageWithinGroup({\n      groupKey: group.groupKey,\n      pageIds: group.pages.map((page) => page.id),\n      previousIndex: event.previousIndex,\n      currentIndex: event.currentIndex\n    });\n  }\n}\n","import { Component, model } from '@angular/core';\nimport { type Maybe, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { DbxEmbedComponent } from '../../interaction/iframe/embed.component';\nimport { PDF_MERGE_RESULT_MIME_TYPE } from './pdf.merge';\n\n/**\n * Renders a PDF in a fixed-height embed container. Accepts either a URL or a `Blob` source.\n *\n * @example\n * ```html\n * <dbx-pdf-preview [blob]=\"mergedBlob\"></dbx-pdf-preview>\n * ```\n */\n@Component({\n  selector: 'dbx-pdf-preview',\n  template: `\n    <dbx-embed class=\"dbx-pdf-preview-frame d-block dbx-w100 dbx-h100\" [blob]=\"blob()\" [srcUrl]=\"srcUrl()\" [type]=\"'application/pdf'\"></dbx-embed>\n  `,\n  host: {\n    class: 'dbx-pdf-preview d-block dbx-w100 dbx-h100'\n  },\n  imports: [DbxEmbedComponent]\n})\nexport class DbxPdfPreviewComponent {\n  readonly blob = model<Maybe<Blob>>();\n  readonly srcUrl = model<Maybe<WebsiteUrlWithPrefix>>();\n  readonly downloadFileName = model<Maybe<string>>();\n\n  readonly mimeType = PDF_MERGE_RESULT_MIME_TYPE;\n}\n","import { type MatDialog, type MatDialogRef, type MatDialogConfig } from '@angular/material/dialog';\nimport { type Maybe, type WebsiteUrlWithPrefix } from '@dereekb/util';\nimport { DbxInjectionDialogComponent } from '../../interaction/dialog';\nimport { DbxPdfPreviewComponent } from './pdf.preview.component';\n\n/**\n * Configuration for opening a PDF preview dialog. Extends {@link MatDialogConfig} with PDF-specific source options (blob or URL) and an optional download file name.\n */\nexport interface DbxPdfPreviewDialogConfig extends Omit<MatDialogConfig, 'data'> {\n  readonly srcUrl?: Maybe<WebsiteUrlWithPrefix>;\n  readonly blob?: Maybe<Blob>;\n  readonly downloadFileName?: Maybe<string>;\n}\n\n/**\n * Opens a dialog containing a {@link DbxPdfPreviewComponent} for previewing a PDF blob or URL.\n *\n * @param matDialog - The {@link MatDialog} instance to use.\n * @param config - Source (blob or URL) and Material dialog options.\n * @returns The {@link MatDialogRef} for the opened dialog.\n */\nexport function openPdfPreviewDialog(matDialog: MatDialog, config: DbxPdfPreviewDialogConfig): MatDialogRef<DbxInjectionDialogComponent<DbxPdfPreviewComponent>, void> {\n  return DbxInjectionDialogComponent.openDialog(matDialog, {\n    ...config,\n    componentConfig: {\n      componentClass: DbxPdfPreviewComponent,\n      init: (x) => {\n        const { blob, srcUrl, downloadFileName } = config;\n\n        if (blob != null) {\n          x.blob.set(blob);\n        }\n\n        if (srcUrl != null) {\n          x.srcUrl.set(srcUrl);\n        }\n\n        if (downloadFileName != null) {\n          x.downloadFileName.set(downloadFileName);\n        }\n      }\n    }\n  });\n}\n","import { Component, computed, effect, inject, input, output } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { first, from, map } from 'rxjs';\nimport { type FileSize, type Maybe } from '@dereekb/util';\nimport { type WorkUsingObservable } from '@dereekb/rxjs';\nimport { cleanSubscription, DbxActionButtonDirective, DbxActionDirective, DbxActionDisabledDirective, DbxActionHandlerDirective } from '@dereekb/dbx-core';\nimport { type DbxButtonDisplayStylePair } from '../../button/button';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxActionConfirmDirective, type DbxActionConfirmConfig } from '../../action/action.confirm.directive';\nimport { DbxActionSnackbarErrorDirective } from '../../error/error.snackbar.action.directive';\nimport { DbxFileUploadComponent } from '../../interaction/upload/upload.component';\nimport { type DbxFileUploadFilesChangedEvent } from '../../interaction/upload/abstract.upload.component';\nimport { DbxDownloadBlobButtonComponent, type DbxDownloadBlobButtonConfig } from '../download/blob/download.blob.button.component';\nimport { type FileArrayAcceptMatchConfig } from '../../interaction/upload/upload.accept';\nimport {\n  DBX_PDF_MERGE_EDITOR_CONFIG,\n  DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING,\n  DEFAULT_DBX_PDF_MERGE_PAGE_EDITING,\n  DEFAULT_DBX_PDF_MERGE_RESTORE_IMPORT_ON_CLEAR,\n  DEFAULT_DBX_PDF_MERGE_SIDECAR,\n  DEFAULT_PDF_MERGE_ACCEPT,\n  type DbxPdfMergeEditorConfig,\n  type DbxPdfMergeEncryptedHandling,\n  type DbxPdfMergeOutputSizeLimitsConfig,\n  type PdfMergeEntry\n} from './pdf.merge';\nimport { type DbxImageCompressionConfig } from '../image';\nimport { DbxPdfMergeEditorStore, type DbxPdfMergeEditorClearEntriesResult } from './pdf.merge.editor.store';\nimport { DbxPdfMergeListComponent } from './pdf.merge.list.component';\nimport { DbxPdfMergePageListComponent } from './pdf.merge.page.list.component';\nimport { buildPdfMergeEntry, formatPdfMergeEntrySize } from './pdf.merge.utility';\nimport { openPdfPreviewDialog } from './pdf.preview.dialog.component';\n\nconst DEFAULT_MERGED_FILE_NAME = 'merged.pdf';\n\nconst DEFAULT_DOWNLOAD_BUTTON: DbxButtonDisplayStylePair = {\n  display: { icon: 'download', text: 'Download' },\n  style: { type: 'stroked' }\n};\n\nconst DEFAULT_CLEAR_CONFIRM: DbxActionConfirmConfig = {\n  title: 'Clear all files?',\n  prompt: 'Every file added to this editor will be removed, along with any page edits made to them.',\n  confirmText: 'Clear',\n  cancelText: 'Cancel'\n};\n\nconst ENCRYPTED_BANNER_MESSAGE = 'Encrypted PDF detected — only the encrypted file will be used; other files are ignored.';\n\n/**\n * Page-editing variant of {@link ENCRYPTED_BANNER_MESSAGE}. An encrypted document cannot be opened, so it contributes no editable pages and is uploaded exactly as it arrived.\n */\nconst ENCRYPTED_BANNER_PAGE_EDITING_MESSAGE = 'Encrypted PDF detected — it is used as-is, so its pages cannot be edited and other files are ignored.';\n\n/**\n * Shown in place of {@link DEFAULT_CLEAR_CONFIRM} when the editor has a programmatic baseline, since Clear resets to that document rather than emptying.\n */\nconst DEFAULT_RESTORE_CONFIRM: DbxActionConfirmConfig = {\n  title: 'Reset to the imported document?',\n  prompt: 'Every change made here — added files, page edits, removed sections — will be discarded and the imported document reloaded as it first arrived.',\n  confirmText: 'Reset',\n  cancelText: 'Cancel'\n};\n\n/**\n * Editor that lets the user collect PDFs and images, reorder them via drag-and-drop, and produce a single merged PDF for preview/download. Reads from an ancestor-provided {@link DbxPdfMergeEditorStore}. Optionally embeds a {@link DbxDownloadBlobButtonComponent} to offer a download affordance for the most recent merge.\n *\n * The parent view (or another directive) is responsible for providing {@link DbxPdfMergeEditorStore} so the editor and its peer components ({@link DbxPdfMergeListComponent}, {@link DbxPdfMergeEntryComponent}) share the same instance. Subscribe to the store's {@link DbxPdfMergeEditorStore.mergeOutput$} directly for downstream merge consumers.\n *\n * @example\n * ```html\n * <dbx-pdf-merge-editor [showDownloadButton]=\"true\" fileName=\"receipts.pdf\" [downloadButton]=\"{ display: { icon: 'cloud_download', text: 'Save' }, style: { type: 'flat', color: 'primary' } }\"></dbx-pdf-merge-editor>\n * ```\n */\n/**\n * High-level state of {@link DbxPdfMergeEditorComponent.outputSizeStateSignal}.\n *\n * - `ok` — output size is within or below the configured warning threshold (or no limits are configured).\n * - `warn` — output size exceeds `warnBytes` but stays under `errorBytes`.\n * - `error` — output size exceeds `errorBytes`. Preview and Download are blocked via the store's validity gate.\n */\nexport type DbxPdfMergeEditorOutputSizeState = 'ok' | 'warn' | 'error';\n\n@Component({\n  selector: 'dbx-pdf-merge-editor',\n  templateUrl: './pdf.merge.editor.component.html',\n  host: {\n    class: 'dbx-pdf-merge-editor d-block'\n  },\n  imports: [MatIconModule, DbxButtonComponent, DbxFileUploadComponent, DbxDownloadBlobButtonComponent, DbxActionDirective, DbxActionButtonDirective, DbxActionDisabledDirective, DbxActionHandlerDirective, DbxActionConfirmDirective, DbxActionSnackbarErrorDirective, DbxPdfMergeListComponent, DbxPdfMergePageListComponent]\n})\nexport class DbxPdfMergeEditorComponent {\n  readonly store = inject(DbxPdfMergeEditorStore);\n  private readonly _matDialog = inject(MatDialog);\n  private readonly _injectedConfig = inject(DBX_PDF_MERGE_EDITOR_CONFIG, { optional: true });\n  /**\n   * Single-slot subscription tracker for the deferred Preview path. Replacing the slot cancels any earlier in-flight wait so rapid clicks (or repeated programmatic calls) cannot stack pending dialogs.\n   */\n  private readonly _pendingPreview = cleanSubscription();\n\n  /**\n   * Individual inputs. Each takes precedence over the matching field on {@link config} (and the workspace-wide token), with defaults applied in the corresponding `*Signal` computed. See {@link DbxPdfMergeEditorConfig} for field docs.\n   */\n  readonly accept = input<Maybe<FileArrayAcceptMatchConfig['accept']>>();\n  readonly multiple = input<Maybe<boolean>>();\n  readonly fileName = input<Maybe<string>>();\n  readonly showDownloadButton = input<Maybe<boolean>>();\n  readonly showPreviewButton = input<Maybe<boolean>>();\n  readonly downloadButton = input<Maybe<DbxButtonDisplayStylePair>>();\n  readonly showAddFiles = input<Maybe<boolean>>();\n  readonly showFileList = input<Maybe<boolean>>();\n  readonly pageEditing = input<Maybe<boolean>>();\n  readonly sidecar = input<Maybe<boolean>>();\n  /**\n   * Bundles every editor option into one object (see {@link DbxPdfMergeEditorConfig}). Individual inputs override the matching field here, which in turn overrides the workspace-wide {@link DBX_PDF_MERGE_EDITOR_CONFIG} token.\n   */\n  readonly config = input<Maybe<DbxPdfMergeEditorConfig>>();\n\n  readonly entriesChanged = output<readonly PdfMergeEntry[]>();\n\n  /**\n   * Store-level image-compression default pushed by {@link DbxPdfMergeEditorStoreDirective}. Resolved between the editor's own `config` input and the workspace-wide token so a store-level default flows through the upload dialog's bare editor.\n   */\n  readonly storeImageCompressionSignal = toSignal(this.store.imageCompression$, { initialValue: undefined });\n\n  /**\n   * Store-level encryption handling default pushed by {@link DbxPdfMergeEditorStoreDirective}. Resolved between the editor's own `config` input and the workspace-wide token in {@link effectiveConfigSignal}.\n   */\n  readonly storeEncryptedHandlingSignal = toSignal(this.store.encryptedHandling$, { initialValue: undefined });\n\n  /**\n   * Store-level page-editing and sidecar defaults pushed by {@link DbxPdfMergeEditorStoreDirective}. These read the store's raw (undefaulted) settings so an unset store value still falls through to the workspace-wide token in {@link effectiveConfigSignal}.\n   */\n  readonly storePageEditingSignal = toSignal(this.store.pageEditingSetting$, { initialValue: undefined });\n  readonly storeSidecarSignal = toSignal(this.store.sidecarSetting$, { initialValue: undefined });\n\n  /**\n   * Merged config — the editor's own `config` input wins over the store-level default (for `imageCompression`), which in turn wins over the workspace-wide token. The individual inputs are resolved on top of this object in the per-field `*Signal` computeds below.\n   */\n  readonly effectiveConfigSignal = computed<DbxPdfMergeEditorConfig>(() => {\n    const fromInput = this.config();\n    const fromToken = this._injectedConfig;\n    const storeImageCompression = this.storeImageCompressionSignal();\n    const storeEncryptedHandling = this.storeEncryptedHandlingSignal();\n    const storePageEditing = this.storePageEditingSignal();\n    const storeSidecar = this.storeSidecarSignal();\n    return {\n      imageCompression: fromInput?.imageCompression ?? storeImageCompression ?? fromToken?.imageCompression ?? null,\n      outputSizeLimits: fromInput?.outputSizeLimits ?? fromToken?.outputSizeLimits ?? null,\n      accept: fromInput?.accept ?? fromToken?.accept,\n      multiple: fromInput?.multiple ?? fromToken?.multiple,\n      fileName: fromInput?.fileName ?? fromToken?.fileName,\n      showDownloadButton: fromInput?.showDownloadButton ?? fromToken?.showDownloadButton,\n      showPreviewButton: fromInput?.showPreviewButton ?? fromToken?.showPreviewButton,\n      downloadButton: fromInput?.downloadButton ?? fromToken?.downloadButton,\n      showAddFiles: fromInput?.showAddFiles ?? fromToken?.showAddFiles,\n      showFileList: fromInput?.showFileList ?? fromToken?.showFileList,\n      encryptedHandling: fromInput?.encryptedHandling ?? storeEncryptedHandling ?? fromToken?.encryptedHandling ?? DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING,\n      pageEditing: fromInput?.pageEditing ?? storePageEditing ?? fromToken?.pageEditing ?? DEFAULT_DBX_PDF_MERGE_PAGE_EDITING,\n      sidecar: fromInput?.sidecar ?? storeSidecar ?? fromToken?.sidecar ?? DEFAULT_DBX_PDF_MERGE_SIDECAR,\n      clearConfirm: fromInput?.clearConfirm ?? fromToken?.clearConfirm,\n      restoreImportOnClear: fromInput?.restoreImportOnClear ?? fromToken?.restoreImportOnClear ?? DEFAULT_DBX_PDF_MERGE_RESTORE_IMPORT_ON_CLEAR\n    };\n  });\n\n  readonly restoreImportOnClearSignal = computed<boolean>(() => this.effectiveConfigSignal().restoreImportOnClear ?? DEFAULT_DBX_PDF_MERGE_RESTORE_IMPORT_ON_CLEAR);\n\n  /**\n   * Whether Clear will reset to a programmatic baseline instead of emptying. Only affects the confirmation's wording — {@link DbxPdfMergeEditorStore.clearEntries} makes the actual decision, and re-reads the store at the moment it runs.\n   */\n  readonly clearRestoresImportSignal = computed<boolean>(() => {\n    // Tracks the entry count so the wording is re-evaluated as the editor's contents change; the\n    // store's restore point is a plain field rather than a stream (nothing else needs to observe it).\n    this.entryCountSignal();\n    return this.restoreImportOnClearSignal() && this.store.hasRestorableImport();\n  });\n\n  /**\n   * Config for the confirmation shown before the footer Clear button empties the editor. `clearConfirm` overrides any field of the default; `autoConfirm: true` restores the pre-confirmation one-click behavior.\n   *\n   * The default copy tells the truth about which of the two things Clear is about to do — reset to the app-supplied document, or remove everything.\n   */\n  readonly clearConfirmSignal = computed<DbxActionConfirmConfig>(() => {\n    const base = this.clearRestoresImportSignal() ? DEFAULT_RESTORE_CONFIRM : DEFAULT_CLEAR_CONFIRM;\n    return { ...base, ...this.effectiveConfigSignal().clearConfirm };\n  });\n\n  readonly encryptedHandlingSignal = computed<DbxPdfMergeEncryptedHandling>(() => this.effectiveConfigSignal().encryptedHandling ?? DEFAULT_DBX_PDF_MERGE_ENCRYPTED_HANDLING);\n\n  /**\n   * Whether page editing is active. When `false` the editor renders its original file list and no page machinery is instantiated at all.\n   */\n  readonly pageEditingSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.pageEditing() ?? config.pageEditing ?? DEFAULT_DBX_PDF_MERGE_PAGE_EDITING;\n  });\n\n  readonly sidecarSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.sidecar() ?? config.sidecar ?? DEFAULT_DBX_PDF_MERGE_SIDECAR;\n  });\n\n  readonly imageCompressionConfigSignal = computed<Maybe<DbxImageCompressionConfig>>(() => this.effectiveConfigSignal().imageCompression);\n  readonly outputSizeLimitsSignal = computed<Maybe<DbxPdfMergeOutputSizeLimitsConfig>>(() => this.effectiveConfigSignal().outputSizeLimits);\n\n  // Per-field resolution: dedicated input → config (input/token) → default. The config signal is\n  // read unconditionally at the top of each computed so the computed tracks it on every run.\n  readonly acceptSignal = computed<FileArrayAcceptMatchConfig['accept']>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.accept() ?? config.accept ?? (DEFAULT_PDF_MERGE_ACCEPT as FileArrayAcceptMatchConfig['accept']);\n  });\n  readonly multipleSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.multiple() ?? config.multiple ?? true;\n  });\n  readonly fileNameSignal = computed<string>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.fileName() ?? config.fileName ?? DEFAULT_MERGED_FILE_NAME;\n  });\n  readonly showDownloadButtonSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.showDownloadButton() ?? config.showDownloadButton ?? false;\n  });\n  readonly showPreviewButtonSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.showPreviewButton() ?? config.showPreviewButton ?? true;\n  });\n  readonly downloadButtonSignal = computed<DbxButtonDisplayStylePair>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.downloadButton() ?? config.downloadButton ?? DEFAULT_DOWNLOAD_BUTTON;\n  });\n  readonly showAddFilesSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.showAddFiles() ?? config.showAddFiles ?? true;\n  });\n  readonly showFileListSignal = computed<boolean>(() => {\n    const config = this.effectiveConfigSignal();\n    return this.showFileList() ?? config.showFileList ?? true;\n  });\n  readonly warnBytesSignal = computed<Maybe<FileSize>>(() => this.outputSizeLimitsSignal()?.warnBytes);\n  readonly errorBytesSignal = computed<Maybe<FileSize>>(() => this.outputSizeLimitsSignal()?.errorBytes);\n\n  readonly hasReadyEntriesSignal = toSignal(this.store.hasReadyEntries$, { initialValue: false });\n  readonly entryCountSignal = toSignal(this.store.entryCount$, { initialValue: 0 });\n  /**\n   * Number of pages that will actually reach the output — the page plan minus anything marked for removal. Only surfaced while page editing is enabled.\n   */\n  readonly mergeablePageCountSignal = toSignal(this.store.mergeablePageCount$, { initialValue: 0 });\n  /**\n   * Mirrors {@link DbxPdfMergeEditorStore.focusActive$} — `true` while `encryptedHandling === 'focus'` and at least one ready encrypted entry exists. Drives the encrypted-PDF focus banner.\n   */\n  readonly focusActiveSignal = toSignal(this.store.focusActive$, { initialValue: false });\n\n  /**\n   * Mirrors {@link DbxPdfMergeEditorStore.encryptedPassthrough$} — `true` while the output is a single encrypted file passed through unchanged. Suppresses the page count, which is not knowable for a document `pdf-lib` cannot open.\n   */\n  readonly encryptedPassthroughSignal = toSignal(this.store.encryptedPassthrough$, { initialValue: false });\n\n  /**\n   * Text of the encrypted-focus banner. Page editing gets the longer wording, since the pages of an encrypted document cannot be listed or edited and the user would otherwise be left wondering where they went.\n   */\n  readonly encryptedBannerMessageSignal = computed<string>(() => (this.pageEditingSignal() ? ENCRYPTED_BANNER_PAGE_EDITING_MESSAGE : ENCRYPTED_BANNER_MESSAGE));\n\n  /**\n   * Mirrors {@link DbxPdfMergeEditorStore.isValid$}. Defaults to `true` when no validator delegate is registered, so the Preview/Download buttons are gated only by the registered validator's output (if any).\n   */\n  readonly isValidSignal = toSignal(this.store.isValid$, { initialValue: true });\n\n  /**\n   * Computed gate for the Preview and Download affordances. Disabled while no entry is `ready` or while the registered validator delegate reports invalid.\n   */\n  readonly canMergeSignal = computed(() => {\n    const isValid = this.isValidSignal();\n    return this.hasReadyEntriesSignal() && isValid;\n  });\n\n  /**\n   * Latest merged blob (or `undefined` while validation/merge is in flight or no entries are ready). Sourced from {@link DbxPdfMergeEditorStore.currentMergeOutput$} so the download button always reflects the current merge without needing the user to click Preview first.\n   */\n  readonly mergeBlobSignal = toSignal(this.store.currentMergeOutput$, { initialValue: undefined });\n\n  /**\n   * Latest candidate output size in bytes (sourced from {@link DbxPdfMergeEditorStore.outputSize$}). Drives the warning/error banner.\n   */\n  readonly outputSizeSignal = toSignal(this.store.outputSize$, { initialValue: undefined });\n\n  readonly outputSizeStateSignal = computed<DbxPdfMergeEditorOutputSizeState>(() => {\n    const size = this.outputSizeSignal();\n    const warnBytes = this.warnBytesSignal();\n    const errorBytes = this.errorBytesSignal();\n    let state: DbxPdfMergeEditorOutputSizeState;\n\n    if (size == null) {\n      state = 'ok';\n    } else if (errorBytes != null && size > errorBytes) {\n      state = 'error';\n    } else if (warnBytes != null && size > warnBytes) {\n      state = 'warn';\n    } else {\n      state = 'ok';\n    }\n\n    return state;\n  });\n\n  readonly formattedOutputSizeSignal = computed<Maybe<string>>(() => {\n    const size = this.outputSizeSignal();\n    return size == null ? null : formatPdfMergeEntrySize(size);\n  });\n\n  readonly formattedWarnLimitSignal = computed<Maybe<string>>(() => {\n    const warnBytes = this.warnBytesSignal();\n    return warnBytes == null ? null : formatPdfMergeEntrySize(warnBytes);\n  });\n\n  readonly formattedErrorLimitSignal = computed<Maybe<string>>(() => {\n    const errorBytes = this.errorBytesSignal();\n    return errorBytes == null ? null : formatPdfMergeEntrySize(errorBytes);\n  });\n\n  readonly downloadConfigSignal = computed<DbxDownloadBlobButtonConfig>(() => ({\n    blob: this.mergeBlobSignal(),\n    fileName: this.fileNameSignal(),\n    buttonStylePair: this.downloadButtonSignal()\n  }));\n\n  constructor() {\n    this.store.entries$.pipe(takeUntilDestroyed()).subscribe((entries) => this.entriesChanged.emit(entries));\n\n    effect(() => {\n      const errorBytes = this.errorBytesSignal();\n      this.store.setOutputSizeLimit(errorBytes);\n    });\n\n    effect(() => {\n      const handling = this.encryptedHandlingSignal();\n      this.store.setEncryptedHandling(handling);\n    });\n\n    effect(() => {\n      const pageEditing = this.pageEditingSignal();\n      this.store.setPageEditing(pageEditing);\n    });\n\n    effect(() => {\n      const sidecar = this.sidecarSignal();\n      this.store.setSidecar(sidecar);\n    });\n  }\n\n  async onFiles(event: DbxFileUploadFilesChangedEvent): Promise<void> {\n    const accepted = event.matchResult.accepted;\n\n    if (accepted.length === 0) {\n      return;\n    }\n\n    const imageCompression = this.imageCompressionConfigSignal();\n    const entries = await Promise.all(accepted.map((file) => buildPdfMergeEntry(file, { imageCompression })));\n    const filtered = entries.filter((entry): entry is PdfMergeEntry => entry != null);\n\n    if (filtered.length > 0) {\n      this.store.addFiles({ entries: filtered });\n    }\n  }\n\n  /**\n   * Clears the editor, resetting to a programmatic baseline when there is one. See {@link DbxPdfMergeEditorStore.clearEntries}.\n   *\n   * @returns The clear outcome, so a programmatic caller can tell a reset from an empty.\n   */\n  onClear(): Promise<DbxPdfMergeEditorClearEntriesResult> {\n    return this.store.clearEntries({ restoreImport: this.restoreImportOnClearSignal() });\n  }\n\n  /**\n   * Runs as the handler of the footer Clear button's own `dbxAction`, so the `dbxActionConfirm` on that action is what stands between a misclick and the whole entry list. Delegates to {@link onClear} so a programmatic clear and the button share one path.\n   *\n   * @returns An observable the action completes on — a restore re-parses the document, so this is not instantaneous.\n   */\n  readonly handleClear: WorkUsingObservable<unknown, void> = () => from(this.onClear()).pipe(map(() => undefined));\n\n  onPreview(): void {\n    if (!this.canMergeSignal()) {\n      return;\n    }\n\n    const blob = this.mergeBlobSignal();\n\n    if (blob == null) {\n      this._pendingPreview.subscription = this.store.mergeOutput$.pipe(first()).subscribe((merged) => {\n        this._pendingPreview.subscription = null;\n        this.openPreviewDialog(merged);\n      });\n    } else {\n      this._pendingPreview.subscription = null;\n      this.openPreviewDialog(blob);\n    }\n  }\n\n  private openPreviewDialog(blob: Blob): void {\n    openPdfPreviewDialog(this._matDialog, {\n      blob,\n      downloadFileName: this.fileNameSignal(),\n      width: '90vw',\n      maxWidth: '1200px',\n      height: '90vh'\n    });\n  }\n}\n","@if (showAddFilesSignal()) {\n  <div class=\"dbx-pdf-merge-editor-upload d-block dbx-mb3\">\n    <dbx-file-upload [accept]=\"acceptSignal()\" [multiple]=\"multipleSignal()\" (filesChanged)=\"onFiles($event)\" [hint]=\"'Drop PDFs or images here, or click to browse'\" [text]=\"'Add files'\" icon=\"upload_file\"></dbx-file-upload>\n  </div>\n}\n<ng-content></ng-content>\n@if (showFileListSignal()) {\n  @if (pageEditingSignal()) {\n    <dbx-pdf-merge-page-list></dbx-pdf-merge-page-list>\n  } @else {\n    <dbx-pdf-merge-list></dbx-pdf-merge-list>\n  }\n}\n@if (focusActiveSignal()) {\n  <div class=\"dbx-pdf-merge-editor-encrypted-banner\">\n    <mat-icon>lock</mat-icon>\n    <span>{{ encryptedBannerMessageSignal() }}</span>\n  </div>\n}\n@switch (outputSizeStateSignal()) {\n  @case ('warn') {\n    <div class=\"dbx-pdf-merge-editor-size-warning\">\n      <mat-icon>warning</mat-icon>\n      <span>Merged file is {{ formattedOutputSizeSignal() }} — above the recommended {{ formattedWarnLimitSignal() }} limit.</span>\n    </div>\n  }\n  @case ('error') {\n    <div class=\"dbx-pdf-merge-editor-size-error\">\n      <mat-icon>error</mat-icon>\n      <span>Merged file is {{ formattedOutputSizeSignal() }}, exceeds the {{ formattedErrorLimitSignal() }} limit. Remove or compress files to continue.</span>\n    </div>\n  }\n}\n<div class=\"dbx-pdf-merge-editor-actions\">\n  <span class=\"dbx-hint dbx-small\">{{ entryCountSignal() }} file(s)</span>\n  <!-- Suppressed during an encrypted passthrough: the document cannot be opened, so its page count is\n       unknown and a literal \"0 page(s)\" beside an enabled Preview button reads as a defect. -->\n  @if (pageEditingSignal() && !encryptedPassthroughSignal()) {\n    <span class=\"dbx-hint dbx-small\">{{ mergeablePageCountSignal() }} page(s)</span>\n  }\n  <span class=\"dbx-spacer\"></span>\n  <!-- Emptiness gates the button through the action's own disabled channel: dbxActionButton pushes\n       `isDisabled$` into the button, which would otherwise win over a plain [disabled] input. -->\n  <div dbxAction dbxActionSnackbarError [dbxActionDisabled]=\"entryCountSignal() === 0\" [dbxActionHandler]=\"handleClear\" [dbxActionConfirm]=\"clearConfirmSignal()\">\n    <dbx-button dbxActionButton text=\"Clear\" icon=\"delete\"></dbx-button>\n  </div>\n  @if (showPreviewButtonSignal()) {\n    <dbx-button text=\"Preview\" icon=\"picture_as_pdf\" [disabled]=\"!canMergeSignal()\" (buttonClick)=\"onPreview()\"></dbx-button>\n  }\n  @if (showDownloadButtonSignal() && canMergeSignal()) {\n    <dbx-download-blob-button [config]=\"downloadConfigSignal()\"></dbx-download-blob-button>\n  }\n</div>\n","import { Directive, inject, type OnDestroy, type OnInit } from '@angular/core';\nimport { BehaviorSubject, combineLatest, distinctUntilChanged, map, type Observable, of, shareReplay, switchMap } from 'rxjs';\nimport { completeOnDestroy } from '@dereekb/dbx-core';\nimport { type DbxPdfMergeEditorFileUploadValidatorSlot } from './pdf.merge';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\n\n/**\n * Directive that registers as the active {@link DbxPdfMergeEditorValidator} on a {@link DbxPdfMergeEditorStore} and gates merge emissions on the readiness of every registered slot. {@link DbxPdfMergeEditorFileUploadComponent} instances walk the injector tree, find this directive, and call {@link registerSlot}/{@link unregisterSlot} during their own lifecycle.\n *\n * This slot set is intentionally separate from {@link DbxPdfMergeEditorStore.registeredSlotIds$}, and the two should not be merged. This one is keyed by object identity because it exists solely to `combineLatest` each slot's `isValid$`; the store's is keyed by slot id, answers \"which sections does this editor declare\", and must be populated whether or not a validator is present — which is why it cannot live on this optional directive.\n *\n * @example\n * ```html\n * <dbx-pdf-merge-editor [showAddFiles]=\"false\" [showFileList]=\"false\">\n *   <div dbxPdfMergeEditorFileUploadValidator>\n *     <dbx-pdf-merge-editor-file-upload slotId=\"license\" [config]=\"{ label: 'Driver’s License' }\"></dbx-pdf-merge-editor-file-upload>\n *     <dbx-pdf-merge-editor-file-upload slotId=\"insurance\" [config]=\"{ label: 'Insurance Card', required: false }\"></dbx-pdf-merge-editor-file-upload>\n *   </div>\n * </dbx-pdf-merge-editor>\n * ```\n */\n@Directive({\n  selector: '[dbxPdfMergeEditorFileUploadValidator]'\n})\nexport class DbxPdfMergeEditorFileUploadValidatorDirective implements OnInit, OnDestroy {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  private readonly _slots$ = completeOnDestroy(new BehaviorSubject<readonly DbxPdfMergeEditorFileUploadValidatorSlot[]>([]));\n\n  /**\n   * Emits `true` when every registered slot reports valid (or when no slots are registered yet). Multicast via {@link shareReplay}.\n   */\n  readonly isValid$: Observable<boolean> = this._slots$.pipe(\n    switchMap((slots) => {\n      let next$: Observable<boolean>;\n\n      if (slots.length === 0) {\n        next$ = of(true);\n      } else {\n        next$ = combineLatest(slots.map((slot) => slot.isValid$)).pipe(map((values) => values.every(Boolean)));\n      }\n\n      return next$;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  ngOnInit(): void {\n    this.store.setValidator(() => this.isValid$);\n  }\n\n  ngOnDestroy(): void {\n    this.store.clearValidator();\n  }\n\n  /**\n   * Adds a slot to the active set. Idempotent — registering the same slot twice has no effect.\n   *\n   * @param slot - Slot component to track.\n   */\n  registerSlot(slot: DbxPdfMergeEditorFileUploadValidatorSlot): void {\n    const current = this._slots$.value;\n\n    if (!current.includes(slot)) {\n      this._slots$.next([...current, slot]);\n    }\n  }\n\n  /**\n   * Removes a slot from the active set. No-op when the slot is not currently registered.\n   *\n   * @param slot - Slot component to drop.\n   */\n  unregisterSlot(slot: DbxPdfMergeEditorFileUploadValidatorSlot): void {\n    const current = this._slots$.value;\n    const next = current.filter((existing) => existing !== slot);\n\n    if (next.length !== current.length) {\n      this._slots$.next(next);\n    }\n  }\n}\n","import { Component, computed, inject, input, type OnDestroy, type OnInit } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { type CdkDragDrop, CdkDropList } from '@angular/cdk/drag-drop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { combineLatest, distinctUntilChanged, map, type Observable, shareReplay, switchMap } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { type WorkUsingContext } from '@dereekb/rxjs';\nimport { DbxActionButtonDirective, DbxActionDirective, DbxActionHandlerDirective } from '@dereekb/dbx-core';\nimport { type FileArrayAcceptMatchConfig } from '../../interaction/upload/upload.accept';\nimport { DbxFileUploadComponent, type DbxFileUploadMode } from '../../interaction/upload/upload.component';\nimport { DbxFileUploadButtonComponent } from '../../interaction/upload/upload.button.component';\nimport { type DbxFileUploadFilesChangedEvent } from '../../interaction/upload/abstract.upload.component';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { DbxActionConfirmDirective, type DbxActionConfirmConfig } from '../../action/action.confirm.directive';\nimport { DbxActionSnackbarErrorDirective } from '../../error/error.snackbar.action.directive';\nimport { DBX_PDF_MERGE_EDITOR_CONFIG, DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY, DBX_PDF_MERGE_SUPERSEDED_SLOT_MESSAGE, DEFAULT_PDF_MERGE_ACCEPT, type DbxPdfMergeEditorFileUploadValidatorSlot, type PdfMergeEntry, type PdfMergeEntryView, type PdfMergePageView } from './pdf.merge';\nimport { type DbxImageCompressionConfig } from '../image';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\nimport { DbxPdfMergeEditorFileUploadValidatorDirective } from './pdf.merge.editor.file.upload.validator.directive';\nimport { DbxPdfMergeEntryComponent } from './pdf.merge.entry.component';\nimport { DbxPdfMergePageListComponent } from './pdf.merge.page.list.component';\nimport { buildPdfMergeEntry } from './pdf.merge.utility';\n\n/**\n * Possible high-level UI states for a {@link DbxPdfMergeEditorFileUploadComponent}.\n *\n * - `no_file` — the slot owns no entries.\n * - `valid` — the slot owns entries and they satisfy the slot's `minFiles`/`maxFiles` thresholds with no validation in flight.\n * - `invalid` — the slot owns entries but they fail validation, are still being checked, or violate the slot's thresholds.\n */\nexport type DbxPdfMergeEditorFileUploadState = 'no_file' | 'valid' | 'invalid';\n\n/**\n * Configures a {@link DbxPdfMergeEditorFileUploadComponent} slot — accept filter, multiplicity, validation thresholds, and the appearance passed through to the underlying {@link DbxFileUploadComponent}.\n */\nexport interface DbxPdfMergeEditorFileUploadConfig {\n  /**\n   * Override for the accept filter. Defaults to {@link DEFAULT_PDF_MERGE_ACCEPT}.\n   */\n  readonly accept?: Maybe<FileArrayAcceptMatchConfig['accept']>;\n  /**\n   * Whether the slot accepts multiple files. Defaults to `false` — slots are usually single-file.\n   */\n  readonly multiple?: Maybe<boolean>;\n  /**\n   * Whether the slot must own a valid file for the validator delegate to report ready. Defaults to `true`. When `false`, the slot reports valid in the `no_file` state and only blocks the merge while `invalid`.\n   */\n  readonly required?: Maybe<boolean>;\n  /**\n   * Minimum number of `ready` entries required for the slot to report valid. Defaults to `1`.\n   */\n  readonly minFiles?: Maybe<number>;\n  /**\n   * Optional cap on the number of files this slot will accept. Drives both visibility of the uploader (hidden once the owned-entry count reaches `maxFiles`) and validity (the slot reports invalid if `readyCount > maxFiles`). For single-file slots (`multiple: false`) the implicit cap is `1` regardless of this value.\n   */\n  readonly maxFiles?: Maybe<number>;\n  /**\n   * Optional heading shown above the upload area.\n   */\n  readonly label?: Maybe<string>;\n  /**\n   * Optional hint passed through to the upload area.\n   */\n  readonly hint?: Maybe<string | boolean>;\n  /**\n   * Optional button text passed through to the upload component.\n   */\n  readonly text?: Maybe<string>;\n  /**\n   * Optional button icon passed through to the upload component.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Display mode for the underlying {@link DbxFileUploadComponent}. Defaults to `'default'` (area + button).\n   */\n  readonly mode?: Maybe<DbxFileUploadMode>;\n  /**\n   * Optional per-slot image compression override. When omitted, the slot falls back to the ancestor {@link DbxPdfMergeEditorComponent} input config and finally to the workspace-wide {@link DBX_PDF_MERGE_EDITOR_CONFIG} token.\n   */\n  readonly imageCompression?: Maybe<DbxImageCompressionConfig>;\n  /**\n   * Whether the slot header offers an Add button once the slot owns entries and still has room under its capacity. Defaults to `true`.\n   *\n   * While this is enabled the full drop area is the slot's *empty* state only: once the slot owns something, the area collapses and this compact button becomes the way to add more, so the section never shows two competing add affordances. Set `false` to keep the pre-existing behavior, where the drop area stays visible until the slot reaches capacity.\n   */\n  readonly showAddButton?: Maybe<boolean>;\n  /**\n   * Whether the slot header offers a Clear button while the slot owns entries. Defaults to `true`.\n   *\n   * Clearing is also the slot's replace path: a single-file slot at capacity has no Add button, so clearing is how its file is swapped.\n   */\n  readonly showClearButton?: Maybe<boolean>;\n  /**\n   * Overrides merged over the default confirmation dialog shown before the slot is cleared. Set `autoConfirm: true` to clear without prompting.\n   */\n  readonly clearConfirm?: Maybe<DbxActionConfirmConfig>;\n  /**\n   * Text for the header Add button. Defaults to `'Add'`.\n   */\n  readonly addButtonText?: Maybe<string>;\n  /**\n   * Text for the header Clear button. Defaults to `'Clear'`.\n   */\n  readonly clearButtonText?: Maybe<string>;\n}\n\nconst DEFAULT_MIN_FILES = 1;\nconst DEFAULT_REQUIRED = true;\nconst DEFAULT_ADD_BUTTON_TEXT = 'Add';\nconst DEFAULT_CLEAR_BUTTON_TEXT = 'Clear';\nconst DEFAULT_CLEAR_CONFIRM_TITLE = 'Clear this section?';\nconst DEFAULT_CLEAR_CONFIRM_PROMPT = 'Every file in this section will be removed, along with any page edits made to them.';\nconst DEFAULT_CLEAR_CONFIRM_CONFIRM_TEXT = 'Clear';\nconst DEFAULT_CLEAR_CONFIRM_CANCEL_TEXT = 'Cancel';\n\n/**\n * Slot-scoped uploader for use inside a {@link DbxPdfMergeEditorComponent}. Adds files to the shared {@link DbxPdfMergeEditorStore} tagged with this slot's `slotId`, displays the slot's owned entries inline using {@link DbxPdfMergeEntryComponent}, and reports its readiness to the optional ancestor {@link DbxPdfMergeEditorFileUploadValidatorDirective}. On destroy the slot removes its owned entries from the store.\n *\n * Projects an `<ng-content>` slot inside its header element so consumers can render state-aware indicators (e.g. via the `dbxPdfMergeEditorFileUploadHasState` structural directive) alongside the optional `label`.\n *\n * Once the slot owns entries its header gains an Add button (while the slot is under capacity) and a Clear button, so a section that already has content can still be extended, emptied, or replaced. Clearing runs as its own `dbxAction` behind a `dbxActionConfirm` prompt — a misclick costs a dialog, not the section's files.\n *\n * @example\n * ```html\n * <dbx-pdf-merge-editor-file-upload slotId=\"license\" [config]=\"{ label: 'Driver’s License', accept: ['application/pdf'] }\">\n *   <mat-icon *dbxPdfMergeEditorFileUploadHasState=\"'valid'\">check_circle</mat-icon>\n * </dbx-pdf-merge-editor-file-upload>\n * ```\n */\n@Component({\n  selector: 'dbx-pdf-merge-editor-file-upload',\n  template: `\n    <div class=\"dbx-pdf-merge-editor-file-upload-header\">\n      @if (labelSignal(); as label) {\n        <span class=\"dbx-pdf-merge-editor-file-upload-label\">{{ label }}</span>\n      }\n      <ng-content></ng-content>\n      @if (showAddButtonSignal() || showClearButtonSignal()) {\n        <div class=\"dbx-pdf-merge-editor-file-upload-actions\">\n          @if (showAddButtonSignal()) {\n            <dbx-file-upload-button [accept]=\"acceptSignal()\" [multiple]=\"multipleSignal()\" [text]=\"addButtonTextSignal()\" icon=\"add\" [ariaLabel]=\"addButtonAriaLabelSignal()\" (filesChanged)=\"onFiles($event)\"></dbx-file-upload-button>\n          }\n          @if (showClearButtonSignal()) {\n            <div dbxAction dbxActionSnackbarError [dbxActionHandler]=\"handleClear\" [dbxActionConfirm]=\"clearConfirmSignal()\">\n              <dbx-button dbxActionButton [text]=\"clearButtonTextSignal()\" icon=\"delete\" [ariaLabel]=\"clearButtonAriaLabelSignal()\"></dbx-button>\n            </div>\n          }\n        </div>\n      }\n    </div>\n    @if (supersededByEncryptedSignal()) {\n      <div class=\"dbx-pdf-merge-editor-file-upload-superseded dbx-hint dbx-small\">\n        <mat-icon class=\"dbx-pdf-merge-editor-file-upload-superseded-icon\">lock</mat-icon>\n        <span>{{ supersededMessage }}</span>\n      </div>\n    }\n    @if (showUploadAreaSignal()) {\n      <dbx-file-upload [accept]=\"acceptSignal()\" [multiple]=\"multipleSignal()\" [mode]=\"modeSignal()\" [hint]=\"hintSignal()\" [text]=\"textSignal()\" [icon]=\"iconSignal()\" (filesChanged)=\"onFiles($event)\"></dbx-file-upload>\n    }\n    @if (ownedEntriesSignal(); as owned) {\n      @if (owned.length > 0) {\n        @if (pageEditingSignal()) {\n          <dbx-pdf-merge-page-list class=\"dbx-pdf-merge-editor-file-upload-pages\" [slotId]=\"slotId()\"></dbx-pdf-merge-page-list>\n        } @else {\n          <div class=\"dbx-pdf-merge-editor-file-upload-entries\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\n            @for (entry of owned; track entry.id) {\n              <dbx-pdf-merge-entry [entry]=\"entry\"></dbx-pdf-merge-entry>\n            }\n          </div>\n        }\n      }\n    }\n  `,\n  host: {\n    class: 'dbx-pdf-merge-editor-file-upload d-block dbx-mb3',\n    '[class.dbx-pdf-merge-editor-file-upload--invalid]': 'stateSignal() === \"invalid\"',\n    '[class.dbx-pdf-merge-editor-file-upload--valid]': 'stateSignal() === \"valid\"',\n    '[class.dbx-pdf-merge-editor-file-upload--no-file]': 'stateSignal() === \"no_file\"',\n    '[class.dbx-pdf-merge-editor-file-upload--superseded]': 'supersededByEncryptedSignal()'\n  },\n  imports: [CdkDropList, MatIconModule, DbxButtonComponent, DbxFileUploadComponent, DbxFileUploadButtonComponent, DbxActionDirective, DbxActionButtonDirective, DbxActionHandlerDirective, DbxActionConfirmDirective, DbxActionSnackbarErrorDirective, DbxPdfMergeEntryComponent, DbxPdfMergePageListComponent]\n})\nexport class DbxPdfMergeEditorFileUploadComponent implements OnInit, OnDestroy, DbxPdfMergeEditorFileUploadValidatorSlot {\n  readonly store = inject(DbxPdfMergeEditorStore);\n  private readonly _validator = inject(DbxPdfMergeEditorFileUploadValidatorDirective, { optional: true });\n  private readonly _injectedConfig = inject(DBX_PDF_MERGE_EDITOR_CONFIG, { optional: true });\n  private readonly _preserveEntriesOnDestroy = inject(DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY, { optional: true }) ?? false;\n\n  /**\n   * The slot id this component registered with the store, captured at registration time so destroy deregisters the same key. `null` before {@link ngOnInit} and after teardown.\n   */\n  private _registeredSlotId: Maybe<string> = null;\n\n  readonly slotId = input.required<string>();\n  readonly config = input<Maybe<DbxPdfMergeEditorFileUploadConfig>>();\n\n  readonly acceptSignal = computed<FileArrayAcceptMatchConfig['accept']>(() => this.config()?.accept ?? (DEFAULT_PDF_MERGE_ACCEPT as FileArrayAcceptMatchConfig['accept']));\n  readonly multipleSignal = computed(() => this.config()?.multiple ?? false);\n  readonly modeSignal = computed<DbxFileUploadMode>(() => this.config()?.mode ?? 'default');\n  readonly labelSignal = computed(() => this.config()?.label);\n  readonly hintSignal = computed(() => this.config()?.hint);\n  readonly textSignal = computed(() => this.config()?.text ?? 'Add file');\n  readonly iconSignal = computed(() => this.config()?.icon ?? 'upload_file');\n\n  readonly requiredSignal = computed(() => this.config()?.required ?? DEFAULT_REQUIRED);\n  readonly minFilesSignal = computed(() => this.config()?.minFiles ?? DEFAULT_MIN_FILES);\n  readonly maxFilesSignal = computed(() => this.config()?.maxFiles);\n\n  /**\n   * Effective upper bound on the number of owned entries this slot will accept. Defaults to `maxFiles` when set, `1` for single-file slots (`multiple: false`), and {@link Number.POSITIVE_INFINITY} for multi-file slots without an explicit cap.\n   */\n  readonly capacitySignal = computed(() => {\n    const maxFiles = this.maxFilesSignal();\n    const multiple = this.multipleSignal();\n    let capacity: number;\n\n    if (maxFiles != null) {\n      capacity = maxFiles;\n    } else if (multiple) {\n      capacity = Number.POSITIVE_INFINITY;\n    } else {\n      capacity = 1;\n    }\n\n    return capacity;\n  });\n\n  /**\n   * Live entries owned by this slot, derived from {@link DbxPdfMergeEditorStore.entriesForSlotId$}. Each entry carries the `ignored` flag set by the store under the active {@link DbxPdfMergeEncryptedHandling}.\n   */\n  readonly ownedEntries$: Observable<PdfMergeEntryView[]> = toObservable(this.slotId).pipe(\n    switchMap((slotId) => this.store.entriesForSlotId$(slotId)),\n    shareReplay(1)\n  );\n\n  readonly ownedEntriesSignal = toSignal(this.ownedEntries$, { initialValue: [] as PdfMergeEntryView[] });\n\n  /**\n   * Whether the shared store has page editing enabled. Drives whether this slot lists its own pages or its own files.\n   */\n  readonly pageEditingSignal = toSignal(this.store.pageEditing$, { initialValue: false });\n\n  /**\n   * Pages contributed by this slot's entries. Empty while page editing is disabled.\n   */\n  readonly ownedPages$: Observable<PdfMergePageView[]> = toObservable(this.slotId).pipe(\n    switchMap((slotId) => this.store.pagesForSlotId$(slotId)),\n    shareReplay(1)\n  );\n\n  /**\n   * Whether an encrypted PDF in another section (or in the editor's own upload area) has taken over the whole document under `focus` handling, leaving this section with nothing to contribute.\n   *\n   * Anything added here while that is true would be ignored by the merge, so the slot withdraws its add affordances rather than inviting an upload it will silently drop — and waives its own `required` check in {@link isValid$}, since an untouchable section must not be able to block the merge forever.\n   */\n  readonly supersededByEncrypted$: Observable<boolean> = combineLatest([this.store.encryptedFocusEntry$, toObservable(this.slotId)]).pipe(\n    map(([focusEntry, slotId]) => focusEntry != null && focusEntry.slotId !== slotId),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly supersededByEncryptedSignal = toSignal(this.supersededByEncrypted$, { initialValue: false });\n\n  readonly supersededMessage = DBX_PDF_MERGE_SUPERSEDED_SLOT_MESSAGE;\n\n  /**\n   * Whether the slot still has room for more files. Gates every add affordance — once the slot is at capacity, or an encrypted document has superseded the section, neither the drop area nor the header Add button is offered, and the user must clear the slot (or remove an entry) to add another.\n   */\n  readonly canAddFilesSignal = computed(() => {\n    const ownedEntries = this.ownedEntriesSignal();\n    const capacity = this.capacitySignal();\n    return !this.supersededByEncryptedSignal() && ownedEntries.length < capacity;\n  });\n\n  readonly showAddButtonConfigSignal = computed(() => this.config()?.showAddButton ?? true);\n  readonly showClearButtonConfigSignal = computed(() => this.config()?.showClearButton ?? true);\n\n  /**\n   * Whether the compact header Add button is rendered. Only meaningful once the slot owns something — while it is empty the drop area is already the add affordance.\n   */\n  readonly showAddButtonSignal = computed(() => {\n    const ownedEntries = this.ownedEntriesSignal();\n    const canAddFiles = this.canAddFilesSignal();\n    return this.showAddButtonConfigSignal() && ownedEntries.length > 0 && canAddFiles;\n  });\n\n  readonly showClearButtonSignal = computed(() => {\n    const ownedEntries = this.ownedEntriesSignal();\n    return this.showClearButtonConfigSignal() && ownedEntries.length > 0;\n  });\n\n  /**\n   * Whether the full drop area is rendered. It is the slot's empty state while the header Add button is enabled; with the button turned off it falls back to staying visible until the slot reaches capacity.\n   */\n  readonly showUploadAreaSignal = computed(() => {\n    const showAddButtonConfig = this.showAddButtonConfigSignal();\n    const canAddFiles = this.canAddFilesSignal();\n    const isEmpty = this.ownedEntriesSignal().length === 0;\n    return canAddFiles && (isEmpty || !showAddButtonConfig);\n  });\n\n  readonly addButtonTextSignal = computed(() => this.config()?.addButtonText ?? DEFAULT_ADD_BUTTON_TEXT);\n  readonly clearButtonTextSignal = computed(() => this.config()?.clearButtonText ?? DEFAULT_CLEAR_BUTTON_TEXT);\n\n  readonly addButtonAriaLabelSignal = computed(() => {\n    const label = this.labelSignal();\n    return label ? `Add files to ${label}` : 'Add files to this section';\n  });\n\n  readonly clearButtonAriaLabelSignal = computed(() => {\n    const label = this.labelSignal();\n    return label ? `Clear ${label}` : 'Clear this section';\n  });\n\n  /**\n   * Config for the confirmation shown before the slot is cleared. The slot's `label` is folded into the default title so a page of sections says which one is about to be emptied; `clearConfirm` overrides any field of it.\n   */\n  readonly clearConfirmSignal = computed<DbxActionConfirmConfig>(() => {\n    const label = this.labelSignal();\n    const overrides = this.config()?.clearConfirm;\n\n    return {\n      title: label ? `Clear ${label}?` : DEFAULT_CLEAR_CONFIRM_TITLE,\n      prompt: DEFAULT_CLEAR_CONFIRM_PROMPT,\n      confirmText: DEFAULT_CLEAR_CONFIRM_CONFIRM_TEXT,\n      cancelText: DEFAULT_CLEAR_CONFIRM_CANCEL_TEXT,\n      ...overrides\n    };\n  });\n\n  /**\n   * Clears every entry this slot owns. Runs as the handler of the header's own `dbxAction`, so the `dbxActionConfirm` on that action is what stands between a misclick and the section's files.\n   *\n   * @param _value - Unused. The confirmation supplies no value, only the go-ahead.\n   * @param context - Work context completed as soon as the store drops the entries.\n   */\n  readonly handleClear: WorkUsingContext<unknown, void> = (_value, context) => {\n    this.store.removeEntriesBySlotId(this.slotId());\n    context.success();\n  };\n\n  /**\n   * High-level state of the slot — `no_file` when empty, `valid` when owned entries satisfy the slot's thresholds, `invalid` when owned entries fail or are still being validated.\n   */\n  readonly state$: Observable<DbxPdfMergeEditorFileUploadState> = combineLatest([this.ownedEntries$, this.store.pageEditing$, this.ownedPages$]).pipe(\n    map(([entries, pageEditing, pages]) => {\n      let state: DbxPdfMergeEditorFileUploadState;\n\n      if (entries.length === 0) {\n        state = 'no_file';\n      } else {\n        const validating = entries.some((entry) => entry.status === 'validating');\n        const readyCount = entries.filter((entry) => entry.status === 'ready').length;\n        const minFiles = this.minFilesSignal();\n        const maxFiles = this.maxFilesSignal();\n        // Only meaningful once the slot actually has pages: an empty list means editing is off, the\n        // entry is still hydrating, or it could not be expanded (encrypted) — none of which are the\n        // user deleting their own content.\n        const allPagesRemoved = pageEditing && pages.length > 0 && pages.every((page) => page.removed);\n\n        if (validating) {\n          state = 'invalid';\n        } else if (readyCount < minFiles) {\n          state = 'invalid';\n        } else if (maxFiles != null && readyCount > maxFiles) {\n          state = 'invalid';\n        } else if (allPagesRemoved) {\n          state = 'invalid';\n        } else {\n          state = 'valid';\n        }\n      }\n\n      return state;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly stateSignal = toSignal(this.state$, { initialValue: 'no_file' });\n\n  /**\n   * Per-slot validity stream consumed by {@link DbxPdfMergeEditorFileUploadValidatorDirective}. Reports `true` when the slot is `valid` or when the slot is `no_file` and not `required`. An `invalid` state always reports `false`, even on optional slots — bad files block the merge until the user removes them.\n   *\n   * A slot superseded by an encrypted document reports `true` unconditionally: its contents cannot reach the output either way, so holding the merge for a section the user can no longer fill would make an encrypted upload impossible to complete in a slotted editor.\n   */\n  readonly isValid$: Observable<boolean> = combineLatest([this.state$, this.supersededByEncrypted$]).pipe(\n    map(([state, superseded]) => {\n      const required = this.requiredSignal();\n      let valid: boolean;\n\n      if (superseded || state === 'valid') {\n        valid = true;\n      } else if (state === 'no_file') {\n        valid = !required;\n      } else {\n        valid = false;\n      }\n\n      return valid;\n    }),\n    distinctUntilChanged(),\n    shareReplay(1)\n  );\n\n  readonly isValidSignal = toSignal(this.isValid$, { initialValue: false });\n\n  ngOnInit(): void {\n    // Two registrations, deliberately: the store learns this slot's ID (so consumers like\n    // <dbx-pdf-merge-import> can enumerate the sections this editor declares), while the optional\n    // validator directive tracks the component itself to aggregate `isValid$`. They are separate\n    // because the store is always present while the validator is not, and because the store's\n    // `setValidator` seam exists precisely so it never has to hold slot component references.\n    this._registeredSlotId = this.slotId();\n    this.store.registerSlotId(this._registeredSlotId);\n    this._validator?.registerSlot(this);\n  }\n\n  ngOnDestroy(): void {\n    // Unconditional, and deliberately OUTSIDE the `_preserveEntriesOnDestroy` check below: that\n    // token governs whether the slot's ENTRIES survive, not whether the slot is mounted. The\n    // upload dialog sets it to `true` and is torn down on every close, so gating this on it would\n    // leave the store permanently claiming a section that is no longer on screen. The captured id\n    // (rather than a fresh `slotId()` read) guarantees this decrements the same key `ngOnInit`\n    // incremented, and clearing it keeps a repeat destroy from evicting a still-mounted duplicate.\n    if (this._registeredSlotId != null) {\n      this.store.unregisterSlotId(this._registeredSlotId);\n      this._registeredSlotId = null;\n    }\n\n    this._validator?.unregisterSlot(this);\n\n    // Default behavior: removing a slot from a template (e.g. via `@if`) also drops the slot's\n    // entries from the store. Opt out by providing `DBX_PDF_MERGE_EDITOR_PRESERVE_ENTRIES_ON_SLOT_DESTROY`\n    // (the PDF merge upload dialog supplies it automatically so dialog-hosted slots preserve\n    // entries when the dialog tears down, while the user's selection lives on the ancestor store).\n    if (!this._preserveEntriesOnDestroy) {\n      this.store.removeEntriesBySlotId(this.slotId());\n    }\n  }\n\n  onDrop(event: CdkDragDrop<unknown>): void {\n    this.store.moveEntryWithinSlot({\n      slotId: this.slotId(),\n      previousIndex: event.previousIndex,\n      currentIndex: event.currentIndex\n    });\n  }\n\n  /**\n   * Store-level image-compression default pushed by {@link DbxPdfMergeEditorStoreDirective}. Resolved between the slot's own override and the workspace-wide token.\n   */\n  readonly storeImageCompressionSignal = toSignal(this.store.imageCompression$, { initialValue: undefined });\n\n  /**\n   * Resolves the active image compression config: per-slot override → store-level default → workspace-wide DI token. The store tier lets a {@link DbxPdfMergeEditorStoreDirective} `[config]` supply a shared default (e.g. through the upload dialog) while a slot's own `imageCompression` still wins.\n   */\n  readonly effectiveImageCompressionSignal = computed<Maybe<DbxImageCompressionConfig>>(() => {\n    const storeImageCompression = this.storeImageCompressionSignal();\n    return this.config()?.imageCompression ?? storeImageCompression ?? this._injectedConfig?.imageCompression ?? null;\n  });\n\n  async onFiles(event: DbxFileUploadFilesChangedEvent): Promise<void> {\n    const accepted = event.matchResult.accepted;\n    const ownedCount = this.ownedEntriesSignal().length;\n    const capacity = this.capacitySignal();\n    const remaining = capacity - ownedCount;\n    let filesToAdd: readonly File[];\n\n    // The superseded check is a guard, not the affordance: the drop area and Add button are already\n    // withdrawn, but a file that arrives anyway would land in a section the merge cannot use.\n    if (accepted.length === 0 || remaining <= 0 || this.supersededByEncryptedSignal()) {\n      filesToAdd = [];\n    } else if (Number.isFinite(remaining) && remaining < accepted.length) {\n      filesToAdd = accepted.slice(0, remaining);\n    } else {\n      filesToAdd = accepted;\n    }\n\n    if (filesToAdd.length === 0) {\n      return;\n    }\n\n    const slotId = this.slotId();\n    const imageCompression = this.effectiveImageCompressionSignal();\n    const entries = await Promise.all(filesToAdd.map((file) => buildPdfMergeEntry(file, { slotId, imageCompression })));\n    const filtered = entries.filter((entry): entry is PdfMergeEntry => entry != null);\n\n    if (filtered.length > 0) {\n      this.store.addFiles({ entries: filtered });\n    }\n  }\n}\n","import { Directive, inject, input } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { combineLatest, distinctUntilChanged, map, type Observable } from 'rxjs';\nimport { type ArrayOrValue, asArray, type Maybe } from '@dereekb/util';\nimport { AbstractIfDirective } from '@dereekb/dbx-core';\nimport { DbxPdfMergeEditorFileUploadComponent, type DbxPdfMergeEditorFileUploadState } from './pdf.merge.editor.file.upload.component';\n\n/**\n * Structural directive that conditionally renders its host element based on the current state of an ancestor {@link DbxPdfMergeEditorFileUploadComponent}.\n *\n * Use it inside a slot's projected header content to render state-aware indicators — icons, badges, status text — without subscribing to the slot's `state$` manually.\n *\n * @example\n * ```html\n * <dbx-pdf-merge-editor-file-upload slotId=\"license\" [config]=\"licenseConfig\">\n *   <mat-icon *dbxPdfMergeEditorFileUploadHasState=\"'valid'\">check_circle</mat-icon>\n *   <mat-icon *dbxPdfMergeEditorFileUploadHasState=\"'invalid'\">error</mat-icon>\n *   <mat-icon *dbxPdfMergeEditorFileUploadHasState=\"['no_file', 'invalid']\">radio_button_unchecked</mat-icon>\n * </dbx-pdf-merge-editor-file-upload>\n * ```\n */\n@Directive({\n  selector: '[dbxPdfMergeEditorFileUploadHasState]'\n})\nexport class DbxPdfMergeEditorFileUploadHasStateDirective extends AbstractIfDirective {\n  private readonly _slot = inject(DbxPdfMergeEditorFileUploadComponent);\n\n  readonly targetState = input<Maybe<ArrayOrValue<DbxPdfMergeEditorFileUploadState>>>(undefined, { alias: 'dbxPdfMergeEditorFileUploadHasState' });\n  readonly targetState$ = toObservable(this.targetState);\n\n  readonly show$: Observable<boolean> = combineLatest([this._slot.state$, this.targetState$]).pipe(\n    map(([state, target]) => {\n      const targets = asArray(target);\n      return targets.includes(state);\n    }),\n    distinctUntilChanged()\n  );\n}\n","import { Component, computed, inject, input, output, signal } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { MatIconModule } from '@angular/material/icon';\nimport { PDF_MIME_TYPE, type Maybe } from '@dereekb/util';\nimport { type FileArrayAcceptMatchConfig } from '../../interaction/upload/upload.accept';\nimport { DbxFileUploadComponent, type DbxFileUploadMode } from '../../interaction/upload/upload.component';\nimport { type DbxFileUploadFilesChangedEvent } from '../../interaction/upload/abstract.upload.component';\nimport { DbxPdfMergeEditorStore, type DbxPdfMergeEditorImportResult, type DbxPdfMergeEditorImportState } from './pdf.merge.editor.store';\nimport { type PdfMergeSidecarImportErrorReason } from './pdf.merge.utility';\n\n/**\n * Messages shown for each reason an import can fail.\n */\nexport const DBX_PDF_MERGE_IMPORT_ERROR_MESSAGES: Record<PdfMergeSidecarImportErrorReason, string> = {\n  unreadable: 'This file could not be read as a PDF. It may be corrupt or password protected.',\n  no_sidecar: 'This PDF has no embedded manifest, so its pages cannot be matched back to sections. Choose a PDF that was exported from this editor.',\n  no_documents: 'This PDF has a manifest, but none of its recorded pages could be found in the file.'\n};\n\n/**\n * Configures the appearance of a {@link DbxPdfMergeImportComponent}.\n */\nexport interface DbxPdfMergeImportConfig {\n  readonly label?: Maybe<string>;\n  readonly hint?: Maybe<string | boolean>;\n  readonly text?: Maybe<string>;\n  readonly icon?: Maybe<string>;\n  readonly mode?: Maybe<DbxFileUploadMode>;\n  readonly accept?: Maybe<FileArrayAcceptMatchConfig['accept']>;\n}\n\n/**\n * Loads a PDF that was previously exported from the editor with an embedded manifest, and repopulates the editor's slots from it.\n *\n * This is the payoff of the sidecar: a completed single-file document goes back to being the set of per-slot documents it was assembled from, so a user can replace or edit one section in place instead of rebuilding the whole file. Every entry currently in the store is replaced.\n *\n * **Zero configuration.** The sections this editor accepts are read from the `<dbx-pdf-merge-editor-file-upload>` slots mounted against the shared {@link DbxPdfMergeEditorStore} (see {@link DbxPdfMergeEditorStore.registeredSlotIds$}), so the common case needs no bindings at all. A file naming any other section is rejected rather than partially imported — without that check, entries carrying an unrecognized slot id would import and then render nowhere.\n *\n * **Renders nothing when no sections are configured.** This component exists to split a document back into slots, so with no slots mounted (and no explicit {@link expectedSlotIds}) it has nothing to import into and collapses to zero size. Bind {@link enforceExpectedSlots} to `false` for the unusual case of an editor that wants the import affordance without declaring slots.\n *\n * @example\n * ```html\n * <!-- derives its sections from the slots below it -->\n * <dbx-pdf-merge-import (imported)=\"onImported($event)\"></dbx-pdf-merge-import>\n * <dbx-pdf-merge-editor>\n *   <dbx-pdf-merge-editor-file-upload slotId=\"license\"></dbx-pdf-merge-editor-file-upload>\n *   <dbx-pdf-merge-editor-file-upload slotId=\"cert\"></dbx-pdf-merge-editor-file-upload>\n * </dbx-pdf-merge-editor>\n * ```\n */\n@Component({\n  selector: 'dbx-pdf-merge-import',\n  template: `\n    @if (activeSignal()) {\n      @if (labelSignal(); as label) {\n        <div class=\"dbx-pdf-merge-import-label\">{{ label }}</div>\n      }\n      <dbx-file-upload [accept]=\"acceptSignal()\" [multiple]=\"false\" [mode]=\"modeSignal()\" [hint]=\"hintSignal()\" [text]=\"textSignal()\" [icon]=\"iconSignal()\" (filesChanged)=\"onFiles($event)\"></dbx-file-upload>\n      @if (errorSignal(); as error) {\n        <div class=\"dbx-pdf-merge-import-error\">\n          <mat-icon class=\"dbx-pdf-merge-import-icon\">error</mat-icon>\n          <span>{{ error }}</span>\n        </div>\n      }\n      @if (successLabelSignal(); as success) {\n        <div class=\"dbx-pdf-merge-import-success\">\n          <mat-icon class=\"dbx-pdf-merge-import-icon\">check_circle</mat-icon>\n          <span>{{ success }}</span>\n        </div>\n      }\n      @if (missingLabelSignal(); as missing) {\n        <div class=\"dbx-pdf-merge-import-warning\">\n          <mat-icon class=\"dbx-pdf-merge-import-icon\">warning</mat-icon>\n          <span>{{ missing }}</span>\n        </div>\n      }\n    }\n  `,\n  host: {\n    class: 'dbx-pdf-merge-import',\n    // Collapsed rather than merely emptied while inactive: without `d-block` the host is an empty\n    // inline element of zero size, and dropping the margin keeps it from occupying layout.\n    '[class.d-block]': 'activeSignal()',\n    '[class.dbx-mb3]': 'activeSignal()'\n  },\n  imports: [MatIconModule, DbxFileUploadComponent]\n})\nexport class DbxPdfMergeImportComponent {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  readonly config = input<Maybe<DbxPdfMergeImportConfig>>();\n  /**\n   * Optional override for the slot ids this editor renders. Leave unbound to derive them from the slots mounted against the store — the zero-configuration default. When set, a file whose manifest names any other slot is rejected rather than partially imported.\n   *\n   * An explicitly bound empty array reads as \"this editor deliberately has no sections\" and hides the component, the same as having no slots mounted.\n   */\n  readonly expectedSlotIds = input<Maybe<readonly string[]>>();\n  /**\n   * Whether the imported file's sections must match this editor's. Defaults to `true`.\n   *\n   * Binding `false` is the single escape hatch for an editor with no slots that still wants the import affordance: it both skips the check and keeps the component rendered.\n   */\n  readonly enforceExpectedSlots = input<boolean>(true);\n\n  readonly imported = output<DbxPdfMergeEditorImportResult>();\n  readonly importFailed = output<string>();\n  /**\n   * Emits the expected sections the imported file did not fill, when there are any. The import itself still succeeds — a missing section is a partial state the user can fill in.\n   */\n  readonly missingSlots = output<readonly string[]>();\n\n  private readonly _error = signal<Maybe<string>>(null);\n  private readonly _result = signal<Maybe<DbxPdfMergeEditorImportResult>>(null);\n  private readonly _missingSlotIds = signal<readonly string[]>([]);\n\n  readonly errorSignal = this._error.asReadonly();\n  readonly resultSignal = this._result.asReadonly();\n  readonly missingSlotIdsSignal = this._missingSlotIds.asReadonly();\n\n  private readonly _registeredSlotIdsSignal = toSignal(this.store.registeredSlotIds$, { initialValue: [] as readonly string[] });\n\n  /**\n   * The exact import state the notices below currently describe — the one this component's own picked file produced. Identity, not contents: it is the only reliable way to tell \"still my file\" from \"the store moved on\".\n   */\n  private _displayedState: Maybe<DbxPdfMergeEditorImportState>;\n\n  constructor() {\n    // The notices are set from what `onFiles` gets back rather than from `importState$`, so that\n    // they only ever describe a file picked here. They must not outlive it, though: once the store\n    // is showing anything other than this component's own import — cleared outright, restored to a\n    // programmatic baseline, or replaced by an import from elsewhere — the notice is describing\n    // content the editor no longer holds, and goes.\n    this.store.importState$.pipe(takeUntilDestroyed()).subscribe((state) => {\n      if (state !== this._displayedState) {\n        this.resetDisplay();\n      }\n    });\n  }\n\n  /**\n   * The sections an imported file is allowed to name, or `null` when no check applies. Resolves the explicit {@link expectedSlotIds} binding over the slots registered with the store.\n   */\n  readonly effectiveExpectedSlotIdsSignal = computed<Maybe<readonly string[]>>(() => {\n    const registered = this._registeredSlotIdsSignal();\n    const bound = this.expectedSlotIds();\n    let expected: Maybe<readonly string[]>;\n\n    if (!this.enforceExpectedSlots()) {\n      expected = null;\n    } else if (bound == null) {\n      // An empty registry is \"nothing declared yet\", not \"nothing allowed\" — the component hides\n      // rather than rejecting, so a null here never becomes a check that fails every file.\n      expected = registered.length > 0 ? registered : null;\n    } else {\n      expected = bound;\n    }\n\n    return expected;\n  });\n\n  /**\n   * Whether this component has anything to import into. `false` collapses it to nothing — see the class docs.\n   */\n  readonly activeSignal = computed<boolean>(() => {\n    const expected = this.effectiveExpectedSlotIdsSignal();\n    return !this.enforceExpectedSlots() || (expected != null && expected.length > 0);\n  });\n\n  readonly acceptSignal = computed<FileArrayAcceptMatchConfig['accept']>(() => this.config()?.accept ?? ([PDF_MIME_TYPE] as FileArrayAcceptMatchConfig['accept']));\n  readonly modeSignal = computed<DbxFileUploadMode>(() => this.config()?.mode ?? 'default');\n  readonly labelSignal = computed(() => this.config()?.label);\n  readonly hintSignal = computed(() => this.config()?.hint ?? 'Choose a PDF previously exported from this editor');\n  readonly textSignal = computed(() => this.config()?.text ?? 'Import merged PDF');\n  readonly iconSignal = computed(() => this.config()?.icon ?? 'upload_file');\n\n  readonly successLabelSignal = computed<Maybe<string>>(() => {\n    const result = this._result();\n    let label: Maybe<string>;\n\n    if (result == null) {\n      label = null;\n    } else {\n      const sections = result.slotIds.map((slotId) => slotId ?? 'unsectioned').join(', ');\n      label = `Imported ${result.entries.length} section(s): ${sections}.`;\n    }\n\n    return label;\n  });\n\n  /**\n   * Warning shown when the imported file left one or more expected sections empty. The import succeeded — this only explains why a slot is still blank.\n   */\n  readonly missingLabelSignal = computed<Maybe<string>>(() => {\n    const missing = this._missingSlotIds();\n    return missing.length > 0 ? `This PDF did not include section(s): ${missing.join(', ')}.` : null;\n  });\n\n  async onFiles(event: DbxFileUploadFilesChangedEvent): Promise<void> {\n    const file = event.matchResult.accepted[0];\n\n    if (file != null) {\n      this.resetDisplay();\n\n      // Delegates to the store so the picker and a programmatic import share one implementation\n      // and one set of error semantics. The slot check is opt-in on the store, so the component's\n      // own resolved expectation is what preserves the picker's behavior. The returned state is\n      // used rather than `importState$` so these outputs only ever describe a picked file.\n      // `origin: 'user'` marks this as discardable — it must not become the store's clear-time\n      // restore point, which belongs to whatever document the app itself supplied.\n      const state = await this.store.importMergedPdf({ source: file, expectedSlotIds: this.effectiveExpectedSlotIdsSignal(), origin: 'user' });\n\n      // Claim this state before rendering it: the subscription above resets on anything it does\n      // not recognise, and the 'importing'/terminal emissions have already gone past by now.\n      this._displayedState = state;\n\n      if (state.status === 'failed') {\n        this.fail(this.messageForFailure(state));\n      } else if (state.result != null) {\n        const { result } = state;\n\n        this._result.set(result);\n        this._missingSlotIds.set(result.missingSlotIds);\n        this.imported.emit(result);\n\n        if (result.missingSlotIds.length > 0) {\n          this.missingSlots.emit(result.missingSlotIds);\n        }\n      }\n    }\n  }\n\n  private messageForFailure(state: DbxPdfMergeEditorImportState): string {\n    const unexpected: readonly Maybe<string>[] = state.unexpectedSlotIds ?? [];\n    let message: string;\n\n    if (state.error === 'unexpected_slots') {\n      message = `This PDF contains section(s) this editor does not have: ${unexpected.map((slotId) => slotId ?? 'unsectioned').join(', ')}.`;\n    } else {\n      message = DBX_PDF_MERGE_IMPORT_ERROR_MESSAGES[state.error ?? 'unreadable'];\n    }\n\n    return message;\n  }\n\n  private fail(message: string): void {\n    this._error.set(message);\n    this.importFailed.emit(message);\n  }\n\n  /**\n   * Drops every notice this component renders, returning it to its pre-import appearance and releasing its claim on the store's import state.\n   */\n  private resetDisplay(): void {\n    this._displayedState = null;\n    this._error.set(null);\n    this._result.set(null);\n    this._missingSlotIds.set([]);\n  }\n}\n","import { Component, type Injector, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { type MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { type ThemePalette } from '@angular/material/core';\nimport { first } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxInjectionComponent, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { AbstractDialogDirective } from '../../interaction/dialog/abstract.dialog.directive';\nimport { DbxDialogContentDirective } from '../../interaction/dialog/dialog.content.directive';\nimport { DbxDialogContentCloseComponent } from '../../interaction/dialog/dialog.content.close.component';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type DbxButtonStyle } from '../../button/button';\nimport { type DbxColorInput } from '../../layout/style/style';\nimport { provideDbxPdfMergeEditorPreserveEntriesOnSlotDestroy } from './pdf.merge';\nimport { DbxPdfMergeEditorComponent } from './pdf.merge.editor.component';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\n\nconst DEFAULT_UPLOAD_FOOTER_ICON = 'cloud_upload';\nconst DEFAULT_UPLOAD_FOOTER_TEXT = 'Upload';\nconst DEFAULT_UPLOAD_FOOTER_COLOR: ThemePalette = 'primary';\nconst DEFAULT_UPLOAD_FOOTER_RAISED = true;\n\n/**\n * Display config for the dialog's footer Upload button.\n *\n * Each field is optional — omit any field to inherit the dialog's defaults (`text: 'Upload'`, `icon: 'cloud_upload'`, `color: 'primary'`, `raised: true`). Set a boolean variant flag (`flat`, `stroked`, `tonal`, `basic`) together with `raised: false` to switch the Material button variant.\n */\nexport interface DbxPdfMergeUploadDialogUploadButtonConfig {\n  readonly text?: Maybe<string>;\n  readonly icon?: Maybe<string>;\n  readonly style?: Maybe<DbxButtonStyle>;\n  readonly color?: Maybe<ThemePalette | DbxColorInput>;\n  readonly raised?: Maybe<boolean>;\n  readonly flat?: Maybe<boolean>;\n  readonly stroked?: Maybe<boolean>;\n  readonly tonal?: Maybe<boolean>;\n  readonly basic?: Maybe<boolean>;\n}\n\n/**\n * Configuration for {@link DbxPdfMergeUploadDialogComponent.openDialog}.\n *\n * The {@link injector} is required: it is forwarded to {@link MatDialog.open} so the dialog's content shares the caller's element-injector tree and resolves the ancestor-provided {@link DbxPdfMergeEditorStore}. Pass the {@link Injector} obtained at the call site (typically the button's `inject(Injector)`).\n *\n * When {@link componentConfig} is supplied, the dialog renders a {@link DbxInjectionComponent} bound to that config in place of the default {@link DbxPdfMergeEditorComponent}. Do NOT set `componentConfig.injector` if you want the injected component to resolve the ancestor store — leaving it undefined lets {@link DbxInjectionComponent} resolve from the dialog's own injector.\n *\n * Set {@link showUploadButton} to `false` to hide the footer Upload button — useful when the projected content provides its own confirm affordance (or when the dialog is purely informational and the caller reads from the store on close).\n */\nexport interface DbxPdfMergeUploadDialogConfig {\n  readonly injector: Injector;\n  readonly componentConfig?: Maybe<DbxInjectionComponentConfig>;\n  readonly showUploadButton?: Maybe<boolean>;\n  readonly uploadButtonConfig?: Maybe<DbxPdfMergeUploadDialogUploadButtonConfig>;\n}\n\n/**\n * Dialog content that hosts the PDF merge editor (or a caller-supplied alternative) inside a {@link MatDialog}. Closes with the merged {@link Blob} when the user clicks the footer Upload button.\n *\n * The dialog inherits its caller's injector via {@link MatDialog.open}'s `injector` option, so an ancestor-provided {@link DbxPdfMergeEditorStore} is shared with the embedded editor. The footer Upload button is disabled while the store reports invalid (`isValid$ === false`) or while there are no ready entries, and renders a spinner while validation is in flight. Closing the dialog without uploading leaves the store's entries intact so the user can reopen and resume.\n *\n * Use {@link DbxPdfMergeUploadButtonComponent} to open this dialog with the canonical configuration, or call {@link DbxPdfMergeUploadDialogComponent.openDialog} directly.\n */\n@Component({\n  selector: 'dbx-pdf-merge-upload-dialog',\n  template: `\n    <dbx-dialog-content>\n      <dbx-dialog-content-close (close)=\"close()\"></dbx-dialog-content-close>\n      @if (componentConfigSignal(); as componentConfig) {\n        <dbx-injection [config]=\"componentConfig\"></dbx-injection>\n      } @else {\n        <dbx-pdf-merge-editor [showPreviewButton]=\"true\" [showDownloadButton]=\"false\"></dbx-pdf-merge-editor>\n      }\n      @if (showUploadButtonSignal()) {\n        <div class=\"dbx-pdf-merge-upload-dialog-footer\">\n          <dbx-button\n            [icon]=\"uploadIconSignal()\"\n            [text]=\"uploadTextSignal()\"\n            [buttonStyle]=\"uploadStyleSignal()\"\n            [color]=\"uploadColorSignal()\"\n            [raised]=\"uploadRaisedSignal()\"\n            [flat]=\"uploadFlatSignal()\"\n            [stroked]=\"uploadStrokedSignal()\"\n            [tonal]=\"uploadTonalSignal()\"\n            [basic]=\"uploadBasicSignal()\"\n            [working]=\"uploadWorkingSignal()\"\n            [disabled]=\"uploadDisabledSignal()\"\n            (buttonClick)=\"confirmUpload()\"></dbx-button>\n        </div>\n      }\n    </dbx-dialog-content>\n  `,\n  host: {\n    class: 'dbx-pdf-merge-upload-dialog'\n  },\n  providers: [provideDbxPdfMergeEditorPreserveEntriesOnSlotDestroy(true)],\n  imports: [DbxDialogContentDirective, DbxDialogContentCloseComponent, DbxInjectionComponent, DbxPdfMergeEditorComponent, DbxButtonComponent]\n})\nexport class DbxPdfMergeUploadDialogComponent extends AbstractDialogDirective<Blob, DbxPdfMergeUploadDialogConfig> {\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  readonly componentConfigSignal = computed<Maybe<DbxInjectionComponentConfig>>(() => this.data?.componentConfig);\n  readonly showUploadButtonSignal = computed<boolean>(() => this.data?.showUploadButton !== false);\n  readonly uploadIconSignal = computed<Maybe<string>>(() => this.data?.uploadButtonConfig?.icon ?? DEFAULT_UPLOAD_FOOTER_ICON);\n  readonly uploadTextSignal = computed<Maybe<string>>(() => this.data?.uploadButtonConfig?.text ?? DEFAULT_UPLOAD_FOOTER_TEXT);\n  readonly uploadStyleSignal = computed<Maybe<DbxButtonStyle>>(() => this.data?.uploadButtonConfig?.style);\n  readonly uploadColorSignal = computed<Maybe<ThemePalette | DbxColorInput>>(() => this.data?.uploadButtonConfig?.color ?? DEFAULT_UPLOAD_FOOTER_COLOR);\n  readonly uploadRaisedSignal = computed<boolean>(() => this.data?.uploadButtonConfig?.raised ?? DEFAULT_UPLOAD_FOOTER_RAISED);\n  readonly uploadFlatSignal = computed<boolean>(() => this.data?.uploadButtonConfig?.flat ?? false);\n  readonly uploadStrokedSignal = computed<boolean>(() => this.data?.uploadButtonConfig?.stroked ?? false);\n  readonly uploadTonalSignal = computed<boolean>(() => this.data?.uploadButtonConfig?.tonal ?? false);\n  readonly uploadBasicSignal = computed<boolean>(() => this.data?.uploadButtonConfig?.basic ?? false);\n\n  readonly uploadWorkingSignal = toSignal(this.store.isValidating$, { initialValue: false });\n  private readonly _hasReadyEntriesSignal = toSignal(this.store.hasReadyEntries$, { initialValue: false });\n  private readonly _isValidSignal = toSignal(this.store.isValid$, { initialValue: true });\n\n  readonly uploadDisabledSignal = computed<boolean>(() => {\n    const hasReady = this._hasReadyEntriesSignal();\n    const isValid = this._isValidSignal();\n    return !hasReady || !isValid;\n  });\n\n  confirmUpload(): void {\n    this.store.mergeOutput$.pipe(first()).subscribe((blob) => this.close(blob));\n  }\n\n  static openDialog(matDialog: MatDialog, config: DbxPdfMergeUploadDialogConfig): MatDialogRef<DbxPdfMergeUploadDialogComponent, Blob> {\n    return matDialog.open<DbxPdfMergeUploadDialogComponent, DbxPdfMergeUploadDialogConfig, Blob>(DbxPdfMergeUploadDialogComponent, {\n      panelClass: ['dbx-pdf-merge-upload-dialog'],\n      width: '90vw',\n      height: '90vh',\n      maxWidth: '1200px',\n      maxHeight: '900px',\n      injector: config.injector,\n      data: config\n    });\n  }\n}\n","import { Directive, Injector, inject, input } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { first, map } from 'rxjs';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButton, type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\nimport { DbxPdfMergeUploadDialogComponent, type DbxPdfMergeUploadDialogUploadButtonConfig } from './pdf.merge.upload.dialog.component';\n\n/**\n * Configuration for {@link DbxPdfMergeUploadButtonDirective}. Carries only dialog-related options — the trigger button's appearance is owned by the host {@link DbxButton} (its own `text`, `icon`, `raised`, `color`, `buttonStyle` inputs).\n */\nexport interface DbxPdfMergeUploadButtonConfig {\n  /**\n   * Optional component config rendered inside the dialog in place of the default {@link DbxPdfMergeEditorComponent}. Leave {@link DbxInjectionComponentConfig.injector} unset so the injected component inherits the dialog's injector and resolves the ancestor {@link DbxPdfMergeEditorStore}.\n   */\n  readonly customDialogContent?: Maybe<DbxInjectionComponentConfig>;\n  /**\n   * When `false`, the dialog's footer Upload button is hidden — useful when the projected content provides its own confirm affordance.\n   */\n  readonly showUploadButton?: Maybe<boolean>;\n  /**\n   * Display overrides for the dialog's footer Upload button — text, icon, color, raised, variant flags, button style.\n   */\n  readonly uploadButtonConfig?: Maybe<DbxPdfMergeUploadDialogUploadButtonConfig>;\n}\n\n/**\n * Drop-in interceptor for a stock `<dbx-button>` that opens {@link DbxPdfMergeUploadDialogComponent} on click. The click is allowed to propagate (so a sibling `dbxActionButton` can call `source.trigger()`) only when the user confirms the upload from inside the dialog — closing the dialog without confirming drops the click.\n *\n * Action-blind by design — this directive only links a `<dbx-button>` to the merge dialog. To bridge the result into a surrounding `dbxAction`, compose with {@link DbxPdfMergeUploadActionDirective} (`[dbxPdfMergeUploadAction]`), which listens for the action's `triggered$` and supplies `store.mergeOutput$` to `source.readyValue()`. The trio composes on a stock `<dbx-button>` alongside `dbxActionButton`:\n *\n * - Host `<dbx-button>` owns its own appearance (`text`, `icon`, `raised`, `color`, …).\n * - `dbxActionButton` drives `working`/`disabled` from the action and calls `source.trigger()` on click.\n * - `dbxPdfMergeUploadButton` (this directive) intercepts the click, opens the dialog, and resolves the interceptor with `true` only when the user confirms.\n * - `dbxPdfMergeUploadAction` reacts to `source.triggered$` by pulling the latest `store.mergeOutput$` into `source.readyValue(blob)` so the action handler runs with the merged PDF.\n *\n * An ancestor-provided {@link DbxPdfMergeEditorStore} is required — supply via {@link DbxPdfMergeEditorStoreDirective} on a wrapping element, or `providers: [DbxPdfMergeEditorStore]` on the parent component.\n *\n * @example\n * ```html\n * <div dbxAction [dbxActionHandler]=\"handleUpload\">\n *   <div dbxPdfMergeEditorStore [config]=\"storeConfig\">\n *     <dbx-button text=\"Upload PDF\" icon=\"picture_as_pdf\" raised color=\"primary\" dbxActionButton dbxPdfMergeUploadAction [dbxPdfMergeUploadButton]=\"buttonConfig\"></dbx-button>\n *   </div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxPdfMergeUploadButton]'\n})\nexport class DbxPdfMergeUploadButtonDirective {\n  readonly button = inject(DbxButton, { host: true });\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  readonly dbxPdfMergeUploadButton = input<Maybe<DbxPdfMergeUploadButtonConfig>, Maybe<DbxPdfMergeUploadButtonConfig | ''>>(undefined, {\n    transform: (value) => (value === '' ? undefined : value)\n  });\n\n  constructor() {\n    const matDialog = inject(MatDialog);\n    const injector = inject(Injector);\n\n    this.button.setButtonInterceptor({\n      interceptButtonClick: () => {\n        const config = this.dbxPdfMergeUploadButton();\n        const ref = DbxPdfMergeUploadDialogComponent.openDialog(matDialog, {\n          injector,\n          componentConfig: config?.customDialogContent,\n          showUploadButton: config?.showUploadButton,\n          uploadButtonConfig: config?.uploadButtonConfig\n        });\n\n        return ref.afterClosed().pipe(\n          first(),\n          map((blob) => blob != null)\n        );\n      }\n    });\n  }\n}\n","import { Directive, inject } from '@angular/core';\nimport { first, switchMap } from 'rxjs';\nimport { DbxActionContextStoreSourceInstance, cleanSubscriptionWithLockSet } from '@dereekb/dbx-core';\nimport { DbxPdfMergeEditorStore } from './pdf.merge.editor.store';\n\n/**\n * Bridges an ancestor `dbxAction` to an ancestor {@link DbxPdfMergeEditorStore}: when the action's `triggered$` fires, the directive reads the latest `mergeOutput$` from the store and calls `source.readyValue(blob)` so the action handler runs with the merged PDF.\n *\n * Action-aware companion to {@link DbxPdfMergeUploadButtonDirective}, which is intentionally action-blind. Together with the stock `dbxActionButton`, all three compose on a single `<dbx-button>`:\n *\n * - `dbxActionButton` fires `source.trigger()` on click and reflects the action's working/disabled state on the button.\n * - `dbxPdfMergeUploadButton` opens the merge dialog and only allows the click to propagate if the user confirms.\n * - `dbxPdfMergeUploadAction` (this directive) listens for `triggered$` and supplies the store's merge output to the action.\n *\n * The trigger-then-readyValue ordering matches the canonical {@link DbxActionContextStoreSourceInstance.triggerWithValue} flow — `readyValue` is only honored after `trigger()` has moved the state out of `IDLE`, so listening to `triggered$` is what makes the value actually reach the handler.\n *\n * @example\n * ```html\n * <div dbxAction [dbxActionHandler]=\"handleUpload\">\n *   <div dbxPdfMergeEditorStore>\n *     <dbx-button text=\"Upload PDF\" raised color=\"primary\" dbxActionButton dbxPdfMergeUploadAction dbxPdfMergeUploadButton></dbx-button>\n *   </div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[dbxPdfMergeUploadAction]'\n})\nexport class DbxPdfMergeUploadActionDirective {\n  readonly source = inject<DbxActionContextStoreSourceInstance<Blob, unknown>>(DbxActionContextStoreSourceInstance);\n  readonly store = inject(DbxPdfMergeEditorStore);\n\n  constructor() {\n    cleanSubscriptionWithLockSet({\n      lockSet: this.source.lockSet,\n      sub: this.source.triggered$.pipe(switchMap(() => this.store.mergeOutput$.pipe(first()))).subscribe((blob) => {\n        this.source.readyValue(blob);\n      })\n    });\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { type DbxInjectionComponentConfig } from '@dereekb/dbx-core';\nimport { type Maybe, type PortNumber, type WebsiteUrl } from '@dereekb/util';\n\n// MARK: Server\n/**\n * An MCP server that users can connect an AI assistant to.\n */\nexport interface DbxMcpConnectServer {\n  /**\n   * The MCP server's Streamable HTTP endpoint url, e.g. `https://api.example.com/mcp`.\n   */\n  readonly url: WebsiteUrl;\n  /**\n   * Local key for the server, used in CLI commands and config files (e.g. `claude mcp add <name> ...`).\n   *\n   * Derived from the url's hostname when not set. See {@link dbxMcpConnectServerName}.\n   */\n  readonly name?: Maybe<string>;\n  /**\n   * Display name for the server, suggested as the connector name in the clients that ask for one.\n   *\n   * Defaults to the server's name.\n   */\n  readonly label?: Maybe<string>;\n  /**\n   * The pre-registered OAuth client the app's users sign in to the server with, used when a view is not given its own.\n   *\n   * Anything set here ships with the app, so a client secret here is visible to every user. Pass a per-user client to the view instead when the\n   * secret must stay private.\n   */\n  readonly oauthClient?: Maybe<DbxMcpConnectOAuthClient>;\n}\n\n/**\n * Optional app-level source of the {@link DbxMcpConnectServer} used by `dbx-mcp-connect-view` and `dbx-mcp-connect-button`\n * when no server is passed to them directly.\n *\n * `provideDbxFirebaseOidc()` in `@dereekb/dbx-firebase/oidc` provides this from the app's OIDC config.\n */\nexport const DBX_MCP_CONNECT_SERVER = new InjectionToken<DbxMcpConnectServer>('DbxMcpConnectServer');\n\n/**\n * Hostname prefixes removed before the server name is derived from a url's hostname.\n */\nconst DBX_MCP_CONNECT_SERVER_NAME_HOSTNAME_PREFIX_REGEX = /^(?:(?:api|www|mcp)\\.)+/;\n\n/**\n * Fallback server name used when the url cannot be parsed.\n */\nexport const DEFAULT_DBX_MCP_CONNECT_SERVER_NAME = 'mcp';\n\n/**\n * Returns the local key to use for the server in CLI commands and config files.\n *\n * Uses {@link DbxMcpConnectServer.name} when set. Otherwise derives it from the url's hostname by removing a leading `api.`, `www.`, or `mcp.`\n * and taking the first label, so `https://api.example.com/mcp` becomes `example` and `http://localhost:9901/mcp` becomes `localhost`.\n *\n * @param server - The server to name.\n * @returns The server's local key.\n */\nexport function dbxMcpConnectServerName(server: DbxMcpConnectServer): string {\n  let name = server.name;\n\n  if (!name) {\n    try {\n      const hostname = new URL(server.url).hostname.replace(DBX_MCP_CONNECT_SERVER_NAME_HOSTNAME_PREFIX_REGEX, '');\n      name = hostname.split('.')[0];\n    } catch {\n      name = undefined;\n    }\n  }\n\n  return name || DEFAULT_DBX_MCP_CONNECT_SERVER_NAME;\n}\n\n/**\n * Returns the display name to use for the server.\n *\n * @param server - The server to label.\n * @returns {@link DbxMcpConnectServer.label} When set, otherwise the server's name from {@link dbxMcpConnectServerName}.\n */\nexport function dbxMcpConnectServerLabel(server: DbxMcpConnectServer): string {\n  return server.label || dbxMcpConnectServerName(server);\n}\n\n// MARK: OAuth Client\n/**\n * Id of a pre-registered OAuth client.\n */\nexport type DbxMcpConnectOAuthClientId = string;\n\n/**\n * Secret of a pre-registered confidential OAuth client.\n */\nexport type DbxMcpConnectOAuthClientSecret = string;\n\n/**\n * A pre-registered OAuth client that an AI assistant signs in to the MCP server with.\n *\n * Needed when the server's authorization server does not offer dynamic client registration, which `@dereekb/firebase-server/oidc` turns off by\n * default. The client must allow the assistant's OAuth redirect URIs.\n */\nexport interface DbxMcpConnectOAuthClient {\n  /**\n   * The client id.\n   */\n  readonly clientId: DbxMcpConnectOAuthClientId;\n  /**\n   * The client secret, when it is known here. Omit for a public client that signs in with PKCE alone, or for a confidential client whose secret\n   * the user already has (set {@link confidential} then).\n   */\n  readonly clientSecret?: Maybe<DbxMcpConnectOAuthClientSecret>;\n  /**\n   * Whether the client signs in with a client secret. Defaults to whether {@link clientSecret} is set.\n   *\n   * Set it to true for a client whose secret is not known here, such as one shown only once when the client was created, so the instructions\n   * still ask the user for it instead of telling them to leave it blank.\n   */\n  readonly confidential?: Maybe<boolean>;\n}\n\n/**\n * Text shown in a snippet in place of a confidential client's secret when the secret is not known.\n */\nexport const DBX_MCP_CONNECT_CLIENT_SECRET_PLACEHOLDER = '<your client secret>';\n\n/**\n * Returns whether the OAuth client signs in with a client secret.\n *\n * @param oauthClient - The OAuth client.\n * @returns {@link DbxMcpConnectOAuthClient.confidential} When set, otherwise whether the client secret is set.\n */\nexport function isConfidentialDbxMcpConnectOAuthClient(oauthClient: DbxMcpConnectOAuthClient): boolean {\n  return oauthClient.confidential ?? Boolean(oauthClient.clientSecret);\n}\n\n// MARK: Client\n/**\n * Unique identifier of a {@link DbxMcpConnectClient}.\n */\nexport type DbxMcpConnectClientId = string;\n\n/**\n * A copyable command or config file shown with a client's instructions.\n */\nexport interface DbxMcpConnectClientInstructionsSnippet {\n  /**\n   * Describes what the snippet is and where it goes, e.g. \"Run in your terminal\".\n   */\n  readonly label: string;\n  /**\n   * The text to copy.\n   */\n  readonly text: string;\n}\n\n/**\n * A link shown with a client's instructions, such as a settings page or an install deeplink.\n */\nexport interface DbxMcpConnectClientInstructionsAction {\n  /**\n   * Button text.\n   */\n  readonly text: string;\n  /**\n   * Button icon.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Url opened in a new tab. May use an app's custom scheme, such as `cursor://` or `vscode:`.\n   */\n  readonly url: string;\n}\n\n/**\n * Instructions for connecting one client to an MCP server.\n *\n * Shown in order: the steps, the snippet, the injected component, then the action link.\n */\nexport interface DbxMcpConnectClientInstructions {\n  /**\n   * Short steps shown in order.\n   */\n  readonly steps?: Maybe<string[]>;\n  /**\n   * Copyable command or config file.\n   */\n  readonly snippet?: Maybe<DbxMcpConnectClientInstructionsSnippet>;\n  /**\n   * Link to the client's settings, or an install deeplink.\n   */\n  readonly action?: Maybe<DbxMcpConnectClientInstructionsAction>;\n  /**\n   * Custom content shown after the steps and snippet, such as a client that needs more than text to set up.\n   *\n   * Pass anything the component needs, such as the server or OAuth client from {@link DbxMcpConnectClientInstructionsParams}, as the config's\n   * `data`, which the component reads with `inject(DBX_INJECTION_COMPONENT_DATA)`.\n   */\n  readonly injection?: Maybe<DbxInjectionComponentConfig>;\n}\n\n/**\n * Params for {@link DbxMcpConnectClient.instructions}.\n */\nexport interface DbxMcpConnectClientInstructionsParams {\n  /**\n   * The server to connect to.\n   */\n  readonly server: DbxMcpConnectServer;\n  /**\n   * The pre-registered OAuth client to sign in with. When unset, the instructions assume the assistant registers itself.\n   */\n  readonly oauthClient?: Maybe<DbxMcpConnectOAuthClient>;\n}\n\n/**\n * An AI assistant that can connect to an MCP server, along with how to connect it./**\n * An AI assistant that can connect to an MCP server, along with how to connect it.\n *\n * Vendors move menus, so keep the steps short and override a client per instance when its steps go stale.\n */\nexport interface DbxMcpConnectClient {\n  readonly id: DbxMcpConnectClientId;\n  /**\n   * Display name, e.g. \"Claude Code\".\n   */\n  readonly label: string;\n  /**\n   * Optional icon shown next to the label.\n   */\n  readonly icon?: Maybe<string>;\n  /**\n   * Link to the vendor's documentation for connecting MCP servers.\n   */\n  readonly docsUrl?: Maybe<WebsiteUrl>;\n  /**\n   * Builds the connect instructions for the input server and OAuth client.\n   */\n  readonly instructions: (params: DbxMcpConnectClientInstructionsParams) => DbxMcpConnectClientInstructions;\n}\n\n/**\n * Claude on the web, Desktop, and mobile, connected through a custom connector.\n */\nexport const CLAUDE_DBX_MCP_CONNECT_CLIENT: DbxMcpConnectClient = {\n  id: 'claude',\n  label: 'Claude',\n  docsUrl: 'https://claude.com/docs/connectors/custom/add-unlisted',\n  instructions: ({ server, oauthClient }) => {\n    const steps = ['In Claude, open Customize > Connectors.', `Click Add custom connector, enter a name such as \"${dbxMcpConnectServerLabel(server)}\", and paste the MCP server URL.`];\n\n    if (oauthClient) {\n      steps.push(isConfidentialDbxMcpConnectOAuthClient(oauthClient) ? 'Open Advanced settings, or choose Use your own OAuth client, and paste the client ID and client secret.' : 'Open Advanced settings, or choose Use your own OAuth client, and paste the client ID. Leave the client secret blank.');\n    }\n\n    steps.push('Click Add, then Connect and sign in.');\n\n    return {\n      steps,\n      action: { text: 'Open Claude connectors', icon: 'open_in_new', url: 'https://claude.ai/customize/connectors' }\n    };\n  }\n};\n\n/**\n * Port Claude Code listens on for the OAuth callback when it signs in with a pre-registered OAuth client.\n */\nexport const DEFAULT_CLAUDE_CODE_DBX_MCP_CONNECT_CALLBACK_PORT: PortNumber = 8080;\n\n/**\n * Config for {@link makeClaudeCodeDbxMcpConnectClient}.\n */\nexport interface ClaudeCodeDbxMcpConnectClientConfig {\n  /**\n   * Port Claude Code listens on for the OAuth callback when it signs in with a pre-registered OAuth client. Claude Code otherwise picks a\n   * random port, which a client registered with an exact `http://localhost:<port>/callback` redirect URI rejects.\n   *\n   * Defaults to {@link DEFAULT_CLAUDE_CODE_DBX_MCP_CONNECT_CALLBACK_PORT}.\n   */\n  readonly callbackPort?: Maybe<PortNumber>;\n}\n\n/**\n * Creates a Claude Code client, connected with the `claude mcp add` command.\n *\n * With a pre-registered OAuth client, the command passes `--client-id`, `--client-secret` (Claude Code then asks for the secret, so it never\n * appears in the command), and `--callback-port`. The OAuth client must allow `http://localhost:<callbackPort>/callback`.\n *\n * @param config - Optional config, such as the OAuth callback port.\n * @returns The Claude Code client.\n */\nexport function makeClaudeCodeDbxMcpConnectClient(config?: Maybe<ClaudeCodeDbxMcpConnectClientConfig>): DbxMcpConnectClient {\n  const callbackPort = config?.callbackPort ?? DEFAULT_CLAUDE_CODE_DBX_MCP_CONNECT_CALLBACK_PORT;\n\n  return {\n    id: 'claude-code',\n    label: 'Claude Code',\n    docsUrl: 'https://code.claude.com/docs/en/mcp',\n    instructions: ({ server, oauthClient }) => {\n      const name = dbxMcpConnectServerName(server);\n      const commandParts = ['claude mcp add --transport http'];\n\n      if (oauthClient) {\n        commandParts.push(`--client-id ${oauthClient.clientId}`);\n\n        if (isConfidentialDbxMcpConnectOAuthClient(oauthClient)) {\n          commandParts.push('--client-secret');\n        }\n\n        commandParts.push(`--callback-port ${callbackPort}`);\n      }\n\n      commandParts.push(name, server.url);\n\n      return {\n        steps: [\n          oauthClient && isConfidentialDbxMcpConnectOAuthClient(oauthClient) ? 'Run the command below in your terminal, and paste the client secret when it asks.' : 'Run the command below in your terminal.',\n          `In Claude Code, run /mcp, select \"${name}\", and choose Authenticate.`,\n          'Sign in when your browser opens.'\n        ],\n        snippet: { label: 'Run in your terminal', text: commandParts.join(' ') }\n      };\n    }\n  };\n}\n\n/**\n * Claude Code, connected with the `claude mcp add` command. Uses {@link DEFAULT_CLAUDE_CODE_DBX_MCP_CONNECT_CALLBACK_PORT}.\n */\nexport const CLAUDE_CODE_DBX_MCP_CONNECT_CLIENT: DbxMcpConnectClient = makeClaudeCodeDbxMcpConnectClient();\n\n/**\n * ChatGPT on the web, connected as a custom MCP server.\n */\nexport const CHATGPT_DBX_MCP_CONNECT_CLIENT: DbxMcpConnectClient = {\n  id: 'chatgpt',\n  label: 'ChatGPT',\n  docsUrl: 'https://developers.openai.com/api/docs/guides/custom-mcp-server',\n  instructions: ({ server, oauthClient }) => {\n    let authStep = 'Choose OAuth authentication and accept the warning.';\n\n    if (oauthClient) {\n      authStep = isConfidentialDbxMcpConnectOAuthClient(oauthClient)\n        ? 'Choose OAuth, open the advanced OAuth settings, choose User-Defined OAuth Client, and paste the client ID and client secret.'\n        : 'Choose OAuth, open the advanced OAuth settings, choose User-Defined OAuth Client, paste the client ID, and set the token endpoint auth method to none.';\n    }\n\n    return {\n      steps: ['In ChatGPT on the web, open Plugins.', `Click +, choose Add custom MCP server, enter a name such as \"${dbxMcpConnectServerLabel(server)}\", and paste the MCP server URL.`, authStep, 'Select Create, and sign in.'],\n      action: { text: 'Open ChatGPT plugins', icon: 'open_in_new', url: 'https://chatgpt.com/plugins' }\n    };\n  }\n};\n\n/**\n * Returns the Cursor deeplink that installs the server.\n *\n * @param server - The server to install.\n * @returns A `cursor://anysphere.cursor-deeplink/mcp/install` url with the server's name and base64-encoded config.\n */\nexport function cursorDbxMcpConnectInstallUrl(server: DbxMcpConnectServer): string {\n  const config = btoa(JSON.stringify({ url: server.url }));\n  return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(dbxMcpConnectServerName(server))}&config=${encodeURIComponent(config)}`;\n}\n\n/**\n * Cursor, connected with an install deeplink or its `mcp.json` file.\n *\n * A pre-registered OAuth client goes in the `mcp.json` file's `auth` object. The deeplink is left out then, since Cursor only documents it for a\n * server url and a link should not carry a client secret.\n */\nexport const CURSOR_DBX_MCP_CONNECT_CLIENT: DbxMcpConnectClient = {\n  id: 'cursor',\n  label: 'Cursor',\n  docsUrl: 'https://cursor.com/docs/mcp',\n  instructions: ({ server, oauthClient }) => {\n    const name = dbxMcpConnectServerName(server);\n    const confidential = oauthClient != null && isConfidentialDbxMcpConnectOAuthClient(oauthClient);\n    const clientSecretUnknown = confidential && !oauthClient?.clientSecret;\n    // JSON.stringify() drops the undefined values\n    const auth = oauthClient ? { CLIENT_ID: oauthClient.clientId, CLIENT_SECRET: confidential ? (oauthClient.clientSecret ?? DBX_MCP_CONNECT_CLIENT_SECRET_PLACEHOLDER) : undefined } : undefined;\n    const config = { mcpServers: { [name]: { url: server.url, auth } } };\n    let firstStep = 'Click Add to Cursor, or add the config below to ~/.cursor/mcp.json.';\n\n    if (clientSecretUnknown) {\n      firstStep = `Add the config below to ~/.cursor/mcp.json, replacing ${DBX_MCP_CONNECT_CLIENT_SECRET_PLACEHOLDER} with your client secret.`;\n    } else if (oauthClient) {\n      firstStep = 'Add the config below to ~/.cursor/mcp.json.';\n    }\n\n    return {\n      steps: [firstStep, `In Cursor Settings > MCP, find \"${name}\" and click Connect.`, 'Sign in when your browser opens.'],\n      snippet: { label: '~/.cursor/mcp.json', text: JSON.stringify(config, null, 2) },\n      action: oauthClient ? undefined : { text: 'Add to Cursor', icon: 'download', url: cursorDbxMcpConnectInstallUrl(server) }\n    };\n  }\n};\n\n/**\n * Returns the VS Code url that installs the server.\n *\n * @param server - The server to install.\n * @returns A `vscode:mcp/install` url with the server's url-encoded JSON config.\n */\nexport function vscodeDbxMcpConnectInstallUrl(server: DbxMcpConnectServer): string {\n  const config = { name: dbxMcpConnectServerName(server), type: 'http', url: server.url };\n  return `vscode:mcp/install?${encodeURIComponent(JSON.stringify(config))}`;\n}\n\n/**\n * VS Code (GitHub Copilot agent mode), connected with an install link or a `.vscode/mcp.json` file.\n *\n * A pre-registered OAuth client's id goes in the `mcp.json` file's `oauth` object, and VS Code stores its secret through the Set Client Secret\n * action above the server entry. The install link is left out then.\n */\nexport const VSCODE_DBX_MCP_CONNECT_CLIENT: DbxMcpConnectClient = {\n  id: 'vscode',\n  label: 'VS Code',\n  docsUrl: 'https://code.visualstudio.com/docs/agent-customization/mcp-servers',\n  instructions: ({ server, oauthClient }) => {\n    const name = dbxMcpConnectServerName(server);\n    // JSON.stringify() drops the undefined oauth value\n    const config = { servers: { [name]: { type: 'http', url: server.url, oauth: oauthClient ? { clientId: oauthClient.clientId } : undefined } } };\n    const steps = [oauthClient ? 'Add the config below to .vscode/mcp.json in your workspace.' : 'Click Install in VS Code, or add the config below to .vscode/mcp.json in your workspace.'];\n\n    if (oauthClient && isConfidentialDbxMcpConnectOAuthClient(oauthClient)) {\n      steps.push('Click Set Client Secret above the server entry and paste the client secret.');\n    }\n\n    steps.push(`Start the \"${name}\" server and sign in when VS Code asks.`, 'Use its tools from Copilot Chat in agent mode.');\n\n    return {\n      steps,\n      snippet: { label: '.vscode/mcp.json', text: JSON.stringify(config, null, 2) },\n      action: oauthClient ? undefined : { text: 'Install in VS Code', icon: 'download', url: vscodeDbxMcpConnectInstallUrl(server) }\n    };\n  }\n};\n\n/**\n * Grok, connected through a custom connector. Not part of {@link DEFAULT_DBX_MCP_CONNECT_CLIENTS}.\n *\n * Grok's connectors do not take a pre-registered OAuth client, so with one configured the steps say that Grok must register itself.\n */\nexport const GROK_DBX_MCP_CONNECT_CLIENT: DbxMcpConnectClient = {\n  id: 'grok',\n  label: 'Grok',\n  docsUrl: 'https://docs.x.ai/grok/connectors',\n  instructions: ({ oauthClient }) => {\n    const steps = ['In Grok, open Connectors.', 'Click New Connector, choose Custom, and paste the MCP server URL.', 'Sign in when asked.'];\n\n    if (oauthClient) {\n      steps.push('Grok cannot use a client ID, so it can only sign in if this server lets it register itself.');\n    }\n\n    return {\n      steps,\n      action: { text: 'Open Grok connectors', icon: 'open_in_new', url: 'https://grok.com/connectors' }\n    };\n  }\n};\n\n/**\n * Clients shown by `dbx-mcp-connect-view` when none are configured.\n */\nexport const DEFAULT_DBX_MCP_CONNECT_CLIENTS: DbxMcpConnectClient[] = [CLAUDE_DBX_MCP_CONNECT_CLIENT, CLAUDE_CODE_DBX_MCP_CONNECT_CLIENT, CHATGPT_DBX_MCP_CONNECT_CLIENT, CURSOR_DBX_MCP_CONNECT_CLIENT, VSCODE_DBX_MCP_CONNECT_CLIENT];\n","import { inject, Injectable, signal } from '@angular/core';\nimport { type ArrayOrValue, asArray, type Maybe } from '@dereekb/util';\nimport { DEFAULT_DBX_MCP_CONNECT_CLIENTS, type DbxMcpConnectClient, type DbxMcpConnectClientId } from './mcp.connect';\n\n/**\n * App-level config for {@link DbxMcpConnectService}. Provide it with `provideDbxMcpConnectService()`.\n */\nexport abstract class DbxMcpConnectServiceConfig {\n  /**\n   * Clients shown by `dbx-mcp-connect-view` and `dbx-mcp-connect-button` when they are not given their own, in display order.\n   *\n   * Defaults to {@link DEFAULT_DBX_MCP_CONNECT_CLIENTS}. Leave a client out to hide it, or add your own.\n   */\n  abstract readonly clients?: Maybe<DbxMcpConnectClient[]>;\n  /**\n   * Id of the client selected at first when a view is not given its own. Defaults to the first client.\n   */\n  abstract readonly defaultClientId?: Maybe<DbxMcpConnectClientId>;\n}\n\n/**\n * App-level source of the AI assistants that `dbx-mcp-connect-view` and `dbx-mcp-connect-button` show when they are not given their own.\n *\n * Starts from {@link DbxMcpConnectServiceConfig}, and can be changed at runtime, such as by a feature that registers its own client. The view\n * follows the changes. Provide it with `provideDbxMcpConnectService()`. Without it, the view shows {@link DEFAULT_DBX_MCP_CONNECT_CLIENTS}.\n */\n@Injectable()\nexport class DbxMcpConnectService {\n  private readonly _config = inject(DbxMcpConnectServiceConfig, { optional: true });\n\n  private readonly _clients = signal<DbxMcpConnectClient[]>(this._config?.clients ?? DEFAULT_DBX_MCP_CONNECT_CLIENTS);\n  private readonly _defaultClientId = signal<Maybe<DbxMcpConnectClientId>>(this._config?.defaultClientId);\n\n  /**\n   * The app's clients, in display order.\n   */\n  readonly clientsSignal = this._clients.asReadonly();\n\n  /**\n   * Id of the client selected at first, if set.\n   */\n  readonly defaultClientIdSignal = this._defaultClientId.asReadonly();\n\n  /**\n   * Replaces the app's clients.\n   *\n   * @param clients - The clients to show, in display order.\n   */\n  setClients(clients: DbxMcpConnectClient[]): void {\n    this._clients.set(clients);\n  }\n\n  /**\n   * Adds clients to the end of the list. A client whose id is already registered replaces the existing one in place.\n   *\n   * @param clients - The client or clients to add.\n   */\n  registerClients(clients: ArrayOrValue<DbxMcpConnectClient>): void {\n    const added = asArray(clients);\n    const addedById = new Map(added.map((x) => [x.id, x]));\n\n    this._clients.update((current) => {\n      const replaced = current.map((x) => addedById.get(x.id) ?? x);\n      const currentIds = new Set(current.map((x) => x.id));\n      return [...replaced, ...added.filter((x) => !currentIds.has(x.id))];\n    });\n  }\n\n  /**\n   * Removes clients from the list, hiding them.\n   *\n   * @param clientIds - Id or ids of the clients to remove.\n   */\n  unregisterClients(clientIds: ArrayOrValue<DbxMcpConnectClientId>): void {\n    const removedIds = new Set(asArray(clientIds));\n    this._clients.update((current) => current.filter((x) => !removedIds.has(x.id)));\n  }\n\n  /**\n   * Sets the id of the client selected at first.\n   *\n   * @param clientId - The client id, or undefined to select the first client.\n   */\n  setDefaultClientId(clientId: Maybe<DbxMcpConnectClientId>): void {\n    this._defaultClientId.set(clientId);\n  }\n}\n","import { type EnvironmentProviders, makeEnvironmentProviders, type Provider } from '@angular/core';\nimport { type Maybe } from '@dereekb/util';\nimport { DBX_MCP_CONNECT_SERVER, type DbxMcpConnectClient, type DbxMcpConnectClientId, type DbxMcpConnectServer } from './mcp.connect';\nimport { DbxMcpConnectService, DbxMcpConnectServiceConfig } from './mcp.connect.service';\n\n/**\n * Config for {@link provideDbxMcpConnectService}.\n */\nexport interface ProvideDbxMcpConnectServiceConfig {\n  /**\n   * The app's MCP server, provided as {@link DBX_MCP_CONNECT_SERVER}.\n   *\n   * Leave unset in apps that call `provideDbxFirebaseOidc()`, which provides the server from the app's OIDC config.\n   */\n  readonly server?: Maybe<DbxMcpConnectServer>;\n  /**\n   * The app's clients, in display order. See {@link DbxMcpConnectServiceConfig.clients}.\n   */\n  readonly clients?: Maybe<DbxMcpConnectClient[]>;\n  /**\n   * Id of the client selected at first. See {@link DbxMcpConnectServiceConfig.defaultClientId}.\n   */\n  readonly defaultClientId?: Maybe<DbxMcpConnectClientId>;\n}\n\n/**\n * Creates EnvironmentProviders for {@link DbxMcpConnectService}, which sets the AI assistants that `dbx-mcp-connect-view` and\n * `dbx-mcp-connect-button` show across the app.\n *\n * @param config - Optional app-level config.\n * @returns EnvironmentProviders.\n *\n * @example\n * ```ts\n * provideDbxMcpConnectService({ clients: [...DEFAULT_DBX_MCP_CONNECT_CLIENTS, GROK_DBX_MCP_CONNECT_CLIENT], defaultClientId: 'claude-code' })\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function provideDbxMcpConnectService(config?: ProvideDbxMcpConnectServiceConfig): EnvironmentProviders {\n  const providers: Provider[] = [DbxMcpConnectService];\n\n  if (config) {\n    const serviceConfig: DbxMcpConnectServiceConfig = { clients: config.clients, defaultClientId: config.defaultClientId };\n    providers.push({ provide: DbxMcpConnectServiceConfig, useValue: serviceConfig });\n\n    if (config.server) {\n      providers.push({ provide: DBX_MCP_CONNECT_SERVER, useValue: config.server });\n    }\n  }\n\n  return makeEnvironmentProviders(providers);\n}\n","import { Component, computed, inject, input, linkedSignal, signal } from '@angular/core';\nimport { MatButtonToggle, type MatButtonToggleChange, MatButtonToggleGroup } from '@angular/material/button-toggle';\nimport { MatIconModule } from '@angular/material/icon';\nimport { type ClickableUrl, clickableUrlInNewTab, DbxInjectionComponent } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig } from '../../util/clipboard';\nimport { DbxClickToCopyTextComponent } from '../../layout/text/copy.text.component';\nimport { DbxClickToCopyFieldComponent, DEFAULT_DBX_CLICK_TO_COPY_FIELD_HIDDEN_TEXT } from '../../layout/text/copy.field.component';\nimport { DbxStepBlockComponent } from '../../layout/text/step.block.component';\nimport { DbxAnchorComponent } from '../../router/layout/anchor/anchor.component';\nimport { DBX_MCP_CONNECT_SERVER, DEFAULT_DBX_MCP_CONNECT_CLIENTS, type DbxMcpConnectClient, type DbxMcpConnectClientId, type DbxMcpConnectOAuthClient, type DbxMcpConnectServer, isConfidentialDbxMcpConnectOAuthClient } from './mcp.connect';\nimport { DbxMcpConnectService } from './mcp.connect.service';\n\n/**\n * Hint shown above the MCP server url by {@link DbxMcpConnectViewComponent} when no hint is configured.\n */\nexport const DEFAULT_DBX_MCP_CONNECT_VIEW_HINT = 'Add this server to your AI assistant, then sign in to give it access to your account.';\n\n/**\n * Config for {@link DbxMcpConnectViewComponent}. The component's individual inputs take precedence.\n */\nexport interface DbxMcpConnectViewConfig {\n  /**\n   * The server to connect to. Defaults to the server provided by {@link DBX_MCP_CONNECT_SERVER}.\n   */\n  readonly server?: Maybe<DbxMcpConnectServer>;\n  /**\n   * The pre-registered OAuth client the assistant signs in with. Its id and secret are shown with the server url and used in each client's\n   * instructions. Defaults to the server's {@link DbxMcpConnectServer.oauthClient}.\n   *\n   * Leave unset when the server offers dynamic client registration and the assistants register themselves.\n   */\n  readonly oauthClient?: Maybe<DbxMcpConnectOAuthClient>;\n  /**\n   * Clients to show instructions for, in display order. Defaults to the app's clients from {@link DbxMcpConnectService}, or\n   * {@link DEFAULT_DBX_MCP_CONNECT_CLIENTS} when the app does not provide the service.\n   */\n  readonly clients?: Maybe<DbxMcpConnectClient[]>;\n  /**\n   * Id of the client selected at first. Defaults to the app's default client from {@link DbxMcpConnectService}, then the first client.\n   */\n  readonly defaultClientId?: Maybe<DbxMcpConnectClientId>;\n  /**\n   * Hint shown above the server url. Defaults to {@link DEFAULT_DBX_MCP_CONNECT_VIEW_HINT}. Pass an empty string to hide it.\n   */\n  readonly hint?: Maybe<string>;\n}\n\n/**\n * Shows an MCP server's url and short instructions for connecting AI assistants, such as Claude, Claude Code, ChatGPT, Cursor, and VS Code, to it.\n *\n * The server comes from the `server` input, then the `config` input, then the app's {@link DBX_MCP_CONNECT_SERVER}. Apps that call\n * `provideDbxFirebaseOidc()` provide that token, so the view needs no inputs there.\n *\n * The clients come from the `clients` input, then the `config` input, then the app's {@link DbxMcpConnectService} from\n * `provideDbxMcpConnectService()`, then {@link DEFAULT_DBX_MCP_CONNECT_CLIENTS}.\n *\n * Pass an `oauthClient` when the assistants must sign in with a pre-registered OAuth client. The view then shows its client id and secret,\n * hiding the secret until the user reveals it, and each client's instructions say where to enter them.\n *\n * @dbxWebComponent\n * @dbxWebSlug mcp-connect-view\n * @dbxWebCategory misc\n * @dbxWebRelated mcp-connect-button, click-to-copy-text\n * @dbxWebMinimalExample ```html\n * <dbx-mcp-connect-view></dbx-mcp-connect-view>\n * ```\n *\n * @example\n * ```html\n * <dbx-mcp-connect-view [server]=\"{ url: 'https://api.example.com/mcp', label: 'Example' }\" [oauthClient]=\"{ clientId: 'abc123' }\" [clients]=\"clients\"></dbx-mcp-connect-view>\n * ```\n */\n@Component({\n  selector: 'dbx-mcp-connect-view',\n  template: `\n    @if (hintSignal()) {\n      <p class=\"dbx-mcp-connect-view-hint\">{{ hintSignal() }}</p>\n    }\n    <div class=\"dbx-mcp-connect-view-label dbx-text-label-medium\">MCP server URL</div>\n    @if (serverSignal(); as server) {\n      <dbx-click-to-copy-field icon=\"link\" [monospace]=\"true\" [text]=\"server.url\" [clipboardSnackbarMessagesConfig]=\"urlClipboardSnackbarMessagesConfig\"></dbx-click-to-copy-field>\n      @if (oauthClientSignal(); as oauthClient) {\n        <div class=\"dbx-mcp-connect-view-label dbx-text-label-medium\">Client ID</div>\n        <dbx-click-to-copy-field icon=\"key\" [monospace]=\"true\" [text]=\"oauthClient.clientId\" [clipboardSnackbarMessagesConfig]=\"clientIdClipboardSnackbarMessagesConfig\"></dbx-click-to-copy-field>\n        @if (oauthClient.clientSecret; as clientSecret) {\n          <div class=\"dbx-mcp-connect-view-label dbx-text-label-medium\">Client secret</div>\n          <dbx-click-to-copy-field icon=\"lock\" [monospace]=\"true\" [secret]=\"true\" [(revealed)]=\"showSecretSignal\" [text]=\"clientSecret\" [clipboardSnackbarMessagesConfig]=\"clientSecretClipboardSnackbarMessagesConfig\"></dbx-click-to-copy-field>\n        } @else if (oauthClientConfidentialSignal()) {\n          <div class=\"dbx-mcp-connect-view-label dbx-text-label-medium\">Client secret</div>\n          <div class=\"dbx-mcp-connect-view-note dbx-hint\">Use the client secret you saved for this client. It is not shown here.</div>\n        }\n      }\n    } @else {\n      <div class=\"dbx-mcp-connect-view-note dbx-hint\">No MCP server is configured for this app.</div>\n    }\n    @if (serverSignal() && selectedClientSignal(); as client) {\n      <div class=\"dbx-mcp-connect-view-label dbx-mcp-connect-view-clients-label dbx-text-label-medium\">Choose your assistant</div>\n      <div class=\"dbx-mcp-connect-view-clients\">\n        <mat-button-toggle-group [value]=\"client.id\" (change)=\"onClientChange($event)\" aria-label=\"AI assistant\" hideSingleSelectionIndicator>\n          @for (option of clientsSignal(); track option.id) {\n            <mat-button-toggle [value]=\"option.id\">\n              @if (option.icon) {\n                <mat-icon aria-hidden=\"true\">{{ option.icon }}</mat-icon>\n              }\n              {{ option.label }}\n            </mat-button-toggle>\n          }\n        </mat-button-toggle-group>\n      </div>\n      @if (instructionsSignal(); as instructions) {\n        <div class=\"dbx-mcp-connect-view-instructions\">\n          @for (step of instructions.steps ?? []; track $index) {\n            <dbx-step-block [step]=\"$index + 1\" [header]=\"step\"></dbx-step-block>\n          }\n          @if (instructions.snippet; as snippet) {\n            <div class=\"dbx-mcp-connect-view-label dbx-text-label-medium\">{{ snippet.label }}</div>\n            <dbx-click-to-copy-text class=\"dbx-mcp-connect-view-snippet\" [copyText]=\"snippet.text\" [clipboardSnackbarMessagesConfig]=\"snippetClipboardSnackbarMessagesConfig\">\n              <pre>{{ snippetDisplayTextSignal() }}</pre>\n            </dbx-click-to-copy-text>\n          }\n          @if (instructions.injection; as injection) {\n            <dbx-injection class=\"dbx-mcp-connect-view-injection\" [config]=\"injection\"></dbx-injection>\n          }\n          @if (actionAnchorSignal() || client.docsUrl) {\n            <div class=\"dbx-mcp-connect-view-actions\">\n              @if (actionAnchorSignal(); as actionAnchor) {\n                <dbx-anchor [anchor]=\"actionAnchor\">\n                  <dbx-button flat color=\"primary\" [text]=\"instructions.action?.text\" [icon]=\"instructions.action?.icon\"></dbx-button>\n                </dbx-anchor>\n              }\n              @if (client.docsUrl) {\n                <a class=\"dbx-mcp-connect-view-docs-link dbx-text-label-large\" [href]=\"client.docsUrl\" target=\"_blank\" rel=\"noopener\">\n                  {{ client.label }} docs\n                  <mat-icon aria-hidden=\"true\">open_in_new</mat-icon>\n                </a>\n              }\n            </div>\n          }\n        </div>\n      }\n    }\n  `,\n  host: {\n    class: 'd-block dbx-mcp-connect-view'\n  },\n  imports: [MatButtonToggleGroup, MatButtonToggle, MatIconModule, DbxClickToCopyTextComponent, DbxClickToCopyFieldComponent, DbxStepBlockComponent, DbxInjectionComponent, DbxAnchorComponent, DbxButtonComponent]\n})\nexport class DbxMcpConnectViewComponent {\n  private readonly _defaultServer = inject(DBX_MCP_CONNECT_SERVER, { optional: true });\n  private readonly _mcpConnectService = inject(DbxMcpConnectService, { optional: true });\n\n  readonly config = input<Maybe<DbxMcpConnectViewConfig>>();\n\n  readonly server = input<Maybe<DbxMcpConnectServer>>();\n  readonly oauthClient = input<Maybe<DbxMcpConnectOAuthClient>>();\n  readonly clients = input<Maybe<DbxMcpConnectClient[]>>();\n  readonly defaultClientId = input<Maybe<DbxMcpConnectClientId>>();\n  readonly hint = input<Maybe<string>>();\n\n  readonly urlClipboardSnackbarMessagesConfig: CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig = {\n    successMessage: 'Copied the MCP server URL.'\n  };\n\n  readonly clientIdClipboardSnackbarMessagesConfig: CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig = {\n    successMessage: 'Copied the client ID.'\n  };\n\n  readonly clientSecretClipboardSnackbarMessagesConfig: CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig = {\n    successMessage: 'Copied the client secret.'\n  };\n\n  readonly snippetClipboardSnackbarMessagesConfig: CopyToClipboardFunctionWithSnackbarMessageSnackbarConfig = {\n    successMessage: 'Copied to clipboard.'\n  };\n\n  readonly serverSignal = computed(() => {\n    const config = this.config();\n    return this.server() ?? config?.server ?? this._defaultServer;\n  });\n\n  readonly oauthClientSignal = computed(() => {\n    const server = this.serverSignal();\n    const config = this.config();\n    return this.oauthClient() ?? config?.oauthClient ?? server?.oauthClient;\n  });\n\n  /**\n   * Whether the OAuth client signs in with a client secret, including one that is not known here.\n   */\n  readonly oauthClientConfidentialSignal = computed(() => {\n    const oauthClient = this.oauthClientSignal();\n    return oauthClient ? isConfidentialDbxMcpConnectOAuthClient(oauthClient) : false;\n  });\n\n  readonly clientsSignal = computed(() => {\n    const config = this.config();\n    return this.clients() ?? config?.clients ?? this._mcpConnectService?.clientsSignal() ?? DEFAULT_DBX_MCP_CONNECT_CLIENTS;\n  });\n\n  readonly hintSignal = computed(() => {\n    const config = this.config();\n    return this.hint() ?? config?.hint ?? DEFAULT_DBX_MCP_CONNECT_VIEW_HINT;\n  });\n\n  /**\n   * Whether the client secret is shown, both in its field and inside snippets. Hidden at first, and toggled by the secret field.\n   */\n  readonly showSecretSignal = signal(false);\n\n  /**\n   * Id of the selected client. Starts from the `defaultClientId` input, the config, or the app's {@link DbxMcpConnectService}, then follows the\n   * toggle.\n   */\n  readonly selectedClientIdSignal = linkedSignal<Maybe<DbxMcpConnectClientId>>(() => this.defaultClientId() ?? this.config()?.defaultClientId ?? this._mcpConnectService?.defaultClientIdSignal());\n\n  readonly selectedClientSignal = computed(() => {\n    const clients = this.clientsSignal();\n    const selectedClientId = this.selectedClientIdSignal();\n    return clients.find((x) => x.id === selectedClientId) ?? clients[0];\n  });\n\n  readonly instructionsSignal = computed(() => {\n    const oauthClient = this.oauthClientSignal();\n    const server = this.serverSignal();\n    const client = this.selectedClientSignal();\n    return server && client ? client.instructions({ server, oauthClient: oauthClient }) : undefined;\n  });\n\n  /**\n   * The snippet as displayed, with the client secret hidden until the user reveals it. Copying the snippet always copies the real text.\n   */\n  readonly snippetDisplayTextSignal = computed(() => {\n    const showSecret = this.showSecretSignal();\n    const text = this.instructionsSignal()?.snippet?.text;\n    const clientSecret = this.oauthClientSignal()?.clientSecret;\n    return text && clientSecret && !showSecret ? text.replaceAll(clientSecret, DEFAULT_DBX_CLICK_TO_COPY_FIELD_HIDDEN_TEXT) : text;\n  });\n\n  readonly actionAnchorSignal = computed<Maybe<ClickableUrl>>(() => {\n    const action = this.instructionsSignal()?.action;\n    return action ? clickableUrlInNewTab(action.url) : undefined;\n  });\n\n  onClientChange(event: MatButtonToggleChange): void {\n    this.selectedClientIdSignal.set(event.value as DbxMcpConnectClientId);\n  }\n}\n","import { Component, computed } from '@angular/core';\nimport { type MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { type Maybe } from '@dereekb/util';\nimport { AbstractDialogDirective } from '../../interaction/dialog/abstract.dialog.directive';\nimport { DbxDialogModule } from '../../interaction/dialog/dialog.module';\nimport { DbxMcpConnectViewComponent, type DbxMcpConnectViewConfig } from './mcp.connect.view.component';\n\n/**\n * Header shown by {@link DbxMcpConnectDialogComponent} when no header is configured.\n */\nexport const DEFAULT_DBX_MCP_CONNECT_DIALOG_HEADER = 'Connect an AI assistant';\n\n/**\n * Width {@link DbxMcpConnectDialogComponent} opens at. Material narrows it on small screens.\n */\nexport const DBX_MCP_CONNECT_DIALOG_WIDTH = '600px';\n\n/**\n * Config for {@link DbxMcpConnectDialogComponent}.\n */\nexport interface DbxMcpConnectDialogConfig extends DbxMcpConnectViewConfig {\n  /**\n   * Dialog header. Defaults to {@link DEFAULT_DBX_MCP_CONNECT_DIALOG_HEADER}.\n   */\n  readonly header?: Maybe<string>;\n}\n\n/**\n * Dialog that shows a {@link DbxMcpConnectViewComponent}: the app's MCP server url and how to connect AI assistants to it.\n *\n * Usually opened by `dbx-mcp-connect-button`.\n */\n@Component({\n  template: `\n    <dbx-dialog-content>\n      <dbx-dialog-content-close (close)=\"close()\"></dbx-dialog-content-close>\n      <h3>{{ headerSignal() }}</h3>\n      <dbx-mcp-connect-view [config]=\"data\"></dbx-mcp-connect-view>\n      <dbx-dialog-content-footer (close)=\"close()\"></dbx-dialog-content-footer>\n    </dbx-dialog-content>\n  `,\n  imports: [DbxDialogModule, DbxMcpConnectViewComponent]\n})\nexport class DbxMcpConnectDialogComponent extends AbstractDialogDirective<unknown, Maybe<DbxMcpConnectDialogConfig>> {\n  readonly headerSignal = computed(() => this.data?.header ?? DEFAULT_DBX_MCP_CONNECT_DIALOG_HEADER);\n\n  static openDialog(matDialog: MatDialog, config?: Maybe<DbxMcpConnectDialogConfig>): MatDialogRef<DbxMcpConnectDialogComponent> {\n    // fixed so the dialog does not resize as the selected client's instructions change\n    return matDialog.open(DbxMcpConnectDialogComponent, {\n      width: DBX_MCP_CONNECT_DIALOG_WIDTH,\n      data: config\n    });\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { MatDialog, type MatDialogRef } from '@angular/material/dialog';\nimport { type DbxButtonDisplay } from '@dereekb/dbx-core';\nimport { type Maybe } from '@dereekb/util';\nimport { DbxButtonComponent } from '../../button/button.component';\nimport { type DbxButtonStyle } from '../../button/button';\nimport { DbxMcpConnectDialogComponent, type DbxMcpConnectDialogConfig } from './mcp.connect.dialog.component';\n\n/**\n * Button display used by {@link DbxMcpConnectButtonComponent} when no display is configured.\n */\nexport const DEFAULT_DBX_MCP_CONNECT_BUTTON_DISPLAY: DbxButtonDisplay = { icon: 'smart_toy', text: 'Connect AI assistant' };\n\n/**\n * Config for {@link DbxMcpConnectButtonComponent}, combining the dialog config with button display and style options.\n */\nexport interface DbxMcpConnectButtonConfig extends DbxMcpConnectDialogConfig {\n  /**\n   * The display configuration for the button. Defaults to {@link DEFAULT_DBX_MCP_CONNECT_BUTTON_DISPLAY}.\n   */\n  readonly buttonDisplay?: Maybe<DbxButtonDisplay>;\n  /**\n   * The style configuration for the button.\n   */\n  readonly buttonStyle?: Maybe<DbxButtonStyle>;\n}\n\n/**\n * Drop-in button that opens a dialog with the app's MCP server url and how to connect AI assistants to it.\n *\n * Needs no config in apps that call `provideDbxFirebaseOidc()`, which provides the server url. Otherwise, provide\n * `DBX_MCP_CONNECT_SERVER` or pass a server in the config.\n *\n * @dbxWebComponent\n * @dbxWebSlug mcp-connect-button\n * @dbxWebCategory button\n * @dbxWebRelated mcp-connect-view\n * @dbxWebMinimalExample ```html\n * <dbx-mcp-connect-button></dbx-mcp-connect-button>\n * ```\n *\n * @example\n * ```html\n * <dbx-mcp-connect-button [config]=\"{ server: { url: 'https://api.example.com/mcp' }, buttonStyle: { type: 'raised', color: 'primary' } }\"></dbx-mcp-connect-button>\n * ```\n */\n@Component({\n  selector: 'dbx-mcp-connect-button',\n  template: `\n    <dbx-button (buttonClick)=\"openDialog()\" [buttonStyle]=\"buttonStyleSignal()\" [buttonDisplay]=\"buttonDisplaySignal()\"></dbx-button>\n  `,\n  imports: [DbxButtonComponent]\n})\nexport class DbxMcpConnectButtonComponent {\n  private readonly _matDialog = inject(MatDialog);\n\n  readonly config = input<Maybe<DbxMcpConnectButtonConfig>>();\n\n  readonly buttonDisplaySignal = computed(() => this.config()?.buttonDisplay ?? DEFAULT_DBX_MCP_CONNECT_BUTTON_DISPLAY);\n  readonly buttonStyleSignal = computed(() => this.config()?.buttonStyle);\n\n  openDialog(): MatDialogRef<DbxMcpConnectDialogComponent> {\n    return DbxMcpConnectDialogComponent.openDialog(this._matDialog, this.config());\n  }\n}\n","import { type EnvironmentProviders, type Provider, makeEnvironmentProviders } from '@angular/core';\nimport { DbxScreenMediaService, DbxScreenMediaServiceConfig, DEFAULT_SCREEN_MEDIA_SERVICE_CONFIG } from './screen.service';\n\n/**\n * Configuration for provideDbxScreenMediaService().\n */\nexport interface ProvideDbxScreenMediaServiceConfig {\n  readonly config?: DbxScreenMediaServiceConfig;\n}\n\n/**\n * Creates Angular environment providers for {@link DbxScreenMediaService} and its configuration.\n *\n * @param config - Optional service configuration; uses default breakpoints if omitted.\n * @returns Environment providers to register in the application bootstrap.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideDbxScreenMediaService()]\n * });\n * ```\n *\n * @__NO_SIDE_EFFECTS__\n */\nexport function provideDbxScreenMediaService(config: ProvideDbxScreenMediaServiceConfig = {}): EnvironmentProviders {\n  const screenConfig = config.config ?? DEFAULT_SCREEN_MEDIA_SERVICE_CONFIG;\n\n  const providers: Provider[] = [\n    // config\n    {\n      provide: DbxScreenMediaServiceConfig,\n      useValue: screenConfig\n    },\n    // service\n    DbxScreenMediaService\n  ];\n\n  return makeEnvironmentProviders(providers);\n}\n","import { type DestroyFunction } from '@dereekb/util';\n\n/**\n * Disables the browser right-click context menu on the CDK overlay container element.\n *\n * Useful for preventing the default context menu from appearing over dialogs or popups.\n *\n * @param classes - CSS class name of the overlay container element to target. Defaults to `'cdk-overlay-container'`.\n * @param onEvent - Optional callback invoked on each suppressed right-click event.\n * @returns A cleanup function that removes the event listener.\n *\n * @example\n * ```ts\n * const cleanup = disableRightClickInCdkBackdrop();\n * // later, to re-enable:\n * cleanup();\n * ```\n */\nexport function disableRightClickInCdkBackdrop(classes: string = 'cdk-overlay-container', onEvent?: (event: MouseEvent) => void): DestroyFunction {\n  const eventListener = function (this: Element, event: Event) {\n    event.preventDefault();\n    onEvent?.(event as MouseEvent);\n  };\n\n  const target = document.getElementsByClassName(classes).item(0);\n\n  if (target) {\n    target.addEventListener('contextmenu', eventListener);\n    return () => target.removeEventListener('contextmenu', eventListener);\n  }\n\n  return () => {\n    /* noop */\n  };\n}\n","import { DbxLoadingModule } from './loading/loading.module';\nimport { NgModule } from '@angular/core';\nimport { DbxButtonModule } from './button';\nimport { DbxActionModule } from './action';\n\n@NgModule({\n  exports: [DbxButtonModule, DbxActionModule, DbxLoadingModule]\n})\nexport class DbxWebModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i1.DbxColorDirective","importsAndExports","i1.DbxButtonComponent","i2.DbxButtonSpacerDirective","i1.DbxPopoverContentComponent","i2.DbxPopoverHeaderComponent","i3.DbxPopoverScrollContentDirective","i2.DbxButtonComponent","i3","INITIAL_STATE","DbxModelStateActions.dbxModelResetState","fromObjectModuleConfig.STATE_FEATURE_KEY","fromObjectModuleConfig.reducer","onDbxModel.DbxModelStateModelActions.emitObjectViewEvent","fromDbxModel.FEATURE_KEY","fromDbxModel.reducers","i1.DbxListComponent","i2.DbxSelectionValueListViewComponent","i2.DbxValueListGridViewComponent","PDF_ICON","IMAGE_ICON"],"mappings":"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"}