@raqm/ui 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/NOTICE.md +28 -0
- package/README.md +125 -3
- package/combobox/README.md +17 -0
- package/fesm2022/raqm-ui-accordion.mjs +414 -0
- package/fesm2022/raqm-ui-accordion.mjs.map +1 -0
- package/fesm2022/raqm-ui-alert-dialog.mjs +457 -0
- package/fesm2022/raqm-ui-alert-dialog.mjs.map +1 -0
- package/fesm2022/raqm-ui-alert.mjs +195 -0
- package/fesm2022/raqm-ui-alert.mjs.map +1 -0
- package/fesm2022/raqm-ui-aspect-ratio.mjs +66 -0
- package/fesm2022/raqm-ui-aspect-ratio.mjs.map +1 -0
- package/fesm2022/raqm-ui-attachment.mjs +435 -0
- package/fesm2022/raqm-ui-attachment.mjs.map +1 -0
- package/fesm2022/raqm-ui-avatar.mjs +337 -0
- package/fesm2022/raqm-ui-avatar.mjs.map +1 -0
- package/fesm2022/raqm-ui-badge.mjs +68 -0
- package/fesm2022/raqm-ui-badge.mjs.map +1 -0
- package/fesm2022/raqm-ui-breadcrumb.mjs +309 -0
- package/fesm2022/raqm-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/raqm-ui-button-group.mjs +138 -0
- package/fesm2022/raqm-ui-button-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-button.mjs +295 -0
- package/fesm2022/raqm-ui-button.mjs.map +1 -0
- package/fesm2022/raqm-ui-calendar.mjs +1394 -0
- package/fesm2022/raqm-ui-calendar.mjs.map +1 -0
- package/fesm2022/raqm-ui-card.mjs +331 -0
- package/fesm2022/raqm-ui-card.mjs.map +1 -0
- package/fesm2022/raqm-ui-carousel.mjs +410 -0
- package/fesm2022/raqm-ui-carousel.mjs.map +1 -0
- package/fesm2022/raqm-ui-checkbox.mjs +86 -0
- package/fesm2022/raqm-ui-checkbox.mjs.map +1 -0
- package/fesm2022/raqm-ui-collapsible.mjs +266 -0
- package/fesm2022/raqm-ui-collapsible.mjs.map +1 -0
- package/fesm2022/raqm-ui-combobox.mjs +1584 -0
- package/fesm2022/raqm-ui-combobox.mjs.map +1 -0
- package/fesm2022/raqm-ui-command.mjs +1210 -0
- package/fesm2022/raqm-ui-command.mjs.map +1 -0
- package/fesm2022/raqm-ui-context-menu.mjs +723 -0
- package/fesm2022/raqm-ui-context-menu.mjs.map +1 -0
- package/fesm2022/raqm-ui-dialog.mjs +1214 -0
- package/fesm2022/raqm-ui-dialog.mjs.map +1 -0
- package/fesm2022/raqm-ui-drawer.mjs +687 -0
- package/fesm2022/raqm-ui-drawer.mjs.map +1 -0
- package/fesm2022/raqm-ui-dropdown-menu.mjs +1168 -0
- package/fesm2022/raqm-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/raqm-ui-empty.mjs +272 -0
- package/fesm2022/raqm-ui-empty.mjs.map +1 -0
- package/fesm2022/raqm-ui-field.mjs +517 -0
- package/fesm2022/raqm-ui-field.mjs.map +1 -0
- package/fesm2022/raqm-ui-hover-card.mjs +828 -0
- package/fesm2022/raqm-ui-hover-card.mjs.map +1 -0
- package/fesm2022/raqm-ui-input-group.mjs +270 -0
- package/fesm2022/raqm-ui-input-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-input-otp.mjs +788 -0
- package/fesm2022/raqm-ui-input-otp.mjs.map +1 -0
- package/fesm2022/raqm-ui-input.mjs +73 -0
- package/fesm2022/raqm-ui-input.mjs.map +1 -0
- package/fesm2022/raqm-ui-item.mjs +495 -0
- package/fesm2022/raqm-ui-item.mjs.map +1 -0
- package/fesm2022/raqm-ui-kbd.mjs +80 -0
- package/fesm2022/raqm-ui-kbd.mjs.map +1 -0
- package/fesm2022/raqm-ui-label.mjs +44 -0
- package/fesm2022/raqm-ui-label.mjs.map +1 -0
- package/fesm2022/raqm-ui-menubar.mjs +536 -0
- package/fesm2022/raqm-ui-menubar.mjs.map +1 -0
- package/fesm2022/raqm-ui-native-select.mjs +131 -0
- package/fesm2022/raqm-ui-native-select.mjs.map +1 -0
- package/fesm2022/raqm-ui-navigation-menu.mjs +1399 -0
- package/fesm2022/raqm-ui-navigation-menu.mjs.map +1 -0
- package/fesm2022/raqm-ui-overlay-internal.mjs +185 -0
- package/fesm2022/raqm-ui-overlay-internal.mjs.map +1 -0
- package/fesm2022/raqm-ui-pagination.mjs +440 -0
- package/fesm2022/raqm-ui-pagination.mjs.map +1 -0
- package/fesm2022/raqm-ui-popover.mjs +1495 -0
- package/fesm2022/raqm-ui-popover.mjs.map +1 -0
- package/fesm2022/raqm-ui-progress.mjs +369 -0
- package/fesm2022/raqm-ui-progress.mjs.map +1 -0
- package/fesm2022/raqm-ui-questionnaire.mjs +1005 -0
- package/fesm2022/raqm-ui-questionnaire.mjs.map +1 -0
- package/fesm2022/raqm-ui-radio-group.mjs +151 -0
- package/fesm2022/raqm-ui-radio-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-resizable.mjs +439 -0
- package/fesm2022/raqm-ui-resizable.mjs.map +1 -0
- package/fesm2022/raqm-ui-scroll-area.mjs +510 -0
- package/fesm2022/raqm-ui-scroll-area.mjs.map +1 -0
- package/fesm2022/raqm-ui-select.mjs +1073 -0
- package/fesm2022/raqm-ui-select.mjs.map +1 -0
- package/fesm2022/raqm-ui-separator.mjs +103 -0
- package/fesm2022/raqm-ui-separator.mjs.map +1 -0
- package/fesm2022/raqm-ui-sheet.mjs +411 -0
- package/fesm2022/raqm-ui-sheet.mjs.map +1 -0
- package/fesm2022/raqm-ui-sidebar.mjs +1784 -0
- package/fesm2022/raqm-ui-sidebar.mjs.map +1 -0
- package/fesm2022/raqm-ui-skeleton.mjs +50 -0
- package/fesm2022/raqm-ui-skeleton.mjs.map +1 -0
- package/fesm2022/raqm-ui-slider.mjs +609 -0
- package/fesm2022/raqm-ui-slider.mjs.map +1 -0
- package/fesm2022/raqm-ui-spinner.mjs +137 -0
- package/fesm2022/raqm-ui-spinner.mjs.map +1 -0
- package/fesm2022/raqm-ui-switch.mjs +109 -0
- package/fesm2022/raqm-ui-switch.mjs.map +1 -0
- package/fesm2022/raqm-ui-table.mjs +271 -0
- package/fesm2022/raqm-ui-table.mjs.map +1 -0
- package/fesm2022/raqm-ui-tabs.mjs +536 -0
- package/fesm2022/raqm-ui-tabs.mjs.map +1 -0
- package/fesm2022/raqm-ui-textarea.mjs +37 -0
- package/fesm2022/raqm-ui-textarea.mjs.map +1 -0
- package/fesm2022/raqm-ui-toast.mjs +918 -0
- package/fesm2022/raqm-ui-toast.mjs.map +1 -0
- package/fesm2022/raqm-ui-toggle-group.mjs +462 -0
- package/fesm2022/raqm-ui-toggle-group.mjs.map +1 -0
- package/fesm2022/raqm-ui-toggle.mjs +158 -0
- package/fesm2022/raqm-ui-toggle.mjs.map +1 -0
- package/fesm2022/raqm-ui-tooltip.mjs +1226 -0
- package/fesm2022/raqm-ui-tooltip.mjs.map +1 -0
- package/fesm2022/raqm-ui.mjs +50 -0
- package/input-otp/README.md +12 -0
- package/package.json +275 -3
- package/styles/theme.css +4322 -0
- package/types/raqm-ui-accordion.d.ts +124 -0
- package/types/raqm-ui-alert-dialog.d.ts +81 -0
- package/types/raqm-ui-alert.d.ts +29 -0
- package/types/raqm-ui-aspect-ratio.d.ts +13 -0
- package/types/raqm-ui-attachment.d.ts +72 -0
- package/types/raqm-ui-avatar.d.ts +67 -0
- package/types/raqm-ui-badge.d.ts +20 -0
- package/types/raqm-ui-breadcrumb.d.ts +35 -0
- package/types/raqm-ui-button-group.d.ts +27 -0
- package/types/raqm-ui-button.d.ts +80 -0
- package/types/raqm-ui-calendar.d.ts +359 -0
- package/types/raqm-ui-card.d.ts +34 -0
- package/types/raqm-ui-carousel.d.ts +81 -0
- package/types/raqm-ui-checkbox.d.ts +24 -0
- package/types/raqm-ui-collapsible.d.ts +72 -0
- package/types/raqm-ui-combobox.d.ts +405 -0
- package/types/raqm-ui-command.d.ts +256 -0
- package/types/raqm-ui-context-menu.d.ts +196 -0
- package/types/raqm-ui-dialog.d.ts +232 -0
- package/types/raqm-ui-drawer.d.ts +121 -0
- package/types/raqm-ui-dropdown-menu.d.ts +319 -0
- package/types/raqm-ui-empty.d.ts +35 -0
- package/types/raqm-ui-field.d.ts +88 -0
- package/types/raqm-ui-hover-card.d.ts +139 -0
- package/types/raqm-ui-input-group.d.ts +45 -0
- package/types/raqm-ui-input-otp.d.ts +197 -0
- package/types/raqm-ui-input.d.ts +16 -0
- package/types/raqm-ui-item.d.ts +71 -0
- package/types/raqm-ui-kbd.d.ts +12 -0
- package/types/raqm-ui-label.d.ts +6 -0
- package/types/raqm-ui-menubar.d.ts +159 -0
- package/types/raqm-ui-native-select.d.ts +23 -0
- package/types/raqm-ui-navigation-menu.d.ts +230 -0
- package/types/raqm-ui-overlay-internal.d.ts +5 -0
- package/types/raqm-ui-pagination.d.ts +84 -0
- package/types/raqm-ui-popover.d.ts +235 -0
- package/types/raqm-ui-progress.d.ts +79 -0
- package/types/raqm-ui-questionnaire.d.ts +217 -0
- package/types/raqm-ui-radio-group.d.ts +48 -0
- package/types/raqm-ui-resizable.d.ts +98 -0
- package/types/raqm-ui-scroll-area.d.ts +132 -0
- package/types/raqm-ui-select.d.ts +205 -0
- package/types/raqm-ui-separator.d.ts +21 -0
- package/types/raqm-ui-sheet.d.ts +79 -0
- package/types/raqm-ui-sidebar.d.ts +285 -0
- package/types/raqm-ui-skeleton.d.ts +6 -0
- package/types/raqm-ui-slider.d.ts +129 -0
- package/types/raqm-ui-spinner.d.ts +32 -0
- package/types/raqm-ui-switch.d.ts +32 -0
- package/types/raqm-ui-table.d.ts +36 -0
- package/types/raqm-ui-tabs.d.ts +154 -0
- package/types/raqm-ui-textarea.d.ts +6 -0
- package/types/raqm-ui-toast.d.ts +190 -0
- package/types/raqm-ui-toggle-group.d.ts +167 -0
- package/types/raqm-ui-toggle.d.ts +42 -0
- package/types/raqm-ui-tooltip.d.ts +207 -0
- package/types/raqm-ui.d.ts +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raqm-ui-toast.mjs","names":[],"sources":["../../../projects/ui/toast/toast.service.ts","../../../projects/ui/toast/toast.component.ts","../../../projects/ui/toast/toast-icon.component.html","../../../projects/ui/toast/toaster.component.ts","../../../projects/ui/toast/toaster.component.html","../../../projects/ui/toast/public-api.ts"],"sourcesContent":["import {\r\n DOCUMENT,\r\n Injectable,\r\n OnDestroy,\r\n PLATFORM_ID,\r\n computed,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\nexport type RaqmToastId = string;\r\nexport type RaqmToastType = 'success' | 'info' | 'warning' | 'error' | 'loading';\r\n/** Native action; its callback explicitly owns dismissal. */\r\nexport interface RaqmToastActionOptions {\r\n readonly label: string;\r\n readonly onClick: (id: RaqmToastId, event: MouseEvent) => void;\r\n readonly disabled?: boolean;\r\n}\r\n/** Text notification options; a timeout of 0 disables automatic dismissal. */\r\nexport interface RaqmToastOptions {\r\n readonly id?: RaqmToastId;\r\n readonly title?: string;\r\n readonly description?: string;\r\n readonly type?: RaqmToastType;\r\n readonly timeout?: number;\r\n readonly action?: RaqmToastActionOptions;\r\n readonly onClose?: () => void;\r\n}\r\n/** Immutable notification state; updates preserve its id and increment updateKey. */\r\nexport interface RaqmToastRecord extends Omit<RaqmToastOptions, 'id' | 'timeout'> {\r\n readonly id: RaqmToastId;\r\n readonly timeout: number;\r\n readonly updateKey: number;\r\n readonly ending?: boolean;\r\n}\r\ninterface ToastClock {\r\n remaining: number;\r\n started: number;\r\n timer?: ReturnType<typeof setTimeout>;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class RaqmToastService implements OnDestroy {\r\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID));\r\n private readonly records = signal<readonly RaqmToastRecord[]>([]);\r\n private readonly clocks = new Map<RaqmToastId, ToastClock>();\r\n private readonly document = inject(DOCUMENT);\r\n private readonly exits = new Map<RaqmToastId, ReturnType<typeof setTimeout>>();\r\n private owner: object | null = null;\r\n private paused = false;\r\n private nextId = 0;\r\n private destroyed = false;\r\n /** Newest first; older records queue behind the visible three. */\r\n readonly toasts = this.records.asReadonly();\r\n readonly visibleToasts = computed(() =>\r\n this.toasts()\r\n .filter((t) => !t.ending)\r\n .slice(0, 3),\r\n );\r\n /** Visible roots plus retained, inert roots finishing the exit. */\r\n readonly renderedToasts = computed(() => {\r\n const visible = new Set(this.visibleToasts().map((t) => t.id));\r\n return this.toasts().filter((t) => t.ending || visible.has(t.id));\r\n });\r\n\r\n /** Adds a notification, or upserts an existing explicit id without duplication. */\r\n show(options: RaqmToastOptions): RaqmToastId {\r\n const id = options.id ?? this.createId();\r\n if (this.destroyed) return id;\r\n if (this.records().some((toast) => toast.id === id)) {\r\n this.update(id, options);\r\n return id;\r\n }\r\n const toast = { ...options, id, timeout: this.timeout(options.timeout), updateKey: 0 };\r\n this.records.update((records) => [toast, ...records]);\r\n this.clocks.set(id, { remaining: toast.timeout, started: 0 });\r\n this.syncClocks();\r\n return id;\r\n }\r\n success(options: Omit<RaqmToastOptions, 'type'>): RaqmToastId {\r\n return this.show({ ...options, type: 'success' });\r\n }\r\n error(options: Omit<RaqmToastOptions, 'type'>): RaqmToastId {\r\n return this.show({ ...options, type: 'error' });\r\n }\r\n /** Updates one id for loading → success/error workflows; dismissed ids stay dismissed. */\r\n update(id: RaqmToastId, options: Partial<Omit<RaqmToastOptions, 'id'>>): void {\r\n const previous = this.records().find((toast) => toast.id === id);\r\n if (!previous || previous.ending) return;\r\n const timeout = this.timeout(options.timeout ?? previous.timeout);\r\n this.stopClock(id);\r\n this.records.update((records) =>\r\n records.map((toast) =>\r\n toast.id === id\r\n ? { ...toast, ...options, id, timeout, updateKey: toast.updateKey + 1 }\r\n : toast,\r\n ),\r\n );\r\n this.clocks.set(id, { remaining: timeout, started: 0 });\r\n this.syncClocks();\r\n }\r\n /** Dismisses one notification, or all notifications when no id is supplied. */\r\n dismiss(id?: RaqmToastId): void {\r\n const visible = new Set(this.visibleToasts().map((t) => t.id));\r\n const removed = this.records().filter(\r\n (toast) => !toast.ending && (id === undefined || toast.id === id),\r\n );\r\n const animate =\r\n this.browser &&\r\n this.owner !== null &&\r\n !this.document.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n for (const toast of removed) {\r\n this.stopClock(toast.id);\r\n this.clocks.delete(toast.id);\r\n }\r\n this.records.update((records) =>\r\n records.flatMap((toast) =>\r\n !removed.includes(toast)\r\n ? [toast]\r\n : animate && visible.has(toast.id)\r\n ? [{ ...toast, ending: true }]\r\n : [],\r\n ),\r\n );\r\n for (const toast of removed) {\r\n if (animate && visible.has(toast.id))\r\n this.exits.set(\r\n toast.id,\r\n setTimeout(() => {\r\n this.exits.delete(toast.id);\r\n this.records.update((records) => records.filter((record) => record.id !== toast.id));\r\n }, 500),\r\n );\r\n }\r\n this.syncClocks();\r\n for (const toast of removed) toast.onClose?.();\r\n }\r\n /** Internal host ownership guard: duplicate hosts never create duplicate overlays. */\r\n claimViewport(owner: object): boolean {\r\n if (this.owner !== null && this.owner !== owner) return false;\r\n this.owner = owner;\r\n this.syncClocks();\r\n return true;\r\n }\r\n releaseViewport(owner: object): void {\r\n if (this.owner !== owner) return;\r\n this.owner = null;\r\n for (const timer of this.exits.values()) clearTimeout(timer);\r\n this.exits.clear();\r\n this.records.update((records) => records.filter((t) => !t.ending));\r\n this.paused = false;\r\n this.syncClocks();\r\n }\r\n pauseViewport(owner: object, paused: boolean): void {\r\n if (this.owner !== owner) return;\r\n this.paused = paused;\r\n this.syncClocks();\r\n }\r\n ngOnDestroy(): void {\r\n this.destroyed = true;\r\n for (const id of this.clocks.keys()) this.stopClock(id);\r\n this.clocks.clear();\r\n for (const timer of this.exits.values()) clearTimeout(timer);\r\n this.exits.clear();\r\n this.records.set([]);\r\n this.owner = null;\r\n }\r\n private timeout(value = 5000): number {\r\n return Number.isFinite(value) ? Math.max(0, Math.min(value, 2147483647)) : 5000;\r\n }\r\n private createId(): string {\r\n let id: string;\r\n do {\r\n id = `raqm-toast-${++this.nextId}`;\r\n } while (this.records().some((toast) => toast.id === id));\r\n return id;\r\n }\r\n private stopClock(id: RaqmToastId): void {\r\n const clock = this.clocks.get(id);\r\n if (clock?.timer !== undefined) {\r\n clearTimeout(clock.timer);\r\n clock.timer = undefined;\r\n clock.remaining = Math.max(0, clock.remaining - (Date.now() - clock.started));\r\n }\r\n }\r\n private syncClocks(): void {\r\n const visible = new Set(this.visibleToasts().map((toast) => toast.id));\r\n for (const [id, clock] of this.clocks) {\r\n if (!this.browser || !this.owner || this.paused || !visible.has(id)) {\r\n this.stopClock(id);\r\n } else if (clock.timer === undefined && this.records().find((t) => t.id === id)?.timeout) {\r\n clock.started = Date.now();\r\n clock.timer = setTimeout(() => {\r\n clock.timer = undefined;\r\n this.dismiss(id);\r\n }, clock.remaining);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n OnDestroy,\r\n inject,\r\n input,\r\n output,\r\n effect,\r\n} from '@angular/core';\r\nimport { RaqmToastRecord, RaqmToastService, RaqmToastType } from './toast.service';\r\n\r\n/** Composable notification root; never takes focus automatically. */\r\n@Component({\r\n selector: 'raqm-toast',\r\n template: '<ng-content />',\r\n styleUrl: './toast.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toast',\r\n tabindex: '-1',\r\n role: 'group',\r\n '[attr.data-raqm-type]': 'toast().type',\r\n '(keydown.escape)': 'dismiss($event)',\r\n '(pointerdown)': 'pointerDown($event)',\r\n '(pointermove)': 'pointerMove($event)',\r\n '(pointerup)': 'pointerEnd($event)',\r\n '(pointercancel)': 'pointerEnd($event)',\r\n '(lostpointercapture)': 'pointerEnd($event)',\r\n },\r\n})\r\nexport class RaqmToastComponent implements OnDestroy {\r\n readonly toast = input.required<RaqmToastRecord>();\r\n /** Internal viewport clock-pause signal for captured touch or mouse gestures. */\r\n readonly swipingChange = output<boolean>();\r\n private readonly service = inject(RaqmToastService);\r\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private pointer: number | null = null;\r\n private start = { x: 0, y: 0 };\r\n private initial = '';\r\n private axis: 'x' | 'y' | null = null;\r\n private firstMove = true;\r\n private maximum = 0;\r\n private baseline = { x: 0, y: 0 };\r\n private intended = false;\r\n private cancelled = false;\r\n private delta = 0;\r\n constructor() {\r\n effect(() => {\r\n if (this.toast().ending) this.releasePointer();\r\n });\r\n }\r\n protected pointerDown(event: PointerEvent): void {\r\n if (\r\n event.button !== 0 ||\r\n this.pointer !== null ||\r\n this.toast().ending ||\r\n (event.target as HTMLElement).closest(\r\n 'button,a,input,textarea,select,[role=\"button\"],[contenteditable],[data-base-ui-swipe-ignore],[data-swipe-ignore]',\r\n )\r\n )\r\n return;\r\n try {\r\n this.element.setPointerCapture(event.pointerId);\r\n } catch {\r\n return;\r\n }\r\n this.pointer = event.pointerId;\r\n this.swipingChange.emit(true);\r\n this.start = { x: event.clientX, y: event.clientY };\r\n this.baseline = { ...this.start };\r\n this.intended = false;\r\n this.initial =\r\n this.element.ownerDocument.defaultView?.getComputedStyle(this.element).transform ?? '';\r\n this.axis = null;\r\n this.firstMove = true;\r\n this.maximum = this.delta = 0;\r\n this.cancelled = false;\r\n this.element.setAttribute('data-raqm-swiping', '');\r\n }\r\n protected pointerMove(event: PointerEvent): void {\r\n if (event.pointerId !== this.pointer) return;\r\n event.preventDefault();\r\n if (this.firstMove) {\r\n this.start = { x: event.clientX, y: event.clientY };\r\n this.firstMove = false;\r\n }\r\n const x = event.clientX - this.start.x;\r\n const y = event.clientY - this.start.y;\r\n if (\r\n (event.movementX < 0 && event.clientX > this.baseline.x) ||\r\n (event.movementX > 0 && event.clientX < this.baseline.x)\r\n )\r\n this.baseline.x = event.clientX;\r\n if (\r\n (event.movementY < 0 && event.clientY > this.baseline.y) ||\r\n (event.movementY > 0 && event.clientY < this.baseline.y)\r\n )\r\n this.baseline.y = event.clientY;\r\n if (!this.axis && Math.hypot(x, y) >= 1) this.axis = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\r\n this.delta = this.axis === 'x' ? x : this.axis === 'y' ? y : 0;\r\n if (!this.intended && this.delta > 0) {\r\n this.intended = true;\r\n this.maximum = this.delta;\r\n } else if (this.intended) {\r\n const displacement =\r\n this.axis === 'x' ? event.clientX - this.baseline.x : event.clientY - this.baseline.y;\r\n if (displacement > 40) this.cancelled = false;\r\n else if (this.maximum - displacement >= 10) this.cancelled = true;\r\n }\r\n const damped = this.delta < 0 ? -Math.sqrt(-this.delta) : this.delta;\r\n this.element.style.transform = `translate${this.axis === 'x' ? 'X' : 'Y'}(${damped}px) ${this.initial === 'none' ? '' : this.initial}`;\r\n this.element.style.setProperty(\r\n '--toast-swipe-movement-x',\r\n `${this.axis === 'x' ? damped : 0}px`,\r\n );\r\n this.element.style.setProperty(\r\n '--toast-swipe-movement-y',\r\n `${this.axis === 'y' ? damped : 0}px`,\r\n );\r\n }\r\n protected pointerEnd(event: PointerEvent): void {\r\n if (event.pointerId !== this.pointer) return;\r\n const dismiss = event.type === 'pointerup' && this.delta > 40 && !this.cancelled;\r\n const direction = this.axis === 'x' ? 'right' : 'down';\r\n this.releasePointer();\r\n if (dismiss) {\r\n this.element.setAttribute('data-raqm-swipe-direction', direction);\r\n this.dismiss();\r\n } else {\r\n this.element.style.removeProperty('--toast-swipe-movement-x');\r\n this.element.style.removeProperty('--toast-swipe-movement-y');\r\n }\r\n }\r\n ngOnDestroy(): void {\r\n this.releasePointer();\r\n }\r\n private releasePointer(): void {\r\n const pointer = this.pointer;\r\n this.pointer = null;\r\n if (pointer !== null) this.swipingChange.emit(false);\r\n if (pointer !== null && this.element.hasPointerCapture(pointer))\r\n this.element.releasePointerCapture(pointer);\r\n this.element.removeAttribute('data-raqm-swiping');\r\n this.element.style.removeProperty('transform');\r\n }\r\n /** Closes this record and contains Escape within the notification. */\r\n dismiss(event?: Event): void {\r\n event?.preventDefault();\r\n event?.stopPropagation();\r\n this.service.dismiss(this.toast().id);\r\n }\r\n}\r\n@Directive({\r\n selector: '[raqm-toast-title]',\r\n host: { class: 'raqm-toast-title' },\r\n})\r\nexport class RaqmToastTitleDirective {}\r\n\r\n@Directive({\r\n selector: '[raqm-toast-content]',\r\n host: { class: 'raqm-toast-content' },\r\n})\r\nexport class RaqmToastContentDirective {}\r\n@Directive({\r\n selector: '[raqm-toast-description]',\r\n host: { class: 'raqm-toast-description' },\r\n})\r\nexport class RaqmToastDescriptionDirective {}\r\n/** Native action; the consumer click callback owns its behavior and dismissal. */\r\n@Directive({\r\n selector: 'button[raqm-toast-action]',\r\n host: {\r\n class: 'raqm-toast-action raqm-button',\r\n 'data-raqm-variant': 'outline',\r\n 'data-raqm-size': 'sm',\r\n },\r\n})\r\nexport class RaqmToastActionDirective {\r\n constructor() {\r\n const element = inject<ElementRef<HTMLButtonElement>>(ElementRef).nativeElement;\r\n if (!element.hasAttribute('type')) element.type = 'button';\r\n }\r\n}\r\n/** Native close button operating on its enclosing toast; the application names it. */\r\n@Component({\r\n selector: 'button[raqm-toast-close]',\r\n template:\r\n '<ng-content><svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m18 6-12 12M6 6l12 12\" /></svg></ng-content>',\r\n styleUrl: './toast.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toast-close raqm-button',\r\n 'data-raqm-variant': 'ghost',\r\n 'data-raqm-size': 'icon-sm',\r\n '(click)': 'root.dismiss()',\r\n },\r\n})\r\nexport class RaqmToastCloseComponent {\r\n protected readonly root = inject(RaqmToastComponent);\r\n constructor() {\r\n const element = inject<ElementRef<HTMLButtonElement>>(ElementRef).nativeElement;\r\n if (!element.hasAttribute('type')) element.type = 'button';\r\n }\r\n}\r\n/** Decorative inline status glyphs. */\r\n@Component({\r\n selector: 'raqm-toast-icon',\r\n templateUrl: './toast-icon.component.html',\r\n styleUrl: './toast.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'raqm-toast-icon', 'aria-hidden': 'true', '[attr.data-raqm-type]': 'type()' },\r\n})\r\nexport class RaqmToastIconComponent {\r\n readonly type = input<RaqmToastType>();\r\n}\r\n","@if (type()) {\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n focusable=\"false\"\n >\n @switch (type()) {\n @case ('success') {\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n }\n @case ('info') {\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4M12 8h.01\" />\n }\n @case ('warning') {\n <path\n d=\"m10.3 3.9-8.1 14A2 2 0 0 0 3.9 21h16.2a2 2 0 0 0 1.7-3.1l-8.1-14a2 2 0 0 0-3.4 0ZM12 9v4M12 17h.01\"\n />\n }\n @case ('error') {\n <path d=\"m7.86 2-5.86 5.86v8.28l5.86 5.86h8.28l5.86-5.86V7.86L16.14 2ZM9 9l6 6M15 9l-6 6\" />\n }\n @case ('loading') {\n <path d=\"M12 2a10 10 0 1 1-7.07 2.93\" />\n }\n }\n </svg>\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DOCUMENT,\r\n ElementRef,\r\n OnDestroy,\r\n TemplateRef,\r\n ViewContainerRef,\r\n afterEveryRender,\r\n afterNextRender,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n RaqmToastComponent,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n} from './toast.component';\r\nimport { RaqmToastRecord, RaqmToastService } from './toast.service';\r\n\r\n/** Nonmodal CDK viewport; mounted once near the application root. */\r\n@Component({\r\n imports: [\r\n RaqmToastComponent,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n ],\r\n selector: 'raqm-toaster',\r\n styleUrl: './toaster.component.scss',\r\n templateUrl: './toaster.component.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class RaqmToasterComponent implements OnDestroy {\r\n /** Accessible name of the notification viewport region. */\r\n readonly label = input.required<string>();\r\n /** Accessible name of the close control the toaster renders for each toast. */\r\n readonly closeLabel = input.required<string>();\r\n protected readonly service = inject(RaqmToastService);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly overlay = inject(Overlay);\r\n private readonly container = inject(ViewContainerRef);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly panel = viewChild.required<TemplateRef<unknown>>('panel');\r\n private overlayRef?: OverlayRef;\r\n private observer?: ResizeObserver;\r\n private announcementTimer?: ReturnType<typeof setTimeout>;\r\n private previousFocus: HTMLElement | null = null;\r\n private hovered = false;\r\n private focused = false;\r\n private swiping = false;\r\n private readonly indices = new Map<string, number>();\r\n protected readonly expanded = signal(false);\r\n protected readonly announcement = signal('');\r\n protected readonly ready = signal(false);\r\n protected readonly announcementKey = computed(() =>\r\n this.service\r\n .visibleToasts()\r\n .map((t) => `${t.id}:${t.updateKey}`)\r\n .join('|'),\r\n );\r\n private announced = new Map<string, number>();\r\n private readonly pendingAnnouncements = new Map<string, RaqmToastRecord>();\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (!this.service.claimViewport(this)) return;\r\n const dir =\r\n this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr';\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position().global(),\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n hasBackdrop: false,\r\n panelClass: 'raqm-toast-overlay-pane',\r\n direction: dir,\r\n });\r\n // The viewport owns fixed logical positioning; its zero-sized pane never intercepts the page.\r\n this.overlayRef.overlayElement.style.pointerEvents = 'none';\r\n this.overlayRef.attach(new TemplatePortal(this.panel(), this.container));\r\n this.document.addEventListener('keydown', this.onDocumentKeydown);\r\n if (typeof ResizeObserver !== 'undefined')\r\n this.observer = new ResizeObserver(() => this.measure());\r\n this.ready.set(true);\r\n });\r\n afterEveryRender(() => {\r\n const pane = this.overlayRef?.overlayElement;\r\n if (!pane) return;\r\n const retained = new Set(this.service.renderedToasts().map((t) => t.id));\r\n for (const id of this.indices.keys()) if (!retained.has(id)) this.indices.delete(id);\r\n const dir =\r\n this.document.defaultView?.getComputedStyle(this.host.nativeElement).direction === 'rtl'\r\n ? 'rtl'\r\n : 'ltr';\r\n this.overlayRef?.setDirection(dir);\r\n this.observer?.disconnect();\r\n pane\r\n .querySelectorAll('.raqm-toast-content')\r\n .forEach((element) => this.observer?.observe(element));\r\n this.measure();\r\n });\r\n effect(() => {\r\n const toasts = this.service.visibleToasts();\r\n // Runs before DOM removal so programmatic dismissal cannot strand focused controls.\r\n untracked(() => this.ensureFocus(toasts));\r\n });\r\n effect(() => {\r\n this.announcementKey();\r\n if (!this.ready()) return;\r\n untracked(() => {\r\n const fresh = this.service\r\n .visibleToasts()\r\n .filter((t) => this.announced.get(t.id) !== t.updateKey);\r\n this.announced = new Map(this.service.visibleToasts().map((t) => [t.id, t.updateKey]));\r\n if (!fresh.length) return;\r\n for (const toast of fresh) this.pendingAnnouncements.set(toast.id, toast);\r\n if (this.announcementTimer !== undefined) clearTimeout(this.announcementTimer);\r\n this.announcement.set('');\r\n this.announcementTimer = setTimeout(() => {\r\n this.announcementTimer = undefined;\r\n this.announcement.set(\r\n Array.from(this.pendingAnnouncements.values())\r\n .filter((t) =>\r\n this.service\r\n .visibleToasts()\r\n .some((current) => current.id === t.id && current.updateKey === t.updateKey),\r\n )\r\n .map((t) => [t.title, t.description].filter(Boolean).join('. '))\r\n .join('. '),\r\n );\r\n this.pendingAnnouncements.clear();\r\n }, 100);\r\n });\r\n });\r\n }\r\n ngOnDestroy(): void {\r\n this.restoreFocus();\r\n this.document.removeEventListener('keydown', this.onDocumentKeydown);\r\n this.observer?.disconnect();\r\n if (this.announcementTimer !== undefined) clearTimeout(this.announcementTimer);\r\n this.overlayRef?.dispose();\r\n this.service.releaseViewport(this);\r\n }\r\n protected hover(value: boolean): void {\r\n this.hovered = value;\r\n this.syncPause();\r\n }\r\n protected focusIn(event: FocusEvent): void {\r\n const previous = event.relatedTarget as HTMLElement | null;\r\n if (previous && !this.overlayRef?.overlayElement.contains(previous))\r\n this.previousFocus = previous;\r\n this.focused = true;\r\n this.syncPause();\r\n }\r\n protected focusOut(event: FocusEvent): void {\r\n this.focused =\r\n !!event.relatedTarget &&\r\n !!this.overlayRef?.overlayElement.contains(event.relatedTarget as Node);\r\n this.syncPause();\r\n }\r\n protected action(toast: RaqmToastRecord, event: MouseEvent): void {\r\n toast.action?.onClick(toast.id, event);\r\n }\r\n protected toastIndex(toast: RaqmToastRecord): number {\r\n if (!toast.ending)\r\n this.indices.set(\r\n toast.id,\r\n Math.max(\r\n 0,\r\n this.service.visibleToasts().findIndex((t) => t.id === toast.id),\r\n ),\r\n );\r\n return this.indices.get(toast.id) ?? 0;\r\n }\r\n protected swipe(value: boolean): void {\r\n this.swiping = value;\r\n this.syncPause();\r\n }\r\n private syncPause(): void {\r\n this.expanded.set(this.hovered || this.focused);\r\n // Focus-in reveals the content synchronously, before Angular's next render.\r\n this.overlayRef?.overlayElement.querySelectorAll<HTMLElement>('.raqm-toast').forEach((root) => {\r\n root.toggleAttribute('data-raqm-expanded', this.hovered || this.focused);\r\n });\r\n this.service.pauseViewport(this, this.hovered || this.focused || this.swiping);\r\n }\r\n private measure(): void {\r\n const viewport =\r\n this.overlayRef?.overlayElement.querySelector<HTMLElement>('.raqm-toast-viewport');\r\n const roots = Array.from(\r\n viewport?.querySelectorAll<HTMLElement>('.raqm-toast:not([data-raqm-ending-style])') ?? [],\r\n );\r\n const frontHeight = roots[0]?.querySelector<HTMLElement>('.raqm-toast-content')?.offsetHeight;\r\n if (viewport && frontHeight)\r\n viewport.style.setProperty('--toast-frontmost-height', `${frontHeight + 2}px`);\r\n let offset = 0;\r\n for (const root of roots) {\r\n root.style.setProperty('--toast-offset-y', `${offset}px`);\r\n offset += (root.querySelector<HTMLElement>('.raqm-toast-content')?.offsetHeight ?? 0) + 2;\r\n }\r\n }\r\n private ensureFocus(toasts: readonly RaqmToastRecord[]): void {\r\n const active = this.document.activeElement as HTMLElement | null;\r\n const root = active?.closest<HTMLElement>('.raqm-toast');\r\n if (!root || !this.overlayRef?.overlayElement.contains(root)) return;\r\n if (toasts.some((t) => t.id === root.dataset['raqmToastId'])) return;\r\n const next = Array.from(\r\n this.overlayRef.overlayElement.querySelectorAll<HTMLElement>('.raqm-toast'),\r\n ).find(\r\n (element) => element !== root && toasts.some((t) => t.id === element.dataset['raqmToastId']),\r\n );\r\n if (toasts.length && next) next.focus();\r\n else this.restoreFocus();\r\n }\r\n private restoreFocus(): void {\r\n if (!this.overlayRef?.overlayElement.contains(this.document.activeElement)) return;\r\n if (\r\n this.previousFocus?.isConnected &&\r\n !this.previousFocus.closest('[inert]') &&\r\n !this.previousFocus.matches(':disabled')\r\n ) {\r\n this.previousFocus.focus({ preventScroll: true });\r\n } else {\r\n (this.document.activeElement as HTMLElement | null)?.blur();\r\n }\r\n this.focused = false;\r\n this.syncPause();\r\n }\r\n private readonly onDocumentKeydown = (event: KeyboardEvent): void => {\r\n if (event.key !== 'F6' || !this.service.visibleToasts().length) return;\r\n event.preventDefault();\r\n if (this.overlayRef?.overlayElement.contains(this.document.activeElement)) this.restoreFocus();\r\n else {\r\n this.previousFocus = this.document.activeElement as HTMLElement | null;\r\n this.overlayRef?.overlayElement.querySelector<HTMLElement>('.raqm-toast')?.focus();\r\n }\r\n };\r\n}\r\n","<ng-template #panel>\r\n <section\r\n class=\"raqm-toast-viewport\"\r\n [attr.aria-label]=\"label()\"\r\n tabindex=\"-1\"\r\n (mouseenter)=\"hover(true)\"\r\n (mouseleave)=\"hover(false)\"\r\n (focusin)=\"focusIn($event)\"\r\n (focusout)=\"focusOut($event)\"\r\n >\r\n <div class=\"raqm-toast-announcer\" aria-live=\"polite\" aria-atomic=\"true\">\r\n {{ announcement() }}\r\n </div>\r\n @for (toast of service.renderedToasts(); track toast.id) {\r\n <raqm-toast\r\n [toast]=\"toast\"\r\n (swipingChange)=\"swipe($event)\"\r\n [attr.data-raqm-toast-id]=\"toast.id\"\r\n [style.--toast-index]=\"toastIndex(toast)\"\r\n [attr.data-raqm-ending-style]=\"toast.ending ? '' : null\"\r\n [attr.inert]=\"toast.ending ? '' : null\"\r\n [attr.aria-hidden]=\"toast.ending ? 'true' : null\"\r\n [attr.data-raqm-expanded]=\"expanded() ? '' : null\"\r\n [attr.data-raqm-behind]=\"toastIndex(toast) > 0 ? '' : null\"\r\n [attr.aria-labelledby]=\"toast.title ? toast.id + '-title' : null\"\r\n [attr.aria-describedby]=\"toast.description ? toast.id + '-description' : null\"\r\n >\r\n <div raqm-toast-content>\r\n @if (toast.type) {\r\n <raqm-toast-icon [type]=\"toast.type\" />\r\n }\r\n <div class=\"raqm-toast-text\">\r\n @if (toast.title) {\r\n <h2 raqm-toast-title [id]=\"toast.id + '-title'\">{{ toast.title }}</h2>\r\n }\r\n @if (toast.description) {\r\n <p raqm-toast-description [id]=\"toast.id + '-description'\">{{ toast.description }}</p>\r\n }\r\n </div>\r\n @if (toast.action; as actionOptions) {\r\n <button\r\n raqm-toast-action\r\n [disabled]=\"actionOptions.disabled ?? false\"\r\n (click)=\"action(toast, $event)\"\r\n >\r\n {{ actionOptions.label }}\r\n </button>\r\n }\r\n <button raqm-toast-close [attr.aria-label]=\"closeLabel()\"></button>\r\n </div>\r\n </raqm-toast>\r\n }\r\n </section>\r\n</ng-template>\r\n","// Public API for the `@raqm/ui/toast` entry point; the root entry re-exports these.\r\nimport {\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastComponent,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastIconComponent,\r\n RaqmToastTitleDirective,\r\n} from './toast.component';\r\nimport { RaqmToasterComponent } from './toaster.component';\r\n\r\nexport {\r\n RaqmToastComponent,\r\n RaqmToastTitleDirective,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastIconComponent,\r\n};\r\nexport { RaqmToasterComponent } from './toaster.component';\r\nexport { RaqmToastService } from './toast.service';\r\nexport type {\r\n RaqmToastActionOptions,\r\n RaqmToastId,\r\n RaqmToastOptions,\r\n RaqmToastRecord,\r\n RaqmToastType,\r\n} from './toast.service';\r\n\r\nexport const RaqmToast = [\r\n RaqmToastComponent,\r\n RaqmToastTitleDirective,\r\n RaqmToastContentDirective,\r\n RaqmToastDescriptionDirective,\r\n RaqmToastActionDirective,\r\n RaqmToastCloseComponent,\r\n RaqmToastIconComponent,\r\n RaqmToasterComponent,\r\n] as const;\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, InjectionToken, booleanAttribute, computed, inject, input, isDevMode, model, signal } from "@angular/core";
|
|
3
|
+
const RAQM_TOGGLE_GROUP = new InjectionToken("RaqmToggleGroup");
|
|
4
|
+
var RaqmToggleGroupComponent = class RaqmToggleGroupComponent {
|
|
5
|
+
host = inject(ElementRef);
|
|
6
|
+
outline = input(false, {
|
|
7
|
+
...ngDevMode ? { debugName: "outline" } : /* istanbul ignore next */ {},
|
|
8
|
+
transform: booleanAttribute
|
|
9
|
+
});
|
|
10
|
+
small = input(false, {
|
|
11
|
+
...ngDevMode ? { debugName: "small" } : /* istanbul ignore next */ {},
|
|
12
|
+
transform: booleanAttribute
|
|
13
|
+
});
|
|
14
|
+
large = input(false, {
|
|
15
|
+
...ngDevMode ? { debugName: "large" } : /* istanbul ignore next */ {},
|
|
16
|
+
transform: booleanAttribute
|
|
17
|
+
});
|
|
18
|
+
activeSize = computed(() => {
|
|
19
|
+
const small = this.small();
|
|
20
|
+
const large = this.large();
|
|
21
|
+
if (small && large) throw new Error("raqm-toggle-group: use either small or large, not both.");
|
|
22
|
+
return large ? "large" : small ? "small" : "default";
|
|
23
|
+
}, ...ngDevMode ? [{ debugName: "activeSize" }] : /* istanbul ignore next */ []);
|
|
24
|
+
vertical = input(false, {
|
|
25
|
+
...ngDevMode ? { debugName: "vertical" } : /* istanbul ignore next */ {},
|
|
26
|
+
transform: booleanAttribute
|
|
27
|
+
});
|
|
28
|
+
spacing = input(2, {
|
|
29
|
+
...ngDevMode ? { debugName: "spacing" } : /* istanbul ignore next */ {},
|
|
30
|
+
transform: (value) => {
|
|
31
|
+
const numeric = typeof value === "number" ? value : Number(value);
|
|
32
|
+
return Number.isFinite(numeric) && numeric >= 0 ? numeric : 2;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
multiple = input(false, {
|
|
36
|
+
...ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {},
|
|
37
|
+
transform: booleanAttribute
|
|
38
|
+
});
|
|
39
|
+
disabled = input(false, {
|
|
40
|
+
...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
|
|
41
|
+
transform: booleanAttribute
|
|
42
|
+
});
|
|
43
|
+
value = model([], ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
44
|
+
items = signal([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
|
|
45
|
+
active = signal(null, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
|
|
46
|
+
enabledItems = computed(() => this.items().filter((item) => !item.disabled()), ...ngDevMode ? [{ debugName: "enabledItems" }] : /* istanbul ignore next */ []);
|
|
47
|
+
tabStop = computed(() => {
|
|
48
|
+
const enabled = this.enabledItems();
|
|
49
|
+
if (enabled.length === 0) return null;
|
|
50
|
+
const active = this.active();
|
|
51
|
+
return active !== null && enabled.includes(active) ? active : enabled[0];
|
|
52
|
+
}, ...ngDevMode ? [{ debugName: "tabStop" }] : /* istanbul ignore next */ []);
|
|
53
|
+
isSelected(value) {
|
|
54
|
+
const current = this.value();
|
|
55
|
+
return this.multiple() ? current.includes(value) : current[0] === value;
|
|
56
|
+
}
|
|
57
|
+
activate(item) {
|
|
58
|
+
if (this.disabled() || item.disabled()) return;
|
|
59
|
+
const current = this.value();
|
|
60
|
+
if (this.multiple()) {
|
|
61
|
+
this.value.set(current.includes(item.value) ? current.filter((selected) => selected !== item.value) : [...current, item.value]);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.value.set(current[0] === item.value ? [] : [item.value]);
|
|
65
|
+
}
|
|
66
|
+
register(item) {
|
|
67
|
+
if (isDevMode() && this.items().some((registered) => registered.value === item.value)) console.error(`[raqm-toggle-group] Duplicate item value "${item.value}"; Toggle Group item values must be unique.`);
|
|
68
|
+
this.items.update((items) => [...items, item]);
|
|
69
|
+
}
|
|
70
|
+
unregister(item) {
|
|
71
|
+
this.items.update((items) => items.filter((registered) => registered !== item));
|
|
72
|
+
if (this.active() === item) this.active.set(null);
|
|
73
|
+
}
|
|
74
|
+
setActive(item) {
|
|
75
|
+
this.active.set(item);
|
|
76
|
+
}
|
|
77
|
+
isTabStop(item) {
|
|
78
|
+
return this.tabStop() === item;
|
|
79
|
+
}
|
|
80
|
+
moveFocus(item, event) {
|
|
81
|
+
const enabled = this.enabledItems();
|
|
82
|
+
const index = enabled.indexOf(item);
|
|
83
|
+
if (index === -1) return;
|
|
84
|
+
let target;
|
|
85
|
+
switch (event.key) {
|
|
86
|
+
case "Home":
|
|
87
|
+
target = enabled[0];
|
|
88
|
+
break;
|
|
89
|
+
case "End":
|
|
90
|
+
target = enabled[enabled.length - 1];
|
|
91
|
+
break;
|
|
92
|
+
case "ArrowLeft":
|
|
93
|
+
case "ArrowRight":
|
|
94
|
+
if (this.vertical()) return;
|
|
95
|
+
target = enabled[(index + (event.key === (this.isRtl() ? "ArrowLeft" : "ArrowRight") ? 1 : -1) + enabled.length) % enabled.length];
|
|
96
|
+
break;
|
|
97
|
+
case "ArrowUp":
|
|
98
|
+
case "ArrowDown":
|
|
99
|
+
if (!this.vertical()) return;
|
|
100
|
+
target = enabled[(index + (event.key === "ArrowDown" ? 1 : -1) + enabled.length) % enabled.length];
|
|
101
|
+
break;
|
|
102
|
+
default: return;
|
|
103
|
+
}
|
|
104
|
+
if (target === void 0) return;
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
this.active.set(target);
|
|
107
|
+
target.host.focus();
|
|
108
|
+
}
|
|
109
|
+
isRtl() {
|
|
110
|
+
return getComputedStyle(this.host.nativeElement).direction === "rtl";
|
|
111
|
+
}
|
|
112
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
113
|
+
minVersion: "12.0.0",
|
|
114
|
+
version: "22.2.2",
|
|
115
|
+
ngImport: i0,
|
|
116
|
+
type: RaqmToggleGroupComponent,
|
|
117
|
+
deps: [],
|
|
118
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
119
|
+
});
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
121
|
+
minVersion: "17.1.0",
|
|
122
|
+
version: "22.2.2",
|
|
123
|
+
type: RaqmToggleGroupComponent,
|
|
124
|
+
isStandalone: true,
|
|
125
|
+
selector: "raqm-toggle-group",
|
|
126
|
+
inputs: {
|
|
127
|
+
outline: {
|
|
128
|
+
classPropertyName: "outline",
|
|
129
|
+
publicName: "outline",
|
|
130
|
+
isSignal: true,
|
|
131
|
+
isRequired: false,
|
|
132
|
+
transformFunction: null
|
|
133
|
+
},
|
|
134
|
+
small: {
|
|
135
|
+
classPropertyName: "small",
|
|
136
|
+
publicName: "small",
|
|
137
|
+
isSignal: true,
|
|
138
|
+
isRequired: false,
|
|
139
|
+
transformFunction: null
|
|
140
|
+
},
|
|
141
|
+
large: {
|
|
142
|
+
classPropertyName: "large",
|
|
143
|
+
publicName: "large",
|
|
144
|
+
isSignal: true,
|
|
145
|
+
isRequired: false,
|
|
146
|
+
transformFunction: null
|
|
147
|
+
},
|
|
148
|
+
vertical: {
|
|
149
|
+
classPropertyName: "vertical",
|
|
150
|
+
publicName: "vertical",
|
|
151
|
+
isSignal: true,
|
|
152
|
+
isRequired: false,
|
|
153
|
+
transformFunction: null
|
|
154
|
+
},
|
|
155
|
+
spacing: {
|
|
156
|
+
classPropertyName: "spacing",
|
|
157
|
+
publicName: "spacing",
|
|
158
|
+
isSignal: true,
|
|
159
|
+
isRequired: false,
|
|
160
|
+
transformFunction: null
|
|
161
|
+
},
|
|
162
|
+
multiple: {
|
|
163
|
+
classPropertyName: "multiple",
|
|
164
|
+
publicName: "multiple",
|
|
165
|
+
isSignal: true,
|
|
166
|
+
isRequired: false,
|
|
167
|
+
transformFunction: null
|
|
168
|
+
},
|
|
169
|
+
disabled: {
|
|
170
|
+
classPropertyName: "disabled",
|
|
171
|
+
publicName: "disabled",
|
|
172
|
+
isSignal: true,
|
|
173
|
+
isRequired: false,
|
|
174
|
+
transformFunction: null
|
|
175
|
+
},
|
|
176
|
+
value: {
|
|
177
|
+
classPropertyName: "value",
|
|
178
|
+
publicName: "value",
|
|
179
|
+
isSignal: true,
|
|
180
|
+
isRequired: false,
|
|
181
|
+
transformFunction: null
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
outputs: { value: "valueChange" },
|
|
185
|
+
host: {
|
|
186
|
+
attributes: { "role": "group" },
|
|
187
|
+
properties: {
|
|
188
|
+
"attr.data-raqm-variant": "outline() ? \"outline\" : \"default\"",
|
|
189
|
+
"attr.data-raqm-small": "activeSize() === \"small\" ? \"\" : null",
|
|
190
|
+
"attr.data-raqm-large": "activeSize() === \"large\" ? \"\" : null",
|
|
191
|
+
"attr.data-raqm-vertical": "vertical() ? \"\" : null",
|
|
192
|
+
"attr.data-raqm-spacing": "spacing()",
|
|
193
|
+
"attr.data-raqm-multiple": "multiple()",
|
|
194
|
+
"attr.data-raqm-disabled": "disabled()",
|
|
195
|
+
"style.--raqm-toggle-group-spacing": "spacing()"
|
|
196
|
+
},
|
|
197
|
+
classAttribute: "raqm-toggle-group"
|
|
198
|
+
},
|
|
199
|
+
providers: [{
|
|
200
|
+
provide: RAQM_TOGGLE_GROUP,
|
|
201
|
+
useExisting: RaqmToggleGroupComponent
|
|
202
|
+
}],
|
|
203
|
+
ngImport: i0,
|
|
204
|
+
template: "<ng-content />",
|
|
205
|
+
isInline: true,
|
|
206
|
+
styles: [":host{display:flex;inline-size:fit-content;flex-direction:row;align-items:center;gap:calc(var(--raqm-spacing) * var(--raqm-toggle-group-spacing, 2));border-radius:var(--raqm-radius-lg)}:host([data-raqm-small]){border-radius:min(var(--raqm-radius-md),10px)}:host([data-raqm-vertical]){flex-direction:column;align-items:stretch}\n"],
|
|
207
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
211
|
+
minVersion: "12.0.0",
|
|
212
|
+
version: "22.2.2",
|
|
213
|
+
ngImport: i0,
|
|
214
|
+
type: RaqmToggleGroupComponent,
|
|
215
|
+
decorators: [{
|
|
216
|
+
type: Component,
|
|
217
|
+
args: [{
|
|
218
|
+
selector: "raqm-toggle-group",
|
|
219
|
+
template: "<ng-content />",
|
|
220
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
221
|
+
host: {
|
|
222
|
+
class: "raqm-toggle-group",
|
|
223
|
+
role: "group",
|
|
224
|
+
"[attr.data-raqm-variant]": "outline() ? \"outline\" : \"default\"",
|
|
225
|
+
"[attr.data-raqm-small]": "activeSize() === \"small\" ? \"\" : null",
|
|
226
|
+
"[attr.data-raqm-large]": "activeSize() === \"large\" ? \"\" : null",
|
|
227
|
+
"[attr.data-raqm-vertical]": "vertical() ? \"\" : null",
|
|
228
|
+
"[attr.data-raqm-spacing]": "spacing()",
|
|
229
|
+
"[attr.data-raqm-multiple]": "multiple()",
|
|
230
|
+
"[attr.data-raqm-disabled]": "disabled()",
|
|
231
|
+
"[style.--raqm-toggle-group-spacing]": "spacing()"
|
|
232
|
+
},
|
|
233
|
+
providers: [{
|
|
234
|
+
provide: RAQM_TOGGLE_GROUP,
|
|
235
|
+
useExisting: RaqmToggleGroupComponent
|
|
236
|
+
}],
|
|
237
|
+
styles: [":host{display:flex;inline-size:fit-content;flex-direction:row;align-items:center;gap:calc(var(--raqm-spacing) * var(--raqm-toggle-group-spacing, 2));border-radius:var(--raqm-radius-lg)}:host([data-raqm-small]){border-radius:min(var(--raqm-radius-md),10px)}:host([data-raqm-vertical]){flex-direction:column;align-items:stretch}\n"]
|
|
238
|
+
}]
|
|
239
|
+
}],
|
|
240
|
+
propDecorators: {
|
|
241
|
+
outline: [{
|
|
242
|
+
type: i0.Input,
|
|
243
|
+
args: [{
|
|
244
|
+
isSignal: true,
|
|
245
|
+
alias: "outline",
|
|
246
|
+
required: false
|
|
247
|
+
}]
|
|
248
|
+
}],
|
|
249
|
+
small: [{
|
|
250
|
+
type: i0.Input,
|
|
251
|
+
args: [{
|
|
252
|
+
isSignal: true,
|
|
253
|
+
alias: "small",
|
|
254
|
+
required: false
|
|
255
|
+
}]
|
|
256
|
+
}],
|
|
257
|
+
large: [{
|
|
258
|
+
type: i0.Input,
|
|
259
|
+
args: [{
|
|
260
|
+
isSignal: true,
|
|
261
|
+
alias: "large",
|
|
262
|
+
required: false
|
|
263
|
+
}]
|
|
264
|
+
}],
|
|
265
|
+
vertical: [{
|
|
266
|
+
type: i0.Input,
|
|
267
|
+
args: [{
|
|
268
|
+
isSignal: true,
|
|
269
|
+
alias: "vertical",
|
|
270
|
+
required: false
|
|
271
|
+
}]
|
|
272
|
+
}],
|
|
273
|
+
spacing: [{
|
|
274
|
+
type: i0.Input,
|
|
275
|
+
args: [{
|
|
276
|
+
isSignal: true,
|
|
277
|
+
alias: "spacing",
|
|
278
|
+
required: false
|
|
279
|
+
}]
|
|
280
|
+
}],
|
|
281
|
+
multiple: [{
|
|
282
|
+
type: i0.Input,
|
|
283
|
+
args: [{
|
|
284
|
+
isSignal: true,
|
|
285
|
+
alias: "multiple",
|
|
286
|
+
required: false
|
|
287
|
+
}]
|
|
288
|
+
}],
|
|
289
|
+
disabled: [{
|
|
290
|
+
type: i0.Input,
|
|
291
|
+
args: [{
|
|
292
|
+
isSignal: true,
|
|
293
|
+
alias: "disabled",
|
|
294
|
+
required: false
|
|
295
|
+
}]
|
|
296
|
+
}],
|
|
297
|
+
value: [{
|
|
298
|
+
type: i0.Input,
|
|
299
|
+
args: [{
|
|
300
|
+
isSignal: true,
|
|
301
|
+
alias: "value",
|
|
302
|
+
required: false
|
|
303
|
+
}]
|
|
304
|
+
}, {
|
|
305
|
+
type: i0.Output,
|
|
306
|
+
args: ["valueChange"]
|
|
307
|
+
}]
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
var RaqmToggleGroupItemComponent = class RaqmToggleGroupItemComponent {
|
|
311
|
+
host = inject(ElementRef);
|
|
312
|
+
group = inject(RAQM_TOGGLE_GROUP, { optional: true });
|
|
313
|
+
destroyRef = inject(DestroyRef);
|
|
314
|
+
value = input.required(...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
315
|
+
disabled = input(false, {
|
|
316
|
+
...ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {},
|
|
317
|
+
transform: booleanAttribute
|
|
318
|
+
});
|
|
319
|
+
isDisabled = computed(() => this.disabled() || (this.group?.disabled() ?? false), ...ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []);
|
|
320
|
+
outline = computed(() => this.group?.outline() ?? false, ...ngDevMode ? [{ debugName: "outline" }] : /* istanbul ignore next */ []);
|
|
321
|
+
activeSize = computed(() => this.group?.activeSize() ?? "default", ...ngDevMode ? [{ debugName: "activeSize" }] : /* istanbul ignore next */ []);
|
|
322
|
+
pressed = computed(() => this.group?.isSelected(this.value()) ?? false, ...ngDevMode ? [{ debugName: "pressed" }] : /* istanbul ignore next */ []);
|
|
323
|
+
ref = (() => {
|
|
324
|
+
const self = this;
|
|
325
|
+
return {
|
|
326
|
+
get value() {
|
|
327
|
+
return self.value();
|
|
328
|
+
},
|
|
329
|
+
get disabled() {
|
|
330
|
+
return self.isDisabled;
|
|
331
|
+
},
|
|
332
|
+
get host() {
|
|
333
|
+
return self.host.nativeElement;
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
})();
|
|
337
|
+
tabIndex = computed(() => {
|
|
338
|
+
if (this.group === null) return 0;
|
|
339
|
+
return this.group.isTabStop(this.ref) ? 0 : -1;
|
|
340
|
+
}, ...ngDevMode ? [{ debugName: "tabIndex" }] : /* istanbul ignore next */ []);
|
|
341
|
+
constructor() {
|
|
342
|
+
const element = this.host.nativeElement;
|
|
343
|
+
if (!element.hasAttribute("type")) element.setAttribute("type", "button");
|
|
344
|
+
if (isDevMode() && this.group === null) console.error("[raqm-toggle-group-item] No parent <raqm-toggle-group> found; the item has no selection state.");
|
|
345
|
+
this.destroyRef.onDestroy(() => this.group?.unregister(this.ref));
|
|
346
|
+
}
|
|
347
|
+
ngOnInit() {
|
|
348
|
+
this.group?.register(this.ref);
|
|
349
|
+
}
|
|
350
|
+
onClick() {
|
|
351
|
+
if (this.isDisabled()) return;
|
|
352
|
+
this.group?.activate(this.ref);
|
|
353
|
+
}
|
|
354
|
+
onFocus() {
|
|
355
|
+
this.group?.setActive(this.ref);
|
|
356
|
+
}
|
|
357
|
+
onKeydown(event) {
|
|
358
|
+
this.group?.moveFocus(this.ref, event);
|
|
359
|
+
}
|
|
360
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
361
|
+
minVersion: "12.0.0",
|
|
362
|
+
version: "22.2.2",
|
|
363
|
+
ngImport: i0,
|
|
364
|
+
type: RaqmToggleGroupItemComponent,
|
|
365
|
+
deps: [],
|
|
366
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
367
|
+
});
|
|
368
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
369
|
+
minVersion: "17.1.0",
|
|
370
|
+
version: "22.2.2",
|
|
371
|
+
type: RaqmToggleGroupItemComponent,
|
|
372
|
+
isStandalone: true,
|
|
373
|
+
selector: "button[raqm-toggle-group-item]",
|
|
374
|
+
inputs: {
|
|
375
|
+
value: {
|
|
376
|
+
classPropertyName: "value",
|
|
377
|
+
publicName: "value",
|
|
378
|
+
isSignal: true,
|
|
379
|
+
isRequired: true,
|
|
380
|
+
transformFunction: null
|
|
381
|
+
},
|
|
382
|
+
disabled: {
|
|
383
|
+
classPropertyName: "disabled",
|
|
384
|
+
publicName: "disabled",
|
|
385
|
+
isSignal: true,
|
|
386
|
+
isRequired: false,
|
|
387
|
+
transformFunction: null
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
host: {
|
|
391
|
+
listeners: {
|
|
392
|
+
"click": "onClick()",
|
|
393
|
+
"focus": "onFocus()",
|
|
394
|
+
"keydown": "onKeydown($event)"
|
|
395
|
+
},
|
|
396
|
+
properties: {
|
|
397
|
+
"attr.data-raqm-variant": "outline() ? \"outline\" : \"default\"",
|
|
398
|
+
"attr.data-raqm-small": "activeSize() === \"small\" ? \"\" : null",
|
|
399
|
+
"attr.data-raqm-large": "activeSize() === \"large\" ? \"\" : null",
|
|
400
|
+
"attr.aria-pressed": "pressed() ? \"true\" : \"false\"",
|
|
401
|
+
"attr.disabled": "isDisabled() ? \"\" : null",
|
|
402
|
+
"attr.tabindex": "tabIndex()"
|
|
403
|
+
},
|
|
404
|
+
classAttribute: "raqm-toggle-group-item"
|
|
405
|
+
},
|
|
406
|
+
ngImport: i0,
|
|
407
|
+
template: "<ng-content />",
|
|
408
|
+
isInline: true,
|
|
409
|
+
styles: [":host{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;-webkit-user-select:none;user-select:none;vertical-align:middle;gap:calc(var(--raqm-spacing) * 1);border-radius:var(--raqm-radius-lg);font-size:var(--raqm-font-size-sm);font-weight:var(--raqm-font-weight-medium);transition-property:color,background-color,border-color,box-shadow;transition-duration:var(--raqm-duration-base);transition-timing-function:var(--raqm-ease-standard);outline:none;border:0;background-color:transparent;block-size:calc(var(--raqm-spacing) * 8);min-inline-size:calc(var(--raqm-spacing) * 8);padding-inline:calc(var(--raqm-spacing) * 2.5)}:host([data-raqm-small]){block-size:calc(var(--raqm-spacing) * 7);min-inline-size:calc(var(--raqm-spacing) * 7);border-radius:min(var(--raqm-radius-md),12px);padding-inline:calc(var(--raqm-spacing) * 2.5);font-size:.8rem}:host([data-raqm-large]){block-size:calc(var(--raqm-spacing) * 9);min-inline-size:calc(var(--raqm-spacing) * 9);padding-inline:calc(var(--raqm-spacing) * 2.5)}:host([data-raqm-variant=outline]){border:1px solid var(--raqm-input);background-color:transparent}:host(:hover){background-color:var(--raqm-muted);color:var(--raqm-foreground)}:host([aria-pressed=true]){background-color:var(--raqm-muted)}:host(:focus-visible){border-color:var(--raqm-ring);box-shadow:0 0 0 var(--raqm-focus-ring-width) var(--raqm-focus-ring-color)}:host([aria-invalid=true]){border-color:var(--raqm-invalid-border);box-shadow:0 0 0 var(--raqm-focus-ring-width) var(--raqm-invalid-ring)}:host(:disabled){pointer-events:none;opacity:var(--raqm-disabled-opacity)}:host{flex-shrink:0}\n"],
|
|
410
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
411
|
+
});
|
|
412
|
+
};
|
|
413
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
414
|
+
minVersion: "12.0.0",
|
|
415
|
+
version: "22.2.2",
|
|
416
|
+
ngImport: i0,
|
|
417
|
+
type: RaqmToggleGroupItemComponent,
|
|
418
|
+
decorators: [{
|
|
419
|
+
type: Component,
|
|
420
|
+
args: [{
|
|
421
|
+
selector: "button[raqm-toggle-group-item]",
|
|
422
|
+
template: "<ng-content />",
|
|
423
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
424
|
+
host: {
|
|
425
|
+
class: "raqm-toggle-group-item",
|
|
426
|
+
"[attr.data-raqm-variant]": "outline() ? \"outline\" : \"default\"",
|
|
427
|
+
"[attr.data-raqm-small]": "activeSize() === \"small\" ? \"\" : null",
|
|
428
|
+
"[attr.data-raqm-large]": "activeSize() === \"large\" ? \"\" : null",
|
|
429
|
+
"[attr.aria-pressed]": "pressed() ? \"true\" : \"false\"",
|
|
430
|
+
"[attr.disabled]": "isDisabled() ? \"\" : null",
|
|
431
|
+
"[attr.tabindex]": "tabIndex()",
|
|
432
|
+
"(click)": "onClick()",
|
|
433
|
+
"(focus)": "onFocus()",
|
|
434
|
+
"(keydown)": "onKeydown($event)"
|
|
435
|
+
},
|
|
436
|
+
styles: [":host{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;-webkit-user-select:none;user-select:none;vertical-align:middle;gap:calc(var(--raqm-spacing) * 1);border-radius:var(--raqm-radius-lg);font-size:var(--raqm-font-size-sm);font-weight:var(--raqm-font-weight-medium);transition-property:color,background-color,border-color,box-shadow;transition-duration:var(--raqm-duration-base);transition-timing-function:var(--raqm-ease-standard);outline:none;border:0;background-color:transparent;block-size:calc(var(--raqm-spacing) * 8);min-inline-size:calc(var(--raqm-spacing) * 8);padding-inline:calc(var(--raqm-spacing) * 2.5)}:host([data-raqm-small]){block-size:calc(var(--raqm-spacing) * 7);min-inline-size:calc(var(--raqm-spacing) * 7);border-radius:min(var(--raqm-radius-md),12px);padding-inline:calc(var(--raqm-spacing) * 2.5);font-size:.8rem}:host([data-raqm-large]){block-size:calc(var(--raqm-spacing) * 9);min-inline-size:calc(var(--raqm-spacing) * 9);padding-inline:calc(var(--raqm-spacing) * 2.5)}:host([data-raqm-variant=outline]){border:1px solid var(--raqm-input);background-color:transparent}:host(:hover){background-color:var(--raqm-muted);color:var(--raqm-foreground)}:host([aria-pressed=true]){background-color:var(--raqm-muted)}:host(:focus-visible){border-color:var(--raqm-ring);box-shadow:0 0 0 var(--raqm-focus-ring-width) var(--raqm-focus-ring-color)}:host([aria-invalid=true]){border-color:var(--raqm-invalid-border);box-shadow:0 0 0 var(--raqm-focus-ring-width) var(--raqm-invalid-ring)}:host(:disabled){pointer-events:none;opacity:var(--raqm-disabled-opacity)}:host{flex-shrink:0}\n"]
|
|
437
|
+
}]
|
|
438
|
+
}],
|
|
439
|
+
ctorParameters: () => [],
|
|
440
|
+
propDecorators: {
|
|
441
|
+
value: [{
|
|
442
|
+
type: i0.Input,
|
|
443
|
+
args: [{
|
|
444
|
+
isSignal: true,
|
|
445
|
+
alias: "value",
|
|
446
|
+
required: true
|
|
447
|
+
}]
|
|
448
|
+
}],
|
|
449
|
+
disabled: [{
|
|
450
|
+
type: i0.Input,
|
|
451
|
+
args: [{
|
|
452
|
+
isSignal: true,
|
|
453
|
+
alias: "disabled",
|
|
454
|
+
required: false
|
|
455
|
+
}]
|
|
456
|
+
}]
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
const RaqmToggleGroup = [RaqmToggleGroupComponent, RaqmToggleGroupItemComponent];
|
|
460
|
+
export { RaqmToggleGroup, RaqmToggleGroupComponent, RaqmToggleGroupItemComponent };
|
|
461
|
+
|
|
462
|
+
//# sourceMappingURL=raqm-ui-toggle-group.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raqm-ui-toggle-group.mjs","names":[],"sources":["../../../projects/ui/toggle-group/toggle-group-context.ts","../../../projects/ui/toggle-group/toggle-group.ts","../../../projects/ui/toggle-group/toggle-group-item.ts","../../../projects/ui/toggle-group/public-api.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\r\n\r\n/** Stable identity of one item, kept in DOM order for roving focus. */\r\nexport interface RaqmToggleGroupItemRef {\r\n /** Unique, non-empty item value used by the group's selection contract. */\r\n readonly value: string;\r\n /** Reactive: true when the item or its group is disabled. */\r\n readonly disabled: Signal<boolean>;\r\n /** The item's native `<button>` host, used only to move focus. */\r\n readonly host: HTMLElement;\r\n}\r\n\r\n/** Typed contract published by the group; a dedicated token avoids a runtime module cycle. */\r\nexport interface RaqmToggleGroupContext {\r\n /** Parent appearance; the group's value always wins over the item default. */\r\n readonly outline: Signal<boolean>;\r\n /** Parent size; the group's value always wins over the item default. */\r\n readonly activeSize: Signal<'default' | 'small' | 'large'>;\r\n /** Parent axis, used to map arrow keys to the nearest direction. */\r\n readonly vertical: Signal<boolean>;\r\n readonly multiple: Signal<boolean>;\r\n readonly disabled: Signal<boolean>;\r\n isSelected(value: string): boolean;\r\n /** Applies the group's selection rules to an activated item (no-op if disabled). */\r\n activate(item: RaqmToggleGroupItemRef): void;\r\n /** Registers an item for focus management; called once per item. */\r\n register(item: RaqmToggleGroupItemRef): void;\r\n /** Unregisters an item when it is destroyed; never changes the value. */\r\n unregister(item: RaqmToggleGroupItemRef): void;\r\n setActive(item: RaqmToggleGroupItemRef): void;\r\n /** Whether the item is the group's single roving tab stop. */\r\n isTabStop(item: RaqmToggleGroupItemRef): boolean;\r\n /** Moves focus for a keyboard event without changing the selected value. */\r\n moveFocus(item: RaqmToggleGroupItemRef, event: KeyboardEvent): void;\r\n}\r\n\r\n/** Injection token for the parent group; injected optionally so a standalone item still renders. */\r\nexport const RAQM_TOGGLE_GROUP = new InjectionToken<RaqmToggleGroupContext>('RaqmToggleGroup');\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n isDevMode,\r\n model,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n RAQM_TOGGLE_GROUP,\r\n RaqmToggleGroupContext,\r\n RaqmToggleGroupItemRef,\r\n} from './toggle-group-context';\r\n\r\n/**\r\n * Group container that owns selection for `button[raqm-toggle-group-item]`.\r\n *\r\n * @remarks\r\n * The host carries `role=\"group\"`; the application supplies the accessible name.\r\n * The group owns the `value` model: single mode keeps at most one value and clears\r\n * to `[]`, multiple mode toggles membership without duplicates. Unknown values stay\r\n * in the model but render unselected.\r\n * Roving focus: one enabled item is a tab stop; Arrow/Home/End move focus without\r\n * changing the value, and Left/Right follow the resolved direction (RTL reverses).\r\n */\r\n@Component({\r\n selector: 'raqm-toggle-group',\r\n template: '<ng-content />',\r\n styleUrl: './toggle-group.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toggle-group',\r\n role: 'group',\r\n '[attr.data-raqm-variant]': 'outline() ? \"outline\" : \"default\"',\r\n '[attr.data-raqm-small]': 'activeSize() === \"small\" ? \"\" : null',\r\n '[attr.data-raqm-large]': 'activeSize() === \"large\" ? \"\" : null',\r\n '[attr.data-raqm-vertical]': 'vertical() ? \"\" : null',\r\n // Exposes the sanitised spacing so the seam rules can detect a zero gap.\r\n '[attr.data-raqm-spacing]': 'spacing()',\r\n '[attr.data-raqm-multiple]': 'multiple()',\r\n '[attr.data-raqm-disabled]': 'disabled()',\r\n '[style.--raqm-toggle-group-spacing]': 'spacing()',\r\n },\r\n providers: [{ provide: RAQM_TOGGLE_GROUP, useExisting: RaqmToggleGroupComponent }],\r\n})\r\nexport class RaqmToggleGroupComponent implements RaqmToggleGroupContext {\r\n // Resolves the nearest writing direction for arrow keys, without a listener.\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n\r\n readonly outline = input(false, { transform: booleanAttribute });\r\n\r\n // Full-word booleans; neither means the default size.\r\n readonly small = input(false, { transform: booleanAttribute });\r\n readonly large = input(false, { transform: booleanAttribute });\r\n\r\n /** The resolved size; setting both attributes is rejected. */\r\n readonly activeSize = computed<'default' | 'small' | 'large'>(() => {\r\n const small = this.small();\r\n const large = this.large();\r\n if (small && large) {\r\n throw new Error('raqm-toggle-group: use either small or large, not both.');\r\n }\r\n return large ? 'large' : small ? 'small' : 'default';\r\n });\r\n\r\n readonly vertical = input(false, { transform: booleanAttribute });\r\n\r\n // Gap in `--raqm-spacing` units; non-finite or negative values fall back to `2`.\r\n readonly spacing = input(2, {\r\n transform: (value: unknown): number => {\r\n const numeric = typeof value === 'number' ? value : Number(value);\r\n return Number.isFinite(numeric) && numeric >= 0 ? numeric : 2;\r\n },\r\n });\r\n\r\n // False permits zero/one selected; true toggles membership.\r\n readonly multiple = input(false, { transform: booleanAttribute });\r\n\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n // Group-owned selection model: a string array in both modes.\r\n readonly value = model<readonly string[]>([]);\r\n\r\n private readonly items = signal<RaqmToggleGroupItemRef[]>([]);\r\n\r\n private readonly active = signal<RaqmToggleGroupItemRef | null>(null);\r\n\r\n private readonly enabledItems = computed<RaqmToggleGroupItemRef[]>(() =>\r\n this.items().filter((item) => !item.disabled()),\r\n );\r\n\r\n // The single roving tab stop: the active item when enabled, else the first.\r\n private readonly tabStop = computed<RaqmToggleGroupItemRef | null>(() => {\r\n const enabled = this.enabledItems();\r\n if (enabled.length === 0) {\r\n return null;\r\n }\r\n const active = this.active();\r\n return active !== null && enabled.includes(active) ? active : enabled[0];\r\n });\r\n\r\n /** Single mode reads only the first entry, which is never coerced or re-emitted. */\r\n isSelected(value: string): boolean {\r\n const current = this.value();\r\n return this.multiple() ? current.includes(value) : current[0] === value;\r\n }\r\n\r\n /** A disabled group or item is a no-op; multiple mode preserves selected order. */\r\n activate(item: RaqmToggleGroupItemRef): void {\r\n if (this.disabled() || item.disabled()) {\r\n return;\r\n }\r\n const current = this.value();\r\n if (this.multiple()) {\r\n this.value.set(\r\n current.includes(item.value)\r\n ? current.filter((selected) => selected !== item.value)\r\n : [...current, item.value],\r\n );\r\n return;\r\n }\r\n this.value.set(current[0] === item.value ? [] : [item.value]);\r\n }\r\n\r\n /** Registers in DOM order; constructor-time registration throws `NG0950` in development. */\r\n register(item: RaqmToggleGroupItemRef): void {\r\n if (isDevMode() && this.items().some((registered) => registered.value === item.value)) {\r\n console.error(\r\n `[raqm-toggle-group] Duplicate item value \"${item.value}\"; Toggle Group item values must be unique.`,\r\n );\r\n }\r\n this.items.update((items) => [...items, item]);\r\n }\r\n\r\n /** Leaves selection untouched, so removal emits no change event. */\r\n unregister(item: RaqmToggleGroupItemRef): void {\r\n this.items.update((items) => items.filter((registered) => registered !== item));\r\n if (this.active() === item) {\r\n this.active.set(null);\r\n }\r\n }\r\n\r\n /** Marks an item as the roving focus target (on focus and on click). */\r\n setActive(item: RaqmToggleGroupItemRef): void {\r\n this.active.set(item);\r\n }\r\n\r\n /** Whether the item is the group's single roving tab stop. */\r\n isTabStop(item: RaqmToggleGroupItemRef): boolean {\r\n return this.tabStop() === item;\r\n }\r\n\r\n /**\r\n * Moves focus among enabled items without changing the value, wrapping at either end.\r\n * Home/End jump to first/last; foreign keys are ignored without `preventDefault`.\r\n */\r\n moveFocus(item: RaqmToggleGroupItemRef, event: KeyboardEvent): void {\r\n const enabled = this.enabledItems();\r\n const index = enabled.indexOf(item);\r\n if (index === -1) {\r\n return;\r\n }\r\n\r\n let target: RaqmToggleGroupItemRef | undefined;\r\n switch (event.key) {\r\n case 'Home':\r\n target = enabled[0];\r\n break;\r\n case 'End':\r\n target = enabled[enabled.length - 1];\r\n break;\r\n case 'ArrowLeft':\r\n case 'ArrowRight': {\r\n if (this.vertical()) {\r\n return;\r\n }\r\n const forward = event.key === (this.isRtl() ? 'ArrowLeft' : 'ArrowRight');\r\n target = enabled[(index + (forward ? 1 : -1) + enabled.length) % enabled.length];\r\n break;\r\n }\r\n case 'ArrowUp':\r\n case 'ArrowDown': {\r\n if (!this.vertical()) {\r\n return;\r\n }\r\n const forward = event.key === 'ArrowDown';\r\n target = enabled[(index + (forward ? 1 : -1) + enabled.length) % enabled.length];\r\n break;\r\n }\r\n default:\r\n return;\r\n }\r\n\r\n if (target === undefined) {\r\n return;\r\n }\r\n event.preventDefault();\r\n this.active.set(target);\r\n target.host.focus();\r\n }\r\n\r\n // Resolves direction from the host's computed style, without a global listener.\r\n private isRtl(): boolean {\r\n return getComputedStyle(this.host.nativeElement).direction === 'rtl';\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n ElementRef,\r\n OnInit,\r\n Signal,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n isDevMode,\r\n} from '@angular/core';\r\n\r\nimport {\r\n RAQM_TOGGLE_GROUP,\r\n RaqmToggleGroupContext,\r\n RaqmToggleGroupItemRef,\r\n} from './toggle-group-context';\r\n\r\n/** Native toggle button whose pressed state derives from the parent group's selection. */\r\n@Component({\r\n selector: 'button[raqm-toggle-group-item]',\r\n template: '<ng-content />',\r\n styleUrl: './toggle-group-item.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'raqm-toggle-group-item',\r\n '[attr.data-raqm-variant]': 'outline() ? \"outline\" : \"default\"',\r\n '[attr.data-raqm-small]': 'activeSize() === \"small\" ? \"\" : null',\r\n '[attr.data-raqm-large]': 'activeSize() === \"large\" ? \"\" : null',\r\n // Published as the real `aria-pressed` state.\r\n '[attr.aria-pressed]': 'pressed() ? \"true\" : \"false\"',\r\n '[attr.disabled]': 'isDisabled() ? \"\" : null',\r\n '[attr.tabindex]': 'tabIndex()',\r\n '(click)': 'onClick()',\r\n '(focus)': 'onFocus()',\r\n '(keydown)': 'onKeydown($event)',\r\n },\r\n})\r\nexport class RaqmToggleGroupItemComponent implements OnInit {\r\n private readonly host = inject(ElementRef<HTMLButtonElement>);\r\n\r\n // Optional so a misplaced standalone item still renders and reports a dev error.\r\n private readonly group = inject<RaqmToggleGroupContext | null>(RAQM_TOGGLE_GROUP, {\r\n optional: true,\r\n });\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n // Public value API: required, unique and stable for the item's lifetime.\r\n readonly value = input.required<string>();\r\n\r\n // Public disabled API: item-local state; the group's disabled state also applies.\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n\r\n protected readonly isDisabled = computed(\r\n () => this.disabled() || (this.group?.disabled() ?? false),\r\n );\r\n\r\n protected readonly outline = computed(() => this.group?.outline() ?? false);\r\n\r\n protected readonly activeSize = computed(() => this.group?.activeSize() ?? 'default');\r\n\r\n protected readonly pressed = computed(() => this.group?.isSelected(this.value()) ?? false);\r\n\r\n // Getters read live signals so registration, disabled changes and focus stay reactive.\r\n private readonly ref: RaqmToggleGroupItemRef = (() => {\r\n const self = this;\r\n return {\r\n get value(): string {\r\n return self.value();\r\n },\r\n get disabled(): Signal<boolean> {\r\n return self.isDisabled;\r\n },\r\n get host(): HTMLElement {\r\n return self.host.nativeElement;\r\n },\r\n };\r\n })();\r\n\r\n // Roving tabindex: `0` for the group's tab stop, `-1` otherwise; a standalone item keeps `0`.\r\n protected readonly tabIndex = computed(() => {\r\n if (this.group === null) {\r\n return 0;\r\n }\r\n return this.group.isTabStop(this.ref) ? 0 : -1;\r\n });\r\n\r\n constructor() {\r\n // `button` is set only when no consumer `type` exists; an explicit native value is preserved.\r\n const element = this.host.nativeElement;\r\n if (!element.hasAttribute('type')) {\r\n element.setAttribute('type', 'button');\r\n }\r\n\r\n if (isDevMode() && this.group === null) {\r\n console.error(\r\n '[raqm-toggle-group-item] No parent <raqm-toggle-group> found; the item has no selection state.',\r\n );\r\n }\r\n\r\n this.destroyRef.onDestroy(() => this.group?.unregister(this.ref));\r\n }\r\n\r\n /**\r\n * Registers after required inputs are bound; constructor-time registration throws `NG0950` in development.\r\n * Runs before host bindings, preserving DOM order and the roving tabindex.\r\n */\r\n ngOnInit(): void {\r\n this.group?.register(this.ref);\r\n }\r\n\r\n /** Activates through the group; the guard is defensive because disabled buttons already suppress click. */\r\n protected onClick(): void {\r\n if (this.isDisabled()) {\r\n return;\r\n }\r\n this.group?.activate(this.ref);\r\n }\r\n\r\n protected onFocus(): void {\r\n this.group?.setActive(this.ref);\r\n }\r\n\r\n /** Delegates arrow/Home/End focus movement to the group (value untouched). */\r\n protected onKeydown(event: KeyboardEvent): void {\r\n this.group?.moveFocus(this.ref, event);\r\n }\r\n}\r\n","import { RaqmToggleGroupComponent } from './toggle-group';\r\nimport { RaqmToggleGroupItemComponent } from './toggle-group-item';\r\n\r\nexport { RaqmToggleGroupComponent, RaqmToggleGroupItemComponent };\r\nexport const RaqmToggleGroup = [RaqmToggleGroupComponent, RaqmToggleGroupItemComponent] as const;\r\n"],"mappings":"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"}
|