nexheal-lib 0.0.27 → 0.0.29

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.
@@ -1495,6 +1495,367 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
1495
1495
  args: ['checkboxContainer']
1496
1496
  }] } });
1497
1497
 
1498
+ class ColorPicker {
1499
+ elementRef = inject(ElementRef);
1500
+ title;
1501
+ required = false;
1502
+ customClass = "";
1503
+ inline = false;
1504
+ format = "rgb";
1505
+ defaultColor = "#ff0000";
1506
+ disabled = false;
1507
+ readonly = false;
1508
+ /** Show the chosen value as text next to the swatch. */
1509
+ showValue = false;
1510
+ /** Where the value text sits relative to the swatch/panel. */
1511
+ valuePosition = "right";
1512
+ onChange = new EventEmitter();
1513
+ blurEvent = new EventEmitter();
1514
+ // current colour as HSB (the picker works in HSB space)
1515
+ h = 0;
1516
+ s = 100;
1517
+ b = 100;
1518
+ overlayVisible = false;
1519
+ value = null;
1520
+ dragMode = null;
1521
+ dragEl = null;
1522
+ moveListener = null;
1523
+ upListener = null;
1524
+ onChangeFn = () => { };
1525
+ onTouchedFn = () => { };
1526
+ ngOnDestroy() {
1527
+ this.unbindDragListeners();
1528
+ }
1529
+ // ---- ControlValueAccessor ----
1530
+ writeValue(value) {
1531
+ this.value = value ?? null;
1532
+ if (value == null || value === "") {
1533
+ this.setFromHex(this.defaultColor);
1534
+ return;
1535
+ }
1536
+ if (typeof value === "string") {
1537
+ this.setFromHex(value);
1538
+ }
1539
+ else if ("r" in value) {
1540
+ const hsb = this.rgbToHsb(value.r, value.g, value.b);
1541
+ this.h = hsb.h;
1542
+ this.s = hsb.s;
1543
+ this.b = hsb.b;
1544
+ }
1545
+ else if ("h" in value) {
1546
+ this.h = value.h;
1547
+ this.s = value.s;
1548
+ this.b = value.b;
1549
+ }
1550
+ }
1551
+ registerOnChange(fn) {
1552
+ this.onChangeFn = fn;
1553
+ }
1554
+ registerOnTouched(fn) {
1555
+ this.onTouchedFn = fn;
1556
+ }
1557
+ setDisabledState(isDisabled) {
1558
+ this.disabled = isDisabled;
1559
+ if (isDisabled) {
1560
+ this.close();
1561
+ }
1562
+ }
1563
+ // ---- Template bindings ----
1564
+ /** Background of the saturation/brightness box: the pure hue at full S/B. */
1565
+ get hueBackground() {
1566
+ const c = this.hsbToRgb(this.h, 100, 100);
1567
+ return `rgb(${c.r}, ${c.g}, ${c.b})`;
1568
+ }
1569
+ /** Hex of the currently selected colour (used for the preview swatch + hex field). */
1570
+ get previewColor() {
1571
+ const c = this.hsbToRgb(this.h, this.s, this.b);
1572
+ return this.rgbToHex(c.r, c.g, c.b);
1573
+ }
1574
+ /** The chosen value as a display string, formatted to match `format`. */
1575
+ get displayValue() {
1576
+ const c = this.hsbToRgb(this.h, this.s, this.b);
1577
+ if (this.format === "rgb")
1578
+ return `rgb(${c.r}, ${c.g}, ${c.b})`;
1579
+ if (this.format === "hsb")
1580
+ return `hsb(${this.h}, ${this.s}%, ${this.b}%)`;
1581
+ return this.rgbToHex(c.r, c.g, c.b);
1582
+ }
1583
+ get satHandleLeft() {
1584
+ return this.s;
1585
+ }
1586
+ get briHandleTop() {
1587
+ return 100 - this.b;
1588
+ }
1589
+ get hueHandleTop() {
1590
+ return (this.h / 360) * 100;
1591
+ }
1592
+ // ---- Open / close ----
1593
+ toggle() {
1594
+ if (this.disabled || this.readonly)
1595
+ return;
1596
+ this.overlayVisible ? this.close() : this.open();
1597
+ }
1598
+ open() {
1599
+ if (this.disabled || this.readonly)
1600
+ return;
1601
+ this.overlayVisible = true;
1602
+ }
1603
+ close() {
1604
+ if (!this.overlayVisible)
1605
+ return;
1606
+ this.overlayVisible = false;
1607
+ this.onTouchedFn();
1608
+ this.blurEvent.emit();
1609
+ }
1610
+ /**
1611
+ * Close the popup when a press starts outside the component. Uses
1612
+ * `mousedown`/`touchstart` (not `click`) so it stays reliable even when a
1613
+ * drag ends outside the panel or an outside element stops click propagation.
1614
+ */
1615
+ onDocumentPointerDown(event) {
1616
+ if (this.inline || !this.overlayVisible)
1617
+ return;
1618
+ const target = event.target;
1619
+ if (target && !this.elementRef.nativeElement.contains(target)) {
1620
+ this.close();
1621
+ }
1622
+ }
1623
+ // ---- Dragging on the saturation/brightness box and hue strip ----
1624
+ onSelectorDown(event) {
1625
+ if (this.disabled || this.readonly)
1626
+ return;
1627
+ event.preventDefault();
1628
+ this.dragMode = "selector";
1629
+ this.dragEl = event.currentTarget;
1630
+ this.handleDrag(event);
1631
+ this.bindDragListeners();
1632
+ }
1633
+ onHueDown(event) {
1634
+ if (this.disabled || this.readonly)
1635
+ return;
1636
+ event.preventDefault();
1637
+ this.dragMode = "hue";
1638
+ this.dragEl = event.currentTarget;
1639
+ this.handleDrag(event);
1640
+ this.bindDragListeners();
1641
+ }
1642
+ bindDragListeners() {
1643
+ this.unbindDragListeners();
1644
+ this.moveListener = (e) => this.handleDrag(e);
1645
+ this.upListener = () => {
1646
+ this.unbindDragListeners();
1647
+ this.onTouchedFn();
1648
+ };
1649
+ document.addEventListener("mousemove", this.moveListener);
1650
+ document.addEventListener("mouseup", this.upListener);
1651
+ document.addEventListener("touchmove", this.moveListener, { passive: false });
1652
+ document.addEventListener("touchend", this.upListener);
1653
+ }
1654
+ unbindDragListeners() {
1655
+ if (this.moveListener) {
1656
+ document.removeEventListener("mousemove", this.moveListener);
1657
+ document.removeEventListener("touchmove", this.moveListener);
1658
+ }
1659
+ if (this.upListener) {
1660
+ document.removeEventListener("mouseup", this.upListener);
1661
+ document.removeEventListener("touchend", this.upListener);
1662
+ }
1663
+ this.moveListener = null;
1664
+ this.upListener = null;
1665
+ this.dragMode = null;
1666
+ this.dragEl = null;
1667
+ }
1668
+ handleDrag(event) {
1669
+ if (!this.dragEl)
1670
+ return;
1671
+ if (this.isTouch(event) && event.cancelable)
1672
+ event.preventDefault();
1673
+ const point = this.getPoint(event);
1674
+ const rect = this.dragEl.getBoundingClientRect();
1675
+ if (!rect.width || !rect.height)
1676
+ return;
1677
+ if (this.dragMode === "selector") {
1678
+ const x = this.clamp(point.x - rect.left, 0, rect.width);
1679
+ const y = this.clamp(point.y - rect.top, 0, rect.height);
1680
+ this.s = Math.round((x / rect.width) * 100);
1681
+ this.b = Math.round(100 - (y / rect.height) * 100);
1682
+ }
1683
+ else if (this.dragMode === "hue") {
1684
+ const y = this.clamp(point.y - rect.top, 0, rect.height);
1685
+ this.h = Math.min(359, Math.round((y / rect.height) * 360));
1686
+ }
1687
+ this.emitChange();
1688
+ }
1689
+ // ---- helpers ----
1690
+ emitChange() {
1691
+ const out = this.getValueToEmit();
1692
+ this.value = out;
1693
+ this.onChangeFn(out);
1694
+ this.onChange.emit(out);
1695
+ }
1696
+ getValueToEmit() {
1697
+ if (this.format === "hsb") {
1698
+ return { h: this.h, s: this.s, b: this.b };
1699
+ }
1700
+ const rgb = this.hsbToRgb(this.h, this.s, this.b);
1701
+ if (this.format === "rgb") {
1702
+ return rgb;
1703
+ }
1704
+ return this.rgbToHex(rgb.r, rgb.g, rgb.b);
1705
+ }
1706
+ setFromHex(hex) {
1707
+ const rgb = this.hexToRgb(hex);
1708
+ if (!rgb)
1709
+ return;
1710
+ const hsb = this.rgbToHsb(rgb.r, rgb.g, rgb.b);
1711
+ this.h = hsb.h;
1712
+ this.s = hsb.s;
1713
+ this.b = hsb.b;
1714
+ }
1715
+ isTouch(event) {
1716
+ return typeof TouchEvent !== "undefined" && event instanceof TouchEvent;
1717
+ }
1718
+ getPoint(event) {
1719
+ if (this.isTouch(event)) {
1720
+ const touch = event.touches[0] ?? event.changedTouches[0];
1721
+ return { x: touch.clientX, y: touch.clientY };
1722
+ }
1723
+ return { x: event.clientX, y: event.clientY };
1724
+ }
1725
+ clamp(value, min, max) {
1726
+ return Math.max(min, Math.min(max, value));
1727
+ }
1728
+ // ---- colour space conversions ----
1729
+ hsbToRgb(h, s, br) {
1730
+ const sat = s / 100;
1731
+ const val = br / 100;
1732
+ const c = val * sat;
1733
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
1734
+ const m = val - c;
1735
+ let r = 0, g = 0, b = 0;
1736
+ if (h < 60) {
1737
+ r = c;
1738
+ g = x;
1739
+ b = 0;
1740
+ }
1741
+ else if (h < 120) {
1742
+ r = x;
1743
+ g = c;
1744
+ b = 0;
1745
+ }
1746
+ else if (h < 180) {
1747
+ r = 0;
1748
+ g = c;
1749
+ b = x;
1750
+ }
1751
+ else if (h < 240) {
1752
+ r = 0;
1753
+ g = x;
1754
+ b = c;
1755
+ }
1756
+ else if (h < 300) {
1757
+ r = x;
1758
+ g = 0;
1759
+ b = c;
1760
+ }
1761
+ else {
1762
+ r = c;
1763
+ g = 0;
1764
+ b = x;
1765
+ }
1766
+ return {
1767
+ r: Math.round((r + m) * 255),
1768
+ g: Math.round((g + m) * 255),
1769
+ b: Math.round((b + m) * 255),
1770
+ };
1771
+ }
1772
+ rgbToHsb(r, g, b) {
1773
+ const rr = r / 255, gg = g / 255, bb = b / 255;
1774
+ const max = Math.max(rr, gg, bb);
1775
+ const min = Math.min(rr, gg, bb);
1776
+ const d = max - min;
1777
+ let h = 0;
1778
+ if (d !== 0) {
1779
+ if (max === rr)
1780
+ h = ((gg - bb) / d) % 6;
1781
+ else if (max === gg)
1782
+ h = (bb - rr) / d + 2;
1783
+ else
1784
+ h = (rr - gg) / d + 4;
1785
+ h = Math.round(h * 60);
1786
+ if (h < 0)
1787
+ h += 360;
1788
+ }
1789
+ const s = max === 0 ? 0 : Math.round((d / max) * 100);
1790
+ const br = Math.round(max * 100);
1791
+ return { h, s, b: br };
1792
+ }
1793
+ hexToRgb(hex) {
1794
+ if (!hex)
1795
+ return null;
1796
+ let h = hex.trim().replace(/^#/, "");
1797
+ if (h.length === 3) {
1798
+ h = h.split("").map((c) => c + c).join("");
1799
+ }
1800
+ if (!/^[0-9a-fA-F]{6}$/.test(h))
1801
+ return null;
1802
+ const num = parseInt(h, 16);
1803
+ return { r: (num >> 16) & 255, g: (num >> 8) & 255, b: num & 255 };
1804
+ }
1805
+ rgbToHex(r, g, b) {
1806
+ const toHex = (n) => n.toString(16).padStart(2, "0");
1807
+ return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
1808
+ }
1809
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: ColorPicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
1810
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.3", type: ColorPicker, isStandalone: true, selector: "color-picker", inputs: { title: "title", required: "required", customClass: "customClass", inline: "inline", format: "format", defaultColor: "defaultColor", disabled: "disabled", readonly: "readonly", showValue: "showValue", valuePosition: "valuePosition" }, outputs: { onChange: "onChange", blurEvent: "blurEvent" }, host: { listeners: { "document:mousedown": "onDocumentPointerDown($event)", "document:touchstart": "onDocumentPointerDown($event)" } }, providers: [
1811
+ {
1812
+ provide: NG_VALUE_ACCESSOR,
1813
+ useExisting: forwardRef(() => ColorPicker),
1814
+ multi: true,
1815
+ },
1816
+ ], ngImport: i0, template: "<div class=\"form-group color-picker\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\">\n @if (title) {\n <label class=\"inp-label\" [ngClass]=\"{ 'required': required }\">{{ title }}</label>\n }\n\n <div class=\"cp-wrap\" [ngClass]=\"'cp-pos-' + valuePosition\">\n @if (!inline) {\n <button #trigger type=\"button\" class=\"cp-preview\" [style.backgroundColor]=\"previewColor\" [disabled]=\"disabled\"\n (click)=\"toggle()\" [attr.aria-label]=\"'Selected color ' + previewColor\"></button>\n }\n\n @if (inline || overlayVisible) {\n <div class=\"cp-panel\" [class.cp-inline]=\"inline\">\n <div class=\"cp-content\">\n <div #selector class=\"cp-selector\" [style.background]=\"hueBackground\" (mousedown)=\"onSelectorDown($event)\"\n (touchstart)=\"onSelectorDown($event)\">\n <div class=\"cp-selector-white\"></div>\n <div class=\"cp-selector-black\"></div>\n <div class=\"cp-selector-handle\" [style.left.%]=\"satHandleLeft\" [style.top.%]=\"briHandleTop\"></div>\n </div>\n <div #hue class=\"cp-hue\" (mousedown)=\"onHueDown($event)\" (touchstart)=\"onHueDown($event)\">\n <div class=\"cp-hue-handle\" [style.top.%]=\"hueHandleTop\"></div>\n </div>\n </div>\n </div>\n }\n\n @if (showValue) {\n <span class=\"cp-value\" (click)=\"toggle()\">{{ displayValue }}</span>\n }\n </div>\n</div>\n", styles: [".form-group.color-picker{position:relative}.form-group.color-picker .cp-wrap{gap:8px;display:inline-flex;align-items:center}.form-group.color-picker .cp-wrap.cp-pos-right{flex-direction:row}.form-group.color-picker .cp-wrap.cp-pos-left{flex-direction:row-reverse}.form-group.color-picker .cp-wrap.cp-pos-bottom{flex-direction:column;align-items:flex-start}.form-group.color-picker .cp-value{cursor:pointer;font-size:.95em;color:#495057;-webkit-user-select:none;user-select:none;text-transform:lowercase}.form-group.color-picker .cp-preview{width:2rem;height:2rem;padding:0;cursor:pointer;border-radius:4px;border:1px solid #d0d3da;transition:box-shadow .15s ease-in-out}.form-group.color-picker .cp-preview:focus-visible{outline:none;box-shadow:0 0 0 2px #3399ff80}.form-group.color-picker.disabled .cp-preview{cursor:not-allowed;opacity:.6}.form-group.color-picker.readonly .cp-preview{cursor:default;pointer-events:none}.form-group.color-picker .cp-panel{top:calc(100% + 4px);left:0;z-index:1000;position:absolute;padding:.5rem;border-radius:4px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.color-picker .cp-panel.cp-inline{position:static;box-shadow:none;padding:0;border:1px solid #e7e7e7}.form-group.color-picker .cp-content{gap:8px;display:flex;align-items:stretch}.form-group.color-picker .cp-selector{width:150px;height:150px;position:relative;cursor:crosshair;border-radius:3px;touch-action:none;overflow:hidden}.form-group.color-picker .cp-selector-white,.form-group.color-picker .cp-selector-black{inset:0;position:absolute;pointer-events:none}.form-group.color-picker .cp-selector-white{background:linear-gradient(to right,#fff,#fff0)}.form-group.color-picker .cp-selector-black{background:linear-gradient(to top,#000,#0000)}.form-group.color-picker .cp-selector-handle{width:12px;height:12px;position:absolute;border-radius:50%;pointer-events:none;border:2px solid #ffffff;transform:translate(-50%,-50%);box-shadow:0 0 1px 1px #0006}.form-group.color-picker .cp-hue{width:16px;height:150px;position:relative;cursor:pointer;border-radius:3px;touch-action:none;background:linear-gradient(to bottom,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.form-group.color-picker .cp-hue-handle{left:-2px;right:-2px;height:4px;position:absolute;pointer-events:none;border:1px solid #ffffff;transform:translateY(-50%);box-shadow:0 0 1px 1px #0006}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
1817
+ }
1818
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImport: i0, type: ColorPicker, decorators: [{
1819
+ type: Component,
1820
+ args: [{ selector: "color-picker", standalone: true, imports: [CommonModule], providers: [
1821
+ {
1822
+ provide: NG_VALUE_ACCESSOR,
1823
+ useExisting: forwardRef(() => ColorPicker),
1824
+ multi: true,
1825
+ },
1826
+ ], template: "<div class=\"form-group color-picker\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\">\n @if (title) {\n <label class=\"inp-label\" [ngClass]=\"{ 'required': required }\">{{ title }}</label>\n }\n\n <div class=\"cp-wrap\" [ngClass]=\"'cp-pos-' + valuePosition\">\n @if (!inline) {\n <button #trigger type=\"button\" class=\"cp-preview\" [style.backgroundColor]=\"previewColor\" [disabled]=\"disabled\"\n (click)=\"toggle()\" [attr.aria-label]=\"'Selected color ' + previewColor\"></button>\n }\n\n @if (inline || overlayVisible) {\n <div class=\"cp-panel\" [class.cp-inline]=\"inline\">\n <div class=\"cp-content\">\n <div #selector class=\"cp-selector\" [style.background]=\"hueBackground\" (mousedown)=\"onSelectorDown($event)\"\n (touchstart)=\"onSelectorDown($event)\">\n <div class=\"cp-selector-white\"></div>\n <div class=\"cp-selector-black\"></div>\n <div class=\"cp-selector-handle\" [style.left.%]=\"satHandleLeft\" [style.top.%]=\"briHandleTop\"></div>\n </div>\n <div #hue class=\"cp-hue\" (mousedown)=\"onHueDown($event)\" (touchstart)=\"onHueDown($event)\">\n <div class=\"cp-hue-handle\" [style.top.%]=\"hueHandleTop\"></div>\n </div>\n </div>\n </div>\n }\n\n @if (showValue) {\n <span class=\"cp-value\" (click)=\"toggle()\">{{ displayValue }}</span>\n }\n </div>\n</div>\n", styles: [".form-group.color-picker{position:relative}.form-group.color-picker .cp-wrap{gap:8px;display:inline-flex;align-items:center}.form-group.color-picker .cp-wrap.cp-pos-right{flex-direction:row}.form-group.color-picker .cp-wrap.cp-pos-left{flex-direction:row-reverse}.form-group.color-picker .cp-wrap.cp-pos-bottom{flex-direction:column;align-items:flex-start}.form-group.color-picker .cp-value{cursor:pointer;font-size:.95em;color:#495057;-webkit-user-select:none;user-select:none;text-transform:lowercase}.form-group.color-picker .cp-preview{width:2rem;height:2rem;padding:0;cursor:pointer;border-radius:4px;border:1px solid #d0d3da;transition:box-shadow .15s ease-in-out}.form-group.color-picker .cp-preview:focus-visible{outline:none;box-shadow:0 0 0 2px #3399ff80}.form-group.color-picker.disabled .cp-preview{cursor:not-allowed;opacity:.6}.form-group.color-picker.readonly .cp-preview{cursor:default;pointer-events:none}.form-group.color-picker .cp-panel{top:calc(100% + 4px);left:0;z-index:1000;position:absolute;padding:.5rem;border-radius:4px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.color-picker .cp-panel.cp-inline{position:static;box-shadow:none;padding:0;border:1px solid #e7e7e7}.form-group.color-picker .cp-content{gap:8px;display:flex;align-items:stretch}.form-group.color-picker .cp-selector{width:150px;height:150px;position:relative;cursor:crosshair;border-radius:3px;touch-action:none;overflow:hidden}.form-group.color-picker .cp-selector-white,.form-group.color-picker .cp-selector-black{inset:0;position:absolute;pointer-events:none}.form-group.color-picker .cp-selector-white{background:linear-gradient(to right,#fff,#fff0)}.form-group.color-picker .cp-selector-black{background:linear-gradient(to top,#000,#0000)}.form-group.color-picker .cp-selector-handle{width:12px;height:12px;position:absolute;border-radius:50%;pointer-events:none;border:2px solid #ffffff;transform:translate(-50%,-50%);box-shadow:0 0 1px 1px #0006}.form-group.color-picker .cp-hue{width:16px;height:150px;position:relative;cursor:pointer;border-radius:3px;touch-action:none;background:linear-gradient(to bottom,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.form-group.color-picker .cp-hue-handle{left:-2px;right:-2px;height:4px;position:absolute;pointer-events:none;border:1px solid #ffffff;transform:translateY(-50%);box-shadow:0 0 1px 1px #0006}\n"] }]
1827
+ }], propDecorators: { title: [{
1828
+ type: Input
1829
+ }], required: [{
1830
+ type: Input
1831
+ }], customClass: [{
1832
+ type: Input
1833
+ }], inline: [{
1834
+ type: Input
1835
+ }], format: [{
1836
+ type: Input
1837
+ }], defaultColor: [{
1838
+ type: Input
1839
+ }], disabled: [{
1840
+ type: Input
1841
+ }], readonly: [{
1842
+ type: Input
1843
+ }], showValue: [{
1844
+ type: Input
1845
+ }], valuePosition: [{
1846
+ type: Input
1847
+ }], onChange: [{
1848
+ type: Output
1849
+ }], blurEvent: [{
1850
+ type: Output
1851
+ }], onDocumentPointerDown: [{
1852
+ type: HostListener,
1853
+ args: ["document:mousedown", ["$event"]]
1854
+ }, {
1855
+ type: HostListener,
1856
+ args: ["document:touchstart", ["$event"]]
1857
+ }] } });
1858
+
1498
1859
  class InputControl {
1499
1860
  type = "text";
1500
1861
  title;
@@ -3038,5 +3399,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.3", ngImpor
3038
3399
  * Generated bundle index. Do not edit.
3039
3400
  */
3040
3401
 
3041
- export { AutocompleteControl, CalendarControl, CheckboxControl, InputControl, MultiselectControl, SelectControl, SwitchControl, TextEditor, TextareaControl };
3402
+ export { AutocompleteControl, CalendarControl, CheckboxControl, ColorPicker, InputControl, MultiselectControl, SelectControl, SwitchControl, TextEditor, TextareaControl };
3042
3403
  //# sourceMappingURL=nexheal-lib.mjs.map