@mcp-elements/angular 0.1.0 → 0.1.1

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.
Files changed (44) hide show
  1. package/dist/index.d.ts +506 -0
  2. package/dist/index.js +2714 -0
  3. package/dist/index.js.map +1 -0
  4. package/package.json +28 -11
  5. package/src/accordion.component.ts +0 -74
  6. package/src/ai-badge.component.ts +0 -26
  7. package/src/alert.component.ts +0 -25
  8. package/src/avatar.component.ts +0 -24
  9. package/src/badge.component.ts +0 -17
  10. package/src/button.component.ts +0 -27
  11. package/src/card.component.ts +0 -46
  12. package/src/chat-bubble.component.ts +0 -53
  13. package/src/chips.component.ts +0 -33
  14. package/src/counter.component.ts +0 -48
  15. package/src/dialog.component.ts +0 -42
  16. package/src/drawer.component.ts +0 -48
  17. package/src/dropdown-menu.component.ts +0 -62
  18. package/src/feedback.component.ts +0 -71
  19. package/src/index.ts +0 -86
  20. package/src/input.component.ts +0 -46
  21. package/src/loader.component.ts +0 -12
  22. package/src/mcp/index.ts +0 -9
  23. package/src/mcp/mcp-app-frame.component.ts +0 -60
  24. package/src/mcp/mcp-consent-dialog.component.ts +0 -63
  25. package/src/mcp/mcp-resource-browser.component.ts +0 -86
  26. package/src/mcp/mcp-scope-inspector.component.ts +0 -81
  27. package/src/mcp/mcp-server-status.component.ts +0 -44
  28. package/src/mcp/mcp-tool-call.component.ts +0 -105
  29. package/src/mcp/mcp-tool-form.component.ts +0 -127
  30. package/src/password-input.component.ts +0 -35
  31. package/src/popover.component.ts +0 -40
  32. package/src/progress.component.ts +0 -20
  33. package/src/prompt-input.component.ts +0 -70
  34. package/src/select.component.ts +0 -106
  35. package/src/separator.component.ts +0 -15
  36. package/src/skeleton.component.ts +0 -11
  37. package/src/source-card.component.ts +0 -34
  38. package/src/streaming-text.component.ts +0 -43
  39. package/src/suggestion-chips.component.ts +0 -23
  40. package/src/switch.component.ts +0 -32
  41. package/src/tabs.component.ts +0 -95
  42. package/src/textarea.component.ts +0 -22
  43. package/src/toast.component.ts +0 -62
  44. package/src/tooltip.directive.ts +0 -63
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/button.component.ts","../src/badge.component.ts","../src/card.component.ts","../src/input.component.ts","../src/textarea.component.ts","../src/avatar.component.ts","../src/separator.component.ts","../src/skeleton.component.ts","../src/dialog.component.ts","../src/tabs.component.ts","../src/accordion.component.ts","../src/select.component.ts","../src/tooltip.directive.ts","../src/popover.component.ts","../src/toast.component.ts","../src/drawer.component.ts","../src/dropdown-menu.component.ts","../src/switch.component.ts","../src/progress.component.ts","../src/loader.component.ts","../src/chips.component.ts","../src/password-input.component.ts","../src/counter.component.ts","../src/alert.component.ts","../src/prompt-input.component.ts","../src/chat-bubble.component.ts","../src/ai-badge.component.ts","../src/suggestion-chips.component.ts","../src/source-card.component.ts","../src/streaming-text.component.ts","../src/feedback.component.ts","../src/mcp/mcp-server-status.component.ts","../src/mcp/mcp-tool-call.component.ts","../src/mcp/mcp-tool-form.component.ts","../src/mcp/mcp-consent-dialog.component.ts","../src/mcp/mcp-scope-inspector.component.ts","../src/mcp/mcp-resource-browser.component.ts","../src/mcp/mcp-app-frame.component.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core'\n\ntype ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'link'\ntype ButtonSize = 'sm' | 'md' | 'lg' | 'icon'\n\n@Component({\n selector: 'mcpe-button',\n standalone: true,\n template: `\n <button [class]=\"classes()\" [disabled]=\"disabled()\" [type]=\"type()\">\n <ng-content />\n </button>\n `,\n})\nexport class SnxButtonComponent {\n variant = input<ButtonVariant>('primary')\n size = input<ButtonSize>('md')\n disabled = input(false)\n type = input<'button' | 'submit' | 'reset'>('button')\n class = input('')\n\n classes = computed(() =>\n ['mcpe-btn', `mcpe-btn-${this.variant()}`, `mcpe-btn-${this.size()}`, this.class()]\n .filter(Boolean)\n .join(' ')\n )\n}\n","import { Component, computed, input } from '@angular/core'\n\ntype BadgeVariant = 'default' | 'secondary' | 'outline' | 'destructive'\n\n@Component({\n selector: 'mcpe-badge',\n standalone: true,\n template: `<span [class]=\"classes()\"><ng-content /></span>`,\n})\nexport class SnxBadgeComponent {\n variant = input<BadgeVariant>('default')\n class = input('')\n\n classes = computed(() =>\n ['mcpe-badge', `mcpe-badge-${this.variant()}`, this.class()].filter(Boolean).join(' ')\n )\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-card',\n standalone: true,\n template: `<div [class]=\"classes()\"><ng-content /></div>`,\n})\nexport class SnxCardComponent {\n class = input('')\n classes = computed(() => ['mcpe-card', this.class()].filter(Boolean).join(' '))\n}\n\n@Component({\n selector: 'mcpe-card-header',\n standalone: true,\n template: `<div class=\"mcpe-card-header\"><ng-content /></div>`,\n})\nexport class SnxCardHeaderComponent {}\n\n@Component({\n selector: 'mcpe-card-title',\n standalone: true,\n template: `<h3 class=\"mcpe-card-title\"><ng-content /></h3>`,\n})\nexport class SnxCardTitleComponent {}\n\n@Component({\n selector: 'mcpe-card-description',\n standalone: true,\n template: `<p class=\"mcpe-card-description\"><ng-content /></p>`,\n})\nexport class SnxCardDescriptionComponent {}\n\n@Component({\n selector: 'mcpe-card-content',\n standalone: true,\n template: `<div class=\"mcpe-card-content\"><ng-content /></div>`,\n})\nexport class SnxCardContentComponent {}\n\n@Component({\n selector: 'mcpe-card-footer',\n standalone: true,\n template: `<div class=\"mcpe-card-footer\"><ng-content /></div>`,\n})\nexport class SnxCardFooterComponent {}\n","import { Component, input, computed, output, forwardRef } from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\n\n@Component({\n selector: 'mcpe-input',\n standalone: true,\n template: `\n <input\n [class]=\"classes()\"\n [type]=\"type()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [value]=\"value()\"\n (input)=\"onInput($event)\"\n (blur)=\"onTouched()\"\n />\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SnxInputComponent),\n multi: true,\n },\n ],\n})\nexport class SnxInputComponent implements ControlValueAccessor {\n type = input<string>('text')\n placeholder = input('')\n disabled = input(false)\n value = input('')\n class = input('')\n\n classes = computed(() => ['mcpe-input', this.class()].filter(Boolean).join(' '))\n\n private onChange: (value: string) => void = () => {}\n onTouched: () => void = () => {}\n\n onInput(event: Event) {\n const value = (event.target as HTMLInputElement).value\n this.onChange(value)\n }\n\n writeValue(value: string): void {}\n registerOnChange(fn: (value: string) => void): void { this.onChange = fn }\n registerOnTouched(fn: () => void): void { this.onTouched = fn }\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-textarea',\n standalone: true,\n template: `\n <textarea\n [class]=\"classes()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [rows]=\"rows()\"\n ><ng-content /></textarea>\n `,\n})\nexport class SnxTextareaComponent {\n placeholder = input('')\n disabled = input(false)\n rows = input(3)\n class = input('')\n\n classes = computed(() => ['mcpe-textarea', this.class()].filter(Boolean).join(' '))\n}\n","import { Component, input, computed, signal } from '@angular/core'\n\n@Component({\n selector: 'mcpe-avatar',\n standalone: true,\n template: `\n <div [class]=\"classes()\">\n @if (src() && !hasError()) {\n <img [src]=\"src()\" [alt]=\"alt()\" class=\"mcpe-avatar-image\" (error)=\"hasError.set(true)\" />\n } @else {\n <span class=\"mcpe-avatar-fallback\">{{ fallback() }}</span>\n }\n </div>\n `,\n})\nexport class SnxAvatarComponent {\n src = input<string>('')\n alt = input('')\n fallback = input('')\n class = input('')\n hasError = signal(false)\n\n classes = computed(() => ['mcpe-avatar', this.class()].filter(Boolean).join(' '))\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-separator',\n standalone: true,\n template: `<div [class]=\"classes()\" role=\"separator\" [attr.aria-orientation]=\"orientation()\"></div>`,\n})\nexport class SnxSeparatorComponent {\n orientation = input<'horizontal' | 'vertical'>('horizontal')\n class = input('')\n\n classes = computed(() =>\n ['mcpe-separator', `mcpe-separator-${this.orientation()}`, this.class()].filter(Boolean).join(' ')\n )\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-skeleton',\n standalone: true,\n template: `<div [class]=\"classes()\"></div>`,\n})\nexport class SnxSkeletonComponent {\n class = input('')\n classes = computed(() => ['mcpe-skeleton', this.class()].filter(Boolean).join(' '))\n}\n","import { Component, input, output, signal, computed, effect, ElementRef, viewChild } from '@angular/core'\nimport { createDialog } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-dialog',\n standalone: true,\n template: `\n @if (open()) {\n <div class=\"mcpe-dialog-overlay\" (click)=\"close()\"></div>\n <div\n #content\n class=\"mcpe-dialog-content\"\n role=\"dialog\"\n [attr.aria-modal]=\"modal()\"\n (keydown.escape)=\"close()\"\n >\n <ng-content />\n <button class=\"mcpe-dialog-close\" (click)=\"close()\" aria-label=\"Close\">&#x2715;</button>\n </div>\n }\n `,\n})\nexport class SnxDialogComponent {\n modal = input(true)\n open = signal(false)\n openChange = output<boolean>()\n\n toggle() {\n this.open.update(v => !v)\n this.openChange.emit(this.open())\n }\n\n close() {\n this.open.set(false)\n this.openChange.emit(false)\n }\n\n show() {\n this.open.set(true)\n this.openChange.emit(true)\n }\n}\n","import { Component, input, output, signal, computed, effect, contentChildren, ElementRef } from '@angular/core'\nimport { createTabs, type TabItem } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-tabs',\n standalone: true,\n template: `<div><ng-content /></div>`,\n})\nexport class SnxTabsComponent {\n items = input<TabItem[]>([])\n defaultValue = input<string>('')\n activeValue = signal('')\n\n private api = computed(() =>\n createTabs(this.items(), {\n defaultValue: this.defaultValue(),\n onValueChange: (v) => this.activeValue.set(v),\n })\n )\n\n constructor() {\n effect(() => {\n const def = this.defaultValue()\n const items = this.items()\n if (def) {\n this.activeValue.set(def)\n } else if (items.length > 0) {\n this.activeValue.set(items[0].value)\n }\n })\n }\n\n getTabProps(value: string) {\n return this.api().getTriggerProps(value, this.activeValue())\n }\n\n getPanelProps(value: string) {\n return this.api().getPanelProps(value, this.activeValue())\n }\n\n isActive(value: string): boolean {\n return this.activeValue() === value\n }\n\n select(value: string) {\n this.activeValue.set(value)\n }\n}\n\n@Component({\n selector: 'mcpe-tabs-list',\n standalone: true,\n template: `<div role=\"tablist\" class=\"mcpe-tabs-list\"><ng-content /></div>`,\n})\nexport class SnxTabsListComponent {}\n\n@Component({\n selector: 'mcpe-tabs-trigger',\n standalone: true,\n template: `\n <button\n role=\"tab\"\n [class]=\"classes()\"\n [attr.aria-selected]=\"isActive()\"\n [attr.tabindex]=\"isActive() ? 0 : -1\"\n (click)=\"onClick.emit()\"\n >\n <ng-content />\n </button>\n `,\n})\nexport class SnxTabsTriggerComponent {\n isActive = input(false)\n onClick = output<void>()\n class = input('')\n\n classes = computed(() =>\n ['mcpe-tabs-trigger', this.isActive() ? 'mcpe-tabs-trigger-active' : '', this.class()]\n .filter(Boolean)\n .join(' ')\n )\n}\n\n@Component({\n selector: 'mcpe-tabs-content',\n standalone: true,\n template: `\n @if (isActive()) {\n <div role=\"tabpanel\" class=\"mcpe-tabs-content\"><ng-content /></div>\n }\n `,\n})\nexport class SnxTabsContentComponent {\n isActive = input(false)\n}\n","import { Component, input, output, signal, computed } from '@angular/core'\nimport { createAccordion, type AccordionItemConfig } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-accordion',\n standalone: true,\n template: `<div><ng-content /></div>`,\n})\nexport class SnxAccordionComponent {\n items = input<AccordionItemConfig[]>([])\n type = input<'single' | 'multiple'>('single')\n collapsible = input(false)\n expandedValues = signal<string[]>([])\n\n private api = computed(() =>\n createAccordion(this.items(), {\n type: this.type(),\n collapsible: this.collapsible(),\n onValueChange: (v) => this.expandedValues.set(v),\n })\n )\n\n isExpanded(value: string): boolean {\n return this.expandedValues().includes(value)\n }\n\n toggle(value: string) {\n const props = this.api().getTriggerProps(value, this.expandedValues())\n props.onClick()\n }\n}\n\n@Component({\n selector: 'mcpe-accordion-item',\n standalone: true,\n template: `<div class=\"mcpe-accordion-item\"><ng-content /></div>`,\n})\nexport class SnxAccordionItemComponent {}\n\n@Component({\n selector: 'mcpe-accordion-trigger',\n standalone: true,\n template: `\n <h3>\n <button\n [class]=\"'mcpe-accordion-trigger'\"\n [attr.aria-expanded]=\"isExpanded()\"\n (click)=\"onClick.emit()\"\n >\n <ng-content />\n <svg class=\"mcpe-accordion-chevron\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </h3>\n `,\n})\nexport class SnxAccordionTriggerComponent {\n isExpanded = input(false)\n onClick = output<void>()\n}\n\n@Component({\n selector: 'mcpe-accordion-content',\n standalone: true,\n template: `\n @if (isExpanded()) {\n <div role=\"region\" class=\"mcpe-accordion-content\"><ng-content /></div>\n }\n `,\n})\nexport class SnxAccordionContentComponent {\n isExpanded = input(false)\n}\n","import { Component, input, output, signal, computed, ElementRef, viewChild, HostListener } from '@angular/core'\nimport { createSelect, type SelectOption } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-select',\n standalone: true,\n template: `\n <div class=\"relative\" #container>\n <button\n class=\"mcpe-select-trigger\"\n [attr.aria-expanded]=\"isOpen()\"\n aria-haspopup=\"listbox\"\n (click)=\"toggle()\"\n (keydown)=\"onKeyDown($event)\"\n >\n <span>{{ selectedLabel() || placeholder() }}</span>\n <svg class=\"h-4 w-4 opacity-50\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n @if (isOpen()) {\n <div class=\"mcpe-select-content absolute top-full mt-1 w-full\">\n <div class=\"mcpe-select-viewport\" role=\"listbox\">\n @for (option of options(); track option.value; let i = $index) {\n <div\n role=\"option\"\n [attr.aria-selected]=\"option.value === selectedValue()\"\n [attr.aria-disabled]=\"option.disabled\"\n [class]=\"getItemClasses(option, i)\"\n (click)=\"selectOption(option)\"\n (mouseenter)=\"highlightedIndex.set(i)\"\n >\n {{ option.label }}\n </div>\n }\n </div>\n </div>\n }\n </div>\n `,\n host: {\n '(document:click)': 'onDocumentClick($event)',\n },\n})\nexport class SnxSelectComponent {\n options = input<SelectOption[]>([])\n placeholder = input('Select...')\n valueChange = output<string>()\n\n isOpen = signal(false)\n selectedValue = signal<string | null>(null)\n highlightedIndex = signal(0)\n\n container = viewChild<ElementRef>('container')\n\n selectedLabel = computed(() => {\n const val = this.selectedValue()\n return this.options().find(o => o.value === val)?.label ?? ''\n })\n\n toggle() { this.isOpen.update(v => !v) }\n\n selectOption(option: SelectOption) {\n if (option.disabled) return\n this.selectedValue.set(option.value)\n this.valueChange.emit(option.value)\n this.isOpen.set(false)\n }\n\n getItemClasses(option: SelectOption, index: number): string {\n return [\n 'mcpe-select-item',\n index === this.highlightedIndex() ? 'mcpe-select-item-active' : '',\n option.value === this.selectedValue() ? 'mcpe-select-item-selected' : '',\n ].filter(Boolean).join(' ')\n }\n\n onKeyDown(event: KeyboardEvent) {\n const opts = this.options().filter(o => !o.disabled)\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n if (!this.isOpen()) { this.isOpen.set(true); return }\n this.highlightedIndex.update(i => (i + 1) % opts.length)\n } else if (event.key === 'ArrowUp') {\n event.preventDefault()\n this.highlightedIndex.update(i => (i - 1 + opts.length) % opts.length)\n } else if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n if (this.isOpen()) {\n const opt = opts[this.highlightedIndex()]\n if (opt) this.selectOption(opt)\n } else {\n this.isOpen.set(true)\n }\n } else if (event.key === 'Escape') {\n this.isOpen.set(false)\n }\n }\n\n onDocumentClick(event: MouseEvent) {\n const el = this.container()?.nativeElement\n if (el && !el.contains(event.target as Node)) {\n this.isOpen.set(false)\n }\n }\n}\n","import { Directive, input, HostListener, ElementRef, Renderer2, OnDestroy } from '@angular/core'\n\n@Directive({\n selector: '[mcpeTooltip]',\n standalone: true,\n})\nexport class SnxTooltipDirective implements OnDestroy {\n mcpeTooltip = input<string>('')\n tooltipDelay = input(700)\n\n private tooltipEl: HTMLElement | null = null\n private timeoutId: ReturnType<typeof setTimeout> | null = null\n\n constructor(private el: ElementRef, private renderer: Renderer2) {}\n\n @HostListener('mouseenter')\n @HostListener('focus')\n onShow() {\n this.clearDelay()\n this.timeoutId = setTimeout(() => this.show(), this.tooltipDelay())\n }\n\n @HostListener('mouseleave')\n @HostListener('blur')\n onHide() {\n this.clearDelay()\n this.hide()\n }\n\n private show() {\n if (this.tooltipEl) return\n this.tooltipEl = this.renderer.createElement('div')\n this.renderer.addClass(this.tooltipEl, 'mcpe-tooltip-content')\n this.renderer.setStyle(this.tooltipEl, 'position', 'absolute')\n this.renderer.setStyle(this.tooltipEl, 'bottom', '100%')\n this.renderer.setStyle(this.tooltipEl, 'left', '50%')\n this.renderer.setStyle(this.tooltipEl, 'transform', 'translateX(-50%)')\n this.renderer.setStyle(this.tooltipEl, 'margin-bottom', '0.5rem')\n const text = this.renderer.createText(this.mcpeTooltip())\n this.renderer.appendChild(this.tooltipEl, text)\n this.renderer.setStyle(this.el.nativeElement, 'position', 'relative')\n this.renderer.appendChild(this.el.nativeElement, this.tooltipEl)\n }\n\n private hide() {\n if (this.tooltipEl) {\n this.renderer.removeChild(this.el.nativeElement, this.tooltipEl)\n this.tooltipEl = null\n }\n }\n\n private clearDelay() {\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId)\n this.timeoutId = null\n }\n }\n\n ngOnDestroy() {\n this.clearDelay()\n this.hide()\n }\n}\n","import { Component, input, signal, ElementRef, viewChild } from '@angular/core'\n\n@Component({\n selector: 'mcpe-popover',\n standalone: true,\n template: `\n <div class=\"relative inline-block\" #container>\n <div (click)=\"toggle()\">\n <ng-content select=\"[trigger]\" />\n </div>\n @if (isOpen()) {\n <div\n class=\"mcpe-popover-content absolute top-full mt-2\"\n role=\"dialog\"\n (keydown.escape)=\"close()\"\n >\n <ng-content />\n </div>\n }\n </div>\n `,\n host: {\n '(document:click)': 'onDocumentClick($event)',\n },\n})\nexport class SnxPopoverComponent {\n isOpen = signal(false)\n container = viewChild<ElementRef>('container')\n\n toggle() { this.isOpen.update(v => !v) }\n close() { this.isOpen.set(false) }\n show() { this.isOpen.set(true) }\n\n onDocumentClick(event: MouseEvent) {\n const el = this.container()?.nativeElement\n if (el && !el.contains(event.target as Node)) {\n this.isOpen.set(false)\n }\n }\n}\n","import { Component, Injectable, signal } from '@angular/core'\n\nexport interface ToastData {\n id: string\n title?: string\n description?: string\n variant?: 'default' | 'destructive' | 'success'\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SnxToastService {\n toasts = signal<ToastData[]>([])\n private counter = 0\n\n show(toast: Omit<ToastData, 'id'>, duration = 5000): string {\n const id = `toast-${++this.counter}`\n this.toasts.update(t => [...t, { id, ...toast }])\n if (duration > 0) {\n setTimeout(() => this.dismiss(id), duration)\n }\n return id\n }\n\n success(title: string, description?: string) {\n return this.show({ title, description, variant: 'success' })\n }\n\n error(title: string, description?: string) {\n return this.show({ title, description, variant: 'destructive' })\n }\n\n dismiss(id: string) {\n this.toasts.update(t => t.filter(x => x.id !== id))\n }\n}\n\n@Component({\n selector: 'mcpe-toaster',\n standalone: true,\n template: `\n <div class=\"mcpe-toaster mcpe-toaster-bottom-right\">\n @for (t of toastService.toasts(); track t.id) {\n <div\n [class]=\"'mcpe-toast group' + (t.variant === 'destructive' ? ' mcpe-toast-destructive' : '') + (t.variant === 'success' ? ' mcpe-toast-success' : '')\"\n >\n <div class=\"flex-1\">\n @if (t.title) { <div class=\"mcpe-toast-title\">{{ t.title }}</div> }\n @if (t.description) { <div class=\"mcpe-toast-description\">{{ t.description }}</div> }\n </div>\n <button class=\"mcpe-toast-close\" (click)=\"toastService.dismiss(t.id)\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n }\n </div>\n `,\n})\nexport class SnxToasterComponent {\n constructor(public toastService: SnxToastService) {}\n}\n","import { Component, input, output, signal } from '@angular/core'\n\n@Component({\n selector: 'mcpe-drawer',\n standalone: true,\n template: `\n @if (open()) {\n <div class=\"mcpe-drawer-overlay\" (click)=\"close()\"></div>\n <div\n [class]=\"'mcpe-drawer-content mcpe-drawer-content-' + side()\"\n role=\"dialog\"\n aria-modal=\"true\"\n (keydown.escape)=\"close()\"\n >\n <ng-content />\n <button class=\"mcpe-drawer-close\" (click)=\"close()\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </div>\n }\n `,\n})\nexport class SnxDrawerComponent {\n side = input<'left' | 'right' | 'top' | 'bottom'>('right')\n open = signal(false)\n openChange = output<boolean>()\n\n show() { this.open.set(true); this.openChange.emit(true) }\n close() { this.open.set(false); this.openChange.emit(false) }\n toggle() { this.open.update(v => !v); this.openChange.emit(this.open()) }\n}\n\n@Component({ selector: 'mcpe-drawer-header', standalone: true, template: `<div class=\"mcpe-drawer-header\"><ng-content /></div>` })\nexport class SnxDrawerHeaderComponent {}\n\n@Component({ selector: 'mcpe-drawer-footer', standalone: true, template: `<div class=\"mcpe-drawer-footer\"><ng-content /></div>` })\nexport class SnxDrawerFooterComponent {}\n\n@Component({ selector: 'mcpe-drawer-title', standalone: true, template: `<h2 class=\"mcpe-drawer-title\"><ng-content /></h2>` })\nexport class SnxDrawerTitleComponent {}\n\n@Component({ selector: 'mcpe-drawer-description', standalone: true, template: `<p class=\"mcpe-drawer-description\"><ng-content /></p>` })\nexport class SnxDrawerDescriptionComponent {}\n\n@Component({ selector: 'mcpe-drawer-body', standalone: true, template: `<div class=\"mcpe-drawer-body\"><ng-content /></div>` })\nexport class SnxDrawerBodyComponent {}\n","import { Component, input, signal, ElementRef, viewChild } from '@angular/core'\n\nexport interface DropdownItem {\n id: string\n label: string\n disabled?: boolean\n type?: 'item' | 'separator' | 'label'\n shortcut?: string\n}\n\n@Component({\n selector: 'mcpe-dropdown-menu',\n standalone: true,\n template: `\n <div class=\"relative inline-block\" #container>\n <div (click)=\"toggle()\">\n <ng-content select=\"[trigger]\" />\n </div>\n @if (isOpen()) {\n <div class=\"mcpe-dropdown-menu-content absolute top-full mt-1 right-0\" role=\"menu\">\n @for (item of items(); track item.id) {\n @if (item.type === 'separator') {\n <div class=\"mcpe-dropdown-menu-separator\" role=\"separator\"></div>\n } @else if (item.type === 'label') {\n <div class=\"mcpe-dropdown-menu-label\">{{ item.label }}</div>\n } @else {\n <div\n role=\"menuitem\"\n [class]=\"'mcpe-dropdown-menu-item' + (item.disabled ? ' opacity-50 pointer-events-none' : '')\"\n (click)=\"selectItem(item)\"\n [attr.aria-disabled]=\"item.disabled\"\n >\n <span class=\"flex-1\">{{ item.label }}</span>\n @if (item.shortcut) {\n <span class=\"mcpe-dropdown-menu-shortcut\">{{ item.shortcut }}</span>\n }\n </div>\n }\n }\n </div>\n }\n </div>\n `,\n host: { '(document:click)': 'onDocumentClick($event)' },\n})\nexport class SnxDropdownMenuComponent {\n items = input<DropdownItem[]>([])\n isOpen = signal(false)\n container = viewChild<ElementRef>('container')\n\n toggle() { this.isOpen.update(v => !v) }\n close() { this.isOpen.set(false) }\n\n selectItem(item: DropdownItem) {\n if (!item.disabled) this.isOpen.set(false)\n }\n\n onDocumentClick(event: MouseEvent) {\n const el = this.container()?.nativeElement\n if (el && !el.contains(event.target as Node)) this.isOpen.set(false)\n }\n}\n","import { Component, input, output, signal, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-switch',\n standalone: true,\n template: `\n <button\n type=\"button\"\n role=\"switch\"\n [attr.aria-checked]=\"checked()\"\n [attr.aria-disabled]=\"disabled()\"\n [disabled]=\"disabled()\"\n [class]=\"'mcpe-switch'\"\n (click)=\"toggle()\"\n (keydown.space)=\"$event.preventDefault(); toggle()\"\n (keydown.enter)=\"$event.preventDefault(); toggle()\"\n >\n <span class=\"mcpe-switch-thumb\"></span>\n </button>\n `,\n})\nexport class SnxSwitchComponent {\n checked = signal(false)\n disabled = input(false)\n checkedChange = output<boolean>()\n\n toggle() {\n if (this.disabled()) return\n this.checked.update(v => !v)\n this.checkedChange.emit(this.checked())\n }\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-progress',\n standalone: true,\n template: `\n <div class=\"mcpe-progress\" role=\"progressbar\"\n [attr.aria-valuenow]=\"value()\" [attr.aria-valuemin]=\"0\" [attr.aria-valuemax]=\"max()\">\n <div class=\"mcpe-progress-indicator\" [style.transform]=\"transform()\"></div>\n </div>\n `,\n})\nexport class SnxProgressComponent {\n value = input(0)\n max = input(100)\n transform = computed(() => {\n const pct = Math.min(Math.max((this.value() / this.max()) * 100, 0), 100)\n return `translateX(-${100 - pct}%)`\n })\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-loader',\n standalone: true,\n template: `<div [class]=\"classes()\" role=\"status\" aria-label=\"Loading\"><span class=\"sr-only\">Loading...</span></div>`,\n})\nexport class SnxLoaderComponent {\n size = input<'sm' | 'md' | 'lg' | 'xl'>('md')\n variant = input<'primary' | 'muted'>('primary')\n classes = computed(() => `mcpe-loader mcpe-loader-${this.size()} mcpe-loader-${this.variant()}`)\n}\n","import { Component, input, output, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-chip',\n standalone: true,\n template: `\n <span [class]=\"classes()\">\n <ng-content />\n @if (removable()) {\n <button type=\"button\" class=\"mcpe-chip-remove\" (click)=\"remove.emit()\" aria-label=\"Remove\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n }\n </span>\n `,\n})\nexport class SnxChipComponent {\n variant = input<'default' | 'primary' | 'outline' | 'destructive'>('default')\n removable = input(false)\n remove = output<void>()\n classes = computed(() =>\n ['mcpe-chip', `mcpe-chip-${this.variant()}`, this.removable() ? 'mcpe-chip-removable' : ''].filter(Boolean).join(' ')\n )\n}\n\n@Component({\n selector: 'mcpe-chips',\n standalone: true,\n template: `<div class=\"mcpe-chips\"><ng-content /></div>`,\n})\nexport class SnxChipsComponent {}\n","import { Component, input, signal, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-password-input',\n standalone: true,\n template: `\n <div class=\"mcpe-password-input-wrapper\">\n <input\n [type]=\"showPassword() ? 'text' : 'password'\"\n class=\"mcpe-password-input\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n />\n <button type=\"button\" class=\"mcpe-password-toggle\" (click)=\"showPassword.update(v => !v)\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\" tabindex=\"-1\">\n @if (showPassword()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n }\n </button>\n </div>\n `,\n})\nexport class SnxPasswordInputComponent {\n placeholder = input('')\n disabled = input(false)\n showPassword = signal(false)\n}\n","import { Component, input, output, signal } from '@angular/core'\n\n@Component({\n selector: 'mcpe-counter',\n standalone: true,\n template: `\n <div class=\"mcpe-counter\">\n <button type=\"button\" class=\"mcpe-counter-button\" (click)=\"decrement()\"\n [disabled]=\"disabled() || value() <= min()\" aria-label=\"Decrease\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M5 12h14\" />\n </svg>\n </button>\n <input type=\"text\" inputmode=\"numeric\" class=\"mcpe-counter-input\"\n [value]=\"value()\" (change)=\"onInput($event)\" [disabled]=\"disabled()\" aria-label=\"Count\" />\n <button type=\"button\" class=\"mcpe-counter-button\" (click)=\"increment()\"\n [disabled]=\"disabled() || value() >= max()\" aria-label=\"Increase\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M5 12h14\" /><path d=\"M12 5v14\" />\n </svg>\n </button>\n </div>\n `,\n})\nexport class SnxCounterComponent {\n value = signal(0)\n min = input(0)\n max = input(99)\n step = input(1)\n disabled = input(false)\n valueChange = output<number>()\n\n decrement() {\n this.value.update(v => Math.max(this.min(), v - this.step()))\n this.valueChange.emit(this.value())\n }\n increment() {\n this.value.update(v => Math.min(this.max(), v + this.step()))\n this.valueChange.emit(this.value())\n }\n onInput(event: Event) {\n const num = parseInt((event.target as HTMLInputElement).value, 10)\n if (!isNaN(num)) {\n this.value.set(Math.max(this.min(), Math.min(this.max(), num)))\n this.valueChange.emit(this.value())\n }\n }\n}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-alert',\n standalone: true,\n template: `<div [class]=\"classes()\" role=\"alert\"><ng-content /></div>`,\n})\nexport class SnxAlertComponent {\n variant = input<'default' | 'destructive' | 'success' | 'warning'>('default')\n classes = computed(() => `mcpe-alert mcpe-alert-${this.variant()}`)\n}\n\n@Component({\n selector: 'mcpe-alert-title',\n standalone: true,\n template: `<h5 class=\"mcpe-alert-title\"><ng-content /></h5>`,\n})\nexport class SnxAlertTitleComponent {}\n\n@Component({\n selector: 'mcpe-alert-description',\n standalone: true,\n template: `<div class=\"mcpe-alert-description\"><ng-content /></div>`,\n})\nexport class SnxAlertDescriptionComponent {}\n","import { Component, input, output, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-prompt-input',\n standalone: true,\n template: `<div [class]=\"classes()\"><ng-content /></div>`,\n})\nexport class SnxPromptInputComponent {\n class = input('')\n classes = computed(() => ['mcpe-prompt-input', this.class()].filter(Boolean).join(' '))\n}\n\n@Component({\n selector: 'mcpe-prompt-input-textarea',\n standalone: true,\n template: `<textarea class=\"mcpe-prompt-input-textarea\" [placeholder]=\"placeholder()\" [rows]=\"rows()\"></textarea>`,\n})\nexport class SnxPromptInputTextareaComponent {\n placeholder = input('')\n rows = input(3)\n}\n\n@Component({\n selector: 'mcpe-prompt-input-footer',\n standalone: true,\n template: `<div class=\"mcpe-prompt-input-footer\"><ng-content /></div>`,\n})\nexport class SnxPromptInputFooterComponent {}\n\n@Component({\n selector: 'mcpe-prompt-input-actions',\n standalone: true,\n template: `<div class=\"mcpe-prompt-input-actions\"><ng-content /></div>`,\n})\nexport class SnxPromptInputActionsComponent {}\n\n@Component({\n selector: 'mcpe-prompt-input-char-count',\n standalone: true,\n template: `<span class=\"mcpe-prompt-input-char-count\">{{ count() }}@if (max()) { / {{ max() }} }</span>`,\n})\nexport class SnxPromptInputCharCountComponent {\n count = input(0)\n max = input<number | undefined>(undefined)\n}\n\n@Component({\n selector: 'mcpe-prompt-input-attachments',\n standalone: true,\n template: `<div class=\"mcpe-prompt-input-attachments\"><ng-content /></div>`,\n})\nexport class SnxPromptInputAttachmentsComponent {}\n\n@Component({\n selector: 'mcpe-prompt-input-attachment',\n standalone: true,\n template: `\n <span class=\"mcpe-prompt-input-attachment\">\n <ng-content />\n <button type=\"button\" class=\"mcpe-prompt-input-attachment-remove\" (click)=\"remove.emit()\" aria-label=\"Remove\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6 6 18\" /><path d=\"m6 6 12 12\" />\n </svg>\n </button>\n </span>\n `,\n})\nexport class SnxPromptInputAttachmentComponent {\n remove = output()\n}\n","import { Component, input, computed } from '@angular/core'\n\ntype ChatBubbleVariant = 'user' | 'ai'\n\n@Component({\n selector: 'mcpe-chat-bubble',\n standalone: true,\n template: `<div [class]=\"classes()\"><ng-content /></div>`,\n})\nexport class SnxChatBubbleComponent {\n variant = input<ChatBubbleVariant>('ai')\n class = input('')\n classes = computed(() =>\n ['mcpe-chat-bubble', `mcpe-chat-bubble-${this.variant()}`, this.class()].filter(Boolean).join(' ')\n )\n}\n\n@Component({\n selector: 'mcpe-chat-bubble-avatar',\n standalone: true,\n template: `<img class=\"mcpe-chat-bubble-avatar\" [src]=\"src()\" [alt]=\"alt()\" />`,\n})\nexport class SnxChatBubbleAvatarComponent {\n src = input.required<string>()\n alt = input('')\n}\n\n@Component({\n selector: 'mcpe-chat-bubble-content',\n standalone: true,\n template: `<div class=\"mcpe-chat-bubble-content\"><ng-content /></div>`,\n})\nexport class SnxChatBubbleContentComponent {}\n\n@Component({\n selector: 'mcpe-chat-bubble-timestamp',\n standalone: true,\n template: `<span class=\"mcpe-chat-bubble-timestamp\"><ng-content /></span>`,\n})\nexport class SnxChatBubbleTimestampComponent {}\n\n@Component({\n selector: 'mcpe-chat-bubble-typing',\n standalone: true,\n template: `\n <div class=\"mcpe-chat-bubble-typing\">\n <span class=\"mcpe-chat-bubble-typing-dot\"></span>\n <span class=\"mcpe-chat-bubble-typing-dot\"></span>\n <span class=\"mcpe-chat-bubble-typing-dot\"></span>\n </div>\n `,\n})\nexport class SnxChatBubbleTypingComponent {}\n","import { Component, input, computed } from '@angular/core'\n\ntype AiBadgeVariant = 'default' | 'prominent' | 'subtle'\n\n@Component({\n selector: 'mcpe-ai-badge',\n standalone: true,\n template: `\n <span [class]=\"classes()\">\n @if (showIcon()) {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 1-1.275-1.275L3 12l5.813-1.912a2 2 0 0 1 1.275-1.275L12 3z\" />\n </svg>\n }\n <ng-content />\n </span>\n `,\n})\nexport class SnxAiBadgeComponent {\n variant = input<AiBadgeVariant>('default')\n showIcon = input(true)\n class = input('')\n classes = computed(() =>\n ['mcpe-ai-badge', `mcpe-ai-badge-${this.variant()}`, this.class()].filter(Boolean).join(' ')\n )\n}\n","import { Component, input, computed } from '@angular/core'\n\ntype SuggestionChipVariant = 'default' | 'primary' | 'outline'\n\n@Component({\n selector: 'mcpe-suggestion-chips',\n standalone: true,\n template: `<div class=\"mcpe-suggestion-chips\"><ng-content /></div>`,\n})\nexport class SnxSuggestionChipsComponent {}\n\n@Component({\n selector: 'mcpe-suggestion-chip',\n standalone: true,\n template: `<button [class]=\"classes()\" type=\"button\"><ng-content /></button>`,\n})\nexport class SnxSuggestionChipComponent {\n variant = input<SuggestionChipVariant>('default')\n class = input('')\n classes = computed(() =>\n ['mcpe-suggestion-chip', `mcpe-suggestion-chip-${this.variant()}`, this.class()].filter(Boolean).join(' ')\n )\n}\n","import { Component, input } from '@angular/core'\n\n@Component({\n selector: 'mcpe-source-cards',\n standalone: true,\n template: `<div class=\"mcpe-source-cards\"><ng-content /></div>`,\n})\nexport class SnxSourceCardsComponent {}\n\n@Component({\n selector: 'mcpe-source-card',\n standalone: true,\n template: `\n <a [href]=\"href()\" class=\"mcpe-source-card\" target=\"_blank\" rel=\"noopener noreferrer\">\n @if (favicon()) {\n <img class=\"mcpe-source-card-favicon\" [src]=\"favicon()\" [alt]=\"domain()\" />\n }\n <div class=\"mcpe-source-card-body\">\n <p class=\"mcpe-source-card-title\">{{ title() }}</p>\n <p class=\"mcpe-source-card-domain\">{{ domain() }}</p>\n </div>\n @if (index()) {\n <span class=\"mcpe-source-card-index\">{{ index() }}</span>\n }\n </a>\n `,\n})\nexport class SnxSourceCardComponent {\n href = input.required<string>()\n favicon = input('')\n title = input('')\n domain = input('')\n index = input<number | undefined>(undefined)\n}\n","import { Component } from '@angular/core'\n\n@Component({\n selector: 'mcpe-streaming-text',\n standalone: true,\n template: `<div class=\"mcpe-streaming-text-cursor\"><ng-content /></div>`,\n})\nexport class SnxStreamingTextComponent {}\n\n@Component({\n selector: 'mcpe-streaming-text-fade-in',\n standalone: true,\n template: `<span class=\"mcpe-streaming-text-fade-in\"><ng-content /></span>`,\n})\nexport class SnxStreamingTextFadeInComponent {}\n\n@Component({\n selector: 'mcpe-streaming-text-word',\n standalone: true,\n template: `<span class=\"mcpe-streaming-text-word\"><ng-content /></span>`,\n})\nexport class SnxStreamingTextWordComponent {}\n\n@Component({\n selector: 'mcpe-streaming-text-line',\n standalone: true,\n template: `<div class=\"mcpe-streaming-text-line\"><ng-content /></div>`,\n})\nexport class SnxStreamingTextLineComponent {}\n\n@Component({\n selector: 'mcpe-streaming-text-skeleton',\n standalone: true,\n template: `<div class=\"mcpe-streaming-text-skeleton\"><ng-content /></div>`,\n})\nexport class SnxStreamingTextSkeletonComponent {}\n\n@Component({\n selector: 'mcpe-streaming-text-skeleton-line',\n standalone: true,\n template: `<div class=\"mcpe-streaming-text-skeleton-line\"></div>`,\n})\nexport class SnxStreamingTextSkeletonLineComponent {}\n","import { Component, input, computed } from '@angular/core'\n\n@Component({\n selector: 'mcpe-feedback',\n standalone: true,\n template: `<div class=\"mcpe-feedback\"><ng-content /></div>`,\n})\nexport class SnxFeedbackComponent {}\n\ntype FeedbackType = 'up' | 'down'\n\n@Component({\n selector: 'mcpe-feedback-btn',\n standalone: true,\n template: `\n <button [class]=\"classes()\" type=\"button\">\n @if (feedbackType() === 'up') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M7 10v12\"/><path d=\"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\"/>\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17 14V2\"/><path d=\"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\"/>\n </svg>\n }\n </button>\n `,\n})\nexport class SnxFeedbackButtonComponent {\n feedbackType = input.required<FeedbackType>({ alias: 'type' })\n selected = input(false)\n class = input('')\n classes = computed(() =>\n [\n 'mcpe-feedback-btn',\n `mcpe-feedback-btn-${this.feedbackType()}`,\n this.selected() ? 'mcpe-feedback-btn-selected' : '',\n this.class(),\n ].filter(Boolean).join(' ')\n )\n}\n\n@Component({\n selector: 'mcpe-feedback-separator',\n standalone: true,\n template: `<span class=\"mcpe-feedback-separator\"></span>`,\n})\nexport class SnxFeedbackSeparatorComponent {}\n\n@Component({\n selector: 'mcpe-feedback-form',\n standalone: true,\n template: `<div class=\"mcpe-feedback-form\"><ng-content /></div>`,\n})\nexport class SnxFeedbackFormComponent {}\n\n@Component({\n selector: 'mcpe-feedback-input',\n standalone: true,\n template: `<input class=\"mcpe-feedback-input\" [placeholder]=\"placeholder()\" />`,\n})\nexport class SnxFeedbackInputComponent {\n placeholder = input('Add a comment...')\n}\n\n@Component({\n selector: 'mcpe-feedback-submit',\n standalone: true,\n template: `<button class=\"mcpe-feedback-submit\" type=\"button\"><ng-content /></button>`,\n})\nexport class SnxFeedbackSubmitComponent {}\n","import { Component, input, computed } from '@angular/core'\nimport { cn } from '@mcp-elements/core'\n\nexport type McpConnectionStatus = 'connected' | 'connecting' | 'disconnected' | 'error'\n\nconst STATUS_LABELS: Record<McpConnectionStatus, string> = {\n connected: 'Connected',\n connecting: 'Connecting',\n disconnected: 'Disconnected',\n error: 'Error',\n}\n\n@Component({\n selector: 'mcpe-mcp-server-status',\n standalone: true,\n template: `\n <span\n [class]=\"classes()\"\n role=\"status\"\n aria-live=\"polite\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n <span class=\"mcpe-mcp-server-status-dot\" aria-hidden=\"true\"></span>\n {{ label() }}\n </span>\n `,\n})\nexport class McpeMcpServerStatusComponent {\n status = input.required<McpConnectionStatus>()\n serverName = input<string>()\n class = input('')\n\n classes = computed(() => cn('mcpe-mcp-server-status', `mcpe-mcp-server-status-${this.status()}`, this.class()))\n label = computed(() => {\n const s = this.serverName()\n const statusLabel = STATUS_LABELS[this.status() as McpConnectionStatus]\n return s ? `${s} · ${statusLabel}` : statusLabel\n })\n ariaLabel = computed(() => {\n const s = this.serverName()\n const statusLabel = STATUS_LABELS[this.status() as McpConnectionStatus]\n return s ? `${s}: ${statusLabel}` : statusLabel\n })\n}\n","import { Component, input, output, signal, effect, computed, OnDestroy } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { cn } from '@mcp-elements/core'\nimport type { ToolStateApi, ToolStateSnapshot } from '@mcp-elements/core'\n\nconst STATUS_LABELS: Record<string, string> = {\n idle: 'idle',\n pending: 'pending',\n running: 'running',\n done: 'done',\n error: 'error',\n cancelled: 'cancelled',\n}\n\n@Component({\n selector: 'mcpe-mcp-tool-call',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div [class]=\"classes()\">\n <!-- Header -->\n <div class=\"mcpe-mcp-tool-call-header\">\n <div class=\"mcpe-mcp-tool-call-name\">\n <span class=\"mcpe-mcp-tool-call-icon\" aria-hidden=\"true\">fn</span>\n <span class=\"mcpe-mcp-tool-call-title\">{{ displayName() }}</span>\n </div>\n <span [class]=\"badgeClass()\">\n @if (snap().status === 'running') {\n <svg class=\"animate-spin h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"/>\n </svg>\n }\n {{ statusLabels[snap().status] }}\n </span>\n </div>\n <!-- Args -->\n @if (displayArgs()) {\n <pre class=\"mcpe-mcp-tool-call-args\">{{ displayArgs() | json }}</pre>\n }\n <!-- Progress bar -->\n @if (snap().status === 'running') {\n <div class=\"mcpe-mcp-tool-call-progress\" role=\"progressbar\" aria-label=\"Tool running\">\n <div class=\"mcpe-mcp-tool-call-progress-bar\" style=\"width: 60%\"></div>\n </div>\n }\n <!-- Result -->\n @if (snap().status === 'done' && snap().result) {\n <div class=\"mcpe-mcp-tool-call-result mcpe-mcp-tool-call-result-done\">\n @for (block of textBlocks(); track $index) {\n <p class=\"whitespace-pre-wrap text-sm\">{{ block }}</p>\n }\n </div>\n }\n <!-- Error -->\n @if (snap().status === 'error' && snap().error) {\n <div class=\"mcpe-mcp-tool-call-result mcpe-mcp-tool-call-result-error\">\n <p class=\"text-sm\">{{ snap().error?.message }}</p>\n <button (click)=\"onRetry.emit()\" class=\"text-xs underline underline-offset-2\">Retry</button>\n </div>\n }\n </div>\n `,\n})\nexport class McpeMcpToolCallComponent implements OnDestroy {\n state = input.required<ToolStateApi>()\n toolName = input<string>()\n args = input<Record<string, unknown>>()\n onRetry = output<void>()\n class = input('')\n\n readonly statusLabels = STATUS_LABELS\n\n snap = signal<ToolStateSnapshot>({ status: 'idle' })\n private _unsub: (() => void) | undefined\n\n constructor() {\n effect(() => {\n this._unsub?.()\n const s = this.state()\n this.snap.set({\n status: s.status,\n tool: s.tool,\n args: s.args,\n result: s.result,\n error: s.error,\n startedAt: s.startedAt,\n endedAt: s.endedAt,\n })\n this._unsub = s.subscribe((snapshot: ToolStateSnapshot) => this.snap.set({ ...snapshot }))\n })\n }\n\n ngOnDestroy() { this._unsub?.() }\n\n classes = computed(() => cn('mcpe-mcp-tool-call', this.class()))\n badgeClass = computed(() => cn('mcpe-mcp-tool-call-badge', `mcpe-mcp-tool-call-badge-${this.snap().status}`))\n displayName = computed(() => this.snap().tool ?? this.toolName() ?? 'unknown')\n displayArgs = computed(() => this.snap().args ?? this.args())\n textBlocks = computed(() =>\n this.snap().result?.content\n .filter((c: { type: string }) => c.type === 'text')\n .map((c: { type: string; text?: string }) => (c as { type: 'text'; text: string }).text) ?? []\n )\n}\n","import { Component, input, output, signal, computed, OnInit } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { cn, schemaToFields } from '@mcp-elements/core'\nimport type { JsonSchema, FieldDescriptor } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-mcp-tool-form',\n standalone: true,\n imports: [CommonModule],\n template: `\n <form [class]=\"classes()\" (ngSubmit)=\"handleSubmit()\">\n @if (fields().length === 0) {\n <p class=\"text-sm text-muted-foreground\">This tool takes no inputs.</p>\n }\n @for (field of fields(); track field.key) {\n <div class=\"mcpe-mcp-tool-form-field\">\n <label\n [for]=\"field.key\"\n [class]=\"labelClass(field)\"\n >{{ field.label }}</label>\n @switch (field.kind) {\n @case ('switch') {\n <input type=\"checkbox\" [id]=\"field.key\" class=\"mcpe-switch\"\n [checked]=\"getBool(field.key)\"\n (change)=\"onCheckChange(field.key, $event)\" />\n }\n @case ('select') {\n <select [id]=\"field.key\" class=\"mcpe-select\"\n [value]=\"getStr(field.key)\"\n (change)=\"onInputChange(field.key, $event)\">\n <option value=\"\">Select…</option>\n @for (opt of field.options ?? []; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n }\n @case ('textarea') {\n <textarea [id]=\"field.key\" class=\"mcpe-textarea\" rows=\"4\"\n [value]=\"getStr(field.key)\"\n (input)=\"onInputChange(field.key, $event)\"></textarea>\n }\n @case ('number') {\n <input type=\"number\" [id]=\"field.key\" class=\"mcpe-input\"\n [value]=\"getStr(field.key)\"\n (input)=\"onNumberChange(field.key, $event)\" />\n }\n @default {\n <input [type]=\"inputType(field)\" [id]=\"field.key\" class=\"mcpe-input\"\n [value]=\"getStr(field.key)\"\n (input)=\"onInputChange(field.key, $event)\" />\n }\n }\n @if (field.help) {\n <p class=\"mcpe-mcp-tool-form-help\">{{ field.help }}</p>\n }\n </div>\n }\n <div class=\"mcpe-mcp-tool-form-submit\">\n <button type=\"submit\" class=\"mcpe-btn mcpe-btn-primary mcpe-btn-sm\" [disabled]=\"loading()\">\n {{ loading() ? 'Running…' : submitLabel() }}\n </button>\n </div>\n </form>\n `,\n})\nexport class McpeMcpToolFormComponent implements OnInit {\n schema = input.required<JsonSchema>()\n loading = input(false)\n submitLabel = input('Run')\n class = input('')\n onSubmit = output<Record<string, unknown>>()\n\n fields = computed(() => schemaToFields(this.schema()))\n values = signal<Record<string, unknown>>({})\n\n ngOnInit() {\n const defaults: Record<string, unknown> = {}\n for (const f of this.fields()) {\n if (f.defaultValue !== undefined) defaults[f.key] = f.defaultValue\n }\n this.values.set(defaults)\n }\n\n classes = computed(() => cn('mcpe-mcp-tool-form', this.class()))\n\n setValue(key: string, value: unknown) {\n this.values.update((v: Record<string, unknown>) => ({ ...v, [key]: value }))\n }\n\n onInputChange(key: string, event: Event) {\n this.setValue(key, (event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value)\n }\n\n onNumberChange(key: string, event: Event) {\n this.setValue(key, (event.target as HTMLInputElement).valueAsNumber)\n }\n\n onCheckChange(key: string, event: Event) {\n this.setValue(key, (event.target as HTMLInputElement).checked)\n }\n\n getStr(key: string): string {\n const v = this.values()[key]\n return v == null ? '' : String(v)\n }\n\n getBool(key: string): boolean {\n return Boolean(this.values()[key])\n }\n\n labelClass(field: FieldDescriptor): string {\n return cn('mcpe-mcp-tool-form-label', field.required ? 'mcpe-mcp-tool-form-label-required' : '')\n }\n\n inputType(field: FieldDescriptor): string {\n switch (field.kind) {\n case 'email': return 'email'\n case 'url': return 'url'\n case 'date': return 'date'\n default: return 'text'\n }\n }\n\n handleSubmit() {\n this.onSubmit.emit(this.values())\n }\n}\n","import { Component, input, output, computed } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { parseScopes } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-mcp-consent-dialog',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (open()) {\n <div class=\"mcpe-dialog-overlay\" (click)=\"deny()\"></div>\n <div class=\"mcpe-dialog-content\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"'Allow ' + serverName() + '?'\">\n <!-- Server info -->\n <div class=\"mcpe-mcp-consent-dialog-server\">\n <div class=\"mcpe-mcp-consent-dialog-icon\" aria-hidden=\"true\">\n @if (serverIcon()) {\n <img [src]=\"serverIcon()\" alt=\"\" class=\"h-full w-full object-cover\" />\n } @else {\n {{ serverName()[0]?.toUpperCase() ?? '?' }}\n }\n </div>\n <div>\n <p class=\"mcpe-mcp-consent-dialog-server-name\">{{ serverName() }}</p>\n <p class=\"mcpe-mcp-consent-dialog-server-meta\">is requesting access to</p>\n </div>\n </div>\n <!-- Scopes -->\n <div class=\"mcpe-mcp-consent-dialog-scopes\" role=\"list\" aria-label=\"Requested permissions\">\n @for (s of parsedScopes(); track s.raw) {\n <div class=\"mcpe-mcp-consent-dialog-scope-item\" role=\"listitem\">\n <div class=\"flex-1 min-w-0\">\n <p class=\"mcpe-mcp-consent-dialog-scope-resource\">{{ s.resource }}</p>\n <div class=\"mcpe-mcp-consent-dialog-scope-perms\">\n @for (p of s.permissions; track p) {\n <span class=\"mcpe-mcp-consent-dialog-scope-perm\">{{ p }}</span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n <!-- Actions -->\n <div class=\"mcpe-mcp-consent-dialog-actions\">\n <button class=\"mcpe-btn mcpe-btn-outline flex-1\" (click)=\"deny()\">Deny</button>\n <button class=\"mcpe-btn mcpe-btn-primary flex-1\" (click)=\"approve()\">Allow</button>\n </div>\n </div>\n }\n `,\n})\nexport class McpeMcpConsentDialogComponent {\n open = input.required<boolean>()\n serverName = input.required<string>()\n serverIcon = input<string>()\n scopes = input<string[]>([])\n onApprove = output<void>()\n onDeny = output<void>()\n\n parsedScopes = computed(() => parseScopes(this.scopes().join(' ')))\n\n approve() { this.onApprove.emit() }\n deny() { this.onDeny.emit() }\n}\n","import { Component, input, signal, computed } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { cn, parseScopes } from '@mcp-elements/core'\nimport type { ScopeDescriptor } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-mcp-scope-inspector',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div [class]=\"classes()\" role=\"list\">\n @for (s of parsedScopes(); track s.raw) {\n <div class=\"mcpe-mcp-scope-inspector-item\" role=\"listitem\">\n <button\n type=\"button\"\n class=\"mcpe-mcp-scope-inspector-trigger\"\n [attr.aria-expanded]=\"isOpen(s.raw)\"\n (click)=\"toggle(s.raw)\"\n >\n <div class=\"flex items-center gap-3\">\n <span class=\"mcpe-mcp-scope-inspector-resource\">{{ s.resource }}</span>\n <div class=\"mcpe-mcp-scope-inspector-perms\">\n @for (p of s.permissions; track p) {\n <span class=\"mcpe-mcp-scope-inspector-perm\">{{ p }}</span>\n }\n </div>\n </div>\n <svg\n [class]=\"chevronClass(s.raw)\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m6 9 6 6 6-6\"/>\n </svg>\n </button>\n @if (isOpen(s.raw) && getDescription(s)) {\n <div role=\"region\" class=\"mcpe-mcp-scope-inspector-body\">\n {{ getDescription(s) }}\n </div>\n }\n </div>\n }\n </div>\n `,\n})\nexport class McpeMcpScopeInspectorComponent {\n scopes = input<string | ScopeDescriptor[]>('')\n descriptions = input<Record<string, string>>({})\n class = input('')\n\n openKeys = signal<Set<string>>(new Set())\n\n parsedScopes = computed((): ScopeDescriptor[] => {\n const s = this.scopes()\n return typeof s === 'string' ? parseScopes(s) : s\n })\n\n classes = computed(() => cn('mcpe-mcp-scope-inspector', this.class()))\n\n toggle(key: string) {\n this.openKeys.update((prev: Set<string>) => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }\n\n isOpen(key: string): boolean {\n return this.openKeys().has(key)\n }\n\n chevronClass(key: string): string {\n return cn('mcpe-mcp-scope-inspector-chevron', this.isOpen(key) ? 'mcpe-mcp-scope-inspector-chevron-open' : '')\n }\n\n getDescription(s: ScopeDescriptor): string | undefined {\n const d = this.descriptions()\n return d[s.raw] ?? d[s.resource] ?? s.description\n }\n}\n","import { Component, input, output, computed } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { cn } from '@mcp-elements/core'\n\nexport interface McpResource {\n uri: string\n name: string\n mimeType?: string\n description?: string\n}\n\nfunction mimeTypeLabel(mimeType?: string): string {\n if (!mimeType) return 'res'\n if (mimeType.includes('json')) return 'json'\n if (mimeType.includes('text')) return 'txt'\n if (mimeType.includes('image')) return 'img'\n if (mimeType.includes('pdf')) return 'pdf'\n return mimeType.split('/')[1]?.slice(0, 4) ?? 'res'\n}\n\n@Component({\n selector: 'mcpe-mcp-resource-browser',\n standalone: true,\n imports: [CommonModule],\n template: `\n @if (loading()) {\n <div [class]=\"classes()\">\n @for (n of skeletonItems; track n) {\n <div class=\"flex items-center gap-3 px-3 py-2.5\">\n <div class=\"h-8 w-8 rounded-md animate-pulse bg-muted\"></div>\n <div class=\"h-4 flex-1 rounded animate-pulse bg-muted\"></div>\n </div>\n }\n </div>\n } @else if (resources().length === 0) {\n <div [class]=\"classes()\">\n <p class=\"mcpe-mcp-resource-browser-empty\">No resources available</p>\n </div>\n } @else {\n <div [class]=\"classes()\" role=\"list\">\n @for (r of resources(); track r.uri) {\n <button\n type=\"button\"\n role=\"listitem\"\n [class]=\"itemClass(r.uri)\"\n [attr.aria-selected]=\"selectedUri() === r.uri\"\n [attr.aria-label]=\"r.name\"\n (click)=\"select(r)\"\n >\n <span class=\"mcpe-mcp-resource-browser-icon\" aria-hidden=\"true\">{{ mimeLabel(r.mimeType) }}</span>\n <span class=\"mcpe-mcp-resource-browser-name\">{{ r.name }}</span>\n @if (r.mimeType) {\n <span class=\"mcpe-mcp-resource-browser-type\">{{ r.mimeType.split('/')[0] }}</span>\n }\n </button>\n }\n </div>\n }\n `,\n})\nexport class McpeMcpResourceBrowserComponent {\n resources = input<McpResource[]>([])\n selectedUri = input<string>()\n loading = input(false)\n class = input('')\n onSelect = output<McpResource>()\n\n readonly skeletonItems = [1, 2, 3, 4]\n\n classes = computed(() => cn('mcpe-mcp-resource-browser', this.class()))\n\n itemClass(uri: string): string {\n return cn(\n 'mcpe-mcp-resource-browser-item w-full text-left',\n this.selectedUri() === uri ? 'mcpe-mcp-resource-browser-item-selected' : ''\n )\n }\n\n mimeLabel(mimeType?: string): string {\n return mimeTypeLabel(mimeType)\n }\n\n select(r: McpResource) {\n this.onSelect.emit(r)\n }\n}\n","import { Component, input, output, effect, computed, ElementRef, viewChild, OnDestroy } from '@angular/core'\nimport { cn, createAppBridge } from '@mcp-elements/core'\nimport type { AppMessageEnvelope } from '@mcp-elements/core'\n\n@Component({\n selector: 'mcpe-mcp-app-frame',\n standalone: true,\n template: `\n <div [class]=\"classes()\">\n <iframe\n #frame\n [src]=\"src()\"\n [sandbox]=\"sandbox()\"\n [style.height.px]=\"height()\"\n title=\"MCP App\"\n aria-label=\"MCP App frame\"\n style=\"display:block;width:100%;border:none\"\n ></iframe>\n </div>\n `,\n})\nexport class McpeMcpAppFrameComponent implements OnDestroy {\n src = input.required<string>()\n height = input(480)\n sandbox = input('allow-scripts allow-same-origin')\n class = input('')\n onMessage = output<AppMessageEnvelope>()\n\n frame = viewChild<ElementRef<HTMLIFrameElement>>('frame')\n\n private _unsub: (() => void) | undefined\n private _removeListener: (() => void) | undefined\n\n constructor() {\n effect(() => {\n this._cleanup()\n const bridge = createAppBridge({\n postMessage: (env: AppMessageEnvelope) => {\n this.frame()?.nativeElement?.contentWindow?.postMessage(env, '*')\n },\n })\n const unsub = bridge.onMessage((env: AppMessageEnvelope) => this.onMessage.emit(env))\n const handler = (e: MessageEvent) => bridge.receive(e.data)\n window.addEventListener('message', handler)\n this._unsub = unsub\n this._removeListener = () => window.removeEventListener('message', handler)\n })\n }\n\n private _cleanup() {\n this._unsub?.()\n this._removeListener?.()\n this._unsub = undefined\n this._removeListener = undefined\n }\n\n ngOnDestroy() { this._cleanup() }\n\n classes = computed(() => cn('mcpe-mcp-app-frame', this.class()))\n}\n"],"mappings":"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","names":["Component","computed","input","SnxButtonComponent","variant","input","size","disabled","type","class","classes","computed","filter","Boolean","join","selector","standalone","template","Component","computed","input","SnxBadgeComponent","variant","input","class","classes","computed","filter","Boolean","join","selector","standalone","template","Component","input","computed","SnxCardComponent","class","input","classes","computed","filter","Boolean","join","selector","standalone","template","SnxCardHeaderComponent","SnxCardTitleComponent","SnxCardDescriptionComponent","SnxCardContentComponent","SnxCardFooterComponent","Component","input","computed","forwardRef","NG_VALUE_ACCESSOR","SnxInputComponent","type","input","placeholder","disabled","value","class","classes","computed","filter","Boolean","join","onChange","onTouched","onInput","event","target","writeValue","registerOnChange","fn","registerOnTouched","selector","standalone","template","providers","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","Component","input","computed","SnxTextareaComponent","placeholder","input","disabled","rows","class","classes","computed","filter","Boolean","join","selector","standalone","template","Component","input","computed","signal","SnxAvatarComponent","src","input","alt","fallback","class","hasError","signal","classes","computed","filter","Boolean","join","selector","standalone","template","Component","input","computed","SnxSeparatorComponent","orientation","input","class","classes","computed","filter","Boolean","join","selector","standalone","template","Component","input","computed","SnxSkeletonComponent","class","input","classes","computed","filter","Boolean","join","selector","standalone","template","Component","input","output","signal","SnxDialogComponent","modal","input","open","signal","openChange","output","toggle","update","v","emit","close","set","show","selector","standalone","template","Component","input","output","signal","computed","effect","createTabs","SnxTabsComponent","items","input","defaultValue","activeValue","signal","api","computed","createTabs","onValueChange","v","set","effect","def","length","value","getTabProps","getTriggerProps","getPanelProps","isActive","select","selector","standalone","template","SnxTabsListComponent","SnxTabsTriggerComponent","onClick","output","class","classes","filter","Boolean","join","SnxTabsContentComponent","Component","input","output","signal","computed","createAccordion","SnxAccordionComponent","items","input","type","collapsible","expandedValues","signal","api","computed","createAccordion","onValueChange","v","set","isExpanded","value","includes","toggle","props","getTriggerProps","onClick","selector","standalone","template","SnxAccordionItemComponent","SnxAccordionTriggerComponent","output","SnxAccordionContentComponent","Component","input","output","signal","computed","viewChild","SnxSelectComponent","options","input","placeholder","valueChange","output","isOpen","signal","selectedValue","highlightedIndex","container","viewChild","selectedLabel","computed","val","find","o","value","label","toggle","update","v","selectOption","option","disabled","set","emit","getItemClasses","index","filter","Boolean","join","onKeyDown","event","opts","key","preventDefault","i","length","opt","onDocumentClick","el","nativeElement","contains","target","selector","standalone","template","host","Directive","input","HostListener","ElementRef","Renderer2","SnxTooltipDirective","mcpeTooltip","input","tooltipDelay","tooltipEl","timeoutId","el","renderer","onShow","clearDelay","setTimeout","show","onHide","hide","createElement","addClass","setStyle","text","createText","appendChild","nativeElement","removeChild","clearTimeout","ngOnDestroy","selector","standalone","Component","signal","viewChild","SnxPopoverComponent","isOpen","signal","container","viewChild","toggle","update","v","close","set","show","onDocumentClick","event","el","nativeElement","contains","target","selector","standalone","template","host","Component","Injectable","signal","SnxToastService","toasts","signal","counter","show","toast","duration","id","update","t","setTimeout","dismiss","success","title","description","variant","error","filter","x","providedIn","SnxToasterComponent","toastService","selector","standalone","template","Component","input","output","signal","SnxDrawerComponent","side","input","open","signal","openChange","output","show","set","emit","close","toggle","update","v","selector","standalone","template","SnxDrawerHeaderComponent","SnxDrawerFooterComponent","SnxDrawerTitleComponent","SnxDrawerDescriptionComponent","SnxDrawerBodyComponent","Component","input","signal","viewChild","SnxDropdownMenuComponent","items","input","isOpen","signal","container","viewChild","toggle","update","v","close","set","selectItem","item","disabled","onDocumentClick","event","el","nativeElement","contains","target","selector","standalone","template","host","Component","input","output","signal","SnxSwitchComponent","checked","signal","disabled","input","checkedChange","output","toggle","update","v","emit","selector","standalone","template","Component","input","computed","SnxProgressComponent","value","input","max","transform","computed","pct","Math","min","selector","standalone","template","Component","input","computed","SnxLoaderComponent","size","input","variant","classes","computed","selector","standalone","template","Component","input","output","computed","SnxChipComponent","variant","input","removable","remove","output","classes","computed","filter","Boolean","join","selector","standalone","template","SnxChipsComponent","Component","input","signal","SnxPasswordInputComponent","placeholder","input","disabled","showPassword","signal","selector","standalone","template","Component","input","output","signal","SnxCounterComponent","value","signal","min","input","max","step","disabled","valueChange","output","decrement","update","v","Math","emit","increment","onInput","event","num","parseInt","target","isNaN","set","selector","standalone","template","Component","input","computed","SnxAlertComponent","variant","input","classes","computed","selector","standalone","template","SnxAlertTitleComponent","SnxAlertDescriptionComponent","Component","input","output","computed","SnxPromptInputComponent","class","input","classes","computed","filter","Boolean","join","selector","standalone","template","SnxPromptInputTextareaComponent","placeholder","rows","SnxPromptInputFooterComponent","SnxPromptInputActionsComponent","SnxPromptInputCharCountComponent","count","max","undefined","SnxPromptInputAttachmentsComponent","SnxPromptInputAttachmentComponent","remove","output","Component","input","computed","SnxChatBubbleComponent","variant","input","class","classes","computed","filter","Boolean","join","selector","standalone","template","SnxChatBubbleAvatarComponent","src","required","alt","SnxChatBubbleContentComponent","SnxChatBubbleTimestampComponent","SnxChatBubbleTypingComponent","Component","input","computed","SnxAiBadgeComponent","variant","input","showIcon","class","classes","computed","filter","Boolean","join","selector","standalone","template","Component","input","computed","SnxSuggestionChipsComponent","selector","standalone","template","SnxSuggestionChipComponent","variant","input","class","classes","computed","filter","Boolean","join","Component","input","SnxSourceCardsComponent","selector","standalone","template","SnxSourceCardComponent","href","input","required","favicon","title","domain","index","undefined","Component","SnxStreamingTextComponent","selector","standalone","template","SnxStreamingTextFadeInComponent","SnxStreamingTextWordComponent","SnxStreamingTextLineComponent","SnxStreamingTextSkeletonComponent","SnxStreamingTextSkeletonLineComponent","Component","input","computed","SnxFeedbackComponent","selector","standalone","template","SnxFeedbackButtonComponent","feedbackType","input","required","alias","selected","class","classes","computed","filter","Boolean","join","SnxFeedbackSeparatorComponent","SnxFeedbackFormComponent","SnxFeedbackInputComponent","placeholder","SnxFeedbackSubmitComponent","Component","input","computed","cn","STATUS_LABELS","connected","connecting","disconnected","error","McpeMcpServerStatusComponent","status","input","required","serverName","class","classes","computed","cn","label","s","statusLabel","ariaLabel","selector","standalone","template","Component","input","output","signal","effect","computed","CommonModule","cn","STATUS_LABELS","idle","pending","running","done","error","cancelled","McpeMcpToolCallComponent","state","input","required","toolName","args","onRetry","output","class","statusLabels","snap","signal","status","_unsub","effect","s","set","tool","result","startedAt","endedAt","subscribe","snapshot","ngOnDestroy","classes","computed","cn","badgeClass","displayName","displayArgs","textBlocks","content","filter","c","type","map","text","selector","standalone","imports","CommonModule","template","Component","input","output","signal","computed","CommonModule","cn","schemaToFields","McpeMcpToolFormComponent","schema","input","required","loading","submitLabel","class","onSubmit","output","fields","computed","schemaToFields","values","signal","ngOnInit","defaults","f","defaultValue","undefined","key","set","classes","cn","setValue","value","update","v","onInputChange","event","target","onNumberChange","valueAsNumber","onCheckChange","checked","getStr","String","getBool","Boolean","labelClass","field","inputType","kind","handleSubmit","emit","selector","standalone","imports","CommonModule","template","Component","input","output","computed","CommonModule","parseScopes","McpeMcpConsentDialogComponent","open","input","required","serverName","serverIcon","scopes","onApprove","output","onDeny","parsedScopes","computed","parseScopes","join","approve","emit","deny","selector","standalone","imports","CommonModule","template","Component","input","signal","computed","CommonModule","cn","parseScopes","McpeMcpScopeInspectorComponent","scopes","input","descriptions","class","openKeys","signal","Set","parsedScopes","computed","s","parseScopes","classes","cn","toggle","key","update","prev","next","has","delete","add","isOpen","chevronClass","getDescription","d","raw","resource","description","selector","standalone","imports","CommonModule","template","Component","input","output","computed","CommonModule","cn","mimeTypeLabel","mimeType","includes","split","slice","McpeMcpResourceBrowserComponent","resources","input","selectedUri","loading","class","onSelect","output","skeletonItems","classes","computed","cn","itemClass","uri","mimeLabel","select","r","emit","selector","standalone","imports","CommonModule","template","Component","input","output","effect","computed","viewChild","cn","createAppBridge","McpeMcpAppFrameComponent","src","input","required","height","sandbox","class","onMessage","output","frame","viewChild","_unsub","_removeListener","effect","_cleanup","bridge","createAppBridge","postMessage","env","nativeElement","contentWindow","unsub","emit","handler","e","receive","data","window","addEventListener","removeEventListener","undefined","ngOnDestroy","classes","computed","cn","selector","standalone","template"]}
package/package.json CHANGED
@@ -1,22 +1,39 @@
1
1
  {
2
2
  "name": "@mcp-elements/angular",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
+ "private": false,
5
+ "description": "mcp-elements Angular 19 standalone components",
4
6
  "type": "module",
5
- "main": "./src/index.ts",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
6
19
  "dependencies": {
7
- "@mcp-elements/core": "0.1.0"
20
+ "@mcp-elements/core": "0.1.1"
8
21
  },
9
22
  "peerDependencies": {
10
23
  "@angular/core": "^19.0.0",
11
- "@angular/common": "^19.0.0"
24
+ "@angular/common": "^19.0.0",
25
+ "@angular/forms": "^19.0.0"
26
+ },
27
+ "devDependencies": {
28
+ "@angular/core": "^19.0.0",
29
+ "@angular/common": "^19.0.0",
30
+ "@angular/forms": "^19.0.0",
31
+ "@swc/core": "^1.7.0",
32
+ "tsup": "^8.3.0"
12
33
  },
13
- "files": [
14
- "src"
15
- ],
16
- "types": "./src/index.ts",
17
34
  "scripts": {
18
- "build": "echo 'Angular components are source-distributed via CLI'",
19
- "test": "echo 'Angular tests run in example app'",
20
- "clean": "echo 'nothing to clean'"
35
+ "build": "tsup",
36
+ "dev": "tsup --watch",
37
+ "clean": "rm -rf dist"
21
38
  }
22
39
  }
@@ -1,74 +0,0 @@
1
- import { Component, input, signal, computed } from '@angular/core'
2
- import { createAccordion, type AccordionItemConfig } from '@mcp-elements/core'
3
-
4
- @Component({
5
- selector: 'mcpe-accordion',
6
- standalone: true,
7
- template: `<div><ng-content /></div>`,
8
- })
9
- export class SnxAccordionComponent {
10
- items = input<AccordionItemConfig[]>([])
11
- type = input<'single' | 'multiple'>('single')
12
- collapsible = input(false)
13
- expandedValues = signal<string[]>([])
14
-
15
- private api = computed(() =>
16
- createAccordion(this.items(), {
17
- type: this.type(),
18
- collapsible: this.collapsible(),
19
- onValueChange: (v) => this.expandedValues.set(v),
20
- })
21
- )
22
-
23
- isExpanded(value: string): boolean {
24
- return this.expandedValues().includes(value)
25
- }
26
-
27
- toggle(value: string) {
28
- const props = this.api().getTriggerProps(value, this.expandedValues())
29
- props.onClick()
30
- }
31
- }
32
-
33
- @Component({
34
- selector: 'mcpe-accordion-item',
35
- standalone: true,
36
- template: `<div class="mcpe-accordion-item"><ng-content /></div>`,
37
- })
38
- export class SnxAccordionItemComponent {}
39
-
40
- @Component({
41
- selector: 'mcpe-accordion-trigger',
42
- standalone: true,
43
- template: `
44
- <h3>
45
- <button
46
- [class]="'mcpe-accordion-trigger'"
47
- [attr.aria-expanded]="isExpanded()"
48
- (click)="onClick.emit()"
49
- >
50
- <ng-content />
51
- <svg class="mcpe-accordion-chevron" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
52
- <path d="m6 9 6 6 6-6" />
53
- </svg>
54
- </button>
55
- </h3>
56
- `,
57
- })
58
- export class SnxAccordionTriggerComponent {
59
- isExpanded = input(false)
60
- onClick = output<void>()
61
- }
62
-
63
- @Component({
64
- selector: 'mcpe-accordion-content',
65
- standalone: true,
66
- template: `
67
- @if (isExpanded()) {
68
- <div role="region" class="mcpe-accordion-content"><ng-content /></div>
69
- }
70
- `,
71
- })
72
- export class SnxAccordionContentComponent {
73
- isExpanded = input(false)
74
- }
@@ -1,26 +0,0 @@
1
- import { Component, input, computed } from '@angular/core'
2
-
3
- type AiBadgeVariant = 'default' | 'prominent' | 'subtle'
4
-
5
- @Component({
6
- selector: 'mcpe-ai-badge',
7
- standalone: true,
8
- template: `
9
- <span [class]="classes()">
10
- @if (showIcon()) {
11
- <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
12
- <path d="M12 3l1.912 5.813a2 2 0 0 0 1.275 1.275L21 12l-5.813 1.912a2 2 0 0 0-1.275 1.275L12 21l-1.912-5.813a2 2 0 0 1-1.275-1.275L3 12l5.813-1.912a2 2 0 0 1 1.275-1.275L12 3z" />
13
- </svg>
14
- }
15
- <ng-content />
16
- </span>
17
- `,
18
- })
19
- export class SnxAiBadgeComponent {
20
- variant = input<AiBadgeVariant>('default')
21
- showIcon = input(true)
22
- class = input('')
23
- classes = computed(() =>
24
- ['mcpe-ai-badge', `mcpe-ai-badge-${this.variant()}`, this.class()].filter(Boolean).join(' ')
25
- )
26
- }
@@ -1,25 +0,0 @@
1
- import { Component, input, computed } from '@angular/core'
2
-
3
- @Component({
4
- selector: 'mcpe-alert',
5
- standalone: true,
6
- template: `<div [class]="classes()" role="alert"><ng-content /></div>`,
7
- })
8
- export class SnxAlertComponent {
9
- variant = input<'default' | 'destructive' | 'success' | 'warning'>('default')
10
- classes = computed(() => `mcpe-alert mcpe-alert-${this.variant()}`)
11
- }
12
-
13
- @Component({
14
- selector: 'mcpe-alert-title',
15
- standalone: true,
16
- template: `<h5 class="mcpe-alert-title"><ng-content /></h5>`,
17
- })
18
- export class SnxAlertTitleComponent {}
19
-
20
- @Component({
21
- selector: 'mcpe-alert-description',
22
- standalone: true,
23
- template: `<div class="mcpe-alert-description"><ng-content /></div>`,
24
- })
25
- export class SnxAlertDescriptionComponent {}
@@ -1,24 +0,0 @@
1
- import { Component, input, computed, signal } from '@angular/core'
2
-
3
- @Component({
4
- selector: 'mcpe-avatar',
5
- standalone: true,
6
- template: `
7
- <div [class]="classes()">
8
- @if (src() && !hasError()) {
9
- <img [src]="src()" [alt]="alt()" class="mcpe-avatar-image" (error)="hasError.set(true)" />
10
- } @else {
11
- <span class="mcpe-avatar-fallback">{{ fallback() }}</span>
12
- }
13
- </div>
14
- `,
15
- })
16
- export class SnxAvatarComponent {
17
- src = input<string>('')
18
- alt = input('')
19
- fallback = input('')
20
- class = input('')
21
- hasError = signal(false)
22
-
23
- classes = computed(() => ['mcpe-avatar', this.class()].filter(Boolean).join(' '))
24
- }
@@ -1,17 +0,0 @@
1
- import { Component, computed, input } from '@angular/core'
2
-
3
- type BadgeVariant = 'default' | 'secondary' | 'outline' | 'destructive'
4
-
5
- @Component({
6
- selector: 'mcpe-badge',
7
- standalone: true,
8
- template: `<span [class]="classes()"><ng-content /></span>`,
9
- })
10
- export class SnxBadgeComponent {
11
- variant = input<BadgeVariant>('default')
12
- class = input('')
13
-
14
- classes = computed(() =>
15
- ['mcpe-badge', `mcpe-badge-${this.variant()}`, this.class()].filter(Boolean).join(' ')
16
- )
17
- }
@@ -1,27 +0,0 @@
1
- import { Component, computed, input } from '@angular/core'
2
-
3
- type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'link'
4
- type ButtonSize = 'sm' | 'md' | 'lg' | 'icon'
5
-
6
- @Component({
7
- selector: 'mcpe-button',
8
- standalone: true,
9
- template: `
10
- <button [class]="classes()" [disabled]="disabled()" [type]="type()">
11
- <ng-content />
12
- </button>
13
- `,
14
- })
15
- export class SnxButtonComponent {
16
- variant = input<ButtonVariant>('primary')
17
- size = input<ButtonSize>('md')
18
- disabled = input(false)
19
- type = input<'button' | 'submit' | 'reset'>('button')
20
- class = input('')
21
-
22
- classes = computed(() =>
23
- ['mcpe-btn', `mcpe-btn-${this.variant()}`, `mcpe-btn-${this.size()}`, this.class()]
24
- .filter(Boolean)
25
- .join(' ')
26
- )
27
- }
@@ -1,46 +0,0 @@
1
- import { Component, input, computed } from '@angular/core'
2
-
3
- @Component({
4
- selector: 'mcpe-card',
5
- standalone: true,
6
- template: `<div [class]="classes()"><ng-content /></div>`,
7
- })
8
- export class SnxCardComponent {
9
- class = input('')
10
- classes = computed(() => ['mcpe-card', this.class()].filter(Boolean).join(' '))
11
- }
12
-
13
- @Component({
14
- selector: 'mcpe-card-header',
15
- standalone: true,
16
- template: `<div class="mcpe-card-header"><ng-content /></div>`,
17
- })
18
- export class SnxCardHeaderComponent {}
19
-
20
- @Component({
21
- selector: 'mcpe-card-title',
22
- standalone: true,
23
- template: `<h3 class="mcpe-card-title"><ng-content /></h3>`,
24
- })
25
- export class SnxCardTitleComponent {}
26
-
27
- @Component({
28
- selector: 'mcpe-card-description',
29
- standalone: true,
30
- template: `<p class="mcpe-card-description"><ng-content /></p>`,
31
- })
32
- export class SnxCardDescriptionComponent {}
33
-
34
- @Component({
35
- selector: 'mcpe-card-content',
36
- standalone: true,
37
- template: `<div class="mcpe-card-content"><ng-content /></div>`,
38
- })
39
- export class SnxCardContentComponent {}
40
-
41
- @Component({
42
- selector: 'mcpe-card-footer',
43
- standalone: true,
44
- template: `<div class="mcpe-card-footer"><ng-content /></div>`,
45
- })
46
- export class SnxCardFooterComponent {}