Dialog
Typed modal overlay opened imperatively via kuiDialog(), not rendered as a bound component instance. Built on Angular CDK Overlay.
Import the inject-function factory and dialog-host contract types from the published package entrypoint.
import {
KUI_DIALOG_CONTEXT,
KuiButtonDirective,
KuiDialogContext,
KuiDialogHost,
kuiDialog,
} from '@kikita-labs/ui';
// Import runtime styles once, application-wide:
import '@kikita-labs/ui/styles';Implement KuiDialogHost on your dialog component, inject KUI_DIALOG_CONTEXT to read data and close, then create a typed opener with kuiDialog() and call it with data to open. The returned observable emits the typed result once and completes.
<div class="basic-dialog-example">
<button kuiButton type="button" (click)="invite()">Invite teammate</button>
@if (lastResult()) {
<p class="basic-dialog-example__result">Last result: {{ lastResult() }}</p>
}
</div>size selects a panel width preset: auto sizes to content with a 320px minimum, sm is 400px, md is 560px (default), and lg is 720px.
<div class="dialog-sizes-example">
@for (size of sizes; track size) {
<button kuiButton type="button" shape="outline" (click)="open(size)">{{ size }}</button>
}
</div>kuiConfirm() opens a pre-built confirmation dialog without a custom component. It always sets dismissable: false and closable: false, so the user must pick Confirm or Cancel. It resolves Observable<boolean>.
<div class="dialog-confirm-example">
<button kuiButton type="button" appearance="danger" (click)="deleteRecord()">
Delete record
</button>
@if (lastResult()) {
<p class="dialog-confirm-example__result">Last result: {{ lastResult() }}</p>
}
</div>API verified against @kikita-labs/ui v1.6.1 public typings.
| Name | Type | Default | Description |
|---|---|---|---|
| kuiDialog(component, config?) | (component: Type<TComponent>, config?: Omit<KuiDialogConfig, "data">) => (data: TData) => Observable<TResult | undefined> | - | Inject-function factory. Call once per injection context to get a typed opener bound to that component. |
| KuiDialogHost<TResult, TData> | interface | - | Contract your dialog component implements. Requires a dialogContext property injected from KUI_DIALOG_CONTEXT. |
| KUI_DIALOG_CONTEXT | InjectionToken<KuiDialogContext<TResult, TData>> | - | Injected inside the dialog component to read data and close the dialog. |
| dialogContext.data | TData | - | Data passed via the opener call, e.g. openDialog(data). |
| dialogContext.closable | boolean | - | Mirrors KuiDialogConfig.closable. Informational only -- the container renders .kui-dialog-close itself when true. |
| dialogContext.appearance | KuiDialogAppearance | - | Mirrors KuiDialogConfig.appearance, for coloring a custom icon if needed. |
| dialogContext.close(result?) | (result?: TResult) => void | - | Closes the dialog, optionally emitting a typed result to the opener subscription. |
| KuiDialogConfig.data | TData | undefined | Available on the low-level config type; kuiDialog() passes feature data through the returned opener function instead. |
| KuiDialogConfig.size | 'auto' | 'sm' | 'md' | 'lg' | 'md' | Panel width preset: auto (min 320px), sm (400px), md (560px), lg (720px). |
| KuiDialogConfig.appearance | 'default' | 'danger' | 'warning' | 'default' | Colors .kui-dialog-icon via a CSS variable. Has no other visual effect. |
| KuiDialogConfig.dismissable | boolean | true | Allows Escape and backdrop click to close the dialog. |
| KuiDialogConfig.closable | boolean | true | Shows the .kui-dialog-close button the container renders automatically, absolutely positioned top-right of the panel. |
| KuiDialogRef<TResult> | class | - | Return type of kuiDialog(component, config). Calling it with data opens the dialog and returns Observable<TResult | undefined>. |
| kuiConfirm() | () => (config: KuiConfirmConfig) => Observable<boolean> | - | Inject-function for a pre-built confirmation dialog. No custom component required. |
| KuiConfirmConfig.title | string | required | Header text. |
| KuiConfirmConfig.message | string | undefined | - | Body text. |
| KuiConfirmConfig.appearance | KuiDialogAppearance | 'default' | Icon color and button tone. |
| KuiConfirmConfig.confirmLabel | string | 'OK' | Confirm button label. |
| KuiConfirmConfig.cancelLabel | string | 'Cancel' | Cancel button label. |
| .kui-dialog-icon | CSS class | - | Add to an SVG placed before .kui-dialog-title inside .kui-dialog-header. Fixed 20x20px, colored via appearance. |
| --kui-dialog-bg | CSS custom property | var(--kui-color-surface-elevated) | Panel background color. |
| --kui-dialog-border | CSS custom property | var(--kui-color-border) | Panel border color. |
| --kui-dialog-radius | CSS custom property | var(--kui-radius-lg) | Panel corner radius. |
| --kui-dialog-shadow | CSS custom property | var(--kui-shadow-lg) | Panel elevation shadow. |
| --kui-dialog-backdrop | CSS custom property | oklch(0 0 0 / 0.5) | Backdrop fill color. |
Dialog traps focus and blocks page scroll while open, matching native modal expectations.
- The panel renders
role="dialog"andaria-modal="true"automatically. - The panel uses
aria-labelledbywhen.kui-dialog-titleexists in your content, and falls back toaria-label="Dialog"otherwise. Always include a.kui-dialog-titleheading. - Focus is trapped inside the dialog via CDK
cdkTrapFocusand returns to the opening element after close. - Escape and backdrop click close the dialog by default; set
dismissable: falsefor actions the user must explicitly resolve, askuiConfirm()does. - Page scroll is blocked via the CDK block scroll strategy while any dialog is open.
- The panel renders
.kui-dialog-closeitself, top-right of the header, whenclosableistrue(the default); the header reserves space for it automatically.dialogContext.closableis retained for informational use only.