@area8975/ui 0.1.1-dev.11 → 0.1.1-dev.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area8975-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/charts/chart/chart.palette.ts","../../../projects/ui/src/lib/charts/chart/axis-chart.base.ts","../../../projects/ui/src/lib/charts/chart/chart.options.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.html","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.ts","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.html","../../../projects/ui/src/lib/charts/chart/chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-table.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.component.ts","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.types.ts","../../../projects/ui/src/lib/charts/line-chart/line-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/line-chart/line-chart.types.ts","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.types.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.html","../../../projects/ui/src/lib/forms/file/file.utils.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.html","../../../projects/ui/src/lib/forms/field/field.component.ts","../../../projects/ui/src/lib/forms/field/field.component.html","../../../projects/ui/src/lib/forms/file/file.types.ts","../../../projects/ui/src/lib/forms/input/input.component.ts","../../../projects/ui/src/lib/forms/input/input.component.html","../../../projects/ui/src/lib/forms/input/input.types.ts","../../../projects/ui/src/lib/forms/input-addon/input-addon.component.ts","../../../projects/ui/src/lib/forms/input-group/input-group.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.html","../../../projects/ui/src/lib/generic/badge/badge.component.ts","../../../projects/ui/src/lib/generic/badge/badge.component.html","../../../projects/ui/src/lib/generic/card/card.types.ts","../../../projects/ui/src/lib/generic/card/card.component.ts","../../../projects/ui/src/lib/layout/overlay/overlay.positioner.ts","../../../projects/ui/src/lib/layout/overlay/overlay.stack.ts","../../../projects/ui/src/lib/layout/overlay/overlay.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.directives.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.html","../../../projects/ui/src/lib/forms/select/select.component.ts","../../../projects/ui/src/lib/forms/select/select.component.html","../../../projects/ui/src/lib/forms/select/select.datasource.ts","../../../projects/ui/src/lib/forms/select/select.types.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.html","../../../projects/ui/src/lib/forms/textarea/textarea.types.ts","../../../projects/ui/src/lib/generic/alert/alert.component.ts","../../../projects/ui/src/lib/generic/alert/alert.component.html","../../../projects/ui/src/lib/generic/alert/alert.types.ts","../../../projects/ui/src/lib/generic/badge/badge.types.ts","../../../projects/ui/src/lib/generic/button/button.component.ts","../../../projects/ui/src/lib/generic/button/button.component.html","../../../projects/ui/src/lib/generic/button/button.types.ts","../../../projects/ui/src/lib/generic/button-group/button-group.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.utils.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.html","../../../projects/ui/src/lib/generic/calendar/calendar.types.ts","../../../projects/ui/src/lib/generic/container/container.component.ts","../../../projects/ui/src/lib/generic/drawer/drawer.component.ts","../../../projects/ui/src/lib/generic/drawer/drawer.component.html","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.ts","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.html","../../../projects/ui/src/lib/generic/kpi/kpi.component.ts","../../../projects/ui/src/lib/generic/kpi/kpi.component.html","../../../projects/ui/src/lib/generic/loading/loading.component.ts","../../../projects/ui/src/lib/generic/loading/loading.component.html","../../../projects/ui/src/lib/generic/loading/loading.types.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.html","../../../projects/ui/src/lib/generic/modal/modal.component.ts","../../../projects/ui/src/lib/generic/modal/modal.component.html","../../../projects/ui/src/lib/generic/money/money.component.ts","../../../projects/ui/src/lib/generic/money/money.component.html","../../../projects/ui/src/lib/generic/money/money.types.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.html","../../../projects/ui/src/lib/generic/progress/progress.component.ts","../../../projects/ui/src/lib/generic/progress/progress.component.html","../../../projects/ui/src/lib/generic/progress/progress.types.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.types.ts","../../../projects/ui/src/lib/generic/tab/tab.directive.ts","../../../projects/ui/src/lib/generic/tab/tab.component.ts","../../../projects/ui/src/lib/generic/tab/tab.component.html","../../../projects/ui/src/lib/generic/table/table.component.ts","../../../projects/ui/src/lib/generic/table/table.component.html","../../../projects/ui/src/lib/generic/table/table.datasource.ts","../../../projects/ui/src/lib/generic/toast/toast.component.ts","../../../projects/ui/src/lib/generic/toast/toast.component.html","../../../projects/ui/src/lib/generic/toast/toast.service.ts","../../../projects/ui/src/lib/generic/toast/toast.types.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.html","../../../projects/ui/src/lib/generic/toaster/toaster.types.ts","../../../projects/ui/src/lib/layout/layout/layout.component.ts","../../../projects/ui/src/lib/layout/layout/layout.component.html","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.ts","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.html","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.ts","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.html","../../../projects/ui/src/lib/presets/colour/colour.component.ts","../../../projects/ui/src/lib/presets/colour/colour.component.html","../../../projects/ui/src/lib/presets/counter/counter.component.ts","../../../projects/ui/src/lib/presets/counter/counter.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.ts","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-presets.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.html","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.ts","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.html","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.ts","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.html","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.ts","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.html","../../../projects/ui/src/lib/presets/file-input/file-input.component.ts","../../../projects/ui/src/lib/presets/file-input/file-input.component.html","../../../projects/ui/src/lib/presets/switch/switch.component.ts","../../../projects/ui/src/lib/presets/switch/switch.component.html"],"sourcesContent":["/**\n * Categorical colours for chart series, in a fixed order that was checked for\n * colour blindness (adjacent pairs stay apart for protan, deutan and tritan).\n * Keep the order, a series takes the next slot, never a generated colour.\n */\nexport const CHART_PALETTE = [\n '#2a78d6', // blue\n '#eb6834', // orange\n '#1baf7a', // aqua\n '#eda100', // yellow\n '#e87ba4', // magenta\n '#008300', // green\n '#4a3aa7', // violet\n '#e34948' // red\n] as const;\n\n/** Past eight series, fold the rest into \"Other\" instead of reusing a colour. */\nexport const CHART_MAX_SERIES = CHART_PALETTE.length;\n\n/** Lines can go to sixteen, the second eight reuse the colours dashed. */\nexport const CHART_MAX_LINE_SERIES = CHART_PALETTE.length * 2;\n\n// chart chrome, kept to the gray scale the rest of the library uses\nexport const CHART_INK = {\n text: '#1e2939', // gray-800\n muted: '#6a7282', // gray-500\n grid: '#e5e7eb', // gray-200\n surface: '#ffffff',\n context: '#d1d5dc' // gray-300, series that are there for context\n} as const;\n\nexport interface ChartSeriesStyle {\n colour: string;\n dashed: boolean;\n}\n\n/** Past the eighth slot a series goes grey, reusing a colour would make two series look the same. */\nexport function chartColour(index: number): string {\n return CHART_PALETTE[index] ?? CHART_INK.context;\n}\n\n/**\n * Colour plus line style for a slot. With `dashes` the ninth to sixteenth\n * slots reuse the colours as dashed lines, colour and dash together keep\n * them apart. Anything past that is grey.\n */\nexport function chartSeriesStyle(index: number, dashes: boolean): ChartSeriesStyle {\n if (dashes && index >= CHART_PALETTE.length && index < CHART_MAX_LINE_SERIES) {\n return { colour: CHART_PALETTE[index - CHART_PALETTE.length], dashed: true };\n }\n\n return { colour: chartColour(index), dashed: false };\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n input,\n signal\n} from '@angular/core';\n\nimport type {\n ChartLegendItem,\n ChartLegendPosition,\n ChartLegendSource\n} from '../chart-legend/chart-legend.types';\nimport {\n CHART_INK,\n type ChartSeriesStyle,\n chartSeriesStyle\n} from './chart.palette';\nimport type {\n ChartOptions,\n ChartSeries,\n ChartValueFormatter\n} from './chart.types';\n\n\nconst defaultFormatter: ChartValueFormatter = value =>\n new Intl.NumberFormat('en-GB').format(value);\n\n/** Inputs every chart with categories along one axis and values up the other shares. */\n@Directive()\nexport abstract class UiAxisChartBase implements ChartLegendSource {\n readonly series = input.required<ChartSeries[]>();\n readonly categories = input.required<string[]>();\n\n /** Says what the chart shows, e.g. \"Spending by month\". */\n readonly ariaLabel = input.required<string>();\n\n readonly height = input<number>(300);\n\n /** Used on the value axis, the tooltip and the table, e.g. to show money. */\n readonly valueFormatter = input<ChartValueFormatter>(defaultFormatter);\n\n /** Heading for the category column in the data table. */\n readonly categoryLabel = input<string>('Category');\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyText = input<string>('No data to show');\n\n /** Shows the data table under the chart instead of only to screen readers. */\n readonly showTable = input(false, { transform: booleanAttribute });\n\n /** Raw ApexCharts options merged over the defaults, for anything not covered here. */\n readonly options = input<ChartOptions | null>(null);\n\n /**\n * Only these series get palette colours, the rest go grey so the few that\n * matter stand out. The way to show more series than there are colours.\n */\n readonly highlight = input<string[] | null>(null);\n\n /** `none` leaves the legend out, for when a `ui-chart-legend` is linked with `for`. */\n readonly legend = input<ChartLegendPosition>('auto');\n\n /** Series switched off in the legend. */\n readonly hiddenSeries = signal<string[]>([]);\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = signal<string | null>(null);\n\n /** Charts that draw lines can tell series apart by dashes too, bars can't. */\n protected readonly supportsDashes: boolean = false;\n\n protected readonly isEmpty = computed(() =>\n !this.series().some(item => item.data.some(value => value !== null))\n );\n\n protected readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.series().map(item =>\n !!highlight && !highlight.includes(item.name)\n );\n });\n\n // highlighted series take slots in the order they're highlighted, so colours don't depend on data order\n protected readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n\n return this.series().map((item, index) => {\n if (muted[index]) {\n return { colour: CHART_INK.context, dashed: false };\n }\n\n const style = chartSeriesStyle(\n highlight ? highlight.indexOf(item.name) : index,\n this.supportsDashes\n );\n\n return item.colour ? { ...style, colour: item.colour } : style;\n });\n });\n\n protected readonly colours = computed(() =>\n this.styles().map(style => style.colour)\n );\n protected readonly dashed = computed(() =>\n this.styles().map(style => style.dashed)\n );\n\n /** Grey context series stay out of the legend, the note says how many there are. */\n readonly legendItems = computed<ChartLegendItem[]>(() => {\n const highlight = this.highlight();\n const items = this.series()\n .map((item, index) => ({\n name: item.name,\n ...this.styles()[index]\n }))\n .filter((_, index) => !this.isMuted()[index]);\n\n // follows the highlight order, which is also the colour order\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n readonly legendNote = computed(() => {\n const count = this.isMuted().filter(Boolean).length;\n\n return count ? `${count} more in grey` : '';\n });\n\n protected formatValue(value: number | null | undefined): string {\n return value === null || value === undefined\n ? '-'\n : this.valueFormatter()(value);\n }\n}\n","import { CHART_INK } from './chart.palette';\nimport type { ChartOptions } from './chart.types';\n\n\n/** Axis text, muted so it sits behind the data. */\nexport const CHART_AXIS_LABELS = {\n style: { colors: CHART_INK.muted, fontSize: '12px' }\n};\n\nexport interface ChartTooltipRow {\n colour: string;\n name: string;\n value: string;\n dashed?: boolean;\n}\n\n/** Defaults every chart starts from, quiet chrome so the data does the talking. */\nexport function baseChartOptions(): ChartOptions {\n return {\n chart: {\n fontFamily: 'inherit',\n foreColor: CHART_INK.muted,\n parentHeightOffset: 0,\n redrawOnParentResize: true,\n toolbar: { show: false },\n zoom: { enabled: false },\n animations: { enabled: true, speed: 300 }\n },\n dataLabels: { enabled: false },\n // apex fades fills and lines to 85% by default, which washes the palette out\n fill: { type: 'solid', opacity: 1 },\n grid: {\n borderColor: CHART_INK.grid,\n strokeDashArray: 0,\n padding: { top: 0, right: 8, bottom: 0, left: 8 }\n },\n // ui-chart-legend draws the legend, apex's own stays off\n legend: { show: false },\n xaxis: {\n axisBorder: { show: true, color: CHART_INK.grid },\n axisTicks: { show: false },\n labels: CHART_AXIS_LABELS\n },\n yaxis: {\n axisBorder: { show: false },\n axisTicks: { show: false },\n labels: CHART_AXIS_LABELS\n },\n states: {\n hover: { filter: { type: 'lighten' } },\n active: { filter: { type: 'none' } }\n }\n };\n}\n\n/** Plain objects merge key by key, arrays and everything else replace. */\nexport function mergeChartOptions(base: ChartOptions, overrides: ChartOptions | null): ChartOptions {\n return overrides ? deepMerge(base, overrides) as ChartOptions : base;\n}\n\n/** The HTML inside a tooltip, styled by chart.component.css. */\nexport function chartTooltipHtml(title: string, rows: ChartTooltipRow[], footer = ''): string {\n const items = rows.map(row => `\n <div class=\"ui-chart-tooltip-row ui-text-body-alt\">\n <span\n class=\"ui-chart-tooltip-dot${row.dashed ? ' ui-chart-tooltip-dot--dashed' : ''}\"\n style=\"--ui-chart-tooltip-colour: ${escapeHtml(row.colour)}\"\n ></span>\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(row.name)}</span>\n <span class=\"ui-chart-tooltip-value\">${escapeHtml(row.value)}</span>\n </div>\n `).join('');\n\n return `\n <div class=\"ui-chart-tooltip\">\n ${title ? `<div class=\"ui-chart-tooltip-title ui-text-caption\">${escapeHtml(title)}</div>` : ''}\n ${items}\n ${footer ? `<div class=\"ui-chart-tooltip-footer ui-text-caption\">${escapeHtml(footer)}</div>` : ''}\n </div>\n `;\n}\n\n// tooltip HTML is built from data, so anything that came from outside gets escaped\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction deepMerge(base: unknown, overrides: unknown): unknown {\n if (!isPlainObject(base) || !isPlainObject(overrides)) {\n return overrides === undefined ? base : overrides;\n }\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(overrides)) {\n merged[key] = deepMerge(base[key], value);\n }\n\n return merged;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n numberAttribute\n} from '@angular/core';\n\nimport type { SkeletonShape } from './skeleton.types';\n\n\n/**\n * A placeholder shown while content loads. Size it with classes on the\n * element, e.g. `class=\"w-48\"` for text or `class=\"size-12\"` for a circle.\n */\n@Component({\n selector: 'ui-skeleton',\n templateUrl: './skeleton.component.html',\n styleUrl: './skeleton.component.css',\n host: {\n // purely visual, the loading region should set aria-busy instead\n 'aria-hidden': 'true',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiSkeletonComponent {\n readonly shape = input<SkeletonShape>('text');\n readonly animated = input(true, { transform: booleanAttribute });\n\n /** Text only, stacks this many lines with a shorter last one. */\n readonly lines = input(1, { transform: numberAttribute });\n\n readonly classes = input<string>('');\n\n protected readonly lineIndexes = computed(() =>\n Array.from(\n { length: Math.max(1, Math.floor(this.lines())) },\n (_, index) => index\n )\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-skeleton',\n `ui-skeleton--${this.shape()}`,\n this.animated() ? 'ui-skeleton--animated' : '',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (shape() === 'text') {\n @for (index of lineIndexes(); track index) {\n <span class=\"ui-skeleton-line\"></span>\n }\n} @else {\n <span class=\"ui-skeleton-block\"></span>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n signal,\n untracked\n} from '@angular/core';\n\nimport type { ChartLegendItem, ChartLegendSource } from './chart-legend.types';\n\n\n/**\n * A row of colour keys naming what each colour means. Link it to a chart\n * with `for`, or pass `items` to use it next to anything coloured by series.\n */\n@Component({\n selector: 'ui-chart-legend',\n templateUrl: './chart-legend.component.html',\n styleUrl: './chart-legend.component.css'\n})\nexport class UiChartLegendComponent {\n readonly items = input<ChartLegendItem[]>([]);\n\n /** Small text after the items, e.g. how many series aren't listed. */\n readonly note = input<string>('');\n\n /** A chart to take items from and hide or fade series on, set its `legend` to `none`. */\n readonly for = input<ChartLegendSource | null>(null);\n\n /** Names of items switched off, bound two-way when `toggleable`. */\n readonly hidden = model<string[]>([]);\n\n /** Lets each item be clicked to hide or show its series. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n\n /** The item being hovered or focused, null when it leaves. Charts fade the other series. */\n readonly focusChange = output<string | null>();\n\n private readonly hovered = signal<string | null>(null);\n private readonly focused = signal<string | null>(null);\n\n // the pointer wins while it's over an item, keyboard focus is the fallback\n private readonly pointedAt = computed(() => this.hovered() ?? this.focused());\n\n // a linked chart wins over the plain inputs\n protected readonly shownItems = computed(() => this.for()?.legendItems() ?? this.items());\n protected readonly shownNote = computed(() => this.for()?.legendNote() ?? this.note());\n private readonly hiddenNames = computed(() => this.for()?.hiddenSeries() ?? this.hidden());\n\n protected readonly visibleCount = computed(() =>\n this.shownItems().filter(item => !this.hiddenNames().includes(item.name)).length\n );\n\n constructor() {\n effect(() => {\n const name = this.pointedAt();\n\n untracked(() => {\n this.for()?.emphasis.set(name);\n this.focusChange.emit(name);\n });\n });\n }\n\n protected hover(name: string | null): void {\n this.hovered.set(name);\n }\n\n protected focus(name: string | null): void {\n this.focused.set(name);\n }\n\n protected isHidden(item: ChartLegendItem): boolean {\n return this.hiddenNames().includes(item.name);\n }\n\n // the last one showing stays on, an empty chart helps nobody\n protected isLocked(item: ChartLegendItem): boolean {\n return !this.isHidden(item) && this.visibleCount() === 1;\n }\n\n protected toggle(item: ChartLegendItem): void {\n if (this.isLocked(item)) {\n return;\n }\n\n const hidden = this.hiddenNames();\n const next = hidden.includes(item.name)\n ? hidden.filter(name => name !== item.name)\n : [...hidden, item.name];\n\n const source = this.for();\n\n if (source) {\n source.hiddenSeries.set(next);\n } else {\n this.hidden.set(next);\n }\n }\n}\n","<ul class=\"ui-chart-legend\" role=\"list\">\n @for (item of shownItems(); track item.name) {\n <li\n (mouseenter)=\"hover(item.name)\"\n (mouseleave)=\"hover(null)\"\n (focusin)=\"focus(item.name)\"\n (focusout)=\"focus(null)\"\n >\n @if (toggleable()) {\n <button\n type=\"button\"\n class=\"ui-chart-legend-item ui-chart-legend-item--button ui-text-body-alt\"\n [attr.aria-pressed]=\"!isHidden(item)\"\n [attr.aria-disabled]=\"isLocked(item) || null\"\n [attr.data-hidden]=\"isHidden(item) ? '' : null\"\n (click)=\"toggle(item)\"\n >\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.name }}\n </button>\n } @else {\n <span class=\"ui-chart-legend-item ui-text-body-alt\">\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.name }}\n </span>\n }\n </li>\n }\n</ul>\n\n@if (shownNote()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{ shownNote() }}</span>\n}\n","import {\n afterNextRender,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport type ApexCharts from 'apexcharts';\n\nimport type { ChartOptions } from './chart.types';\n\n\n/**\n * Draws raw ApexCharts options. The typed charts (bar, line and so on) are\n * built on this, reach for it directly only when they can't do what you need.\n */\n@Component({\n selector: 'ui-chart',\n template: `\n <div\n #canvas\n class=\"ui-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel()\"\n ></div>\n `,\n styleUrl: './chart.component.css',\n // ApexCharts builds its own DOM, scoped styles would never reach the tooltip\n encapsulation: ViewEncapsulation.None,\n host: { class: 'ui-chart' }\n})\nexport class UiChartComponent {\n readonly options = input.required<ChartOptions>();\n\n /** What the chart shows, e.g. \"Spending by month\". Screen readers get this instead of the SVG. */\n readonly ariaLabel = input.required<string>();\n\n /** Series names to keep off the plot, e.g. switched off in the legend. */\n readonly hiddenSeries = input<string[]>([]);\n\n /** Fades every other series so this one stands out, e.g. while its legend item is hovered. */\n readonly emphasis = input<string | null>(null);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLElement>>(\n 'canvas'\n );\n private readonly chart = signal<ApexCharts | null>(null);\n\n private destroyed = false;\n\n constructor() {\n // loaded on first use so pages without charts don't pay for the library\n afterNextRender(async () => {\n const { default: Apex } = await import('apexcharts');\n\n if (this.destroyed) {\n return;\n }\n\n const chart = new Apex(\n this.canvas().nativeElement,\n untracked(this.options)\n );\n\n await chart.render();\n this.chart.set(chart);\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n // later option changes update in place, so bars animate to their new size\n effect(() => {\n const options = this.options();\n const chart = this.chart();\n\n // an update redraws every series, so hidden and faded ones need setting again\n chart?.updateOptions(options, false, true).then(() => {\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n });\n\n effect(() => {\n this.emphasis();\n\n if (this.chart()) {\n this.applyEmphasis();\n }\n });\n\n effect(() => {\n const chart = this.chart();\n\n if (chart) {\n this.applyHidden(chart);\n this.applyEmphasis();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.chart()?.destroy();\n });\n }\n\n private applyHidden(chart: ApexCharts): void {\n const hidden = this.hiddenSeries();\n\n for (const name of this.seriesNames()) {\n if (!name) {\n continue;\n }\n\n if (hidden.includes(name)) {\n chart.hideSeries(name);\n } else {\n chart.showSeries(name);\n }\n }\n }\n\n // done with a class rather than apex's own highlight, which has no clean way to undo\n private applyEmphasis(): void {\n const names = this.seriesNames();\n\n // a hidden series isn't drawn, fading everything towards it would leave nothing to see\n const emphasis = untracked(this.emphasis);\n const active =\n emphasis &&\n names.includes(emphasis) &&\n !untracked(this.hiddenSeries).includes(emphasis)\n ? emphasis\n : null;\n const groups = this.canvas().nativeElement.querySelectorAll<\n SVGGElement\n >('.apexcharts-series[data\\\\:realIndex]');\n\n for (const group of groups) {\n const name = names[Number(group.getAttribute('data:realIndex'))];\n\n group.classList.toggle(\n 'ui-chart-series--faded',\n !!active && name !== active\n );\n }\n }\n\n // pies pass plain numbers as series, their names live in labels\n private seriesNames(): (string | null)[] {\n const { series = [], labels = [] } = untracked(this.options);\n\n return series.map((item, index) =>\n typeof item === 'object' && item !== null && 'name' in item\n ? item.name ?? null\n : labels[index] ?? null\n );\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nimport type { ChartSeries, ChartValueFormatter } from './chart.types';\n\n\n/**\n * The numbers behind a chart as a table. Hidden visually by default so screen\n * readers still get the data, `visible` shows it for everyone.\n */\n@Component({\n selector: 'ui-chart-table',\n template: `\n <!-- sr-only on a wrapper, the table's own width would otherwise override it -->\n <div [class.sr-only]=\"!visible()\">\n <table class=\"ui-chart-table\">\n <caption class=\"sr-only\">{{ caption() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"ui-text-caption\">{{ categoryLabel() }}</th>\n @for (item of series(); track item.name) {\n <th scope=\"col\" class=\"ui-text-caption\">{{ item.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (category of categories(); track $index; let row = $index) {\n <tr>\n <th scope=\"row\" class=\"ui-text-body-alt\">{{ category }}</th>\n @for (item of series(); track item.name) {\n <td class=\"ui-text-body-alt\">{{ format(item.data[row]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n styleUrl: './chart-table.component.css'\n})\nexport class UiChartTableComponent {\n readonly caption = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input<string>('Category');\n readonly visible = input(false, { transform: booleanAttribute });\n\n protected format(value: number | null | undefined): string {\n return value === null || value === undefined ? '-' : this.valueFormatter()(value);\n }\n}\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport { UiSkeletonComponent } from '../../generic/skeleton/skeleton.component';\nimport { UiChartLegendComponent } from '../chart-legend/chart-legend.component';\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport { UiChartComponent } from './chart.component';\nimport type { ChartOptions, ChartSeries, ChartValueFormatter } from './chart.types';\nimport { UiChartTableComponent } from './chart-table.component';\n\n\n/** The loading, empty and data table states around a chart, shared by every chart type. */\n@Component({\n selector: 'ui-chart-frame',\n template: `\n @if (loading()) {\n <div [style.height.px]=\"height()\" aria-busy=\"true\">\n <span class=\"sr-only\">Loading chart</span>\n <ui-skeleton shape=\"rect\" class=\"size-full\" />\n </div>\n } @else if (empty()) {\n <div\n class=\"flex justify-center items-center border border-gray-200 border-dashed rounded-lg text-muted-foreground-1 ui-text-body-alt\"\n [style.height.px]=\"height()\"\n >\n {{ emptyText() }}\n </div>\n } @else {\n <!-- one series needs no legend, the chart's title already names it -->\n @if (showLegend() && (legendItems().length > 1 || legendNote())) {\n <ui-chart-legend\n class=\"mb-3\"\n [items]=\"legendItems()\"\n [note]=\"legendNote()\"\n [(hidden)]=\"hiddenSeries\"\n (focusChange)=\"emphasis.set($event)\"\n toggleable\n />\n }\n\n <ui-chart\n [options]=\"options()\"\n [ariaLabel]=\"ariaLabel()\"\n [hiddenSeries]=\"hiddenSeries()\"\n [emphasis]=\"emphasis()\"\n />\n\n <ui-chart-table\n [caption]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [visible]=\"showTable()\"\n />\n }\n `,\n imports: [\n UiChartComponent,\n UiChartTableComponent,\n UiChartLegendComponent,\n UiSkeletonComponent\n ],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiChartFrameComponent {\n readonly options = input.required<ChartOptions>();\n readonly ariaLabel = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly legendItems = input.required<ChartLegendItem[]>();\n readonly legendNote = input<string>('');\n readonly hiddenSeries = model<string[]>([]);\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input.required<string>();\n readonly height = input.required<number>();\n readonly emptyText = input.required<string>();\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly empty = input(false, { transform: booleanAttribute });\n readonly showTable = input(false, { transform: booleanAttribute });\n readonly showLegend = input(true, { transform: booleanAttribute });\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = model<string | null>(null);\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n CHART_AXIS_LABELS,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport { CHART_INK } from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { BarChartOrientation } from './bar-chart.types';\n\n\n// thin bars read better than slabs, whatever width is left over becomes air\nconst MAX_BAR_THICKNESS = 24;\n\n/**\n * Bars or columns for comparing amounts across categories. Several series\n * sit side by side, or on top of each other with `stacked`.\n */\n@Component({\n selector: 'ui-bar-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiBarChartComponent extends UiAxisChartBase {\n readonly orientation = input<BarChartOrientation>('vertical');\n readonly stacked = input(false, { transform: booleanAttribute });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const base = baseChartOptions();\n const horizontal = this.orientation() === 'horizontal';\n const format = this.valueFormatter();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n\n // apex applies a px width to each bar, grouped or not\n const thickness = `${MAX_BAR_THICKNESS}px`;\n const valueLabels = { ...CHART_AXIS_LABELS, formatter: format };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'bar',\n height: this.height(),\n stacked: this.stacked()\n },\n colors: colours,\n series: series.map(item => ({ name: item.name, data: item.data })),\n plotOptions: {\n bar: {\n horizontal,\n // apex 4 ignores borderRadiusWhenStacked and rounds every segment, square reads cleaner\n borderRadius: this.stacked() ? 0 : 4,\n borderRadiusApplication: 'end',\n columnWidth: thickness,\n barHeight: thickness\n }\n },\n // a surface coloured gap between touching bars and stack segments\n stroke: { show: true, width: 2, colors: [CHART_INK.surface] },\n // horizontal bars swap the axes, values run along the bottom\n xaxis: {\n ...base.xaxis,\n categories,\n labels: horizontal\n ? { ...CHART_AXIS_LABELS, formatter: (value: string) => format(Number(value)) }\n : CHART_AXIS_LABELS\n },\n yaxis: { ...base.yaxis, labels: horizontal ? CHART_AXIS_LABELS : valueLabels },\n grid: {\n ...base.grid,\n // gridlines run across the value axis only\n xaxis: { lines: { show: horizontal } },\n yaxis: { lines: { show: !horizontal } }\n },\n tooltip: {\n shared: false,\n intersect: true,\n custom: ({ seriesIndex, dataPointIndex }: { seriesIndex: number; dataPointIndex: number }) =>\n chartTooltipHtml(categories[dataPointIndex] ?? '', [{\n colour: colours[seriesIndex],\n name: series[seriesIndex]?.name ?? '',\n value: this.formatValue(series[seriesIndex]?.data[dataPointIndex])\n }])\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** vertical draws columns rising from the bottom, horizontal draws bars from the left. */\nexport const BarChartOrientations = ['vertical', 'horizontal'] as const;\n\n/** @see {@link BarChartOrientations} */\nexport type BarChartOrientation = typeof BarChartOrientations[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n CHART_AXIS_LABELS,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport { CHART_INK } from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { LineChartCurve } from './line-chart.types';\n\n\n// past this many categories only some get a label, or they crowd into each other\nconst MAX_AXIS_LABELS = 8;\n\n// grey context rows past this are summed up, the table has the rest\nconst MAX_CONTEXT_ROWS = 5;\n\n// with more lines than this the tooltip lists them biggest first, the same order they sit in\nconst SORT_ROWS_AFTER = 8;\n\n/**\n * Lines for showing how values change over something ordered, usually time.\n * Hovering anywhere shows every series at that point.\n */\n@Component({\n selector: 'ui-line-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiLineChartComponent extends UiAxisChartBase {\n protected override readonly supportsDashes = true;\n\n readonly curve = input<LineChartCurve>('straight');\n\n /** Draws a dot on every point, not just the hovered one. Handy with few points. */\n readonly showPoints = input(false, { transform: booleanAttribute });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const base = baseChartOptions();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const dashed = this.dashed();\n const muted = this.isMuted();\n\n // grey context lines go first so the highlighted ones are drawn on top\n const order = series.map((_, index) => index).sort((a, b) => Number(muted[b]) - Number(muted[a]));\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'line',\n height: this.height()\n },\n colors: order.map(index => colours[index]),\n series: order.map(index => ({ name: series[index].name, data: series[index].data })),\n stroke: {\n curve: this.curve(),\n width: order.map(index => muted[index] ? 1.5 : 2),\n dashArray: order.map(index => dashed[index] ? 6 : 0),\n lineCap: 'round'\n },\n // the surface ring keeps a dot readable where it sits on another line\n markers: {\n size: this.showPoints() ? 4 : 0,\n strokeColors: CHART_INK.surface,\n strokeWidth: 2,\n hover: { size: 5 }\n },\n xaxis: {\n ...base.xaxis,\n categories,\n tickAmount: categories.length > MAX_AXIS_LABELS ? MAX_AXIS_LABELS : undefined,\n labels: { ...CHART_AXIS_LABELS, hideOverlappingLabels: true, rotate: 0 },\n crosshairs: {\n show: true,\n width: 1,\n stroke: { color: CHART_INK.grid, width: 1, dashArray: 0 }\n },\n // the tooltip already names the category\n tooltip: { enabled: false }\n },\n yaxis: {\n ...base.yaxis,\n labels: { ...CHART_AXIS_LABELS, formatter: this.valueFormatter() }\n },\n grid: {\n ...base.grid,\n xaxis: { lines: { show: false } },\n yaxis: { lines: { show: true } }\n },\n tooltip: {\n shared: true,\n intersect: false,\n // read at hover time, so hiding a series doesn't rebuild the chart\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n dashed: dashed[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null,\n muted: muted[index]\n }))\n .filter(row => !this.hiddenSeries().includes(row.name))\n .sort((a, b) => this.tooltipOrder(a, b))\n .map(row => ({ ...row, value: this.formatValue(row.raw) }));\n\n const shown = rows.filter(row => !row.muted).length + MAX_CONTEXT_ROWS;\n const extra = rows.length - shown;\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.slice(0, shown),\n extra > 0 ? `${extra} more` : ''\n );\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n\n // highlighted rows first in highlight order, then the grey ones biggest first\n private tooltipOrder(\n a: { name: string; raw: number | null; muted: boolean },\n b: { name: string; raw: number | null; muted: boolean }\n ): number {\n if (a.muted !== b.muted) {\n return Number(a.muted) - Number(b.muted);\n }\n\n const highlight = this.highlight();\n\n if (!a.muted && highlight) {\n return highlight.indexOf(a.name) - highlight.indexOf(b.name);\n }\n\n // a handful keep the legend order, lots are easier to scan biggest first\n if (!a.muted && this.series().length <= SORT_ROWS_AFTER) {\n return 0;\n }\n\n return (b.raw ?? -Infinity) - (a.raw ?? -Infinity);\n }\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** How points are joined, straight segments, a smooth curve, or steps. */\nexport const LineChartCurves = ['straight', 'smooth', 'stepline'] as const;\n\n/** @see {@link LineChartCurves} */\nexport type LineChartCurve = typeof LineChartCurves[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport {\n CHART_INK,\n type ChartSeriesStyle,\n chartSeriesStyle\n} from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { PieChartVariant } from './pie-chart.types';\n\n\nconst percentFormatter = new Intl.NumberFormat('en-GB', {\n style: 'percent',\n maximumFractionDigits: 1\n});\n\n/**\n * Slices for showing how a whole splits into parts. Each category is a\n * slice, only the first series is drawn. Best kept to a handful of slices,\n * fold the small ones into \"Other\".\n */\n@Component({\n selector: 'ui-pie-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiPieChartComponent extends UiAxisChartBase {\n readonly variant = input<PieChartVariant>('pie');\n\n /** Shown above the total in the middle of a donut. */\n readonly totalLabel = input<string>('Total');\n\n protected readonly values = computed(() => this.series()[0]?.data ?? []);\n\n // slices are categories here, so highlight and colours work per category not per series\n protected override readonly isEmpty = computed(() =>\n !this.values().some(value => value !== null && value > 0)\n );\n\n protected override readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.categories().map(name =>\n !!highlight && !highlight.includes(name)\n );\n });\n\n protected override readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n\n return this.categories().map((name, index) =>\n muted[index]\n ? { colour: CHART_INK.context, dashed: false }\n : chartSeriesStyle(\n highlight ? highlight.indexOf(name) : index,\n false\n )\n );\n });\n\n override readonly legendItems = computed(() => {\n const highlight = this.highlight();\n const items = this.categories()\n .map((name, index) => ({ name, ...this.styles()[index] }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n // apex can't hide a pie slice, so hidden ones are left out of the options instead\n private readonly slices = computed(() => {\n const hidden = this.hiddenSeries();\n const values = this.values();\n const colours = this.colours();\n\n return this.categories()\n .map((name, index) => ({\n name,\n value: values[index] ?? 0,\n colour: colours[index]\n }))\n .filter(slice => !hidden.includes(slice.name));\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const base = baseChartOptions();\n const slices = this.slices();\n const donut = this.variant() === 'donut';\n const total = slices.reduce((sum, slice) => sum + slice.value, 0);\n const centreText = {\n fontSize: '12px',\n color: CHART_INK.muted,\n offsetY: -4\n };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: donut ? 'donut' : 'pie',\n height: this.height()\n },\n colors: slices.map(slice => slice.colour),\n labels: slices.map(slice => slice.name),\n series: slices.map(slice => slice.value),\n // a surface coloured gap between slices\n stroke: { show: true, width: 2, colors: [CHART_INK.surface] },\n // lightening a grey slice turns it white, it looks like it's gone\n states: {\n ...base.states,\n hover: { filter: { type: 'darken' } }\n },\n plotOptions: {\n pie: {\n // clicking would pop a slice out, the legend does the toggling\n expandOnClick: false,\n donut: {\n size: '65%',\n labels: {\n show: donut,\n name: centreText,\n value: {\n fontSize: '20px',\n fontWeight: 600,\n color: CHART_INK.text,\n offsetY: 4,\n formatter: (value: string) =>\n this.formatValue(Number(value))\n },\n total: {\n show: true,\n showAlways: true,\n label: this.totalLabel(),\n ...centreText,\n formatter: () => this.formatValue(total)\n }\n }\n }\n }\n },\n tooltip: {\n // apex makes pie tooltips dark and slice coloured, ours match the other charts\n theme: 'light',\n fillSeriesColor: false,\n custom: ({ seriesIndex }: { seriesIndex: number; }) => {\n const slice = slices[seriesIndex];\n\n return slice\n ? chartTooltipHtml(\n '',\n [{\n colour: slice.colour,\n name: slice.name,\n value: this.formatValue(slice.value)\n }],\n total\n ? `${\n percentFormatter.format(slice.value / total)\n } of total`\n : ''\n )\n : '';\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** pie fills the whole circle, donut leaves a hole with the total in it. */\nexport const PieChartVariants = ['pie', 'donut'] as const;\n\n/** @see {@link PieChartVariants} */\nexport type PieChartVariant = typeof PieChartVariants[number];\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.css',\n // keep id/name off the host, same fix as ui-radio\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiCheckboxComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n // shows a dash instead of a tick, purely visual, doesn't change value\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // lets presets like ui-switch restyle the native input\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-checkbox',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n toggle(): void {\n this.value.set(!this.value());\n }\n}\n","<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n","import type { FileRejection, FileSelection } from './file.types';\n\n\nconst SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/**\n * Checks a file against a native `accept` string, e.g. \".csv,image/*\".\n * Dropped files skip the browser's own accept check, so we do it ourselves.\n */\nexport function matchesAccept(file: File, accept: string): boolean {\n const tokens = accept\n .split(',')\n .map(token => token.trim().toLowerCase())\n .filter(Boolean);\n\n if (!tokens.length) {\n return true;\n }\n\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n\n return tokens.some(token => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n\n return type === token;\n });\n}\n\n/** Splits files into ones that pass the accept and size rules and ones that don't. */\nexport function selectFiles(\n files: File[],\n accept: string,\n maxSize: number | null\n): FileSelection {\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of files) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: 'type' });\n } else if (maxSize !== null && file.size > maxSize) {\n rejected.push({ file, reason: 'size' });\n } else {\n accepted.push(file);\n }\n }\n\n return { accepted, rejected };\n}\n\n/** Human readable size, e.g. 1536 -> \"1.5 KB\". */\nexport function formatFileSize(bytes: number): string {\n let size = bytes;\n let unit = 0;\n\n while (size >= 1024 && unit < SIZE_UNITS.length - 1) {\n size /= 1024;\n unit++;\n }\n\n const rounded = unit === 0 ? size : Math.round(size * 10) / 10;\n\n return `${rounded} ${SIZE_UNITS[unit]}`;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { IconName, NgIcon } from '@ng-icons/core';\n\nimport type { FileRejection } from '../file/file.types';\nimport { formatFileSize, selectFiles } from '../file/file.utils';\n\n\n@Component({\n selector: 'ui-dropzone',\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.css',\n imports: [NgIcon]\n})\nexport class UiDropzoneComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly title = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>('heroArrowUpTray');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n // dragenter/leave fire for every child, so count them instead of toggling\n private dragDepth = 0;\n\n protected readonly isDragging = signal(false);\n protected readonly hasRejection = signal(false);\n\n protected readonly displayTitle = computed(() =>\n this.title() ||\n (this.multiple()\n ? 'Drop files here or click to browse'\n : 'Drop a file here or click to browse')\n );\n\n protected readonly files = computed(() =>\n this.value().map(file => ({\n name: file.name,\n size: formatFileSize(file.size)\n }))\n );\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.addFiles([...target.files ?? []]);\n\n // reset so picking the same file again still fires change\n target.value = '';\n }\n\n protected handleDragEnter(event: DragEvent): void {\n event.preventDefault();\n\n if (this.disabled()) {\n return;\n }\n\n this.dragDepth++;\n this.isDragging.set(true);\n }\n\n protected handleDragOver(event: DragEvent): void {\n // without this the browser won't allow the drop\n event.preventDefault();\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected handleDragLeave(): void {\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n\n if (!this.dragDepth) {\n this.isDragging.set(false);\n }\n }\n\n protected handleDrop(event: DragEvent): void {\n event.preventDefault();\n\n this.dragDepth = 0;\n this.isDragging.set(false);\n\n if (!this.disabled()) {\n this.addFiles([...event.dataTransfer?.files ?? []]);\n }\n }\n\n protected clear(): void {\n this.value.set([]);\n this.hasRejection.set(false);\n }\n\n private addFiles(files: File[]): void {\n if (!files.length) {\n return;\n }\n\n // the native picker enforces this, but a drop can carry several files\n const candidates = this.multiple() ? files : files.slice(0, 1);\n const { accepted, rejected } = selectFiles(\n candidates,\n this.accept(),\n this.maxSize()\n );\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n}\n","<div\n class=\"ui-dropzone\"\n role=\"button\"\n [attr.id]=\"id() || null\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-dragging]=\"isDragging() ? '' : null\"\n [attr.data-invalid]=\"hasRejection() ? '' : null\"\n (click)=\"openPicker()\"\n (keydown)=\"handleKeydown($event)\"\n (dragenter)=\"handleDragEnter($event)\"\n (dragover)=\"handleDragOver($event)\"\n (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\"\n>\n <span class=\"ui-dropzone-icon\">\n <ng-icon [name]=\"icon()\" size=\"24\" class=\"shrink-0\" />\n </span>\n\n <span class=\"text-foreground ui-text-body\">\n {{ displayTitle() }}\n </span>\n\n @if (hint()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">\n {{ hint() }}\n </span>\n }\n</div>\n\n<input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n/>\n\n@if (files().length) {\n <div class=\"ui-dropzone-files\">\n <ul class=\"ui-dropzone-list\">\n @for (file of files(); track $index) {\n <li class=\"ui-dropzone-file\">\n <ng-icon\n name=\"heroDocument\"\n class=\"text-muted-foreground-1 shrink-0\"\n />\n <span class=\"text-foreground truncate ui-text-body\">\n {{ file.name }}\n </span>\n <span\n class=\"ms-auto text-muted-foreground-1 shrink-0 ui-text-caption\"\n >\n {{ file.size }}\n </span>\n </li>\n }\n </ul>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-dropzone-clear ui-text-caption\"\n (click)=\"clear()\"\n >\n {{ files().length > 1 ? 'Remove files' : 'Remove file' }}\n </button>\n }\n </div>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n\n@Component({\n selector: 'ui-field',\n templateUrl: './field.component.html',\n styleUrl: './field.component.css'\n})\nexport class UiFieldComponent {\n readonly label = input<string>('');\n readonly hint = input<string>('');\n\n /**\n * Shows a \"*\" marker next to the label.\n */\n readonly required = input(false, { transform: booleanAttribute });\n\n /**\n * An error message, shown instead of `hint` when present.\n */\n readonly error = input<string>('');\n\n // Pass the id of the control being labelled (e.g. the `ui-input`'s `id`)\n // so the label is properly associated with it for accessibility.\n readonly for = input<string>('');\n\n // Ids for the hint/error elements - pass both to the control's\n // `describedBy` (e.g. `ui-input`) so screen readers announce whichever\n // is showing. Safe to pass both even though only one renders at a\n // time - an aria-describedby token pointing at a nonexistent id is\n // simply ignored.\n readonly hintId = input<string>('');\n readonly errorId = input<string>('');\n\n protected get forAttr() {\n return this.for() || null;\n }\n\n protected get hintAttr() {\n return this.hintId() || null;\n }\n\n protected get errorAttr() {\n return this.errorId() || null;\n }\n}\n","@if (label()) {\n <label\n [attr.for]=\"forAttr\"\n class=\"ui-text-body ui-field-label\"\n >\n {{ label() }}\n\n @if (required()) {\n <span class=\"text-danger-500\" aria-hidden=\"true\">*</span>\n <span class=\"sr-only\">(required)</span>\n }\n </label>\n}\n\n<ng-content />\n\n@if (error()) {\n <div\n [attr.id]=\"errorAttr\"\n class=\"text-danger-600 ui-text-caption ui-field-hint\"\n role=\"alert\"\n >\n {{ error() }}\n </div>\n} @else if (hint()) {\n <div\n [attr.id]=\"hintAttr\"\n class=\"text-muted-foreground-1 ui-text-caption ui-field-hint\"\n >\n {{ hint() }}\n </div>\n}\n","/** Why a file was turned away by a file picker. */\nexport const FileRejectionReasons = ['type', 'size'] as const;\n\n/** @see {@link FileRejectionReasons} */\nexport type FileRejectionReason = typeof FileRejectionReasons[number];\n\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n}\n\nexport interface FileSelection {\n accepted: File[];\n rejected: FileRejection[];\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n input,\n model,\n output,\n TemplateRef\n} from '@angular/core';\n\nimport {\n type InputAriaAutocomplete,\n type InputAriaHasPopup,\n type InputMode,\n type InputType,\n type InputValidation\n} from './input.types';\n\n\n@Component({\n selector: 'ui-input',\n templateUrl: './input.component.html',\n styleUrl: './input.component.css',\n imports: [NgTemplateOutlet]\n})\nexport class UiInputComponent<ValueType = string> {\n readonly value = model.required<ValueType>();\n\n readonly classes = input<string>('');\n\n readonly type = input<InputType>('text');\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly autocomplete = input<string>('');\n readonly inputmode = input<InputMode | ''>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // these values can be strings or numbers depending on the input type\n readonly min = input<string | number>('');\n readonly max = input<string | number>('');\n readonly step = input<string | number>('');\n readonly pattern = input<string>('');\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly list = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n // for inputs that drive a popup, e.g. a select's search box or a datepicker\n // not \"role\", a static role attribute would also land on the host element\n readonly inputRole = input<string>('');\n readonly ariaExpanded = input<boolean | null>(null);\n readonly ariaControls = input<string>('');\n readonly ariaActiveDescendant = input<string | null>(null);\n readonly ariaAutocomplete = input<InputAriaAutocomplete | ''>('');\n readonly ariaHasPopup = input<InputAriaHasPopup | ''>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-input',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.value.set(this.parseValue(target));\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n\n private parseValue(element: HTMLInputElement): ValueType {\n if (this.type() !== 'number') {\n return element.value as ValueType;\n }\n\n if (!element.value) {\n return null as ValueType;\n }\n\n return element.valueAsNumber as ValueType;\n }\n}\n","<ng-container *ngTemplateOutlet=\"leadingElement()\"></ng-container>\n\n<input\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [type]=\"type()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [autocomplete]=\"autocomplete()\"\n [attr.min]=\"min() === '' ? null : min()\"\n [attr.max]=\"max() === '' ? null : max()\"\n [attr.step]=\"step() === '' ? null : step()\"\n [attr.pattern]=\"pattern() || null\"\n [attr.inputmode]=\"inputmode() || null\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.list]=\"list() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.role]=\"inputRole() || null\"\n [attr.aria-expanded]=\"ariaExpanded()\"\n [attr.aria-controls]=\"ariaControls() || null\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [attr.aria-autocomplete]=\"ariaAutocomplete() || null\"\n [attr.aria-haspopup]=\"ariaHasPopup() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n/>\n\n<ng-container *ngTemplateOutlet=\"trailingElement()\"></ng-container>\n","/** Native type values ui-input supports. File/checkbox/radio/range need their own components. */\nexport const InputTypes = [\n 'text',\n 'email',\n 'tel',\n 'url',\n 'search',\n 'password',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n 'color'\n] as const;\n\n/** @see {@link InputTypes} */\nexport type InputType = typeof InputTypes[number];\n\n/** Native inputmode values, hinting at the virtual keyboard to show. */\nexport const InputModes = [\n 'none',\n 'text',\n 'decimal',\n 'numeric',\n 'tel',\n 'search',\n 'email',\n 'url'\n] as const;\n\n/** @see {@link InputModes} */\nexport type InputMode = typeof InputModes[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type InputValidation = boolean | null;\n\n/** Native aria-autocomplete values, for inputs that suggest as you type. */\nexport const InputAriaAutocompletes = ['none', 'inline', 'list', 'both'] as const;\n\n/** @see {@link InputAriaAutocompletes} */\nexport type InputAriaAutocomplete = typeof InputAriaAutocompletes[number];\n\n/** Native aria-haspopup values, for inputs that open something. */\nexport const InputAriaHasPopups = ['listbox', 'dialog', 'grid', 'menu', 'tree'] as const;\n\n/** @see {@link InputAriaHasPopups} */\nexport type InputAriaHasPopup = typeof InputAriaHasPopups[number];\n","import { Component } from '@angular/core';\n\n\n/**\n * A static and non-interactable text or symbol that can be combined with\n * a `ui-input` inside of a `ui-input-group`. Example: this could represent\n * a currency symbol or unit of measurement.\n */\n@Component({\n selector: 'ui-input-addon',\n template: `<ng-content />`,\n styleUrl: './input-addon.component.css',\n host: { class: 'ui-text-body-alt' }\n})\nexport class UiInputAddonComponent {}\n","import { Component, contentChildren, effect, model } from '@angular/core';\n\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-input-group',\n template: '<ng-content />',\n styleUrl: './input-group.component.css'\n})\nexport class UiInputGroupComponent {\n readonly inputs = contentChildren(UiInputComponent, { descendants: false });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n constructor() {\n effect(() => {\n const state = this.validationState();\n\n for (const input of this.inputs()) {\n input.validationState.set(state);\n }\n });\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-radio',\n templateUrl: './radio.component.html',\n styleUrl: './radio.component.css',\n // unbind id and name attrs to not cause conflict with the native input\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiRadioComponent<ValueType = unknown> {\n readonly value = model.required<ValueType>();\n readonly option = input.required<ValueType>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n readonly compareWith = input<(a: ValueType, b: ValueType) => boolean>(\n (a, b) => a === b\n );\n\n readonly checked = computed(() =>\n this.compareWith()(this.value(), this.option())\n );\n\n select(): void {\n this.value.set(this.option());\n }\n}\n","<input\n type=\"radio\"\n class=\"border-gray-300 focus:ring-2 focus:ring-primary-200/50 size-4 text-primary-600\"\n [id]=\"id()\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n (change)=\"select()\"\n/>\n","import { Component, computed, input } from '@angular/core';\n\nimport { BadgeAppearance, BadgeIntent, BadgeSize } from './badge.types';\n\n\n@Component({\n selector: 'ui-badge',\n templateUrl: './badge.component.html',\n styleUrl: './badge.component.css'\n})\nexport class UiBadgeComponent {\n readonly appearance = input<BadgeAppearance>('solid');\n readonly intent = input<BadgeIntent>('primary');\n readonly size = input<BadgeSize>('md');\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-badge',\n `ui-badge--${this.intent()}-${this.appearance()}`,\n `ui-badge--${this.size()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<div [class]=\"generatedClasses()\">\n <ng-content></ng-content>\n</div>\n","/** The radius that a card can hold. Maps directly to tailwindcss' rounded classes. */\nexport const CardRadii = ['none', 'sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link CardRadii} */\nexport type CardRadius = typeof CardRadii[number];\n\n// Written out in full so tailwind picks them up\nexport const radiusClasses: Record<CardRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl'\n};\n","import { Component, computed, input } from '@angular/core';\n\nimport { CardRadius, radiusClasses } from './card.types';\n\n\n@Component({\n selector: 'ui-card',\n template: '<ng-content />',\n styleUrl: './card.component.css',\n host: { '[class]': 'generatedClasses()' }\n})\nexport class UiCardComponent {\n readonly radius = input<CardRadius>('md');\n\n readonly generatedClasses = computed<string>(() =>\n radiusClasses[this.radius()]\n );\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\n\nimport { UiOverlayOptions } from \"./overlay.types\";\n\n\n@Injectable({ providedIn: \"root\" })\nexport class UiOverlayPositioner {\n readonly position = (\n reference: HTMLElement,\n overlay: HTMLElement,\n options: UiOverlayOptions\n ) => computePosition(reference, overlay, {\n placement: options.placement,\n strategy: \"fixed\",\n middleware: [\n offset(options.offset),\n flip({ padding: options.viewportPadding }),\n shift({ padding: options.viewportPadding })\n ]\n });\n\n readonly watch = (\n reference: HTMLElement,\n overlay: HTMLElement,\n update: () => void\n ) => autoUpdate(reference, overlay, update);\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\n\nimport { UiOverlayStackEntry } from './overlay.types';\n\n\n/** Tracks open overlays so only the top one reacts to outside clicks and Escape. */\n@Injectable({ providedIn: 'root' })\nexport class UiOverlayStack {\n private readonly entries: UiOverlayStackEntry[] = [];\n\n constructor() {\n document.addEventListener('click', this.onDocumentClick);\n document.addEventListener('keydown', this.onKeyDown);\n\n inject(DestroyRef).onDestroy(() => {\n document.removeEventListener('click', this.onDocumentClick);\n document.removeEventListener('keydown', this.onKeyDown);\n });\n }\n\n readonly push = (entry: UiOverlayStackEntry) => {\n this.remove(entry);\n this.entries.push(entry);\n };\n\n readonly remove = (entry: UiOverlayStackEntry) => {\n const index = this.entries.indexOf(entry);\n if (index !== -1) { this.entries.splice(index, 1); }\n };\n\n private readonly top = () => this.entries.at(-1);\n\n private readonly onDocumentClick = (event: MouseEvent) =>\n this.top()?.onDocumentClick(event);\n\n private readonly onKeyDown = (event: KeyboardEvent) =>\n this.top()?.onKeyDown(event);\n}\n","import {\n Component,\n effect,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { DropdownMatchWidth } from '../../generic/dropdown/dropdown.types';\nimport { UiOverlayPositioner } from './overlay.positioner';\nimport { UiOverlayStack } from './overlay.stack';\nimport { UiOverlayCloseBehaviour, UiOverlayStackEntry } from './overlay.types';\n\n\n@Component({\n selector: 'ui-overlay',\n exportAs: 'uiOverlay',\n template: '<ng-content />',\n host: { style: 'display: contents;' }\n})\nexport class UiOverlayComponent implements UiOverlayStackEntry {\n private readonly positioner = inject(UiOverlayPositioner);\n private readonly stack = inject(UiOverlayStack);\n\n readonly content = input<ElementRef<HTMLInputElement>>();\n readonly anchor = input<ElementRef<HTMLElement>>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly isOpen = input.required<WritableSignal<boolean>>();\n\n readonly placement = input<Placement>('bottom-start');\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Forces this element to match the width of its anchor element. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n constructor() {\n effect(onCleanup => {\n if (!this.isOpen()()) { return; }\n\n this.stack.push(this);\n onCleanup(() => this.stack.remove(this));\n });\n\n effect(onCleanup => {\n const anchor = this.anchor();\n const content = this.content();\n\n if (!this.isOpen()() || !anchor || !content) { return; }\n\n const referenceElement = anchor.nativeElement;\n const floatingElement = content.nativeElement;\n\n const update = () => {\n const matchWidth = this.matchWidth();\n\n if (matchWidth) {\n const width = `${referenceElement.offsetWidth}px`;\n\n if (matchWidth === 'both') {\n floatingElement.style.maxWidth = width;\n floatingElement.style.minWidth = width;\n } else {\n floatingElement.style[matchWidth] = width;\n }\n }\n\n return this.positioner.position(\n referenceElement,\n floatingElement,\n {\n placement: this.placement(),\n offset: this.offset(),\n viewportPadding: this.viewportPadding()\n }\n ).then(({ x, y }) =>\n Object.assign(floatingElement.style, {\n left: `${x}px`,\n top: `${y}px`\n })\n );\n };\n\n update();\n\n onCleanup(\n this.positioner.watch(referenceElement, floatingElement, update)\n );\n });\n }\n\n private readonly close = () => this.isOpen().set(false);\n\n readonly onDocumentClick = (event: MouseEvent) => {\n const behaviour = this.closeBehaviour();\n if (behaviour === 'none') { return; }\n\n const target = event.target;\n if (!(target instanceof Node)) { return; }\n\n const anchorElement = this.anchor()?.nativeElement;\n const contentElement = this.content()?.nativeElement;\n const isInsideAnchor = anchorElement?.contains(target) ?? false;\n const isInsideContent = contentElement?.contains(target) ?? false;\n\n // Anchor can wrap the content too, so only treat a click as \"on the\n // anchor\" (e.g. the trigger button) when it's not inside the content.\n if (isInsideAnchor && !isInsideContent) { return; }\n\n if (behaviour === 'whenClickAnywhere') {\n this.close();\n return;\n }\n\n if (!isInsideContent) {\n this.close();\n }\n };\n\n readonly onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') { this.close(); }\n };\n}\n","import { Directive, ElementRef, inject } from \"@angular/core\";\n\n\n@Directive({\n selector: '[uiDropdownContent]',\n host: { style: \"position: fixed; z-index: 50;\" }\n})\nexport class UiDropdownDirective {\n readonly element = inject(ElementRef<HTMLElement>);\n}\n","import {\n Component,\n contentChild,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiDropdownDirective } from './dropdown.directives';\nimport { DropdownMatchWidth } from './dropdown.types';\n\n\n@Component({\n selector: 'ui-dropdown',\n exportAs: 'uiDropdown',\n templateUrl: './dropdown.component.html',\n imports: [UiOverlayComponent],\n host: { class: 'inline-flex size-fit' }\n})\nexport class UiDropdownComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n readonly content = contentChild(UiDropdownDirective);\n readonly isOpen = input.required<WritableSignal<boolean>>();\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Gives the floating content a min-width matching the dropdown's own width. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n readonly toggle = () => this.isOpen().update(value => !value);\n readonly close = () => this.isOpen().set(false);\n readonly open = () => this.isOpen().set(true);\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()?.element\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [viewportPadding]=\"viewportPadding()\"\n [matchWidth]=\"matchWidth()\"\n>\n <ng-content />\n</ui-overlay>","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n TemplateRef,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { Placement } from '@floating-ui/dom';\nimport { NgIcon } from '@ng-icons/core';\nimport {\n catchError,\n debounceTime,\n Observable,\n of,\n skip,\n Subject,\n switchMap\n} from 'rxjs';\n\nimport { UiBadgeComponent } from '../../generic/badge/badge.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\nimport { SelectDataSource, SelectDataSourceContent } from './select.datasource';\nimport {\n SearchMode,\n SelectMultipleDisplay,\n SelectOptionContext,\n SelectRow,\n SelectTriggerContext\n} from './select.types';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-select',\n templateUrl: './select.component.html',\n styleUrl: './select.component.css',\n imports: [\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiBadgeComponent,\n UiCardComponent,\n NgIcon,\n NgTemplateOutlet\n ],\n host: { '(focusout)': 'onFocusOut($event)' }\n})\nexport class UiSelectComponent<Model = unknown> {\n readonly isOpen = signal(false);\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n\n readonly dataSource = input.required<SelectDataSource<Model>>();\n readonly items = signal<Model[]>([]);\n\n readonly placeholder = input<string>('Select an option');\n\n /** Goes on the trigger (or the inline search box), pass it to ui-field's `for`. */\n readonly id = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly pageSize = input<number>(10);\n readonly searchMode = input<SearchMode>('none');\n\n // added: disabled state, previously had CSS but nothing set it\n readonly disabled = input(false, { transform: booleanAttribute });\n // added: validation styling to match ui-input\n readonly validationState = model<InputValidation>(null);\n\n // opt-in, most selects back a required value where clearing isn't valid\n readonly clearable = input<boolean>(false);\n readonly clearLabel = input<string>('None');\n\n /**\n * Offers a \"Create\" row when a search matches nothing. Needs a\n * searchMode, the parent handles `create` and adds the new item.\n */\n readonly creatable = input(false, { transform: booleanAttribute });\n readonly createLabel = input<(query: string) => string>(query =>\n `Create \"${query}\"`\n );\n\n /** Puts a heading above each run of items in the same group. Expects items sorted by group. */\n readonly groupBy = input<((item: Model) => string | null) | null>(null);\n\n /** Scrolls the selected option into view when the list opens. */\n readonly scrollToSelected = input(true, { transform: booleanAttribute });\n\n /** Lets several items be picked, bound through `selectedItems`. */\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly multipleDisplay = input<SelectMultipleDisplay>('text');\n\n /** In text display, swaps the list of names for a count past this many. 0 always counts. */\n readonly counterAfter = input<number | null>(null);\n readonly counterLabel = input<(count: number) => string>(count =>\n `${count} selected`\n );\n\n readonly compareWith = input<(a: Model, b: Model) => boolean>(\n (a, b) => a === b\n );\n\n readonly displayWith = input<(item: Model) => string>(\n item => `${item}`\n );\n\n readonly selectionChange = output<Model | null>();\n\n /** Emits the search text when the \"Create\" row is picked. */\n readonly create = output<string>();\n // changed to a model so a selection can be bound in from outside\n readonly selectedItem = model<Model | null>(null);\n readonly selectedItems = model<Model[]>([]);\n readonly query = signal('');\n readonly loading = signal(false);\n readonly hasMore = signal(true);\n\n readonly optionTemplate = contentChild<\n TemplateRef<SelectOptionContext<Model>>\n >('option');\n readonly triggerTemplate = contentChild<\n TemplateRef<SelectTriggerContext<Model>>\n >('trigger');\n\n /** Index into the pickable rows, the one keyboard focus sits on. */\n readonly activeIndex = signal(0);\n\n readonly listId = `ui-select-${nextId++}`;\n\n readonly hasSelection = computed(() =>\n this.multiple()\n ? this.selectedItems().length > 0\n : this.selectedItem() !== null\n );\n\n readonly triggerLabel = computed(() => {\n const display = this.displayWith();\n\n if (!this.multiple()) {\n const selected = this.selectedItem();\n\n return selected !== null ? display(selected) : this.placeholder();\n }\n\n const selected = this.selectedItems();\n const counterAfter = this.counterAfter();\n\n if (!selected.length) {\n return this.placeholder();\n }\n\n return counterAfter !== null && selected.length > counterAfter\n ? this.counterLabel()(selected.length)\n : selected.map(display).join(', ');\n });\n\n /** Tags only replace the trigger text when there's no inline search box. */\n readonly showTags = computed(() =>\n this.multiple() &&\n this.multipleDisplay() === 'tags' &&\n this.searchMode() !== 'inline'\n );\n\n /** The text to create from, or null when there's nothing to offer. */\n readonly createQuery = computed(() => {\n const query = this.query().trim();\n const display = this.displayWith();\n\n if (!this.creatable() || !query || this.loading()) {\n return null;\n }\n\n const exists = this.items().some(item =>\n display(item).toLowerCase() === query.toLowerCase()\n );\n\n return exists ? null : query;\n });\n\n readonly rows = computed<SelectRow<Model>[]>(() => {\n const rows: SelectRow<Model>[] = [];\n const groupBy = this.groupBy();\n const display = this.displayWith();\n const createQuery = this.createQuery();\n\n let index = 0;\n let group: string | null | undefined;\n\n if (this.clearable() && this.hasSelection()) {\n rows.push({ kind: 'clear', id: this.rowId(index), index: index++ });\n }\n\n for (const item of this.items()) {\n if (groupBy) {\n const next = groupBy(item);\n\n if (next !== group && next) {\n rows.push({\n kind: 'group',\n id: `${this.listId}-group-${rows.length}`,\n label: next\n });\n }\n\n group = next;\n }\n\n rows.push({\n kind: 'item',\n id: this.rowId(index),\n index: index++,\n item,\n label: display(item),\n selected: this.isSelected(item)\n });\n }\n\n if (createQuery) {\n rows.push({\n kind: 'create',\n id: this.rowId(index),\n index,\n query: createQuery\n });\n }\n\n return rows;\n });\n\n private readonly pickable = computed(() =>\n this.rows().filter(row => row.kind !== 'group')\n );\n\n readonly activeId = computed(() =>\n this.isOpen() ? this.pickable()[this.activeIndex()]?.id ?? null : null\n );\n\n private page = 0;\n\n // one shared stream for every fetch, so a new request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n constructor() {\n // reloads when a new data source comes in, e.g. after creating an item\n effect(() => {\n this.dataSource();\n untracked(() => this.loadFirstPage());\n });\n\n // start on the selected option, and bring it into view\n effect(() => {\n if (!this.isOpen()) {\n return;\n }\n\n untracked(() => {\n const selected = this.pickable().findIndex(row =>\n row.kind === 'item' && row.selected\n );\n\n this.activeIndex.set(\n this.scrollToSelected() && selected >= 0 ? selected : 0\n );\n\n afterNextRender(() => {\n if (this.scrollToSelected()) {\n this.scrollActiveIntoView();\n }\n\n if (this.searchMode() === 'dropdown') {\n this.searchInput()?.focus();\n }\n }, { injector: this.injector });\n });\n });\n\n // debounce the query signal itself instead of a separate subject\n toObservable(this.query).pipe(\n debounceTime(300),\n skip(1), // skip the initial value, the data source effect already loads that\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.loadFirstPage());\n\n // switchMap cancels the previous request, fixing stale responses overwriting newer ones\n this.load$.pipe(\n switchMap(() => this.fetchPage()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n private fetchPage(): Observable<SelectDataSourceContent<Model> | null> {\n this.loading.set(true);\n\n const request = this.dataSource().load({\n query: this.query(),\n page: this.page,\n size: this.pageSize()\n });\n\n return request.pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: SelectDataSourceContent<Model> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.items.update(items => [...items, ...result.items]);\n this.hasMore.set(result.hasMore);\n }\n\n this.cdr.markForCheck();\n }\n\n open(): void {\n if (!this.disabled()) {\n this.isOpen.set(true);\n }\n }\n\n toggle(): void {\n if (this.isOpen()) {\n this.isOpen.set(false);\n } else {\n this.open();\n }\n }\n\n select(item: Model): void {\n this.selectedItem.set(item);\n this.selectionChange.emit(item);\n }\n\n isSelected(item: Model): boolean {\n const compare = this.compareWith();\n\n if (item === null) {\n return false;\n }\n\n if (this.multiple()) {\n return this.selectedItems().some(selected =>\n compare(selected, item)\n );\n }\n\n const selected = this.selectedItem();\n\n return selected !== null && compare(selected, item);\n }\n\n toggleItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n this.isSelected(item)\n ? selected.filter(existing => !compare(existing, item))\n : [...selected, item]\n );\n }\n\n removeItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n selected.filter(existing => !compare(existing, item))\n );\n }\n\n clear(): void {\n if (this.multiple()) {\n this.selectedItems.set([]);\n } else {\n this.selectedItem.set(null);\n this.selectionChange.emit(null);\n }\n\n this.isOpen.set(false);\n this.focusTrigger();\n\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onItemClick(item: Model): void {\n // multiple stays open so several can be ticked in one go\n if (this.multiple()) {\n this.toggleItem(item);\n return;\n }\n\n this.select(item);\n this.isOpen.set(false);\n this.focusTrigger();\n\n // The behaviour of clearing the inline search flows better than\n // leaving it as is. Clicking into the input with a value already\n // selected will reveal the previous query which may be confusing.\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onCreate(): void {\n const query = this.createQuery();\n\n if (!query) {\n return;\n }\n\n this.create.emit(query);\n this.query.set('');\n\n if (!this.multiple()) {\n this.isOpen.set(false);\n this.focusTrigger();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const count = this.pickable().length;\n // space types in search boxes, only the plain trigger treats it as a pick\n const isSpacePick = event.key === ' ' && this.searchMode() === 'none';\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n return;\n }\n\n this.moveActive(event.key === 'ArrowDown' ? 1 : -1, count);\n return;\n case 'Home':\n case 'End':\n if (this.isOpen() && count && this.searchMode() === 'none') {\n event.preventDefault();\n this.setActive(event.key === 'Home' ? 0 : count - 1);\n }\n return;\n case 'Enter':\n case ' ':\n if (event.key === ' ' && !isSpacePick) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n } else {\n this.pickActive();\n }\n return;\n case 'Escape':\n // the overlay closes itself, focus just needs a home\n this.focusTrigger();\n return;\n }\n }\n\n onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (this.closeBehaviour() === 'none') {\n return;\n }\n\n // tabbing away closes it, moving between the trigger and the list doesn't\n if (\n !(next instanceof Node) ||\n !this.host.nativeElement.contains(next)\n ) {\n this.isOpen.set(false);\n }\n }\n\n setActive(index: number): void {\n this.activeIndex.set(index);\n\n afterNextRender(() => this.scrollActiveIntoView(), {\n injector: this.injector\n });\n }\n\n loadFirstPage(): void {\n this.page = 0;\n this.items.set([]);\n this.hasMore.set(true);\n\n this.load$.next();\n }\n\n loadNextPage(): void {\n if (this.loading() || !this.hasMore()) {\n return;\n }\n\n this.page++;\n this.load$.next();\n }\n\n onQueryChange(query: string): void {\n // sets straight away so the search box doesn't fight the user's typing, the\n // constructor's toObservable pipeline debounces the actual reload\n this.query.set(query);\n this.activeIndex.set(0);\n this.open();\n }\n\n onScroll(scrollContainer: HTMLElement): void {\n const remainingPixels = scrollContainer.scrollHeight\n - scrollContainer.scrollTop\n - scrollContainer.clientHeight;\n\n if (remainingPixels < 48) {\n this.loadNextPage();\n }\n }\n\n private pickActive(): void {\n const row = this.pickable()[this.activeIndex()];\n\n if (!row) {\n return;\n }\n\n if (row.kind === 'clear') {\n this.clear();\n } else if (row.kind === 'create') {\n this.onCreate();\n } else if (row.kind === 'item') {\n this.onItemClick(row.item);\n }\n }\n\n private moveActive(step: number, count: number): void {\n if (count) {\n this.setActive((this.activeIndex() + step + count) % count);\n }\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n\n if (id) {\n this.host.nativeElement\n .querySelector(`#${id}`)\n ?.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private focusTrigger(): void {\n const trigger = this.searchMode() === 'inline'\n ? this.searchInput()\n : this.host.nativeElement.querySelector<HTMLElement>('.ui-select');\n\n trigger?.focus();\n }\n\n // the inline box or the one inside the dropdown, never both\n private searchInput(): HTMLInputElement | null {\n return this.host.nativeElement.querySelector('ui-input input');\n }\n\n private rowId(index: number): string {\n return `${this.listId}-${index}`;\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n [placement]=\"placement()\"\n [closeBehaviour]=\"closeBehaviour()\"\n matchWidth=\"minWidth\"\n class=\"w-full\"\n>\n @if (searchMode() === 'inline') {\n <ui-input\n [value]=\"isOpen() ? query() : triggerLabel()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"triggerLabel()\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaHasPopup=\"listbox\"\n class=\"border-0!\"\n classes=\"h-auto!\"\n autocomplete=\"off\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-template #trailing>\n <ng-icon\n name=\"heroChevronDown\"\n class=\"mx-3 size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </ng-template>\n </ui-input>\n } @else {\n <div\n class=\"ui-select-trigger\"\n [class.ui-select-trigger--tags]=\"showTags()\"\n >\n <button\n type=\"button\"\n class=\"flex justify-between items-center gap-2 px-3 py-2 text-left ui-select\"\n aria-haspopup=\"listbox\"\n [attr.id]=\"id() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"searchMode() === 'none' ? activeId() : null\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (showTags()) {\n <!-- the visible tags sit on top, this names the button for screen readers -->\n <span class=\"sr-only\">{{ triggerLabel() }}</span>\n } @else if (!multiple() && triggerTemplate() && selectedItem() !== null) {\n <span class=\"flex items-center gap-2 min-w-0 ui-text-body\">\n <ng-container\n *ngTemplateOutlet=\"triggerTemplate()!; context: { $implicit: selectedItem()! }\"\n />\n </span>\n } @else if (multiple()) {\n <span class=\"ui-text-body ui-select-label\">\n <span\n class=\"ui-select-label-sizer\"\n aria-hidden=\"true\"\n >{{ placeholder() }}</span>\n <span class=\"ui-select-label-text\">{{\n triggerLabel()\n }}</span>\n </span>\n } @else {\n <span class=\"ui-text-body truncate\">{{\n triggerLabel()\n }}</span>\n }\n\n <ng-icon\n name=\"heroChevronDown\"\n class=\"ms-auto size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </button>\n\n @if (showTags()) {\n <span\n class=\"ui-text-body ui-select-tags-sizer\"\n aria-hidden=\"true\"\n >\n {{ placeholder() }}\n </span>\n\n <div class=\"ui-select-tags\">\n @for (item of selectedItems(); track $index) {\n <ui-badge\n intent=\"secondary\"\n appearance=\"soft\"\n size=\"xs\"\n classes=\"ui-select-tag ui-text-caption\"\n >\n <span class=\"truncate\">{{\n displayWith()(item)\n }}</span>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-select-tag-remove\"\n [attr.aria-label]=\"'Remove ' + displayWith()(item)\"\n (click)=\"removeItem(item)\"\n >\n <ng-icon\n name=\"heroXMark\"\n class=\"size-3 shrink-0\"\n />\n </button>\n }\n </ui-badge>\n } @empty {\n <span\n class=\"text-muted-foreground-1 ui-text-body truncate\"\n >\n {{ placeholder() }}\n </span>\n }\n </div>\n }\n </div>\n }\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"lg\" class=\"divide-y overflow-hidden\">\n @if (searchMode() === 'dropdown') {\n <div class=\"p-2\">\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n (keydown)=\"onKeydown($event)\"\n [ariaExpanded]=\"true\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaLabel=\"Search options\"\n autocomplete=\"off\"\n placeholder=\"Search...\"\n />\n </div>\n }\n\n <div\n #scrollContainer\n class=\"py-1 max-h-60 overflow-y-auto\"\n role=\"listbox\"\n [attr.id]=\"listId\"\n [attr.aria-multiselectable]=\"multiple() || null\"\n (scroll)=\"onScroll(scrollContainer)\"\n >\n @for (row of rows(); track row.id) {\n @switch (row.kind) {\n @case ('group') {\n <div\n class=\"ui-text-caption ui-select-group\"\n role=\"presentation\"\n >\n {{ row.label }}\n </div>\n }\n @case ('clear') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"text-muted-foreground-1 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"clear()\"\n >\n <span class=\"truncate\">{{\n clearLabel()\n }}</span>\n </button>\n }\n @case ('item') {\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"text-dropdown-item-foreground ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.aria-selected]=\"row.selected\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onItemClick(row.item)\"\n >\n @if (optionTemplate(); as template) {\n <span\n class=\"flex items-center gap-2 min-w-0 grow\"\n >\n <ng-container\n *ngTemplateOutlet=\"template; context: {\n $implicit: row.item,\n selected: row.selected,\n active: row.index === activeIndex()\n }\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{\n row.label\n }}</span>\n }\n\n @if (row.selected) {\n <ng-icon\n name=\"heroCheck\"\n class=\"size-4 text-primary-600! shrink-0\"\n strokeWidth=\"2.5\"\n />\n }\n </button>\n }\n @case ('create') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"justify-start! text-primary-600 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onCreate()\"\n >\n <ng-icon\n name=\"heroPlus\"\n class=\"size-4 shrink-0\"\n />\n <span class=\"truncate\">{{\n createLabel()(row.query)\n }}</span>\n </button>\n }\n }\n }\n\n @if (loading()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n Loading...\n </div>\n }\n\n @if (!loading() && items().length === 0 && !createQuery()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n No results\n </div>\n }\n </div>\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Observable, of } from 'rxjs';\n\n\nexport interface SelectDataSourceParameters {\n query: string;\n page: number;\n size: number;\n}\n\nexport interface SelectDataSourceContent<Model> {\n items: Model[];\n hasMore: boolean;\n}\n\nexport interface SelectDataSource<Model> {\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>>;\n}\n\nexport class SelectLocalDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly items: Model[],\n private readonly search: (item: Model, query: string) => boolean\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n const query = params.query.trim();\n\n const filteredItems = query\n ? this.items.filter(item => this.search(item, query))\n : this.items;\n\n const start = params.page * params.size;\n const end = start + params.size;\n\n return of({\n items: filteredItems.slice(start, end),\n hasMore: end < filteredItems.length\n });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class SelectRemoteDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly fetch: (\n params: SelectDataSourceParameters\n ) => Observable<SelectDataSourceContent<Model>>\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n return this.fetch(params);\n }\n}\n","export type SearchMode =\n | 'none'\n | 'inline'\n | 'dropdown';\n\n/** How a multiple select shows its selection when closed. */\nexport const SelectMultipleDisplays = ['text', 'tags'] as const;\n\n/** @see {@link SelectMultipleDisplays} */\nexport type SelectMultipleDisplay = typeof SelectMultipleDisplays[number];\n\n/** Context for a projected `#option` template. */\nexport interface SelectOptionContext<Model> {\n $implicit: Model;\n selected: boolean;\n active: boolean;\n}\n\n/** Context for a projected `#trigger` template, single select only. */\nexport interface SelectTriggerContext<Model> {\n $implicit: Model;\n}\n\n/** One line in the open list. Groups are headings, the rest can be picked. */\nexport type SelectRow<Model> =\n | { kind: 'group'; id: string; label: string; }\n | { kind: 'clear'; id: string; index: number; }\n | { kind: 'create'; id: string; index: number; query: string; }\n | {\n kind: 'item';\n id: string;\n index: number;\n item: Model;\n label: string;\n selected: boolean;\n };\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\n\nimport { type TextareaResize, type TextareaValidation } from './textarea.types';\n\n\n@Component({\n selector: 'ui-textarea',\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.css'\n})\nexport class UiTextareaComponent {\n readonly value = model.required<string>();\n\n readonly classes = input<string>('');\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly rows = input<number>(3);\n readonly resize = input<TextareaResize>('vertical');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<TextareaValidation>(null);\n\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-textarea',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n\n this.value.set(target.value);\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n}\n","<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n","/** Native resize values for the textarea element. */\nexport const TextareaResizeOptions = [\n 'none',\n 'both',\n 'horizontal',\n 'vertical'\n] as const;\n\n/** @see {@link TextareaResizeOptions} */\nexport type TextareaResize = typeof TextareaResizeOptions[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type TextareaValidation = boolean | null;\n","import {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef\n} from '@angular/core';\n\nimport { AlertAppearance, AlertIntent } from './alert.types';\n\n\n@Component({\n selector: 'ui-alert',\n templateUrl: './alert.component.html',\n styleUrl: './alert.component.css'\n})\nexport class UiAlertComponent {\n readonly appearance = input<AlertAppearance>('soft');\n readonly intent = input<AlertIntent>('info');\n readonly classes = input<string>('');\n\n readonly icon = contentChild<TemplateRef<unknown>>('icon', {\n descendants: false\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-alert',\n `ui-alert--${this.appearance()}`,\n `ui-alert--${this.intent()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<div [class]=\"generatedClasses()\" role=\"alert\">\n <ng-content></ng-content>\n</div>\n","export const AlertIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n];\n\nexport const AlertAppearances = [\n 'soft',\n 'bordered'\n] as const;\n\nexport type AlertIntent = typeof AlertIntents[number];\nexport type AlertAppearance = typeof AlertAppearances[number];\n","export const BadgeIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport const BadgeAppearances = [\n 'solid',\n 'outline',\n 'soft'\n] as const;\n\nexport const BadgeSizes = [\n 'xs',\n 'sm',\n 'md',\n 'lg'\n] as const;\n\nexport type BadgeIntent = typeof BadgeIntents[number];\nexport type BadgeAppearance = typeof BadgeAppearances[number];\nexport type BadgeSize = typeof BadgeSizes[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport type {\n ButtonAppearance,\n ButtonIntent,\n ButtonSize,\n ButtonType\n} from './button.types';\n\n\n/**\n * A general-purpose button.\n */\n@Component({\n selector: 'ui-button',\n templateUrl: './button.component.html',\n styleUrl: './button.component.css'\n})\nexport class UiButtonComponent {\n readonly appearance = input<ButtonAppearance>('solid');\n readonly intent = input<ButtonIntent>('primary');\n readonly size = input<ButtonSize>('md');\n readonly classes = input<string>('');\n\n readonly type = input<ButtonType>('button');\n readonly ariaLabel = input<string>('');\n\n readonly disabled = input<boolean>(false);\n readonly loading = input<boolean>(false);\n\n /**\n * Whether the underlying `<button>` element should be disabled - true when\n * `disabled` is set explicitly, or implicitly while `loading` is true.\n */\n readonly isDisabled = computed(() => this.disabled() || this.loading());\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-button',\n this.intentAndAppearanceClasses(),\n this.sizeClasses(),\n this.textClasses(),\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly intentAndAppearanceClasses = computed(() => {\n const intent = this.intent();\n const appearance = this.appearance();\n\n return [intent, appearance].includes('none') ?\n '' :\n `ui-button--${intent}-${appearance}`;\n });\n\n private readonly sizeClasses = computed(() => `ui-button--${this.size()}`);\n\n private readonly textClasses = computed(() => ({\n sm: 'ui-text-caption',\n md: 'ui-text-body',\n lg: 'ui-text-body'\n }[this.size()]));\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [class]=\"generatedClasses()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-busy]=\"loading() || null\"\n>\n <ng-content></ng-content>\n\n @if (loading()) {\n <span class=\"sr-only\">Loading</span>\n\n <span class=\"flex items-end justify-center\" aria-hidden=\"true\">\n <span class=\"ms-0.5 inline-flex items-end gap-px pb-px\">\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n </span>\n </span>\n }\n</button>\n","/**\n * The semantic colour of a button. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.intent`.\n */\nexport const ButtonIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger',\n 'none'\n] as const;\n\n/**\n * The visual treatment of a button (fill, outline, etc.), combined with its\n * `intent` to select a variant class. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.appearance`.\n */\nexport const ButtonAppearances = [\n 'solid',\n 'outline',\n 'ghost',\n 'white',\n 'link',\n 'none'\n] as const;\n\n/** The size of a button, controlling its padding and typography scale. */\nexport const ButtonSizes = [\n 'sm',\n 'md',\n 'lg'\n] as const;\n\n/** The native `type` attribute a button can render with. */\nexport const ButtonTypes = [\n 'button',\n 'submit',\n 'reset'\n] as const;\n\n/** @see {@link ButtonIntents} */\nexport type ButtonIntent = typeof ButtonIntents[number];\n\n/** @see {@link ButtonAppearances} */\nexport type ButtonAppearance = typeof ButtonAppearances[number];\n\n/** @see {@link ButtonSizes} */\nexport type ButtonSize = typeof ButtonSizes[number];\n\n/** @see {@link ButtonTypes} */\nexport type ButtonType = typeof ButtonTypes[number];\n","import { Component, contentChildren } from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\n\n\n/**\n * @example\n * ```html\n * <ui-button-group>\n * <ui-button intent=\"secondary\" appearance=\"white\">First</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Second</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Last</ui-button>\n * </ui-button-group>\n * ```\n */\n@Component({\n selector: 'ui-button-group',\n template: '<ng-content></ng-content>',\n host: { class: 'inline-flex' }\n})\nexport class UiButtonGroupComponent {\n readonly buttons = contentChildren(UiButtonComponent, {\n descendants: false\n });\n}\n","import type { IsoDate, IsoDateTime } from './calendar.types';\n\n\nconst ISO_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_PATTERN = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n\n// dates are built from local parts so a timezone never shifts the day\nexport function toIsoDate(date: Date): IsoDate {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\n/** Local midnight for an ISO date, or null when it isn't a real date. */\nexport function parseIsoDate(value: IsoDate | null | undefined): Date | null {\n const match = value ? ISO_PATTERN.exec(value) : null;\n\n if (!match) {\n return null;\n }\n\n const [, year, month, day] = match.map(Number);\n const date = new Date(year, month - 1, day);\n\n // rejects things like 2026-02-31 rolling over into March\n return date.getMonth() === month - 1 ? date : null;\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** Moves by whole months, keeping the day where it can (31 Jan + 1 -> 28 Feb). */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n\n target.setDate(Math.min(date.getDate(), lastDay));\n\n return target;\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Local date and time for \"2026-09-29T14:30\", a date-only string gives midnight. */\nexport function parseIsoDateTime(\n value: IsoDateTime | null | undefined\n): Date | null {\n const date = parseIsoDate(value?.slice(0, 10));\n const time = parseTime(value?.slice(11, 16));\n\n if (date && time) {\n date.setHours(time.hours, time.minutes);\n }\n\n return date;\n}\n\n/** \"14:30\" -> { hours: 14, minutes: 30 }, or null when it isn't a real time. */\nexport function parseTime(\n value: string | null | undefined\n): { hours: number; minutes: number } | null {\n const match = value ? TIME_PATTERN.exec(value) : null;\n\n return match ? { hours: Number(match[1]), minutes: Number(match[2]) } : null;\n}\n\nexport function toTime(hours: number, minutes: number): string {\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n","import {\n afterNextRender,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n signal\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport type {\n CalendarDay,\n CalendarMode,\n DateRange,\n IsoDate,\n WeekStart\n} from './calendar.types';\nimport {\n addDays,\n addMonths,\n parseIsoDate,\n toIsoDate\n} from './calendar.utils';\n\n\n// always six rows so the calendar doesn't jump in height between months\nconst GRID_DAYS = 42;\nconst YEARS_BACK = 100;\nconst YEARS_FORWARD = 10;\n\n@Component({\n selector: 'ui-calendar',\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css',\n imports: [NgIcon, UiSelectComponent]\n})\nexport class UiCalendarComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly mode = input<CalendarMode>('single');\n\n /** The picked date in single mode. */\n readonly value = model<IsoDate | null>(null);\n\n /** The picked start and end in range mode. */\n readonly range = model<DateRange>({ start: null, end: null });\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n protected readonly today = toIsoDate(new Date());\n\n // a string so picking a range end doesn't count as a change and jump the view\n private readonly anchorDate = computed(() =>\n this.mode() === 'range' ? this.range().start : this.value()\n );\n\n // the date keyboard focus sits on, follows the anchor until the user moves it\n private readonly activeDate = linkedSignal(\n () => parseIsoDate(this.anchorDate()) ?? parseIsoDate(this.today)!\n );\n\n // previews the end of a half picked range\n private readonly hoveredDate = signal<IsoDate | null>(null);\n\n protected readonly viewMonth = linkedSignal(() => this.activeDate().getMonth());\n protected readonly viewYear = linkedSignal(() => this.activeDate().getFullYear());\n\n protected readonly monthNames = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), { month: 'long' });\n\n return Array.from({ length: 12 }, (_, month) =>\n format.format(new Date(2026, month, 1))\n );\n });\n\n protected readonly weekdays = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), { weekday: 'short' });\n\n // 4 Jan 2026 is a Sunday\n return Array.from({ length: 7 }, (_, index) =>\n format.format(new Date(2026, 0, 4 + (this.weekStart() + index) % 7))\n .slice(0, 2)\n );\n });\n\n protected readonly monthSource = computed(() =>\n new SelectLocalDataSource(\n Array.from({ length: 12 }, (_, month) => month),\n () => true\n )\n );\n\n protected readonly yearSource = computed(() => {\n const current = new Date().getFullYear();\n const selected = parseIsoDate(this.anchorDate())?.getFullYear() ?? current;\n const first = parseIsoDate(this.min())?.getFullYear() ??\n Math.min(current - YEARS_BACK, selected);\n const last = parseIsoDate(this.max())?.getFullYear() ??\n Math.max(current + YEARS_FORWARD, selected);\n\n // newest first, recent years are what people usually want\n const years = Array.from({ length: last - first + 1 }, (_, index) => last - index);\n\n return new SelectLocalDataSource(years, () => true);\n });\n\n protected readonly displayMonth = (month: number) => this.monthNames()[month];\n\n protected readonly days = computed<CalendarDay[]>(() => {\n const year = this.viewYear();\n const month = this.viewMonth();\n const { start, end, previewEnd } = this.rangeBounds();\n const labelFormat = new Intl.DateTimeFormat(this.locale(), { dateStyle: 'full' });\n\n const first = new Date(year, month, 1);\n const offset = (first.getDay() - this.weekStart() + 7) % 7;\n const gridStart = addDays(first, -offset);\n\n return Array.from({ length: GRID_DAYS }, (_, index) => {\n const date = addDays(gridStart, index);\n const iso = toIsoDate(date);\n\n return {\n iso,\n day: date.getDate(),\n label: labelFormat.format(date),\n isOutside: date.getMonth() !== month,\n isToday: iso === this.today,\n isSelected: iso === start || iso === end,\n isDisabled: this.isUnavailable(iso),\n isInRange: !!start && !!previewEnd && iso > start && iso < previewEnd,\n isRangeStart: !!previewEnd && iso === start && start !== previewEnd,\n isRangeEnd: !!start && iso === previewEnd && start !== previewEnd\n };\n });\n });\n\n private readonly rangeBounds = computed(() => {\n if (this.mode() === 'single') {\n return { start: this.value(), end: null, previewEnd: null };\n }\n\n const { start, end } = this.range();\n const hovered = this.hoveredDate();\n const preview = !end && start && hovered && hovered > start ? hovered : null;\n\n return { start, end, previewEnd: end ?? preview };\n });\n\n /** Only one day is tabbable, arrow keys move between the rest. */\n protected readonly tabbableDate = computed(() => {\n const active = this.activeDate();\n const inView = active.getFullYear() === this.viewYear() &&\n active.getMonth() === this.viewMonth();\n\n return toIsoDate(inView ? active : new Date(this.viewYear(), this.viewMonth(), 1));\n });\n\n protected readonly canGoBack = computed(() => {\n const min = this.min();\n const lastOfPrevious = new Date(this.viewYear(), this.viewMonth(), 0);\n\n return !min || toIsoDate(lastOfPrevious) >= min;\n });\n\n protected readonly canGoForward = computed(() => {\n const max = this.max();\n const firstOfNext = new Date(this.viewYear(), this.viewMonth() + 1, 1);\n\n return !max || toIsoDate(firstOfNext) <= max;\n });\n\n /** Moves focus onto the active day, e.g. when a datepicker opens. */\n focusActiveDate(): void {\n this.host.nativeElement\n .querySelector<HTMLButtonElement>(`[data-date=\"${this.tabbableDate()}\"]`)\n ?.focus();\n }\n\n protected showMonth(offset: number): void {\n const target = new Date(this.viewYear(), this.viewMonth() + offset, 1);\n\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n }\n\n protected select(day: CalendarDay): void {\n if (day.isDisabled) {\n return;\n }\n\n if (this.mode() === 'single') {\n this.value.set(day.iso);\n return;\n }\n\n const { start, end } = this.range();\n\n // a fresh click starts over, picking before the start moves the start\n if (!start || end || day.iso < start) {\n this.range.set({ start: day.iso, end: null });\n } else {\n this.range.set({ start, end: day.iso });\n }\n }\n\n protected preview(date: IsoDate | null): void {\n if (this.mode() === 'range') {\n this.hoveredDate.set(date);\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const current = parseIsoDate(this.tabbableDate())!;\n const target = this.keyTarget(event, current);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n\n this.activeDate.set(target);\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n\n afterNextRender(() => this.focusActiveDate(), { injector: this.injector });\n }\n\n private keyTarget(event: KeyboardEvent, current: Date): Date | null {\n const dayOfWeek = (current.getDay() - this.weekStart() + 7) % 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return addDays(current, -1);\n case 'ArrowRight':\n return addDays(current, 1);\n case 'ArrowUp':\n return addDays(current, -7);\n case 'ArrowDown':\n return addDays(current, 7);\n case 'Home':\n return addDays(current, -dayOfWeek);\n case 'End':\n return addDays(current, 6 - dayOfWeek);\n case 'PageUp':\n return addMonths(current, event.shiftKey ? -12 : -1);\n case 'PageDown':\n return addMonths(current, event.shiftKey ? 12 : 1);\n default:\n return null;\n }\n }\n\n private isUnavailable(iso: IsoDate): boolean {\n const min = this.min();\n const max = this.max();\n\n // ISO dates sort the same as strings\n return (!!min && iso < min) ||\n (!!max && iso > max) ||\n this.isDateDisabled()(iso);\n }\n}\n","<div class=\"ui-calendar-header\">\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Previous month\"\n [disabled]=\"!canGoBack()\"\n (click)=\"showMonth(-1)\"\n >\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n </button>\n\n <div class=\"ui-calendar-selects\">\n <ui-select\n class=\"ui-calendar-month\"\n [dataSource]=\"monthSource()\"\n [displayWith]=\"displayMonth\"\n [pageSize]=\"12\"\n [(selectedItem)]=\"viewMonth\"\n />\n <ui-select\n class=\"ui-calendar-year\"\n [dataSource]=\"yearSource()\"\n [pageSize]=\"500\"\n [(selectedItem)]=\"viewYear\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Next month\"\n [disabled]=\"!canGoForward()\"\n (click)=\"showMonth(1)\"\n >\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n </button>\n</div>\n\n<div class=\"ui-calendar-weekdays\" aria-hidden=\"true\">\n @for (weekday of weekdays(); track $index) {\n <span class=\"ui-calendar-weekday ui-text-caption\">{{ weekday }}</span>\n }\n</div>\n\n<div class=\"ui-calendar-grid\" (mouseleave)=\"preview(null)\">\n @for (day of days(); track day.iso) {\n <button\n type=\"button\"\n class=\"ui-calendar-day ui-text-body-alt\"\n [attr.data-date]=\"day.iso\"\n [attr.data-outside]=\"day.isOutside ? '' : null\"\n [attr.data-today]=\"day.isToday ? '' : null\"\n [attr.data-in-range]=\"day.isInRange ? '' : null\"\n [attr.data-range-start]=\"day.isRangeStart ? '' : null\"\n [attr.data-range-end]=\"day.isRangeEnd ? '' : null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-pressed]=\"day.isSelected\"\n [attr.aria-label]=\"day.label\"\n [tabindex]=\"day.iso === tabbableDate() ? 0 : -1\"\n [attr.aria-disabled]=\"day.isDisabled || null\"\n (click)=\"select(day)\"\n (keydown)=\"handleKeydown($event)\"\n (mouseenter)=\"preview(day.iso)\"\n (focus)=\"preview(day.iso)\"\n >\n {{ day.day }}\n </button>\n }\n</div>\n","/** Which day each calendar row starts on. 0 is Sunday, 1 is Monday. */\nexport const WeekStarts = [0, 1] as const;\n\n/** @see {@link WeekStarts} */\nexport type WeekStart = typeof WeekStarts[number];\n\n/** A date-only ISO string, e.g. \"2026-09-29\". */\nexport type IsoDate = string;\n\nexport interface CalendarDay {\n iso: IsoDate;\n day: number;\n label: string;\n isOutside: boolean;\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n}\n\n/** A local date and time ISO string, e.g. \"2026-09-29T14:30\". */\nexport type IsoDateTime = string;\n\n/** Whether a calendar picks one date or a start and end. */\nexport const CalendarModes = ['single', 'range'] as const;\n\n/** @see {@link CalendarModes} */\nexport type CalendarMode = typeof CalendarModes[number];\n\nexport interface DateRange {\n start: IsoDate | null;\n end: IsoDate | null;\n}\n","import { Component } from '@angular/core';\n\n\n@Component({\n selector: 'ui-container',\n template: '<ng-content></ng-content>',\n host: { class: 'block container' }\n})\nexport class UiContainerComponent {}\n","import { Component, input, signal } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../button/button.component';\n\n\n@Component({\n selector: 'ui-drawer',\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: { '[class.open]': 'isOpen()' }\n})\nexport class UiDrawerComponent {\n readonly isOpen = signal<boolean>(false);\n readonly enableBackdrop = input<boolean>(true);\n\n readonly label = input<string>('');\n readonly subLabel = input<string>('');\n}\n","@if (enableBackdrop()) {\n <div\n class=\"absolute inset-0 bg-black/10 transition-opacity\"\n [class.opacity-0]=\"!isOpen()\"\n [class.pointer-events-none]=\"!isOpen()\"\n aria-hidden=\"true\"\n (click)=\"isOpen.set(false)\"\n >\n </div>\n}\n\n<aside\n class=\"right-0 absolute inset-y-0 bg-white border-gray-200 border-s w-100 h-full transition-transform duration-200\"\n [class.translate-x-full]=\"!isOpen()\"\n>\n <div class=\"flex flex-col h-full\">\n <header\n class=\"flex justify-between px-5 py-2.5 border-gray-200 border-b\"\n [class.items-start]=\"subLabel()\"\n [class.items-center]=\"!subLabel()\"\n >\n <div>\n <h3 class=\"font-semibold ui-text-h3\">{{ label() }}</h3>\n\n @if (subLabel()) {\n <h4 class=\"ui-text-body\">{{ subLabel() }}</h4>\n }\n </div>\n <ui-button\n appearance=\"none\"\n classes=\"drawer-close-btn\"\n (click)=\"isOpen.set(false)\"\n >\n <ng-icon\n name=\"heroXMark\"\n size=\"20\"\n strokeWidth=\"2\"\n class=\"size-4 shrink-0\"\n />\n </ui-button>\n </header>\n </div>\n</aside>\n","import {\n Component,\n computed,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiTooltipTrigger } from './tooltip.types';\n\n\n@Component({\n selector: 'ui-tooltip',\n exportAs: 'uiTooltip',\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.css',\n imports: [UiOverlayComponent],\n host: {\n class: 'inline-flex size-fit',\n '(mouseenter)': 'onHover(true)',\n '(mouseleave)': 'onHover(false)',\n '(focusin)': 'onFocus(true)',\n '(focusout)': 'onFocus(false)',\n '(click)': 'onClick()'\n }\n})\nexport class UiTooltipComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n protected readonly content = viewChild('content', { read: ElementRef });\n\n readonly text = input.required<string>();\n readonly placement = input<Placement>('top');\n readonly trigger = input<UiTooltipTrigger>('hover');\n readonly classes = input<string>('');\n\n readonly isOpen = input<WritableSignal<boolean>>(signal(false));\n\n protected readonly closeBehaviour = computed<UiOverlayCloseBehaviour>(() =>\n this.trigger() === 'click'\n ? 'whenClickOutside'\n : 'none'\n );\n\n protected readonly generatedClasses = computed(() =>\n ['ui-tooltip', 'ui-text-caption', this.classes()]\n .filter(Boolean)\n .join(' ')\n );\n\n protected onHover(isHovering: boolean) {\n if (this.trigger() === 'hover') {\n this.isOpen().set(isHovering);\n }\n }\n\n // Hover also listens to focus so keyboard users still get the tooltip\n protected onFocus(isFocused: boolean) {\n if (['hover', 'focus'].includes(this.trigger())) {\n this.isOpen().set(isFocused);\n }\n }\n\n protected onClick() {\n if (this.trigger() === 'click') {\n this.isOpen().update(value => !value);\n }\n }\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n>\n <ng-content />\n\n @if (isOpen()()) {\n <div #content class=\"p-1.5\" style=\"position: fixed; z-index: 60\">\n <div role=\"tooltip\" [class]=\"generatedClasses()\">{{ text() }}</div>\n </div>\n }\n</ui-overlay>\n","import { Component, input } from '@angular/core';\n\nimport { IconName, NgIcon } from '@ng-icons/core';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { UiTooltipComponent } from '../tooltip/tooltip.component';\n\n\n@Component({\n selector: 'ui-kpi',\n templateUrl: './kpi.component.html',\n imports: [UiCardComponent, NgIcon, UiTooltipComponent]\n})\nexport class UiKpiComponent {\n readonly title = input<string>('');\n readonly value = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>();\n readonly iconPosition = input<'left' | 'right'>('left');\n}\n","<ui-card radius=\"xl\">\n <div class=\"flex gap-x-4 p-4 md:p-5\">\n @if (icon() && iconPosition() === 'left') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n\n <div class=\"grow\">\n <div class=\"flex items-center gap-x-2 text-muted-foreground-2\">\n <span class=\"font-semibold ui-text-h4 text-sm uppercase\">\n {{ title() }}\n </span>\n\n @if (hint()) {\n <ui-tooltip\n [text]=\"hint()\"\n placement=\"top\"\n trigger=\"hover\"\n >\n <ng-icon name=\"heroQuestionMarkCircle\" size=\"18\" />\n </ui-tooltip>\n }\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2 mt-1\">\n <h3 class=\"font-semibold text-foreground ui-text-h2\">\n <!-- falls back to the plain value when nothing is projected -->\n <ng-content select=\"[kpi-value]\">{{ value() }}</ng-content>\n </h3>\n <ng-content select=\"[kpi-badge]\"></ng-content>\n </div>\n </div>\n\n @if (icon() && iconPosition() === 'right') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n </div>\n</ui-card>\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiLoadingType } from './loading.types';\n\n\nconst TEXT_TYPES: UiLoadingType[] = [\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots'\n];\n\n@Component({\n selector: 'ui-loading',\n templateUrl: './loading.component.html',\n styleUrl: './loading.component.css'\n})\nexport class UiLoadingComponent {\n readonly type = input<UiLoadingType>('spinner');\n\n protected readonly hasText = computed(() =>\n TEXT_TYPES.includes(this.type())\n );\n\n protected readonly throbberSpokes = Array.from({ length: 12 }, (_, i) => i);\n}\n","<div class=\"ui-loading\" role=\"status\">\n @switch (type()) {\n @case ('throbber') {\n <svg\n class=\"ui-loading--throbber\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n @for (i of throbberSpokes; track i) {\n <line\n x1=\"12\"\n y1=\"2.5\"\n x2=\"12\"\n y2=\"7\"\n [attr.transform]=\"'rotate(' + i * (360 / throbberSpokes.length) + ' 12 12)'\"\n [style.animation-delay.s]=\"i / throbberSpokes.length - 1\"\n />\n }\n </svg>\n }\n @case ('pulse-ring') {\n <span\n class=\"ui-loading--pulse-ring ui-loading--pulse\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('pulse-dot') {\n <span\n class=\"ui-loading--pulse ui-loading--pulse-dot\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('wave') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('equaliser') {\n <span\n class=\"ui-loading--row ui-loading--stagger ui-loading--bars\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('terminal') {\n <span class=\"ui-loading--prompt\" aria-hidden=\"true\">></span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('blinking-caret') {\n <span>Loading</span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('shimmer-text') {\n <span class=\"ui-loading--shimmer\">Loading</span>\n }\n @case ('loading-dots') {\n <span>Loading</span>\n <span\n class=\"ui-loading--text-dots ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--text-dot\">.</span>\n }\n </span>\n }\n @case ('bouncing-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-bounce\"></span>\n }\n </span>\n }\n @case ('fading-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-fade\"></span>\n }\n </span>\n }\n @default {\n <span class=\"ui-loading--spinner\" aria-hidden=\"true\"></span>\n }\n }\n\n @if (!hasText()) {\n <span class=\"sr-only\">Loading</span>\n }\n</div>\n","export const UI_LOADING_TYPES = [\n 'spinner',\n 'throbber',\n 'pulse-ring',\n 'pulse-dot',\n 'wave',\n 'equaliser',\n 'terminal',\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots',\n 'bouncing-dots',\n 'fading-dots'\n] as const satisfies string[];\n\nexport type UiLoadingType = typeof UI_LOADING_TYPES[number];\n","import { Component, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-modal-close-btn',\n templateUrl: './modal-close-btn.component.html',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiModalCloseButtonComponent {\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n appearance=\"white\"\n intent=\"secondary\"\n classes=\"p-2! border-transparent! shadow-none!\"\n (click)=\"isOpen.set(false)\"\n>\n <ng-icon name=\"heroXMark\" strokeWidth=\"2.5\" />\n</ui-button>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n ElementRef,\n input,\n model,\n TemplateRef,\n viewChild\n} from '@angular/core';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiModalCloseButtonComponent } from '../../presets/modal-close-btn/modal-close-btn.component';\nimport { UiCardComponent } from '../card/card.component';\nimport { ModalSize } from './modal.types';\n\n\n@Component({\n selector: 'ui-modal',\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.css',\n imports: [\n UiOverlayComponent,\n UiModalCloseButtonComponent,\n NgTemplateOutlet,\n UiCardComponent\n ]\n})\nexport class UiModalComponent {\n readonly isOpen = model.required<boolean>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n readonly title = input<string>('');\n readonly size = input<ModalSize>('md');\n readonly classes = input<string>('');\n\n readonly headerElement = contentChild<TemplateRef<unknown>>(\n 'header',\n { descendants: false }\n );\n readonly footerElement = contentChild<TemplateRef<unknown>>(\n 'footer',\n { descendants: false }\n );\n readonly panelElement = viewChild(\n 'panel',\n { read: ElementRef<HTMLElement> }\n );\n\n readonly generatedClasses = computed<string>(() =>\n [\n 'ui-modal',\n `ui-modal--${this.size()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (isOpen()) {\n <div\n class=\"group z-50 fixed inset-0 flex justify-center items-center bg-black/40 starting:opacity-0 p-4 transition-opacity duration-150 ease-out\"\n animate.leave=\"fs-modal--leaving opacity-0\"\n >\n <ui-overlay\n [isOpen]=\"isOpen\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"panelElement()\"\n tabIndex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n class=\"block max-w-full starting:scale-95 group-[.fs-modal--leaving]:scale-95 transition duration-150 ease-out\"\n >\n <ui-card #panel radius=\"xl\" [class]=\"generatedClasses()\">\n <div class=\"flex flex-col max-h-[calc(100dvh-2rem-2px)]\">\n <header class=\"flex justify-between items-center gap-x-5 p-5 border-neutral border-b shrink-0\">\n @if (headerElement()) {\n <ng-container *ngTemplateOutlet=\"headerElement()\" />\n } @else {\n <span class=\"ui-text-h3\">{{ title() }}</span>\n <ui-modal-close-btn [(isOpen)]=\"isOpen\" />\n }\n </header>\n <div class=\"flex-1 min-h-0 overflow-auto\">\n <ng-content />\n </div>\n\n @if (footerElement()) {\n <footer class=\"flex justify-end items-center gap-2.5 p-5 shrink-0\">\n <ng-container *ngTemplateOutlet=\"footerElement()\" />\n </footer>\n }\n </div>\n </ui-card>\n </ui-overlay>\n </div>\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport type { MoneySignDisplay } from './money.types';\n\n\n/**\n * Formats a money value, e.g. -42.1 as \"-£42.10\".\n */\n@Component({\n selector: 'ui-money',\n templateUrl: './money.component.html',\n styleUrl: './money.component.css'\n})\nexport class UiMoneyComponent {\n readonly value = input.required<number | null>();\n\n readonly currency = input<string>('GBP');\n readonly locale = input<string>('en-GB');\n readonly signDisplay = input<MoneySignDisplay>('auto');\n\n /** Green for money in, red for money out. */\n readonly colourBySign = input(false, { transform: booleanAttribute });\n\n /** Short form like \"£12K\", the full amount goes in the title. */\n readonly compact = input(false, { transform: booleanAttribute });\n\n /** Shown when there's no value. */\n readonly placeholder = input<string>('-');\n\n readonly classes = input<string>('');\n\n // -0 would otherwise format as \"-£0.00\"\n private readonly amount = computed(() => {\n const value = this.value();\n\n return value === null || Number.isNaN(value) ? null : value || 0;\n });\n\n protected readonly formatted = computed(() => {\n const amount = this.amount();\n\n return amount === null ? this.placeholder() : this.format(amount, this.compact());\n });\n\n protected readonly title = computed(() => {\n const amount = this.amount();\n\n return this.compact() && amount !== null ? this.format(amount, false) : null;\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-money',\n this.signClass(),\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly signClass = computed(() => {\n const amount = this.amount();\n\n if (!this.colourBySign() || amount === null) {\n return '';\n }\n\n if (amount > 0) {\n return 'ui-money--positive';\n }\n\n return amount < 0 ? 'ui-money--negative' : '';\n });\n\n private format(amount: number, compact: boolean): string {\n return new Intl.NumberFormat(this.locale(), {\n style: 'currency',\n currency: this.currency(),\n signDisplay: this.signDisplay(),\n notation: compact ? 'compact' : 'standard'\n }).format(amount);\n }\n}\n","<span [class]=\"generatedClasses()\" [attr.title]=\"title()\">{{ formatted() }}</span>\n","/** Intl signDisplay values, controls when a + or - is shown. */\nexport const MoneySignDisplays = [\n 'auto',\n 'always',\n 'exceptZero',\n 'never'\n] as const;\n\n/** @see {@link MoneySignDisplays} */\nexport type MoneySignDisplay = typeof MoneySignDisplays[number];\n","import { Component, computed, input, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport type { PaginationItem } from './pagination.types';\n\n\n@Component({\n selector: 'ui-pagination',\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.css',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiPaginationComponent {\n // zero-based, same as the table\n readonly page = model<number>(0);\n readonly totalPages = input.required<number>();\n\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-pagination',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n readonly isFirstPage = computed(() => this.page() <= 0);\n readonly isLastPage = computed(() => this.page() >= this.totalPages() - 1);\n\n // first, last and the pages either side of the current one, with gaps collapsed\n readonly items = computed(() => {\n const total = this.totalPages();\n const current = this.page();\n const items: PaginationItem[] = [];\n\n for (let i = 0; i < total; i++) {\n const isEdge = i === 0 || i === total - 1;\n const isNearCurrent = Math.abs(i - current) <= 1;\n\n // no point hiding a single page behind an ellipsis\n const hidesOnePage = (i === 1 && current === 3) ||\n (i === total - 2 && current === total - 4);\n\n if (isEdge || isNearCurrent || hidesOnePage) {\n items.push(i);\n } else if (items.at(-1) !== 'ellipsis') {\n items.push('ellipsis');\n }\n }\n\n return items;\n });\n\n pageLabel(page: number): string {\n const label = `Page ${page + 1}`;\n\n return page === this.page() ? `${label}, current page` : label;\n }\n\n goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.page.set(page);\n }\n}\n","<nav [class]=\"generatedClasses()\" aria-label=\"Pagination\">\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isFirstPage()\"\n (click)=\"goToPage(page() - 1)\"\n >\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n </ui-button>\n\n @for (item of items(); track $index) {\n @if (item === 'ellipsis') {\n <span class=\"ui-text-body ui-pagination-ellipsis\">…</span>\n } @else {\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [class.active]=\"item === page()\"\n (click)=\"goToPage(item)\"\n >\n {{ item + 1 }}\n </ui-button>\n }\n }\n\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isLastPage()\"\n (click)=\"goToPage(page() + 1)\"\n >\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n </ui-button>\n</nav>\n","import { Component, computed, input } from '@angular/core';\n\nimport type {\n ProgressIntent,\n ProgressLabelPosition,\n ProgressOrientation,\n ProgressSegment,\n ProgressShape,\n ProgressSize\n} from './progress.types';\n\n\ninterface SegmentView {\n percent: number;\n intent: ProgressIntent;\n label: string;\n}\n\n/**\n * A progress bar. Leave `value` null for work of unknown length, a value over\n * `max` fills the bar but the label still shows the real amount.\n */\n@Component({\n selector: 'ui-progress',\n templateUrl: './progress.component.html',\n styleUrl: './progress.component.css',\n host: {\n '[class.ui-progress-host--vertical]': 'orientation() === \"vertical\"'\n }\n})\nexport class UiProgressComponent {\n readonly value = input<number | null>(0);\n readonly max = input<number>(100);\n\n readonly intent = input<ProgressIntent>('primary');\n readonly size = input<ProgressSize>('md');\n readonly shape = input<ProgressShape>('rounded');\n readonly orientation = input<ProgressOrientation>('horizontal');\n\n readonly title = input<string>('');\n readonly labelPosition = input<ProgressLabelPosition>('none');\n readonly labelWith = input<(value: number, max: number) => string>(\n (value, max) => `${Math.round(value / max * 100)}%`\n );\n\n /** Splits the bar into this many blocks. */\n readonly steps = input<number | null>(null);\n\n /** Several fills stacked in one track, each with its own colour. */\n readonly segments = input<ProgressSegment[] | null>(null);\n\n /** Needed when there's no visible title. */\n readonly ariaLabel = input<string>('');\n\n protected readonly isIndeterminate = computed(() => this.value() === null && !this.segments());\n\n protected readonly total = computed(() => {\n const segments = this.segments();\n\n return segments\n ? segments.reduce((sum, segment) => sum + segment.value, 0)\n : this.value() ?? 0;\n });\n\n /** 0 to 100, what the bar actually draws. */\n protected readonly fillPercent = computed(() =>\n this.clampPercent(this.total() / this.max() * 100)\n );\n\n protected readonly label = computed(() =>\n this.isIndeterminate() ? '' : this.labelWith()(this.total(), this.max())\n );\n\n protected readonly segmentViews = computed<SegmentView[]>(() => {\n const segments = this.segments() ?? [];\n let used = 0;\n\n // later segments get squeezed once the track is full\n return segments.map(segment => {\n const percent = Math.min(this.clampPercent(segment.value / this.max() * 100), 100 - used);\n\n used += percent;\n\n return {\n percent,\n intent: segment.intent ?? this.intent(),\n label: segment.label ?? this.labelWith()(segment.value, this.max())\n };\n });\n });\n\n protected readonly stepStates = computed(() => {\n const steps = Math.max(1, Math.floor(this.steps() ?? 1));\n const filled = Math.round(this.fillPercent() / 100 * steps);\n\n return Array.from({ length: steps }, (_, index) => index < filled);\n });\n\n // keeps the floating label over the end of the fill without spilling off either side\n protected readonly floatingOffset = computed(() =>\n `clamp(0px, calc(${this.fillPercent()}% - 1.25rem), calc(100% - 2.5rem))`\n );\n\n protected readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n protected readonly rootClasses = computed(() =>\n [\n 'ui-progress',\n `ui-progress--${this.orientation()}`,\n `ui-progress--${this.size()}`,\n `ui-progress--${this.shape()}`,\n this.labelPosition() === 'inside' ? 'ui-progress--label-inside' : ''\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected fillClasses(intent: ProgressIntent): string {\n return [\n 'ui-progress-fill',\n `ui-progress-fill--${intent}`,\n this.isIndeterminate() ? 'ui-progress-fill--indeterminate' : ''\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n private clampPercent(percent: number): number {\n return Number.isFinite(percent) ? Math.min(100, Math.max(0, percent)) : 0;\n }\n}\n","<div [class]=\"rootClasses()\">\n @if (title() || labelPosition() === 'top') {\n <div class=\"ui-progress-header\">\n <span class=\"text-foreground ui-text-body-alt\">{{ title() }}</span>\n\n @if (labelPosition() === 'top') {\n <span class=\"text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n }\n\n @if (labelPosition() === 'floating' && !isIndeterminate() && !isVertical()) {\n <div class=\"ui-progress-floating-row\" aria-hidden=\"true\">\n <span\n class=\"ui-progress-floating ui-text-caption\"\n [class]=\"'ui-progress-floating--' + intent()\"\n [style.margin-inline-start]=\"floatingOffset()\"\n >\n {{ label() }}\n </span>\n </div>\n }\n\n <div class=\"ui-progress-row\">\n <div\n class=\"ui-progress-track\"\n [class.ui-progress-track--steps]=\"steps()\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"isIndeterminate() ? null : total()\"\n [attr.aria-valuetext]=\"label() || null\"\n [attr.aria-label]=\"ariaLabel() || title() || null\"\n >\n @if (steps()) {\n @for (filled of stepStates(); track $index) {\n <span\n class=\"ui-progress-step\"\n [class]=\"filled ? 'ui-progress-fill--' + intent() : ''\"\n ></span>\n }\n } @else if (segments()) {\n @for (segment of segmentViews(); track $index) {\n <span\n [class]=\"fillClasses(segment.intent)\"\n [style.width.%]=\"isVertical() ? null : segment.percent\"\n [style.height.%]=\"isVertical() ? segment.percent : null\"\n [attr.title]=\"segment.label\"\n >\n @if (labelPosition() === 'inside') {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ segment.label }}</span>\n }\n </span>\n }\n } @else {\n <span\n [class]=\"fillClasses(intent())\"\n [style.width.%]=\"isVertical() || isIndeterminate() ? null : fillPercent()\"\n [style.height.%]=\"isVertical() && !isIndeterminate() ? fillPercent() : null\"\n >\n @if (labelPosition() === 'inside' && !isIndeterminate()) {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ label() }}</span>\n }\n </span>\n }\n </div>\n\n @if (labelPosition() === 'end' && !isIndeterminate()) {\n <span class=\"ui-progress-end text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n</div>\n","/** Same names as badges, so a status reads the same wherever it shows. */\nexport const ProgressIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\n/** @see {@link ProgressIntents} */\nexport type ProgressIntent = typeof ProgressIntents[number];\n\n/** Track thickness, md matches Preline's default and xl fits a label inside. */\nexport const ProgressSizes = ['sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link ProgressSizes} */\nexport type ProgressSize = typeof ProgressSizes[number];\n\n/** Where the value label goes, if anywhere. */\nexport const ProgressLabelPositions = ['none', 'inside', 'end', 'top', 'floating'] as const;\n\n/** @see {@link ProgressLabelPositions} */\nexport type ProgressLabelPosition = typeof ProgressLabelPositions[number];\n\n/** rounded: both ends round, square: no rounding, straight: square track with a round fill. */\nexport const ProgressShapes = ['rounded', 'square', 'straight'] as const;\n\n/** @see {@link ProgressShapes} */\nexport type ProgressShape = typeof ProgressShapes[number];\n\nexport const ProgressOrientations = ['horizontal', 'vertical'] as const;\n\n/** @see {@link ProgressOrientations} */\nexport type ProgressOrientation = typeof ProgressOrientations[number];\n\n/** One part of a stacked bar, e.g. spending in one category. */\nexport interface ProgressSegment {\n value: number;\n intent?: ProgressIntent;\n label?: string;\n}\n","/** What a skeleton stands in for, lines of text, an avatar or a block. */\nexport const SkeletonShapes = ['text', 'circle', 'rect'] as const;\n\n/** @see {@link SkeletonShapes} */\nexport type SkeletonShape = typeof SkeletonShapes[number];\n","import { Directive, input, model } from '@angular/core';\n\n\n@Directive({\n selector: '[uiTab]',\n host: { '[hidden]': '!active()' }\n})\nexport class UiTabDirective {\n label = input.required<string>({ alias: 'uiTab' });\n disabled = input<boolean>(false);\n active = model<boolean>(false);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n input,\n signal,\n TemplateRef\n} from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiTabDirective } from './tab.directive';\n\n\nexport type TabButtonAppearance =\n | 'solid'\n | 'underline';\n\n@Component({\n selector: 'ui-tab',\n templateUrl: './tab.component.html',\n styleUrl: './tab.component.css',\n imports: [UiButtonComponent, NgTemplateOutlet]\n})\nexport class UiTabComponent {\n readonly tabs = contentChildren(UiTabDirective);\n readonly selectedIndex = signal<number>(0);\n readonly actions = contentChild<TemplateRef<unknown>>('actions');\n\n readonly appearance = input<TabButtonAppearance>('solid');\n\n readonly generatedButtonClasses = computed(() =>\n [\n `ui-tab-button--${this.appearance()}`,\n 'font-medium'\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n constructor() {\n effect(() => {\n const tabs = this.tabs();\n if (!tabs.length || tabs.some(tab => tab.active())) { return; }\n\n tabs[0].active.set(true);\n });\n }\n\n select(index: number) {\n const tabs = this.tabs();\n\n const target = tabs[index];\n if (!target || target.disabled()) { return; }\n\n tabs.forEach((tab, i) => tab.active.set(i === index));\n }\n}\n","<div class=\"flex\" role=\"tablist\">\n <div class=\"flex justify-between w-full\">\n <nav class=\"flex gap-x-2.5\" role=\"tablist\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ui-button\n role=\"tab\"\n appearance=\"none\"\n [classes]=\"generatedButtonClasses()\"\n [disabled]=\"tab.disabled()\"\n [class.active]=\"tab.active()\"\n (click)=\"select(i)\"\n >\n {{ tab.label() }}\n </ui-button>\n }\n </nav>\n <div class=\"flex gap-x-2.5\">\n <ng-container *ngTemplateOutlet=\"actions()\"></ng-container>\n </div>\n </div>\n</div>\n\n<ng-content></ng-content>\n","import {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { catchError, debounceTime, of, skip, Subject, switchMap } from 'rxjs';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport {\n SelectDataSource,\n SelectLocalDataSource\n} from '../../forms/select/select.datasource';\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiDropdownComponent } from '../dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../dropdown/dropdown.directives';\nimport { UiLoadingComponent } from '../loading/loading.component';\nimport {\n type TableDataSource,\n type TableDataSourceContent,\n type TableDataSourceParameters\n} from './table.datasource';\nimport {\n type TableColumn,\n type TableColumnFilterOption,\n type TableRowAction,\n type TableSortState\n} from './table.types';\n\n\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst SELECTION_COLUMN_WIDTH = 44;\n\ninterface ColumnDragPreview {\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n imports: [\n NgIcon,\n UiButtonComponent,\n UiCheckboxComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiSelectComponent,\n UiLoadingComponent\n ]\n})\nexport class UiTableComponent<Row = unknown> implements OnInit, OnDestroy {\n readonly classes = input<string>('');\n\n readonly columns = input.required<TableColumn<Row>[]>();\n readonly dataSource = input.required<TableDataSource<Row>>();\n\n readonly emptyMessage = input<string>('No data to display.');\n readonly errorMessage = input<string>(\n 'Something went wrong loading this data.'\n );\n\n // identifies a row across sorts/filters/pages, defaults to its position which\n // is only stable for an unsorted, unfiltered, unpaginated table\n readonly rowId = input<(row: Row, index: number) => unknown>(\n (_row, index) => index\n );\n\n readonly selectable = input(false, { transform: booleanAttribute });\n readonly searchable = input(false, { transform: booleanAttribute });\n readonly searchPlaceholder = input<string>('Search...');\n readonly paginated = input(false, { transform: booleanAttribute });\n readonly pageSize = input<number>(10);\n readonly toggleableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableRows = input(false, { transform: booleanAttribute });\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n readonly actions = input<TableRowAction<Row>[]>([]);\n\n readonly sort = model<TableSortState | null>(null);\n readonly selectedRowIds = model<Set<unknown>>(new Set());\n\n readonly selectionChange = output<Row[]>();\n readonly rowsReordered = output<Row[]>();\n\n readonly rows = signal<Row[]>([]);\n readonly total = signal(0);\n readonly loading = signal(false);\n readonly error = signal(false);\n\n readonly query = signal('');\n readonly filters = signal<Record<string, unknown>>({});\n\n protected readonly currentPage = signal(0);\n protected readonly hiddenColumnIds = signal<Set<string>>(new Set());\n protected readonly columnOrderIds = signal<string[] | null>(null);\n protected readonly columnWidths = signal<Record<string, number>>({});\n protected readonly columnMenuOpen = signal(false);\n protected readonly filterMenuOpen = signal(false);\n\n protected readonly draggedColumnId = signal<string | null>(null);\n protected readonly dragOverColumnId = signal<string | null>(null);\n protected readonly dragPreview = signal<ColumnDragPreview | null>(null);\n protected readonly draggedRowIndex = signal<number | null>(null);\n\n readonly isEmpty = computed(() =>\n !this.loading() && !this.error() && this.rows().length === 0\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-table',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected readonly orderedColumns = computed(() => {\n const order = this.columnOrderIds();\n\n if (!order) {\n return this.columns();\n }\n\n const byId = new Map(this.columns().map(column => [column.id, column]));\n const ordered = order\n .map(id => byId.get(id))\n .filter((column): column is TableColumn<Row> => !!column);\n\n const missing = this.columns().filter(column =>\n !order.includes(column.id)\n );\n\n return [...ordered, ...missing];\n });\n\n protected readonly hideableColumns = computed(() =>\n this.orderedColumns().filter(column => column.hideable !== false)\n );\n\n protected readonly visibleColumns = computed(() =>\n this.orderedColumns().filter(column =>\n !this.hiddenColumnIds().has(column.id)\n )\n );\n\n // pinned-left columns first, then unpinned, then pinned-right, so sticky offsets stack correctly\n protected readonly renderColumns = computed(() => {\n const columns = this.visibleColumns();\n\n return [\n ...columns.filter(column => column.pin === 'left'),\n ...columns.filter(column => !column.pin),\n ...columns.filter(column => column.pin === 'right')\n ];\n });\n\n // hidden columns stay filterable, the menu isn't tied to what's on screen\n protected readonly filterableColumns = computed(() =>\n this.orderedColumns().filter(column => column.filterable)\n );\n\n protected readonly hasFilterableColumns = computed(() =>\n this.filterableColumns().length > 0\n );\n\n protected readonly activeFilterCount = computed(() =>\n Object.keys(this.filters()).length\n );\n\n protected readonly hasActions = computed(() => this.actions().length > 0);\n protected readonly actionsColumnWidth = computed(() =>\n Math.max(60, this.actions().length * 40)\n );\n\n protected readonly totalPages = computed(() =>\n this.paginated()\n ? Math.max(1, Math.ceil(this.total() / this.pageSize()))\n : 1\n );\n\n protected readonly resultsLabel = computed(() => {\n const total = this.total();\n\n return total === 1 ? '1 result' : `${total} results`;\n });\n\n protected readonly allSelected = computed(() => {\n const rows = this.rows();\n\n return rows.length > 0 &&\n rows.every((row, index) =>\n this.selectedRowIds().has(this.rowId()(row, index))\n );\n });\n\n protected readonly someSelected = computed(() => {\n const rows = this.rows();\n const selected = this.selectedRowIds();\n const count = rows.filter((row, index) =>\n selected.has(this.rowId()(row, index))\n ).length;\n\n return count > 0 && count < rows.length;\n });\n\n private readonly leftOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = this.selectable() ? SELECTION_COLUMN_WIDTH : 0;\n\n for (\n const column of this.renderColumns().filter(c => c.pin === 'left')\n ) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n private readonly rightOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = 0;\n\n const columns = this.renderColumns()\n .filter(c => c.pin === 'right')\n .slice()\n .reverse();\n\n for (const column of columns) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n // one shared stream for every load, so a newer request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private resizeState: {\n columnId: string;\n startX: number;\n startWidth: number;\n } | null = null;\n private columnDragState: {\n columnId: string;\n pointerOffsetX: number;\n previewY: number;\n previewHeight: number;\n } | null = null;\n private readonly filterDataSources = new Map<\n string,\n SelectDataSource<TableColumnFilterOption>\n >();\n\n constructor() {\n toObservable(this.query).pipe(\n debounceTime(300),\n skip(1),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n toObservable(this.filters).pipe(\n debounceTime(300),\n skip(1),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n this.load$.pipe(\n switchMap(() => this.fetch()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n ngOnInit(): void {\n this.reload();\n }\n\n ngOnDestroy(): void {\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n }\n\n reload(): void {\n this.load$.next();\n }\n\n protected cellValue(column: TableColumn<Row>, row: Row): unknown {\n return column.accessor(row);\n }\n\n // ng-icon's `name` wants a string; displayType 'icon' is the caller's promise the accessor gives one\n protected cellIconValue(column: TableColumn<Row>, row: Row): string {\n return column.accessor(row) as string;\n }\n\n protected formattedCellValue(column: TableColumn<Row>, row: Row): string {\n const value = column.accessor(row);\n\n if (value === null || value === undefined) {\n return '';\n }\n\n switch (column.displayType) {\n case 'number':\n return new Intl.NumberFormat().format(Number(value));\n case 'currency':\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: column.currency ?? 'USD'\n }).format(Number(value));\n case 'date':\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium'\n })\n .format(new Date(value as string | number | Date));\n case 'time':\n return new Intl.DateTimeFormat(undefined, {\n timeStyle: 'short'\n })\n .format(new Date(value as string | number | Date));\n default:\n return String(value);\n }\n }\n\n protected onQueryChange(value: string): void {\n this.query.set(value);\n }\n\n protected filterValue(columnId: string): string {\n return (this.filters()[columnId] as string) ?? '';\n }\n\n protected onFilterInput(columnId: string, value: string): void {\n this.setFilter(columnId, value);\n }\n\n protected filterDataSource(\n column: TableColumn<Row>\n ): SelectDataSource<TableColumnFilterOption> {\n let dataSource = this.filterDataSources.get(column.id);\n\n if (!dataSource) {\n dataSource = new SelectLocalDataSource(\n column.filterOptions ?? [],\n (option, query) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n this.filterDataSources.set(column.id, dataSource);\n }\n\n return dataSource;\n }\n\n protected selectedFilterOption(\n column: TableColumn<Row>\n ): TableColumnFilterOption | null {\n const value = this.filters()[column.id];\n\n return column.filterOptions?.find(option => option.value === value) ??\n null;\n }\n\n protected filterOptionLabel(option: TableColumnFilterOption): string {\n return option.label;\n }\n\n protected onFilterSelect(\n columnId: string,\n option: TableColumnFilterOption | null\n ): void {\n this.setFilter(columnId, option?.value);\n }\n\n protected clearFilters(): void {\n this.filters.set({});\n }\n\n protected toggleSort(column: TableColumn<Row>): void {\n if (!column.sortable) {\n return;\n }\n\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n this.sort.set({ columnId: column.id, direction: 'asc' });\n } else if (current.direction === 'asc') {\n this.sort.set({ columnId: column.id, direction: 'desc' });\n } else {\n this.sort.set(null);\n }\n\n this.resetAndReload();\n }\n\n protected sortIcon(column: TableColumn<Row>): string {\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n return 'heroChevronUpDown';\n }\n\n return current.direction === 'asc'\n ? 'heroChevronUp'\n : 'heroChevronDown';\n }\n\n protected goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.currentPage.set(page);\n this.reload();\n }\n\n protected isColumnVisible(column: TableColumn<Row>): boolean {\n return !this.hiddenColumnIds().has(column.id);\n }\n\n protected toggleColumnVisibility(column: TableColumn<Row>): void {\n this.hiddenColumnIds.update(hidden => {\n const next = new Set(hidden);\n\n if (next.has(column.id)) {\n next.delete(column.id);\n } else {\n next.add(column.id);\n }\n\n return next;\n });\n }\n\n protected isRowSelected(row: Row, index: number): boolean {\n return this.selectedRowIds().has(this.rowId()(row, index));\n }\n\n protected toggleRow(row: Row, index: number): void {\n const id = this.rowId()(row, index);\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected toggleSelectAll(): void {\n const wasAllSelected = this.allSelected();\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n this.rows().forEach((row, index) => {\n const id = this.rowId()(row, index);\n\n if (wasAllSelected) {\n next.delete(id);\n } else {\n next.add(id);\n }\n });\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected columnWidth(column: TableColumn<Row>): number {\n return this.columnWidths()[column.id] ??\n column.width ??\n DEFAULT_COLUMN_WIDTH;\n }\n\n protected isPinned(column: TableColumn<Row>): boolean {\n return column.pin === 'left' || column.pin === 'right';\n }\n\n protected leftOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'left' ? this.leftOffsets()[column.id] : null;\n }\n\n protected rightOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'right' ? this.rightOffsets()[column.id] : null;\n }\n\n protected startResize(event: PointerEvent, column: TableColumn<Row>): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.resizeState = {\n columnId: column.id,\n startX: event.clientX,\n startWidth: this.columnWidth(column)\n };\n\n document.addEventListener('pointermove', this.onResizeMove);\n document.addEventListener('pointerup', this.onResizeEnd);\n }\n\n protected canReorderRows(): boolean {\n return this.reorderableRows() && !this.sort();\n }\n\n // custom pointer-based drag instead of native HTML5 DnD, so the floating\n // preview can be pinned to the header row instead of following the cursor\n // wherever it goes, and so a drop indicator can show the exact landing spot\n protected onColumnDragStart(\n event: PointerEvent,\n column: TableColumn<Row>\n ): void {\n event.preventDefault();\n\n const headerCell = (event.currentTarget as HTMLElement).closest('th');\n const headerRow = headerCell?.closest('tr');\n\n if (!headerCell || !headerRow) {\n return;\n }\n\n const cellRect = headerCell.getBoundingClientRect();\n const rowRect = headerRow.getBoundingClientRect();\n\n this.columnDragState = {\n columnId: column.id,\n pointerOffsetX: event.clientX - cellRect.left,\n previewY: rowRect.top + (rowRect.height - cellRect.height) / 2,\n previewHeight: cellRect.height\n };\n\n this.draggedColumnId.set(column.id);\n this.dragPreview.set({\n label: column.header,\n x: cellRect.left,\n y: this.columnDragState.previewY,\n width: cellRect.width,\n height: this.columnDragState.previewHeight\n });\n\n document.addEventListener('pointermove', this.onColumnDragMove);\n document.addEventListener('pointerup', this.onColumnDragEnd);\n }\n\n protected onRowDragStart(event: DragEvent, index: number): void {\n this.draggedRowIndex.set(index);\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n protected onRowDragOver(event: DragEvent): void {\n if (this.draggedRowIndex() !== null) {\n event.preventDefault();\n }\n }\n\n protected onRowDrop(event: DragEvent, index: number): void {\n event.preventDefault();\n\n const from = this.draggedRowIndex();\n this.draggedRowIndex.set(null);\n\n if (from === null || from === index) {\n return;\n }\n\n const next = [...this.rows()];\n const [moved] = next.splice(from, 1);\n next.splice(index, 0, moved);\n\n this.rows.set(next);\n this.rowsReordered.emit(next);\n }\n\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeState) {\n return;\n }\n\n const column = this.columns().find(c =>\n c.id === this.resizeState!.columnId\n );\n const minWidth = column?.minWidth ?? 60;\n const delta = event.clientX - this.resizeState.startX;\n const width = Math.max(minWidth, this.resizeState.startWidth + delta);\n\n this.columnWidths.update(widths => ({\n ...widths,\n [this.resizeState!.columnId]: width\n }));\n };\n\n private readonly onResizeEnd = (): void => {\n this.resizeState = null;\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n };\n\n private readonly onColumnDragMove = (event: PointerEvent): void => {\n const state = this.columnDragState;\n\n if (!state) {\n return;\n }\n\n // x tracks the pointer, y stays pinned to the header row - the preview\n // can never wander down into the body no matter where the pointer goes\n this.dragPreview.update(preview =>\n preview && {\n ...preview,\n x: event.clientX - state.pointerOffsetX\n }\n );\n\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const headerCell = target?.closest<HTMLElement>('th[data-column-id]');\n const columnId = headerCell?.dataset['columnId'];\n\n this.dragOverColumnId.set(\n columnId && columnId !== state.columnId ? columnId : null\n );\n };\n\n private readonly onColumnDragEnd = (): void => {\n const state = this.columnDragState;\n const overId = this.dragOverColumnId();\n\n this.columnDragState = null;\n this.draggedColumnId.set(null);\n this.dragOverColumnId.set(null);\n this.dragPreview.set(null);\n\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n\n if (!state || !overId || state.columnId === overId) {\n return;\n }\n\n const order = this.columnOrderIds() ?? this.columns().map(c => c.id);\n const from = order.indexOf(state.columnId);\n const to = order.indexOf(overId);\n\n if (from === -1 || to === -1) {\n return;\n }\n\n // dropped column takes the exact slot of the highlighted target, which\n // shifts over to make room - `to` is deliberately the target's index\n // from before removal, so splicing it into the now-shorter array lands\n // the dragged column exactly where the target was and pushes it aside,\n // rather than merely landing next to it\n const next = [...order];\n next.splice(from, 1);\n next.splice(to, 0, state.columnId);\n\n this.columnOrderIds.set(next);\n };\n\n private setFilter(columnId: string, value: unknown): void {\n this.filters.update(filters => {\n const next = { ...filters };\n\n if (value) {\n next[columnId] = value;\n } else {\n delete next[columnId];\n }\n\n return next;\n });\n }\n\n private resetAndReload(): void {\n this.currentPage.set(0);\n this.reload();\n }\n\n private emitSelectionChange(): void {\n const ids = this.selectedRowIds();\n const selectedRows = this.rows().filter((row, index) =>\n ids.has(this.rowId()(row, index))\n );\n\n this.selectionChange.emit(selectedRows);\n }\n\n private fetch() {\n this.loading.set(true);\n this.error.set(false);\n\n const params: TableDataSourceParameters = {\n page: this.currentPage(),\n size: this.paginated() ? this.pageSize() : 0,\n query: this.query(),\n sort: this.sort(),\n filters: this.filters()\n };\n\n return this.dataSource().load(params).pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: TableDataSourceContent<Row> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.rows.set(result.items);\n this.total.set(result.total);\n } else {\n this.error.set(true);\n }\n\n this.cdr.markForCheck();\n }\n}\n","@if (searchable() || hasFilterableColumns() || toggleableColumns()) {\n <div class=\"ui-table-toolbar\">\n @if (searchable()) {\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"searchPlaceholder()\"\n class=\"max-w-xs\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroMagnifyingGlass\"\n class=\"ms-3 size-4 text-muted-foreground-1\"\n />\n </ng-template>\n </ui-input>\n }\n\n @if (hasFilterableColumns()) {\n <ui-dropdown\n [isOpen]=\"filterMenuOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"filterMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroFunnel\" class=\"size-4\" />\n Filters\n @if (activeFilterCount()) {\n <span class=\"ui-table-filter-count ui-text-caption\">\n {{ activeFilterCount() }}\n </span>\n }\n </ui-button>\n\n @if (filterMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-table-filter-menu\">\n @for (column of filterableColumns(); track column.id) {\n <div class=\"flex flex-col gap-1\">\n <span\n class=\"text-muted-foreground-1 ui-text-caption\"\n >\n {{ column.header }}\n </span>\n\n @if (column.filterOptions) {\n <ui-select\n [dataSource]=\"filterDataSource(column)\"\n [selectedItem]=\"selectedFilterOption(column)\"\n (selectionChange)=\"onFilterSelect(column.id, $event)\"\n [displayWith]=\"filterOptionLabel\"\n [clearable]=\"true\"\n clearLabel=\"All\"\n placeholder=\"All\"\n />\n } @else {\n <ui-input\n [value]=\"filterValue(column.id)\"\n (valueChange)=\"onFilterInput(column.id, $event)\"\n placeholder=\"Filter...\"\n [ariaLabel]=\"'Filter ' + column.header\"\n />\n }\n </div>\n }\n\n @if (activeFilterCount()) {\n <ui-button\n appearance=\"link\"\n intent=\"secondary\"\n class=\"text-end\"\n classes=\"self-end p-0! text-sm\"\n (click)=\"clearFilters()\"\n >\n Clear filters\n </ui-button>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n\n @if (toggleableColumns()) {\n <ui-dropdown\n [isOpen]=\"columnMenuOpen\"\n placement=\"bottom-end\"\n closeBehaviour=\"whenClickOutside\"\n class=\"ms-auto\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"columnMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroViewColumns\" class=\"size-4\" />\n Columns\n </ui-button>\n\n @if (columnMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"bg-white shadow-xs py-1 border border-dropdown-divider rounded-lg min-w-40\">\n @for (column of hideableColumns(); track column.id) {\n <label\n class=\"flex items-center gap-2 hover:bg-dropdown-item-hover px-3 py-2 ui-text-body-alt cursor-pointer\"\n >\n <ui-checkbox\n [value]=\"isColumnVisible(column)\"\n (valueChange)=\"toggleColumnVisibility(column)\"\n />\n {{ column.header }}\n </label>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n </div>\n}\n\n<div class=\"ui-table-scroll\">\n <table [class]=\"generatedClasses()\">\n <colgroup>\n @if (selectable()) {\n <col [style.width.px]=\"44\" />\n }\n\n @for (column of renderColumns(); track column.id) {\n <col [style.width.px]=\"columnWidth(column)\" />\n }\n\n @if (hasActions()) {\n <col [style.width.px]=\"actionsColumnWidth()\" />\n }\n </colgroup>\n\n <thead [class.ui-table-sticky]=\"stickyHeader()\">\n <tr>\n @if (selectable()) {\n <th class=\"text-center! ui-table-select-cell\">\n <ui-checkbox\n [value]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (valueChange)=\"toggleSelectAll()\"\n />\n </th>\n }\n\n @for (column of renderColumns(); track column.id) {\n <th\n scope=\"col\"\n [attr.data-column-id]=\"column.id\"\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [class.ui-table-column-dragging]=\"draggedColumnId() === column.id\"\n [class.ui-table-column-drag-over]=\"dragOverColumnId() === column.id\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n <div class=\"ui-table-th-content\">\n @if (reorderableColumns() && column.reorderable !== false) {\n <ng-icon\n name=\"heroBars2\"\n class=\"ui-table-drag-handle\"\n (pointerdown)=\"onColumnDragStart($event, column)\"\n />\n }\n\n @if (column.sortable) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-1 p-0! border-transparent! rounded-none! cursor-pointer hocus:text-foreground\"\n (click)=\"toggleSort(column)\"\n >\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n <ng-icon\n [name]=\"sortIcon(column)\"\n class=\"ms-auto size-4 shrink-0\"\n />\n </ui-button>\n } @else {\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n }\n </div>\n\n @if (column.resizable) {\n <span\n class=\"ui-table-resize-handle\"\n (pointerdown)=\"startResize($event, column)\"\n ></span>\n }\n </th>\n }\n\n @if (hasActions()) {\n <th class=\"ui-table-actions-cell\"></th>\n }\n </tr>\n </thead>\n\n <tbody class=\"ui-text-body-alt\">\n @if (loading()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n <ui-loading type=\"loading-dots\" />\n </td>\n </tr>\n } @else if (error()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status ui-table-status-error\"\n >\n {{ errorMessage() }}\n <ui-button\n appearance=\"link\"\n intent=\"danger\"\n classes=\"ms-1 p-0! text-sm underline\"\n (click)=\"reload()\"\n >\n Retry\n </ui-button>\n </td>\n </tr>\n } @else if (isEmpty()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n } @else {\n @for (row of rows(); track rowId()(row, $index); let i = $index) {\n <tr\n [class.ui-table-row-selected]=\"isRowSelected(row, i)\"\n [class.ui-table-row-dragging]=\"draggedRowIndex() === i\"\n [draggable]=\"canReorderRows()\"\n (dragstart)=\"onRowDragStart($event, i)\"\n (dragover)=\"onRowDragOver($event)\"\n (drop)=\"onRowDrop($event, i)\"\n >\n @if (selectable()) {\n <td class=\"ui-table-select-cell\">\n <ui-checkbox\n [value]=\"isRowSelected(row, i)\"\n (valueChange)=\"toggleRow(row, i)\"\n />\n </td>\n }\n\n @for (column of renderColumns(); track column.id) {\n <td\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n @if (column.displayType === 'icon') {\n <ng-icon\n [name]=\"cellIconValue(column, row)\"\n class=\"size-4\"\n />\n } @else {\n {{ formattedCellValue(column, row) }}\n }\n </td>\n }\n\n @if (hasActions()) {\n <td class=\"ui-table-actions-cell\">\n @for (action of actions(); track action.id) {\n <ui-button\n appearance=\"none\"\n classes=\"p-1.5! border-transparent! rounded-md! text-muted-foreground-1 cursor-pointer hocus:bg-gray-100 hocus:text-foreground disabled:opacity-40! disabled:cursor-not-allowed\"\n [disabled]=\"!!action.disabled?.(row)\"\n [ariaLabel]=\"action.label\"\n [title]=\"action.label\"\n (click)=\"action.onClick(row)\"\n >\n <ng-icon\n [name]=\"action.icon\"\n class=\"size-4\"\n />\n </ui-button>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (dragPreview(); as preview) {\n <div\n class=\"ui-table-drag-preview ui-text-body-alt\"\n [style.left.px]=\"preview.x\"\n [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\"\n [style.height.px]=\"preview.height\"\n >\n <ng-icon name=\"heroBars2\" class=\"ui-table-drag-preview-icon\" />\n <span class=\"truncate\">{{ preview.label }}</span>\n </div>\n}\n\n@if (paginated()) {\n <div class=\"ui-table-footer\">\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{\n resultsLabel()\n }}</span>\n\n <div class=\"ui-table-pagination\">\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() === 0\"\n (click)=\"goToPage(currentPage() - 1)\"\n >\n Prev\n </ui-button>\n\n <span class=\"ui-text-body-alt\">Page {{ currentPage() + 1 }} of {{\n totalPages()\n }}</span>\n\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() + 1 >= totalPages()\"\n (click)=\"goToPage(currentPage() + 1)\"\n >\n Next\n </ui-button>\n </div>\n </div>\n}\n","import { Observable, of } from 'rxjs';\n\nimport { type TableSortState } from './table.types';\n\n\nexport interface TableDataSourceParameters {\n page: number;\n /** 0 or less means \"no limit\", used when the table isn't paginated */\n size: number;\n query: string;\n sort: TableSortState | null;\n filters: Record<string, unknown>;\n}\n\nexport interface TableDataSourceContent<Row> {\n items: Row[];\n total: number;\n}\n\nexport interface TableDataSource<Row> {\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>>;\n}\n\nexport interface TableLocalDataSourceOptions<Row> {\n search?: (item: Row, query: string) => boolean;\n sortValue?: (item: Row, columnId: string) => unknown;\n filter?: (item: Row, filters: Record<string, unknown>) => boolean;\n}\n\nexport class TableLocalDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly items: Row[],\n private readonly options: TableLocalDataSourceOptions<Row> = {}\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n let result = this.items;\n\n const query = params.query.trim();\n\n if (query && this.options.search) {\n result = result.filter(item => this.options.search!(item, query));\n }\n\n if (Object.keys(params.filters).length && this.options.filter) {\n result = result.filter(item => this.options.filter!(item, params.filters));\n }\n\n if (params.sort && this.options.sortValue) {\n const { columnId, direction } = params.sort;\n const factor = direction === 'asc' ? 1 : -1;\n\n result = [...result].sort((a, b) => {\n const valueA = this.options.sortValue!(a, columnId);\n const valueB = this.options.sortValue!(b, columnId);\n\n if (valueA === valueB) {\n return 0;\n }\n\n return (valueA as never) > (valueB as never) ? factor : -factor;\n });\n }\n\n const total = result.length;\n const items = params.size > 0 ?\n result.slice(params.page * params.size, (params.page * params.size) + params.size) :\n result;\n\n return of({ items, total });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class TableRemoteDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly fetch: (\n params: TableDataSourceParameters\n ) => Observable<TableDataSourceContent<Row>>\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n return this.fetch(params);\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n output\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { ToastIntent } from './toast.types';\n\n\nconst INTENT_ICONS: Record<ToastIntent, string> = {\n info: 'heroInformationCircleSolid',\n success: 'heroCheckCircleSolid',\n warning: 'heroExclamationTriangleSolid',\n danger: 'heroXCircleSolid'\n};\n\nconst INTENT_COLOURS: Record<ToastIntent, string> = {\n info: 'text-primary-600',\n success: 'text-success-600',\n warning: 'text-warning-600',\n danger: 'text-danger-600'\n};\n\n@Component({\n selector: 'ui-toast',\n templateUrl: './toast.component.html',\n imports: [NgIcon, UiCardComponent],\n host: {\n '(mouseenter)': 'setHovered(true)',\n '(mouseleave)': 'setHovered(false)',\n '(focusin)': 'setFocused(true)',\n '(focusout)': 'setFocused(false)'\n }\n})\nexport class UiToastComponent {\n readonly intent = input<ToastIntent>('info');\n readonly classes = input<string>('');\n readonly dismissable = input(false, { transform: booleanAttribute });\n\n /** ms before the toast dismisses itself, paused while hovered or focused. null never times out. */\n readonly timeoutMs = input<number | null>(null);\n\n readonly dismissed = output<void>();\n\n protected readonly icon = computed(() => INTENT_ICONS[this.intent()]);\n protected readonly iconColour = computed(() =>\n INTENT_COLOURS[this.intent()]\n );\n\n // errors interrupt the screen reader, everything else waits its turn\n protected readonly role = computed(() =>\n this.intent() === 'danger' ? 'alert' : 'status'\n );\n\n private hovered = false;\n private focused = false;\n\n private timer?: ReturnType<typeof setTimeout>;\n private startedAt = 0;\n private remaining = 0;\n\n constructor() {\n effect(onCleanup => {\n const timeoutMs = this.timeoutMs();\n\n if (timeoutMs === null) {\n return;\n }\n\n this.remaining = timeoutMs;\n this.updateTimer();\n\n onCleanup(() => this.stopTimer());\n });\n }\n\n protected setHovered(hovered: boolean): void {\n this.hovered = hovered;\n this.updateTimer();\n }\n\n protected setFocused(focused: boolean): void {\n this.focused = focused;\n this.updateTimer();\n }\n\n private updateTimer(): void {\n if (this.hovered || this.focused) {\n this.stopTimer();\n } else if (this.timeoutMs() !== null && this.timer === undefined) {\n this.startTimer();\n }\n }\n\n private startTimer(): void {\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.dismissed.emit(), this.remaining);\n }\n\n // keeps whatever time was left so the countdown carries on after a pause\n private stopTimer(): void {\n if (this.timer === undefined) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining -= Date.now() - this.startedAt;\n }\n}\n","<ui-card\n radius=\"xl\"\n class=\"p-4 w-full max-w-xs\"\n [class]=\"classes()\"\n [attr.role]=\"role()\"\n tabindex=\"-1\"\n>\n <div class=\"flex gap-x-3\">\n <div class=\"inline-flex\" [class]=\"iconColour()\">\n <ng-icon\n [name]=\"icon()\"\n class=\"shrink-0\"\n size=\"24\"\n />\n </div>\n <div class=\"grow\">\n <p class=\"text-layer-foreground ui-text-body\">\n <ng-content />\n </p>\n </div>\n @if (dismissable()) {\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"dismissed.emit()\"\n >\n <ng-icon name=\"heroXMark\" />\n </button>\n }\n </div>\n</ui-card>\n","import { Injectable, signal } from '@angular/core';\n\nimport { Toast, ToastMessage, ToastOptions } from './toast.types';\n\n\n@Injectable({ providedIn: 'root' })\nexport class UiToastService {\n private readonly _toasts = signal<Toast[]>([]);\n private nextId = 0;\n\n readonly toasts = this._toasts.asReadonly();\n\n show<ContextType>(\n message: ToastMessage<ContextType>,\n options: ToastOptions<ContextType> = {}\n ): number {\n const id = this.nextId++;\n\n const toast: Toast = {\n id,\n message,\n templateContext: {\n $implicit: options.context,\n dismiss: () => this.dismiss(id)\n },\n intent: options.intent ?? 'info',\n dismissable: options.dismissable ?? true,\n timeoutMs: options.timeoutMs\n };\n\n this._toasts.update(toasts => [...toasts, toast]);\n\n return id;\n }\n\n dismiss(id: number): void {\n this._toasts.update(toasts => toasts.filter(toast => toast.id !== id));\n }\n}\n","import { TemplateRef } from '@angular/core';\n\n\nexport const ToastIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport type ToastIntent = typeof ToastIntents[number];\n\n/** What a toast template receives: `let-data` for the context, `let-dismiss=\"dismiss\"` to close it. */\nexport interface ToastTemplateContext<ContextType = unknown> {\n $implicit: ContextType;\n dismiss: () => void;\n}\n\nexport type ToastMessage<ContextType = unknown> =\n | string\n | TemplateRef<ToastTemplateContext<ContextType>>;\n\nexport interface Toast {\n id: number;\n message: ToastMessage;\n templateContext: ToastTemplateContext;\n intent: ToastIntent;\n dismissable: boolean;\n\n // null never times out, undefined falls back to the toaster's timeout\n timeoutMs?: number | null;\n}\n\nexport type ToastOptions<ContextType = unknown> =\n & Partial<\n Pick<Toast, 'intent' | 'dismissable' | 'timeoutMs'>\n >\n & {\n context?: ContextType;\n };\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\n\nimport { UiToastComponent } from '../toast/toast.component';\nimport { UiToastService } from '../toast/toast.service';\nimport { ToasterPosition } from './toaster.types';\n\n\n// top stacks are reversed so the newest toast is always nearest the edge\nconst POSITION_CLASSES: Record<ToasterPosition, string> = {\n 'top-left': 'top-0 left-0 items-start flex-col-reverse',\n 'top-center':\n 'top-0 left-1/2 -translate-x-1/2 items-center flex-col-reverse',\n 'top-right': 'top-0 right-0 items-end flex-col-reverse',\n 'bottom-left': 'bottom-0 left-0 items-start flex-col',\n 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center flex-col',\n 'bottom-right': 'bottom-0 right-0 items-end flex-col'\n};\n\n@Component({\n selector: 'ui-toaster',\n templateUrl: './toaster.component.html',\n styleUrl: './toaster.component.css',\n imports: [UiToastComponent, NgTemplateOutlet]\n})\nexport class UiToasterComponent {\n readonly position = input<ToasterPosition>('bottom-right');\n readonly timeoutMs = input<number | null>(null);\n\n protected readonly toastService = inject(UiToastService);\n\n protected readonly positionClasses = computed(() =>\n POSITION_CLASSES[this.position()]\n );\n}\n","<section\n class=\"z-50 box-content fixed flex px-4 py-2.5 w-full max-w-xs pointer-events-none\"\n [class]=\"positionClasses()\"\n aria-label=\"Notifications\"\n>\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"ui-toaster--item\"\n animate.enter=\"ui-toaster--enter\"\n animate.leave=\"ui-toaster--leave\"\n >\n <div class=\"ui-toaster--item-inner\">\n <ui-toast\n class=\"block py-1.5 w-full pointer-events-auto\"\n [intent]=\"toast.intent\"\n [dismissable]=\"toast.dismissable\"\n [timeoutMs]=\"toast.timeoutMs === undefined ? timeoutMs() : toast.timeoutMs\"\n (dismissed)=\"toastService.dismiss(toast.id)\"\n >\n @if (typeof toast.message === 'string') {\n {{ toast.message }}\n } @else {\n <ng-container\n *ngTemplateOutlet=\"toast.message; context: toast.templateContext\"\n />\n }\n </ui-toast>\n </div>\n </div>\n }\n</section>\n","export const ToasterPositions = [\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right'\n] as const;\n\nexport type ToasterPosition = typeof ToasterPositions[number];\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, contentChild, TemplateRef } from '@angular/core';\n\n\n@Component({\n selector: 'ui-layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.css',\n imports: [NgTemplateOutlet]\n})\nexport class UiLayoutComponent {\n readonly sidebar = contentChild<TemplateRef<unknown>>('sidebar');\n}\n","<div class=\"shrink-0\">\n <ng-container *ngTemplateOutlet=\"sidebar()\" />\n</div>\n\n<main class=\"min-w-0 overflow-y-auto grow\">\n <ng-content />\n</main>\n","import { Component, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-sidebar',\n exportAs: 'uiSidebar',\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: {\n '[class.open]': 'isOpen()',\n '(document:keydown.escape)': 'isOpen.set(false)'\n }\n})\nexport class UiSidebarComponent {\n readonly isOpen = model<boolean>(false);\n\n readonly toggle = () => this.isOpen.update(isOpen => !isOpen);\n}\n","<div class=\"ui-sidebar-backdrop\" aria-hidden=\"true\" (click)=\"isOpen.set(false)\"></div>\n\n<aside class=\"ui-sidebar-panel\">\n <div class=\"ui-sidebar-content\">\n <ng-content />\n </div>\n\n <footer class=\"ui-sidebar-footer\">\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"p-2!\"\n (click)=\"toggle()\"\n >\n <ng-icon\n name=\"heroChevronDoubleLeft\"\n size=\"16\"\n strokeWidth=\"2\"\n class=\"duration-300 shrink-0\"\n [class.rotate-180]=\"!isOpen()\"\n />\n </ui-button>\n </footer>\n</aside>\n\n@if (!isOpen()) {\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n class=\"ui-sidebar-open-btn\"\n classes=\"p-3! rounded-full! shadow-lg!\"\n ariaLabel=\"Open sidebar\"\n (click)=\"isOpen.set(true)\"\n >\n <ng-icon name=\"heroBars3\" size=\"20\" strokeWidth=\"2\" class=\"shrink-0\" />\n </ui-button>\n}\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiSidebarComponent } from '../sidebar/sidebar.component';\n\n\n@Component({\n selector: 'ui-sidebar-item',\n templateUrl: './sidebar-item.component.html',\n styleUrl: './sidebar-item.component.css',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiSidebarItemComponent {\n private readonly sidebar = inject(UiSidebarComponent, { optional: true });\n\n readonly label = input.required<string>();\n readonly icon = input<string>('');\n\n readonly isCollapsed = computed(() => this.sidebar ? !this.sidebar.isOpen() : false);\n}\n","@if (!isCollapsed() || icon()) {\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n class=\"block\"\n [classes]=\"isCollapsed()\n ? 'ui-sidebar-item ui-sidebar-item--collapsed'\n : 'ui-sidebar-item'\"\n [ariaLabel]=\"isCollapsed() ? label() : ''\"\n >\n @if (icon()) {\n <ng-icon [name]=\"icon()\" size=\"20\" class=\"shrink-0\" />\n }\n\n @if (!isCollapsed()) {\n <span class=\"truncate\">{{ label() }}</span>\n\n <span class=\"empty:hidden ms-auto\">\n <ng-content select=\"ui-badge\" />\n </span>\n }\n </ui-button>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n viewChild\n} from '@angular/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\nconst HEX_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n@Component({\n selector: 'ui-colour',\n templateUrl: './colour.component.html',\n imports: [UiInputComponent, UiInputGroupComponent, UiButtonComponent]\n})\nexport class UiColourComponent {\n readonly value = model<string>('#000000');\n\n readonly id = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly isValid = computed(() => HEX_PATTERN.test(this.value()));\n\n // the native picker only understands lowercase #rrggbb\n protected readonly pickerValue = computed(() => {\n if (!this.isValid()) {\n return '#000000';\n }\n\n const hex = this.value().slice(1).toLowerCase();\n\n return hex.length === 3\n ? '#' + [...hex].map(char => char + char).join('')\n : '#' + hex;\n });\n\n protected openPicker(): void {\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n this.value.set((event.target as HTMLInputElement).value);\n }\n}\n","<ui-input-group [validationState]=\"isValid() ? null : false\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n ariaLabel=\"Pick colour\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <span\n class=\"border border-gray-200 rounded size-5\"\n [style.background-color]=\"isValid() ? value() : 'transparent'\"\n ></span>\n </ui-button>\n\n <input\n #picker\n type=\"color\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"pickerValue()\"\n [disabled]=\"disabled()\"\n (input)=\"handlePick($event)\"\n />\n\n <ui-input\n [(value)]=\"value\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [maxlength]=\"7\"\n [spellcheck]=\"false\"\n autocomplete=\"off\"\n placeholder=\"#000000\"\n />\n</ui-input-group>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n contentChild,\n input,\n model,\n TemplateRef\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\n\n\n// todo\n// this component is just a number input with custom step buttons\n\n@Component({\n selector: 'ui-counter',\n templateUrl: './counter.component.html',\n imports: [UiInputComponent, NgTemplateOutlet, NgIcon]\n})\nexport class UiCounterComponent {\n readonly value = model<number | null>(null);\n readonly step = input<number>(1);\n readonly max = input<number>();\n readonly min = input<number>();\n readonly placeholder = input<string>('');\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n onStepUp() {\n let value = this.value() ?? 0;\n\n value += this.step();\n\n const max = this.max();\n\n if (max !== undefined && value > max) {\n value = max;\n }\n\n this.value.set(value);\n }\n\n onStepDown() {\n let value = this.value() ?? 0;\n\n value -= this.step();\n\n const min = this.min();\n\n if (min !== undefined && value < min) {\n value = min;\n }\n\n this.value.set(value);\n }\n}\n","<ui-input\n [(value)]=\"value\"\n [placeholder]=\"placeholder()\"\n type=\"number\"\n classes=\"[&::-webkit-inner-spin-button]:m-0 [&::-webkit-outer-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n>\n <ng-template #leading>\n <ng-container *ngTemplateOutlet=\"leadingElement()\" />\n </ng-template>\n <ng-template #trailing>\n <ng-container *ngTemplateOutlet=\"trailingElement()\" />\n\n <div class=\"flex self-stretch ms-2\">\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepUp()\"\n >\n <ng-icon name=\"heroPlus\" class=\"shrink-0\" />\n </button>\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepDown()\"\n >\n <ng-icon name=\"heroMinus\" class=\"shrink-0\" />\n </button>\n </div>\n </ng-template>\n</ui-input>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n DateRange,\n IsoDate,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport { parseIsoDate } from '../../generic/calendar/calendar.utils';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n styleUrl: './date-range-picker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n NgIcon\n ],\n host: { class: 'block w-full' }\n})\nexport class UiDateRangePickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly value = model<DateRange>({ start: null, end: null });\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select dates');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n /** Intl options for the dates shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions>({ dateStyle: 'medium' });\n\n /** Quick picks beside the calendar, see date-range-presets.ts for ready made ones. */\n readonly presets = input<DateRangePreset[]>([]);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly hasValue = computed(() => !!this.value().start);\n\n // worked out on open so \"today\" is never stale\n protected readonly presetRanges = computed(() =>\n this.isOpen() ? this.presets().map(preset => this.clamp(preset.range())) : []\n );\n\n protected readonly activePreset = computed(() => {\n const { start, end } = this.value();\n\n return this.presetRanges().findIndex(range =>\n range.start === start && range.end === end\n );\n });\n\n protected readonly display = computed(() => {\n const start = parseIsoDate(this.value().start);\n const end = parseIsoDate(this.value().end);\n const format = new Intl.DateTimeFormat(this.locale(), this.format());\n\n if (!start) {\n return '';\n }\n\n // formatRange shares the month/year, e.g. \"1 – 7 Sept 2026\"\n return end ? format.formatRange(start, end) : `${format.format(start)} – …`;\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handleRange(range: DateRange): void {\n // only close once both ends are picked\n if (range.start && range.end) {\n this.isOpen.set(false);\n this.focusInput();\n }\n }\n\n protected choosePreset(preset: DateRangePreset): void {\n this.value.set(this.clamp(preset.range()));\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set({ start: null, end: null });\n this.focusInput();\n }\n\n // keeps presets inside min/max, e.g. \"This year\" stops at today when max is today\n private clamp({ start, end }: DateRange): DateRange {\n const min = this.min();\n const max = this.max();\n\n return {\n start: start && min && start < min ? min : start,\n end: end && max && end > max ? max : end\n };\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n","import type { WeekStart } from '../../generic/calendar/calendar.types';\nimport { addDays, toIsoDate } from '../../generic/calendar/calendar.utils';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\n// everything is relative to the moment it's clicked, not when the page loaded\nconst today = () => {\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n};\n\nconst between = (start: Date, end: Date) => ({\n start: toIsoDate(start),\n end: toIsoDate(end)\n});\n\nexport function todayPreset(label = 'Today'): DateRangePreset {\n return { label, range: () => between(today(), today()) };\n}\n\n/** The last `days` days, counting today. */\nexport function lastDaysPreset(days: number, label = `Last ${days} days`): DateRangePreset {\n return { label, range: () => between(addDays(today(), 1 - days), today()) };\n}\n\nexport function thisWeekPreset(weekStart: WeekStart = 1, label = 'This week'): DateRangePreset {\n return {\n label,\n range: () => {\n const offset = (today().getDay() - weekStart + 7) % 7;\n const start = addDays(today(), -offset);\n\n return between(start, addDays(start, 6));\n }\n };\n}\n\n/** A calendar month, 0 is this month, -1 is last month. */\nexport function monthPreset(offset = 0, label = offset ? 'Last month' : 'This month'): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n\n return between(\n new Date(now.getFullYear(), now.getMonth() + offset, 1),\n new Date(now.getFullYear(), now.getMonth() + offset + 1, 0)\n );\n }\n };\n}\n\n/** A calendar year, 0 is this year, -1 is last year. */\nexport function yearPreset(offset = 0, label = offset ? 'Last year' : 'This year'): DateRangePreset {\n return {\n label,\n range: () => {\n const year = today().getFullYear() + offset;\n\n return between(new Date(year, 0, 1), new Date(year, 11, 31));\n }\n };\n}\n\n/**\n * A financial year starting on the given day, e.g. the UK tax year is\n * `financialYearPreset(3, 6)` for 6 April. 0 is the current one, -1 the one before.\n */\nexport function financialYearPreset(\n startMonth: number,\n startDay: number,\n offset = 0,\n label = offset ? 'Last financial year' : 'This financial year'\n): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n const thisYearsStart = new Date(now.getFullYear(), startMonth, startDay);\n\n // before this year's start date we're still in the one that began last year\n const startYear = now >= thisYearsStart ? now.getFullYear() : now.getFullYear() - 1;\n const start = new Date(startYear + offset, startMonth, startDay);\n const end = addDays(new Date(startYear + offset + 1, startMonth, startDay), -1);\n\n return between(start, end);\n }\n };\n}\n\n/** A sensible starting set, pass your own list to change it. */\nexport function defaultDateRangePresets(weekStart: WeekStart = 1): DateRangePreset[] {\n return [\n todayPreset(),\n lastDaysPreset(7),\n lastDaysPreset(30),\n thisWeekPreset(weekStart),\n monthPreset(0),\n monthPreset(-1),\n yearPreset(0),\n yearPreset(-1)\n ];\n}\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport { parseTime, toTime } from '../../generic/calendar/calendar.utils';\n\n\n@Component({\n selector: 'ui-time-select',\n templateUrl: './time-select.component.html',\n styleUrl: './time-select.component.css',\n imports: [UiSelectComponent, NgIcon],\n host: { class: 'inline-flex items-center gap-x-1' }\n})\nexport class UiTimeSelectComponent {\n /** 24 hour \"HH:mm\" string. */\n readonly value = model<string>('00:00');\n\n readonly minuteStep = input<number>(5);\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly hours = computed(() => parseTime(this.value())?.hours ?? 0);\n protected readonly minutes = computed(() => parseTime(this.value())?.minutes ?? 0);\n\n protected readonly hourSource = new SelectLocalDataSource(\n Array.from({ length: 24 }, (_, hour) => hour),\n () => true\n );\n\n protected readonly minuteSource = computed(() => {\n const step = Math.max(1, Math.floor(this.minuteStep()));\n\n return new SelectLocalDataSource(\n Array.from({ length: Math.ceil(60 / step) }, (_, index) => index * step),\n () => true\n );\n });\n\n protected readonly pad = (value: number) => String(value).padStart(2, '0');\n\n protected setHours(hours: number | null): void {\n if (hours !== null) {\n this.value.set(toTime(hours, this.minutes()));\n }\n }\n\n protected setMinutes(minutes: number | null): void {\n if (minutes !== null) {\n this.value.set(toTime(this.hours(), minutes));\n }\n }\n}\n","<ng-icon name=\"heroClock\" class=\"me-1 text-muted-foreground-1 shrink-0\" />\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"hourSource\"\n [displayWith]=\"pad\"\n [pageSize]=\"24\"\n [selectedItem]=\"hours()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setHours($event)\"\n/>\n\n<span class=\"text-muted-foreground-1\" aria-hidden=\"true\">:</span>\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"minuteSource()\"\n [displayWith]=\"pad\"\n [pageSize]=\"60\"\n [selectedItem]=\"minutes()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setMinutes($event)\"\n/>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n IsoDate,\n IsoDateTime,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport {\n parseIsoDateTime,\n parseTime,\n toIsoDate\n} from '../../generic/calendar/calendar.utils';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiTimeSelectComponent } from '../time-select/time-select.component';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-datepicker',\n templateUrl: './datepicker.component.html',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiButtonComponent,\n UiTimeSelectComponent,\n NgIcon,\n UiCardComponent\n ],\n host: { class: 'block w-full' }\n})\nexport class UiDatepickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n /** \"2026-09-29\", or \"2026-09-29T14:30\" when `withTime` is on. */\n readonly value = model<IsoDate | IsoDateTime | null>(null);\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select date');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n readonly withTime = input(false, { transform: booleanAttribute });\n readonly minuteStep = input<number>(5);\n\n /** Time used when a date is picked before a time has been chosen. */\n readonly defaultTime = input<string>('00:00');\n\n /** Intl options for the value shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions | null>(null);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly datePart = computed(() =>\n this.value()?.slice(0, 10) ?? null\n );\n\n protected readonly timePart = computed(() => {\n const time = this.value()?.slice(11, 16);\n\n return parseTime(time) ? time! : this.defaultTime();\n });\n\n protected readonly display = computed(() => {\n const date = parseIsoDateTime(this.value());\n const format = this.format() ?? (this.withTime()\n ? { dateStyle: 'medium', timeStyle: 'short' } as const\n : { dateStyle: 'medium' } as const);\n\n return date\n ? new Intl.DateTimeFormat(this.locale(), format).format(date)\n : '';\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handlePick(date: IsoDate | null): void {\n if (!date) {\n return;\n }\n\n if (!this.withTime()) {\n this.value.set(date);\n this.close();\n return;\n }\n\n // stays open so the time can be set too\n this.value.set(`${date}T${this.timePart()}`);\n }\n\n protected handleTime(time: string): void {\n // picking a time first puts it on today\n const date = this.datePart() ?? toIsoDate(new Date());\n\n this.value.set(`${date}T${time}`);\n }\n\n protected close(): void {\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set(null);\n this.focusInput();\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendar\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && value() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center self-stretch w-8 text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear date\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"xl\" class=\"p-3\">\n <ui-calendar\n [value]=\"datePart()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (valueChange)=\"handlePick($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n @if (withTime()) {\n <div class=\"flex justify-between items-center gap-x-2 mt-3 pt-3 border-gray-200 border-t\">\n <ui-time-select\n [value]=\"timePart()\"\n [minuteStep]=\"minuteStep()\"\n (valueChange)=\"handleTime($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n <ui-button size=\"sm\" (click)=\"close()\">Done</ui-button>\n </div>\n }\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Component, input, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport {\n ButtonAppearance,\n ButtonIntent\n} from '../../generic/button/button.types';\n\n\n@Component({\n selector: 'ui-dropdown-button',\n templateUrl: './dropdown-button.component.html',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiDropdownButtonComponent {\n readonly intent = input<ButtonIntent>('secondary');\n readonly appearance = input<ButtonAppearance>('white');\n readonly icon = input<string>('heroChevronDown');\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n [intent]=\"intent()\"\n [appearance]=\"appearance()\"\n (click)=\"isOpen.update(value => !value)\"\n>\n <ng-content />\n <ng-icon\n name=\"heroChevronDown\"\n class=\"size-4 transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n</ui-button>\n","import { Component, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { DropdownMenuItem } from './dropdown-menu.types';\n\n\n@Component({\n selector: 'ui-dropdown-menu',\n templateUrl: './dropdown-menu.component.html',\n imports: [UiButtonComponent, UiCardComponent, NgIcon]\n})\nexport class UiDropdownMenuComponent {\n readonly items = input.required<DropdownMenuItem[]>();\n}\n","<ui-card radius=\"lg\" class=\"divide-y w-3xs max-w-md\" role=\"menu\">\n @for (item of items(); track $index) {\n @if ('divider' in item) {\n <div class=\"my-1 border-border border-t\"></div>\n } @else if ('children' in item) {\n <div class=\"flex flex-col gap-y-0.5 p-1\">\n <span\n class=\"block px-4 pt-2 pb-1 font-medium text-muted-foreground ui-text-caption uppercase\"\n >\n {{ item.label }}\n </span>\n\n @for (child of item.children; track child.label) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"child.onClick()\"\n >\n @if (child.icon) {\n <ng-icon\n [name]=\"child.icon\"\n size=\"18\"\n strokeWidth=\"1.5\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ child.label }}\n </ui-button>\n }\n </div>\n } @else {\n <div class=\"p-1\">\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"item.onClick()\"\n >\n @if (item.icon) {\n <ng-icon\n [name]=\"item.icon\"\n size=\"18\"\n strokeWidth=\"2\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ item.label }}\n </ui-button>\n </div>\n }\n }\n</ui-card>\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport type { FileRejection } from '../../forms/file/file.types';\nimport { selectFiles } from '../../forms/file/file.utils';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-file-input',\n templateUrl: './file-input.component.html',\n imports: [\n UiInputComponent,\n UiInputGroupComponent,\n UiButtonComponent,\n NgIcon\n ]\n})\nexport class UiFileInputComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly placeholder = input<string>('No file chosen');\n readonly buttonLabel = input<string>('Browse');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly hasRejection = signal(false);\n\n protected readonly summary = computed(() => {\n const files = this.value();\n\n return files.length > 1\n ? `${files.length} files`\n : files[0]?.name ?? '';\n });\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n const { accepted, rejected } = selectFiles(\n [...target.files ?? []],\n this.accept(),\n this.maxSize()\n );\n\n // reset so picking the same file again still fires change\n target.value = '';\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the picker\n event.stopPropagation();\n\n this.value.set([]);\n this.hasRejection.set(false);\n }\n}\n","<ui-input-group [validationState]=\"hasRejection() ? false : null\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <ng-icon name=\"heroArrowUpTray\" class=\"shrink-0\" />\n {{ buttonLabel() }}\n </ui-button>\n\n <input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n />\n\n <ui-input\n [value]=\"summary()\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"placeholder()\"\n [describedBy]=\"describedBy()\"\n classes=\"truncate cursor-pointer\"\n readonly\n (click)=\"openPicker()\"\n >\n <ng-template #trailing>\n @if (value().length && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear files\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n</ui-input-group>\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\n\n\n// restyles ui-checkbox into a track-and-thumb switch, same behaviour underneath\n@Component({\n selector: 'ui-switch',\n templateUrl: './switch.component.html',\n imports: [UiCheckboxComponent]\n})\nexport class UiSwitchComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","<label class=\"inline-flex items-center gap-2 cursor-pointer\" [class.opacity-50]=\"disabled()\">\n <span class=\"relative inline-flex items-center rounded-full focus-within:ring-2 focus-within:ring-primary-200/50\">\n <!--\n reuses ui-checkbox for the real state/behaviour, class-bound track/thumb below\n react to value() directly instead of peer-checked, since peer-* relies on the\n input and the styled element being real DOM siblings, which breaks once the\n input is nested inside ui-checkbox's own host element\n -->\n <ui-checkbox\n [(value)]=\"value\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n classes=\"sr-only\"\n />\n\n <span\n class=\"w-9 h-5 rounded-full transition-colors\"\n [class.bg-primary-600]=\"value()\"\n [class.bg-gray-200]=\"!value()\"\n ></span>\n\n <span\n class=\"absolute left-0.5 size-4 rounded-full bg-white shadow transition-transform\"\n [class.translate-x-4]=\"value()\"\n ></span>\n </span>\n\n <ng-content />\n</label>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"area8975-ui.mjs","names":[],"sources":["../../../projects/ui/src/lib/charts/chart/chart.palette.ts","../../../projects/ui/src/lib/charts/chart/axis-chart.base.ts","../../../projects/ui/src/lib/charts/chart/chart.options.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.component.html","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.ts","../../../projects/ui/src/lib/charts/chart-legend/chart-legend.component.html","../../../projects/ui/src/lib/charts/chart/chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-table.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.component.ts","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/bar-chart/bar-chart.types.ts","../../../projects/ui/src/lib/charts/line-chart/line-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/line-chart/line-chart.types.ts","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.component.ts","../../../projects/ui/src/lib/charts/chart/chart-frame.template.html","../../../projects/ui/src/lib/charts/pie-chart/pie-chart.types.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.ts","../../../projects/ui/src/lib/forms/checkbox/checkbox.component.html","../../../projects/ui/src/lib/forms/file/file.utils.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.ts","../../../projects/ui/src/lib/forms/dropzone/dropzone.component.html","../../../projects/ui/src/lib/forms/field/field.component.ts","../../../projects/ui/src/lib/forms/field/field.component.html","../../../projects/ui/src/lib/forms/file/file.types.ts","../../../projects/ui/src/lib/forms/input/input.component.ts","../../../projects/ui/src/lib/forms/input/input.component.html","../../../projects/ui/src/lib/forms/input/input.types.ts","../../../projects/ui/src/lib/forms/input-addon/input-addon.component.ts","../../../projects/ui/src/lib/forms/input-group/input-group.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.ts","../../../projects/ui/src/lib/forms/radio/radio.component.html","../../../projects/ui/src/lib/generic/badge/badge.component.ts","../../../projects/ui/src/lib/generic/badge/badge.component.html","../../../projects/ui/src/lib/generic/card/card.types.ts","../../../projects/ui/src/lib/generic/card/card.component.ts","../../../projects/ui/src/lib/layout/overlay/overlay.positioner.ts","../../../projects/ui/src/lib/layout/overlay/overlay.stack.ts","../../../projects/ui/src/lib/layout/overlay/overlay.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.directives.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.ts","../../../projects/ui/src/lib/generic/dropdown/dropdown.component.html","../../../projects/ui/src/lib/forms/select/select.component.ts","../../../projects/ui/src/lib/forms/select/select.component.html","../../../projects/ui/src/lib/forms/select/select.datasource.ts","../../../projects/ui/src/lib/forms/select/select.types.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.ts","../../../projects/ui/src/lib/forms/textarea/textarea.component.html","../../../projects/ui/src/lib/forms/textarea/textarea.types.ts","../../../projects/ui/src/lib/generic/alert/alert.component.ts","../../../projects/ui/src/lib/generic/alert/alert.component.html","../../../projects/ui/src/lib/generic/alert/alert.types.ts","../../../projects/ui/src/lib/generic/badge/badge.types.ts","../../../projects/ui/src/lib/generic/button/button.component.ts","../../../projects/ui/src/lib/generic/button/button.component.html","../../../projects/ui/src/lib/generic/button/button.types.ts","../../../projects/ui/src/lib/generic/button-group/button-group.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.utils.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.ts","../../../projects/ui/src/lib/generic/calendar/calendar.component.html","../../../projects/ui/src/lib/generic/calendar/calendar.types.ts","../../../projects/ui/src/lib/generic/container/container.component.ts","../../../projects/ui/src/lib/generic/drawer/drawer.component.ts","../../../projects/ui/src/lib/generic/drawer/drawer.component.html","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.ts","../../../projects/ui/src/lib/generic/tooltip/tooltip.component.html","../../../projects/ui/src/lib/generic/kpi/kpi.component.ts","../../../projects/ui/src/lib/generic/kpi/kpi.component.html","../../../projects/ui/src/lib/generic/loading/loading.component.ts","../../../projects/ui/src/lib/generic/loading/loading.component.html","../../../projects/ui/src/lib/generic/loading/loading.types.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.ts","../../../projects/ui/src/lib/presets/modal-close-btn/modal-close-btn.component.html","../../../projects/ui/src/lib/generic/modal/modal.component.ts","../../../projects/ui/src/lib/generic/modal/modal.component.html","../../../projects/ui/src/lib/generic/money/money.component.ts","../../../projects/ui/src/lib/generic/money/money.component.html","../../../projects/ui/src/lib/generic/money/money.types.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.ts","../../../projects/ui/src/lib/generic/pagination/pagination.component.html","../../../projects/ui/src/lib/generic/progress/progress.component.ts","../../../projects/ui/src/lib/generic/progress/progress.component.html","../../../projects/ui/src/lib/generic/progress/progress.types.ts","../../../projects/ui/src/lib/generic/skeleton/skeleton.types.ts","../../../projects/ui/src/lib/generic/tab/tab.directive.ts","../../../projects/ui/src/lib/generic/tab/tab.component.ts","../../../projects/ui/src/lib/generic/tab/tab.component.html","../../../projects/ui/src/lib/generic/table/table.component.ts","../../../projects/ui/src/lib/generic/table/table.component.html","../../../projects/ui/src/lib/generic/table/table.datasource.ts","../../../projects/ui/src/lib/generic/toast/toast.component.ts","../../../projects/ui/src/lib/generic/toast/toast.component.html","../../../projects/ui/src/lib/generic/toast/toast.service.ts","../../../projects/ui/src/lib/generic/toast/toast.types.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.ts","../../../projects/ui/src/lib/generic/toaster/toaster.component.html","../../../projects/ui/src/lib/generic/toaster/toaster.types.ts","../../../projects/ui/src/lib/layout/layout/layout.component.ts","../../../projects/ui/src/lib/layout/layout/layout.component.html","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.ts","../../../projects/ui/src/lib/layout/sidebar/sidebar.component.html","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.ts","../../../projects/ui/src/lib/layout/sidebar-item/sidebar-item.component.html","../../../projects/ui/src/lib/presets/colour/colour.component.ts","../../../projects/ui/src/lib/presets/colour/colour.component.html","../../../projects/ui/src/lib/presets/counter/counter.component.ts","../../../projects/ui/src/lib/presets/counter/counter.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.ts","../../../projects/ui/src/lib/presets/date-range-picker/date-range-picker.component.html","../../../projects/ui/src/lib/presets/date-range-picker/date-range-presets.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.ts","../../../projects/ui/src/lib/presets/time-select/time-select.component.html","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.ts","../../../projects/ui/src/lib/presets/datepicker/datepicker.component.html","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.ts","../../../projects/ui/src/lib/presets/dropdown-button/dropdown-button.component.html","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.ts","../../../projects/ui/src/lib/presets/dropdown-menu/dropdown-menu.component.html","../../../projects/ui/src/lib/presets/file-input/file-input.component.ts","../../../projects/ui/src/lib/presets/file-input/file-input.component.html","../../../projects/ui/src/lib/presets/switch/switch.component.ts","../../../projects/ui/src/lib/presets/switch/switch.component.html"],"sourcesContent":["/**\n * Categorical colours for chart series, in a fixed order that was checked for\n * colour blindness (adjacent pairs stay apart for protan, deutan and tritan).\n * Keep the order, a series takes the next slot, never a generated colour.\n */\nexport const CHART_PALETTE = [\n '#2a78d6', // blue\n '#eb6834', // orange\n '#1baf7a', // aqua\n '#eda100', // yellow\n '#e87ba4', // magenta\n '#008300', // green\n '#4a3aa7', // violet\n '#e34948' // red\n] as const;\n\n/** Past eight series, fold the rest into \"Other\" instead of reusing a colour. */\nexport const CHART_MAX_SERIES = CHART_PALETTE.length;\n\n/** Lines can go to sixteen, the second eight reuse the colours dashed. */\nexport const CHART_MAX_LINE_SERIES = CHART_PALETTE.length * 2;\n\n// chart chrome, kept to the gray scale the rest of the library uses\nexport const CHART_INK = {\n text: '#1e2939', // gray-800\n muted: '#6a7282', // gray-500\n grid: '#e5e7eb', // gray-200\n surface: '#ffffff',\n context: '#d1d5dc' // gray-300, series that are there for context\n} as const;\n\nexport interface ChartSeriesStyle {\n colour: string;\n dashed: boolean;\n}\n\n/** Past the eighth slot a series goes grey, reusing a colour would make two series look the same. */\nexport function chartColour(index: number): string {\n return CHART_PALETTE[index] ?? CHART_INK.context;\n}\n\n/**\n * Colour plus line style for a slot. With `dashes` the ninth to sixteenth\n * slots reuse the colours as dashed lines, colour and dash together keep\n * them apart. Anything past that is grey.\n */\nexport function chartSeriesStyle(index: number, dashes: boolean): ChartSeriesStyle {\n if (dashes && index >= CHART_PALETTE.length && index < CHART_MAX_LINE_SERIES) {\n return { colour: CHART_PALETTE[index - CHART_PALETTE.length], dashed: true };\n }\n\n return { colour: chartColour(index), dashed: false };\n}\n","import {\n booleanAttribute,\n computed,\n Directive,\n input,\n signal\n} from '@angular/core';\n\nimport type {\n ChartLegendItem,\n ChartLegendPosition,\n ChartLegendSource\n} from '../chart-legend/chart-legend.types';\nimport {\n CHART_INK,\n type ChartSeriesStyle,\n chartSeriesStyle\n} from './chart.palette';\nimport type {\n ChartOptions,\n ChartSeries,\n ChartValueFormatter\n} from './chart.types';\n\n\nconst defaultFormatter: ChartValueFormatter = value =>\n new Intl.NumberFormat('en-GB').format(value);\n\n/** Inputs every chart with categories along one axis and values up the other shares. */\n@Directive()\nexport abstract class UiAxisChartBase implements ChartLegendSource {\n readonly series = input.required<ChartSeries[]>();\n readonly categories = input.required<string[]>();\n\n /** Says what the chart shows, e.g. \"Spending by month\". */\n readonly ariaLabel = input.required<string>();\n\n readonly height = input<number>(300);\n\n /** Used on the value axis, the tooltip and the table, e.g. to show money. */\n readonly valueFormatter = input<ChartValueFormatter>(defaultFormatter);\n\n /** Heading for the category column in the data table. */\n readonly categoryLabel = input<string>('Category');\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly emptyText = input<string>('No data to show');\n\n /** Shows the data table under the chart instead of only to screen readers. */\n readonly showTable = input(false, { transform: booleanAttribute });\n\n /** Raw ApexCharts options merged over the defaults, for anything not covered here. */\n readonly options = input<ChartOptions | null>(null);\n\n /**\n * Only these series get palette colours, the rest go grey so the few that\n * matter stand out. The way to show more series than there are colours.\n */\n readonly highlight = input<string[] | null>(null);\n\n /** `none` leaves the legend out, for when a `ui-chart-legend` is linked with `for`. */\n readonly legend = input<ChartLegendPosition>('auto');\n\n /** Series switched off in the legend. */\n readonly hiddenSeries = signal<string[]>([]);\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = signal<string | null>(null);\n\n /** Charts that draw lines can tell series apart by dashes too, bars can't. */\n protected readonly supportsDashes: boolean = false;\n\n protected readonly isEmpty = computed(() =>\n !this.series().some(item => item.data.some(value => value !== null))\n );\n\n protected readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.series().map(item =>\n !!highlight && !highlight.includes(item.name)\n );\n });\n\n // highlighted series take slots in the order they're highlighted, so colours don't depend on data order\n protected readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n\n return this.series().map((item, index) => {\n if (muted[index]) {\n return { colour: CHART_INK.context, dashed: false };\n }\n\n const style = chartSeriesStyle(\n highlight ? highlight.indexOf(item.name) : index,\n this.supportsDashes\n );\n\n return item.colour ? { ...style, colour: item.colour } : style;\n });\n });\n\n protected readonly colours = computed(() =>\n this.styles().map(style => style.colour)\n );\n protected readonly dashed = computed(() =>\n this.styles().map(style => style.dashed)\n );\n\n /** Grey context series stay out of the legend, the note says how many there are. */\n readonly legendItems = computed<ChartLegendItem[]>(() => {\n const highlight = this.highlight();\n const items = this.series()\n .map((item, index) => ({\n name: item.name,\n ...this.styles()[index]\n }))\n .filter((_, index) => !this.isMuted()[index]);\n\n // follows the highlight order, which is also the colour order\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n readonly legendNote = computed(() => {\n const count = this.isMuted().filter(Boolean).length;\n\n return count ? `${count} more in grey` : '';\n });\n\n protected formatValue(value: number | null | undefined): string {\n return value === null || value === undefined\n ? '-'\n : this.valueFormatter()(value);\n }\n}\n","import { CHART_INK } from './chart.palette';\nimport type { ChartOptions } from './chart.types';\n\n\n/** Axis text, muted so it sits behind the data. */\nexport const CHART_AXIS_LABELS = {\n style: { colors: CHART_INK.muted, fontSize: '12px' }\n};\n\nexport interface ChartTooltipRow {\n colour: string;\n name: string;\n value: string;\n dashed?: boolean;\n}\n\n/** Defaults every chart starts from, quiet chrome so the data does the talking. */\nexport function baseChartOptions(): ChartOptions {\n return {\n chart: {\n fontFamily: 'inherit',\n foreColor: CHART_INK.muted,\n parentHeightOffset: 0,\n redrawOnParentResize: true,\n toolbar: { show: false },\n zoom: { enabled: false },\n animations: { enabled: true, speed: 300 }\n },\n dataLabels: { enabled: false },\n // apex fades fills and lines to 85% by default, which washes the palette out\n fill: { type: 'solid', opacity: 1 },\n grid: {\n borderColor: CHART_INK.grid,\n strokeDashArray: 0,\n padding: { top: 0, right: 8, bottom: 0, left: 8 }\n },\n // ui-chart-legend draws the legend, apex's own stays off\n legend: { show: false },\n xaxis: {\n axisBorder: { show: true, color: CHART_INK.grid },\n axisTicks: { show: false },\n labels: CHART_AXIS_LABELS\n },\n yaxis: {\n axisBorder: { show: false },\n axisTicks: { show: false },\n labels: CHART_AXIS_LABELS\n },\n states: {\n hover: { filter: { type: 'lighten' } },\n active: { filter: { type: 'none' } }\n }\n };\n}\n\n/** Plain objects merge key by key, arrays and everything else replace. */\nexport function mergeChartOptions(base: ChartOptions, overrides: ChartOptions | null): ChartOptions {\n return overrides ? deepMerge(base, overrides) as ChartOptions : base;\n}\n\n/** The HTML inside a tooltip, styled by chart.component.css. */\nexport function chartTooltipHtml(title: string, rows: ChartTooltipRow[], footer = ''): string {\n const items = rows.map(row => `\n <div class=\"ui-chart-tooltip-row ui-text-body-alt\">\n <span\n class=\"ui-chart-tooltip-dot${row.dashed ? ' ui-chart-tooltip-dot--dashed' : ''}\"\n style=\"--ui-chart-tooltip-colour: ${escapeHtml(row.colour)}\"\n ></span>\n <span class=\"ui-chart-tooltip-name\">${escapeHtml(row.name)}</span>\n <span class=\"ui-chart-tooltip-value\">${escapeHtml(row.value)}</span>\n </div>\n `).join('');\n\n return `\n <div class=\"ui-chart-tooltip\">\n ${title ? `<div class=\"ui-chart-tooltip-title ui-text-caption\">${escapeHtml(title)}</div>` : ''}\n ${items}\n ${footer ? `<div class=\"ui-chart-tooltip-footer ui-text-caption\">${escapeHtml(footer)}</div>` : ''}\n </div>\n `;\n}\n\n// tooltip HTML is built from data, so anything that came from outside gets escaped\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction deepMerge(base: unknown, overrides: unknown): unknown {\n if (!isPlainObject(base) || !isPlainObject(overrides)) {\n return overrides === undefined ? base : overrides;\n }\n\n const merged: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(overrides)) {\n merged[key] = deepMerge(base[key], value);\n }\n\n return merged;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n numberAttribute\n} from '@angular/core';\n\nimport type { SkeletonShape } from './skeleton.types';\n\n\n/**\n * A placeholder shown while content loads. Size it with classes on the\n * element, e.g. `class=\"w-48\"` for text or `class=\"size-12\"` for a circle.\n */\n@Component({\n selector: 'ui-skeleton',\n templateUrl: './skeleton.component.html',\n styleUrl: './skeleton.component.css',\n host: {\n // purely visual, the loading region should set aria-busy instead\n 'aria-hidden': 'true',\n '[class]': 'generatedClasses()'\n }\n})\nexport class UiSkeletonComponent {\n readonly shape = input<SkeletonShape>('text');\n readonly animated = input(true, { transform: booleanAttribute });\n\n /** Text only, stacks this many lines with a shorter last one. */\n readonly lines = input(1, { transform: numberAttribute });\n\n readonly classes = input<string>('');\n\n protected readonly lineIndexes = computed(() =>\n Array.from(\n { length: Math.max(1, Math.floor(this.lines())) },\n (_, index) => index\n )\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-skeleton',\n `ui-skeleton--${this.shape()}`,\n this.animated() ? 'ui-skeleton--animated' : '',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (shape() === 'text') {\n @for (index of lineIndexes(); track index) {\n <span class=\"ui-skeleton-line\"></span>\n }\n} @else {\n <span class=\"ui-skeleton-block\"></span>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n output,\n signal,\n untracked\n} from '@angular/core';\n\nimport type { ChartLegendItem, ChartLegendSource } from './chart-legend.types';\n\n\n/**\n * A row of colour keys naming what each colour means. Link it to a chart\n * with `for`, or pass `items` to use it next to anything coloured by series.\n */\n@Component({\n selector: 'ui-chart-legend',\n templateUrl: './chart-legend.component.html',\n styleUrl: './chart-legend.component.css'\n})\nexport class UiChartLegendComponent {\n readonly items = input<ChartLegendItem[]>([]);\n\n /** Small text after the items, e.g. how many series aren't listed. */\n readonly note = input<string>('');\n\n /** A chart to take items from and hide or fade series on, set its `legend` to `none`. */\n readonly for = input<ChartLegendSource | null>(null);\n\n /** Names of items switched off, bound two-way when `toggleable`. */\n readonly hidden = model<string[]>([]);\n\n /** Lets each item be clicked to hide or show its series. */\n readonly toggleable = input(false, { transform: booleanAttribute });\n\n /** The item being hovered or focused, null when it leaves. Charts fade the other series. */\n readonly focusChange = output<string | null>();\n\n private readonly hovered = signal<string | null>(null);\n private readonly focused = signal<string | null>(null);\n\n // the pointer wins while it's over an item, keyboard focus is the fallback\n private readonly pointedAt = computed(() => this.hovered() ?? this.focused());\n\n // a linked chart wins over the plain inputs\n protected readonly shownItems = computed(() => this.for()?.legendItems() ?? this.items());\n protected readonly shownNote = computed(() => this.for()?.legendNote() ?? this.note());\n private readonly hiddenNames = computed(() => this.for()?.hiddenSeries() ?? this.hidden());\n\n protected readonly visibleCount = computed(() =>\n this.shownItems().filter(item => !this.hiddenNames().includes(item.name)).length\n );\n\n constructor() {\n effect(() => {\n const name = this.pointedAt();\n\n untracked(() => {\n this.for()?.emphasis.set(name);\n this.focusChange.emit(name);\n });\n });\n }\n\n protected hover(name: string | null): void {\n this.hovered.set(name);\n }\n\n protected focus(name: string | null): void {\n this.focused.set(name);\n }\n\n protected isHidden(item: ChartLegendItem): boolean {\n return this.hiddenNames().includes(item.name);\n }\n\n // the last one showing stays on, an empty chart helps nobody\n protected isLocked(item: ChartLegendItem): boolean {\n return !this.isHidden(item) && this.visibleCount() === 1;\n }\n\n protected toggle(item: ChartLegendItem): void {\n if (this.isLocked(item)) {\n return;\n }\n\n const hidden = this.hiddenNames();\n const next = hidden.includes(item.name)\n ? hidden.filter(name => name !== item.name)\n : [...hidden, item.name];\n\n const source = this.for();\n\n if (source) {\n source.hiddenSeries.set(next);\n } else {\n this.hidden.set(next);\n }\n }\n}\n","<ul class=\"ui-chart-legend\" role=\"list\">\n @for (item of shownItems(); track item.name) {\n <li\n (mouseenter)=\"hover(item.name)\"\n (mouseleave)=\"hover(null)\"\n (focusin)=\"focus(item.name)\"\n (focusout)=\"focus(null)\"\n >\n @if (toggleable()) {\n <button\n type=\"button\"\n class=\"ui-chart-legend-item ui-chart-legend-item--button ui-text-body-alt\"\n [attr.aria-pressed]=\"!isHidden(item)\"\n [attr.aria-disabled]=\"isLocked(item) || null\"\n [attr.data-hidden]=\"isHidden(item) ? '' : null\"\n (click)=\"toggle(item)\"\n >\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.name }}\n </button>\n } @else {\n <span class=\"ui-chart-legend-item ui-text-body-alt\">\n <span\n class=\"ui-chart-legend-key\"\n [class.ui-chart-legend-key--dashed]=\"item.dashed\"\n [style.--ui-chart-legend-colour]=\"item.colour\"\n ></span>\n {{ item.name }}\n </span>\n }\n </li>\n }\n</ul>\n\n@if (shownNote()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{ shownNote() }}</span>\n}\n","import {\n afterNextRender,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\n\nimport type ApexCharts from 'apexcharts';\n\nimport type { ChartOptions } from './chart.types';\n\n\n/**\n * Draws raw ApexCharts options. The typed charts (bar, line and so on) are\n * built on this, reach for it directly only when they can't do what you need.\n */\n@Component({\n selector: 'ui-chart',\n template: `\n <div\n #canvas\n class=\"ui-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel()\"\n ></div>\n `,\n styleUrl: './chart.component.css',\n // ApexCharts builds its own DOM, scoped styles would never reach the tooltip\n encapsulation: ViewEncapsulation.None,\n host: { class: 'ui-chart' }\n})\nexport class UiChartComponent {\n readonly options = input.required<ChartOptions>();\n\n /** What the chart shows, e.g. \"Spending by month\". Screen readers get this instead of the SVG. */\n readonly ariaLabel = input.required<string>();\n\n /** Series names to keep off the plot, e.g. switched off in the legend. */\n readonly hiddenSeries = input<string[]>([]);\n\n /** Fades every other series so this one stands out, e.g. while its legend item is hovered. */\n readonly emphasis = input<string | null>(null);\n\n private readonly canvas = viewChild.required<ElementRef<HTMLElement>>(\n 'canvas'\n );\n private readonly chart = signal<ApexCharts | null>(null);\n\n private destroyed = false;\n\n constructor() {\n // loaded on first use so pages without charts don't pay for the library\n afterNextRender(async () => {\n const { default: Apex } = await import('apexcharts');\n\n if (this.destroyed) {\n return;\n }\n\n const chart = new Apex(\n this.canvas().nativeElement,\n untracked(this.options)\n );\n\n await chart.render();\n this.chart.set(chart);\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n\n // later option changes update in place, so bars animate to their new size\n effect(() => {\n const options = this.options();\n const chart = this.chart();\n\n // an update redraws every series, so hidden and faded ones need setting again\n chart?.updateOptions(options, false, true).then(() => {\n this.applyHidden(chart);\n this.applyEmphasis();\n });\n });\n\n effect(() => {\n this.emphasis();\n\n if (this.chart()) {\n this.applyEmphasis();\n }\n });\n\n effect(() => {\n const chart = this.chart();\n\n if (chart) {\n this.applyHidden(chart);\n this.applyEmphasis();\n }\n });\n\n inject(DestroyRef).onDestroy(() => {\n this.destroyed = true;\n this.chart()?.destroy();\n });\n }\n\n private applyHidden(chart: ApexCharts): void {\n const hidden = this.hiddenSeries();\n\n for (const name of this.seriesNames()) {\n if (!name) {\n continue;\n }\n\n if (hidden.includes(name)) {\n chart.hideSeries(name);\n } else {\n chart.showSeries(name);\n }\n }\n }\n\n // done with a class rather than apex's own highlight, which has no clean way to undo\n private applyEmphasis(): void {\n const names = this.seriesNames();\n\n // a hidden series isn't drawn, fading everything towards it would leave nothing to see\n const emphasis = untracked(this.emphasis);\n const active =\n emphasis &&\n names.includes(emphasis) &&\n !untracked(this.hiddenSeries).includes(emphasis)\n ? emphasis\n : null;\n const groups = this.canvas().nativeElement.querySelectorAll<\n SVGGElement\n >('.apexcharts-series[data\\\\:realIndex]');\n\n for (const group of groups) {\n const name = names[Number(group.getAttribute('data:realIndex'))];\n\n group.classList.toggle(\n 'ui-chart-series--faded',\n !!active && name !== active\n );\n }\n }\n\n // pies pass plain numbers as series, their names live in labels\n private seriesNames(): (string | null)[] {\n const { series = [], labels = [] } = untracked(this.options);\n\n return series.map((item, index) =>\n typeof item === 'object' && item !== null && 'name' in item\n ? item.name ?? null\n : labels[index] ?? null\n );\n }\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\nimport type { ChartSeries, ChartValueFormatter } from './chart.types';\n\n\n/**\n * The numbers behind a chart as a table. Hidden visually by default so screen\n * readers still get the data, `visible` shows it for everyone.\n */\n@Component({\n selector: 'ui-chart-table',\n template: `\n <!-- sr-only on a wrapper, the table's own width would otherwise override it -->\n <div [class.sr-only]=\"!visible()\">\n <table class=\"ui-chart-table\">\n <caption class=\"sr-only\">{{ caption() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\" class=\"ui-text-caption\">{{ categoryLabel() }}</th>\n @for (item of series(); track item.name) {\n <th scope=\"col\" class=\"ui-text-caption\">{{ item.name }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (category of categories(); track $index; let row = $index) {\n <tr>\n <th scope=\"row\" class=\"ui-text-body-alt\">{{ category }}</th>\n @for (item of series(); track item.name) {\n <td class=\"ui-text-body-alt\">{{ format(item.data[row]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n `,\n styleUrl: './chart-table.component.css'\n})\nexport class UiChartTableComponent {\n readonly caption = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input<string>('Category');\n readonly visible = input(false, { transform: booleanAttribute });\n\n protected format(value: number | null | undefined): string {\n return value === null || value === undefined ? '-' : this.valueFormatter()(value);\n }\n}\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport { UiSkeletonComponent } from '../../generic/skeleton/skeleton.component';\nimport { UiChartLegendComponent } from '../chart-legend/chart-legend.component';\nimport type { ChartLegendItem } from '../chart-legend/chart-legend.types';\nimport { UiChartComponent } from './chart.component';\nimport type { ChartOptions, ChartSeries, ChartValueFormatter } from './chart.types';\nimport { UiChartTableComponent } from './chart-table.component';\n\n\n/** The loading, empty and data table states around a chart, shared by every chart type. */\n@Component({\n selector: 'ui-chart-frame',\n template: `\n @if (loading()) {\n <div [style.height.px]=\"height()\" aria-busy=\"true\">\n <span class=\"sr-only\">Loading chart</span>\n <ui-skeleton shape=\"rect\" class=\"size-full\" />\n </div>\n } @else if (empty()) {\n <div\n class=\"flex justify-center items-center border border-gray-200 border-dashed rounded-lg text-muted-foreground-1 ui-text-body-alt\"\n [style.height.px]=\"height()\"\n >\n {{ emptyText() }}\n </div>\n } @else {\n <!-- one series needs no legend, the chart's title already names it -->\n @if (showLegend() && (legendItems().length > 1 || legendNote())) {\n <ui-chart-legend\n class=\"mb-3\"\n [items]=\"legendItems()\"\n [note]=\"legendNote()\"\n [(hidden)]=\"hiddenSeries\"\n (focusChange)=\"emphasis.set($event)\"\n toggleable\n />\n }\n\n <ui-chart\n [options]=\"options()\"\n [ariaLabel]=\"ariaLabel()\"\n [hiddenSeries]=\"hiddenSeries()\"\n [emphasis]=\"emphasis()\"\n />\n\n <ui-chart-table\n [caption]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [visible]=\"showTable()\"\n />\n }\n `,\n imports: [\n UiChartComponent,\n UiChartTableComponent,\n UiChartLegendComponent,\n UiSkeletonComponent\n ],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiChartFrameComponent {\n readonly options = input.required<ChartOptions>();\n readonly ariaLabel = input.required<string>();\n readonly categories = input.required<string[]>();\n readonly series = input.required<ChartSeries[]>();\n readonly legendItems = input.required<ChartLegendItem[]>();\n readonly legendNote = input<string>('');\n readonly hiddenSeries = model<string[]>([]);\n readonly valueFormatter = input.required<ChartValueFormatter>();\n readonly categoryLabel = input.required<string>();\n readonly height = input.required<number>();\n readonly emptyText = input.required<string>();\n\n readonly loading = input(false, { transform: booleanAttribute });\n readonly empty = input(false, { transform: booleanAttribute });\n readonly showTable = input(false, { transform: booleanAttribute });\n readonly showLegend = input(true, { transform: booleanAttribute });\n\n /** The series the legend is pointing at, the others fade while it's set. */\n readonly emphasis = model<string | null>(null);\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n CHART_AXIS_LABELS,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport { CHART_INK } from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { BarChartOrientation } from './bar-chart.types';\n\n\n// thin bars read better than slabs, whatever width is left over becomes air\nconst MAX_BAR_THICKNESS = 24;\n\n/**\n * Bars or columns for comparing amounts across categories. Several series\n * sit side by side, or on top of each other with `stacked`.\n */\n@Component({\n selector: 'ui-bar-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiBarChartComponent extends UiAxisChartBase {\n readonly orientation = input<BarChartOrientation>('vertical');\n readonly stacked = input(false, { transform: booleanAttribute });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const base = baseChartOptions();\n const horizontal = this.orientation() === 'horizontal';\n const format = this.valueFormatter();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n\n // apex applies a px width to each bar, grouped or not\n const thickness = `${MAX_BAR_THICKNESS}px`;\n const valueLabels = { ...CHART_AXIS_LABELS, formatter: format };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'bar',\n height: this.height(),\n stacked: this.stacked()\n },\n colors: colours,\n series: series.map(item => ({ name: item.name, data: item.data })),\n plotOptions: {\n bar: {\n horizontal,\n // apex 4 ignores borderRadiusWhenStacked and rounds every segment, square reads cleaner\n borderRadius: this.stacked() ? 0 : 4,\n borderRadiusApplication: 'end',\n columnWidth: thickness,\n barHeight: thickness\n }\n },\n // a surface coloured gap between touching bars and stack segments\n stroke: { show: true, width: 2, colors: [CHART_INK.surface] },\n // horizontal bars swap the axes, values run along the bottom\n xaxis: {\n ...base.xaxis,\n categories,\n labels: horizontal\n ? { ...CHART_AXIS_LABELS, formatter: (value: string) => format(Number(value)) }\n : CHART_AXIS_LABELS\n },\n yaxis: { ...base.yaxis, labels: horizontal ? CHART_AXIS_LABELS : valueLabels },\n grid: {\n ...base.grid,\n // gridlines run across the value axis only\n xaxis: { lines: { show: horizontal } },\n yaxis: { lines: { show: !horizontal } }\n },\n tooltip: {\n shared: false,\n intersect: true,\n custom: ({ seriesIndex, dataPointIndex }: { seriesIndex: number; dataPointIndex: number }) =>\n chartTooltipHtml(categories[dataPointIndex] ?? '', [{\n colour: colours[seriesIndex],\n name: series[seriesIndex]?.name ?? '',\n value: this.formatValue(series[seriesIndex]?.data[dataPointIndex])\n }])\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** vertical draws columns rising from the bottom, horizontal draws bars from the left. */\nexport const BarChartOrientations = ['vertical', 'horizontal'] as const;\n\n/** @see {@link BarChartOrientations} */\nexport type BarChartOrientation = typeof BarChartOrientations[number];\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n CHART_AXIS_LABELS,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport { CHART_INK } from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { LineChartCurve } from './line-chart.types';\n\n\n// past this many categories only some get a label, or they crowd into each other\nconst MAX_AXIS_LABELS = 8;\n\n// grey context rows past this are summed up, the table has the rest\nconst MAX_CONTEXT_ROWS = 5;\n\n// with more lines than this the tooltip lists them biggest first, the same order they sit in\nconst SORT_ROWS_AFTER = 8;\n\n/**\n * Lines for showing how values change over something ordered, usually time.\n * Hovering anywhere shows every series at that point.\n */\n@Component({\n selector: 'ui-line-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiLineChartComponent extends UiAxisChartBase {\n protected override readonly supportsDashes = true;\n\n readonly curve = input<LineChartCurve>('straight');\n\n /** Draws a dot on every point, not just the hovered one. Handy with few points. */\n readonly showPoints = input(false, { transform: booleanAttribute });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const base = baseChartOptions();\n const series = this.series();\n const categories = this.categories();\n const colours = this.colours();\n const dashed = this.dashed();\n const muted = this.isMuted();\n\n // grey context lines go first so the highlighted ones are drawn on top\n const order = series.map((_, index) => index).sort((a, b) => Number(muted[b]) - Number(muted[a]));\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: 'line',\n height: this.height()\n },\n colors: order.map(index => colours[index]),\n series: order.map(index => ({ name: series[index].name, data: series[index].data })),\n stroke: {\n curve: this.curve(),\n width: order.map(index => muted[index] ? 1.5 : 2),\n dashArray: order.map(index => dashed[index] ? 6 : 0),\n lineCap: 'round'\n },\n // the surface ring keeps a dot readable where it sits on another line\n markers: {\n size: this.showPoints() ? 4 : 0,\n strokeColors: CHART_INK.surface,\n strokeWidth: 2,\n hover: { size: 5 }\n },\n xaxis: {\n ...base.xaxis,\n categories,\n tickAmount: categories.length > MAX_AXIS_LABELS ? MAX_AXIS_LABELS : undefined,\n labels: { ...CHART_AXIS_LABELS, hideOverlappingLabels: true, rotate: 0 },\n crosshairs: {\n show: true,\n width: 1,\n stroke: { color: CHART_INK.grid, width: 1, dashArray: 0 }\n },\n // the tooltip already names the category\n tooltip: { enabled: false }\n },\n yaxis: {\n ...base.yaxis,\n labels: { ...CHART_AXIS_LABELS, formatter: this.valueFormatter() }\n },\n grid: {\n ...base.grid,\n xaxis: { lines: { show: false } },\n yaxis: { lines: { show: true } }\n },\n tooltip: {\n shared: true,\n intersect: false,\n // read at hover time, so hiding a series doesn't rebuild the chart\n custom: ({ dataPointIndex }: { dataPointIndex: number }) => {\n const rows = series\n .map((item, index) => ({\n colour: colours[index],\n dashed: dashed[index],\n name: item.name,\n raw: item.data[dataPointIndex] ?? null,\n muted: muted[index]\n }))\n .filter(row => !this.hiddenSeries().includes(row.name))\n .sort((a, b) => this.tooltipOrder(a, b))\n .map(row => ({ ...row, value: this.formatValue(row.raw) }));\n\n const shown = rows.filter(row => !row.muted).length + MAX_CONTEXT_ROWS;\n const extra = rows.length - shown;\n\n return chartTooltipHtml(\n categories[dataPointIndex] ?? '',\n rows.slice(0, shown),\n extra > 0 ? `${extra} more` : ''\n );\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n\n // highlighted rows first in highlight order, then the grey ones biggest first\n private tooltipOrder(\n a: { name: string; raw: number | null; muted: boolean },\n b: { name: string; raw: number | null; muted: boolean }\n ): number {\n if (a.muted !== b.muted) {\n return Number(a.muted) - Number(b.muted);\n }\n\n const highlight = this.highlight();\n\n if (!a.muted && highlight) {\n return highlight.indexOf(a.name) - highlight.indexOf(b.name);\n }\n\n // a handful keep the legend order, lots are easier to scan biggest first\n if (!a.muted && this.series().length <= SORT_ROWS_AFTER) {\n return 0;\n }\n\n return (b.raw ?? -Infinity) - (a.raw ?? -Infinity);\n }\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** How points are joined, straight segments, a smooth curve, or steps. */\nexport const LineChartCurves = ['straight', 'smooth', 'stepline'] as const;\n\n/** @see {@link LineChartCurves} */\nexport type LineChartCurve = typeof LineChartCurves[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiAxisChartBase } from '../chart/axis-chart.base';\nimport {\n baseChartOptions,\n chartTooltipHtml,\n mergeChartOptions\n} from '../chart/chart.options';\nimport {\n CHART_INK,\n type ChartSeriesStyle,\n chartSeriesStyle\n} from '../chart/chart.palette';\nimport type { ChartOptions } from '../chart/chart.types';\nimport { UiChartFrameComponent } from '../chart/chart-frame.component';\nimport type { PieChartVariant } from './pie-chart.types';\n\n\nconst percentFormatter = new Intl.NumberFormat('en-GB', {\n style: 'percent',\n maximumFractionDigits: 1\n});\n\n/**\n * Slices for showing how a whole splits into parts. Each category is a\n * slice, only the first series is drawn. Best kept to a handful of slices,\n * fold the small ones into \"Other\".\n */\n@Component({\n selector: 'ui-pie-chart',\n templateUrl: '../chart/chart-frame.template.html',\n imports: [UiChartFrameComponent],\n host: { class: 'block w-full min-w-0' }\n})\nexport class UiPieChartComponent extends UiAxisChartBase {\n readonly variant = input<PieChartVariant>('pie');\n\n /** Shown above the total in the middle of a donut. */\n readonly totalLabel = input<string>('Total');\n\n protected readonly values = computed(() => this.series()[0]?.data ?? []);\n\n // slices are categories here, so highlight and colours work per category not per series\n protected override readonly isEmpty = computed(() =>\n !this.values().some(value => value !== null && value > 0)\n );\n\n protected override readonly isMuted = computed(() => {\n const highlight = this.highlight();\n\n return this.categories().map(name =>\n !!highlight && !highlight.includes(name)\n );\n });\n\n protected override readonly styles = computed<ChartSeriesStyle[]>(() => {\n const highlight = this.highlight();\n const muted = this.isMuted();\n\n return this.categories().map((name, index) =>\n muted[index]\n ? { colour: CHART_INK.context, dashed: false }\n : chartSeriesStyle(\n highlight ? highlight.indexOf(name) : index,\n false\n )\n );\n });\n\n override readonly legendItems = computed(() => {\n const highlight = this.highlight();\n const items = this.categories()\n .map((name, index) => ({ name, ...this.styles()[index] }))\n .filter((_, index) => !this.isMuted()[index]);\n\n return highlight\n ? items.sort((a, b) =>\n highlight.indexOf(a.name) - highlight.indexOf(b.name)\n )\n : items;\n });\n\n // apex can't hide a pie slice, so hidden ones are left out of the options instead\n private readonly slices = computed(() => {\n const hidden = this.hiddenSeries();\n const values = this.values();\n const colours = this.colours();\n\n return this.categories()\n .map((name, index) => ({\n name,\n value: values[index] ?? 0,\n colour: colours[index]\n }))\n .filter(slice => !hidden.includes(slice.name));\n });\n\n protected readonly chartOptions = computed<ChartOptions>(() => {\n const base = baseChartOptions();\n const slices = this.slices();\n const donut = this.variant() === 'donut';\n const total = slices.reduce((sum, slice) => sum + slice.value, 0);\n const centreText = {\n fontSize: '12px',\n color: CHART_INK.muted,\n offsetY: -4\n };\n\n const options: ChartOptions = {\n ...base,\n chart: {\n ...base.chart,\n type: donut ? 'donut' : 'pie',\n height: this.height()\n },\n colors: slices.map(slice => slice.colour),\n labels: slices.map(slice => slice.name),\n series: slices.map(slice => slice.value),\n // a surface coloured gap between slices\n stroke: { show: true, width: 2, colors: [CHART_INK.surface] },\n // lightening a grey slice turns it white, it looks like it's gone\n states: {\n ...base.states,\n hover: { filter: { type: 'darken' } }\n },\n plotOptions: {\n pie: {\n // clicking would pop a slice out, the legend does the toggling\n expandOnClick: false,\n donut: {\n size: '65%',\n labels: {\n show: donut,\n name: centreText,\n value: {\n fontSize: '20px',\n fontWeight: 600,\n color: CHART_INK.text,\n offsetY: 4,\n formatter: (value: string) =>\n this.formatValue(Number(value))\n },\n total: {\n show: true,\n showAlways: true,\n label: this.totalLabel(),\n ...centreText,\n formatter: () => this.formatValue(total)\n }\n }\n }\n }\n },\n tooltip: {\n // apex makes pie tooltips dark and slice coloured, ours match the other charts\n theme: 'light',\n fillSeriesColor: false,\n custom: ({ seriesIndex }: { seriesIndex: number; }) => {\n const slice = slices[seriesIndex];\n\n return slice\n ? chartTooltipHtml(\n '',\n [{\n colour: slice.colour,\n name: slice.name,\n value: this.formatValue(slice.value)\n }],\n total\n ? `${\n percentFormatter.format(slice.value / total)\n } of total`\n : ''\n )\n : '';\n }\n }\n };\n\n return mergeChartOptions(options, this.options());\n });\n}\n","<ui-chart-frame\n [options]=\"chartOptions()\"\n [ariaLabel]=\"ariaLabel()\"\n [categories]=\"categories()\"\n [series]=\"series()\"\n [legendItems]=\"legendItems()\"\n [legendNote]=\"legendNote()\"\n [(hiddenSeries)]=\"hiddenSeries\"\n [(emphasis)]=\"emphasis\"\n [showLegend]=\"legend() === 'auto'\"\n [valueFormatter]=\"valueFormatter()\"\n [categoryLabel]=\"categoryLabel()\"\n [height]=\"height()\"\n [emptyText]=\"emptyText()\"\n [loading]=\"loading()\"\n [empty]=\"isEmpty()\"\n [showTable]=\"showTable()\"\n/>\n","/** pie fills the whole circle, donut leaves a hole with the total in it. */\nexport const PieChartVariants = ['pie', 'donut'] as const;\n\n/** @see {@link PieChartVariants} */\nexport type PieChartVariant = typeof PieChartVariants[number];\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrl: './checkbox.component.css',\n // keep id/name off the host, same fix as ui-radio\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiCheckboxComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n // shows a dash instead of a tick, purely visual, doesn't change value\n readonly indeterminate = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // lets presets like ui-switch restyle the native input\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-checkbox',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n toggle(): void {\n this.value.set(!this.value());\n }\n}\n","<input\n type=\"checkbox\"\n [class]=\"generatedClasses()\"\n [id]=\"id()\"\n [name]=\"name()\"\n [required]=\"required()\"\n [checked]=\"value()\"\n [indeterminate]=\"indeterminate()\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (change)=\"toggle()\"\n/>\n","import type { FileRejection, FileSelection } from './file.types';\n\n\nconst SIZE_UNITS = ['B', 'KB', 'MB', 'GB'];\n\n/**\n * Checks a file against a native `accept` string, e.g. \".csv,image/*\".\n * Dropped files skip the browser's own accept check, so we do it ourselves.\n */\nexport function matchesAccept(file: File, accept: string): boolean {\n const tokens = accept\n .split(',')\n .map(token => token.trim().toLowerCase())\n .filter(Boolean);\n\n if (!tokens.length) {\n return true;\n }\n\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n\n return tokens.some(token => {\n if (token.startsWith('.')) {\n return name.endsWith(token);\n }\n\n if (token.endsWith('/*')) {\n return type.startsWith(token.slice(0, -1));\n }\n\n return type === token;\n });\n}\n\n/** Splits files into ones that pass the accept and size rules and ones that don't. */\nexport function selectFiles(\n files: File[],\n accept: string,\n maxSize: number | null\n): FileSelection {\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of files) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: 'type' });\n } else if (maxSize !== null && file.size > maxSize) {\n rejected.push({ file, reason: 'size' });\n } else {\n accepted.push(file);\n }\n }\n\n return { accepted, rejected };\n}\n\n/** Human readable size, e.g. 1536 -> \"1.5 KB\". */\nexport function formatFileSize(bytes: number): string {\n let size = bytes;\n let unit = 0;\n\n while (size >= 1024 && unit < SIZE_UNITS.length - 1) {\n size /= 1024;\n unit++;\n }\n\n const rounded = unit === 0 ? size : Math.round(size * 10) / 10;\n\n return `${rounded} ${SIZE_UNITS[unit]}`;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { IconName, NgIcon } from '@ng-icons/core';\n\nimport type { FileRejection } from '../file/file.types';\nimport { formatFileSize, selectFiles } from '../file/file.utils';\n\n\n@Component({\n selector: 'ui-dropzone',\n templateUrl: './dropzone.component.html',\n styleUrl: './dropzone.component.css',\n imports: [NgIcon]\n})\nexport class UiDropzoneComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly title = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>('heroArrowUpTray');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n // dragenter/leave fire for every child, so count them instead of toggling\n private dragDepth = 0;\n\n protected readonly isDragging = signal(false);\n protected readonly hasRejection = signal(false);\n\n protected readonly displayTitle = computed(() =>\n this.title() ||\n (this.multiple()\n ? 'Drop files here or click to browse'\n : 'Drop a file here or click to browse')\n );\n\n protected readonly files = computed(() =>\n this.value().map(file => ({\n name: file.name,\n size: formatFileSize(file.size)\n }))\n );\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.openPicker();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.addFiles([...target.files ?? []]);\n\n // reset so picking the same file again still fires change\n target.value = '';\n }\n\n protected handleDragEnter(event: DragEvent): void {\n event.preventDefault();\n\n if (this.disabled()) {\n return;\n }\n\n this.dragDepth++;\n this.isDragging.set(true);\n }\n\n protected handleDragOver(event: DragEvent): void {\n // without this the browser won't allow the drop\n event.preventDefault();\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = this.disabled() ? 'none' : 'copy';\n }\n }\n\n protected handleDragLeave(): void {\n this.dragDepth = Math.max(0, this.dragDepth - 1);\n\n if (!this.dragDepth) {\n this.isDragging.set(false);\n }\n }\n\n protected handleDrop(event: DragEvent): void {\n event.preventDefault();\n\n this.dragDepth = 0;\n this.isDragging.set(false);\n\n if (!this.disabled()) {\n this.addFiles([...event.dataTransfer?.files ?? []]);\n }\n }\n\n protected clear(): void {\n this.value.set([]);\n this.hasRejection.set(false);\n }\n\n private addFiles(files: File[]): void {\n if (!files.length) {\n return;\n }\n\n // the native picker enforces this, but a drop can carry several files\n const candidates = this.multiple() ? files : files.slice(0, 1);\n const { accepted, rejected } = selectFiles(\n candidates,\n this.accept(),\n this.maxSize()\n );\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n}\n","<div\n class=\"ui-dropzone\"\n role=\"button\"\n [attr.id]=\"id() || null\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-disabled]=\"disabled() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-dragging]=\"isDragging() ? '' : null\"\n [attr.data-invalid]=\"hasRejection() ? '' : null\"\n (click)=\"openPicker()\"\n (keydown)=\"handleKeydown($event)\"\n (dragenter)=\"handleDragEnter($event)\"\n (dragover)=\"handleDragOver($event)\"\n (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\"\n>\n <span class=\"ui-dropzone-icon\">\n <ng-icon [name]=\"icon()\" size=\"24\" class=\"shrink-0\" />\n </span>\n\n <span class=\"text-foreground ui-text-body\">\n {{ displayTitle() }}\n </span>\n\n @if (hint()) {\n <span class=\"text-muted-foreground-1 ui-text-caption\">\n {{ hint() }}\n </span>\n }\n</div>\n\n<input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n/>\n\n@if (files().length) {\n <div class=\"ui-dropzone-files\">\n <ul class=\"ui-dropzone-list\">\n @for (file of files(); track $index) {\n <li class=\"ui-dropzone-file\">\n <ng-icon\n name=\"heroDocument\"\n class=\"text-muted-foreground-1 shrink-0\"\n />\n <span class=\"text-foreground truncate ui-text-body\">\n {{ file.name }}\n </span>\n <span\n class=\"ms-auto text-muted-foreground-1 shrink-0 ui-text-caption\"\n >\n {{ file.size }}\n </span>\n </li>\n }\n </ul>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-dropzone-clear ui-text-caption\"\n (click)=\"clear()\"\n >\n {{ files().length > 1 ? 'Remove files' : 'Remove file' }}\n </button>\n }\n </div>\n}\n","import { booleanAttribute, Component, input } from '@angular/core';\n\n\n@Component({\n selector: 'ui-field',\n templateUrl: './field.component.html',\n styleUrl: './field.component.css'\n})\nexport class UiFieldComponent {\n readonly label = input<string>('');\n readonly hint = input<string>('');\n\n /**\n * Shows a \"*\" marker next to the label.\n */\n readonly required = input(false, { transform: booleanAttribute });\n\n /**\n * An error message, shown instead of `hint` when present.\n */\n readonly error = input<string>('');\n\n // Pass the id of the control being labelled (e.g. the `ui-input`'s `id`)\n // so the label is properly associated with it for accessibility.\n readonly for = input<string>('');\n\n // Ids for the hint/error elements - pass both to the control's\n // `describedBy` (e.g. `ui-input`) so screen readers announce whichever\n // is showing. Safe to pass both even though only one renders at a\n // time - an aria-describedby token pointing at a nonexistent id is\n // simply ignored.\n readonly hintId = input<string>('');\n readonly errorId = input<string>('');\n\n protected get forAttr() {\n return this.for() || null;\n }\n\n protected get hintAttr() {\n return this.hintId() || null;\n }\n\n protected get errorAttr() {\n return this.errorId() || null;\n }\n}\n","@if (label()) {\n <label\n [attr.for]=\"forAttr\"\n class=\"ui-text-body ui-field-label\"\n >\n {{ label() }}\n\n @if (required()) {\n <span class=\"text-danger-500\" aria-hidden=\"true\">*</span>\n <span class=\"sr-only\">(required)</span>\n }\n </label>\n}\n\n<ng-content />\n\n@if (error()) {\n <div\n [attr.id]=\"errorAttr\"\n class=\"text-danger-600 ui-text-caption ui-field-hint\"\n role=\"alert\"\n >\n {{ error() }}\n </div>\n} @else if (hint()) {\n <div\n [attr.id]=\"hintAttr\"\n class=\"text-muted-foreground-1 ui-text-caption ui-field-hint\"\n >\n {{ hint() }}\n </div>\n}\n","/** Why a file was turned away by a file picker. */\nexport const FileRejectionReasons = ['type', 'size'] as const;\n\n/** @see {@link FileRejectionReasons} */\nexport type FileRejectionReason = typeof FileRejectionReasons[number];\n\nexport interface FileRejection {\n file: File;\n reason: FileRejectionReason;\n}\n\nexport interface FileSelection {\n accepted: File[];\n rejected: FileRejection[];\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n contentChild,\n input,\n model,\n output,\n TemplateRef\n} from '@angular/core';\n\nimport {\n type InputAriaAutocomplete,\n type InputAriaHasPopup,\n type InputMode,\n type InputType,\n type InputValidation\n} from './input.types';\n\n\n@Component({\n selector: 'ui-input',\n templateUrl: './input.component.html',\n styleUrl: './input.component.css',\n imports: [NgTemplateOutlet]\n})\nexport class UiInputComponent<ValueType = string> {\n readonly value = model.required<ValueType>();\n\n readonly classes = input<string>('');\n\n readonly type = input<InputType>('text');\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n readonly autocomplete = input<string>('');\n readonly inputmode = input<InputMode | ''>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n // these values can be strings or numbers depending on the input type\n readonly min = input<string | number>('');\n readonly max = input<string | number>('');\n readonly step = input<string | number>('');\n readonly pattern = input<string>('');\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly list = input<string>('');\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n // for inputs that drive a popup, e.g. a select's search box or a datepicker\n // not \"role\", a static role attribute would also land on the host element\n readonly inputRole = input<string>('');\n readonly ariaExpanded = input<boolean | null>(null);\n readonly ariaControls = input<string>('');\n readonly ariaActiveDescendant = input<string | null>(null);\n readonly ariaAutocomplete = input<InputAriaAutocomplete | ''>('');\n readonly ariaHasPopup = input<InputAriaHasPopup | ''>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-input',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLInputElement;\n\n this.value.set(this.parseValue(target));\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n\n private parseValue(element: HTMLInputElement): ValueType {\n if (this.type() !== 'number') {\n return element.value as ValueType;\n }\n\n if (!element.value) {\n return null as ValueType;\n }\n\n return element.valueAsNumber as ValueType;\n }\n}\n","<ng-container *ngTemplateOutlet=\"leadingElement()\"></ng-container>\n\n<input\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [type]=\"type()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [autocomplete]=\"autocomplete()\"\n [attr.min]=\"min() === '' ? null : min()\"\n [attr.max]=\"max() === '' ? null : max()\"\n [attr.step]=\"step() === '' ? null : step()\"\n [attr.pattern]=\"pattern() || null\"\n [attr.inputmode]=\"inputmode() || null\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.list]=\"list() || null\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.role]=\"inputRole() || null\"\n [attr.aria-expanded]=\"ariaExpanded()\"\n [attr.aria-controls]=\"ariaControls() || null\"\n [attr.aria-activedescendant]=\"ariaActiveDescendant()\"\n [attr.aria-autocomplete]=\"ariaAutocomplete() || null\"\n [attr.aria-haspopup]=\"ariaHasPopup() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n/>\n\n<ng-container *ngTemplateOutlet=\"trailingElement()\"></ng-container>\n","/** Native type values ui-input supports. File/checkbox/radio/range need their own components. */\nexport const InputTypes = [\n 'text',\n 'email',\n 'tel',\n 'url',\n 'search',\n 'password',\n 'number',\n 'date',\n 'time',\n 'datetime-local',\n 'month',\n 'week',\n 'color'\n] as const;\n\n/** @see {@link InputTypes} */\nexport type InputType = typeof InputTypes[number];\n\n/** Native inputmode values, hinting at the virtual keyboard to show. */\nexport const InputModes = [\n 'none',\n 'text',\n 'decimal',\n 'numeric',\n 'tel',\n 'search',\n 'email',\n 'url'\n] as const;\n\n/** @see {@link InputModes} */\nexport type InputMode = typeof InputModes[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type InputValidation = boolean | null;\n\n/** Native aria-autocomplete values, for inputs that suggest as you type. */\nexport const InputAriaAutocompletes = ['none', 'inline', 'list', 'both'] as const;\n\n/** @see {@link InputAriaAutocompletes} */\nexport type InputAriaAutocomplete = typeof InputAriaAutocompletes[number];\n\n/** Native aria-haspopup values, for inputs that open something. */\nexport const InputAriaHasPopups = ['listbox', 'dialog', 'grid', 'menu', 'tree'] as const;\n\n/** @see {@link InputAriaHasPopups} */\nexport type InputAriaHasPopup = typeof InputAriaHasPopups[number];\n","import { Component } from '@angular/core';\n\n\n/**\n * A static and non-interactable text or symbol that can be combined with\n * a `ui-input` inside of a `ui-input-group`. Example: this could represent\n * a currency symbol or unit of measurement.\n */\n@Component({\n selector: 'ui-input-addon',\n template: `<ng-content />`,\n styleUrl: './input-addon.component.css',\n host: { class: 'ui-text-body-alt' }\n})\nexport class UiInputAddonComponent {}\n","import { Component, contentChildren, effect, model } from '@angular/core';\n\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-input-group',\n template: '<ng-content />',\n styleUrl: './input-group.component.css'\n})\nexport class UiInputGroupComponent {\n readonly inputs = contentChildren(UiInputComponent, { descendants: false });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n constructor() {\n effect(() => {\n const state = this.validationState();\n\n for (const input of this.inputs()) {\n input.validationState.set(state);\n }\n });\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model\n} from '@angular/core';\n\nimport { InputValidation } from '../input/input.types';\n\n\n@Component({\n selector: 'ui-radio',\n templateUrl: './radio.component.html',\n styleUrl: './radio.component.css',\n // unbind id and name attrs to not cause conflict with the native input\n host: { '[attr.id]': 'null', '[attr.name]': 'null' }\n})\nexport class UiRadioComponent<ValueType = unknown> {\n readonly value = model.required<ValueType>();\n readonly option = input.required<ValueType>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<InputValidation>(null);\n\n readonly compareWith = input<(a: ValueType, b: ValueType) => boolean>(\n (a, b) => a === b\n );\n\n readonly checked = computed(() =>\n this.compareWith()(this.value(), this.option())\n );\n\n select(): void {\n this.value.set(this.option());\n }\n}\n","<input\n type=\"radio\"\n class=\"border-gray-300 focus:ring-2 focus:ring-primary-200/50 size-4 text-primary-600\"\n [id]=\"id()\"\n [name]=\"name()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n (change)=\"select()\"\n/>\n","import { Component, computed, input } from '@angular/core';\n\nimport { BadgeAppearance, BadgeIntent, BadgeSize } from './badge.types';\n\n\n@Component({\n selector: 'ui-badge',\n templateUrl: './badge.component.html',\n styleUrl: './badge.component.css'\n})\nexport class UiBadgeComponent {\n readonly appearance = input<BadgeAppearance>('solid');\n readonly intent = input<BadgeIntent>('primary');\n readonly size = input<BadgeSize>('md');\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-badge',\n `ui-badge--${this.intent()}-${this.appearance()}`,\n `ui-badge--${this.size()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<div [class]=\"generatedClasses()\">\n <ng-content></ng-content>\n</div>\n","/** The radius that a card can hold. Maps directly to tailwindcss' rounded classes. */\nexport const CardRadii = ['none', 'sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link CardRadii} */\nexport type CardRadius = typeof CardRadii[number];\n\n// Written out in full so tailwind picks them up\nexport const radiusClasses: Record<CardRadius, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl'\n};\n","import { Component, computed, input } from '@angular/core';\n\nimport { CardRadius, radiusClasses } from './card.types';\n\n\n@Component({\n selector: 'ui-card',\n template: '<ng-content />',\n styleUrl: './card.component.css',\n host: { '[class]': 'generatedClasses()' }\n})\nexport class UiCardComponent {\n readonly radius = input<CardRadius>('md');\n\n readonly generatedClasses = computed<string>(() =>\n radiusClasses[this.radius()]\n );\n}\n","import { Injectable } from \"@angular/core\";\n\nimport { autoUpdate, computePosition, flip, offset, shift } from \"@floating-ui/dom\";\n\nimport { UiOverlayOptions } from \"./overlay.types\";\n\n\n@Injectable({ providedIn: \"root\" })\nexport class UiOverlayPositioner {\n readonly position = (\n reference: HTMLElement,\n overlay: HTMLElement,\n options: UiOverlayOptions\n ) => computePosition(reference, overlay, {\n placement: options.placement,\n strategy: \"fixed\",\n middleware: [\n offset(options.offset),\n flip({ padding: options.viewportPadding }),\n shift({ padding: options.viewportPadding })\n ]\n });\n\n readonly watch = (\n reference: HTMLElement,\n overlay: HTMLElement,\n update: () => void\n ) => autoUpdate(reference, overlay, update);\n}\n","import { DestroyRef, inject, Injectable } from '@angular/core';\n\nimport { UiOverlayStackEntry } from './overlay.types';\n\n\n/** Tracks open overlays so only the top one reacts to outside clicks and Escape. */\n@Injectable({ providedIn: 'root' })\nexport class UiOverlayStack {\n private readonly entries: UiOverlayStackEntry[] = [];\n\n constructor() {\n document.addEventListener('click', this.onDocumentClick);\n document.addEventListener('keydown', this.onKeyDown);\n\n inject(DestroyRef).onDestroy(() => {\n document.removeEventListener('click', this.onDocumentClick);\n document.removeEventListener('keydown', this.onKeyDown);\n });\n }\n\n readonly push = (entry: UiOverlayStackEntry) => {\n this.remove(entry);\n this.entries.push(entry);\n };\n\n readonly remove = (entry: UiOverlayStackEntry) => {\n const index = this.entries.indexOf(entry);\n if (index !== -1) { this.entries.splice(index, 1); }\n };\n\n private readonly top = () => this.entries.at(-1);\n\n private readonly onDocumentClick = (event: MouseEvent) =>\n this.top()?.onDocumentClick(event);\n\n private readonly onKeyDown = (event: KeyboardEvent) =>\n this.top()?.onKeyDown(event);\n}\n","import {\n Component,\n effect,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { DropdownMatchWidth } from '../../generic/dropdown/dropdown.types';\nimport { UiOverlayPositioner } from './overlay.positioner';\nimport { UiOverlayStack } from './overlay.stack';\nimport { UiOverlayCloseBehaviour, UiOverlayStackEntry } from './overlay.types';\n\n\n@Component({\n selector: 'ui-overlay',\n exportAs: 'uiOverlay',\n template: '<ng-content />',\n host: { style: 'display: contents;' }\n})\nexport class UiOverlayComponent implements UiOverlayStackEntry {\n private readonly positioner = inject(UiOverlayPositioner);\n private readonly stack = inject(UiOverlayStack);\n\n readonly content = input<ElementRef<HTMLInputElement>>();\n readonly anchor = input<ElementRef<HTMLElement>>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly isOpen = input.required<WritableSignal<boolean>>();\n\n readonly placement = input<Placement>('bottom-start');\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Forces this element to match the width of its anchor element. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n constructor() {\n effect(onCleanup => {\n if (!this.isOpen()()) { return; }\n\n this.stack.push(this);\n onCleanup(() => this.stack.remove(this));\n });\n\n effect(onCleanup => {\n const anchor = this.anchor();\n const content = this.content();\n\n if (!this.isOpen()() || !anchor || !content) { return; }\n\n const referenceElement = anchor.nativeElement;\n const floatingElement = content.nativeElement;\n\n const update = () => {\n const matchWidth = this.matchWidth();\n\n if (matchWidth) {\n const width = `${referenceElement.offsetWidth}px`;\n\n if (matchWidth === 'both') {\n floatingElement.style.maxWidth = width;\n floatingElement.style.minWidth = width;\n } else {\n floatingElement.style[matchWidth] = width;\n }\n }\n\n return this.positioner.position(\n referenceElement,\n floatingElement,\n {\n placement: this.placement(),\n offset: this.offset(),\n viewportPadding: this.viewportPadding()\n }\n ).then(({ x, y }) =>\n Object.assign(floatingElement.style, {\n left: `${x}px`,\n top: `${y}px`\n })\n );\n };\n\n update();\n\n onCleanup(\n this.positioner.watch(referenceElement, floatingElement, update)\n );\n });\n }\n\n private readonly close = () => this.isOpen().set(false);\n\n readonly onDocumentClick = (event: MouseEvent) => {\n const behaviour = this.closeBehaviour();\n if (behaviour === 'none') { return; }\n\n const target = event.target;\n if (!(target instanceof Node)) { return; }\n\n const anchorElement = this.anchor()?.nativeElement;\n const contentElement = this.content()?.nativeElement;\n const isInsideAnchor = anchorElement?.contains(target) ?? false;\n const isInsideContent = contentElement?.contains(target) ?? false;\n\n // Anchor can wrap the content too, so only treat a click as \"on the\n // anchor\" (e.g. the trigger button) when it's not inside the content.\n if (isInsideAnchor && !isInsideContent) { return; }\n\n if (behaviour === 'whenClickAnywhere') {\n this.close();\n return;\n }\n\n if (!isInsideContent) {\n this.close();\n }\n };\n\n readonly onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') { this.close(); }\n };\n}\n","import { Directive, ElementRef, inject } from \"@angular/core\";\n\n\n@Directive({\n selector: '[uiDropdownContent]',\n host: { style: \"position: fixed; z-index: 50;\" }\n})\nexport class UiDropdownDirective {\n readonly element = inject(ElementRef<HTMLElement>);\n}\n","import {\n Component,\n contentChild,\n ElementRef,\n inject,\n input,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiDropdownDirective } from './dropdown.directives';\nimport { DropdownMatchWidth } from './dropdown.types';\n\n\n@Component({\n selector: 'ui-dropdown',\n exportAs: 'uiDropdown',\n templateUrl: './dropdown.component.html',\n imports: [UiOverlayComponent],\n host: { class: 'inline-flex size-fit' }\n})\nexport class UiDropdownComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n readonly content = contentChild(UiDropdownDirective);\n readonly isOpen = input.required<WritableSignal<boolean>>();\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickAnywhere'\n );\n\n readonly offset = input<number>(0);\n readonly viewportPadding = input<number>(0);\n\n /** Gives the floating content a min-width matching the dropdown's own width. */\n readonly matchWidth = input<DropdownMatchWidth | null>(null);\n\n readonly toggle = () => this.isOpen().update(value => !value);\n readonly close = () => this.isOpen().set(false);\n readonly open = () => this.isOpen().set(true);\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()?.element\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n [offset]=\"offset()\"\n [viewportPadding]=\"viewportPadding()\"\n [matchWidth]=\"matchWidth()\"\n>\n <ng-content />\n</ui-overlay>","import { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n TemplateRef,\n untracked\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { Placement } from '@floating-ui/dom';\nimport { NgIcon } from '@ng-icons/core';\nimport {\n catchError,\n debounceTime,\n Observable,\n of,\n skip,\n Subject,\n switchMap\n} from 'rxjs';\n\nimport { UiBadgeComponent } from '../../generic/badge/badge.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiInputComponent } from '../input/input.component';\nimport { InputValidation } from '../input/input.types';\nimport { SelectDataSource, SelectDataSourceContent } from './select.datasource';\nimport {\n SearchMode,\n SelectMultipleDisplay,\n SelectOptionContext,\n SelectRow,\n SelectTriggerContext\n} from './select.types';\n\n\nlet nextId = 0;\n\n@Component({\n selector: 'ui-select',\n templateUrl: './select.component.html',\n styleUrl: './select.component.css',\n imports: [\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiBadgeComponent,\n UiCardComponent,\n NgIcon,\n NgTemplateOutlet\n ],\n host: { '(focusout)': 'onFocusOut($event)' }\n})\nexport class UiSelectComponent<Model = unknown> {\n readonly isOpen = signal(false);\n readonly placement = input<Placement>('bottom-start');\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n\n readonly dataSource = input.required<SelectDataSource<Model>>();\n readonly items = signal<Model[]>([]);\n\n readonly placeholder = input<string>('Select an option');\n\n /** Goes on the trigger (or the inline search box), pass it to ui-field's `for`. */\n readonly id = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly pageSize = input<number>(10);\n readonly searchMode = input<SearchMode>('none');\n\n // added: disabled state, previously had CSS but nothing set it\n readonly disabled = input(false, { transform: booleanAttribute });\n // added: validation styling to match ui-input\n readonly validationState = model<InputValidation>(null);\n\n // opt-in, most selects back a required value where clearing isn't valid\n readonly clearable = input<boolean>(false);\n readonly clearLabel = input<string>('None');\n\n /**\n * Offers a \"Create\" row when a search matches nothing. Needs a\n * searchMode, the parent handles `create` and adds the new item.\n */\n readonly creatable = input(false, { transform: booleanAttribute });\n readonly createLabel = input<(query: string) => string>(query =>\n `Create \"${query}\"`\n );\n\n /** Puts a heading above each run of items in the same group. Expects items sorted by group. */\n readonly groupBy = input<((item: Model) => string | null) | null>(null);\n\n /** Scrolls the selected option into view when the list opens. */\n readonly scrollToSelected = input(true, { transform: booleanAttribute });\n\n /** Lets several items be picked, bound through `selectedItems`. */\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly multipleDisplay = input<SelectMultipleDisplay>('text');\n\n /** In text display, swaps the list of names for a count past this many. 0 always counts. */\n readonly counterAfter = input<number | null>(null);\n readonly counterLabel = input<(count: number) => string>(count =>\n `${count} selected`\n );\n\n readonly compareWith = input<(a: Model, b: Model) => boolean>(\n (a, b) => a === b\n );\n\n readonly displayWith = input<(item: Model) => string>(\n item => `${item}`\n );\n\n readonly selectionChange = output<Model | null>();\n\n /** Emits the search text when the \"Create\" row is picked. */\n readonly create = output<string>();\n // changed to a model so a selection can be bound in from outside\n readonly selectedItem = model<Model | null>(null);\n readonly selectedItems = model<Model[]>([]);\n readonly query = signal('');\n readonly loading = signal(false);\n readonly hasMore = signal(true);\n\n readonly optionTemplate = contentChild<\n TemplateRef<SelectOptionContext<Model>>\n >('option');\n readonly triggerTemplate = contentChild<\n TemplateRef<SelectTriggerContext<Model>>\n >('trigger');\n\n /** Index into the pickable rows, the one keyboard focus sits on. */\n readonly activeIndex = signal(0);\n\n readonly listId = `ui-select-${nextId++}`;\n\n readonly hasSelection = computed(() =>\n this.multiple()\n ? this.selectedItems().length > 0\n : this.selectedItem() !== null\n );\n\n readonly triggerLabel = computed(() => {\n const display = this.displayWith();\n\n if (!this.multiple()) {\n const selected = this.selectedItem();\n\n return selected !== null ? display(selected) : this.placeholder();\n }\n\n const selected = this.selectedItems();\n const counterAfter = this.counterAfter();\n\n if (!selected.length) {\n return this.placeholder();\n }\n\n return counterAfter !== null && selected.length > counterAfter\n ? this.counterLabel()(selected.length)\n : selected.map(display).join(', ');\n });\n\n /** Tags only replace the trigger text when there's no inline search box. */\n readonly showTags = computed(() =>\n this.multiple() &&\n this.multipleDisplay() === 'tags' &&\n this.searchMode() !== 'inline'\n );\n\n /** The text to create from, or null when there's nothing to offer. */\n readonly createQuery = computed(() => {\n const query = this.query().trim();\n const display = this.displayWith();\n\n if (!this.creatable() || !query || this.loading()) {\n return null;\n }\n\n const exists = this.items().some(item =>\n display(item).toLowerCase() === query.toLowerCase()\n );\n\n return exists ? null : query;\n });\n\n readonly rows = computed<SelectRow<Model>[]>(() => {\n const rows: SelectRow<Model>[] = [];\n const groupBy = this.groupBy();\n const display = this.displayWith();\n const createQuery = this.createQuery();\n\n let index = 0;\n let group: string | null | undefined;\n\n if (this.clearable() && this.hasSelection()) {\n rows.push({ kind: 'clear', id: this.rowId(index), index: index++ });\n }\n\n for (const item of this.items()) {\n if (groupBy) {\n const next = groupBy(item);\n\n if (next !== group && next) {\n rows.push({\n kind: 'group',\n id: `${this.listId}-group-${rows.length}`,\n label: next\n });\n }\n\n group = next;\n }\n\n rows.push({\n kind: 'item',\n id: this.rowId(index),\n index: index++,\n item,\n label: display(item),\n selected: this.isSelected(item)\n });\n }\n\n if (createQuery) {\n rows.push({\n kind: 'create',\n id: this.rowId(index),\n index,\n query: createQuery\n });\n }\n\n return rows;\n });\n\n private readonly pickable = computed(() =>\n this.rows().filter(row => row.kind !== 'group')\n );\n\n readonly activeId = computed(() =>\n this.isOpen() ? this.pickable()[this.activeIndex()]?.id ?? null : null\n );\n\n private page = 0;\n\n // one shared stream for every fetch, so a new request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n constructor() {\n // reloads when a new data source comes in, e.g. after creating an item\n effect(() => {\n this.dataSource();\n untracked(() => this.loadFirstPage());\n });\n\n // start on the selected option, and bring it into view\n effect(() => {\n if (!this.isOpen()) {\n return;\n }\n\n untracked(() => {\n const selected = this.pickable().findIndex(row =>\n row.kind === 'item' && row.selected\n );\n\n this.activeIndex.set(\n this.scrollToSelected() && selected >= 0 ? selected : 0\n );\n\n afterNextRender(() => {\n if (this.scrollToSelected()) {\n this.scrollActiveIntoView();\n }\n\n if (this.searchMode() === 'dropdown') {\n this.searchInput()?.focus();\n }\n }, { injector: this.injector });\n });\n });\n\n // debounce the query signal itself instead of a separate subject\n toObservable(this.query).pipe(\n debounceTime(300),\n skip(1), // skip the initial value, the data source effect already loads that\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.loadFirstPage());\n\n // switchMap cancels the previous request, fixing stale responses overwriting newer ones\n this.load$.pipe(\n switchMap(() => this.fetchPage()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n private fetchPage(): Observable<SelectDataSourceContent<Model> | null> {\n this.loading.set(true);\n\n const request = this.dataSource().load({\n query: this.query(),\n page: this.page,\n size: this.pageSize()\n });\n\n return request.pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: SelectDataSourceContent<Model> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.items.update(items => [...items, ...result.items]);\n this.hasMore.set(result.hasMore);\n }\n\n this.cdr.markForCheck();\n }\n\n open(): void {\n if (!this.disabled()) {\n this.isOpen.set(true);\n }\n }\n\n toggle(): void {\n if (this.isOpen()) {\n this.isOpen.set(false);\n } else {\n this.open();\n }\n }\n\n select(item: Model): void {\n this.selectedItem.set(item);\n this.selectionChange.emit(item);\n }\n\n isSelected(item: Model): boolean {\n const compare = this.compareWith();\n\n if (item === null) {\n return false;\n }\n\n if (this.multiple()) {\n return this.selectedItems().some(selected =>\n compare(selected, item)\n );\n }\n\n const selected = this.selectedItem();\n\n return selected !== null && compare(selected, item);\n }\n\n toggleItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n this.isSelected(item)\n ? selected.filter(existing => !compare(existing, item))\n : [...selected, item]\n );\n }\n\n removeItem(item: Model): void {\n const compare = this.compareWith();\n\n this.selectedItems.update(selected =>\n selected.filter(existing => !compare(existing, item))\n );\n }\n\n clear(): void {\n if (this.multiple()) {\n this.selectedItems.set([]);\n } else {\n this.selectedItem.set(null);\n this.selectionChange.emit(null);\n }\n\n this.isOpen.set(false);\n this.focusTrigger();\n\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onItemClick(item: Model): void {\n // multiple stays open so several can be ticked in one go\n if (this.multiple()) {\n this.toggleItem(item);\n return;\n }\n\n this.select(item);\n this.isOpen.set(false);\n this.focusTrigger();\n\n // The behaviour of clearing the inline search flows better than\n // leaving it as is. Clicking into the input with a value already\n // selected will reveal the previous query which may be confusing.\n if (this.searchMode() === 'inline') {\n this.query.set('');\n }\n }\n\n onCreate(): void {\n const query = this.createQuery();\n\n if (!query) {\n return;\n }\n\n this.create.emit(query);\n this.query.set('');\n\n if (!this.multiple()) {\n this.isOpen.set(false);\n this.focusTrigger();\n }\n }\n\n onKeydown(event: KeyboardEvent): void {\n const count = this.pickable().length;\n // space types in search boxes, only the plain trigger treats it as a pick\n const isSpacePick = event.key === ' ' && this.searchMode() === 'none';\n\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n return;\n }\n\n this.moveActive(event.key === 'ArrowDown' ? 1 : -1, count);\n return;\n case 'Home':\n case 'End':\n if (this.isOpen() && count && this.searchMode() === 'none') {\n event.preventDefault();\n this.setActive(event.key === 'Home' ? 0 : count - 1);\n }\n return;\n case 'Enter':\n case ' ':\n if (event.key === ' ' && !isSpacePick) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.isOpen()) {\n this.open();\n } else {\n this.pickActive();\n }\n return;\n case 'Escape':\n // the overlay closes itself, focus just needs a home\n this.focusTrigger();\n return;\n }\n }\n\n onFocusOut(event: FocusEvent): void {\n const next = event.relatedTarget;\n\n if (this.closeBehaviour() === 'none') {\n return;\n }\n\n // tabbing away closes it, moving between the trigger and the list doesn't\n if (\n !(next instanceof Node) ||\n !this.host.nativeElement.contains(next)\n ) {\n this.isOpen.set(false);\n }\n }\n\n setActive(index: number): void {\n this.activeIndex.set(index);\n\n afterNextRender(() => this.scrollActiveIntoView(), {\n injector: this.injector\n });\n }\n\n loadFirstPage(): void {\n this.page = 0;\n this.items.set([]);\n this.hasMore.set(true);\n\n this.load$.next();\n }\n\n loadNextPage(): void {\n if (this.loading() || !this.hasMore()) {\n return;\n }\n\n this.page++;\n this.load$.next();\n }\n\n onQueryChange(query: string): void {\n // sets straight away so the search box doesn't fight the user's typing, the\n // constructor's toObservable pipeline debounces the actual reload\n this.query.set(query);\n this.activeIndex.set(0);\n this.open();\n }\n\n onScroll(scrollContainer: HTMLElement): void {\n const remainingPixels = scrollContainer.scrollHeight\n - scrollContainer.scrollTop\n - scrollContainer.clientHeight;\n\n if (remainingPixels < 48) {\n this.loadNextPage();\n }\n }\n\n private pickActive(): void {\n const row = this.pickable()[this.activeIndex()];\n\n if (!row) {\n return;\n }\n\n if (row.kind === 'clear') {\n this.clear();\n } else if (row.kind === 'create') {\n this.onCreate();\n } else if (row.kind === 'item') {\n this.onItemClick(row.item);\n }\n }\n\n private moveActive(step: number, count: number): void {\n if (count) {\n this.setActive((this.activeIndex() + step + count) % count);\n }\n }\n\n private scrollActiveIntoView(): void {\n const id = this.activeId();\n\n if (id) {\n this.host.nativeElement\n .querySelector(`#${id}`)\n ?.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private focusTrigger(): void {\n const trigger = this.searchMode() === 'inline'\n ? this.searchInput()\n : this.host.nativeElement.querySelector<HTMLElement>('.ui-select');\n\n trigger?.focus();\n }\n\n // the inline box or the one inside the dropdown, never both\n private searchInput(): HTMLInputElement | null {\n return this.host.nativeElement.querySelector('ui-input input');\n }\n\n private rowId(index: number): string {\n return `${this.listId}-${index}`;\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n [placement]=\"placement()\"\n [closeBehaviour]=\"closeBehaviour()\"\n matchWidth=\"minWidth\"\n class=\"w-full\"\n>\n @if (searchMode() === 'inline') {\n <ui-input\n [value]=\"isOpen() ? query() : triggerLabel()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"triggerLabel()\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaHasPopup=\"listbox\"\n class=\"border-0!\"\n classes=\"h-auto!\"\n autocomplete=\"off\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n <ng-template #trailing>\n <ng-icon\n name=\"heroChevronDown\"\n class=\"mx-3 size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </ng-template>\n </ui-input>\n } @else {\n <div\n class=\"ui-select-trigger\"\n [class.ui-select-trigger--tags]=\"showTags()\"\n >\n <button\n type=\"button\"\n class=\"flex justify-between items-center gap-2 px-3 py-2 text-left ui-select\"\n aria-haspopup=\"listbox\"\n [attr.id]=\"id() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"listId\"\n [attr.aria-activedescendant]=\"searchMode() === 'none' ? activeId() : null\"\n [disabled]=\"disabled()\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (click)=\"toggle()\"\n (keydown)=\"onKeydown($event)\"\n >\n @if (showTags()) {\n <!-- the visible tags sit on top, this names the button for screen readers -->\n <span class=\"sr-only\">{{ triggerLabel() }}</span>\n } @else if (!multiple() && triggerTemplate() && selectedItem() !== null) {\n <span class=\"flex items-center gap-2 min-w-0 ui-text-body\">\n <ng-container\n *ngTemplateOutlet=\"triggerTemplate()!; context: { $implicit: selectedItem()! }\"\n />\n </span>\n } @else if (multiple()) {\n <span class=\"ui-text-body ui-select-label\">\n <span\n class=\"ui-select-label-sizer\"\n aria-hidden=\"true\"\n >{{ placeholder() }}</span>\n <span class=\"ui-select-label-text\">{{\n triggerLabel()\n }}</span>\n </span>\n } @else {\n <span class=\"ui-text-body truncate\">{{\n triggerLabel()\n }}</span>\n }\n\n <ng-icon\n name=\"heroChevronDown\"\n class=\"ms-auto size-4 text-muted-foreground transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n </button>\n\n @if (showTags()) {\n <span\n class=\"ui-text-body ui-select-tags-sizer\"\n aria-hidden=\"true\"\n >\n {{ placeholder() }}\n </span>\n\n <div class=\"ui-select-tags\">\n @for (item of selectedItems(); track $index) {\n <ui-badge\n intent=\"secondary\"\n appearance=\"soft\"\n size=\"xs\"\n classes=\"ui-select-tag ui-text-caption\"\n >\n <span class=\"truncate\">{{\n displayWith()(item)\n }}</span>\n\n @if (!disabled()) {\n <button\n type=\"button\"\n class=\"ui-select-tag-remove\"\n [attr.aria-label]=\"'Remove ' + displayWith()(item)\"\n (click)=\"removeItem(item)\"\n >\n <ng-icon\n name=\"heroXMark\"\n class=\"size-3 shrink-0\"\n />\n </button>\n }\n </ui-badge>\n } @empty {\n <span\n class=\"text-muted-foreground-1 ui-text-body truncate\"\n >\n {{ placeholder() }}\n </span>\n }\n </div>\n }\n </div>\n }\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"lg\" class=\"divide-y overflow-hidden\">\n @if (searchMode() === 'dropdown') {\n <div class=\"p-2\">\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n (keydown)=\"onKeydown($event)\"\n [ariaExpanded]=\"true\"\n [ariaControls]=\"listId\"\n [ariaActiveDescendant]=\"activeId()\"\n inputRole=\"combobox\"\n ariaAutocomplete=\"list\"\n ariaLabel=\"Search options\"\n autocomplete=\"off\"\n placeholder=\"Search...\"\n />\n </div>\n }\n\n <div\n #scrollContainer\n class=\"py-1 max-h-60 overflow-y-auto\"\n role=\"listbox\"\n [attr.id]=\"listId\"\n [attr.aria-multiselectable]=\"multiple() || null\"\n (scroll)=\"onScroll(scrollContainer)\"\n >\n @for (row of rows(); track row.id) {\n @switch (row.kind) {\n @case ('group') {\n <div\n class=\"ui-text-caption ui-select-group\"\n role=\"presentation\"\n >\n {{ row.label }}\n </div>\n }\n @case ('clear') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"text-muted-foreground-1 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"clear()\"\n >\n <span class=\"truncate\">{{\n clearLabel()\n }}</span>\n </button>\n }\n @case ('item') {\n <button\n type=\"button\"\n role=\"option\"\n tabindex=\"-1\"\n class=\"text-dropdown-item-foreground ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.aria-selected]=\"row.selected\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onItemClick(row.item)\"\n >\n @if (optionTemplate(); as template) {\n <span\n class=\"flex items-center gap-2 min-w-0 grow\"\n >\n <ng-container\n *ngTemplateOutlet=\"template; context: {\n $implicit: row.item,\n selected: row.selected,\n active: row.index === activeIndex()\n }\"\n />\n </span>\n } @else {\n <span class=\"truncate\">{{\n row.label\n }}</span>\n }\n\n @if (row.selected) {\n <ng-icon\n name=\"heroCheck\"\n class=\"size-4 text-primary-600! shrink-0\"\n strokeWidth=\"2.5\"\n />\n }\n </button>\n }\n @case ('create') {\n <button\n type=\"button\"\n role=\"option\"\n aria-selected=\"false\"\n tabindex=\"-1\"\n class=\"justify-start! text-primary-600 ui-text-body-alt ui-select-option\"\n [attr.id]=\"row.id\"\n [attr.data-active]=\"row.index === activeIndex() ? '' : null\"\n (mousedown)=\"$event.preventDefault()\"\n (mouseenter)=\"activeIndex.set(row.index)\"\n (click)=\"onCreate()\"\n >\n <ng-icon\n name=\"heroPlus\"\n class=\"size-4 shrink-0\"\n />\n <span class=\"truncate\">{{\n createLabel()(row.query)\n }}</span>\n </button>\n }\n }\n }\n\n @if (loading()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n Loading...\n </div>\n }\n\n @if (!loading() && items().length === 0 && !createQuery()) {\n <div class=\"px-3 py-2 text-muted-foreground ui-text-body-alt text-center\">\n No results\n </div>\n }\n </div>\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Observable, of } from 'rxjs';\n\n\nexport interface SelectDataSourceParameters {\n query: string;\n page: number;\n size: number;\n}\n\nexport interface SelectDataSourceContent<Model> {\n items: Model[];\n hasMore: boolean;\n}\n\nexport interface SelectDataSource<Model> {\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>>;\n}\n\nexport class SelectLocalDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly items: Model[],\n private readonly search: (item: Model, query: string) => boolean\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n const query = params.query.trim();\n\n const filteredItems = query\n ? this.items.filter(item => this.search(item, query))\n : this.items;\n\n const start = params.page * params.size;\n const end = start + params.size;\n\n return of({\n items: filteredItems.slice(start, end),\n hasMore: end < filteredItems.length\n });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class SelectRemoteDataSource<Model> implements SelectDataSource<Model> {\n constructor(\n private readonly fetch: (\n params: SelectDataSourceParameters\n ) => Observable<SelectDataSourceContent<Model>>\n ) {}\n\n load(\n params: SelectDataSourceParameters\n ): Observable<SelectDataSourceContent<Model>> {\n return this.fetch(params);\n }\n}\n","export type SearchMode =\n | 'none'\n | 'inline'\n | 'dropdown';\n\n/** How a multiple select shows its selection when closed. */\nexport const SelectMultipleDisplays = ['text', 'tags'] as const;\n\n/** @see {@link SelectMultipleDisplays} */\nexport type SelectMultipleDisplay = typeof SelectMultipleDisplays[number];\n\n/** Context for a projected `#option` template. */\nexport interface SelectOptionContext<Model> {\n $implicit: Model;\n selected: boolean;\n active: boolean;\n}\n\n/** Context for a projected `#trigger` template, single select only. */\nexport interface SelectTriggerContext<Model> {\n $implicit: Model;\n}\n\n/** One line in the open list. Groups are headings, the rest can be picked. */\nexport type SelectRow<Model> =\n | { kind: 'group'; id: string; label: string; }\n | { kind: 'clear'; id: string; index: number; }\n | { kind: 'create'; id: string; index: number; query: string; }\n | {\n kind: 'item';\n id: string;\n index: number;\n item: Model;\n label: string;\n selected: boolean;\n };\n","import {\n booleanAttribute,\n Component,\n computed,\n input,\n model,\n output\n} from '@angular/core';\n\nimport { type TextareaResize, type TextareaValidation } from './textarea.types';\n\n\n@Component({\n selector: 'ui-textarea',\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.css'\n})\nexport class UiTextareaComponent {\n readonly value = model.required<string>();\n\n readonly classes = input<string>('');\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly placeholder = input<string>('');\n\n readonly rows = input<number>(3);\n readonly resize = input<TextareaResize>('vertical');\n\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n\n /** true/false shows valid/invalid styling. null means not validated yet. */\n readonly validationState = model<TextareaValidation>(null);\n\n readonly minlength = input<number | null>(null);\n readonly maxlength = input<number | null>(null);\n\n readonly autofocus = input(false, { transform: booleanAttribute });\n readonly spellcheck = input(true, { transform: booleanAttribute });\n\n readonly ariaLabel = input<string>('');\n readonly describedBy = input<string>('');\n\n readonly focused = output<FocusEvent>();\n readonly blurred = output<FocusEvent>();\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-textarea',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected handleInput(event: Event): void {\n const target = event.target as HTMLTextAreaElement;\n\n this.value.set(target.value);\n }\n\n protected handleFocus(event: FocusEvent): void {\n this.focused.emit(event);\n }\n\n protected handleBlur(event: FocusEvent): void {\n this.blurred.emit(event);\n }\n}\n","<textarea\n [value]=\"value()\"\n [class]=\"generatedClasses()\"\n [attr.id]=\"id() || null\"\n [attr.name]=\"name() || null\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readOnly]=\"readonly()\"\n [required]=\"required()\"\n [rows]=\"rows()\"\n [style.resize]=\"resize()\"\n [attr.maxlength]=\"maxlength()\"\n [attr.minlength]=\"minlength()\"\n \n [attr.spellcheck]=\"spellcheck()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-describedby]=\"describedBy() || null\"\n [attr.data-invalid]=\"validationState() === false ? '' : null\"\n [attr.data-valid]=\"validationState() === true ? '' : null\"\n (input)=\"handleInput($event)\"\n (focus)=\"handleFocus($event)\"\n (blur)=\"handleBlur($event)\"\n></textarea>\n","/** Native resize values for the textarea element. */\nexport const TextareaResizeOptions = [\n 'none',\n 'both',\n 'horizontal',\n 'vertical'\n] as const;\n\n/** @see {@link TextareaResizeOptions} */\nexport type TextareaResize = typeof TextareaResizeOptions[number];\n\n/** true is valid, false is invalid, null is not yet validated. */\nexport type TextareaValidation = boolean | null;\n","import {\n Component,\n computed,\n contentChild,\n input,\n TemplateRef\n} from '@angular/core';\n\nimport { AlertAppearance, AlertIntent } from './alert.types';\n\n\n@Component({\n selector: 'ui-alert',\n templateUrl: './alert.component.html',\n styleUrl: './alert.component.css'\n})\nexport class UiAlertComponent {\n readonly appearance = input<AlertAppearance>('soft');\n readonly intent = input<AlertIntent>('info');\n readonly classes = input<string>('');\n\n readonly icon = contentChild<TemplateRef<unknown>>('icon', {\n descendants: false\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-alert',\n `ui-alert--${this.appearance()}`,\n `ui-alert--${this.intent()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","<div [class]=\"generatedClasses()\" role=\"alert\">\n <ng-content></ng-content>\n</div>\n","export const AlertIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n];\n\nexport const AlertAppearances = [\n 'soft',\n 'bordered'\n] as const;\n\nexport type AlertIntent = typeof AlertIntents[number];\nexport type AlertAppearance = typeof AlertAppearances[number];\n","export const BadgeIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport const BadgeAppearances = [\n 'solid',\n 'outline',\n 'soft'\n] as const;\n\nexport const BadgeSizes = [\n 'xs',\n 'sm',\n 'md',\n 'lg'\n] as const;\n\nexport type BadgeIntent = typeof BadgeIntents[number];\nexport type BadgeAppearance = typeof BadgeAppearances[number];\nexport type BadgeSize = typeof BadgeSizes[number];\n","import { Component, computed, input } from '@angular/core';\n\nimport type {\n ButtonAppearance,\n ButtonIntent,\n ButtonSize,\n ButtonType\n} from './button.types';\n\n\n/**\n * A general-purpose button.\n */\n@Component({\n selector: 'ui-button',\n templateUrl: './button.component.html',\n styleUrl: './button.component.css'\n})\nexport class UiButtonComponent {\n readonly appearance = input<ButtonAppearance>('solid');\n readonly intent = input<ButtonIntent>('primary');\n readonly size = input<ButtonSize>('md');\n readonly classes = input<string>('');\n\n readonly type = input<ButtonType>('button');\n readonly ariaLabel = input<string>('');\n\n readonly disabled = input<boolean>(false);\n readonly loading = input<boolean>(false);\n\n /**\n * Whether the underlying `<button>` element should be disabled - true when\n * `disabled` is set explicitly, or implicitly while `loading` is true.\n */\n readonly isDisabled = computed(() => this.disabled() || this.loading());\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-button',\n this.intentAndAppearanceClasses(),\n this.sizeClasses(),\n this.textClasses(),\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly intentAndAppearanceClasses = computed(() => {\n const intent = this.intent();\n const appearance = this.appearance();\n\n return [intent, appearance].includes('none') ?\n '' :\n `ui-button--${intent}-${appearance}`;\n });\n\n private readonly sizeClasses = computed(() => `ui-button--${this.size()}`);\n\n private readonly textClasses = computed(() => ({\n sm: 'ui-text-caption',\n md: 'ui-text-body',\n lg: 'ui-text-body'\n }[this.size()]));\n}\n","<button\n [type]=\"type()\"\n [disabled]=\"isDisabled()\"\n [class]=\"generatedClasses()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-busy]=\"loading() || null\"\n>\n <ng-content></ng-content>\n\n @if (loading()) {\n <span class=\"sr-only\">Loading</span>\n\n <span class=\"flex items-end justify-center\" aria-hidden=\"true\">\n <span class=\"ms-0.5 inline-flex items-end gap-px pb-px\">\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n <span class=\"ui-button__loading-dot\">.</span>\n </span>\n </span>\n }\n</button>\n","/**\n * The semantic colour of a button. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.intent`.\n */\nexport const ButtonIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger',\n 'none'\n] as const;\n\n/**\n * The visual treatment of a button (fill, outline, etc.), combined with its\n * `intent` to select a variant class. `\"none\"` opts out of intent/appearance\n * styling entirely - see `UiButtonComponent.appearance`.\n */\nexport const ButtonAppearances = [\n 'solid',\n 'outline',\n 'ghost',\n 'white',\n 'link',\n 'none'\n] as const;\n\n/** The size of a button, controlling its padding and typography scale. */\nexport const ButtonSizes = [\n 'sm',\n 'md',\n 'lg'\n] as const;\n\n/** The native `type` attribute a button can render with. */\nexport const ButtonTypes = [\n 'button',\n 'submit',\n 'reset'\n] as const;\n\n/** @see {@link ButtonIntents} */\nexport type ButtonIntent = typeof ButtonIntents[number];\n\n/** @see {@link ButtonAppearances} */\nexport type ButtonAppearance = typeof ButtonAppearances[number];\n\n/** @see {@link ButtonSizes} */\nexport type ButtonSize = typeof ButtonSizes[number];\n\n/** @see {@link ButtonTypes} */\nexport type ButtonType = typeof ButtonTypes[number];\n","import { Component, contentChildren } from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\n\n\n/**\n * @example\n * ```html\n * <ui-button-group>\n * <ui-button intent=\"secondary\" appearance=\"white\">First</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Second</ui-button>\n * <ui-button intent=\"secondary\" appearance=\"white\">Last</ui-button>\n * </ui-button-group>\n * ```\n */\n@Component({\n selector: 'ui-button-group',\n template: '<ng-content></ng-content>',\n host: { class: 'inline-flex' }\n})\nexport class UiButtonGroupComponent {\n readonly buttons = contentChildren(UiButtonComponent, {\n descendants: false\n });\n}\n","import type { IsoDate, IsoDateTime } from './calendar.types';\n\n\nconst ISO_PATTERN = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_PATTERN = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n\n// dates are built from local parts so a timezone never shifts the day\nexport function toIsoDate(date: Date): IsoDate {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n\n return `${year}-${month}-${day}`;\n}\n\n/** Local midnight for an ISO date, or null when it isn't a real date. */\nexport function parseIsoDate(value: IsoDate | null | undefined): Date | null {\n const match = value ? ISO_PATTERN.exec(value) : null;\n\n if (!match) {\n return null;\n }\n\n const [, year, month, day] = match.map(Number);\n const date = new Date(year, month - 1, day);\n\n // rejects things like 2026-02-31 rolling over into March\n return date.getMonth() === month - 1 ? date : null;\n}\n\nexport function addDays(date: Date, days: number): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days);\n}\n\n/** Moves by whole months, keeping the day where it can (31 Jan + 1 -> 28 Feb). */\nexport function addMonths(date: Date, months: number): Date {\n const target = new Date(date.getFullYear(), date.getMonth() + months, 1);\n const lastDay = daysInMonth(target.getFullYear(), target.getMonth());\n\n target.setDate(Math.min(date.getDate(), lastDay));\n\n return target;\n}\n\nexport function daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n}\n\n/** Local date and time for \"2026-09-29T14:30\", a date-only string gives midnight. */\nexport function parseIsoDateTime(\n value: IsoDateTime | null | undefined\n): Date | null {\n const date = parseIsoDate(value?.slice(0, 10));\n const time = parseTime(value?.slice(11, 16));\n\n if (date && time) {\n date.setHours(time.hours, time.minutes);\n }\n\n return date;\n}\n\n/** \"14:30\" -> { hours: 14, minutes: 30 }, or null when it isn't a real time. */\nexport function parseTime(\n value: string | null | undefined\n): { hours: number; minutes: number } | null {\n const match = value ? TIME_PATTERN.exec(value) : null;\n\n return match ? { hours: Number(match[1]), minutes: Number(match[2]) } : null;\n}\n\nexport function toTime(hours: number, minutes: number): string {\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n}\n","import {\n afterNextRender,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n linkedSignal,\n model,\n signal\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport type {\n CalendarDay,\n CalendarMode,\n DateRange,\n IsoDate,\n WeekStart\n} from './calendar.types';\nimport {\n addDays,\n addMonths,\n parseIsoDate,\n toIsoDate\n} from './calendar.utils';\n\n\n// always six rows so the calendar doesn't jump in height between months\nconst GRID_DAYS = 42;\nconst YEARS_BACK = 100;\nconst YEARS_FORWARD = 10;\n\n@Component({\n selector: 'ui-calendar',\n templateUrl: './calendar.component.html',\n styleUrl: './calendar.component.css',\n imports: [NgIcon, UiSelectComponent]\n})\nexport class UiCalendarComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly mode = input<CalendarMode>('single');\n\n /** The picked date in single mode. */\n readonly value = model<IsoDate | null>(null);\n\n /** The picked start and end in range mode. */\n readonly range = model<DateRange>({ start: null, end: null });\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n protected readonly today = toIsoDate(new Date());\n\n // a string so picking a range end doesn't count as a change and jump the view\n private readonly anchorDate = computed(() =>\n this.mode() === 'range' ? this.range().start : this.value()\n );\n\n // the date keyboard focus sits on, follows the anchor until the user moves it\n private readonly activeDate = linkedSignal(\n () => parseIsoDate(this.anchorDate()) ?? parseIsoDate(this.today)!\n );\n\n // previews the end of a half picked range\n private readonly hoveredDate = signal<IsoDate | null>(null);\n\n protected readonly viewMonth = linkedSignal(() => this.activeDate().getMonth());\n protected readonly viewYear = linkedSignal(() => this.activeDate().getFullYear());\n\n protected readonly monthNames = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), { month: 'long' });\n\n return Array.from({ length: 12 }, (_, month) =>\n format.format(new Date(2026, month, 1))\n );\n });\n\n protected readonly weekdays = computed(() => {\n const format = new Intl.DateTimeFormat(this.locale(), { weekday: 'short' });\n\n // 4 Jan 2026 is a Sunday\n return Array.from({ length: 7 }, (_, index) =>\n format.format(new Date(2026, 0, 4 + (this.weekStart() + index) % 7))\n .slice(0, 2)\n );\n });\n\n protected readonly monthSource = computed(() =>\n new SelectLocalDataSource(\n Array.from({ length: 12 }, (_, month) => month),\n () => true\n )\n );\n\n protected readonly yearSource = computed(() => {\n const current = new Date().getFullYear();\n const selected = parseIsoDate(this.anchorDate())?.getFullYear() ?? current;\n const first = parseIsoDate(this.min())?.getFullYear() ??\n Math.min(current - YEARS_BACK, selected);\n const last = parseIsoDate(this.max())?.getFullYear() ??\n Math.max(current + YEARS_FORWARD, selected);\n\n // newest first, recent years are what people usually want\n const years = Array.from({ length: last - first + 1 }, (_, index) => last - index);\n\n return new SelectLocalDataSource(years, () => true);\n });\n\n protected readonly displayMonth = (month: number) => this.monthNames()[month];\n\n protected readonly days = computed<CalendarDay[]>(() => {\n const year = this.viewYear();\n const month = this.viewMonth();\n const { start, end, previewEnd } = this.rangeBounds();\n const labelFormat = new Intl.DateTimeFormat(this.locale(), { dateStyle: 'full' });\n\n const first = new Date(year, month, 1);\n const offset = (first.getDay() - this.weekStart() + 7) % 7;\n const gridStart = addDays(first, -offset);\n\n return Array.from({ length: GRID_DAYS }, (_, index) => {\n const date = addDays(gridStart, index);\n const iso = toIsoDate(date);\n\n return {\n iso,\n day: date.getDate(),\n label: labelFormat.format(date),\n isOutside: date.getMonth() !== month,\n isToday: iso === this.today,\n isSelected: iso === start || iso === end,\n isDisabled: this.isUnavailable(iso),\n isInRange: !!start && !!previewEnd && iso > start && iso < previewEnd,\n isRangeStart: !!previewEnd && iso === start && start !== previewEnd,\n isRangeEnd: !!start && iso === previewEnd && start !== previewEnd\n };\n });\n });\n\n private readonly rangeBounds = computed(() => {\n if (this.mode() === 'single') {\n return { start: this.value(), end: null, previewEnd: null };\n }\n\n const { start, end } = this.range();\n const hovered = this.hoveredDate();\n const preview = !end && start && hovered && hovered > start ? hovered : null;\n\n return { start, end, previewEnd: end ?? preview };\n });\n\n /** Only one day is tabbable, arrow keys move between the rest. */\n protected readonly tabbableDate = computed(() => {\n const active = this.activeDate();\n const inView = active.getFullYear() === this.viewYear() &&\n active.getMonth() === this.viewMonth();\n\n return toIsoDate(inView ? active : new Date(this.viewYear(), this.viewMonth(), 1));\n });\n\n protected readonly canGoBack = computed(() => {\n const min = this.min();\n const lastOfPrevious = new Date(this.viewYear(), this.viewMonth(), 0);\n\n return !min || toIsoDate(lastOfPrevious) >= min;\n });\n\n protected readonly canGoForward = computed(() => {\n const max = this.max();\n const firstOfNext = new Date(this.viewYear(), this.viewMonth() + 1, 1);\n\n return !max || toIsoDate(firstOfNext) <= max;\n });\n\n /** Moves focus onto the active day, e.g. when a datepicker opens. */\n focusActiveDate(): void {\n this.host.nativeElement\n .querySelector<HTMLButtonElement>(`[data-date=\"${this.tabbableDate()}\"]`)\n ?.focus();\n }\n\n protected showMonth(offset: number): void {\n const target = new Date(this.viewYear(), this.viewMonth() + offset, 1);\n\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n }\n\n protected select(day: CalendarDay): void {\n if (day.isDisabled) {\n return;\n }\n\n if (this.mode() === 'single') {\n this.value.set(day.iso);\n return;\n }\n\n const { start, end } = this.range();\n\n // a fresh click starts over, picking before the start moves the start\n if (!start || end || day.iso < start) {\n this.range.set({ start: day.iso, end: null });\n } else {\n this.range.set({ start, end: day.iso });\n }\n }\n\n protected preview(date: IsoDate | null): void {\n if (this.mode() === 'range') {\n this.hoveredDate.set(date);\n }\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const current = parseIsoDate(this.tabbableDate())!;\n const target = this.keyTarget(event, current);\n\n if (!target) {\n return;\n }\n\n event.preventDefault();\n\n this.activeDate.set(target);\n this.viewYear.set(target.getFullYear());\n this.viewMonth.set(target.getMonth());\n\n afterNextRender(() => this.focusActiveDate(), { injector: this.injector });\n }\n\n private keyTarget(event: KeyboardEvent, current: Date): Date | null {\n const dayOfWeek = (current.getDay() - this.weekStart() + 7) % 7;\n\n switch (event.key) {\n case 'ArrowLeft':\n return addDays(current, -1);\n case 'ArrowRight':\n return addDays(current, 1);\n case 'ArrowUp':\n return addDays(current, -7);\n case 'ArrowDown':\n return addDays(current, 7);\n case 'Home':\n return addDays(current, -dayOfWeek);\n case 'End':\n return addDays(current, 6 - dayOfWeek);\n case 'PageUp':\n return addMonths(current, event.shiftKey ? -12 : -1);\n case 'PageDown':\n return addMonths(current, event.shiftKey ? 12 : 1);\n default:\n return null;\n }\n }\n\n private isUnavailable(iso: IsoDate): boolean {\n const min = this.min();\n const max = this.max();\n\n // ISO dates sort the same as strings\n return (!!min && iso < min) ||\n (!!max && iso > max) ||\n this.isDateDisabled()(iso);\n }\n}\n","<div class=\"ui-calendar-header\">\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Previous month\"\n [disabled]=\"!canGoBack()\"\n (click)=\"showMonth(-1)\"\n >\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n </button>\n\n <div class=\"ui-calendar-selects\">\n <ui-select\n class=\"ui-calendar-month\"\n [dataSource]=\"monthSource()\"\n [displayWith]=\"displayMonth\"\n [pageSize]=\"12\"\n [(selectedItem)]=\"viewMonth\"\n />\n <ui-select\n class=\"ui-calendar-year\"\n [dataSource]=\"yearSource()\"\n [pageSize]=\"500\"\n [(selectedItem)]=\"viewYear\"\n />\n </div>\n\n <button\n type=\"button\"\n class=\"ui-calendar-nav\"\n aria-label=\"Next month\"\n [disabled]=\"!canGoForward()\"\n (click)=\"showMonth(1)\"\n >\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n </button>\n</div>\n\n<div class=\"ui-calendar-weekdays\" aria-hidden=\"true\">\n @for (weekday of weekdays(); track $index) {\n <span class=\"ui-calendar-weekday ui-text-caption\">{{ weekday }}</span>\n }\n</div>\n\n<div class=\"ui-calendar-grid\" (mouseleave)=\"preview(null)\">\n @for (day of days(); track day.iso) {\n <button\n type=\"button\"\n class=\"ui-calendar-day ui-text-body-alt\"\n [attr.data-date]=\"day.iso\"\n [attr.data-outside]=\"day.isOutside ? '' : null\"\n [attr.data-today]=\"day.isToday ? '' : null\"\n [attr.data-in-range]=\"day.isInRange ? '' : null\"\n [attr.data-range-start]=\"day.isRangeStart ? '' : null\"\n [attr.data-range-end]=\"day.isRangeEnd ? '' : null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-pressed]=\"day.isSelected\"\n [attr.aria-label]=\"day.label\"\n [tabindex]=\"day.iso === tabbableDate() ? 0 : -1\"\n [attr.aria-disabled]=\"day.isDisabled || null\"\n (click)=\"select(day)\"\n (keydown)=\"handleKeydown($event)\"\n (mouseenter)=\"preview(day.iso)\"\n (focus)=\"preview(day.iso)\"\n >\n {{ day.day }}\n </button>\n }\n</div>\n","/** Which day each calendar row starts on. 0 is Sunday, 1 is Monday. */\nexport const WeekStarts = [0, 1] as const;\n\n/** @see {@link WeekStarts} */\nexport type WeekStart = typeof WeekStarts[number];\n\n/** A date-only ISO string, e.g. \"2026-09-29\". */\nexport type IsoDate = string;\n\nexport interface CalendarDay {\n iso: IsoDate;\n day: number;\n label: string;\n isOutside: boolean;\n isToday: boolean;\n isSelected: boolean;\n isDisabled: boolean;\n isInRange: boolean;\n isRangeStart: boolean;\n isRangeEnd: boolean;\n}\n\n/** A local date and time ISO string, e.g. \"2026-09-29T14:30\". */\nexport type IsoDateTime = string;\n\n/** Whether a calendar picks one date or a start and end. */\nexport const CalendarModes = ['single', 'range'] as const;\n\n/** @see {@link CalendarModes} */\nexport type CalendarMode = typeof CalendarModes[number];\n\nexport interface DateRange {\n start: IsoDate | null;\n end: IsoDate | null;\n}\n","import { Component } from '@angular/core';\n\n\n@Component({\n selector: 'ui-container',\n template: '<ng-content></ng-content>',\n host: { class: 'block container' }\n})\nexport class UiContainerComponent {}\n","import { Component, input, signal } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../button/button.component';\n\n\n@Component({\n selector: 'ui-drawer',\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: { '[class.open]': 'isOpen()' }\n})\nexport class UiDrawerComponent {\n readonly isOpen = signal<boolean>(false);\n readonly enableBackdrop = input<boolean>(true);\n\n readonly label = input<string>('');\n readonly subLabel = input<string>('');\n}\n","@if (enableBackdrop()) {\n <div\n class=\"absolute inset-0 bg-black/10 transition-opacity\"\n [class.opacity-0]=\"!isOpen()\"\n [class.pointer-events-none]=\"!isOpen()\"\n aria-hidden=\"true\"\n (click)=\"isOpen.set(false)\"\n >\n </div>\n}\n\n<aside\n class=\"right-0 absolute inset-y-0 bg-white border-gray-200 border-s w-100 h-full transition-transform duration-200\"\n [class.translate-x-full]=\"!isOpen()\"\n>\n <div class=\"flex flex-col h-full\">\n <header\n class=\"flex justify-between px-5 py-2.5 border-gray-200 border-b\"\n [class.items-start]=\"subLabel()\"\n [class.items-center]=\"!subLabel()\"\n >\n <div>\n <h3 class=\"font-semibold ui-text-h3\">{{ label() }}</h3>\n\n @if (subLabel()) {\n <h4 class=\"ui-text-body\">{{ subLabel() }}</h4>\n }\n </div>\n <ui-button\n appearance=\"none\"\n classes=\"drawer-close-btn\"\n (click)=\"isOpen.set(false)\"\n >\n <ng-icon\n name=\"heroXMark\"\n size=\"20\"\n strokeWidth=\"2\"\n class=\"size-4 shrink-0\"\n />\n </ui-button>\n </header>\n </div>\n</aside>\n","import {\n Component,\n computed,\n ElementRef,\n inject,\n input,\n signal,\n viewChild,\n WritableSignal\n} from '@angular/core';\n\nimport { Placement } from '@floating-ui/dom';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiTooltipTrigger } from './tooltip.types';\n\n\n@Component({\n selector: 'ui-tooltip',\n exportAs: 'uiTooltip',\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.css',\n imports: [UiOverlayComponent],\n host: {\n class: 'inline-flex size-fit',\n '(mouseenter)': 'onHover(true)',\n '(mouseleave)': 'onHover(false)',\n '(focusin)': 'onFocus(true)',\n '(focusout)': 'onFocus(false)',\n '(click)': 'onClick()'\n }\n})\nexport class UiTooltipComponent {\n protected readonly anchor = inject(ElementRef<HTMLElement>);\n protected readonly content = viewChild('content', { read: ElementRef });\n\n readonly text = input.required<string>();\n readonly placement = input<Placement>('top');\n readonly trigger = input<UiTooltipTrigger>('hover');\n readonly classes = input<string>('');\n\n readonly isOpen = input<WritableSignal<boolean>>(signal(false));\n\n protected readonly closeBehaviour = computed<UiOverlayCloseBehaviour>(() =>\n this.trigger() === 'click'\n ? 'whenClickOutside'\n : 'none'\n );\n\n protected readonly generatedClasses = computed(() =>\n ['ui-tooltip', 'ui-text-caption', this.classes()]\n .filter(Boolean)\n .join(' ')\n );\n\n protected onHover(isHovering: boolean) {\n if (this.trigger() === 'hover') {\n this.isOpen().set(isHovering);\n }\n }\n\n // Hover also listens to focus so keyboard users still get the tooltip\n protected onFocus(isFocused: boolean) {\n if (['hover', 'focus'].includes(this.trigger())) {\n this.isOpen().set(isFocused);\n }\n }\n\n protected onClick() {\n if (this.trigger() === 'click') {\n this.isOpen().update(value => !value);\n }\n }\n}\n","<ui-overlay\n [isOpen]=\"isOpen()\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"content()\"\n [anchor]=\"anchor\"\n [placement]=\"placement()\"\n>\n <ng-content />\n\n @if (isOpen()()) {\n <div #content class=\"p-1.5\" style=\"position: fixed; z-index: 60\">\n <div role=\"tooltip\" [class]=\"generatedClasses()\">{{ text() }}</div>\n </div>\n }\n</ui-overlay>\n","import { Component, input } from '@angular/core';\n\nimport { IconName, NgIcon } from '@ng-icons/core';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { UiTooltipComponent } from '../tooltip/tooltip.component';\n\n\n@Component({\n selector: 'ui-kpi',\n templateUrl: './kpi.component.html',\n imports: [UiCardComponent, NgIcon, UiTooltipComponent]\n})\nexport class UiKpiComponent {\n readonly title = input<string>('');\n readonly value = input<string>('');\n readonly hint = input<string>('');\n readonly icon = input<IconName>();\n readonly iconPosition = input<'left' | 'right'>('left');\n}\n","<ui-card radius=\"xl\">\n <div class=\"flex gap-x-4 p-4 md:p-5\">\n @if (icon() && iconPosition() === 'left') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n\n <div class=\"grow\">\n <div class=\"flex items-center gap-x-2 text-muted-foreground-2\">\n <span class=\"font-semibold ui-text-h4 text-sm uppercase\">\n {{ title() }}\n </span>\n\n @if (hint()) {\n <ui-tooltip\n [text]=\"hint()\"\n placement=\"top\"\n trigger=\"hover\"\n >\n <ng-icon name=\"heroQuestionMarkCircle\" size=\"18\" />\n </ui-tooltip>\n }\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2 mt-1\">\n <h3 class=\"font-semibold text-foreground ui-text-h2\">\n <!-- falls back to the plain value when nothing is projected -->\n <ng-content select=\"[kpi-value]\">{{ value() }}</ng-content>\n </h3>\n <ng-content select=\"[kpi-badge]\"></ng-content>\n </div>\n </div>\n\n @if (icon() && iconPosition() === 'right') {\n <div class=\"flex justify-center items-center bg-surface rounded-lg size-12 shrink-0\">\n <ng-icon\n [name]=\"icon()\"\n size=\"32\"\n class=\"size-8 text-muted-foreground-2 shrink-0\"\n strokeWidth=\"1.5\"\n />\n </div>\n }\n </div>\n</ui-card>\n","import { Component, computed, input } from '@angular/core';\n\nimport { UiLoadingType } from './loading.types';\n\n\nconst TEXT_TYPES: UiLoadingType[] = [\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots'\n];\n\n@Component({\n selector: 'ui-loading',\n templateUrl: './loading.component.html',\n styleUrl: './loading.component.css'\n})\nexport class UiLoadingComponent {\n readonly type = input<UiLoadingType>('spinner');\n\n protected readonly hasText = computed(() =>\n TEXT_TYPES.includes(this.type())\n );\n\n protected readonly throbberSpokes = Array.from({ length: 12 }, (_, i) => i);\n}\n","<div class=\"ui-loading\" role=\"status\">\n @switch (type()) {\n @case ('throbber') {\n <svg\n class=\"ui-loading--throbber\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n @for (i of throbberSpokes; track i) {\n <line\n x1=\"12\"\n y1=\"2.5\"\n x2=\"12\"\n y2=\"7\"\n [attr.transform]=\"'rotate(' + i * (360 / throbberSpokes.length) + ' 12 12)'\"\n [style.animation-delay.s]=\"i / throbberSpokes.length - 1\"\n />\n }\n </svg>\n }\n @case ('pulse-ring') {\n <span\n class=\"ui-loading--pulse-ring ui-loading--pulse\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('pulse-dot') {\n <span\n class=\"ui-loading--pulse ui-loading--pulse-dot\"\n aria-hidden=\"true\"\n ></span>\n }\n @case ('wave') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('equaliser') {\n <span\n class=\"ui-loading--row ui-loading--stagger ui-loading--bars\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <span class=\"ui-loading--bar\"></span>\n }\n </span>\n }\n @case ('terminal') {\n <span class=\"ui-loading--prompt\" aria-hidden=\"true\">></span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('blinking-caret') {\n <span>Loading</span>\n <span class=\"ui-loading--caret\" aria-hidden=\"true\"></span>\n }\n @case ('shimmer-text') {\n <span class=\"ui-loading--shimmer\">Loading</span>\n }\n @case ('loading-dots') {\n <span>Loading</span>\n <span\n class=\"ui-loading--text-dots ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--text-dot\">.</span>\n }\n </span>\n }\n @case ('bouncing-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-bounce\"></span>\n }\n </span>\n }\n @case ('fading-dots') {\n <span\n class=\"ui-loading--row ui-loading--stagger\"\n aria-hidden=\"true\"\n >\n @for (i of [1, 2, 3]; track i) {\n <span class=\"ui-loading--dot ui-loading--dot-fade\"></span>\n }\n </span>\n }\n @default {\n <span class=\"ui-loading--spinner\" aria-hidden=\"true\"></span>\n }\n }\n\n @if (!hasText()) {\n <span class=\"sr-only\">Loading</span>\n }\n</div>\n","export const UI_LOADING_TYPES = [\n 'spinner',\n 'throbber',\n 'pulse-ring',\n 'pulse-dot',\n 'wave',\n 'equaliser',\n 'terminal',\n 'blinking-caret',\n 'shimmer-text',\n 'loading-dots',\n 'bouncing-dots',\n 'fading-dots'\n] as const satisfies string[];\n\nexport type UiLoadingType = typeof UI_LOADING_TYPES[number];\n","import { Component, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-modal-close-btn',\n templateUrl: './modal-close-btn.component.html',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiModalCloseButtonComponent {\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n appearance=\"white\"\n intent=\"secondary\"\n classes=\"p-2! border-transparent! shadow-none!\"\n (click)=\"isOpen.set(false)\"\n>\n <ng-icon name=\"heroXMark\" strokeWidth=\"2.5\" />\n</ui-button>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n ElementRef,\n input,\n model,\n TemplateRef,\n viewChild\n} from '@angular/core';\n\nimport { UiOverlayComponent } from '../../layout/overlay/overlay.component';\nimport { UiOverlayCloseBehaviour } from '../../layout/overlay/overlay.types';\nimport { UiModalCloseButtonComponent } from '../../presets/modal-close-btn/modal-close-btn.component';\nimport { UiCardComponent } from '../card/card.component';\nimport { ModalSize } from './modal.types';\n\n\n@Component({\n selector: 'ui-modal',\n templateUrl: './modal.component.html',\n styleUrl: './modal.component.css',\n imports: [\n UiOverlayComponent,\n UiModalCloseButtonComponent,\n NgTemplateOutlet,\n UiCardComponent\n ]\n})\nexport class UiModalComponent {\n readonly isOpen = model.required<boolean>();\n readonly closeBehaviour = input<UiOverlayCloseBehaviour>(\n 'whenClickOutside'\n );\n readonly title = input<string>('');\n readonly size = input<ModalSize>('md');\n readonly classes = input<string>('');\n\n readonly headerElement = contentChild<TemplateRef<unknown>>(\n 'header',\n { descendants: false }\n );\n readonly footerElement = contentChild<TemplateRef<unknown>>(\n 'footer',\n { descendants: false }\n );\n readonly panelElement = viewChild(\n 'panel',\n { read: ElementRef<HTMLElement> }\n );\n\n readonly generatedClasses = computed<string>(() =>\n [\n 'ui-modal',\n `ui-modal--${this.size()}`,\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n}\n","@if (isOpen()) {\n <div\n class=\"group z-50 fixed inset-0 flex justify-center items-center bg-black/40 starting:opacity-0 p-4 transition-opacity duration-150 ease-out\"\n animate.leave=\"fs-modal--leaving opacity-0\"\n >\n <ui-overlay\n [isOpen]=\"isOpen\"\n [closeBehaviour]=\"closeBehaviour()\"\n [content]=\"panelElement()\"\n tabIndex=\"-1\"\n role=\"dialog\"\n aria-modal=\"true\"\n class=\"block max-w-full starting:scale-95 group-[.fs-modal--leaving]:scale-95 transition duration-150 ease-out\"\n >\n <ui-card #panel radius=\"xl\" [class]=\"generatedClasses()\">\n <div class=\"flex flex-col max-h-[calc(100dvh-2rem-2px)]\">\n <header class=\"flex justify-between items-center gap-x-5 p-5 border-neutral border-b shrink-0\">\n @if (headerElement()) {\n <ng-container *ngTemplateOutlet=\"headerElement()\" />\n } @else {\n <span class=\"ui-text-h3\">{{ title() }}</span>\n <ui-modal-close-btn [(isOpen)]=\"isOpen\" />\n }\n </header>\n <div class=\"flex-1 min-h-0 overflow-auto\">\n <ng-content />\n </div>\n\n @if (footerElement()) {\n <footer class=\"flex justify-end items-center gap-2.5 p-5 shrink-0\">\n <ng-container *ngTemplateOutlet=\"footerElement()\" />\n </footer>\n }\n </div>\n </ui-card>\n </ui-overlay>\n </div>\n}\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\n\nimport type { MoneySignDisplay } from './money.types';\n\n\n/**\n * Formats a money value, e.g. -42.1 as \"-£42.10\".\n */\n@Component({\n selector: 'ui-money',\n templateUrl: './money.component.html',\n styleUrl: './money.component.css'\n})\nexport class UiMoneyComponent {\n readonly value = input.required<number | null>();\n\n readonly currency = input<string>('GBP');\n readonly locale = input<string>('en-GB');\n readonly signDisplay = input<MoneySignDisplay>('auto');\n\n /** Green for money in, red for money out. */\n readonly colourBySign = input(false, { transform: booleanAttribute });\n\n /** Short form like \"£12K\", the full amount goes in the title. */\n readonly compact = input(false, { transform: booleanAttribute });\n\n /** Shown when there's no value. */\n readonly placeholder = input<string>('-');\n\n readonly classes = input<string>('');\n\n // -0 would otherwise format as \"-£0.00\"\n private readonly amount = computed(() => {\n const value = this.value();\n\n return value === null || Number.isNaN(value) ? null : value || 0;\n });\n\n protected readonly formatted = computed(() => {\n const amount = this.amount();\n\n return amount === null ? this.placeholder() : this.format(amount, this.compact());\n });\n\n protected readonly title = computed(() => {\n const amount = this.amount();\n\n return this.compact() && amount !== null ? this.format(amount, false) : null;\n });\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-money',\n this.signClass(),\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n private readonly signClass = computed(() => {\n const amount = this.amount();\n\n if (!this.colourBySign() || amount === null) {\n return '';\n }\n\n if (amount > 0) {\n return 'ui-money--positive';\n }\n\n return amount < 0 ? 'ui-money--negative' : '';\n });\n\n private format(amount: number, compact: boolean): string {\n return new Intl.NumberFormat(this.locale(), {\n style: 'currency',\n currency: this.currency(),\n signDisplay: this.signDisplay(),\n notation: compact ? 'compact' : 'standard'\n }).format(amount);\n }\n}\n","<span [class]=\"generatedClasses()\" [attr.title]=\"title()\">{{ formatted() }}</span>\n","/** Intl signDisplay values, controls when a + or - is shown. */\nexport const MoneySignDisplays = [\n 'auto',\n 'always',\n 'exceptZero',\n 'never'\n] as const;\n\n/** @see {@link MoneySignDisplays} */\nexport type MoneySignDisplay = typeof MoneySignDisplays[number];\n","import { Component, computed, input, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport type { PaginationItem } from './pagination.types';\n\n\n@Component({\n selector: 'ui-pagination',\n templateUrl: './pagination.component.html',\n styleUrl: './pagination.component.css',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiPaginationComponent {\n // zero-based, same as the table\n readonly page = model<number>(0);\n readonly totalPages = input.required<number>();\n\n readonly classes = input<string>('');\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-pagination',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n readonly isFirstPage = computed(() => this.page() <= 0);\n readonly isLastPage = computed(() => this.page() >= this.totalPages() - 1);\n\n // first, last and the pages either side of the current one, with gaps collapsed\n readonly items = computed(() => {\n const total = this.totalPages();\n const current = this.page();\n const items: PaginationItem[] = [];\n\n for (let i = 0; i < total; i++) {\n const isEdge = i === 0 || i === total - 1;\n const isNearCurrent = Math.abs(i - current) <= 1;\n\n // no point hiding a single page behind an ellipsis\n const hidesOnePage = (i === 1 && current === 3) ||\n (i === total - 2 && current === total - 4);\n\n if (isEdge || isNearCurrent || hidesOnePage) {\n items.push(i);\n } else if (items.at(-1) !== 'ellipsis') {\n items.push('ellipsis');\n }\n }\n\n return items;\n });\n\n pageLabel(page: number): string {\n const label = `Page ${page + 1}`;\n\n return page === this.page() ? `${label}, current page` : label;\n }\n\n goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.page.set(page);\n }\n}\n","<nav [class]=\"generatedClasses()\" aria-label=\"Pagination\">\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isFirstPage()\"\n (click)=\"goToPage(page() - 1)\"\n >\n <ng-icon name=\"heroChevronLeft\" class=\"shrink-0\" />\n </ui-button>\n\n @for (item of items(); track $index) {\n @if (item === 'ellipsis') {\n <span class=\"ui-text-body ui-pagination-ellipsis\">…</span>\n } @else {\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [class.active]=\"item === page()\"\n (click)=\"goToPage(item)\"\n >\n {{ item + 1 }}\n </ui-button>\n }\n }\n\n <ui-button\n appearance=\"none\"\n classes=\"ui-pagination--goto-btn ui-text-body\"\n [disabled]=\"isLastPage()\"\n (click)=\"goToPage(page() + 1)\"\n >\n <ng-icon name=\"heroChevronRight\" class=\"shrink-0\" />\n </ui-button>\n</nav>\n","import { Component, computed, input } from '@angular/core';\n\nimport type {\n ProgressIntent,\n ProgressLabelPosition,\n ProgressOrientation,\n ProgressSegment,\n ProgressShape,\n ProgressSize\n} from './progress.types';\n\n\ninterface SegmentView {\n percent: number;\n intent: ProgressIntent;\n label: string;\n}\n\n/**\n * A progress bar. Leave `value` null for work of unknown length, a value over\n * `max` fills the bar but the label still shows the real amount.\n */\n@Component({\n selector: 'ui-progress',\n templateUrl: './progress.component.html',\n styleUrl: './progress.component.css',\n host: {\n '[class.ui-progress-host--vertical]': 'orientation() === \"vertical\"'\n }\n})\nexport class UiProgressComponent {\n readonly value = input<number | null>(0);\n readonly max = input<number>(100);\n\n readonly intent = input<ProgressIntent>('primary');\n readonly size = input<ProgressSize>('md');\n readonly shape = input<ProgressShape>('rounded');\n readonly orientation = input<ProgressOrientation>('horizontal');\n\n readonly title = input<string>('');\n readonly labelPosition = input<ProgressLabelPosition>('none');\n readonly labelWith = input<(value: number, max: number) => string>(\n (value, max) => `${Math.round(value / max * 100)}%`\n );\n\n /** Splits the bar into this many blocks. */\n readonly steps = input<number | null>(null);\n\n /** Several fills stacked in one track, each with its own colour. */\n readonly segments = input<ProgressSegment[] | null>(null);\n\n /** Needed when there's no visible title. */\n readonly ariaLabel = input<string>('');\n\n protected readonly isIndeterminate = computed(() => this.value() === null && !this.segments());\n\n protected readonly total = computed(() => {\n const segments = this.segments();\n\n return segments\n ? segments.reduce((sum, segment) => sum + segment.value, 0)\n : this.value() ?? 0;\n });\n\n /** 0 to 100, what the bar actually draws. */\n protected readonly fillPercent = computed(() =>\n this.clampPercent(this.total() / this.max() * 100)\n );\n\n protected readonly label = computed(() =>\n this.isIndeterminate() ? '' : this.labelWith()(this.total(), this.max())\n );\n\n protected readonly segmentViews = computed<SegmentView[]>(() => {\n const segments = this.segments() ?? [];\n let used = 0;\n\n // later segments get squeezed once the track is full\n return segments.map(segment => {\n const percent = Math.min(this.clampPercent(segment.value / this.max() * 100), 100 - used);\n\n used += percent;\n\n return {\n percent,\n intent: segment.intent ?? this.intent(),\n label: segment.label ?? this.labelWith()(segment.value, this.max())\n };\n });\n });\n\n protected readonly stepStates = computed(() => {\n const steps = Math.max(1, Math.floor(this.steps() ?? 1));\n const filled = Math.round(this.fillPercent() / 100 * steps);\n\n return Array.from({ length: steps }, (_, index) => index < filled);\n });\n\n // keeps the floating label over the end of the fill without spilling off either side\n protected readonly floatingOffset = computed(() =>\n `clamp(0px, calc(${this.fillPercent()}% - 1.25rem), calc(100% - 2.5rem))`\n );\n\n protected readonly isVertical = computed(() => this.orientation() === 'vertical');\n\n protected readonly rootClasses = computed(() =>\n [\n 'ui-progress',\n `ui-progress--${this.orientation()}`,\n `ui-progress--${this.size()}`,\n `ui-progress--${this.shape()}`,\n this.labelPosition() === 'inside' ? 'ui-progress--label-inside' : ''\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected fillClasses(intent: ProgressIntent): string {\n return [\n 'ui-progress-fill',\n `ui-progress-fill--${intent}`,\n this.isIndeterminate() ? 'ui-progress-fill--indeterminate' : ''\n ]\n .filter(Boolean)\n .join(' ');\n }\n\n private clampPercent(percent: number): number {\n return Number.isFinite(percent) ? Math.min(100, Math.max(0, percent)) : 0;\n }\n}\n","<div [class]=\"rootClasses()\">\n @if (title() || labelPosition() === 'top') {\n <div class=\"ui-progress-header\">\n <span class=\"text-foreground ui-text-body-alt\">{{ title() }}</span>\n\n @if (labelPosition() === 'top') {\n <span class=\"text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n }\n\n @if (labelPosition() === 'floating' && !isIndeterminate() && !isVertical()) {\n <div class=\"ui-progress-floating-row\" aria-hidden=\"true\">\n <span\n class=\"ui-progress-floating ui-text-caption\"\n [class]=\"'ui-progress-floating--' + intent()\"\n [style.margin-inline-start]=\"floatingOffset()\"\n >\n {{ label() }}\n </span>\n </div>\n }\n\n <div class=\"ui-progress-row\">\n <div\n class=\"ui-progress-track\"\n [class.ui-progress-track--steps]=\"steps()\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-valuenow]=\"isIndeterminate() ? null : total()\"\n [attr.aria-valuetext]=\"label() || null\"\n [attr.aria-label]=\"ariaLabel() || title() || null\"\n >\n @if (steps()) {\n @for (filled of stepStates(); track $index) {\n <span\n class=\"ui-progress-step\"\n [class]=\"filled ? 'ui-progress-fill--' + intent() : ''\"\n ></span>\n }\n } @else if (segments()) {\n @for (segment of segmentViews(); track $index) {\n <span\n [class]=\"fillClasses(segment.intent)\"\n [style.width.%]=\"isVertical() ? null : segment.percent\"\n [style.height.%]=\"isVertical() ? segment.percent : null\"\n [attr.title]=\"segment.label\"\n >\n @if (labelPosition() === 'inside') {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ segment.label }}</span>\n }\n </span>\n }\n } @else {\n <span\n [class]=\"fillClasses(intent())\"\n [style.width.%]=\"isVertical() || isIndeterminate() ? null : fillPercent()\"\n [style.height.%]=\"isVertical() && !isIndeterminate() ? fillPercent() : null\"\n >\n @if (labelPosition() === 'inside' && !isIndeterminate()) {\n <span class=\"ui-progress-inside-label ui-text-caption\">{{ label() }}</span>\n }\n </span>\n }\n </div>\n\n @if (labelPosition() === 'end' && !isIndeterminate()) {\n <span class=\"ui-progress-end text-foreground ui-text-body-alt\">{{ label() }}</span>\n }\n </div>\n</div>\n","/** Same names as badges, so a status reads the same wherever it shows. */\nexport const ProgressIntents = [\n 'primary',\n 'secondary',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\n/** @see {@link ProgressIntents} */\nexport type ProgressIntent = typeof ProgressIntents[number];\n\n/** Track thickness, md matches Preline's default and xl fits a label inside. */\nexport const ProgressSizes = ['sm', 'md', 'lg', 'xl'] as const;\n\n/** @see {@link ProgressSizes} */\nexport type ProgressSize = typeof ProgressSizes[number];\n\n/** Where the value label goes, if anywhere. */\nexport const ProgressLabelPositions = ['none', 'inside', 'end', 'top', 'floating'] as const;\n\n/** @see {@link ProgressLabelPositions} */\nexport type ProgressLabelPosition = typeof ProgressLabelPositions[number];\n\n/** rounded: both ends round, square: no rounding, straight: square track with a round fill. */\nexport const ProgressShapes = ['rounded', 'square', 'straight'] as const;\n\n/** @see {@link ProgressShapes} */\nexport type ProgressShape = typeof ProgressShapes[number];\n\nexport const ProgressOrientations = ['horizontal', 'vertical'] as const;\n\n/** @see {@link ProgressOrientations} */\nexport type ProgressOrientation = typeof ProgressOrientations[number];\n\n/** One part of a stacked bar, e.g. spending in one category. */\nexport interface ProgressSegment {\n value: number;\n intent?: ProgressIntent;\n label?: string;\n}\n","/** What a skeleton stands in for, lines of text, an avatar or a block. */\nexport const SkeletonShapes = ['text', 'circle', 'rect'] as const;\n\n/** @see {@link SkeletonShapes} */\nexport type SkeletonShape = typeof SkeletonShapes[number];\n","import { Directive, input, model } from '@angular/core';\n\n\n@Directive({\n selector: '[uiTab]',\n host: { '[hidden]': '!active()' }\n})\nexport class UiTabDirective {\n label = input.required<string>({ alias: 'uiTab' });\n disabled = input<boolean>(false);\n active = model<boolean>(false);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n contentChild,\n contentChildren,\n effect,\n input,\n signal,\n TemplateRef\n} from '@angular/core';\n\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiTabDirective } from './tab.directive';\n\n\nexport type TabButtonAppearance =\n | 'solid'\n | 'underline';\n\n@Component({\n selector: 'ui-tab',\n templateUrl: './tab.component.html',\n styleUrl: './tab.component.css',\n imports: [UiButtonComponent, NgTemplateOutlet]\n})\nexport class UiTabComponent {\n readonly tabs = contentChildren(UiTabDirective);\n readonly selectedIndex = signal<number>(0);\n readonly actions = contentChild<TemplateRef<unknown>>('actions');\n\n readonly appearance = input<TabButtonAppearance>('solid');\n\n readonly generatedButtonClasses = computed(() =>\n [\n `ui-tab-button--${this.appearance()}`,\n 'font-medium'\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n constructor() {\n effect(() => {\n const tabs = this.tabs();\n if (!tabs.length || tabs.some(tab => tab.active())) { return; }\n\n tabs[0].active.set(true);\n });\n }\n\n select(index: number) {\n const tabs = this.tabs();\n\n const target = tabs[index];\n if (!target || target.disabled()) { return; }\n\n tabs.forEach((tab, i) => tab.active.set(i === index));\n }\n}\n","<div class=\"flex\" role=\"tablist\">\n <div class=\"flex justify-between w-full\">\n <nav class=\"flex gap-x-2.5\" role=\"tablist\">\n @for (tab of tabs(); track tab; let i = $index) {\n <ui-button\n role=\"tab\"\n appearance=\"none\"\n [classes]=\"generatedButtonClasses()\"\n [disabled]=\"tab.disabled()\"\n [class.active]=\"tab.active()\"\n (click)=\"select(i)\"\n >\n {{ tab.label() }}\n </ui-button>\n }\n </nav>\n <div class=\"flex gap-x-2.5\">\n <ng-container *ngTemplateOutlet=\"actions()\"></ng-container>\n </div>\n </div>\n</div>\n\n<ng-content></ng-content>\n","import {\n booleanAttribute,\n ChangeDetectorRef,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { catchError, debounceTime, of, skip, Subject, switchMap } from 'rxjs';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport {\n SelectDataSource,\n SelectLocalDataSource\n} from '../../forms/select/select.datasource';\nimport { UiButtonComponent } from '../button/button.component';\nimport { UiDropdownComponent } from '../dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../dropdown/dropdown.directives';\nimport { UiLoadingComponent } from '../loading/loading.component';\nimport {\n type TableDataSource,\n type TableDataSourceContent,\n type TableDataSourceParameters\n} from './table.datasource';\nimport {\n type TableColumn,\n type TableColumnFilterOption,\n type TableRowAction,\n type TableSortState\n} from './table.types';\n\n\nconst DEFAULT_COLUMN_WIDTH = 160;\nconst SELECTION_COLUMN_WIDTH = 44;\n\ninterface ColumnDragPreview {\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n@Component({\n selector: 'ui-table',\n templateUrl: './table.component.html',\n styleUrl: './table.component.css',\n imports: [\n NgIcon,\n UiButtonComponent,\n UiCheckboxComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiInputComponent,\n UiSelectComponent,\n UiLoadingComponent\n ]\n})\nexport class UiTableComponent<Row = unknown> implements OnInit, OnDestroy {\n readonly classes = input<string>('');\n\n readonly columns = input.required<TableColumn<Row>[]>();\n readonly dataSource = input.required<TableDataSource<Row>>();\n\n readonly emptyMessage = input<string>('No data to display.');\n readonly errorMessage = input<string>(\n 'Something went wrong loading this data.'\n );\n\n // identifies a row across sorts/filters/pages, defaults to its position which\n // is only stable for an unsorted, unfiltered, unpaginated table\n readonly rowId = input<(row: Row, index: number) => unknown>(\n (_row, index) => index\n );\n\n readonly selectable = input(false, { transform: booleanAttribute });\n readonly searchable = input(false, { transform: booleanAttribute });\n readonly searchPlaceholder = input<string>('Search...');\n readonly paginated = input(false, { transform: booleanAttribute });\n readonly pageSize = input<number>(10);\n readonly toggleableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableColumns = input(false, { transform: booleanAttribute });\n readonly reorderableRows = input(false, { transform: booleanAttribute });\n readonly stickyHeader = input(false, { transform: booleanAttribute });\n readonly actions = input<TableRowAction<Row>[]>([]);\n\n readonly sort = model<TableSortState | null>(null);\n readonly selectedRowIds = model<Set<unknown>>(new Set());\n\n readonly selectionChange = output<Row[]>();\n readonly rowsReordered = output<Row[]>();\n\n readonly rows = signal<Row[]>([]);\n readonly total = signal(0);\n readonly loading = signal(false);\n readonly error = signal(false);\n\n readonly query = signal('');\n readonly filters = signal<Record<string, unknown>>({});\n\n protected readonly currentPage = signal(0);\n protected readonly hiddenColumnIds = signal<Set<string>>(new Set());\n protected readonly columnOrderIds = signal<string[] | null>(null);\n protected readonly columnWidths = signal<Record<string, number>>({});\n protected readonly columnMenuOpen = signal(false);\n protected readonly filterMenuOpen = signal(false);\n\n protected readonly draggedColumnId = signal<string | null>(null);\n protected readonly dragOverColumnId = signal<string | null>(null);\n protected readonly dragPreview = signal<ColumnDragPreview | null>(null);\n protected readonly draggedRowIndex = signal<number | null>(null);\n\n readonly isEmpty = computed(() =>\n !this.loading() && !this.error() && this.rows().length === 0\n );\n\n readonly generatedClasses = computed(() =>\n [\n 'ui-table',\n 'ui-text-body',\n this.classes()\n ]\n .filter(Boolean)\n .join(' ')\n );\n\n protected readonly orderedColumns = computed(() => {\n const order = this.columnOrderIds();\n\n if (!order) {\n return this.columns();\n }\n\n const byId = new Map(this.columns().map(column => [column.id, column]));\n const ordered = order\n .map(id => byId.get(id))\n .filter((column): column is TableColumn<Row> => !!column);\n\n const missing = this.columns().filter(column =>\n !order.includes(column.id)\n );\n\n return [...ordered, ...missing];\n });\n\n protected readonly hideableColumns = computed(() =>\n this.orderedColumns().filter(column => column.hideable !== false)\n );\n\n protected readonly visibleColumns = computed(() =>\n this.orderedColumns().filter(column =>\n !this.hiddenColumnIds().has(column.id)\n )\n );\n\n // pinned-left columns first, then unpinned, then pinned-right, so sticky offsets stack correctly\n protected readonly renderColumns = computed(() => {\n const columns = this.visibleColumns();\n\n return [\n ...columns.filter(column => column.pin === 'left'),\n ...columns.filter(column => !column.pin),\n ...columns.filter(column => column.pin === 'right')\n ];\n });\n\n // hidden columns stay filterable, the menu isn't tied to what's on screen\n protected readonly filterableColumns = computed(() =>\n this.orderedColumns().filter(column => column.filterable)\n );\n\n protected readonly hasFilterableColumns = computed(() =>\n this.filterableColumns().length > 0\n );\n\n protected readonly activeFilterCount = computed(() =>\n Object.keys(this.filters()).length\n );\n\n protected readonly hasActions = computed(() => this.actions().length > 0);\n protected readonly actionsColumnWidth = computed(() =>\n Math.max(60, this.actions().length * 40)\n );\n\n protected readonly totalPages = computed(() =>\n this.paginated()\n ? Math.max(1, Math.ceil(this.total() / this.pageSize()))\n : 1\n );\n\n protected readonly resultsLabel = computed(() => {\n const total = this.total();\n\n return total === 1 ? '1 result' : `${total} results`;\n });\n\n protected readonly allSelected = computed(() => {\n const rows = this.rows();\n\n return rows.length > 0 &&\n rows.every((row, index) =>\n this.selectedRowIds().has(this.rowId()(row, index))\n );\n });\n\n protected readonly someSelected = computed(() => {\n const rows = this.rows();\n const selected = this.selectedRowIds();\n const count = rows.filter((row, index) =>\n selected.has(this.rowId()(row, index))\n ).length;\n\n return count > 0 && count < rows.length;\n });\n\n private readonly leftOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = this.selectable() ? SELECTION_COLUMN_WIDTH : 0;\n\n for (\n const column of this.renderColumns().filter(c => c.pin === 'left')\n ) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n private readonly rightOffsets = computed(() => {\n const offsets: Record<string, number> = {};\n let offset = 0;\n\n const columns = this.renderColumns()\n .filter(c => c.pin === 'right')\n .slice()\n .reverse();\n\n for (const column of columns) {\n offsets[column.id] = offset;\n offset += this.columnWidth(column);\n }\n\n return offsets;\n });\n\n // one shared stream for every load, so a newer request cancels whatever was still in flight\n private readonly load$ = new Subject<void>();\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private resizeState: {\n columnId: string;\n startX: number;\n startWidth: number;\n } | null = null;\n private columnDragState: {\n columnId: string;\n pointerOffsetX: number;\n previewY: number;\n previewHeight: number;\n } | null = null;\n private readonly filterDataSources = new Map<\n string,\n SelectDataSource<TableColumnFilterOption>\n >();\n\n constructor() {\n toObservable(this.query).pipe(\n debounceTime(300),\n skip(1),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n toObservable(this.filters).pipe(\n debounceTime(300),\n skip(1),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(() => this.resetAndReload());\n\n this.load$.pipe(\n switchMap(() => this.fetch()),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe(result => this.applyResult(result));\n }\n\n ngOnInit(): void {\n this.reload();\n }\n\n ngOnDestroy(): void {\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n }\n\n reload(): void {\n this.load$.next();\n }\n\n protected cellValue(column: TableColumn<Row>, row: Row): unknown {\n return column.accessor(row);\n }\n\n // ng-icon's `name` wants a string; displayType 'icon' is the caller's promise the accessor gives one\n protected cellIconValue(column: TableColumn<Row>, row: Row): string {\n return column.accessor(row) as string;\n }\n\n protected formattedCellValue(column: TableColumn<Row>, row: Row): string {\n const value = column.accessor(row);\n\n if (value === null || value === undefined) {\n return '';\n }\n\n switch (column.displayType) {\n case 'number':\n return new Intl.NumberFormat().format(Number(value));\n case 'currency':\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: column.currency ?? 'USD'\n }).format(Number(value));\n case 'date':\n return new Intl.DateTimeFormat(undefined, {\n dateStyle: 'medium'\n })\n .format(new Date(value as string | number | Date));\n case 'time':\n return new Intl.DateTimeFormat(undefined, {\n timeStyle: 'short'\n })\n .format(new Date(value as string | number | Date));\n default:\n return String(value);\n }\n }\n\n protected onQueryChange(value: string): void {\n this.query.set(value);\n }\n\n protected filterValue(columnId: string): string {\n return (this.filters()[columnId] as string) ?? '';\n }\n\n protected onFilterInput(columnId: string, value: string): void {\n this.setFilter(columnId, value);\n }\n\n protected filterDataSource(\n column: TableColumn<Row>\n ): SelectDataSource<TableColumnFilterOption> {\n let dataSource = this.filterDataSources.get(column.id);\n\n if (!dataSource) {\n dataSource = new SelectLocalDataSource(\n column.filterOptions ?? [],\n (option, query) =>\n option.label.toLowerCase().includes(query.toLowerCase())\n );\n\n this.filterDataSources.set(column.id, dataSource);\n }\n\n return dataSource;\n }\n\n protected selectedFilterOption(\n column: TableColumn<Row>\n ): TableColumnFilterOption | null {\n const value = this.filters()[column.id];\n\n return column.filterOptions?.find(option => option.value === value) ??\n null;\n }\n\n protected filterOptionLabel(option: TableColumnFilterOption): string {\n return option.label;\n }\n\n protected onFilterSelect(\n columnId: string,\n option: TableColumnFilterOption | null\n ): void {\n this.setFilter(columnId, option?.value);\n }\n\n protected clearFilters(): void {\n this.filters.set({});\n }\n\n protected toggleSort(column: TableColumn<Row>): void {\n if (!column.sortable) {\n return;\n }\n\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n this.sort.set({ columnId: column.id, direction: 'asc' });\n } else if (current.direction === 'asc') {\n this.sort.set({ columnId: column.id, direction: 'desc' });\n } else {\n this.sort.set(null);\n }\n\n this.resetAndReload();\n }\n\n protected sortIcon(column: TableColumn<Row>): string {\n const current = this.sort();\n\n if (!current || current.columnId !== column.id) {\n return 'heroChevronUpDown';\n }\n\n return current.direction === 'asc'\n ? 'heroChevronUp'\n : 'heroChevronDown';\n }\n\n protected goToPage(page: number): void {\n if (page < 0 || page >= this.totalPages()) {\n return;\n }\n\n this.currentPage.set(page);\n this.reload();\n }\n\n protected isColumnVisible(column: TableColumn<Row>): boolean {\n return !this.hiddenColumnIds().has(column.id);\n }\n\n protected toggleColumnVisibility(column: TableColumn<Row>): void {\n this.hiddenColumnIds.update(hidden => {\n const next = new Set(hidden);\n\n if (next.has(column.id)) {\n next.delete(column.id);\n } else {\n next.add(column.id);\n }\n\n return next;\n });\n }\n\n protected isRowSelected(row: Row, index: number): boolean {\n return this.selectedRowIds().has(this.rowId()(row, index));\n }\n\n protected toggleRow(row: Row, index: number): void {\n const id = this.rowId()(row, index);\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected toggleSelectAll(): void {\n const wasAllSelected = this.allSelected();\n\n this.selectedRowIds.update(selected => {\n const next = new Set(selected);\n\n this.rows().forEach((row, index) => {\n const id = this.rowId()(row, index);\n\n if (wasAllSelected) {\n next.delete(id);\n } else {\n next.add(id);\n }\n });\n\n return next;\n });\n\n this.emitSelectionChange();\n }\n\n protected columnWidth(column: TableColumn<Row>): number {\n return this.columnWidths()[column.id] ??\n column.width ??\n DEFAULT_COLUMN_WIDTH;\n }\n\n protected isPinned(column: TableColumn<Row>): boolean {\n return column.pin === 'left' || column.pin === 'right';\n }\n\n protected leftOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'left' ? this.leftOffsets()[column.id] : null;\n }\n\n protected rightOffset(column: TableColumn<Row>): number | null {\n return column.pin === 'right' ? this.rightOffsets()[column.id] : null;\n }\n\n protected startResize(event: PointerEvent, column: TableColumn<Row>): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.resizeState = {\n columnId: column.id,\n startX: event.clientX,\n startWidth: this.columnWidth(column)\n };\n\n document.addEventListener('pointermove', this.onResizeMove);\n document.addEventListener('pointerup', this.onResizeEnd);\n }\n\n protected canReorderRows(): boolean {\n return this.reorderableRows() && !this.sort();\n }\n\n // custom pointer-based drag instead of native HTML5 DnD, so the floating\n // preview can be pinned to the header row instead of following the cursor\n // wherever it goes, and so a drop indicator can show the exact landing spot\n protected onColumnDragStart(\n event: PointerEvent,\n column: TableColumn<Row>\n ): void {\n event.preventDefault();\n\n const headerCell = (event.currentTarget as HTMLElement).closest('th');\n const headerRow = headerCell?.closest('tr');\n\n if (!headerCell || !headerRow) {\n return;\n }\n\n const cellRect = headerCell.getBoundingClientRect();\n const rowRect = headerRow.getBoundingClientRect();\n\n this.columnDragState = {\n columnId: column.id,\n pointerOffsetX: event.clientX - cellRect.left,\n previewY: rowRect.top + (rowRect.height - cellRect.height) / 2,\n previewHeight: cellRect.height\n };\n\n this.draggedColumnId.set(column.id);\n this.dragPreview.set({\n label: column.header,\n x: cellRect.left,\n y: this.columnDragState.previewY,\n width: cellRect.width,\n height: this.columnDragState.previewHeight\n });\n\n document.addEventListener('pointermove', this.onColumnDragMove);\n document.addEventListener('pointerup', this.onColumnDragEnd);\n }\n\n protected onRowDragStart(event: DragEvent, index: number): void {\n this.draggedRowIndex.set(index);\n event.dataTransfer?.setData('text/plain', String(index));\n }\n\n protected onRowDragOver(event: DragEvent): void {\n if (this.draggedRowIndex() !== null) {\n event.preventDefault();\n }\n }\n\n protected onRowDrop(event: DragEvent, index: number): void {\n event.preventDefault();\n\n const from = this.draggedRowIndex();\n this.draggedRowIndex.set(null);\n\n if (from === null || from === index) {\n return;\n }\n\n const next = [...this.rows()];\n const [moved] = next.splice(from, 1);\n next.splice(index, 0, moved);\n\n this.rows.set(next);\n this.rowsReordered.emit(next);\n }\n\n private readonly onResizeMove = (event: PointerEvent): void => {\n if (!this.resizeState) {\n return;\n }\n\n const column = this.columns().find(c =>\n c.id === this.resizeState!.columnId\n );\n const minWidth = column?.minWidth ?? 60;\n const delta = event.clientX - this.resizeState.startX;\n const width = Math.max(minWidth, this.resizeState.startWidth + delta);\n\n this.columnWidths.update(widths => ({\n ...widths,\n [this.resizeState!.columnId]: width\n }));\n };\n\n private readonly onResizeEnd = (): void => {\n this.resizeState = null;\n document.removeEventListener('pointermove', this.onResizeMove);\n document.removeEventListener('pointerup', this.onResizeEnd);\n };\n\n private readonly onColumnDragMove = (event: PointerEvent): void => {\n const state = this.columnDragState;\n\n if (!state) {\n return;\n }\n\n // x tracks the pointer, y stays pinned to the header row - the preview\n // can never wander down into the body no matter where the pointer goes\n this.dragPreview.update(preview =>\n preview && {\n ...preview,\n x: event.clientX - state.pointerOffsetX\n }\n );\n\n const target = document.elementFromPoint(event.clientX, event.clientY);\n const headerCell = target?.closest<HTMLElement>('th[data-column-id]');\n const columnId = headerCell?.dataset['columnId'];\n\n this.dragOverColumnId.set(\n columnId && columnId !== state.columnId ? columnId : null\n );\n };\n\n private readonly onColumnDragEnd = (): void => {\n const state = this.columnDragState;\n const overId = this.dragOverColumnId();\n\n this.columnDragState = null;\n this.draggedColumnId.set(null);\n this.dragOverColumnId.set(null);\n this.dragPreview.set(null);\n\n document.removeEventListener('pointermove', this.onColumnDragMove);\n document.removeEventListener('pointerup', this.onColumnDragEnd);\n\n if (!state || !overId || state.columnId === overId) {\n return;\n }\n\n const order = this.columnOrderIds() ?? this.columns().map(c => c.id);\n const from = order.indexOf(state.columnId);\n const to = order.indexOf(overId);\n\n if (from === -1 || to === -1) {\n return;\n }\n\n // dropped column takes the exact slot of the highlighted target, which\n // shifts over to make room - `to` is deliberately the target's index\n // from before removal, so splicing it into the now-shorter array lands\n // the dragged column exactly where the target was and pushes it aside,\n // rather than merely landing next to it\n const next = [...order];\n next.splice(from, 1);\n next.splice(to, 0, state.columnId);\n\n this.columnOrderIds.set(next);\n };\n\n private setFilter(columnId: string, value: unknown): void {\n this.filters.update(filters => {\n const next = { ...filters };\n\n if (value) {\n next[columnId] = value;\n } else {\n delete next[columnId];\n }\n\n return next;\n });\n }\n\n private resetAndReload(): void {\n this.currentPage.set(0);\n this.reload();\n }\n\n private emitSelectionChange(): void {\n const ids = this.selectedRowIds();\n const selectedRows = this.rows().filter((row, index) =>\n ids.has(this.rowId()(row, index))\n );\n\n this.selectionChange.emit(selectedRows);\n }\n\n private fetch() {\n this.loading.set(true);\n this.error.set(false);\n\n const params: TableDataSourceParameters = {\n page: this.currentPage(),\n size: this.paginated() ? this.pageSize() : 0,\n query: this.query(),\n sort: this.sort(),\n filters: this.filters()\n };\n\n return this.dataSource().load(params).pipe(catchError(() => of(null)));\n }\n\n private applyResult(result: TableDataSourceContent<Row> | null): void {\n this.loading.set(false);\n\n if (result) {\n this.rows.set(result.items);\n this.total.set(result.total);\n } else {\n this.error.set(true);\n }\n\n this.cdr.markForCheck();\n }\n}\n","@if (searchable() || hasFilterableColumns() || toggleableColumns()) {\n <div class=\"ui-table-toolbar\">\n @if (searchable()) {\n <ui-input\n [value]=\"query()\"\n (valueChange)=\"onQueryChange($event)\"\n [placeholder]=\"searchPlaceholder()\"\n class=\"max-w-xs\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroMagnifyingGlass\"\n class=\"ms-3 size-4 text-muted-foreground-1\"\n />\n </ng-template>\n </ui-input>\n }\n\n @if (hasFilterableColumns()) {\n <ui-dropdown\n [isOpen]=\"filterMenuOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"filterMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroFunnel\" class=\"size-4\" />\n Filters\n @if (activeFilterCount()) {\n <span class=\"ui-table-filter-count ui-text-caption\">\n {{ activeFilterCount() }}\n </span>\n }\n </ui-button>\n\n @if (filterMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-table-filter-menu\">\n @for (column of filterableColumns(); track column.id) {\n <div class=\"flex flex-col gap-1\">\n <span\n class=\"text-muted-foreground-1 ui-text-caption\"\n >\n {{ column.header }}\n </span>\n\n @if (column.filterOptions) {\n <ui-select\n [dataSource]=\"filterDataSource(column)\"\n [selectedItem]=\"selectedFilterOption(column)\"\n (selectionChange)=\"onFilterSelect(column.id, $event)\"\n [displayWith]=\"filterOptionLabel\"\n [clearable]=\"true\"\n clearLabel=\"All\"\n placeholder=\"All\"\n />\n } @else {\n <ui-input\n [value]=\"filterValue(column.id)\"\n (valueChange)=\"onFilterInput(column.id, $event)\"\n placeholder=\"Filter...\"\n [ariaLabel]=\"'Filter ' + column.header\"\n />\n }\n </div>\n }\n\n @if (activeFilterCount()) {\n <ui-button\n appearance=\"link\"\n intent=\"secondary\"\n class=\"text-end\"\n classes=\"self-end p-0! text-sm\"\n (click)=\"clearFilters()\"\n >\n Clear filters\n </ui-button>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n\n @if (toggleableColumns()) {\n <ui-dropdown\n [isOpen]=\"columnMenuOpen\"\n placement=\"bottom-end\"\n closeBehaviour=\"whenClickOutside\"\n class=\"ms-auto\"\n >\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n (click)=\"columnMenuOpen.update(open => !open)\"\n >\n <ng-icon name=\"heroViewColumns\" class=\"size-4\" />\n Columns\n </ui-button>\n\n @if (columnMenuOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"bg-white shadow-xs py-1 border border-dropdown-divider rounded-lg min-w-40\">\n @for (column of hideableColumns(); track column.id) {\n <label\n class=\"flex items-center gap-2 hover:bg-dropdown-item-hover px-3 py-2 ui-text-body-alt cursor-pointer\"\n >\n <ui-checkbox\n [value]=\"isColumnVisible(column)\"\n (valueChange)=\"toggleColumnVisibility(column)\"\n />\n {{ column.header }}\n </label>\n }\n </div>\n </div>\n }\n </ui-dropdown>\n }\n </div>\n}\n\n<div class=\"ui-table-scroll\">\n <table [class]=\"generatedClasses()\">\n <colgroup>\n @if (selectable()) {\n <col [style.width.px]=\"44\" />\n }\n\n @for (column of renderColumns(); track column.id) {\n <col [style.width.px]=\"columnWidth(column)\" />\n }\n\n @if (hasActions()) {\n <col [style.width.px]=\"actionsColumnWidth()\" />\n }\n </colgroup>\n\n <thead [class.ui-table-sticky]=\"stickyHeader()\">\n <tr>\n @if (selectable()) {\n <th class=\"text-center! ui-table-select-cell\">\n <ui-checkbox\n [value]=\"allSelected()\"\n [indeterminate]=\"someSelected()\"\n (valueChange)=\"toggleSelectAll()\"\n />\n </th>\n }\n\n @for (column of renderColumns(); track column.id) {\n <th\n scope=\"col\"\n [attr.data-column-id]=\"column.id\"\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [class.ui-table-column-dragging]=\"draggedColumnId() === column.id\"\n [class.ui-table-column-drag-over]=\"dragOverColumnId() === column.id\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n <div class=\"ui-table-th-content\">\n @if (reorderableColumns() && column.reorderable !== false) {\n <ng-icon\n name=\"heroBars2\"\n class=\"ui-table-drag-handle\"\n (pointerdown)=\"onColumnDragStart($event, column)\"\n />\n }\n\n @if (column.sortable) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-1 p-0! border-transparent! rounded-none! cursor-pointer hocus:text-foreground\"\n (click)=\"toggleSort(column)\"\n >\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n <ng-icon\n [name]=\"sortIcon(column)\"\n class=\"ms-auto size-4 shrink-0\"\n />\n </ui-button>\n } @else {\n <span\n class=\"font-medium text-muted-foreground-1 ui-text-caption ui-text-caption uppercase\"\n >\n {{ column.header }}\n </span>\n }\n </div>\n\n @if (column.resizable) {\n <span\n class=\"ui-table-resize-handle\"\n (pointerdown)=\"startResize($event, column)\"\n ></span>\n }\n </th>\n }\n\n @if (hasActions()) {\n <th class=\"ui-table-actions-cell\"></th>\n }\n </tr>\n </thead>\n\n <tbody class=\"ui-text-body-alt\">\n @if (loading()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n <ui-loading type=\"loading-dots\" />\n </td>\n </tr>\n } @else if (error()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status ui-table-status-error\"\n >\n {{ errorMessage() }}\n <ui-button\n appearance=\"link\"\n intent=\"danger\"\n classes=\"ms-1 p-0! text-sm underline\"\n (click)=\"reload()\"\n >\n Retry\n </ui-button>\n </td>\n </tr>\n } @else if (isEmpty()) {\n <tr>\n <td\n [attr.colspan]=\"renderColumns().length + (selectable() ? 1 : 0) + (hasActions() ? 1 : 0)\"\n class=\"ui-table-status\"\n >\n {{ emptyMessage() }}\n </td>\n </tr>\n } @else {\n @for (row of rows(); track rowId()(row, $index); let i = $index) {\n <tr\n [class.ui-table-row-selected]=\"isRowSelected(row, i)\"\n [class.ui-table-row-dragging]=\"draggedRowIndex() === i\"\n [draggable]=\"canReorderRows()\"\n (dragstart)=\"onRowDragStart($event, i)\"\n (dragover)=\"onRowDragOver($event)\"\n (drop)=\"onRowDrop($event, i)\"\n >\n @if (selectable()) {\n <td class=\"ui-table-select-cell\">\n <ui-checkbox\n [value]=\"isRowSelected(row, i)\"\n (valueChange)=\"toggleRow(row, i)\"\n />\n </td>\n }\n\n @for (column of renderColumns(); track column.id) {\n <td\n [class.ui-table-pinned]=\"isPinned(column)\"\n [attr.data-pin]=\"column.pin || null\"\n [style.left.px]=\"leftOffset(column)\"\n [style.right.px]=\"rightOffset(column)\"\n >\n @if (column.displayType === 'icon') {\n <ng-icon\n [name]=\"cellIconValue(column, row)\"\n class=\"size-4\"\n />\n } @else {\n {{ formattedCellValue(column, row) }}\n }\n </td>\n }\n\n @if (hasActions()) {\n <td class=\"ui-table-actions-cell\">\n @for (action of actions(); track action.id) {\n <ui-button\n appearance=\"none\"\n classes=\"p-1.5! border-transparent! rounded-md! text-muted-foreground-1 cursor-pointer hocus:bg-gray-100 hocus:text-foreground disabled:opacity-40! disabled:cursor-not-allowed\"\n [disabled]=\"!!action.disabled?.(row)\"\n [ariaLabel]=\"action.label\"\n [title]=\"action.label\"\n (click)=\"action.onClick(row)\"\n >\n <ng-icon\n [name]=\"action.icon\"\n class=\"size-4\"\n />\n </ui-button>\n }\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (dragPreview(); as preview) {\n <div\n class=\"ui-table-drag-preview ui-text-body-alt\"\n [style.left.px]=\"preview.x\"\n [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\"\n [style.height.px]=\"preview.height\"\n >\n <ng-icon name=\"heroBars2\" class=\"ui-table-drag-preview-icon\" />\n <span class=\"truncate\">{{ preview.label }}</span>\n </div>\n}\n\n@if (paginated()) {\n <div class=\"ui-table-footer\">\n <span class=\"text-muted-foreground-1 ui-text-caption\">{{\n resultsLabel()\n }}</span>\n\n <div class=\"ui-table-pagination\">\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() === 0\"\n (click)=\"goToPage(currentPage() - 1)\"\n >\n Prev\n </ui-button>\n\n <span class=\"ui-text-body-alt\">Page {{ currentPage() + 1 }} of {{\n totalPages()\n }}</span>\n\n <ui-button\n size=\"sm\"\n appearance=\"white\"\n intent=\"secondary\"\n [disabled]=\"currentPage() + 1 >= totalPages()\"\n (click)=\"goToPage(currentPage() + 1)\"\n >\n Next\n </ui-button>\n </div>\n </div>\n}\n","import { Observable, of } from 'rxjs';\n\nimport { type TableSortState } from './table.types';\n\n\nexport interface TableDataSourceParameters {\n page: number;\n /** 0 or less means \"no limit\", used when the table isn't paginated */\n size: number;\n query: string;\n sort: TableSortState | null;\n filters: Record<string, unknown>;\n}\n\nexport interface TableDataSourceContent<Row> {\n items: Row[];\n total: number;\n}\n\nexport interface TableDataSource<Row> {\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>>;\n}\n\nexport interface TableLocalDataSourceOptions<Row> {\n search?: (item: Row, query: string) => boolean;\n sortValue?: (item: Row, columnId: string) => unknown;\n filter?: (item: Row, filters: Record<string, unknown>) => boolean;\n}\n\nexport class TableLocalDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly items: Row[],\n private readonly options: TableLocalDataSourceOptions<Row> = {}\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n let result = this.items;\n\n const query = params.query.trim();\n\n if (query && this.options.search) {\n result = result.filter(item => this.options.search!(item, query));\n }\n\n if (Object.keys(params.filters).length && this.options.filter) {\n result = result.filter(item => this.options.filter!(item, params.filters));\n }\n\n if (params.sort && this.options.sortValue) {\n const { columnId, direction } = params.sort;\n const factor = direction === 'asc' ? 1 : -1;\n\n result = [...result].sort((a, b) => {\n const valueA = this.options.sortValue!(a, columnId);\n const valueB = this.options.sortValue!(b, columnId);\n\n if (valueA === valueB) {\n return 0;\n }\n\n return (valueA as never) > (valueB as never) ? factor : -factor;\n });\n }\n\n const total = result.length;\n const items = params.size > 0 ?\n result.slice(params.page * params.size, (params.page * params.size) + params.size) :\n result;\n\n return of({ items, total });\n }\n}\n\n// wraps any fetch function, so no specific backend is baked in here\nexport class TableRemoteDataSource<Row> implements TableDataSource<Row> {\n constructor(\n private readonly fetch: (\n params: TableDataSourceParameters\n ) => Observable<TableDataSourceContent<Row>>\n ) {}\n\n load(params: TableDataSourceParameters): Observable<TableDataSourceContent<Row>> {\n return this.fetch(params);\n }\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n output\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiCardComponent } from '../card/card.component';\nimport { ToastIntent } from './toast.types';\n\n\nconst INTENT_ICONS: Record<ToastIntent, string> = {\n info: 'heroInformationCircleSolid',\n success: 'heroCheckCircleSolid',\n warning: 'heroExclamationTriangleSolid',\n danger: 'heroXCircleSolid'\n};\n\nconst INTENT_COLOURS: Record<ToastIntent, string> = {\n info: 'text-primary-600',\n success: 'text-success-600',\n warning: 'text-warning-600',\n danger: 'text-danger-600'\n};\n\n@Component({\n selector: 'ui-toast',\n templateUrl: './toast.component.html',\n imports: [NgIcon, UiCardComponent],\n host: {\n '(mouseenter)': 'setHovered(true)',\n '(mouseleave)': 'setHovered(false)',\n '(focusin)': 'setFocused(true)',\n '(focusout)': 'setFocused(false)'\n }\n})\nexport class UiToastComponent {\n readonly intent = input<ToastIntent>('info');\n readonly classes = input<string>('');\n readonly dismissable = input(false, { transform: booleanAttribute });\n\n /** ms before the toast dismisses itself, paused while hovered or focused. null never times out. */\n readonly timeoutMs = input<number | null>(null);\n\n readonly dismissed = output<void>();\n\n protected readonly icon = computed(() => INTENT_ICONS[this.intent()]);\n protected readonly iconColour = computed(() =>\n INTENT_COLOURS[this.intent()]\n );\n\n // errors interrupt the screen reader, everything else waits its turn\n protected readonly role = computed(() =>\n this.intent() === 'danger' ? 'alert' : 'status'\n );\n\n private hovered = false;\n private focused = false;\n\n private timer?: ReturnType<typeof setTimeout>;\n private startedAt = 0;\n private remaining = 0;\n\n constructor() {\n effect(onCleanup => {\n const timeoutMs = this.timeoutMs();\n\n if (timeoutMs === null) {\n return;\n }\n\n this.remaining = timeoutMs;\n this.updateTimer();\n\n onCleanup(() => this.stopTimer());\n });\n }\n\n protected setHovered(hovered: boolean): void {\n this.hovered = hovered;\n this.updateTimer();\n }\n\n protected setFocused(focused: boolean): void {\n this.focused = focused;\n this.updateTimer();\n }\n\n private updateTimer(): void {\n if (this.hovered || this.focused) {\n this.stopTimer();\n } else if (this.timeoutMs() !== null && this.timer === undefined) {\n this.startTimer();\n }\n }\n\n private startTimer(): void {\n this.startedAt = Date.now();\n this.timer = setTimeout(() => this.dismissed.emit(), this.remaining);\n }\n\n // keeps whatever time was left so the countdown carries on after a pause\n private stopTimer(): void {\n if (this.timer === undefined) {\n return;\n }\n\n clearTimeout(this.timer);\n this.timer = undefined;\n this.remaining -= Date.now() - this.startedAt;\n }\n}\n","<ui-card\n radius=\"xl\"\n class=\"p-4 w-full max-w-xs\"\n [class]=\"classes()\"\n [attr.role]=\"role()\"\n tabindex=\"-1\"\n>\n <div class=\"flex gap-x-3\">\n <div class=\"inline-flex\" [class]=\"iconColour()\">\n <ng-icon\n [name]=\"icon()\"\n class=\"shrink-0\"\n size=\"24\"\n />\n </div>\n <div class=\"grow\">\n <p class=\"text-layer-foreground ui-text-body\">\n <ng-content />\n </p>\n </div>\n @if (dismissable()) {\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n (click)=\"dismissed.emit()\"\n >\n <ng-icon name=\"heroXMark\" />\n </button>\n }\n </div>\n</ui-card>\n","import { Injectable, signal } from '@angular/core';\n\nimport { Toast, ToastMessage, ToastOptions } from './toast.types';\n\n\n@Injectable({ providedIn: 'root' })\nexport class UiToastService {\n private readonly _toasts = signal<Toast[]>([]);\n private nextId = 0;\n\n readonly toasts = this._toasts.asReadonly();\n\n show<ContextType>(\n message: ToastMessage<ContextType>,\n options: ToastOptions<ContextType> = {}\n ): number {\n const id = this.nextId++;\n\n const toast: Toast = {\n id,\n message,\n templateContext: {\n $implicit: options.context,\n dismiss: () => this.dismiss(id)\n },\n intent: options.intent ?? 'info',\n dismissable: options.dismissable ?? true,\n timeoutMs: options.timeoutMs\n };\n\n this._toasts.update(toasts => [...toasts, toast]);\n\n return id;\n }\n\n dismiss(id: number): void {\n this._toasts.update(toasts => toasts.filter(toast => toast.id !== id));\n }\n}\n","import { TemplateRef } from '@angular/core';\n\n\nexport const ToastIntents = [\n 'info',\n 'success',\n 'warning',\n 'danger'\n] as const;\n\nexport type ToastIntent = typeof ToastIntents[number];\n\n/** What a toast template receives: `let-data` for the context, `let-dismiss=\"dismiss\"` to close it. */\nexport interface ToastTemplateContext<ContextType = unknown> {\n $implicit: ContextType;\n dismiss: () => void;\n}\n\nexport type ToastMessage<ContextType = unknown> =\n | string\n | TemplateRef<ToastTemplateContext<ContextType>>;\n\nexport interface Toast {\n id: number;\n message: ToastMessage;\n templateContext: ToastTemplateContext;\n intent: ToastIntent;\n dismissable: boolean;\n\n // null never times out, undefined falls back to the toaster's timeout\n timeoutMs?: number | null;\n}\n\nexport type ToastOptions<ContextType = unknown> =\n & Partial<\n Pick<Toast, 'intent' | 'dismissable' | 'timeoutMs'>\n >\n & {\n context?: ContextType;\n };\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\n\nimport { UiToastComponent } from '../toast/toast.component';\nimport { UiToastService } from '../toast/toast.service';\nimport { ToasterPosition } from './toaster.types';\n\n\n// top stacks are reversed so the newest toast is always nearest the edge\nconst POSITION_CLASSES: Record<ToasterPosition, string> = {\n 'top-left': 'top-0 left-0 items-start flex-col-reverse',\n 'top-center':\n 'top-0 left-1/2 -translate-x-1/2 items-center flex-col-reverse',\n 'top-right': 'top-0 right-0 items-end flex-col-reverse',\n 'bottom-left': 'bottom-0 left-0 items-start flex-col',\n 'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center flex-col',\n 'bottom-right': 'bottom-0 right-0 items-end flex-col'\n};\n\n@Component({\n selector: 'ui-toaster',\n templateUrl: './toaster.component.html',\n styleUrl: './toaster.component.css',\n imports: [UiToastComponent, NgTemplateOutlet]\n})\nexport class UiToasterComponent {\n readonly position = input<ToasterPosition>('bottom-right');\n readonly timeoutMs = input<number | null>(null);\n\n protected readonly toastService = inject(UiToastService);\n\n protected readonly positionClasses = computed(() =>\n POSITION_CLASSES[this.position()]\n );\n}\n","<section\n class=\"z-50 box-content fixed flex px-4 py-2.5 w-full max-w-xs pointer-events-none\"\n [class]=\"positionClasses()\"\n aria-label=\"Notifications\"\n>\n @for (toast of toastService.toasts(); track toast.id) {\n <div\n class=\"ui-toaster--item\"\n animate.enter=\"ui-toaster--enter\"\n animate.leave=\"ui-toaster--leave\"\n >\n <div class=\"ui-toaster--item-inner\">\n <ui-toast\n class=\"block py-1.5 w-full pointer-events-auto\"\n [intent]=\"toast.intent\"\n [dismissable]=\"toast.dismissable\"\n [timeoutMs]=\"toast.timeoutMs === undefined ? timeoutMs() : toast.timeoutMs\"\n (dismissed)=\"toastService.dismiss(toast.id)\"\n >\n @if (typeof toast.message === 'string') {\n {{ toast.message }}\n } @else {\n <ng-container\n *ngTemplateOutlet=\"toast.message; context: toast.templateContext\"\n />\n }\n </ui-toast>\n </div>\n </div>\n }\n</section>\n","export const ToasterPositions = [\n 'top-left',\n 'top-center',\n 'top-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right'\n] as const;\n\nexport type ToasterPosition = typeof ToasterPositions[number];\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, contentChild, TemplateRef } from '@angular/core';\n\n\n@Component({\n selector: 'ui-layout',\n templateUrl: './layout.component.html',\n styleUrl: './layout.component.css',\n imports: [NgTemplateOutlet]\n})\nexport class UiLayoutComponent {\n readonly sidebar = contentChild<TemplateRef<unknown>>('sidebar');\n}\n","<div class=\"shrink-0\">\n <ng-container *ngTemplateOutlet=\"sidebar()\" />\n</div>\n\n<main class=\"min-w-0 overflow-y-auto grow\">\n <ng-content />\n</main>\n","import { Component, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-sidebar',\n exportAs: 'uiSidebar',\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.css',\n imports: [UiButtonComponent, NgIcon],\n host: {\n '[class.open]': 'isOpen()',\n '(document:keydown.escape)': 'isOpen.set(false)'\n }\n})\nexport class UiSidebarComponent {\n readonly isOpen = model<boolean>(false);\n\n readonly toggle = () => this.isOpen.update(isOpen => !isOpen);\n}\n","<div class=\"ui-sidebar-backdrop\" aria-hidden=\"true\" (click)=\"isOpen.set(false)\"></div>\n\n<aside class=\"ui-sidebar-panel\">\n <div class=\"ui-sidebar-content\">\n <ng-content />\n </div>\n\n <footer class=\"ui-sidebar-footer\">\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"p-2!\"\n (click)=\"toggle()\"\n >\n <ng-icon\n name=\"heroChevronDoubleLeft\"\n size=\"16\"\n strokeWidth=\"2\"\n class=\"duration-300 shrink-0\"\n [class.rotate-180]=\"!isOpen()\"\n />\n </ui-button>\n </footer>\n</aside>\n\n@if (!isOpen()) {\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n class=\"ui-sidebar-open-btn\"\n classes=\"p-3! rounded-full! shadow-lg!\"\n ariaLabel=\"Open sidebar\"\n (click)=\"isOpen.set(true)\"\n >\n <ng-icon name=\"heroBars3\" size=\"20\" strokeWidth=\"2\" class=\"shrink-0\" />\n </ui-button>\n}\n","import { Component, computed, inject, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiSidebarComponent } from '../sidebar/sidebar.component';\n\n\n@Component({\n selector: 'ui-sidebar-item',\n templateUrl: './sidebar-item.component.html',\n styleUrl: './sidebar-item.component.css',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiSidebarItemComponent {\n private readonly sidebar = inject(UiSidebarComponent, { optional: true });\n\n readonly label = input.required<string>();\n readonly icon = input<string>('');\n\n readonly isCollapsed = computed(() => this.sidebar ? !this.sidebar.isOpen() : false);\n}\n","@if (!isCollapsed() || icon()) {\n <ui-button\n appearance=\"ghost\"\n intent=\"secondary\"\n class=\"block\"\n [classes]=\"isCollapsed()\n ? 'ui-sidebar-item ui-sidebar-item--collapsed'\n : 'ui-sidebar-item'\"\n [ariaLabel]=\"isCollapsed() ? label() : ''\"\n >\n @if (icon()) {\n <ng-icon [name]=\"icon()\" size=\"20\" class=\"shrink-0\" />\n }\n\n @if (!isCollapsed()) {\n <span class=\"truncate\">{{ label() }}</span>\n\n <span class=\"empty:hidden ms-auto\">\n <ng-content select=\"ui-badge\" />\n </span>\n }\n </ui-button>\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n viewChild\n} from '@angular/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\nconst HEX_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n@Component({\n selector: 'ui-colour',\n templateUrl: './colour.component.html',\n imports: [UiInputComponent, UiInputGroupComponent, UiButtonComponent]\n})\nexport class UiColourComponent {\n readonly value = model<string>('#000000');\n\n readonly id = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly isValid = computed(() => HEX_PATTERN.test(this.value()));\n\n // the native picker only understands lowercase #rrggbb\n protected readonly pickerValue = computed(() => {\n if (!this.isValid()) {\n return '#000000';\n }\n\n const hex = this.value().slice(1).toLowerCase();\n\n return hex.length === 3\n ? '#' + [...hex].map(char => char + char).join('')\n : '#' + hex;\n });\n\n protected openPicker(): void {\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n this.value.set((event.target as HTMLInputElement).value);\n }\n}\n","<ui-input-group [validationState]=\"isValid() ? null : false\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n ariaLabel=\"Pick colour\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <span\n class=\"border border-gray-200 rounded size-5\"\n [style.background-color]=\"isValid() ? value() : 'transparent'\"\n ></span>\n </ui-button>\n\n <input\n #picker\n type=\"color\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [value]=\"pickerValue()\"\n [disabled]=\"disabled()\"\n (input)=\"handlePick($event)\"\n />\n\n <ui-input\n [(value)]=\"value\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [maxlength]=\"7\"\n [spellcheck]=\"false\"\n autocomplete=\"off\"\n placeholder=\"#000000\"\n />\n</ui-input-group>\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n contentChild,\n input,\n model,\n TemplateRef\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\n\n\n// todo\n// this component is just a number input with custom step buttons\n\n@Component({\n selector: 'ui-counter',\n templateUrl: './counter.component.html',\n imports: [UiInputComponent, NgTemplateOutlet, NgIcon]\n})\nexport class UiCounterComponent {\n readonly value = model<number | null>(null);\n readonly step = input<number>(1);\n readonly max = input<number>();\n readonly min = input<number>();\n readonly placeholder = input<string>('');\n\n // Leading/Trialing elements that appear inside of the input.\n readonly leadingElement = contentChild<TemplateRef<unknown>>('leading');\n readonly trailingElement = contentChild<TemplateRef<unknown>>('trailing');\n\n onStepUp() {\n let value = this.value() ?? 0;\n\n value += this.step();\n\n const max = this.max();\n\n if (max !== undefined && value > max) {\n value = max;\n }\n\n this.value.set(value);\n }\n\n onStepDown() {\n let value = this.value() ?? 0;\n\n value -= this.step();\n\n const min = this.min();\n\n if (min !== undefined && value < min) {\n value = min;\n }\n\n this.value.set(value);\n }\n}\n","<ui-input\n [(value)]=\"value\"\n [placeholder]=\"placeholder()\"\n type=\"number\"\n classes=\"[&::-webkit-inner-spin-button]:m-0 [&::-webkit-outer-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [appearance:textfield]\"\n>\n <ng-template #leading>\n <ng-container *ngTemplateOutlet=\"leadingElement()\" />\n </ng-template>\n <ng-template #trailing>\n <ng-container *ngTemplateOutlet=\"trailingElement()\" />\n\n <div class=\"flex self-stretch ms-2\">\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepUp()\"\n >\n <ng-icon name=\"heroPlus\" class=\"shrink-0\" />\n </button>\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8\"\n (click)=\"onStepDown()\"\n >\n <ng-icon name=\"heroMinus\" class=\"shrink-0\" />\n </button>\n </div>\n </ng-template>\n</ui-input>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n DateRange,\n IsoDate,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport { parseIsoDate } from '../../generic/calendar/calendar.utils';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-date-range-picker',\n templateUrl: './date-range-picker.component.html',\n styleUrl: './date-range-picker.component.css',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n NgIcon\n ],\n host: { class: 'block w-full' }\n})\nexport class UiDateRangePickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n readonly value = model<DateRange>({ start: null, end: null });\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select dates');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n /** Intl options for the dates shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions>({ dateStyle: 'medium' });\n\n /** Quick picks beside the calendar, see date-range-presets.ts for ready made ones. */\n readonly presets = input<DateRangePreset[]>([]);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly hasValue = computed(() => !!this.value().start);\n\n // worked out on open so \"today\" is never stale\n protected readonly presetRanges = computed(() =>\n this.isOpen() ? this.presets().map(preset => this.clamp(preset.range())) : []\n );\n\n protected readonly activePreset = computed(() => {\n const { start, end } = this.value();\n\n return this.presetRanges().findIndex(range =>\n range.start === start && range.end === end\n );\n });\n\n protected readonly display = computed(() => {\n const start = parseIsoDate(this.value().start);\n const end = parseIsoDate(this.value().end);\n const format = new Intl.DateTimeFormat(this.locale(), this.format());\n\n if (!start) {\n return '';\n }\n\n // formatRange shares the month/year, e.g. \"1 – 7 Sept 2026\"\n return end ? format.formatRange(start, end) : `${format.format(start)} – …`;\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handleRange(range: DateRange): void {\n // only close once both ends are picked\n if (range.start && range.end) {\n this.isOpen.set(false);\n this.focusInput();\n }\n }\n\n protected choosePreset(preset: DateRangePreset): void {\n this.value.set(this.clamp(preset.range()));\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set({ start: null, end: null });\n this.focusInput();\n }\n\n // keeps presets inside min/max, e.g. \"This year\" stops at today when max is today\n private clamp({ start, end }: DateRange): DateRange {\n const min = this.min();\n const max = this.max();\n\n return {\n start: start && min && start < min ? min : start,\n end: end && max && end > max ? max : end\n };\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendarDateRange\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && hasValue() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear dates\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <div class=\"ui-date-range-panel\">\n @if (presets().length) {\n <div class=\"ui-date-range-presets\" role=\"group\" aria-label=\"Quick ranges\">\n @for (preset of presets(); track preset.label; let index = $index) {\n <button\n type=\"button\"\n class=\"ui-date-range-preset ui-text-body-alt\"\n [attr.aria-pressed]=\"index === activePreset()\"\n (click)=\"choosePreset(preset)\"\n (keydown)=\"handlePanelKeydown($event)\"\n >\n {{ preset.label }}\n </button>\n }\n </div>\n }\n\n <ui-calendar\n class=\"p-3\"\n mode=\"range\"\n [(range)]=\"value\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (rangeChange)=\"handleRange($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n </div>\n </div>\n }\n</ui-dropdown>\n","import type { WeekStart } from '../../generic/calendar/calendar.types';\nimport { addDays, toIsoDate } from '../../generic/calendar/calendar.utils';\nimport type { DateRangePreset } from './date-range-picker.types';\n\n\n// everything is relative to the moment it's clicked, not when the page loaded\nconst today = () => {\n const now = new Date();\n\n return new Date(now.getFullYear(), now.getMonth(), now.getDate());\n};\n\nconst between = (start: Date, end: Date) => ({\n start: toIsoDate(start),\n end: toIsoDate(end)\n});\n\nexport function todayPreset(label = 'Today'): DateRangePreset {\n return { label, range: () => between(today(), today()) };\n}\n\n/** The last `days` days, counting today. */\nexport function lastDaysPreset(days: number, label = `Last ${days} days`): DateRangePreset {\n return { label, range: () => between(addDays(today(), 1 - days), today()) };\n}\n\nexport function thisWeekPreset(weekStart: WeekStart = 1, label = 'This week'): DateRangePreset {\n return {\n label,\n range: () => {\n const offset = (today().getDay() - weekStart + 7) % 7;\n const start = addDays(today(), -offset);\n\n return between(start, addDays(start, 6));\n }\n };\n}\n\n/** A calendar month, 0 is this month, -1 is last month. */\nexport function monthPreset(offset = 0, label = offset ? 'Last month' : 'This month'): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n\n return between(\n new Date(now.getFullYear(), now.getMonth() + offset, 1),\n new Date(now.getFullYear(), now.getMonth() + offset + 1, 0)\n );\n }\n };\n}\n\n/** A calendar year, 0 is this year, -1 is last year. */\nexport function yearPreset(offset = 0, label = offset ? 'Last year' : 'This year'): DateRangePreset {\n return {\n label,\n range: () => {\n const year = today().getFullYear() + offset;\n\n return between(new Date(year, 0, 1), new Date(year, 11, 31));\n }\n };\n}\n\n/**\n * A financial year starting on the given day, e.g. the UK tax year is\n * `financialYearPreset(3, 6)` for 6 April. 0 is the current one, -1 the one before.\n */\nexport function financialYearPreset(\n startMonth: number,\n startDay: number,\n offset = 0,\n label = offset ? 'Last financial year' : 'This financial year'\n): DateRangePreset {\n return {\n label,\n range: () => {\n const now = today();\n const thisYearsStart = new Date(now.getFullYear(), startMonth, startDay);\n\n // before this year's start date we're still in the one that began last year\n const startYear = now >= thisYearsStart ? now.getFullYear() : now.getFullYear() - 1;\n const start = new Date(startYear + offset, startMonth, startDay);\n const end = addDays(new Date(startYear + offset + 1, startMonth, startDay), -1);\n\n return between(start, end);\n }\n };\n}\n\n/** A sensible starting set, pass your own list to change it. */\nexport function defaultDateRangePresets(weekStart: WeekStart = 1): DateRangePreset[] {\n return [\n todayPreset(),\n lastDaysPreset(7),\n lastDaysPreset(30),\n thisWeekPreset(weekStart),\n monthPreset(0),\n monthPreset(-1),\n yearPreset(0),\n yearPreset(-1)\n ];\n}\n","import { booleanAttribute, Component, computed, input, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiSelectComponent } from '../../forms/select/select.component';\nimport { SelectLocalDataSource } from '../../forms/select/select.datasource';\nimport { parseTime, toTime } from '../../generic/calendar/calendar.utils';\n\n\n@Component({\n selector: 'ui-time-select',\n templateUrl: './time-select.component.html',\n styleUrl: './time-select.component.css',\n imports: [UiSelectComponent, NgIcon],\n host: { class: 'inline-flex items-center gap-x-1' }\n})\nexport class UiTimeSelectComponent {\n /** 24 hour \"HH:mm\" string. */\n readonly value = model<string>('00:00');\n\n readonly minuteStep = input<number>(5);\n readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly hours = computed(() => parseTime(this.value())?.hours ?? 0);\n protected readonly minutes = computed(() => parseTime(this.value())?.minutes ?? 0);\n\n protected readonly hourSource = new SelectLocalDataSource(\n Array.from({ length: 24 }, (_, hour) => hour),\n () => true\n );\n\n protected readonly minuteSource = computed(() => {\n const step = Math.max(1, Math.floor(this.minuteStep()));\n\n return new SelectLocalDataSource(\n Array.from({ length: Math.ceil(60 / step) }, (_, index) => index * step),\n () => true\n );\n });\n\n protected readonly pad = (value: number) => String(value).padStart(2, '0');\n\n protected setHours(hours: number | null): void {\n if (hours !== null) {\n this.value.set(toTime(hours, this.minutes()));\n }\n }\n\n protected setMinutes(minutes: number | null): void {\n if (minutes !== null) {\n this.value.set(toTime(this.hours(), minutes));\n }\n }\n}\n","<ng-icon name=\"heroClock\" class=\"me-1 text-muted-foreground-1 shrink-0\" />\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"hourSource\"\n [displayWith]=\"pad\"\n [pageSize]=\"24\"\n [selectedItem]=\"hours()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setHours($event)\"\n/>\n\n<span class=\"text-muted-foreground-1\" aria-hidden=\"true\">:</span>\n\n<ui-select\n class=\"ui-time-select-part\"\n [dataSource]=\"minuteSource()\"\n [displayWith]=\"pad\"\n [pageSize]=\"60\"\n [selectedItem]=\"minutes()\"\n [disabled]=\"disabled()\"\n (selectionChange)=\"setMinutes($event)\"\n/>\n","import {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport type { InputValidation } from '../../forms/input/input.types';\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCalendarComponent } from '../../generic/calendar/calendar.component';\nimport type {\n IsoDate,\n IsoDateTime,\n WeekStart\n} from '../../generic/calendar/calendar.types';\nimport {\n parseIsoDateTime,\n parseTime,\n toIsoDate\n} from '../../generic/calendar/calendar.utils';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { UiDropdownComponent } from '../../generic/dropdown/dropdown.component';\nimport { UiDropdownDirective } from '../../generic/dropdown/dropdown.directives';\nimport { UiTimeSelectComponent } from '../time-select/time-select.component';\n\n\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n@Component({\n selector: 'ui-datepicker',\n templateUrl: './datepicker.component.html',\n imports: [\n UiInputComponent,\n UiCalendarComponent,\n UiDropdownComponent,\n UiDropdownDirective,\n UiButtonComponent,\n UiTimeSelectComponent,\n NgIcon,\n UiCardComponent\n ],\n host: { class: 'block w-full' }\n})\nexport class UiDatepickerComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly injector = inject(Injector);\n\n /** \"2026-09-29\", or \"2026-09-29T14:30\" when `withTime` is on. */\n readonly value = model<IsoDate | IsoDateTime | null>(null);\n\n readonly id = input<string>('');\n readonly placeholder = input<string>('Select date');\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly clearable = input(true, { transform: booleanAttribute });\n readonly validationState = input<InputValidation>(null);\n readonly describedBy = input<string>('');\n\n readonly min = input<IsoDate | null>(null);\n readonly max = input<IsoDate | null>(null);\n readonly isDateDisabled = input<(date: IsoDate) => boolean>(() => false);\n readonly weekStart = input<WeekStart>(1);\n readonly locale = input<string>('en-GB');\n\n readonly withTime = input(false, { transform: booleanAttribute });\n readonly minuteStep = input<number>(5);\n\n /** Time used when a date is picked before a time has been chosen. */\n readonly defaultTime = input<string>('00:00');\n\n /** Intl options for the value shown in the input. */\n readonly format = input<Intl.DateTimeFormatOptions | null>(null);\n\n protected readonly isOpen = signal(false);\n\n private readonly calendar = viewChild(UiCalendarComponent);\n\n protected readonly datePart = computed(() =>\n this.value()?.slice(0, 10) ?? null\n );\n\n protected readonly timePart = computed(() => {\n const time = this.value()?.slice(11, 16);\n\n return parseTime(time) ? time! : this.defaultTime();\n });\n\n protected readonly display = computed(() => {\n const date = parseIsoDateTime(this.value());\n const format = this.format() ?? (this.withTime()\n ? { dateStyle: 'medium', timeStyle: 'short' } as const\n : { dateStyle: 'medium' } as const);\n\n return date\n ? new Intl.DateTimeFormat(this.locale(), format).format(date)\n : '';\n });\n\n protected toggle(): void {\n if (!this.disabled()) {\n this.isOpen.update(open => !open);\n }\n }\n\n protected handleInputKeydown(event: KeyboardEvent): void {\n if (this.disabled() || !OPEN_KEYS.includes(event.key)) {\n return;\n }\n\n event.preventDefault();\n this.isOpen.set(true);\n\n afterNextRender(() => this.calendar()?.focusActiveDate(), {\n injector: this.injector\n });\n }\n\n protected handlePick(date: IsoDate | null): void {\n if (!date) {\n return;\n }\n\n if (!this.withTime()) {\n this.value.set(date);\n this.close();\n return;\n }\n\n // stays open so the time can be set too\n this.value.set(`${date}T${this.timePart()}`);\n }\n\n protected handleTime(time: string): void {\n // picking a time first puts it on today\n const date = this.datePart() ?? toIsoDate(new Date());\n\n this.value.set(`${date}T${time}`);\n }\n\n protected close(): void {\n this.isOpen.set(false);\n this.focusInput();\n }\n\n protected handlePanelKeydown(event: KeyboardEvent): void {\n // the overlay closes itself on escape, we just put focus back\n if (event.key === 'Escape') {\n this.focusInput();\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the calendar\n event.stopPropagation();\n\n this.value.set(null);\n this.focusInput();\n }\n\n private focusInput(): void {\n this.host.nativeElement.querySelector('input')?.focus();\n }\n}\n","<ui-dropdown\n [isOpen]=\"isOpen\"\n placement=\"bottom-start\"\n closeBehaviour=\"whenClickOutside\"\n class=\"w-full\"\n>\n <ui-input\n [value]=\"display()\"\n [id]=\"id()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [describedBy]=\"describedBy()\"\n [ariaExpanded]=\"isOpen()\"\n ariaHasPopup=\"dialog\"\n [validationState]=\"validationState()\"\n classes=\"cursor-pointer\"\n autocomplete=\"off\"\n readonly\n (click)=\"toggle()\"\n (keydown)=\"handleInputKeydown($event)\"\n >\n <ng-template #leading>\n <ng-icon\n name=\"heroCalendar\"\n class=\"ms-3 text-muted-foreground-1 shrink-0\"\n />\n </ng-template>\n\n <ng-template #trailing>\n @if (clearable() && value() && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center self-stretch w-8 text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear date\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n\n @if (isOpen()) {\n <div uiDropdownContent class=\"py-2\">\n <ui-card radius=\"xl\" class=\"p-3\">\n <ui-calendar\n [value]=\"datePart()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [isDateDisabled]=\"isDateDisabled()\"\n [weekStart]=\"weekStart()\"\n [locale]=\"locale()\"\n (valueChange)=\"handlePick($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n @if (withTime()) {\n <div class=\"flex justify-between items-center gap-x-2 mt-3 pt-3 border-gray-200 border-t\">\n <ui-time-select\n [value]=\"timePart()\"\n [minuteStep]=\"minuteStep()\"\n (valueChange)=\"handleTime($event)\"\n (keydown)=\"handlePanelKeydown($event)\"\n />\n\n <ui-button size=\"sm\" (click)=\"close()\">Done</ui-button>\n </div>\n }\n </ui-card>\n </div>\n }\n</ui-dropdown>\n","import { Component, input, model } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport {\n ButtonAppearance,\n ButtonIntent\n} from '../../generic/button/button.types';\n\n\n@Component({\n selector: 'ui-dropdown-button',\n templateUrl: './dropdown-button.component.html',\n imports: [UiButtonComponent, NgIcon]\n})\nexport class UiDropdownButtonComponent {\n readonly intent = input<ButtonIntent>('secondary');\n readonly appearance = input<ButtonAppearance>('white');\n readonly icon = input<string>('heroChevronDown');\n readonly isOpen = model.required<boolean>();\n}\n","<ui-button\n [intent]=\"intent()\"\n [appearance]=\"appearance()\"\n (click)=\"isOpen.update(value => !value)\"\n>\n <ng-content />\n <ng-icon\n name=\"heroChevronDown\"\n class=\"size-4 transition-transform duration-100 shrink-0\"\n [class.rotate-180]=\"isOpen()\"\n />\n</ui-button>\n","import { Component, input } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport { UiButtonComponent } from '../../generic/button/button.component';\nimport { UiCardComponent } from '../../generic/card/card.component';\nimport { DropdownMenuItem } from './dropdown-menu.types';\n\n\n@Component({\n selector: 'ui-dropdown-menu',\n templateUrl: './dropdown-menu.component.html',\n imports: [UiButtonComponent, UiCardComponent, NgIcon]\n})\nexport class UiDropdownMenuComponent {\n readonly items = input.required<DropdownMenuItem[]>();\n}\n","<ui-card radius=\"lg\" class=\"divide-y w-3xs max-w-md\" role=\"menu\">\n @for (item of items(); track $index) {\n @if ('divider' in item) {\n <div class=\"my-1 border-border border-t\"></div>\n } @else if ('children' in item) {\n <div class=\"flex flex-col gap-y-0.5 p-1\">\n <span\n class=\"block px-4 pt-2 pb-1 font-medium text-muted-foreground ui-text-caption uppercase\"\n >\n {{ item.label }}\n </span>\n\n @for (child of item.children; track child.label) {\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"child.onClick()\"\n >\n @if (child.icon) {\n <ng-icon\n [name]=\"child.icon\"\n size=\"18\"\n strokeWidth=\"1.5\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ child.label }}\n </ui-button>\n }\n </div>\n } @else {\n <div class=\"p-1\">\n <ui-button\n appearance=\"none\"\n classes=\"flex items-center gap-x-3.5 px-3 py-2 rounded-lg ui-text-body-alt text-dropdown-item-foreground hover:bg-dropdown-item-hover focus:bg-dropdown-item-focus w-full border-transparent focus:outline-hidden!\"\n (click)=\"item.onClick()\"\n >\n @if (item.icon) {\n <ng-icon\n [name]=\"item.icon\"\n size=\"18\"\n strokeWidth=\"2\"\n class=\"size-4 shrink-0\"\n />\n }\n\n {{ item.label }}\n </ui-button>\n </div>\n }\n }\n</ui-card>\n","import {\n booleanAttribute,\n Component,\n computed,\n ElementRef,\n input,\n model,\n output,\n signal,\n viewChild\n} from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\n\nimport type { FileRejection } from '../../forms/file/file.types';\nimport { selectFiles } from '../../forms/file/file.utils';\nimport { UiInputComponent } from '../../forms/input/input.component';\nimport { UiInputGroupComponent } from '../../forms/input-group/input-group.component';\nimport { UiButtonComponent } from '../../generic/button/button.component';\n\n\n@Component({\n selector: 'ui-file-input',\n templateUrl: './file-input.component.html',\n imports: [\n UiInputComponent,\n UiInputGroupComponent,\n UiButtonComponent,\n NgIcon\n ]\n})\nexport class UiFileInputComponent {\n readonly value = model<File[]>([]);\n\n readonly id = input<string>('');\n readonly accept = input<string>('');\n readonly multiple = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly describedBy = input<string>('');\n\n /** Max size per file in bytes. */\n readonly maxSize = input<number | null>(null);\n\n readonly placeholder = input<string>('No file chosen');\n readonly buttonLabel = input<string>('Browse');\n\n readonly rejected = output<FileRejection[]>();\n\n private readonly picker = viewChild.required<ElementRef<HTMLInputElement>>(\n 'picker'\n );\n\n protected readonly hasRejection = signal(false);\n\n protected readonly summary = computed(() => {\n const files = this.value();\n\n return files.length > 1\n ? `${files.length} files`\n : files[0]?.name ?? '';\n });\n\n protected openPicker(): void {\n if (this.disabled()) {\n return;\n }\n\n const picker = this.picker().nativeElement;\n\n if (picker.showPicker) {\n picker.showPicker();\n } else {\n picker.click();\n }\n }\n\n protected handlePick(event: Event): void {\n const target = event.target as HTMLInputElement;\n const { accepted, rejected } = selectFiles(\n [...target.files ?? []],\n this.accept(),\n this.maxSize()\n );\n\n // reset so picking the same file again still fires change\n target.value = '';\n\n this.hasRejection.set(rejected.length > 0);\n\n if (rejected.length) {\n this.rejected.emit(rejected);\n }\n\n if (accepted.length) {\n this.value.set(accepted);\n }\n }\n\n protected clear(event: Event): void {\n // stop the input underneath from opening the picker\n event.stopPropagation();\n\n this.value.set([]);\n this.hasRejection.set(false);\n }\n}\n","<ui-input-group [validationState]=\"hasRejection() ? false : null\">\n <ui-button\n appearance=\"white\"\n intent=\"secondary\"\n size=\"sm\"\n classes=\"h-full\"\n [disabled]=\"disabled()\"\n (click)=\"openPicker()\"\n >\n <ng-icon name=\"heroArrowUpTray\" class=\"shrink-0\" />\n {{ buttonLabel() }}\n </ui-button>\n\n <input\n #picker\n type=\"file\"\n class=\"sr-only\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (change)=\"handlePick($event)\"\n />\n\n <ui-input\n [value]=\"summary()\"\n [id]=\"id()\"\n [disabled]=\"disabled()\"\n [placeholder]=\"placeholder()\"\n [describedBy]=\"describedBy()\"\n classes=\"truncate cursor-pointer\"\n readonly\n (click)=\"openPicker()\"\n >\n <ng-template #trailing>\n @if (value().length && !disabled()) {\n <button\n type=\"button\"\n class=\"inline-flex justify-center items-center w-8 self-stretch text-muted-foreground-1 hover:text-foreground\"\n aria-label=\"Clear files\"\n (click)=\"clear($event)\"\n >\n <ng-icon name=\"heroXMark\" class=\"shrink-0\" />\n </button>\n }\n </ng-template>\n </ui-input>\n</ui-input-group>\n","import { booleanAttribute, Component, input, model } from '@angular/core';\n\nimport { UiCheckboxComponent } from '../../forms/checkbox/checkbox.component';\n\n\n// restyles ui-checkbox into a track-and-thumb switch, same behaviour underneath\n@Component({\n selector: 'ui-switch',\n templateUrl: './switch.component.html',\n imports: [UiCheckboxComponent]\n})\nexport class UiSwitchComponent {\n readonly value = model.required<boolean>();\n\n readonly id = input<string>('');\n readonly name = input<string>('');\n readonly disabled = input(false, { transform: booleanAttribute });\n}\n","<label class=\"inline-flex items-center gap-2 cursor-pointer\" [class.opacity-50]=\"disabled()\">\n <span class=\"relative inline-flex items-center rounded-full focus-within:ring-2 focus-within:ring-primary-200/50\">\n <!--\n reuses ui-checkbox for the real state/behaviour, class-bound track/thumb below\n react to value() directly instead of peer-checked, since peer-* relies on the\n input and the styled element being real DOM siblings, which breaks once the\n input is nested inside ui-checkbox's own host element\n -->\n <ui-checkbox\n [(value)]=\"value\"\n [disabled]=\"disabled()\"\n [id]=\"id()\"\n [name]=\"name()\"\n classes=\"sr-only\"\n />\n\n <span\n class=\"w-9 h-5 rounded-full transition-colors\"\n [class.bg-primary-600]=\"value()\"\n [class.bg-gray-200]=\"!value()\"\n ></span>\n\n <span\n class=\"absolute left-0.5 size-4 rounded-full bg-white shadow transition-transform\"\n [class.translate-x-4]=\"value()\"\n ></span>\n </span>\n\n <ng-content />\n</label>\n"],"mappings":"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"}
|