@besaitech/ng-design-system 0.0.77 → 0.0.78

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"besaitech-ng-design-system-calendar.mjs","sources":["../../../projects/saitech-design-system/calendar/calendar-layout.ts","../../../projects/saitech-design-system/calendar/sds-event-calendar.ts","../../../projects/saitech-design-system/calendar/public-api.ts","../../../projects/saitech-design-system/calendar/besaitech-ng-design-system-calendar.ts"],"sourcesContent":["import { addDays, startOfDay } from '@besaitech/ng-design-system';\n\n/** Which span of time the calendar is showing. */\nexport type SdsEventCalendarView = 'month' | 'week' | '3day' | 'day';\n\n/**\n * How an event is tinted. These map onto the library's existing accent roles, so an event picks a\n * meaning-free hue — it is NOT a severity and NOT a status. Anything clinical that needs to say\n * \"how bad\" belongs in `sds-severity`, which has its own measured ramp.\n */\nexport type SdsEventColor = 'brand' | 'blue' | 'green' | 'amber' | 'red' | 'indigo' | 'neutral';\n\n/**\n * One thing on the calendar.\n *\n * <p>`start`/`end` are Dates or anything `new Date(...)` parses. Everything is computed in the\n * BROWSER's timezone: a calendar shows a person their own day, and converting on the way in is the\n * caller's job if their data says otherwise.\n */\nexport interface SdsCalendarEvent<T = unknown> {\n id: string;\n title: string;\n start: Date | string | number;\n /** Defaults to `start` + `defaultMinutes` when absent — a zero-length block is unclickable. */\n end?: Date | string | number;\n /** Second line, shown where there is room: a room, a reason, a phone number. */\n subtitle?: string;\n allDay?: boolean;\n color?: SdsEventColor;\n /** Struck through and faded — a cancelled appointment is still part of the day's record. */\n cancelled?: boolean;\n /** Whatever the caller wants back on click. The component never reads it. */\n meta?: T;\n}\n\n/** An event resolved to real Dates, with its place in the grid worked out. */\nexport interface PlacedEvent<T = unknown> {\n event: SdsCalendarEvent<T>;\n start: Date;\n end: Date;\n /** 0..1 of the visible day height. */\n top: number;\n height: number;\n /** 0..1 across the column: side-by-side layout for events sharing a time. */\n left: number;\n width: number;\n}\n\nconst MS_PER_MINUTE = 60_000;\n\nexport function toDate(value: Date | string | number): Date {\n return value instanceof Date ? new Date(value.getTime()) : new Date(value);\n}\n\n/** Minutes since local midnight. Read off the clock, never from an epoch difference — see below. */\nexport function minutesOfDay(d: Date): number {\n return d.getHours() * 60 + d.getMinutes();\n}\n\nexport function startOfWeek(d: Date, firstDayOfWeek: number): Date {\n const day = startOfDay(d);\n const shift = (day.getDay() - firstDayOfWeek + 7) % 7;\n return addDays(day, -shift);\n}\n\n/**\n * The days a view shows.\n *\n * <p>`month` is always a 6×7 block, never 4–6 ragged rows: a grid that changes height as you page\n * through the year makes everything below it jump.\n */\nexport function visibleDays(\n view: SdsEventCalendarView,\n date: Date,\n firstDayOfWeek: number,\n): Date[] {\n if (view === 'day') {\n return [startOfDay(date)];\n }\n if (view === '3day') {\n const from = startOfDay(date);\n return [0, 1, 2].map((i) => addDays(from, i));\n }\n if (view === 'week') {\n const from = startOfWeek(date, firstDayOfWeek);\n return Array.from({ length: 7 }, (_, i) => addDays(from, i));\n }\n const first = new Date(date.getFullYear(), date.getMonth(), 1);\n const from = startOfWeek(first, firstDayOfWeek);\n return Array.from({ length: 42 }, (_, i) => addDays(from, i));\n}\n\n/** The half-open range a view covers — what a host should fetch for. */\nexport function visibleRange(\n view: SdsEventCalendarView,\n date: Date,\n firstDayOfWeek: number,\n): { start: Date; end: Date } {\n const days = visibleDays(view, date, firstDayOfWeek);\n return { start: days[0], end: addDays(days[days.length - 1], 1) };\n}\n\n/** Paging: one month, one week, three days or one day at a time, in the view's own unit. */\nexport function step(view: SdsEventCalendarView, date: Date, direction: 1 | -1): Date {\n switch (view) {\n case 'month': {\n const d = new Date(date.getFullYear(), date.getMonth() + direction, 1);\n return d;\n }\n case 'week':\n return addDays(date, 7 * direction);\n case '3day':\n return addDays(date, 3 * direction);\n default:\n return addDays(date, direction);\n }\n}\n\n/** Whether an event touches a given day at all. Half-open: an event ending at 00:00 is not there. */\nexport function occursOn(start: Date, end: Date, day: Date): boolean {\n const from = startOfDay(day).getTime();\n const to = addDays(startOfDay(day), 1).getTime();\n return start.getTime() < to && end.getTime() > from;\n}\n\n/**\n * Place one day's timed events in the grid, side by side where they overlap.\n *\n * <p>The classic column packing: events are clustered into runs that transitively overlap, each\n * takes the leftmost column that is free at its time, and the whole cluster is then divided by the\n * widest point. So two appointments at 09:00 each take half the width and a third takes a third —\n * and a 14:00 appointment with nothing beside it is full width, because it is in its own cluster.\n *\n * <p><b>Vertical position is read off the clock, not from an epoch difference.</b> On the two days a\n * year when the clocks move, a 09:00–10:00 appointment is still drawn at 09:00 and one hour tall;\n * computing it from elapsed milliseconds would slide every event after the change by an hour.\n *\n * <p>Events are clipped to the visible window rather than dropped: a night shift starting at 06:00\n * on a grid that opens at 08:00 should still show, flush to the top, not vanish.\n */\nexport function placeDay<T>(\n events: readonly SdsCalendarEvent<T>[],\n day: Date,\n startHour: number,\n endHour: number,\n defaultMinutes: number,\n): PlacedEvent<T>[] {\n const windowStart = startHour * 60;\n const windowEnd = endHour * 60;\n const span = Math.max(1, windowEnd - windowStart);\n const dayStart = startOfDay(day);\n const nextDay = addDays(dayStart, 1);\n\n const resolved = events\n .map((event) => {\n const start = toDate(event.start);\n const end = event.end\n ? toDate(event.end)\n : new Date(start.getTime() + defaultMinutes * MS_PER_MINUTE);\n return { event, start, end };\n })\n .filter((e) => !e.event.allDay && occursOn(e.start, e.end, day))\n .map((e) => {\n // Clip to this day first, so a block running past midnight is drawn on both days correctly.\n const from = e.start < dayStart ? dayStart : e.start;\n const to = e.end > nextDay ? nextDay : e.end;\n const fromMin = from.getTime() === dayStart.getTime() ? 0 : minutesOfDay(from);\n const toMin = to.getTime() === nextDay.getTime() ? 24 * 60 : minutesOfDay(to);\n return { ...e, fromMin, toMin: Math.max(toMin, fromMin + 1) };\n })\n .filter((e) => e.toMin > windowStart && e.fromMin < windowEnd)\n .sort((a, b) => a.fromMin - b.fromMin || b.toMin - a.toMin);\n\n // Cluster transitively overlapping events; each cluster is divided independently.\n const placed: PlacedEvent<T>[] = [];\n let cluster: typeof resolved = [];\n let clusterEnd = -1;\n\n const flush = () => {\n if (!cluster.length) return;\n const columnEnds: number[] = [];\n const columnOf = new Map<(typeof cluster)[number], number>();\n for (const item of cluster) {\n let column = columnEnds.findIndex((endMin) => endMin <= item.fromMin);\n if (column === -1) {\n column = columnEnds.length;\n }\n columnEnds[column] = item.toMin;\n columnOf.set(item, column);\n }\n const columns = columnEnds.length;\n for (const item of cluster) {\n const top = (Math.max(item.fromMin, windowStart) - windowStart) / span;\n const bottom = (Math.min(item.toMin, windowEnd) - windowStart) / span;\n const column = columnOf.get(item) ?? 0;\n placed.push({\n event: item.event,\n start: item.start,\n end: item.end,\n top,\n height: Math.max(bottom - top, 0.012),\n left: column / columns,\n width: 1 / columns,\n });\n }\n cluster = [];\n clusterEnd = -1;\n };\n\n for (const item of resolved) {\n if (cluster.length && item.fromMin >= clusterEnd) {\n flush();\n }\n cluster.push(item);\n clusterEnd = Math.max(clusterEnd, item.toMin);\n }\n flush();\n return placed;\n}\n\n/** The all-day (and multi-day) events touching a given day, in a stable order. */\nexport function allDayOn<T>(\n events: readonly SdsCalendarEvent<T>[],\n day: Date,\n defaultMinutes: number,\n): SdsCalendarEvent<T>[] {\n return events\n .map((event) => {\n const start = toDate(event.start);\n const end = event.end\n ? toDate(event.end)\n : new Date(start.getTime() + defaultMinutes * MS_PER_MINUTE);\n return { event, start, end };\n })\n .filter((e) => e.event.allDay && occursOn(e.start, e.end, day))\n .sort((a, b) => a.start.getTime() - b.start.getTime())\n .map((e) => e.event);\n}\n\n/** Every event touching a day, all-day first then by start — what a month cell lists. */\nexport function eventsOn<T>(\n events: readonly SdsCalendarEvent<T>[],\n day: Date,\n defaultMinutes: number,\n): SdsCalendarEvent<T>[] {\n return events\n .map((event) => {\n const start = toDate(event.start);\n const end = event.end\n ? toDate(event.end)\n : new Date(start.getTime() + defaultMinutes * MS_PER_MINUTE);\n return { event, start, end };\n })\n .filter((e) => occursOn(e.start, e.end, day))\n .sort(\n (a, b) =>\n Number(!!b.event.allDay) - Number(!!a.event.allDay) ||\n a.start.getTime() - b.start.getTime(),\n )\n .map((e) => e.event);\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n addDays,\n isSameDay,\n SdsIcon,\n SdsSegmented,\n SdsSegmentedOption,\n startOfDay,\n} from '@besaitech/ng-design-system';\nimport {\n allDayOn,\n eventsOn,\n minutesOfDay,\n PlacedEvent,\n placeDay,\n SdsCalendarEvent,\n SdsEventCalendarView,\n SdsEventColor,\n step,\n toDate,\n visibleDays,\n visibleRange,\n} from './calendar-layout';\n\nexport type { SdsCalendarEvent, SdsEventCalendarView, SdsEventColor };\n\n/** A click on empty time: what a host turns into \"new appointment\". */\nexport interface SdsCalendarSlot {\n start: Date;\n end: Date;\n}\n\nexport interface SdsCalendarRange {\n start: Date;\n end: Date;\n view: SdsEventCalendarView;\n}\n\n/** Written out in full — a composed `bg-accent-${c}-soft` would produce no CSS. See sds-severity. */\nconst CHIP: Record<SdsEventColor, string> = {\n brand: 'bg-brand-500/15 text-brand-700 dark:text-brand-200 border-brand-500/40',\n blue: 'bg-accent-blue-soft text-accent-blue border-accent-blue/40',\n green: 'bg-accent-green-soft text-accent-green border-accent-green/40',\n amber: 'bg-accent-amber-soft text-accent-amber border-accent-amber/40',\n red: 'bg-accent-red-soft text-accent-red border-accent-red/40',\n indigo: 'bg-accent-indigo-soft text-accent-indigo border-accent-indigo/40',\n neutral: 'bg-muted text-ink-soft border-border',\n};\n\nconst DOT: Record<SdsEventColor, string> = {\n brand: 'bg-brand-500',\n blue: 'bg-accent-blue',\n green: 'bg-accent-green',\n amber: 'bg-accent-amber',\n red: 'bg-accent-red',\n indigo: 'bg-accent-indigo',\n neutral: 'bg-ink-faint',\n};\n\n/**\n * A calendar of events — month, week, three days or one day.\n *\n * <p><b>Not {@link SdsCalendar}</b>, which is the month grid inside the date picker and exists to\n * pick a date. This one shows what is ON the days, and it owns no data: the host passes `events`\n * and listens to `rangeChange` to fetch the next lot.\n *\n * <p><b>It stores nothing and decides nothing.</b> `view` and `date` are two-way models, so the\n * host can deep-link a view or restore one; every interaction is an output. That is what lets the\n * same component serve a doctor's diary, a room's bookings or a delivery schedule without knowing\n * what any of them are.\n *\n * <p><b>Dates come from `Intl`, control words come from you.</b> Day and month names follow\n * `[locale]` automatically, so the part that is genuinely per-language needs no wiring — but\n * \"Today\", \"All day\" and \"+2 more\" are inputs with English defaults, and a non-English app MUST\n * pass them. An icon-only control's accessible name is the only name it has.\n *\n * <p><b>Mobile.</b> The week view keeps a readable minimum column width and scrolls sideways under\n * its own header rather than squeezing seven columns onto a phone; the month view drops from chips\n * to dots below `sm`. Both are CSS, so there is no resize listener to get wrong and no layout that\n * depends on JavaScript having run.\n *\n * @example\n * <sds-event-calendar\n * [events]=\"appointments()\"\n * [(view)]=\"view\"\n * [(date)]=\"focused\"\n * [todayLabel]=\"'calendar.today' | translate\"\n * (eventClick)=\"open($event)\"\n * (rangeChange)=\"load($event)\" />\n */\n@Component({\n selector: 'sds-event-calendar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdsIcon, SdsSegmented],\n host: { class: 'block' },\n template: `\n <div class=\"flex flex-col overflow-hidden rounded-card border border-border bg-surface\">\n @if (showToolbar()) {\n <div class=\"flex flex-wrap items-center gap-x-3 gap-y-2 border-b border-border px-3 py-2.5\">\n <div class=\"flex shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n [attr.aria-label]=\"previousLabel()\"\n [title]=\"previousLabel()\"\n class=\"inline-flex size-8 items-center justify-center rounded-control text-ink-soft transition-colors hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n (click)=\"move(-1)\"\n >\n <sds-icon name=\"chevron-left\" [size]=\"18\" />\n </button>\n <button\n type=\"button\"\n class=\"inline-flex h-8 items-center rounded-control border border-border px-3 text-sm font-medium text-ink transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n (click)=\"goToday()\"\n >\n {{ todayLabel() }}\n </button>\n <button\n type=\"button\"\n [attr.aria-label]=\"nextLabel()\"\n [title]=\"nextLabel()\"\n class=\"inline-flex size-8 items-center justify-center rounded-control text-ink-soft transition-colors hover:bg-muted hover:text-ink focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n (click)=\"move(1)\"\n >\n <sds-icon name=\"chevron-right\" [size]=\"18\" />\n </button>\n </div>\n\n <h2 class=\"min-w-0 flex-1 truncate text-sm font-semibold text-ink sm:text-base\">\n {{ title() }}\n </h2>\n\n @if (showViewSwitcher()) {\n <sds-segmented\n size=\"sm\"\n [ariaLabel]=\"viewSwitcherLabel()\"\n [options]=\"viewOptions()\"\n [value]=\"view()\"\n (valueChange)=\"setView($event)\"\n />\n }\n </div>\n }\n\n @if (view() === 'month') {\n <!-- ------------------------------------------------------------------ month -->\n <div class=\"grid grid-cols-7 border-b border-border bg-muted/50\">\n @for (d of weekdayNames(); track $index) {\n <div class=\"px-1 py-1.5 text-center text-[11px] font-medium text-ink-soft\">\n {{ d }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-7 grid-rows-6\" [style.height]=\"height()\">\n @for (day of days(); track day.getTime()) {\n <div\n class=\"flex min-w-0 flex-col gap-0.5 border-t border-l border-border p-1 first:border-l-0 [&:nth-child(7n+1)]:border-l-0\"\n [class.bg-muted]=\"!inFocusedMonth(day)\"\n [class.opacity-60]=\"!inFocusedMonth(day)\"\n >\n <button\n type=\"button\"\n class=\"self-start rounded-full px-1.5 text-[11px] font-medium transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500\"\n [class]=\"\n isToday(day) ? 'bg-brand-500 text-white hover:bg-brand-600' : 'text-ink-soft'\n \"\n (click)=\"dayClick.emit(day)\"\n >\n {{ day.getDate() }}\n </button>\n\n <!-- Phones get dots: four chips in a 48px-wide cell is four unreadable smears. -->\n <div class=\"flex flex-wrap items-center gap-0.5 px-0.5 sm:hidden\">\n @for (e of cellEvents(day).slice(0, 4); track e.id) {\n <span [class]=\"dotClass(e) + ' size-1.5 rounded-full'\" aria-hidden=\"true\"></span>\n }\n @if (cellEvents(day).length) {\n <span class=\"sr-only\">{{ cellEvents(day).length }}</span>\n }\n </div>\n\n <div class=\"hidden min-h-0 flex-col gap-0.5 overflow-hidden sm:flex\">\n @for (e of cellEvents(day).slice(0, maxPerCell()); track e.id) {\n <button\n type=\"button\"\n [class]=\"\n chipClass(e) + ' truncate rounded border px-1 py-px text-left text-[11px]'\n \"\n [class.line-through]=\"e.cancelled\"\n [class.opacity-60]=\"e.cancelled\"\n (click)=\"eventClick.emit(e)\"\n >\n @if (!e.allDay) {\n <span class=\"tabular-nums opacity-80\">{{ clock(e.start) }}</span>\n }\n {{ e.title }}\n </button>\n }\n @if (cellEvents(day).length > maxPerCell()) {\n <button\n type=\"button\"\n class=\"px-1 text-left text-[11px] font-medium text-ink-soft hover:text-ink\"\n (click)=\"dayClick.emit(day)\"\n >\n {{\n moreLabel().replace('{count}', '' + (cellEvents(day).length - maxPerCell()))\n }}\n </button>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <!-- ------------------------------------------------- week / 3 days / one day -->\n <div class=\"overflow-x-auto\">\n <div [style.min-width.px]=\"minWidth()\">\n <div class=\"grid border-b border-border\" [style.grid-template-columns]=\"columns()\">\n <div class=\"border-r border-border\"></div>\n @for (day of days(); track day.getTime()) {\n <button\n type=\"button\"\n class=\"flex flex-col items-center gap-0.5 px-1 py-1.5 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-brand-500\"\n (click)=\"dayClick.emit(day)\"\n >\n <span class=\"text-[11px] uppercase text-ink-faint\">{{ shortWeekday(day) }}</span>\n <span\n class=\"inline-flex size-6 items-center justify-center rounded-full text-sm font-semibold\"\n [class]=\"isToday(day) ? 'bg-brand-500 text-white' : 'text-ink'\"\n >\n {{ day.getDate() }}\n </span>\n </button>\n }\n </div>\n\n @if (hasAllDay()) {\n <div class=\"grid border-b border-border\" [style.grid-template-columns]=\"columns()\">\n <div\n class=\"border-r border-border px-1 py-1 text-right text-[10px] leading-tight text-ink-faint\"\n >\n {{ allDayLabel() }}\n </div>\n @for (day of days(); track day.getTime()) {\n <div class=\"flex min-w-0 flex-col gap-0.5 p-1\">\n @for (e of allDayEvents(day); track e.id) {\n <button\n type=\"button\"\n [class]=\"\n chipClass(e) + ' truncate rounded border px-1 py-px text-left text-[11px]'\n \"\n [class.line-through]=\"e.cancelled\"\n (click)=\"eventClick.emit(e)\"\n >\n {{ e.title }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"overflow-y-auto\" [style.height]=\"height()\">\n <div class=\"grid\" [style.grid-template-columns]=\"columns()\">\n <div class=\"relative border-r border-border\" [style.height.px]=\"bodyHeight()\">\n @for (h of hours(); track h) {\n <span\n class=\"absolute right-1.5 -translate-y-1/2 text-[10px] tabular-nums text-ink-faint\"\n [style.top.px]=\"hourTop(h)\"\n >\n {{ hourLabel(h) }}\n </span>\n }\n </div>\n\n @for (day of days(); track day.getTime()) {\n <div\n class=\"relative border-r border-border last:border-r-0\"\n [style.height.px]=\"bodyHeight()\"\n (click)=\"onGridClick($event, day)\"\n >\n @for (h of hours(); track h) {\n <div\n class=\"pointer-events-none absolute inset-x-0 border-t border-border/70\"\n [style.top.px]=\"hourTop(h)\"\n ></div>\n }\n\n @if (nowIndicator() && isToday(day) && nowTop() !== null) {\n <div\n class=\"pointer-events-none absolute inset-x-0 z-20 flex items-center\"\n [style.top.px]=\"nowTop()\"\n aria-hidden=\"true\"\n >\n <span class=\"size-2 shrink-0 rounded-full bg-danger\"></span>\n <span class=\"h-px flex-1 bg-danger\"></span>\n </div>\n }\n\n @for (p of placed(day); track p.event.id) {\n <button\n type=\"button\"\n [class]=\"\n chipClass(p.event) +\n ' absolute z-10 overflow-hidden rounded border px-1 py-0.5 text-left transition-shadow hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand-500'\n \"\n [class.line-through]=\"p.event.cancelled\"\n [class.opacity-60]=\"p.event.cancelled\"\n [style.top.%]=\"p.top * 100\"\n [style.height.%]=\"p.height * 100\"\n [style.left.%]=\"p.left * 100\"\n [style.width.%]=\"p.width * 100\"\n [attr.aria-label]=\"\n p.event.title + ', ' + clock(p.start) + ' – ' + clock(p.end)\n \"\n (click)=\"onEventClick($event, p)\"\n >\n <span class=\"block truncate text-[11px] font-medium leading-tight\">\n {{ p.event.title }}\n </span>\n @if (p.height > 0.045) {\n <span class=\"block truncate text-[10px] leading-tight opacity-80\">\n {{ clock(p.start) }}\n @if (p.event.subtitle) {\n · {{ p.event.subtitle }}\n }\n </span>\n }\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n})\nexport class SdsEventCalendar<T = unknown> {\n private readonly destroyRef = inject(DestroyRef);\n\n readonly events = input<readonly SdsCalendarEvent<T>[]>([]);\n /** Two-way: the host can deep-link or restore a view. */\n readonly view = model<SdsEventCalendarView>('week');\n /** Two-way: any day inside the span being shown. */\n readonly date = model<Date>(new Date());\n\n /** 1 = Monday (the European week), 0 = Sunday. */\n readonly firstDayOfWeek = input(1, { transform: numberAttribute });\n /** The hours the time grid shows. Events outside are clipped to the edge, never dropped. */\n readonly startHour = input(7, { transform: numberAttribute });\n readonly endHour = input(20, { transform: numberAttribute });\n readonly hourHeight = input(48, { transform: numberAttribute });\n /** How long an event with no `end` is assumed to last. */\n readonly defaultMinutes = input(30, { transform: numberAttribute });\n /** CSS height of the scrolling body (month: of the whole grid). */\n readonly height = input('32rem');\n /** BCP-47 tag for day and month names. Empty follows the browser. */\n readonly locale = input('');\n readonly nowIndicator = input(true, { transform: booleanAttribute });\n readonly showToolbar = input(true, { transform: booleanAttribute });\n readonly showViewSwitcher = input(true, { transform: booleanAttribute });\n /** Chips per month cell before it collapses to \"+N\". */\n readonly maxPerCell = input(3, { transform: numberAttribute });\n\n /** Control words. English defaults — a non-English app must pass every one of these. */\n readonly todayLabel = input('Today');\n readonly previousLabel = input('Previous');\n readonly nextLabel = input('Next');\n readonly allDayLabel = input('All day');\n /** `{count}` is substituted. */\n readonly moreLabel = input('+{count} more');\n readonly viewSwitcherLabel = input('View');\n readonly monthLabel = input('Month');\n readonly weekLabel = input('Week');\n readonly threeDayLabel = input('3 days');\n readonly dayLabel = input('Day');\n\n readonly eventClick = output<SdsCalendarEvent<T>>();\n /** A click on empty time, snapped to the hour that was clicked. */\n readonly slotClick = output<SdsCalendarSlot>();\n readonly dayClick = output<Date>();\n /** The span now on screen — fetch for this. Fires whenever the view or the date moves. */\n readonly rangeChange = output<SdsCalendarRange>();\n\n /** Ticks the now-indicator. One timer, cleared with the component. */\n private readonly now = signal(new Date());\n\n constructor() {\n const timer = setInterval(() => this.now.set(new Date()), 60_000);\n this.destroyRef.onDestroy(() => clearInterval(timer));\n\n /*\n * Announce the visible span whenever it changes, HOWEVER it changed. Emitting from the toolbar\n * handlers instead would look identical until a host moved `date` itself — a deep link, a\n * \"jump to this appointment\", restoring a remembered day — and then the calendar would show a\n * week nobody fetched. The models are two-way, so the host is a first-class navigator.\n */\n effect(() => {\n const view = this.view();\n const { start, end } = visibleRange(view, this.date(), this.firstDayOfWeek());\n untracked(() => this.rangeChange.emit({ start, end, view }));\n });\n }\n\n protected readonly days = computed(() =>\n visibleDays(this.view(), this.date(), this.firstDayOfWeek()),\n );\n\n protected readonly hours = computed(() => {\n const out: number[] = [];\n for (let h = this.startHour(); h <= this.endHour(); h++) out.push(h);\n return out;\n });\n\n protected readonly bodyHeight = computed(\n () => Math.max(1, this.endHour() - this.startHour()) * this.hourHeight(),\n );\n\n protected readonly columns = computed(\n () => `3.25rem repeat(${this.days().length}, minmax(0, 1fr))`,\n );\n\n /** Keeps a day column readable on a phone; the grid scrolls sideways instead of squeezing. */\n protected readonly minWidth = computed(() => {\n const perDay = this.days().length > 3 ? 92 : 120;\n return 52 + this.days().length * perDay;\n });\n\n private readonly intl = computed(() => this.locale() || undefined);\n\n protected readonly weekdayNames = computed(() => {\n const fmt = new Intl.DateTimeFormat(this.intl(), { weekday: 'short' });\n const base = startOfDay(new Date(2024, 0, 7)); // a Sunday\n return Array.from({ length: 7 }, (_, i) =>\n fmt.format(addDays(base, (this.firstDayOfWeek() + i) % 7)),\n );\n });\n\n protected readonly title = computed(() => {\n const days = this.days();\n const view = this.view();\n if (view === 'day') {\n return new Intl.DateTimeFormat(this.intl(), {\n weekday: 'long',\n day: 'numeric',\n month: 'long',\n year: 'numeric',\n }).format(days[0]);\n }\n if (view === 'month') {\n return new Intl.DateTimeFormat(this.intl(), { month: 'long', year: 'numeric' }).format(\n this.date(),\n );\n }\n const first = days[0];\n const last = days[days.length - 1];\n const sameMonth = first.getMonth() === last.getMonth();\n const short = new Intl.DateTimeFormat(this.intl(), { day: 'numeric', month: 'short' });\n const long = new Intl.DateTimeFormat(this.intl(), {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n });\n return sameMonth\n ? `${first.getDate()} – ${long.format(last)}`\n : `${short.format(first)} – ${long.format(last)}`;\n });\n\n protected readonly viewOptions = computed<SdsSegmentedOption[]>(() => [\n { value: 'month', label: this.monthLabel() },\n { value: 'week', label: this.weekLabel() },\n { value: '3day', label: this.threeDayLabel() },\n { value: 'day', label: this.dayLabel() },\n ]);\n\n protected readonly hasAllDay = computed(() =>\n this.days().some((d) => allDayOn(this.events(), d, this.defaultMinutes()).length > 0),\n );\n\n protected readonly nowTop = computed(() => {\n const minutes = minutesOfDay(this.now());\n const from = this.startHour() * 60;\n const to = this.endHour() * 60;\n if (minutes < from || minutes > to) return null;\n return ((minutes - from) / 60) * this.hourHeight();\n });\n\n protected placed(day: Date): PlacedEvent<T>[] {\n return placeDay(this.events(), day, this.startHour(), this.endHour(), this.defaultMinutes());\n }\n\n protected allDayEvents(day: Date): SdsCalendarEvent<T>[] {\n return allDayOn(this.events(), day, this.defaultMinutes());\n }\n\n protected cellEvents(day: Date): SdsCalendarEvent<T>[] {\n return eventsOn(this.events(), day, this.defaultMinutes());\n }\n\n protected isToday(day: Date): boolean {\n return isSameDay(day, this.now());\n }\n\n protected inFocusedMonth(day: Date): boolean {\n return day.getMonth() === this.date().getMonth();\n }\n\n protected shortWeekday(day: Date): string {\n return new Intl.DateTimeFormat(this.intl(), { weekday: 'short' }).format(day);\n }\n\n protected hourLabel(hour: number): string {\n return new Intl.DateTimeFormat(this.intl(), { hour: 'numeric', minute: '2-digit' }).format(\n new Date(2024, 0, 1, hour, 0),\n );\n }\n\n protected clock(value: Date | string | number): string {\n return new Intl.DateTimeFormat(this.intl(), { hour: '2-digit', minute: '2-digit' }).format(\n toDate(value),\n );\n }\n\n protected hourTop(hour: number): number {\n return (hour - this.startHour()) * this.hourHeight();\n }\n\n protected chipClass(e: SdsCalendarEvent<T>): string {\n return CHIP[e.color ?? 'brand'];\n }\n\n protected dotClass(e: SdsCalendarEvent<T>): string {\n return DOT[e.color ?? 'brand'];\n }\n\n protected setView(next: unknown): void {\n this.view.set(next as SdsEventCalendarView);\n }\n\n protected move(direction: 1 | -1): void {\n this.date.set(step(this.view(), this.date(), direction));\n }\n\n protected goToday(): void {\n this.date.set(new Date());\n }\n\n /** A click on empty grid becomes a slot of `defaultMinutes`, snapped to the hour clicked. */\n protected onGridClick(event: MouseEvent, day: Date): void {\n const host = event.currentTarget as HTMLElement;\n const y = event.clientY - host.getBoundingClientRect().top;\n const minutes = this.startHour() * 60 + (y / this.hourHeight()) * 60;\n const snapped = Math.floor(minutes / this.defaultMinutes()) * this.defaultMinutes();\n const start = new Date(startOfDay(day).getTime() + snapped * 60_000);\n this.slotClick.emit({\n start,\n end: new Date(start.getTime() + this.defaultMinutes() * 60_000),\n });\n }\n\n protected onEventClick(event: MouseEvent, placed: PlacedEvent<T>): void {\n // Without this the click falls through to the grid and also opens \"new appointment\".\n event.stopPropagation();\n this.eventClick.emit(placed.event);\n }\n}\n","/*\n * @besaitech/ng-design-system/calendar — the event calendar, kept OUT of the main entry point.\n *\n * Same reason the chart family has its own: a consuming app that never shows a calendar should not\n * carry one. It is reachable from a lazy route, but the library is one ES module, so anything the\n * primary entry point exports is linked into whatever bundle already imports from it — measured at\n * roughly 28 kB landing in medicware-clinic's INITIAL bundle, past its budget, for a screen behind\n * a lazy route. A separate entry point is what actually makes it lazy.\n */\nexport * from './calendar-layout';\nexport * from './sds-event-calendar';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -3984,7 +3984,7 @@ const VARIANTS$1 = {
3984
3984
  warning: 'bg-accent-amber-soft text-accent-amber border-transparent',
3985
3985
  danger: 'bg-accent-red-soft text-accent-red border-transparent',
3986
3986
  };
3987
- const DOT = {
3987
+ const DOT$1 = {
3988
3988
  neutral: 'bg-ink-faint',
3989
3989
  brand: 'bg-brand-500',
3990
3990
  info: 'bg-accent-blue',
@@ -4005,7 +4005,7 @@ class SdsBadge {
4005
4005
  : 'px-2.5 py-1 text-[11px]';
4006
4006
  return `${VARIANTS$1[this.variant()]} ${size}`;
4007
4007
  }, ...(ngDevMode ? [{ debugName: "classes" }] : []));
4008
- dotClass = computed(() => DOT[this.variant()], ...(ngDevMode ? [{ debugName: "dotClass" }] : []));
4008
+ dotClass = computed(() => DOT$1[this.variant()], ...(ngDevMode ? [{ debugName: "dotClass" }] : []));
4009
4009
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
4010
4010
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsBadge, isStandalone: true, selector: "sds-badge", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, dot: { classPropertyName: "dot", publicName: "dot", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex" }, ngImport: i0, template: `
4011
4011
  <span
@@ -5661,6 +5661,171 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
5661
5661
  }]
5662
5662
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], image: [{ type: i0.Input, args: [{ isSignal: true, alias: "image", required: false }] }], imageAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageAlt", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], note: [{ type: i0.Input, args: [{ isSignal: true, alias: "note", required: false }] }], selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], busy: [{ type: i0.Input, args: [{ isSignal: true, alias: "busy", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], availableLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableLabel", required: false }] }], soldOutLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "soldOutLabel", required: false }] }], hiddenLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenLabel", required: false }] }], activate: [{ type: i0.Output, args: ["activate"] }], imageError: [{ type: i0.Output, args: ["imageError"] }] } });
5663
5663
 
5664
+ /** The ordered ramp, `unknown` excluded — it has no position on a scale. */
5665
+ const RAMP = ['mild', 'moderate', 'severe', 'critical'];
5666
+ /**
5667
+ * Class strings are written out in full, one per level, and never composed as
5668
+ * `bg-severity-${level}`. Tailwind scans source text: a class name that only exists once the
5669
+ * expression runs produces no CSS, the component renders unstyled, and nothing warns. Same failure
5670
+ * base.css exists to prevent.
5671
+ */
5672
+ const TINT = {
5673
+ unknown: 'bg-severity-unknown-soft text-severity-unknown',
5674
+ mild: 'bg-severity-mild-soft text-severity-mild',
5675
+ moderate: 'bg-severity-moderate-soft text-severity-moderate',
5676
+ severe: 'bg-severity-severe-soft text-severity-severe',
5677
+ critical: 'bg-severity-critical-fill text-severity-critical-on',
5678
+ };
5679
+ const DOT = {
5680
+ unknown: 'bg-severity-unknown',
5681
+ mild: 'bg-severity-mild',
5682
+ moderate: 'bg-severity-moderate',
5683
+ severe: 'bg-severity-severe',
5684
+ critical: 'bg-severity-critical-on',
5685
+ };
5686
+ const FILLED = {
5687
+ unknown: 'bg-severity-unknown',
5688
+ mild: 'bg-severity-mild',
5689
+ moderate: 'bg-severity-moderate',
5690
+ severe: 'bg-severity-severe',
5691
+ critical: 'bg-severity-critical',
5692
+ };
5693
+ /**
5694
+ * How bad the thing itself is — an allergy's criticality, a reaction, an observation's abnormal
5695
+ * flag, a triage level.
5696
+ *
5697
+ * <b>This is not `sds-badge` with a status colour.</b> Status says what the UI did (saved, failed);
5698
+ * severity says what the record says. A red meaning "save failed" in one place and "anaphylaxis" in
5699
+ * another is a safety problem, so severity has its own measured ramp (see base.css) and its own
5700
+ * shape: five ordered steps that can render as a filled meter, where status is three categorical
5701
+ * states that render as a badge.
5702
+ *
5703
+ * <b>[label] is required and is never defaulted.</b> The component will not invent the word
5704
+ * "Severe" for you: colour alone must not carry meaning (greyscale, colour-blind readers, screen
5705
+ * readers), and a hardcoded English default is the exact bug that ships a trilingual app with one
5706
+ * untranslatable word in it. Pass your own translated text.
5707
+ *
5708
+ * `critical` is filled rather than tinted — the top of a scale should be louder than one more step
5709
+ * of the same treatment.
5710
+ *
5711
+ * @example
5712
+ * <sds-severity level="severe" [label]="'allergy.severe' | translate" />
5713
+ * <sds-severity level="moderate" variant="meter" [label]="'reaction.moderate' | translate" />
5714
+ */
5715
+ class SdsSeverity {
5716
+ level = input.required(...(ngDevMode ? [{ debugName: "level" }] : []));
5717
+ /** The visible wording, in the reader's language. Required on purpose — see the class docs. */
5718
+ label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
5719
+ variant = input('badge', ...(ngDevMode ? [{ debugName: "variant" }] : []));
5720
+ size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : []));
5721
+ /**
5722
+ * Accessible name for the meter, when the visible label alone would not say what the number
5723
+ * means ("Élevée" out of context). Defaults to the label.
5724
+ */
5725
+ ariaLabel = input('', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
5726
+ ramp = RAMP;
5727
+ small = computed(() => this.size() === 'sm', ...(ngDevMode ? [{ debugName: "small" }] : []));
5728
+ tintClass = computed(() => TINT[this.level()], ...(ngDevMode ? [{ debugName: "tintClass" }] : []));
5729
+ dotClass = computed(() => DOT[this.level()], ...(ngDevMode ? [{ debugName: "dotClass" }] : []));
5730
+ fillClass = computed(() => FILLED[this.level()], ...(ngDevMode ? [{ debugName: "fillClass" }] : []));
5731
+ accessibleName = computed(() => this.ariaLabel() || this.label(), ...(ngDevMode ? [{ debugName: "accessibleName" }] : []));
5732
+ /** How many of the four steps are lit. `unknown` lights none: it is not a low score. */
5733
+ reached = computed(() => RAMP.indexOf(this.level()) + 1, ...(ngDevMode ? [{ debugName: "reached" }] : []));
5734
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSeverity, deps: [], target: i0.ɵɵFactoryTarget.Component });
5735
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdsSeverity, isStandalone: true, selector: "sds-severity", inputs: { level: { classPropertyName: "level", publicName: "level", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex max-w-full" }, ngImport: i0, template: `
5736
+ @if (variant() === 'meter') {
5737
+ <span
5738
+ role="img"
5739
+ [attr.aria-label]="accessibleName()"
5740
+ class="inline-flex min-w-0 items-center gap-2"
5741
+ >
5742
+ <span class="inline-flex shrink-0 items-center gap-0.5" aria-hidden="true">
5743
+ @for (step of ramp; track step; let i = $index) {
5744
+ <span
5745
+ [class]="
5746
+ (small() ? 'h-2.5 w-1.5 ' : 'h-3 w-2 ') +
5747
+ 'rounded-[2px] ' +
5748
+ (i < reached() ? fillClass() : 'bg-border')
5749
+ "
5750
+ ></span>
5751
+ }
5752
+ </span>
5753
+ <span
5754
+ [class]="small() ? 'truncate text-xs' : 'truncate text-sm'"
5755
+ [class.font-medium]="true"
5756
+ >
5757
+ {{ label() }}
5758
+ </span>
5759
+ </span>
5760
+ } @else {
5761
+ <span
5762
+ [class]="
5763
+ tintClass() +
5764
+ ' inline-flex min-w-0 items-center gap-1.5 rounded-full font-medium ' +
5765
+ (small() ? 'h-5 px-2 text-xs' : 'h-6 px-2.5 text-sm')
5766
+ "
5767
+ >
5768
+ <span
5769
+ aria-hidden="true"
5770
+ [class]="dotClass() + ' size-1.5 shrink-0 rounded-full'"
5771
+ [class.opacity-70]="level() === 'unknown'"
5772
+ ></span>
5773
+ <span class="truncate">{{ label() }}</span>
5774
+ </span>
5775
+ }
5776
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
5777
+ }
5778
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdsSeverity, decorators: [{
5779
+ type: Component,
5780
+ args: [{
5781
+ selector: 'sds-severity',
5782
+ changeDetection: ChangeDetectionStrategy.OnPush,
5783
+ host: { class: 'inline-flex max-w-full' },
5784
+ template: `
5785
+ @if (variant() === 'meter') {
5786
+ <span
5787
+ role="img"
5788
+ [attr.aria-label]="accessibleName()"
5789
+ class="inline-flex min-w-0 items-center gap-2"
5790
+ >
5791
+ <span class="inline-flex shrink-0 items-center gap-0.5" aria-hidden="true">
5792
+ @for (step of ramp; track step; let i = $index) {
5793
+ <span
5794
+ [class]="
5795
+ (small() ? 'h-2.5 w-1.5 ' : 'h-3 w-2 ') +
5796
+ 'rounded-[2px] ' +
5797
+ (i < reached() ? fillClass() : 'bg-border')
5798
+ "
5799
+ ></span>
5800
+ }
5801
+ </span>
5802
+ <span
5803
+ [class]="small() ? 'truncate text-xs' : 'truncate text-sm'"
5804
+ [class.font-medium]="true"
5805
+ >
5806
+ {{ label() }}
5807
+ </span>
5808
+ </span>
5809
+ } @else {
5810
+ <span
5811
+ [class]="
5812
+ tintClass() +
5813
+ ' inline-flex min-w-0 items-center gap-1.5 rounded-full font-medium ' +
5814
+ (small() ? 'h-5 px-2 text-xs' : 'h-6 px-2.5 text-sm')
5815
+ "
5816
+ >
5817
+ <span
5818
+ aria-hidden="true"
5819
+ [class]="dotClass() + ' size-1.5 shrink-0 rounded-full'"
5820
+ [class.opacity-70]="level() === 'unknown'"
5821
+ ></span>
5822
+ <span class="truncate">{{ label() }}</span>
5823
+ </span>
5824
+ }
5825
+ `,
5826
+ }]
5827
+ }], propDecorators: { level: [{ type: i0.Input, args: [{ isSignal: true, alias: "level", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
5828
+
5664
5829
  let nextId$e = 0;
5665
5830
  /**
5666
5831
  * Marks the element inside `<sds-menu>` that opens it. It may be a native button or a component that
@@ -20734,5 +20899,5 @@ function provideSdsCharts(config) {
20734
20899
  * Generated bundle index. Do not edit.
20735
20900
  */
20736
20901
 
20737
- export { SDS_ALLERGENS, SDS_ALLERGEN_ICONS, SDS_ALLERGEN_LABELS_EN, SDS_CHART_CONFIG, SDS_CHART_LABELS_EN, SDS_ICONS, SDS_PHONE_COUNTRIES, SDS_THEME_STORAGE_KEY, SDS_UI_PREF_LANG_PARAM, SDS_UI_PREF_THEME_PARAM, SdsAccordion, SdsAccordionContent, SdsAccordionHeader, SdsAccordionPanel, SdsAccordionStore, SdsAddressAutocomplete, SdsAddressExtra, SdsAllergenIcon, SdsAvatar, SdsBadge, SdsBulkBar, SdsButton, SdsCalendar, SdsCard, SdsCheckbox, SdsChecklistRow, SdsChip, SdsChipGroup, SdsDatePicker, SdsDateRangePicker, SdsEnvBanner, SdsFileDrop, SdsFormActions, SdsIcon, SdsImageCropper, SdsInput, SdsInputNumber, SdsLanguageSwitcher, SdsLocalizedInput, SdsMenu, SdsMenuItem, SdsMenuTrigger, SdsMultiSelect, SdsNavGroup, SdsNavItem, SdsOtpInput, SdsPaginator, SdsPhoneInput, SdsRadio, SdsRangeCalendar, SdsScore, SdsSearchCommand, SdsSegmented, SdsSelect, SdsSelectEmpty, SdsSelectFooter, SdsSelectOption, SdsShell, SdsSidebar, SdsSortableHandle, SdsSortableItem, SdsSortableList, SdsStatusTile, SdsTab, SdsTabList, SdsTabPanel, SdsTabPanels, SdsTable, SdsTableCell, SdsTableEmpty, SdsTableHeader, SdsTableRowExpansion, SdsTabs, SdsTabsStore, SdsTextarea, SdsThemeService, SdsThemeToggle, SdsTimeInput, SdsToastHost, SdsToastService, SdsToggleSwitch, SdsTopbar, SdsTriStateChip, SdsUserMenu, SidebarStore, addDays, addMonths, addMonthsKeepDay, appendUiPrefs, diffInDays, formatDateRange, formatDdMmYyyy, formatHhMm, isOutOfRange, isSameDay, isSameRange, isSdsThemeMode, isoDay, pad2, provideSdsCharts, readUiPrefs, sdsFileMatchesAccept, sdsFormatBytes, sdsFormatNational, sdsLastDays, sdsLastMonths, sdsMatchDialCode, sdsNormalizeSignificant, startOfDay, startOfMonth, stripUiPrefs };
20902
+ export { SDS_ALLERGENS, SDS_ALLERGEN_ICONS, SDS_ALLERGEN_LABELS_EN, SDS_CHART_CONFIG, SDS_CHART_LABELS_EN, SDS_ICONS, SDS_PHONE_COUNTRIES, SDS_THEME_STORAGE_KEY, SDS_UI_PREF_LANG_PARAM, SDS_UI_PREF_THEME_PARAM, SdsAccordion, SdsAccordionContent, SdsAccordionHeader, SdsAccordionPanel, SdsAccordionStore, SdsAddressAutocomplete, SdsAddressExtra, SdsAllergenIcon, SdsAvatar, SdsBadge, SdsBulkBar, SdsButton, SdsCalendar, SdsCard, SdsCheckbox, SdsChecklistRow, SdsChip, SdsChipGroup, SdsDatePicker, SdsDateRangePicker, SdsEnvBanner, SdsFileDrop, SdsFormActions, SdsIcon, SdsImageCropper, SdsInput, SdsInputNumber, SdsLanguageSwitcher, SdsLocalizedInput, SdsMenu, SdsMenuItem, SdsMenuTrigger, SdsMultiSelect, SdsNavGroup, SdsNavItem, SdsOtpInput, SdsPaginator, SdsPhoneInput, SdsRadio, SdsRangeCalendar, SdsScore, SdsSearchCommand, SdsSegmented, SdsSelect, SdsSelectEmpty, SdsSelectFooter, SdsSelectOption, SdsSeverity, SdsShell, SdsSidebar, SdsSortableHandle, SdsSortableItem, SdsSortableList, SdsStatusTile, SdsTab, SdsTabList, SdsTabPanel, SdsTabPanels, SdsTable, SdsTableCell, SdsTableEmpty, SdsTableHeader, SdsTableRowExpansion, SdsTabs, SdsTabsStore, SdsTextarea, SdsThemeService, SdsThemeToggle, SdsTimeInput, SdsToastHost, SdsToastService, SdsToggleSwitch, SdsTopbar, SdsTriStateChip, SdsUserMenu, SidebarStore, addDays, addMonths, addMonthsKeepDay, appendUiPrefs, diffInDays, formatDateRange, formatDdMmYyyy, formatHhMm, isOutOfRange, isSameDay, isSameRange, isSdsThemeMode, isoDay, pad2, provideSdsCharts, readUiPrefs, sdsFileMatchesAccept, sdsFormatBytes, sdsFormatNational, sdsLastDays, sdsLastMonths, sdsMatchDialCode, sdsNormalizeSignificant, startOfDay, startOfMonth, stripUiPrefs };
20738
20903
  //# sourceMappingURL=besaitech-ng-design-system.mjs.map