@neural-ui/core 1.2.0 → 1.3.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.
- package/README.md +56 -88
- package/accordion/package.json +4 -0
- package/alert/package.json +4 -0
- package/autocomplete/package.json +4 -0
- package/avatar/package.json +4 -0
- package/badge/package.json +4 -0
- package/block-ui/package.json +4 -0
- package/breadcrumb/package.json +4 -0
- package/button/package.json +4 -0
- package/card/package.json +4 -0
- package/chart/package.json +4 -0
- package/checkbox/package.json +4 -0
- package/chip/package.json +4 -0
- package/code-block/package.json +4 -0
- package/color-picker/package.json +4 -0
- package/command-palette/package.json +4 -0
- package/confirm-dialog/package.json +4 -0
- package/context-menu/package.json +4 -0
- package/dashboard-grid/package.json +4 -0
- package/date-input/package.json +4 -0
- package/divider/package.json +4 -0
- package/empty-state/package.json +4 -0
- package/fesm2022/neural-ui-core-accordion.mjs +162 -0
- package/fesm2022/neural-ui-core-accordion.mjs.map +1 -0
- package/fesm2022/neural-ui-core-alert.mjs +116 -0
- package/fesm2022/neural-ui-core-alert.mjs.map +1 -0
- package/fesm2022/neural-ui-core-autocomplete.mjs +332 -0
- package/fesm2022/neural-ui-core-autocomplete.mjs.map +1 -0
- package/fesm2022/neural-ui-core-avatar.mjs +109 -0
- package/fesm2022/neural-ui-core-avatar.mjs.map +1 -0
- package/fesm2022/neural-ui-core-badge.mjs +54 -0
- package/fesm2022/neural-ui-core-badge.mjs.map +1 -0
- package/fesm2022/neural-ui-core-block-ui.mjs +95 -0
- package/fesm2022/neural-ui-core-block-ui.mjs.map +1 -0
- package/fesm2022/neural-ui-core-breadcrumb.mjs +84 -0
- package/fesm2022/neural-ui-core-breadcrumb.mjs.map +1 -0
- package/fesm2022/neural-ui-core-button.mjs +125 -0
- package/fesm2022/neural-ui-core-button.mjs.map +1 -0
- package/fesm2022/neural-ui-core-card.mjs +69 -0
- package/fesm2022/neural-ui-core-card.mjs.map +1 -0
- package/fesm2022/neural-ui-core-chart.mjs +287 -0
- package/fesm2022/neural-ui-core-chart.mjs.map +1 -0
- package/fesm2022/neural-ui-core-checkbox.mjs +138 -0
- package/fesm2022/neural-ui-core-checkbox.mjs.map +1 -0
- package/fesm2022/neural-ui-core-chip.mjs +130 -0
- package/fesm2022/neural-ui-core-chip.mjs.map +1 -0
- package/fesm2022/neural-ui-core-code-block.mjs +250 -0
- package/fesm2022/neural-ui-core-code-block.mjs.map +1 -0
- package/fesm2022/neural-ui-core-color-picker.mjs +435 -0
- package/fesm2022/neural-ui-core-color-picker.mjs.map +1 -0
- package/fesm2022/neural-ui-core-command-palette.mjs +235 -0
- package/fesm2022/neural-ui-core-command-palette.mjs.map +1 -0
- package/fesm2022/neural-ui-core-confirm-dialog.mjs +118 -0
- package/fesm2022/neural-ui-core-confirm-dialog.mjs.map +1 -0
- package/fesm2022/neural-ui-core-context-menu.mjs +158 -0
- package/fesm2022/neural-ui-core-context-menu.mjs.map +1 -0
- package/fesm2022/neural-ui-core-dashboard-grid.mjs +144 -0
- package/fesm2022/neural-ui-core-dashboard-grid.mjs.map +1 -0
- package/fesm2022/neural-ui-core-date-input.mjs +1332 -0
- package/fesm2022/neural-ui-core-date-input.mjs.map +1 -0
- package/fesm2022/neural-ui-core-divider.mjs +54 -0
- package/fesm2022/neural-ui-core-divider.mjs.map +1 -0
- package/fesm2022/neural-ui-core-empty-state.mjs +84 -0
- package/fesm2022/neural-ui-core-empty-state.mjs.map +1 -0
- package/fesm2022/neural-ui-core-filter-bar.mjs +118 -0
- package/fesm2022/neural-ui-core-filter-bar.mjs.map +1 -0
- package/fesm2022/neural-ui-core-icon.mjs +50 -0
- package/fesm2022/neural-ui-core-icon.mjs.map +1 -0
- package/fesm2022/neural-ui-core-image-viewer.mjs +309 -0
- package/fesm2022/neural-ui-core-image-viewer.mjs.map +1 -0
- package/fesm2022/neural-ui-core-input-otp.mjs +192 -0
- package/fesm2022/neural-ui-core-input-otp.mjs.map +1 -0
- package/fesm2022/neural-ui-core-input.mjs +320 -0
- package/fesm2022/neural-ui-core-input.mjs.map +1 -0
- package/fesm2022/neural-ui-core-knob.mjs +323 -0
- package/fesm2022/neural-ui-core-knob.mjs.map +1 -0
- package/fesm2022/neural-ui-core-meter-group.mjs +122 -0
- package/fesm2022/neural-ui-core-meter-group.mjs.map +1 -0
- package/fesm2022/neural-ui-core-modal.mjs +156 -0
- package/fesm2022/neural-ui-core-modal.mjs.map +1 -0
- package/fesm2022/neural-ui-core-multiselect.mjs +748 -0
- package/fesm2022/neural-ui-core-multiselect.mjs.map +1 -0
- package/fesm2022/neural-ui-core-nav.mjs +952 -0
- package/fesm2022/neural-ui-core-nav.mjs.map +1 -0
- package/fesm2022/neural-ui-core-notification-center.mjs +264 -0
- package/fesm2022/neural-ui-core-notification-center.mjs.map +1 -0
- package/fesm2022/neural-ui-core-number-input.mjs +331 -0
- package/fesm2022/neural-ui-core-number-input.mjs.map +1 -0
- package/fesm2022/neural-ui-core-pagination.mjs +198 -0
- package/fesm2022/neural-ui-core-pagination.mjs.map +1 -0
- package/fesm2022/neural-ui-core-popover.mjs +207 -0
- package/fesm2022/neural-ui-core-popover.mjs.map +1 -0
- package/fesm2022/neural-ui-core-progress-bar.mjs +105 -0
- package/fesm2022/neural-ui-core-progress-bar.mjs.map +1 -0
- package/fesm2022/neural-ui-core-radio.mjs +171 -0
- package/fesm2022/neural-ui-core-radio.mjs.map +1 -0
- package/fesm2022/neural-ui-core-rating.mjs +151 -0
- package/fesm2022/neural-ui-core-rating.mjs.map +1 -0
- package/fesm2022/neural-ui-core-select.mjs +638 -0
- package/fesm2022/neural-ui-core-select.mjs.map +1 -0
- package/fesm2022/neural-ui-core-sidebar.mjs +214 -0
- package/fesm2022/neural-ui-core-sidebar.mjs.map +1 -0
- package/fesm2022/neural-ui-core-skeleton.mjs +40 -0
- package/fesm2022/neural-ui-core-skeleton.mjs.map +1 -0
- package/fesm2022/neural-ui-core-slider.mjs +146 -0
- package/fesm2022/neural-ui-core-slider.mjs.map +1 -0
- package/fesm2022/neural-ui-core-spinner.mjs +113 -0
- package/fesm2022/neural-ui-core-spinner.mjs.map +1 -0
- package/fesm2022/neural-ui-core-split-button.mjs +252 -0
- package/fesm2022/neural-ui-core-split-button.mjs.map +1 -0
- package/fesm2022/neural-ui-core-splitter.mjs +174 -0
- package/fesm2022/neural-ui-core-splitter.mjs.map +1 -0
- package/fesm2022/neural-ui-core-stats-card.mjs +163 -0
- package/fesm2022/neural-ui-core-stats-card.mjs.map +1 -0
- package/fesm2022/neural-ui-core-stepper.mjs +204 -0
- package/fesm2022/neural-ui-core-stepper.mjs.map +1 -0
- package/fesm2022/neural-ui-core-switch.mjs +111 -0
- package/fesm2022/neural-ui-core-switch.mjs.map +1 -0
- package/fesm2022/neural-ui-core-table.mjs +1860 -0
- package/fesm2022/neural-ui-core-table.mjs.map +1 -0
- package/fesm2022/neural-ui-core-tabs.mjs +246 -0
- package/fesm2022/neural-ui-core-tabs.mjs.map +1 -0
- package/fesm2022/neural-ui-core-textarea.mjs +188 -0
- package/fesm2022/neural-ui-core-textarea.mjs.map +1 -0
- package/fesm2022/neural-ui-core-timeline.mjs +117 -0
- package/fesm2022/neural-ui-core-timeline.mjs.map +1 -0
- package/fesm2022/neural-ui-core-toast.mjs +171 -0
- package/fesm2022/neural-ui-core-toast.mjs.map +1 -0
- package/fesm2022/neural-ui-core-toggle-button-group.mjs +162 -0
- package/fesm2022/neural-ui-core-toggle-button-group.mjs.map +1 -0
- package/fesm2022/neural-ui-core-toolbar.mjs +67 -0
- package/fesm2022/neural-ui-core-toolbar.mjs.map +1 -0
- package/fesm2022/neural-ui-core-tooltip.mjs +151 -0
- package/fesm2022/neural-ui-core-tooltip.mjs.map +1 -0
- package/fesm2022/neural-ui-core-url-state.mjs +96 -0
- package/fesm2022/neural-ui-core-url-state.mjs.map +1 -0
- package/fesm2022/neural-ui-core-virtual-list.mjs +126 -0
- package/fesm2022/neural-ui-core-virtual-list.mjs.map +1 -0
- package/fesm2022/neural-ui-core.mjs +11 -8544
- package/fesm2022/neural-ui-core.mjs.map +1 -1
- package/filter-bar/package.json +4 -0
- package/icon/package.json +4 -0
- package/image-viewer/package.json +4 -0
- package/input/package.json +4 -0
- package/input-otp/package.json +4 -0
- package/knob/package.json +4 -0
- package/meter-group/package.json +4 -0
- package/modal/package.json +4 -0
- package/multiselect/package.json +4 -0
- package/nav/package.json +4 -0
- package/notification-center/package.json +4 -0
- package/number-input/package.json +4 -0
- package/package.json +252 -5
- package/pagination/package.json +4 -0
- package/popover/package.json +4 -0
- package/progress-bar/package.json +4 -0
- package/radio/package.json +4 -0
- package/rating/package.json +4 -0
- package/select/package.json +4 -0
- package/sidebar/package.json +4 -0
- package/skeleton/package.json +4 -0
- package/slider/package.json +4 -0
- package/spinner/package.json +4 -0
- package/split-button/package.json +4 -0
- package/splitter/package.json +4 -0
- package/stats-card/package.json +4 -0
- package/stepper/package.json +4 -0
- package/styles/_tokens.scss +209 -7
- package/styles.scss +1 -0
- package/switch/package.json +4 -0
- package/table/package.json +4 -0
- package/tabs/package.json +4 -0
- package/textarea/package.json +4 -0
- package/timeline/package.json +4 -0
- package/toast/package.json +4 -0
- package/toggle-button-group/package.json +4 -0
- package/toolbar/package.json +4 -0
- package/tooltip/package.json +4 -0
- package/types/neural-ui-core-accordion.d.ts +55 -0
- package/types/neural-ui-core-alert.d.ts +47 -0
- package/types/neural-ui-core-autocomplete.d.ts +69 -0
- package/types/neural-ui-core-avatar.d.ts +39 -0
- package/types/neural-ui-core-badge.d.ts +36 -0
- package/types/neural-ui-core-block-ui.d.ts +46 -0
- package/types/neural-ui-core-breadcrumb.d.ts +38 -0
- package/types/neural-ui-core-button.d.ts +55 -0
- package/types/neural-ui-core-card.d.ts +37 -0
- package/types/neural-ui-core-chart.d.ts +236 -0
- package/types/neural-ui-core-checkbox.d.ts +33 -0
- package/types/neural-ui-core-chip.d.ts +53 -0
- package/types/neural-ui-core-code-block.d.ts +55 -0
- package/types/neural-ui-core-color-picker.d.ts +55 -0
- package/types/neural-ui-core-command-palette.d.ts +56 -0
- package/types/neural-ui-core-confirm-dialog.d.ts +50 -0
- package/types/neural-ui-core-context-menu.d.ts +66 -0
- package/types/neural-ui-core-dashboard-grid.d.ts +41 -0
- package/types/neural-ui-core-date-input.d.ts +178 -0
- package/types/neural-ui-core-divider.d.ts +20 -0
- package/types/neural-ui-core-empty-state.d.ts +32 -0
- package/types/neural-ui-core-filter-bar.d.ts +49 -0
- package/types/neural-ui-core-icon.d.ts +33 -0
- package/types/neural-ui-core-image-viewer.d.ts +67 -0
- package/types/neural-ui-core-input-otp.d.ts +49 -0
- package/types/neural-ui-core-input.d.ts +86 -0
- package/types/neural-ui-core-knob.d.ts +68 -0
- package/types/neural-ui-core-meter-group.d.ts +52 -0
- package/types/neural-ui-core-modal.d.ts +54 -0
- package/types/neural-ui-core-multiselect.d.ts +129 -0
- package/types/neural-ui-core-nav.d.ts +69 -0
- package/types/neural-ui-core-notification-center.d.ts +60 -0
- package/types/neural-ui-core-number-input.d.ts +63 -0
- package/types/neural-ui-core-pagination.d.ts +30 -0
- package/types/neural-ui-core-popover.d.ts +73 -0
- package/types/neural-ui-core-progress-bar.d.ts +35 -0
- package/types/neural-ui-core-radio.d.ts +51 -0
- package/types/neural-ui-core-rating.d.ts +34 -0
- package/types/neural-ui-core-select.d.ts +161 -0
- package/types/neural-ui-core-sidebar.d.ts +57 -0
- package/types/neural-ui-core-skeleton.d.ts +22 -0
- package/types/neural-ui-core-slider.d.ts +42 -0
- package/types/neural-ui-core-spinner.d.ts +38 -0
- package/types/neural-ui-core-split-button.d.ts +65 -0
- package/types/neural-ui-core-splitter.d.ts +28 -0
- package/types/neural-ui-core-stats-card.d.ts +39 -0
- package/types/neural-ui-core-stepper.d.ts +51 -0
- package/types/neural-ui-core-switch.d.ts +34 -0
- package/types/neural-ui-core-table.d.ts +282 -0
- package/types/neural-ui-core-tabs.d.ts +76 -0
- package/types/neural-ui-core-textarea.d.ts +52 -0
- package/types/neural-ui-core-timeline.d.ts +33 -0
- package/types/neural-ui-core-toast.d.ts +70 -0
- package/types/neural-ui-core-toggle-button-group.d.ts +63 -0
- package/types/neural-ui-core-toolbar.d.ts +36 -0
- package/types/neural-ui-core-tooltip.d.ts +48 -0
- package/types/neural-ui-core-url-state.d.ts +58 -0
- package/types/neural-ui-core-virtual-list.d.ts +60 -0
- package/types/neural-ui-core.d.ts +5 -2107
- package/url-state/package.json +4 -0
- package/virtual-list/package.json +4 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, output, signal, computed, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* NeuralUI Rating Component
|
|
6
|
+
*
|
|
7
|
+
* Selector de valoración con estrellas (o icono personalizable).
|
|
8
|
+
* Soporta valores medios (half-star) y modo solo-lectura.
|
|
9
|
+
*
|
|
10
|
+
* Uso:
|
|
11
|
+
* <neu-rating [value]="rating" (valueChange)="rating = $event" />
|
|
12
|
+
* <neu-rating [value]="4.5" [readonly]="true" />
|
|
13
|
+
*/
|
|
14
|
+
class NeuRatingComponent {
|
|
15
|
+
Math = Math;
|
|
16
|
+
/** Valor actual (1 a stars) / Current value (1 to stars) */
|
|
17
|
+
value = input(0, ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
18
|
+
/** Número de estrellas / Number of stars */
|
|
19
|
+
stars = input(5, ...(ngDevMode ? [{ debugName: "stars" }] : /* istanbul ignore next */ []));
|
|
20
|
+
/** Modo solo lectura / Read-only mode */
|
|
21
|
+
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
22
|
+
/** Emite el nuevo valor al seleccionar / Emits the new value on selection */
|
|
23
|
+
valueChange = output();
|
|
24
|
+
hovered = signal(null, ...(ngDevMode ? [{ debugName: "hovered" }] : /* istanbul ignore next */ []));
|
|
25
|
+
starsArray = computed(() => Array.from({ length: this.stars() }, (_, i) => i + 1), ...(ngDevMode ? [{ debugName: "starsArray" }] : /* istanbul ignore next */ []));
|
|
26
|
+
onHover(i) {
|
|
27
|
+
if (!this.readonly())
|
|
28
|
+
this.hovered.set(i);
|
|
29
|
+
}
|
|
30
|
+
onLeave() {
|
|
31
|
+
this.hovered.set(null);
|
|
32
|
+
}
|
|
33
|
+
select(i) {
|
|
34
|
+
if (this.readonly())
|
|
35
|
+
return;
|
|
36
|
+
const clamped = Math.min(this.stars(), Math.max(1, i));
|
|
37
|
+
this.valueChange.emit(clamped);
|
|
38
|
+
}
|
|
39
|
+
isInteger(n) {
|
|
40
|
+
return Number.isInteger(n);
|
|
41
|
+
}
|
|
42
|
+
getFill(i) {
|
|
43
|
+
const val = this.hovered() ?? this.value();
|
|
44
|
+
if (i <= Math.floor(val))
|
|
45
|
+
return 'currentColor';
|
|
46
|
+
if (!Number.isInteger(val) && i === Math.ceil(val))
|
|
47
|
+
return `url(#half-${i})`;
|
|
48
|
+
return 'transparent';
|
|
49
|
+
}
|
|
50
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRatingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: NeuRatingComponent, isStandalone: true, selector: "neu-rating", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, stars: { classPropertyName: "stars", publicName: "stars", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
|
|
52
|
+
<div
|
|
53
|
+
class="neu-rating"
|
|
54
|
+
[class.neu-rating--readonly]="readonly()"
|
|
55
|
+
[attr.role]="readonly() ? null : 'radiogroup'"
|
|
56
|
+
[attr.aria-label]="'Valoración: ' + value() + ' de ' + stars() + ' estrellas'"
|
|
57
|
+
>
|
|
58
|
+
@for (i of starsArray(); track i) {
|
|
59
|
+
<button
|
|
60
|
+
class="neu-rating__star"
|
|
61
|
+
[class.neu-rating__star--filled]="i <= (hovered() ?? value())"
|
|
62
|
+
[class.neu-rating__star--half]="
|
|
63
|
+
!isInteger(hovered() ?? value()) && i === Math.ceil(hovered() ?? value())
|
|
64
|
+
"
|
|
65
|
+
type="button"
|
|
66
|
+
[disabled]="readonly()"
|
|
67
|
+
[attr.aria-label]="i + ' star' + (i > 1 ? 's' : '')"
|
|
68
|
+
[attr.aria-checked]="i === value()"
|
|
69
|
+
[attr.role]="'radio'"
|
|
70
|
+
(mouseenter)="onHover(i)"
|
|
71
|
+
(mouseleave)="onLeave()"
|
|
72
|
+
(click)="select(i)"
|
|
73
|
+
(keydown.left)="select(value() - 1)"
|
|
74
|
+
(keydown.right)="select(value() + 1)"
|
|
75
|
+
>
|
|
76
|
+
<svg class="neu-rating__icon" viewBox="0 0 24 24" aria-hidden="true">
|
|
77
|
+
<defs>
|
|
78
|
+
<linearGradient [id]="'half-' + i" x1="0" x2="1" y1="0" y2="0">
|
|
79
|
+
<stop offset="50%" stop-color="currentColor" />
|
|
80
|
+
<stop offset="50%" stop-color="transparent" />
|
|
81
|
+
</linearGradient>
|
|
82
|
+
</defs>
|
|
83
|
+
<polygon
|
|
84
|
+
points="12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26"
|
|
85
|
+
[attr.fill]="getFill(i)"
|
|
86
|
+
stroke="currentColor"
|
|
87
|
+
stroke-width="1.5"
|
|
88
|
+
stroke-linecap="round"
|
|
89
|
+
stroke-linejoin="round"
|
|
90
|
+
/>
|
|
91
|
+
</svg>
|
|
92
|
+
</button>
|
|
93
|
+
}
|
|
94
|
+
</div>
|
|
95
|
+
`, isInline: true, styles: [".neu-rating{display:inline-flex;align-items:center;gap:2px;font-family:var(--neu-font-sans)}.neu-rating--readonly{pointer-events:none}.neu-rating__star{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:none;border-radius:var(--neu-radius-sm);cursor:pointer;color:var(--neu-surface-3);padding:2px;transition:transform .15s ease,color .15s ease;outline:none}.neu-rating__star--filled{color:#f59e0b}.neu-rating__star:hover:not(:disabled){transform:scale(1.15)}.neu-rating__star:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-rating__star:disabled{cursor:default}.neu-rating__icon{width:22px;height:22px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: NeuRatingComponent, decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{ selector: 'neu-rating', imports: [], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
100
|
+
<div
|
|
101
|
+
class="neu-rating"
|
|
102
|
+
[class.neu-rating--readonly]="readonly()"
|
|
103
|
+
[attr.role]="readonly() ? null : 'radiogroup'"
|
|
104
|
+
[attr.aria-label]="'Valoración: ' + value() + ' de ' + stars() + ' estrellas'"
|
|
105
|
+
>
|
|
106
|
+
@for (i of starsArray(); track i) {
|
|
107
|
+
<button
|
|
108
|
+
class="neu-rating__star"
|
|
109
|
+
[class.neu-rating__star--filled]="i <= (hovered() ?? value())"
|
|
110
|
+
[class.neu-rating__star--half]="
|
|
111
|
+
!isInteger(hovered() ?? value()) && i === Math.ceil(hovered() ?? value())
|
|
112
|
+
"
|
|
113
|
+
type="button"
|
|
114
|
+
[disabled]="readonly()"
|
|
115
|
+
[attr.aria-label]="i + ' star' + (i > 1 ? 's' : '')"
|
|
116
|
+
[attr.aria-checked]="i === value()"
|
|
117
|
+
[attr.role]="'radio'"
|
|
118
|
+
(mouseenter)="onHover(i)"
|
|
119
|
+
(mouseleave)="onLeave()"
|
|
120
|
+
(click)="select(i)"
|
|
121
|
+
(keydown.left)="select(value() - 1)"
|
|
122
|
+
(keydown.right)="select(value() + 1)"
|
|
123
|
+
>
|
|
124
|
+
<svg class="neu-rating__icon" viewBox="0 0 24 24" aria-hidden="true">
|
|
125
|
+
<defs>
|
|
126
|
+
<linearGradient [id]="'half-' + i" x1="0" x2="1" y1="0" y2="0">
|
|
127
|
+
<stop offset="50%" stop-color="currentColor" />
|
|
128
|
+
<stop offset="50%" stop-color="transparent" />
|
|
129
|
+
</linearGradient>
|
|
130
|
+
</defs>
|
|
131
|
+
<polygon
|
|
132
|
+
points="12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26"
|
|
133
|
+
[attr.fill]="getFill(i)"
|
|
134
|
+
stroke="currentColor"
|
|
135
|
+
stroke-width="1.5"
|
|
136
|
+
stroke-linecap="round"
|
|
137
|
+
stroke-linejoin="round"
|
|
138
|
+
/>
|
|
139
|
+
</svg>
|
|
140
|
+
</button>
|
|
141
|
+
}
|
|
142
|
+
</div>
|
|
143
|
+
`, styles: [".neu-rating{display:inline-flex;align-items:center;gap:2px;font-family:var(--neu-font-sans)}.neu-rating--readonly{pointer-events:none}.neu-rating__star{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:none;border-radius:var(--neu-radius-sm);cursor:pointer;color:var(--neu-surface-3);padding:2px;transition:transform .15s ease,color .15s ease;outline:none}.neu-rating__star--filled{color:#f59e0b}.neu-rating__star:hover:not(:disabled){transform:scale(1.15)}.neu-rating__star:focus-visible{outline:2px solid var(--neu-primary);outline-offset:2px}.neu-rating__star:disabled{cursor:default}.neu-rating__icon{width:22px;height:22px}\n"] }]
|
|
144
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], stars: [{ type: i0.Input, args: [{ isSignal: true, alias: "stars", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Generated bundle index. Do not edit.
|
|
148
|
+
*/
|
|
149
|
+
|
|
150
|
+
export { NeuRatingComponent };
|
|
151
|
+
//# sourceMappingURL=neural-ui-core-rating.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neural-ui-core-rating.mjs","sources":["../../../../projects/ui-core/rating/neu-rating.component.ts","../../../../projects/ui-core/rating/neural-ui-core-rating.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\n\n/**\n * NeuralUI Rating Component\n *\n * Selector de valoración con estrellas (o icono personalizable).\n * Soporta valores medios (half-star) y modo solo-lectura.\n *\n * Uso:\n * <neu-rating [value]=\"rating\" (valueChange)=\"rating = $event\" />\n * <neu-rating [value]=\"4.5\" [readonly]=\"true\" />\n */\n@Component({\n selector: 'neu-rating',\n imports: [],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"neu-rating\"\n [class.neu-rating--readonly]=\"readonly()\"\n [attr.role]=\"readonly() ? null : 'radiogroup'\"\n [attr.aria-label]=\"'Valoración: ' + value() + ' de ' + stars() + ' estrellas'\"\n >\n @for (i of starsArray(); track i) {\n <button\n class=\"neu-rating__star\"\n [class.neu-rating__star--filled]=\"i <= (hovered() ?? value())\"\n [class.neu-rating__star--half]=\"\n !isInteger(hovered() ?? value()) && i === Math.ceil(hovered() ?? value())\n \"\n type=\"button\"\n [disabled]=\"readonly()\"\n [attr.aria-label]=\"i + ' star' + (i > 1 ? 's' : '')\"\n [attr.aria-checked]=\"i === value()\"\n [attr.role]=\"'radio'\"\n (mouseenter)=\"onHover(i)\"\n (mouseleave)=\"onLeave()\"\n (click)=\"select(i)\"\n (keydown.left)=\"select(value() - 1)\"\n (keydown.right)=\"select(value() + 1)\"\n >\n <svg class=\"neu-rating__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <defs>\n <linearGradient [id]=\"'half-' + i\" x1=\"0\" x2=\"1\" y1=\"0\" y2=\"0\">\n <stop offset=\"50%\" stop-color=\"currentColor\" />\n <stop offset=\"50%\" stop-color=\"transparent\" />\n </linearGradient>\n </defs>\n <polygon\n points=\"12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26\"\n [attr.fill]=\"getFill(i)\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n </div>\n `,\n styleUrl: './neu-rating.component.scss',\n})\nexport class NeuRatingComponent {\n protected readonly Math = Math;\n\n /** Valor actual (1 a stars) / Current value (1 to stars) */\n value = input<number>(0);\n\n /** Número de estrellas / Number of stars */\n stars = input<number>(5);\n\n /** Modo solo lectura / Read-only mode */\n readonly = input<boolean>(false);\n\n /** Emite el nuevo valor al seleccionar / Emits the new value on selection */\n valueChange = output<number>();\n\n protected readonly hovered = signal<number | null>(null);\n readonly starsArray = computed(() => Array.from({ length: this.stars() }, (_, i) => i + 1));\n\n onHover(i: number): void {\n if (!this.readonly()) this.hovered.set(i);\n }\n\n onLeave(): void {\n this.hovered.set(null);\n }\n\n select(i: number): void {\n if (this.readonly()) return;\n const clamped = Math.min(this.stars(), Math.max(1, i));\n this.valueChange.emit(clamped);\n }\n\n isInteger(n: number): boolean {\n return Number.isInteger(n);\n }\n\n getFill(i: number): string {\n const val = this.hovered() ?? this.value();\n if (i <= Math.floor(val)) return 'currentColor';\n if (!Number.isInteger(val) && i === Math.ceil(val)) return `url(#half-${i})`;\n return 'transparent';\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|