@ruc-lib/knob 2.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"ruc-lib-knob.mjs","sources":["../../../../../libs/ruclib/knob/src/models/knob-config.model.ts","../../../../../libs/ruclib/knob/src/lib/ruclib-knob/ruclib-knob.component.ts","../../../../../libs/ruclib/knob/src/lib/ruclib-knob/ruclib-knob.component.html","../../../../../libs/ruclib/knob/src/lib/ruclib-knob.module.ts","../../../../../libs/ruclib/knob/src/models/knob.interface.ts","../../../../../libs/ruclib/knob/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=\"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>","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 min?: number;\r\n max?: number;\r\n step?: number;\r\n size?: number;\r\n valueColor?: string;\r\n valueWeight?: string;\r\n valueSize?: number;\r\n strokeBackground?: string;\r\n progressBackground?: string | string[];\r\n strokeWidth?: number;\r\n roundedCorner?: boolean;\r\n showHandle?: boolean;\r\n handleBackground?: string;\r\n handleBorderColor?: string;\r\n handleBorderWidth?: number;\r\n valuePrefix?: string;\r\n valueSuffix?: string;\r\n readOnly?: boolean;\r\n disabled?: boolean;\r\n enableTooltip?: boolean;\r\n animateOnHover?: boolean;\r\n isRangeMode?: boolean;\r\n rangeStartValue?: number;\r\n rangeEndValue?: number;\r\n showButtons?: boolean;\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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"}
@@ -1,275 +0,0 @@
1
- import { AfterViewInit, ChangeDetectorRef, ElementRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
- import { KnobConfig } from '../../models/knob.interface';
3
- import { ControlValueAccessor } from '@angular/forms';
4
- import * as i0 from "@angular/core";
5
- export declare class RuclibKnobComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {
6
- private cdr;
7
- bgArcRef: ElementRef<SVGPathElement>;
8
- progressArcRef: ElementRef<SVGPathElement>;
9
- handleRef: ElementRef<SVGCircleElement>;
10
- horizontalLineRef: ElementRef<SVGLineElement>;
11
- verticalLineRef: ElementRef<SVGLineElement>;
12
- rucEvent: EventEmitter<any>;
13
- customTheme?: string;
14
- rucInputData: KnobConfig;
15
- activeHandle: 'start' | 'end' | '';
16
- value: number;
17
- dragging: boolean;
18
- centerX: number;
19
- centerY: number;
20
- radius: number;
21
- startAngle: number;
22
- endAngle: number;
23
- arcLength: number;
24
- changeColorAfter: number;
25
- tooltipX: number;
26
- tooltipY: number;
27
- showTooltip: boolean;
28
- hovering: boolean;
29
- config: {
30
- min: number;
31
- max: number;
32
- step: number;
33
- size: number;
34
- valueColor: string;
35
- strokeBackground: string;
36
- progressBackground: string | string[];
37
- strokeWidth: number;
38
- valueSize: number;
39
- valueWeight: string;
40
- showHandle: boolean;
41
- handleBackground: string;
42
- handleBorderColor: string;
43
- handleBorderWidth: number;
44
- roundedCorner: boolean;
45
- valuePrefix: string;
46
- valueSuffix: string;
47
- readOnly: boolean;
48
- disabled: boolean;
49
- enableTooltip: boolean;
50
- animateOnHover: boolean;
51
- isRangeMode: boolean;
52
- rangeStartValue: number;
53
- rangeEndValue: number;
54
- showButtons: boolean;
55
- knobType: "arc" | "horizontal" | "vertical";
56
- };
57
- private onTouched;
58
- private onChange;
59
- constructor(cdr: ChangeDetectorRef);
60
- /**
61
- * handling form control binding to write value
62
- * @param val
63
- */
64
- writeValue(val: number): void;
65
- /**
66
- * registering onChange method to use as form control
67
- * @param fn
68
- */
69
- registerOnChange(fn: () => void): void;
70
- /**
71
- * registering onTouch method to use as form control
72
- * @param fn
73
- */
74
- registerOnTouched(fn: () => void): void;
75
- /**
76
- * registering disabled state
77
- * @param isDisabled
78
- */
79
- setDisabledState(isDisabled: boolean): void;
80
- /**
81
- * handling input data changes
82
- * updating default config with user provided config
83
- * @param changes
84
- */
85
- ngOnChanges(changes: SimpleChanges): void;
86
- /**
87
- * handling change on component initilization
88
- */
89
- ngOnInit(): void;
90
- /**
91
- * handling change after view initilization
92
- */
93
- ngAfterViewInit(): void;
94
- /**
95
- * handling change when dragin on svg
96
- * @returns
97
- */
98
- startDrag(): void;
99
- /**
100
- * rounding value to increment or decrement based on provide config value for step
101
- * @param value
102
- * @returns
103
- */
104
- roundToStep(value: number): number;
105
- /**
106
- * adjusting default value within min & max value when its provide out of range
107
- */
108
- adjustDefaultValue(): void;
109
- /**
110
- * handle changes on mouseUp and touchEnd event
111
- */
112
- stopDrag(): void;
113
- /**
114
- * handle changes on mouseMove and touch event
115
- * @param event
116
- * @returns
117
- */
118
- onMove(event: MouseEvent | TouchEvent): void;
119
- /**
120
- * handling change on main svg click
121
- * @param event
122
- * @returns
123
- */
124
- onSvgClick(event: MouseEvent | TouchEvent): void;
125
- /**
126
- * get ref of active svg element for different type of knobs
127
- * @returns
128
- */
129
- getTargetSvg(): SVGElement | null;
130
- /**
131
- * updating progrees value while dragging the handle on stroke bar
132
- * @param e
133
- * @returns
134
- */
135
- setProgressFromEvent(e: MouseEvent | TouchEvent): void;
136
- /**
137
- * updating svg progress based on value changes
138
- * @returns
139
- */
140
- updateArc(): void;
141
- /**
142
- * return maximum value out of min & max range
143
- * @param val
144
- * @param min
145
- * @param max
146
- * @returns
147
- */
148
- clamp(val: number, min: number, max: number): number;
149
- /**
150
- * getting calulated point from polar coordinates to cartesian coordinates
151
- * @param cx
152
- * @param cy
153
- * @param r
154
- * @param angleDeg
155
- * @returns
156
- */
157
- polarToCartesian(cx: number, cy: number, r: number, angleDeg: number): {
158
- x: number;
159
- y: number;
160
- };
161
- /**
162
- * getting radius for arc handle based on stroke width
163
- * @returns
164
- */
165
- getRadius(): number;
166
- /**
167
- * getting svg box size based on different knob shapes
168
- * @returns
169
- */
170
- getSvgViewBoxSize(): string;
171
- /**
172
- * geeting dynamic bg color for progress stroke based on provide config for "progressBackground"
173
- */
174
- get progressColor(): string;
175
- /**
176
- * getting coordinates for arc based on provided inputs
177
- * @param cx
178
- * @param cy
179
- * @param r
180
- * @param start
181
- * @param end
182
- * @returns
183
- */
184
- describeArc(cx: number, cy: number, r: number, start: number, end: number): string;
185
- /**
186
- * getting calculated angle for arc progress based on provided input
187
- * @param x
188
- * @param y
189
- * @returns
190
- */
191
- getAngleFromPoint(x: number, y: number): number | null;
192
- /**
193
- * increment value on click on button
194
- * @returns
195
- */
196
- increment(): void;
197
- /**
198
- * decrement value on click on button
199
- * @returns
200
- */
201
- decrement(): void;
202
- /**
203
- * change value using arrow keys for accessibility
204
- * @param event
205
- * @returns
206
- */
207
- onKeyDown(event: KeyboardEvent): void;
208
- /**
209
- * geeting arc coordinated for range selection mode
210
- * @returns
211
- */
212
- getRangeArcPath(): string;
213
- /**
214
- * handling mousedown when range mode is enabled
215
- * @param event
216
- * @param handleType
217
- * @returns
218
- */
219
- onHandleMouseDown(event: MouseEvent, handleType: 'start' | 'end'): void;
220
- /**
221
- * getting x & y to update handle position when dragging
222
- * @param value
223
- * @returns
224
- */
225
- getHandlePosition(value: number): {
226
- x: number;
227
- y: number;
228
- };
229
- /**
230
- * geeting handle position for horizontal line
231
- * @param value
232
- * @returns
233
- */
234
- getHorizontalHandleX(value: number): number;
235
- /**
236
- * geeting start position for horizontal line
237
- * @param value
238
- * @returns
239
- */
240
- getHorizontalLineStartX(): number;
241
- /**
242
- * geeting end position for horizontal line
243
- * @param value
244
- * @returns
245
- */
246
- getHorizontalLineEndX(): number;
247
- /**
248
- * geeting handle position for vertical line
249
- * @param value
250
- * @returns
251
- */
252
- getVerticalHandleY(value: number): number;
253
- /**
254
- * geeting start position for vertical line
255
- * @param value
256
- * @returns
257
- */
258
- getVerticalLineStartY(): number;
259
- /**
260
- * get output to be emitted based on range mode
261
- * @returns
262
- */
263
- getEventOutput(): number | {
264
- start: number;
265
- end: number;
266
- };
267
- /**
268
- * get correct page label from object
269
- * @param labelName
270
- * @returns string
271
- */
272
- getLabel(labelName: string): string;
273
- static ɵfac: i0.ɵɵFactoryDeclaration<RuclibKnobComponent, never>;
274
- static ɵcmp: i0.ɵɵComponentDeclaration<RuclibKnobComponent, "uxp-ruclib-knob", never, { "customTheme": "customTheme"; "rucInputData": "rucInputData"; }, { "rucEvent": "rucEvent"; }, never, never, false, never>;
275
- }
@@ -1,11 +0,0 @@
1
- import * as i0 from "@angular/core";
2
- import * as i1 from "./ruclib-knob/ruclib-knob.component";
3
- import * as i2 from "@angular/common";
4
- import * as i3 from "@angular/forms";
5
- import * as i4 from "@angular/material/button";
6
- import * as i5 from "@angular/material/icon";
7
- export declare class RuclibKnobModule {
8
- static ɵfac: i0.ɵɵFactoryDeclaration<RuclibKnobModule, never>;
9
- static ɵmod: i0.ɵɵNgModuleDeclaration<RuclibKnobModule, [typeof i1.RuclibKnobComponent], [typeof i2.CommonModule, typeof i3.FormsModule, typeof i3.ReactiveFormsModule, typeof i4.MatButtonModule, typeof i5.MatIconModule], [typeof i1.RuclibKnobComponent]>;
10
- static ɵinj: i0.ɵɵInjectorDeclaration<RuclibKnobModule>;
11
- }
@@ -1,32 +0,0 @@
1
- export declare const DefaultKnobConfig: {
2
- min: number;
3
- max: number;
4
- step: number;
5
- size: number;
6
- valueColor: string;
7
- strokeBackground: string;
8
- progressBackground: string | string[];
9
- strokeWidth: number;
10
- valueSize: number;
11
- valueWeight: string;
12
- showHandle: boolean;
13
- handleBackground: string;
14
- handleBorderColor: string;
15
- handleBorderWidth: number;
16
- roundedCorner: boolean;
17
- valuePrefix: string;
18
- valueSuffix: string;
19
- readOnly: boolean;
20
- disabled: boolean;
21
- enableTooltip: boolean;
22
- animateOnHover: boolean;
23
- isRangeMode: boolean;
24
- rangeStartValue: number;
25
- rangeEndValue: number;
26
- showButtons: boolean;
27
- knobType: "arc" | "horizontal" | "vertical";
28
- };
29
- export declare const DEFAULT_LABELS: {
30
- incrementButton: string;
31
- decrementButton: string;
32
- };
@@ -1,32 +0,0 @@
1
- export interface KnobConfig {
2
- min?: number;
3
- max?: number;
4
- step?: number;
5
- size?: number;
6
- valueColor?: string;
7
- valueWeight?: string;
8
- valueSize?: number;
9
- strokeBackground?: string;
10
- progressBackground?: string | string[];
11
- strokeWidth?: number;
12
- roundedCorner?: boolean;
13
- showHandle?: boolean;
14
- handleBackground?: string;
15
- handleBorderColor?: string;
16
- handleBorderWidth?: number;
17
- valuePrefix?: string;
18
- valueSuffix?: string;
19
- readOnly?: boolean;
20
- disabled?: boolean;
21
- enableTooltip?: boolean;
22
- animateOnHover?: boolean;
23
- isRangeMode?: boolean;
24
- rangeStartValue?: number;
25
- rangeEndValue?: number;
26
- showButtons?: boolean;
27
- knobType?: 'arc' | 'horizontal' | 'vertical';
28
- }
29
- export interface KnobRangeValue {
30
- start: number;
31
- end: number;
32
- }