ng-blatui 1.11.0 → 1.12.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,7 +1,7 @@
1
1
  import { clsx } from 'clsx';
2
2
  import { twMerge } from 'tailwind-merge';
3
3
  import * as i0 from '@angular/core';
4
- import { input, computed, Directive, Component, signal, model, inject, PLATFORM_ID, effect, Injectable, ElementRef, ViewContainerRef } from '@angular/core';
4
+ import { input, computed, Directive, Component, signal, model, inject, PLATFORM_ID, effect, Injectable, ElementRef, ViewContainerRef, viewChild } from '@angular/core';
5
5
  import { cva } from 'class-variance-authority';
6
6
  export { AccordionContent, AccordionGroup, AccordionPanel, AccordionTrigger, ɵɵDeferredContent, ɵɵDeferredContentAware } from '@angular/aria/accordion';
7
7
  export { Tab, TabContent, TabList, TabPanel, Tabs } from '@angular/aria/tabs';
@@ -3995,6 +3995,196 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
3995
3995
  }]
3996
3996
  }], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "code", required: false }] }], filename: [{ type: i0.Input, args: [{ isSignal: true, alias: "filename", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
3997
3997
 
3998
+ /**
3999
+ * A single-value slider (`role="slider"`) with pointer drag and full keyboard support
4000
+ * (arrows, Home/End, PageUp/PageDown). Horizontal or vertical. SSR-safe — geometry is
4001
+ * only read inside browser event handlers.
4002
+ */
4003
+ class BuiSlider {
4004
+ value = model(0, /* @ts-ignore */
4005
+ ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
4006
+ min = input(0, /* @ts-ignore */
4007
+ ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
4008
+ max = input(100, /* @ts-ignore */
4009
+ ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
4010
+ step = input(1, /* @ts-ignore */
4011
+ ...(ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []));
4012
+ disabled = input(false, /* @ts-ignore */
4013
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
4014
+ orientation = input('horizontal', /* @ts-ignore */
4015
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
4016
+ ariaLabel = input('Value', /* @ts-ignore */
4017
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
4018
+ userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : /* istanbul ignore next */ {}), alias: 'class' });
4019
+ track = viewChild.required('track');
4020
+ dragging = false;
4021
+ pct = computed(() => {
4022
+ const range = this.max() - this.min() || 1;
4023
+ return ((this.value() - this.min()) / range) * 100;
4024
+ }, /* @ts-ignore */
4025
+ ...(ngDevMode ? [{ debugName: "pct" }] : /* istanbul ignore next */ []));
4026
+ computedClass = computed(() => cn('relative flex touch-none items-center select-none data-disabled:pointer-events-none data-disabled:opacity-50', this.orientation() === 'vertical' ? 'h-40 w-fit flex-col' : 'w-full', this.userClass()), /* @ts-ignore */
4027
+ ...(ngDevMode ? [{ debugName: "computedClass" }] : /* istanbul ignore next */ []));
4028
+ onPointerDown(event) {
4029
+ if (this.disabled()) {
4030
+ return;
4031
+ }
4032
+ this.dragging = true;
4033
+ this.value.set(this.valueFromPointer(event));
4034
+ }
4035
+ onMove(event) {
4036
+ if (this.dragging) {
4037
+ this.value.set(this.valueFromPointer(event));
4038
+ }
4039
+ }
4040
+ onUp() {
4041
+ this.dragging = false;
4042
+ }
4043
+ onKeydown(event) {
4044
+ if (this.disabled()) {
4045
+ return;
4046
+ }
4047
+ const big = Math.max(this.step(), (this.max() - this.min()) / 10);
4048
+ let next;
4049
+ switch (event.key) {
4050
+ case 'ArrowRight':
4051
+ case 'ArrowUp': {
4052
+ next = this.value() + this.step();
4053
+ break;
4054
+ }
4055
+ case 'ArrowLeft':
4056
+ case 'ArrowDown': {
4057
+ next = this.value() - this.step();
4058
+ break;
4059
+ }
4060
+ case 'Home': {
4061
+ next = this.min();
4062
+ break;
4063
+ }
4064
+ case 'End': {
4065
+ next = this.max();
4066
+ break;
4067
+ }
4068
+ case 'PageUp': {
4069
+ next = this.value() + big;
4070
+ break;
4071
+ }
4072
+ case 'PageDown': {
4073
+ next = this.value() - big;
4074
+ break;
4075
+ }
4076
+ default: {
4077
+ return;
4078
+ }
4079
+ }
4080
+ event.preventDefault();
4081
+ this.value.set(this.clamp(next));
4082
+ }
4083
+ valueFromPointer(event) {
4084
+ const rect = this.track().nativeElement.getBoundingClientRect();
4085
+ const ratioRaw = this.orientation() === 'vertical'
4086
+ ? 1 - (event.clientY - rect.top) / rect.height
4087
+ : (event.clientX - rect.left) / rect.width;
4088
+ const ratio = Math.max(0, Math.min(1, ratioRaw));
4089
+ return this.snap(this.min() + ratio * (this.max() - this.min()));
4090
+ }
4091
+ snap(raw) {
4092
+ return this.clamp(Math.round(raw / this.step()) * this.step());
4093
+ }
4094
+ clamp(value) {
4095
+ return Math.max(this.min(), Math.min(this.max(), value));
4096
+ }
4097
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiSlider, deps: [], target: i0.ɵɵFactoryTarget.Component });
4098
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.2", type: BuiSlider, isStandalone: true, selector: "bui-slider", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { attributes: { "data-slot": "slider" }, listeners: { "document:pointermove": "onMove($event)", "document:pointerup": "onUp()" }, properties: { "attr.data-orientation": "orientation()", "attr.data-disabled": "disabled() ? '' : null", "class": "computedClass()" } }, viewQueries: [{ propertyName: "track", first: true, predicate: ["track"], descendants: true, isSignal: true }], ngImport: i0, template: `
4099
+ <span
4100
+ #track
4101
+ data-slot="slider-track"
4102
+ class="relative grow overflow-hidden rounded-full bg-muted"
4103
+ [class]="orientation() === 'vertical' ? 'h-full w-1.5' : 'h-1.5 w-full'"
4104
+ (pointerdown)="onPointerDown($event)"
4105
+ >
4106
+ <span
4107
+ data-slot="slider-range"
4108
+ class="absolute bg-primary"
4109
+ [class]="orientation() === 'vertical' ? 'bottom-0 w-full' : 'left-0 h-full'"
4110
+ [style.height.%]="orientation() === 'vertical' ? pct() : null"
4111
+ [style.width.%]="orientation() === 'vertical' ? null : pct()"
4112
+ ></span>
4113
+ </span>
4114
+ <span
4115
+ data-slot="slider-thumb"
4116
+ role="slider"
4117
+ [attr.aria-orientation]="orientation()"
4118
+ [attr.aria-label]="ariaLabel()"
4119
+ [attr.aria-valuemin]="min()"
4120
+ [attr.aria-valuemax]="max()"
4121
+ [attr.aria-valuenow]="value()"
4122
+ [attr.aria-disabled]="disabled()"
4123
+ [attr.tabindex]="disabled() ? -1 : 0"
4124
+ class="absolute block size-4 shrink-0 rounded-full border border-primary bg-background shadow-sm ring-ring/50 transition-[color,box-shadow] outline-none hover:ring-4 focus-visible:ring-4"
4125
+ [class]="
4126
+ orientation() === 'vertical'
4127
+ ? 'left-1/2 -translate-x-1/2 translate-y-1/2'
4128
+ : 'top-1/2 -translate-x-1/2 -translate-y-1/2'
4129
+ "
4130
+ [style.bottom.%]="orientation() === 'vertical' ? pct() : null"
4131
+ [style.left.%]="orientation() === 'vertical' ? null : pct()"
4132
+ (keydown)="onKeydown($event)"
4133
+ ></span>
4134
+ `, isInline: true });
4135
+ }
4136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BuiSlider, decorators: [{
4137
+ type: Component,
4138
+ args: [{
4139
+ selector: 'bui-slider',
4140
+ host: {
4141
+ 'data-slot': 'slider',
4142
+ '[attr.data-orientation]': 'orientation()',
4143
+ '[attr.data-disabled]': "disabled() ? '' : null",
4144
+ '[class]': 'computedClass()',
4145
+ '(document:pointermove)': 'onMove($event)',
4146
+ '(document:pointerup)': 'onUp()',
4147
+ },
4148
+ template: `
4149
+ <span
4150
+ #track
4151
+ data-slot="slider-track"
4152
+ class="relative grow overflow-hidden rounded-full bg-muted"
4153
+ [class]="orientation() === 'vertical' ? 'h-full w-1.5' : 'h-1.5 w-full'"
4154
+ (pointerdown)="onPointerDown($event)"
4155
+ >
4156
+ <span
4157
+ data-slot="slider-range"
4158
+ class="absolute bg-primary"
4159
+ [class]="orientation() === 'vertical' ? 'bottom-0 w-full' : 'left-0 h-full'"
4160
+ [style.height.%]="orientation() === 'vertical' ? pct() : null"
4161
+ [style.width.%]="orientation() === 'vertical' ? null : pct()"
4162
+ ></span>
4163
+ </span>
4164
+ <span
4165
+ data-slot="slider-thumb"
4166
+ role="slider"
4167
+ [attr.aria-orientation]="orientation()"
4168
+ [attr.aria-label]="ariaLabel()"
4169
+ [attr.aria-valuemin]="min()"
4170
+ [attr.aria-valuemax]="max()"
4171
+ [attr.aria-valuenow]="value()"
4172
+ [attr.aria-disabled]="disabled()"
4173
+ [attr.tabindex]="disabled() ? -1 : 0"
4174
+ class="absolute block size-4 shrink-0 rounded-full border border-primary bg-background shadow-sm ring-ring/50 transition-[color,box-shadow] outline-none hover:ring-4 focus-visible:ring-4"
4175
+ [class]="
4176
+ orientation() === 'vertical'
4177
+ ? 'left-1/2 -translate-x-1/2 translate-y-1/2'
4178
+ : 'top-1/2 -translate-x-1/2 -translate-y-1/2'
4179
+ "
4180
+ [style.bottom.%]="orientation() === 'vertical' ? pct() : null"
4181
+ [style.left.%]="orientation() === 'vertical' ? null : pct()"
4182
+ (keydown)="onKeydown($event)"
4183
+ ></span>
4184
+ `,
4185
+ }]
4186
+ }], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], track: [{ type: i0.ViewChild, args: ['track', { isSignal: true }] }] } });
4187
+
3998
4188
  /*
3999
4189
  * Public API Surface of ng-blatui
4000
4190
  */
@@ -4003,5 +4193,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
4003
4193
  * Generated bundle index. Do not edit.
4004
4194
  */
4005
4195
 
4006
- export { BuiAccordion, BuiAccordionContent, BuiAccordionItem, BuiAccordionTrigger, BuiAlert, BuiAlertDescription, BuiAlertTitle, BuiAspectRatio, BuiAvatar, BuiAvatarGroup, BuiBadge, BuiBanner, BuiBreadcrumb, BuiBreadcrumbEllipsis, BuiBreadcrumbItem, BuiBreadcrumbLink, BuiBreadcrumbList, BuiBreadcrumbPage, BuiBreadcrumbSeparator, BuiButton, BuiButtonGroup, BuiButtonGroupText, BuiCard, BuiCardAction, BuiCardContent, BuiCardDescription, BuiCardFooter, BuiCardHeader, BuiCardTitle, BuiCheckbox, BuiCodeBlock, BuiCollapsible, BuiCollapsibleContent, BuiCollapsibleTrigger, BuiContainer, BuiCopyButton, BuiDialogContent, BuiDialogDescription, BuiDialogFooter, BuiDialogHeader, BuiDialogTitle, BuiEmpty, BuiEmptyContent, BuiEmptyDescription, BuiEmptyHeader, BuiEmptyMedia, BuiEmptyTitle, BuiField, BuiFieldContent, BuiFieldDescription, BuiFieldError, BuiFieldGroup, BuiFieldLabel, BuiFieldLegend, BuiFieldSeparator, BuiFieldSet, BuiFieldTitle, BuiHoverCard, BuiHoverCardContent, BuiInput, BuiInputGroup, BuiInputGroupAddon, BuiInputGroupButton, BuiInputGroupInput, BuiInputGroupText, BuiItem, BuiItemActions, BuiItemContent, BuiItemDescription, BuiItemGroup, BuiItemMedia, BuiItemTitle, BuiKbd, BuiLabel, BuiMeter, BuiPagination, BuiPaginationContent, BuiPaginationEllipsis, BuiPaginationItem, BuiPaginationLink, BuiPopover, BuiPopoverContent, BuiProgress, BuiRadioGroup, BuiRadioGroupItem, BuiScrollArea, BuiSeparator, BuiSkeleton, BuiSpinner, BuiStat, BuiSwitch, BuiTabList, BuiTabPanel, BuiTabTrigger, BuiTable, BuiTableBody, BuiTableCaption, BuiTableCell, BuiTableContainer, BuiTableFooter, BuiTableHead, BuiTableHeader, BuiTableRow, BuiTabs, BuiTextarea, BuiThemeCustomizer, BuiToggle, BuiTooltip, BuiTooltipContent, BuiVisuallyHidden, THEME_TOKENS, ThemeStore, buttonVariants, cn, toggleVariants };
4196
+ export { BuiAccordion, BuiAccordionContent, BuiAccordionItem, BuiAccordionTrigger, BuiAlert, BuiAlertDescription, BuiAlertTitle, BuiAspectRatio, BuiAvatar, BuiAvatarGroup, BuiBadge, BuiBanner, BuiBreadcrumb, BuiBreadcrumbEllipsis, BuiBreadcrumbItem, BuiBreadcrumbLink, BuiBreadcrumbList, BuiBreadcrumbPage, BuiBreadcrumbSeparator, BuiButton, BuiButtonGroup, BuiButtonGroupText, BuiCard, BuiCardAction, BuiCardContent, BuiCardDescription, BuiCardFooter, BuiCardHeader, BuiCardTitle, BuiCheckbox, BuiCodeBlock, BuiCollapsible, BuiCollapsibleContent, BuiCollapsibleTrigger, BuiContainer, BuiCopyButton, BuiDialogContent, BuiDialogDescription, BuiDialogFooter, BuiDialogHeader, BuiDialogTitle, BuiEmpty, BuiEmptyContent, BuiEmptyDescription, BuiEmptyHeader, BuiEmptyMedia, BuiEmptyTitle, BuiField, BuiFieldContent, BuiFieldDescription, BuiFieldError, BuiFieldGroup, BuiFieldLabel, BuiFieldLegend, BuiFieldSeparator, BuiFieldSet, BuiFieldTitle, BuiHoverCard, BuiHoverCardContent, BuiInput, BuiInputGroup, BuiInputGroupAddon, BuiInputGroupButton, BuiInputGroupInput, BuiInputGroupText, BuiItem, BuiItemActions, BuiItemContent, BuiItemDescription, BuiItemGroup, BuiItemMedia, BuiItemTitle, BuiKbd, BuiLabel, BuiMeter, BuiPagination, BuiPaginationContent, BuiPaginationEllipsis, BuiPaginationItem, BuiPaginationLink, BuiPopover, BuiPopoverContent, BuiProgress, BuiRadioGroup, BuiRadioGroupItem, BuiScrollArea, BuiSeparator, BuiSkeleton, BuiSlider, BuiSpinner, BuiStat, BuiSwitch, BuiTabList, BuiTabPanel, BuiTabTrigger, BuiTable, BuiTableBody, BuiTableCaption, BuiTableCell, BuiTableContainer, BuiTableFooter, BuiTableHead, BuiTableHeader, BuiTableRow, BuiTabs, BuiTextarea, BuiThemeCustomizer, BuiToggle, BuiTooltip, BuiTooltipContent, BuiVisuallyHidden, THEME_TOKENS, ThemeStore, buttonVariants, cn, toggleVariants };
4007
4197
  //# sourceMappingURL=ng-blatui.mjs.map