@ruc-lib/knob 3.1.0 → 3.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruc-lib-knob.mjs","sources":["../../src/models/knob-config.model.ts","../../src/lib/ruclib-knob/ruclib-knob.component.ts","../../src/lib/ruclib-knob/ruclib-knob.component.html","../../src/lib/ruclib-knob.module.ts","../../src/models/knob.interface.ts","../../src/ruc-lib-knob.ts"],"sourcesContent":["export const DefaultKnobConfig = {\r\n min:<number> 0,\r\n max:<number> 100,\r\n step:<number> 1,\r\n size:<number> 150,\r\n valueColor:<string> '',\r\n strokeBackground:<string> 'lightblue',\r\n progressBackground: <string | string[]> 'blue', // 'green' | ['green'] | ['red', 'blue', 'green', 'black', 'orange'],\r\n strokeWidth:<number> 15,\r\n valueSize:<number> 20,\r\n valueWeight:<string> 'normal',\r\n showHandle:<boolean> true,\r\n handleBackground:<string> 'lightblue',\r\n handleBorderColor:<string> 'blue',\r\n handleBorderWidth:<number> 4,\r\n roundedCorner:<boolean> true,\r\n valuePrefix:<string> '',\r\n valueSuffix:<string> '',\r\n readOnly:<boolean> false,\r\n disabled:<boolean> false,\r\n enableTooltip:<boolean> false,\r\n animateOnHover:<boolean> false,\r\n isRangeMode:<boolean> false,\r\n rangeStartValue:<number> 25,\r\n rangeEndValue:<number> 75,\r\n showButtons:<boolean> false,\r\n knobType:<'horizontal' | 'vertical' | 'arc'> 'arc' // 'horizontal' | 'vertical' | 'arc'\r\n }\r\n\r\n export const DEFAULT_LABELS = {\r\n incrementButton:<string> 'Increment Value',\r\n decrementButton:<string> 'Decrement Value'\r\n }","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { KnobConfig } from '../../models/knob.interface';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DEFAULT_LABELS, DefaultKnobConfig } from '../../models/knob-config.model';\r\n\r\n@Component({\r\n selector: 'uxp-ruclib-knob',\r\n templateUrl: './ruclib-knob.component.html',\r\n styleUrls: ['./ruclib-knob.component.scss'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RuclibKnobComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class RuclibKnobComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\r\n\r\n @ViewChild('bgArc') bgArcRef!: ElementRef<SVGPathElement>;\r\n @ViewChild('progressArc') progressArcRef!: ElementRef<SVGPathElement>;\r\n @ViewChild('handle') handleRef!: ElementRef<SVGCircleElement>;\r\n @ViewChild('horizontalLine') horizontalLineRef!: ElementRef<SVGLineElement>;\r\n @ViewChild('verticalLine') verticalLineRef!: ElementRef<SVGLineElement>;\r\n\r\n @Output() rucEvent = new EventEmitter<any>();\r\n\r\n @Input() customTheme?: string = '';\r\n @Input() rucInputData!: KnobConfig;\r\n\r\n activeHandle: 'start' | 'end' | '' = '';\r\n value: number = 0;\r\n dragging:boolean = false;\r\n centerX:number = 0;\r\n centerY:number = 0;\r\n radius:number = 0;\r\n startAngle:number = 210;\r\n endAngle:number = 510;\r\n arcLength:number = 300;\r\n changeColorAfter:number = 0;\r\n tooltipX:number = 0;\r\n tooltipY:number = 0;\r\n showTooltip: boolean = false;\r\n hovering:boolean = false;\r\n\r\n config = DefaultKnobConfig;\r\n\r\n private onTouched = () => { };\r\n private onChange = (value: number) => { };\r\n\r\n constructor(private cdr: ChangeDetectorRef) {\r\n }\r\n\r\n /**\r\n * handling form control binding to write value\r\n * @param val \r\n */\r\n writeValue(val: number): void {\r\n this.value = val;\r\n }\r\n\r\n /**\r\n * registering onChange method to use as form control\r\n * @param fn \r\n */\r\n registerOnChange(fn: () => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n /**\r\n * registering onTouch method to use as form control\r\n * @param fn \r\n */\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n /**\r\n * registering disabled state\r\n * @param isDisabled \r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.config.disabled = isDisabled;\r\n }\r\n\r\n /**\r\n * handling input data changes\r\n * updating default config with user provided config\r\n * @param changes \r\n */\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes && changes['rucInputData'] && changes['rucInputData'].currentValue) {\r\n this.config = { ...this.config, ...changes['rucInputData'].currentValue }\r\n }\r\n }\r\n\r\n /**\r\n * handling change on component initilization\r\n */\r\n ngOnInit() {\r\n this.adjustDefaultValue();\r\n if (this.config.knobType != 'arc') {\r\n this.config.isRangeMode = false;\r\n this.config.enableTooltip = false;\r\n }\r\n if (Array.isArray(this.config.progressBackground)) {\r\n this.changeColorAfter = Math.round(100 / this.config.progressBackground.length);\r\n }\r\n }\r\n\r\n /**\r\n * handling change after view initilization\r\n */\r\n ngAfterViewInit() {\r\n this.centerX = this.config.size / 2;\r\n this.centerY = this.config.size / 2;\r\n this.radius = this.config.size / 2 - 20;\r\n\r\n this.bgArcRef?.nativeElement.setAttribute('d',\r\n this.describeArc(this.centerX, this.centerY, this.radius, this.startAngle, this.endAngle));\r\n this.updateArc();\r\n this.cdr.detectChanges();\r\n }\r\n\r\n /**\r\n * handling change when dragin on svg\r\n * @returns \r\n */\r\n startDrag() {\r\n if (this.config.disabled || this.config.readOnly) return;\r\n this.dragging = true;\r\n this.showTooltip = true;\r\n this.rucEvent.emit({ eventName: 'dragStart', eventOutput: { value: this.getEventOutput() } })\r\n }\r\n\r\n /**\r\n * rounding value to increment or decrement based on provide config value for step\r\n * @param value \r\n * @returns \r\n */\r\n roundToStep(value: number): number {\r\n const stepped = Math.round((value - this.config.min) / this.config.step) * this.config.step + this.config.min;\r\n return this.clamp(stepped, this.config.min, this.config.max);\r\n }\r\n\r\n /**\r\n * adjusting default value within min & max value when its provide out of range\r\n */\r\n adjustDefaultValue() {\r\n if (this.value < this.config.min) {\r\n this.value = this.config.min;\r\n }\r\n if (this.value > this.config.max) {\r\n this.value = this.config.max;\r\n }\r\n if (this.config.isRangeMode) {\r\n if (this.config.rangeStartValue < this.config.min || this.config.rangeStartValue > this.config.max) {\r\n this.config.rangeStartValue = this.config.min;\r\n }\r\n if (this.config.rangeEndValue > this.config.max || this.config.rangeEndValue < this.config.min) {\r\n this.config.rangeEndValue = this.config.max;\r\n }\r\n }\r\n this.updateArc();\r\n }\r\n\r\n /**\r\n * handle changes on mouseUp and touchEnd event\r\n */\r\n @HostListener('window:mouseup')\r\n @HostListener('window:touchend')\r\n stopDrag() {\r\n this.dragging = false;\r\n this.showTooltip = false;\r\n this.rucEvent.emit({ eventName: 'dragEnd', eventOutput: { value: this.getEventOutput() } })\r\n }\r\n\r\n /**\r\n * handle changes on mouseMove and touch event\r\n * @param event \r\n * @returns \r\n */\r\n @HostListener('window:mousemove', ['$event'])\r\n @HostListener('window:touchmove', ['$event'])\r\n onMove(event: MouseEvent | TouchEvent) {\r\n if (this.config.disabled || this.config.readOnly || !this.dragging) return;\r\n event.preventDefault();\r\n this.setProgressFromEvent(event);\r\n }\r\n\r\n /**\r\n * handling change on main svg click\r\n * @param event \r\n * @returns \r\n */\r\n onSvgClick(event: MouseEvent | TouchEvent) {\r\n if (this.config.disabled || this.config.readOnly || this.config.isRangeMode) return;\r\n this.setProgressFromEvent(event);\r\n }\r\n\r\n /**\r\n * get ref of active svg element for different type of knobs\r\n * @returns \r\n */\r\n getTargetSvg(): SVGElement | null {\r\n if (this.config.knobType === 'horizontal') {\r\n return this.horizontalLineRef.nativeElement.closest('svg');\r\n } else\r\n if (this.config.knobType === 'vertical') {\r\n return this.verticalLineRef.nativeElement.closest('svg');\r\n }\r\n return this.bgArcRef.nativeElement.closest('svg');\r\n\r\n }\r\n\r\n /**\r\n * updating progrees value while dragging the handle on stroke bar\r\n * @param e \r\n * @returns \r\n */\r\n setProgressFromEvent(e: MouseEvent | TouchEvent) {\r\n const svg = this.getTargetSvg();\r\n if (!svg) {\r\n return;\r\n }\r\n const rect = svg.getBoundingClientRect();\r\n const clientX = (e instanceof TouchEvent) ? e.touches[0].clientX : e.clientX;\r\n const clientY = (e instanceof TouchEvent) ? e.touches[0].clientY : e.clientY;\r\n\r\n const x = clientX - rect.left;\r\n const y = clientY - rect.top;\r\n\r\n let rawPercent: number;\r\n if (this.config.knobType === 'horizontal') {\r\n const usableWidth = this.config.size - 2 * this.config.strokeWidth;\r\n rawPercent = ((x - this.config.strokeWidth) / usableWidth) * 100;\r\n } else if (this.config.knobType === 'vertical') {\r\n const usableHeight = this.config.size - 2 * this.config.strokeWidth;\r\n rawPercent = (1 - (y - this.config.strokeWidth) / usableHeight) * 100;\r\n } else {\r\n const angle = this.getAngleFromPoint(x, y);\r\n if (angle === null) return;\r\n rawPercent = ((angle - this.startAngle) / this.arcLength) * 100;\r\n }\r\n\r\n const clampedPercent = this.clamp(rawPercent, 0, 100);\r\n let absolutePercent = this.config.min + (clampedPercent / 100) * (this.config.max - this.config.min);\r\n absolutePercent = this.roundToStep(absolutePercent);\r\n\r\n if (this.config.isRangeMode) {\r\n if (this.activeHandle === 'start') {\r\n if (absolutePercent > this.config.rangeEndValue) {\r\n absolutePercent = this.config.rangeEndValue;\r\n }\r\n this.config.rangeStartValue = absolutePercent;\r\n } else {\r\n if (absolutePercent < this.config.rangeStartValue) {\r\n absolutePercent = this.config.rangeStartValue;\r\n }\r\n this.config.rangeEndValue = absolutePercent;\r\n }\r\n this.rucEvent.emit({ eventName: 'valueChange', eventOutput: { start: this.config.rangeStartValue, end: this.config.rangeEndValue } })\r\n } else {\r\n this.value = absolutePercent;\r\n this.rucEvent.emit({ eventName: 'valueChange', eventOutput: this.value });\r\n }\r\n\r\n this.updateArc();\r\n this.onChange(this.value);\r\n this.onTouched();\r\n }\r\n\r\n /**\r\n * updating svg progress based on value changes\r\n * @returns \r\n */\r\n updateArc() {\r\n if (this.config.knobType !== 'arc') {\r\n return\r\n }\r\n\r\n const scaled = (this.value - this.config.min) / (this.config.max - this.config.min);\r\n const angle = this.startAngle + scaled * this.arcLength;\r\n\r\n const path = this.describeArc(this.centerX, this.centerY, this.radius, this.startAngle, angle);\r\n this.progressArcRef?.nativeElement.setAttribute('d', path);\r\n\r\n const pos = this.polarToCartesian(this.centerX, this.centerY, this.radius, angle);\r\n this.handleRef?.nativeElement.setAttribute('cx', pos.x.toString());\r\n this.handleRef?.nativeElement.setAttribute('cy', pos.y.toString());\r\n\r\n // for tooltip\r\n const angleRad = (angle - 90) * Math.PI / 180;\r\n const tooltipRadius = this.radius + this.config.strokeWidth / 2 + 10;\r\n this.tooltipX = this.centerX + tooltipRadius * Math.cos(angleRad);\r\n this.tooltipY = this.centerY + tooltipRadius * Math.sin(angleRad);\r\n }\r\n\r\n /**\r\n * return maximum value out of min & max range\r\n * @param val \r\n * @param min \r\n * @param max \r\n * @returns \r\n */\r\n clamp(val: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, val));\r\n }\r\n\r\n /**\r\n * getting calulated point from polar coordinates to cartesian coordinates\r\n * @param cx \r\n * @param cy \r\n * @param r \r\n * @param angleDeg \r\n * @returns \r\n */\r\n polarToCartesian(cx: number, cy: number, r: number, angleDeg: number) {\r\n const angleRad = (angleDeg - 90) * Math.PI / 180;\r\n return {\r\n x: cx + r * Math.cos(angleRad),\r\n y: cy + r * Math.sin(angleRad)\r\n };\r\n }\r\n\r\n /**\r\n * getting radius for arc handle based on stroke width \r\n * @returns \r\n */\r\n getRadius() {\r\n return this.config.strokeWidth ? (this.config.strokeWidth / 2) - ((this.config.handleBorderWidth ?? 0) / 2) : 4;\r\n }\r\n\r\n /**\r\n * getting svg box size based on different knob shapes\r\n * @returns \r\n */\r\n getSvgViewBoxSize() {\r\n let width = this.config.size, height = this.config.size;\r\n if (this.config.knobType === 'horizontal') {\r\n height = this.config.strokeWidth + 40;\r\n }\r\n if (this.config.knobType === 'vertical') {\r\n height = this.config.size / 4 + 5\r\n width = this.config.strokeWidth + 40;\r\n }\r\n return '0 0 ' + width + ' ' + height\r\n }\r\n\r\n /**\r\n * geeting dynamic bg color for progress stroke based on provide config for \"progressBackground\"\r\n */\r\n get progressColor(): string {\r\n if (typeof this.config.progressBackground === 'string') {\r\n return this.config.progressBackground;\r\n } else\r\n if ((this.config.progressBackground as string[])?.length == 1) {\r\n return this.config.progressBackground[0];\r\n } else\r\n if ((this.config.progressBackground as string[]).length > 1) {\r\n return this.config.progressBackground[Math.ceil(this.value / this.changeColorAfter) - 1]\r\n } else {\r\n return 'green'\r\n }\r\n }\r\n\r\n /**\r\n * getting coordinates for arc based on provided inputs\r\n * @param cx \r\n * @param cy \r\n * @param r \r\n * @param start \r\n * @param end \r\n * @returns \r\n */\r\n describeArc(cx: number, cy: number, r: number, start: number, end: number): string {\r\n const startPos = this.polarToCartesian(cx, cy, r, end);\r\n const endPos = this.polarToCartesian(cx, cy, r, start);\r\n const largeArc = end - start <= 180 ? 0 : 1;\r\n\r\n return [\r\n \"M\", startPos.x, startPos.y,\r\n \"A\", r, r, 0, largeArc, 0, endPos.x, endPos.y\r\n ].join(\" \");\r\n }\r\n\r\n /**\r\n * getting calculated angle for arc progress based on provided input\r\n * @param x \r\n * @param y \r\n * @returns \r\n */\r\n getAngleFromPoint(x: number, y: number): number | null {\r\n const dx = x - this.centerX;\r\n if (dx === 0) {\r\n return null;\r\n }\r\n const dy = y - this.centerY;\r\n\r\n let angle = Math.atan2(dy, dx) * 180 / Math.PI + 90;\r\n if (angle < 0) angle += 360;\r\n\r\n const normalizedStart = this.startAngle % 360;\r\n let delta = angle - normalizedStart;\r\n if (delta < 0) delta += 360;\r\n\r\n if (delta > this.arcLength) return null;\r\n\r\n return this.startAngle + delta;\r\n }\r\n\r\n /**\r\n * increment value on click on button\r\n * @returns \r\n */\r\n increment() {\r\n if (this.config.disabled || this.config.readOnly) return;\r\n this.value = this.clamp((this.value + this.config.step), this.config.min, this.config.max);\r\n this.updateArc();\r\n this.onChange(this.value);\r\n this.onTouched();\r\n }\r\n\r\n /**\r\n * decrement value on click on button\r\n * @returns \r\n */\r\n decrement() {\r\n if (this.config.disabled || this.config.readOnly) return;\r\n this.value = this.clamp((this.value - this.config.step), this.config.min, this.config.max);\r\n this.updateArc();\r\n this.onChange(this.value);\r\n this.onTouched();\r\n }\r\n /**\r\n * change value using arrow keys for accessibility\r\n * @param event \r\n * @returns \r\n */\r\n onKeyDown(event: KeyboardEvent) {\r\n if (this.config.readOnly || this.config.disabled) return;\r\n\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\r\n this.increment();\r\n event.preventDefault();\r\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\r\n this.decrement();\r\n event.preventDefault();\r\n }\r\n }\r\n /**\r\n * geeting arc coordinated for range selection mode\r\n * @returns \r\n */\r\n getRangeArcPath(): string {\r\n const startAngle = this.startAngle + (this.config.rangeStartValue / (this.config.max - this.config.min)) * (this.endAngle - this.startAngle);\r\n const endAngle = this.startAngle + (this.config.rangeEndValue / (this.config.max - this.config.min)) * (this.endAngle - this.startAngle);\r\n return this.describeArc(this.centerX, this.centerY, this.radius, startAngle, endAngle);\r\n }\r\n\r\n /**\r\n * handling mousedown when range mode is enabled \r\n * @param event \r\n * @param handleType \r\n * @returns \r\n */\r\n onHandleMouseDown(event: MouseEvent, handleType: 'start' | 'end') {\r\n if (this.config.disabled || this.config.readOnly) return;\r\n this.activeHandle = handleType;\r\n this.startDrag();\r\n }\r\n\r\n /**\r\n * getting x & y to update handle position when dragging\r\n * @param value \r\n * @returns \r\n */\r\n getHandlePosition(value: number): { x: number, y: number } {\r\n const scaled = (value - this.config.min) / (this.config.max - this.config.min);\r\n const angle = this.startAngle + scaled * this.arcLength;\r\n const pos = this.polarToCartesian(this.centerX, this.centerY, this.radius, angle);\r\n return pos;\r\n }\r\n\r\n /**\r\n * geeting handle position for horizontal line\r\n * @param value \r\n * @returns \r\n */\r\n getHorizontalHandleX(value: number): number {\r\n const usableWidth = this.config.size - 2 * this.config.strokeWidth;\r\n const ratio = (value - this.config.min) / (this.config.max - this.config.min);\r\n return this.config.strokeWidth + usableWidth * ratio;\r\n }\r\n\r\n /**\r\n * geeting start position for horizontal line\r\n * @param value \r\n * @returns \r\n */\r\n getHorizontalLineStartX(): number {\r\n return this.getHorizontalHandleX(this.config.isRangeMode ? this.config.rangeStartValue : this.config.min);\r\n }\r\n\r\n /**\r\n * geeting end position for horizontal line\r\n * @param value \r\n * @returns \r\n */\r\n getHorizontalLineEndX(): number {\r\n return this.getHorizontalHandleX(this.config.isRangeMode ? this.config.rangeEndValue : this.value);\r\n }\r\n\r\n /**\r\n * geeting handle position for vertical line\r\n * @param value \r\n * @returns \r\n */\r\n getVerticalHandleY(value: number): number {\r\n const usableHeight = this.config.size - 2 * this.config.strokeWidth;\r\n const ratio = 1 - (value - this.config.min) / (this.config.max - this.config.min);\r\n return this.config.strokeWidth + usableHeight * ratio;\r\n }\r\n\r\n /**\r\n * geeting start position for vertical line\r\n * @param value \r\n * @returns \r\n */\r\n getVerticalLineStartY(): number {\r\n return this.getVerticalHandleY(this.config.isRangeMode ? this.config.rangeEndValue : this.value);\r\n }\r\n\r\n /**\r\n * get output to be emitted based on range mode\r\n * @returns \r\n */\r\n getEventOutput() {\r\n if (this.config.isRangeMode) {\r\n return { start: this.config.rangeStartValue, end: this.config.rangeEndValue };\r\n }\r\n return this.value;\r\n }\r\n\r\n /**\r\n * get correct page label from object\r\n * @param labelName \r\n * @returns string\r\n */\r\n getLabel(labelName: string): string {\r\n return (DEFAULT_LABELS as any)[labelName] || '';\r\n }\r\n\r\n\r\n // component end\r\n}\r\n","<div class=\"main\">\r\n<div class=\"knob-container {{customTheme}}\" [style.width.px]=\"config.size\">\r\n <svg [ngClass]=\"{ 'hover-animate': config.animateOnHover }\" [attr.viewBox]=\"getSvgViewBoxSize()\"\r\n (click)=\"onSvgClick($event)\" [style.cursor]=\"(config.readOnly || config.disabled) ? 'not-allowed' : 'pointer'\"\r\n [class.disabled]=\"config.disabled\" [class.read-only]=\"config.readOnly\"\r\n (mouseenter)=\"showTooltip = true; hovering=true; rucEvent.emit({eventName: 'hover'})\"\r\n (mouseleave)=\"showTooltip = false; hovering=false\" (focus)=\"rucEvent.emit({eventName: 'focus'})\"\r\n (blur)=\"rucEvent.emit({eventName: 'blur'})\" (keydown)=\"onKeyDown($event)\" [attr.role]=\"'slider'\"\r\n [attr.aria-valuemin]=\"config.min\" [attr.aria-valuemax]=\"config.max\" [attr.aria-valuenow]=\"value\"\r\n [attr.aria-disabled]=\"config.disabled\" [ngSwitch]=\"config.knobType\">\r\n\r\n <!-- arc knob -->\r\n <ng-container *ngSwitchCase=\"'arc'\">\r\n\r\n <!-- glow effect -->\r\n <defs>\r\n <filter id=\"glow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\r\n <feDropShadow dx=\"0\" dy=\"0\" stdDeviation=\"4\" [attr.flood-color]=\"config.strokeBackground\"\r\n flood-opacity=\"0.75\" />\r\n </filter>\r\n </defs>\r\n\r\n <!-- arc main stroke -->\r\n <path #bgArc fill=\"none\" class=\"main-path\" [attr.stroke]=\"config.strokeBackground\"\r\n [attr.stroke-width]=\"config.strokeWidth\" [attr.stroke-linecap]=\"config.roundedCorner ? 'round' : ''\" />\r\n\r\n <!-- arc progress stroke - single handle -->\r\n <path *ngIf=\"!config.isRangeMode\" #progressArc fill=\"none\" class=\"progress-path\" [attr.stroke]=\"progressColor\"\r\n [attr.stroke-width]=\"config.strokeWidth\" [attr.stroke-linecap]=\"config.roundedCorner ? 'round' : ''\" />\r\n\r\n <!-- arc - single handle -->\r\n <circle *ngIf=\"!config.isRangeMode\" #handle class=\"handle\" [attr.r]=\"getRadius()\"\r\n [attr.fill]=\"config.showHandle ? config.handleBackground : 'transparent'\"\r\n [attr.stroke-width]=\"config.showHandle ? config.handleBorderWidth : 0\"\r\n [attr.stroke]=\"config.showHandle ? config.handleBorderColor : 'transparent'\" (mousedown)=\"startDrag()\"\r\n (touchstart)=\"startDrag()\" />\r\n\r\n <!-- arc progress stroke - dual handle for range -->\r\n <path *ngIf=\"config.isRangeMode\" [attr.d]=\"getRangeArcPath()\" [attr.stroke]=\"progressColor\"\r\n [attr.stroke-width]=\"config.strokeWidth\" fill=\"none\" stroke-linecap=\"round\" />\r\n\r\n <!-- arc dual handle - start -->\r\n <circle *ngIf=\"config.isRangeMode\" [attr.cx]=\"getHandlePosition(config.rangeStartValue).x\"\r\n [attr.cy]=\"getHandlePosition(config.rangeStartValue).y\" [attr.r]=\"getRadius()\"\r\n [attr.fill]=\"config.handleBackground\" [attr.stroke-width]=\"config.handleBorderWidth\"\r\n [attr.stroke]=\"config.handleBorderColor\" (mousedown)=\"onHandleMouseDown($event, 'start')\" />\r\n\r\n <!-- arc dual handle - end -->\r\n <circle *ngIf=\"config.isRangeMode\" [attr.cx]=\"getHandlePosition(config.rangeEndValue).x\"\r\n [attr.cy]=\"getHandlePosition(config.rangeEndValue).y\" [attr.r]=\"getRadius()\"\r\n [attr.fill]=\"config.handleBackground\" [attr.stroke-width]=\"config.handleBorderWidth\"\r\n [attr.stroke]=\"config.handleBorderColor\" (mousedown)=\"onHandleMouseDown($event, 'end')\" />\r\n </ng-container>\r\n\r\n <!-- horizontal line -->\r\n <ng-container *ngSwitchCase=\"'horizontal'\">\r\n <line #horizontalLine [attr.x1]=\"config.strokeWidth\" [attr.x2]=\"config.size\" [attr.y1]=\"config.strokeWidth + 10\"\r\n [attr.y2]=\"config.strokeWidth + 10\" [attr.stroke]=\"config.strokeBackground\"\r\n [attr.stroke-width]=\"config.strokeWidth\" [attr.line-cap]=\"config.roundedCorner ? 'round' : ''\" />\r\n\r\n <!-- progress for horizontal line -->\r\n <line [attr.x1]=\"getHorizontalLineStartX()\" [attr.x2]=\"getHorizontalLineEndX()\"\r\n [attr.y1]=\"config.strokeWidth + 10\" [attr.y2]=\"config.strokeWidth + 10\" [attr.stroke]=\"progressColor\"\r\n [attr.stroke-width]=\"config.strokeWidth\" />\r\n\r\n <!-- handle for horizontal line -->\r\n <rect *ngIf=\"!config.isRangeMode\" [attr.x]=\"getHorizontalHandleX(value)\"\r\n [attr.y]=\"config.strokeWidth + 10 - getRadius()-1\" [attr.width]=\"config.strokeWidth\"\r\n [attr.height]=\"config.strokeWidth\"\r\n [attr.fill]=\"config.handleBackground ? config.handleBackground : progressColor\" (mousedown)=\"startDrag()\"\r\n (touchstart)=\"startDrag()\" />\r\n </ng-container>\r\n\r\n <!-- vertical line -->\r\n <ng-container *ngSwitchCase=\"'vertical'\">\r\n <line #verticalLine [attr.y1]=\"config.strokeWidth/4\" [attr.y2]=\"config.size/4\" [attr.x1]=\"config.strokeWidth + 10\"\r\n [attr.x2]=\"config.strokeWidth + 10\" [attr.stroke]=\"config.strokeBackground\"\r\n [attr.stroke-width]=\"config.strokeWidth/4\" [attr.line-cap]=\"config.roundedCorner ? 'round' : ''\" />\r\n\r\n <!-- progress for vertical line -->\r\n <line [attr.y1]=\"getVerticalLineStartY()/4\" [attr.y2]=\"config.size/4\" [attr.x1]=\"config.strokeWidth + 10\"\r\n [attr.x2]=\"config.strokeWidth + 10\" [attr.stroke]=\"progressColor\" [attr.stroke-width]=\"config.strokeWidth/4\" />\r\n\r\n <!-- Handle for vertical line -->\r\n <rect *ngIf=\"!config.isRangeMode\" [attr.y]=\"getVerticalHandleY(value)/4\" [attr.x]=\"config.strokeWidth + 7.5\"\r\n [attr.width]=\"config.strokeWidth/4\" [attr.height]=\"config.strokeWidth/4\"\r\n [attr.fill]=\"config.handleBackground ? config.handleBackground : progressColor\" (mousedown)=\"startDrag()\"\r\n (touchstart)=\"startDrag()\" />\r\n </ng-container>\r\n </svg>\r\n\r\n <!-- tooltip -->\r\n <div class=\"tooltip\" *ngIf=\"config.enableTooltip && !config.isRangeMode\" [class.show]=\"showTooltip\"\r\n [style.left.px]=\"tooltipX\" [style.top.px]=\"tooltipY\">\r\n {{ value}}\r\n </div>\r\n\r\n <!-- progress value -->\r\n <div class=\"progress-value {{config.knobType}}\" [style.maxWidth.px]=\"config.size * 2 - 50\"\r\n [style.color]=\"config.valueColor\" [style.fontSize.px]=\"config.valueSize\" [style.fontWeight]=\"config.valueWeight\"\r\n [style.cursor]=\"(config.readOnly || config.disabled) ? 'not-allowed' : ''\" [class.disabled]=\"config.disabled\"\r\n [class.read-only]=\"config.readOnly\" title=\"{{config.valuePrefix +''+value+''+config.valueSuffix}}\">\r\n <ng-container *ngIf=\"!config.isRangeMode\">\r\n <span class=\"value-prefix\">{{config.valuePrefix}}</span>\r\n <span class=\"value\">{{ value }}</span>\r\n <span class=\"value-suffix\">{{config.valueSuffix}}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"config.isRangeMode\">\r\n <span class=\"value\">{{config.rangeStartValue}} : {{config.rangeEndValue}}</span>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- increment-decrement button -->\r\n <div class=\"arc-buttons\" *ngIf=\"!config.isRangeMode && config.showButtons\">\r\n <button mat-mini-fab color=\"secondary\" (click)=\"decrement()\" [disabled]=\"config.disabled || config.readOnly\" (keydown)=\"onKeyDown($event)\"\r\n [attr.aria-label]=\"getLabel('decrementButton')\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n \r\n <button mat-mini-fab color=\"secondary\" (click)=\"increment()\" [disabled]=\"config.disabled || config.readOnly\" (keydown)=\"onKeyDown($event)\"\r\n [attr.aria-label]=\"getLabel('incrementButton')\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n \r\n </div>\r\n</div>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RuclibKnobComponent } from './ruclib-knob/ruclib-knob.component';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport {MatIconModule} from '@angular/material/icon';\r\n\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatButtonModule,\r\n MatIconModule\r\n ],\r\n declarations: [\r\n RuclibKnobComponent\r\n ],\r\n exports: [RuclibKnobComponent],\r\n})\r\nexport class RuclibKnobModule { }\r\n","// interface for reusable knob component\r\nexport interface KnobConfig {\r\n\r\n /**\r\n * Defines the minimum value of the knob.\r\n * @type {number}\r\n * @default 0\r\n */\r\n min?: number;\r\n\r\n /**\r\n * Defines the maximum value of the knob.\r\n * @type {number}\r\n * @default 100\r\n */\r\n max?: number;\r\n\r\n /**\r\n * Defines the step size for incrementing/decrementing the knob value.\r\n * @type {number}\r\n * @default 1\r\n */\r\n step?: number;\r\n\r\n /**\r\n * Defines the size (width and height) of the knob in pixels.\r\n * @type {number}\r\n * @default 150\r\n */\r\n size?: number;\r\n\r\n /**\r\n * Defines the color of the displayed value.\r\n * @type {string}\r\n * @default ''\r\n */\r\n valueColor?: string;\r\n\r\n /**\r\n * Defines the font weight of the displayed value.\r\n * @type {string}\r\n * @default 'normal'\r\n */\r\n valueWeight?: string;\r\n\r\n /**\r\n * Defines the font size of the displayed value in pixels.\r\n * @type {number}\r\n * @default 20\r\n */\r\n valueSize?: number;\r\n\r\n /**\r\n * Defines the background color of the knob's stroke.\r\n * @type {string}\r\n * @default 'lightblue'\r\n */\r\n strokeBackground?: string;\r\n\r\n /**\r\n * Defines the background color of the progress stroke. Can be a single color or an array of colors for gradient.\r\n * @type {string | string[]}\r\n * @default 'blue'\r\n */\r\n progressBackground?: string | string[];\r\n\r\n /**\r\n * Defines the width of the knob's stroke in pixels.\r\n * @type {number}\r\n * @default 15\r\n */\r\n strokeWidth?: number;\r\n\r\n /**\r\n * Specifies whether the corners of the progress stroke should be rounded.\r\n * @type {boolean}\r\n * @default true\r\n */\r\n roundedCorner?: boolean;\r\n\r\n /**\r\n * Specifies whether a handle should be displayed on the knob.\r\n * @type {boolean}\r\n * @default true\r\n */\r\n showHandle?: boolean;\r\n\r\n /* Defines the background color of the handle.\r\n * @type {string}\r\n * @default 'lightblue'\r\n */\r\n handleBackground?: string;\r\n\r\n /**\r\n * Defines the border color of the handle.\r\n * @type {string}\r\n * @default 'blue'\r\n */\r\n handleBorderColor?: string;\r\n\r\n /**\r\n * Defines the border width of the handle.\r\n * @type {number}\r\n * @default 4\r\n */\r\n handleBorderWidth?: number;\r\n\r\n\r\n /**\r\n * Defines the prefix for the displayed value (e.g., '$').\r\n * @type {string}\r\n * @default ''\r\n */\r\n valuePrefix?: string;\r\n\r\n /**\r\n * Defines the suffix for the displayed value (e.g., '%').\r\n * @type {string}\r\n * @default ''\r\n */\r\n valueSuffix?: string;\r\n\r\n /**\r\n * Specifies whether the knob is read-only.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n readOnly?: boolean;\r\n\r\n\r\n /**\r\n * Specifies whether the knob is disabled.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n\r\n /**\r\n * Specifies whether a tooltip should be enabled for the knob.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n enableTooltip?: boolean;\r\n\r\n /**\r\n * Specifies whether the knob animates on hover.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n animateOnHover?: boolean;\r\n\r\n /**\r\n * Specifies whether the knob operates in range mode, allowing selection of a value range.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n isRangeMode?: boolean;\r\n\r\n /**\r\n * Defines the starting value for the range when `isRangeMode` is true.\r\n * @type {number}\r\n * @default 25\r\n */\r\n rangeStartValue?: number;\r\n\r\n /**\r\n * Defines the ending value for the range when `isRangeMode` is true.\r\n * @type {number}\r\n * @default 75\r\n */\r\n rangeEndValue?: number;\r\n\r\n /**\r\n * Specifies whether increment/decrement buttons should be shown.\r\n * @type {boolean}\r\n * @default false\r\n */\r\n showButtons?: boolean;\r\n\r\n /**\r\n * Defines the type of knob.\r\n * @type {'arc' | 'horizontal' | 'vertical'}\r\n * @default 'arc'\r\n */\r\n knobType?: 'arc' | 'horizontal' | 'vertical';\r\n};\r\n\r\nexport interface KnobRangeValue { start: number, end: number }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,436 +1,3 @@
1
- import * as i0 from '@angular/core';
2
- import { OnInit, AfterViewInit, OnChanges, ElementRef, EventEmitter, ChangeDetectorRef, SimpleChanges } from '@angular/core';
3
- import { ControlValueAccessor } from '@angular/forms';
4
-
5
- interface KnobConfig {
6
- /**
7
- * Defines the minimum value of the knob.
8
- * @type {number}
9
- * @default 0
10
- */
11
- min?: number;
12
- /**
13
- * Defines the maximum value of the knob.
14
- * @type {number}
15
- * @default 100
16
- */
17
- max?: number;
18
- /**
19
- * Defines the step size for incrementing/decrementing the knob value.
20
- * @type {number}
21
- * @default 1
22
- */
23
- step?: number;
24
- /**
25
- * Defines the size (width and height) of the knob in pixels.
26
- * @type {number}
27
- * @default 150
28
- */
29
- size?: number;
30
- /**
31
- * Defines the color of the displayed value.
32
- * @type {string}
33
- * @default ''
34
- */
35
- valueColor?: string;
36
- /**
37
- * Defines the font weight of the displayed value.
38
- * @type {string}
39
- * @default 'normal'
40
- */
41
- valueWeight?: string;
42
- /**
43
- * Defines the font size of the displayed value in pixels.
44
- * @type {number}
45
- * @default 20
46
- */
47
- valueSize?: number;
48
- /**
49
- * Defines the background color of the knob's stroke.
50
- * @type {string}
51
- * @default 'lightblue'
52
- */
53
- strokeBackground?: string;
54
- /**
55
- * Defines the background color of the progress stroke. Can be a single color or an array of colors for gradient.
56
- * @type {string | string[]}
57
- * @default 'blue'
58
- */
59
- progressBackground?: string | string[];
60
- /**
61
- * Defines the width of the knob's stroke in pixels.
62
- * @type {number}
63
- * @default 15
64
- */
65
- strokeWidth?: number;
66
- /**
67
- * Specifies whether the corners of the progress stroke should be rounded.
68
- * @type {boolean}
69
- * @default true
70
- */
71
- roundedCorner?: boolean;
72
- /**
73
- * Specifies whether a handle should be displayed on the knob.
74
- * @type {boolean}
75
- * @default true
76
- */
77
- showHandle?: boolean;
78
- handleBackground?: string;
79
- /**
80
- * Defines the border color of the handle.
81
- * @type {string}
82
- * @default 'blue'
83
- */
84
- handleBorderColor?: string;
85
- /**
86
- * Defines the border width of the handle.
87
- * @type {number}
88
- * @default 4
89
- */
90
- handleBorderWidth?: number;
91
- /**
92
- * Defines the prefix for the displayed value (e.g., '$').
93
- * @type {string}
94
- * @default ''
95
- */
96
- valuePrefix?: string;
97
- /**
98
- * Defines the suffix for the displayed value (e.g., '%').
99
- * @type {string}
100
- * @default ''
101
- */
102
- valueSuffix?: string;
103
- /**
104
- * Specifies whether the knob is read-only.
105
- * @type {boolean}
106
- * @default false
107
- */
108
- readOnly?: boolean;
109
- /**
110
- * Specifies whether the knob is disabled.
111
- * @type {boolean}
112
- * @default false
113
- */
114
- disabled?: boolean;
115
- /**
116
- * Specifies whether a tooltip should be enabled for the knob.
117
- * @type {boolean}
118
- * @default false
119
- */
120
- enableTooltip?: boolean;
121
- /**
122
- * Specifies whether the knob animates on hover.
123
- * @type {boolean}
124
- * @default false
125
- */
126
- animateOnHover?: boolean;
127
- /**
128
- * Specifies whether the knob operates in range mode, allowing selection of a value range.
129
- * @type {boolean}
130
- * @default false
131
- */
132
- isRangeMode?: boolean;
133
- /**
134
- * Defines the starting value for the range when `isRangeMode` is true.
135
- * @type {number}
136
- * @default 25
137
- */
138
- rangeStartValue?: number;
139
- /**
140
- * Defines the ending value for the range when `isRangeMode` is true.
141
- * @type {number}
142
- * @default 75
143
- */
144
- rangeEndValue?: number;
145
- /**
146
- * Specifies whether increment/decrement buttons should be shown.
147
- * @type {boolean}
148
- * @default false
149
- */
150
- showButtons?: boolean;
151
- /**
152
- * Defines the type of knob.
153
- * @type {'arc' | 'horizontal' | 'vertical'}
154
- * @default 'arc'
155
- */
156
- knobType?: 'arc' | 'horizontal' | 'vertical';
157
- }
158
- interface KnobRangeValue {
159
- start: number;
160
- end: number;
161
- }
162
-
163
- declare class RuclibKnobComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {
164
- private cdr;
165
- bgArcRef: ElementRef<SVGPathElement>;
166
- progressArcRef: ElementRef<SVGPathElement>;
167
- handleRef: ElementRef<SVGCircleElement>;
168
- horizontalLineRef: ElementRef<SVGLineElement>;
169
- verticalLineRef: ElementRef<SVGLineElement>;
170
- rucEvent: EventEmitter<any>;
171
- customTheme?: string;
172
- rucInputData: KnobConfig;
173
- activeHandle: 'start' | 'end' | '';
174
- value: number;
175
- dragging: boolean;
176
- centerX: number;
177
- centerY: number;
178
- radius: number;
179
- startAngle: number;
180
- endAngle: number;
181
- arcLength: number;
182
- changeColorAfter: number;
183
- tooltipX: number;
184
- tooltipY: number;
185
- showTooltip: boolean;
186
- hovering: boolean;
187
- config: {
188
- min: number;
189
- max: number;
190
- step: number;
191
- size: number;
192
- valueColor: string;
193
- strokeBackground: string;
194
- progressBackground: string | string[];
195
- strokeWidth: number;
196
- valueSize: number;
197
- valueWeight: string;
198
- showHandle: boolean;
199
- handleBackground: string;
200
- handleBorderColor: string;
201
- handleBorderWidth: number;
202
- roundedCorner: boolean;
203
- valuePrefix: string;
204
- valueSuffix: string;
205
- readOnly: boolean;
206
- disabled: boolean;
207
- enableTooltip: boolean;
208
- animateOnHover: boolean;
209
- isRangeMode: boolean;
210
- rangeStartValue: number;
211
- rangeEndValue: number;
212
- showButtons: boolean;
213
- knobType: "horizontal" | "vertical" | "arc";
214
- };
215
- private onTouched;
216
- private onChange;
217
- constructor(cdr: ChangeDetectorRef);
218
- /**
219
- * handling form control binding to write value
220
- * @param val
221
- */
222
- writeValue(val: number): void;
223
- /**
224
- * registering onChange method to use as form control
225
- * @param fn
226
- */
227
- registerOnChange(fn: () => void): void;
228
- /**
229
- * registering onTouch method to use as form control
230
- * @param fn
231
- */
232
- registerOnTouched(fn: () => void): void;
233
- /**
234
- * registering disabled state
235
- * @param isDisabled
236
- */
237
- setDisabledState(isDisabled: boolean): void;
238
- /**
239
- * handling input data changes
240
- * updating default config with user provided config
241
- * @param changes
242
- */
243
- ngOnChanges(changes: SimpleChanges): void;
244
- /**
245
- * handling change on component initilization
246
- */
247
- ngOnInit(): void;
248
- /**
249
- * handling change after view initilization
250
- */
251
- ngAfterViewInit(): void;
252
- /**
253
- * handling change when dragin on svg
254
- * @returns
255
- */
256
- startDrag(): void;
257
- /**
258
- * rounding value to increment or decrement based on provide config value for step
259
- * @param value
260
- * @returns
261
- */
262
- roundToStep(value: number): number;
263
- /**
264
- * adjusting default value within min & max value when its provide out of range
265
- */
266
- adjustDefaultValue(): void;
267
- /**
268
- * handle changes on mouseUp and touchEnd event
269
- */
270
- stopDrag(): void;
271
- /**
272
- * handle changes on mouseMove and touch event
273
- * @param event
274
- * @returns
275
- */
276
- onMove(event: MouseEvent | TouchEvent): void;
277
- /**
278
- * handling change on main svg click
279
- * @param event
280
- * @returns
281
- */
282
- onSvgClick(event: MouseEvent | TouchEvent): void;
283
- /**
284
- * get ref of active svg element for different type of knobs
285
- * @returns
286
- */
287
- getTargetSvg(): SVGElement | null;
288
- /**
289
- * updating progrees value while dragging the handle on stroke bar
290
- * @param e
291
- * @returns
292
- */
293
- setProgressFromEvent(e: MouseEvent | TouchEvent): void;
294
- /**
295
- * updating svg progress based on value changes
296
- * @returns
297
- */
298
- updateArc(): void;
299
- /**
300
- * return maximum value out of min & max range
301
- * @param val
302
- * @param min
303
- * @param max
304
- * @returns
305
- */
306
- clamp(val: number, min: number, max: number): number;
307
- /**
308
- * getting calulated point from polar coordinates to cartesian coordinates
309
- * @param cx
310
- * @param cy
311
- * @param r
312
- * @param angleDeg
313
- * @returns
314
- */
315
- polarToCartesian(cx: number, cy: number, r: number, angleDeg: number): {
316
- x: number;
317
- y: number;
318
- };
319
- /**
320
- * getting radius for arc handle based on stroke width
321
- * @returns
322
- */
323
- getRadius(): number;
324
- /**
325
- * getting svg box size based on different knob shapes
326
- * @returns
327
- */
328
- getSvgViewBoxSize(): string;
329
- /**
330
- * geeting dynamic bg color for progress stroke based on provide config for "progressBackground"
331
- */
332
- get progressColor(): string;
333
- /**
334
- * getting coordinates for arc based on provided inputs
335
- * @param cx
336
- * @param cy
337
- * @param r
338
- * @param start
339
- * @param end
340
- * @returns
341
- */
342
- describeArc(cx: number, cy: number, r: number, start: number, end: number): string;
343
- /**
344
- * getting calculated angle for arc progress based on provided input
345
- * @param x
346
- * @param y
347
- * @returns
348
- */
349
- getAngleFromPoint(x: number, y: number): number | null;
350
- /**
351
- * increment value on click on button
352
- * @returns
353
- */
354
- increment(): void;
355
- /**
356
- * decrement value on click on button
357
- * @returns
358
- */
359
- decrement(): void;
360
- /**
361
- * change value using arrow keys for accessibility
362
- * @param event
363
- * @returns
364
- */
365
- onKeyDown(event: KeyboardEvent): void;
366
- /**
367
- * geeting arc coordinated for range selection mode
368
- * @returns
369
- */
370
- getRangeArcPath(): string;
371
- /**
372
- * handling mousedown when range mode is enabled
373
- * @param event
374
- * @param handleType
375
- * @returns
376
- */
377
- onHandleMouseDown(event: MouseEvent, handleType: 'start' | 'end'): void;
378
- /**
379
- * getting x & y to update handle position when dragging
380
- * @param value
381
- * @returns
382
- */
383
- getHandlePosition(value: number): {
384
- x: number;
385
- y: number;
386
- };
387
- /**
388
- * geeting handle position for horizontal line
389
- * @param value
390
- * @returns
391
- */
392
- getHorizontalHandleX(value: number): number;
393
- /**
394
- * geeting start position for horizontal line
395
- * @param value
396
- * @returns
397
- */
398
- getHorizontalLineStartX(): number;
399
- /**
400
- * geeting end position for horizontal line
401
- * @param value
402
- * @returns
403
- */
404
- getHorizontalLineEndX(): number;
405
- /**
406
- * geeting handle position for vertical line
407
- * @param value
408
- * @returns
409
- */
410
- getVerticalHandleY(value: number): number;
411
- /**
412
- * geeting start position for vertical line
413
- * @param value
414
- * @returns
415
- */
416
- getVerticalLineStartY(): number;
417
- /**
418
- * get output to be emitted based on range mode
419
- * @returns
420
- */
421
- getEventOutput(): number | {
422
- start: number;
423
- end: number;
424
- };
425
- /**
426
- * get correct page label from object
427
- * @param labelName
428
- * @returns string
429
- */
430
- getLabel(labelName: string): string;
431
- static ɵfac: i0.ɵɵFactoryDeclaration<RuclibKnobComponent, never>;
432
- static ɵcmp: i0.ɵɵComponentDeclaration<RuclibKnobComponent, "uxp-ruclib-knob", never, { "customTheme": { "alias": "customTheme"; "required": false; }; "rucInputData": { "alias": "rucInputData"; "required": false; }; }, { "rucEvent": "rucEvent"; }, never, never, true, never>;
433
- }
434
-
435
- export { RuclibKnobComponent };
436
- export type { KnobConfig, KnobRangeValue };
1
+ export * from './lib/ruclib-knob.module';
2
+ export * from './lib/ruclib-knob/ruclib-knob.component';
3
+ export * from './models/knob.interface';