@tinya-code/gas-admin-ui 0.0.0-stage → 0.1.0-alpha.2
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 +125 -2
- package/fesm2022/tinya-code-gas-admin-ui-api.service-CZrUeclM.mjs +281 -0
- package/fesm2022/tinya-code-gas-admin-ui-api.service-CZrUeclM.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs +84 -0
- package/fesm2022/tinya-code-gas-admin-ui-badge-EeCA_l-o.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs +140 -0
- package/fesm2022/tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs +113 -0
- package/fesm2022/tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs +163 -0
- package/fesm2022/tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-calendar-view-r-RXDE37.mjs +1022 -0
- package/fesm2022/tinya-code-gas-admin-ui-calendar-view-r-RXDE37.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs +278 -0
- package/fesm2022/tinya-code-gas-admin-ui-chart-line-BjdlKHoH.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-BBzWUuHl.mjs +101 -0
- package/fesm2022/tinya-code-gas-admin-ui-condition-evaluator-BBzWUuHl.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs +141 -0
- package/fesm2022/tinya-code-gas-admin-ui-currency-BvuF3Z63.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-data-source.service-LD8AM3Rn.mjs +89 -0
- package/fesm2022/tinya-code-gas-admin-ui-data-source.service-LD8AM3Rn.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs +107 -0
- package/fesm2022/tinya-code-gas-admin-ui-date-1SJGXZrd.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs +140 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-badge-fwk6sDU7.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs +119 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-date-D7zLiDiG.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs +125 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-file-BiIhqvQC.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs +152 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-image-C1dhnZi1.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs +211 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-list-DOEuUbGe.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs +116 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-number-DDMzr4Hn.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs +111 -0
- package/fesm2022/tinya-code-gas-admin-ui-display-text-B8CdVNpv.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs +107 -0
- package/fesm2022/tinya-code-gas-admin-ui-email-CT_O5ihA.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs +109 -0
- package/fesm2022/tinya-code-gas-admin-ui-empty-state-BMc0QtoT.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-Ci0UpXtV.mjs +45 -0
- package/fesm2022/tinya-code-gas-admin-ui-error-mapper.service-Ci0UpXtV.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs +50 -0
- package/fesm2022/tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs +24 -0
- package/fesm2022/tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs +27 -0
- package/fesm2022/tinya-code-gas-admin-ui-field-path-B4-FTBGZ.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-file-Dg2N3XQ2.mjs +408 -0
- package/fesm2022/tinya-code-gas-admin-ui-file-Dg2N3XQ2.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-form-view-BwGupSbi.mjs +4514 -0
- package/fesm2022/tinya-code-gas-admin-ui-form-view-BwGupSbi.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs +82 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-badge-CK8ct5Wk.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs +105 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-boolean-ClzezZz-.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs +65 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-currency-CVmniKml.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs +65 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-date-Dr1YsDd_.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs +65 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-number-CWCjpI4n.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs +59 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-text-DBOgJkH0.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs +94 -0
- package/fesm2022/tinya-code-gas-admin-ui-format-thumbnail-PCRvxWKt.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs +72 -0
- package/fesm2022/tinya-code-gas-admin-ui-gap-sorting-iTdy_DYG.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs +238 -0
- package/fesm2022/tinya-code-gas-admin-ui-group-h7-O8tt4.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-image-Bjw9ImlS.mjs +416 -0
- package/fesm2022/tinya-code-gas-admin-ui-image-Bjw9ImlS.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-kanban-view-CeGueI57.mjs +439 -0
- package/fesm2022/tinya-code-gas-admin-ui-kanban-view-CeGueI57.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs +513 -0
- package/fesm2022/tinya-code-gas-admin-ui-key-value-nVdgg5at.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-list-CMzl9MkX.mjs +637 -0
- package/fesm2022/tinya-code-gas-admin-ui-list-CMzl9MkX.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs +127 -0
- package/fesm2022/tinya-code-gas-admin-ui-metric-card-DnGMQL8l.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-multiselect-CuWwAfdY.mjs +251 -0
- package/fesm2022/tinya-code-gas-admin-ui-multiselect-CuWwAfdY.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs +66 -0
- package/fesm2022/tinya-code-gas-admin-ui-notification.service-LjSULER6.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs +114 -0
- package/fesm2022/tinya-code-gas-admin-ui-number-JNr7glc8.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs +116 -0
- package/fesm2022/tinya-code-gas-admin-ui-phone-jR417hPf.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs +235 -0
- package/fesm2022/tinya-code-gas-admin-ui-quick-actions-DCQ6emmF.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs +8 -0
- package/fesm2022/tinya-code-gas-admin-ui-radio-mode-DxvN07DY.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs +124 -0
- package/fesm2022/tinya-code-gas-admin-ui-readonly-text-BL7-4qie.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs +249 -0
- package/fesm2022/tinya-code-gas-admin-ui-record-list-BiZfnd_7.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-relation-B3W3Ynsp.mjs +309 -0
- package/fesm2022/tinya-code-gas-admin-ui-relation-B3W3Ynsp.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs +39 -0
- package/fesm2022/tinya-code-gas-admin-ui-relation-drawer.service-B0kT8EiW.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-render-registry-B_D5Jhp9.mjs +546 -0
- package/fesm2022/tinya-code-gas-admin-ui-render-registry-B_D5Jhp9.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-rolldown-runtime-DpJrqANO.mjs +11 -0
- package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-CDrz9pVN.mjs +131 -0
- package/fesm2022/tinya-code-gas-admin-ui-schema-catalog-CDrz9pVN.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-seed-CNbQtREA.mjs +80 -0
- package/fesm2022/tinya-code-gas-admin-ui-seed-CNbQtREA.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-select-DzaRfHXO.mjs +292 -0
- package/fesm2022/tinya-code-gas-admin-ui-select-DzaRfHXO.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs +119 -0
- package/fesm2022/tinya-code-gas-admin-ui-skeleton-DnWK0tcZ.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs +158 -0
- package/fesm2022/tinya-code-gas-admin-ui-slug-DU58cbiY.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs +26 -0
- package/fesm2022/tinya-code-gas-admin-ui-source-options-B9R4mw8-.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs +205 -0
- package/fesm2022/tinya-code-gas-admin-ui-status-progress-DmeG8htE.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs +432 -0
- package/fesm2022/tinya-code-gas-admin-ui-string-list-gleasqzD.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs +36 -0
- package/fesm2022/tinya-code-gas-admin-ui-template-interpolator-ewv7CkNX.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs +107 -0
- package/fesm2022/tinya-code-gas-admin-ui-text-CUPmL7W_.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs +223 -0
- package/fesm2022/tinya-code-gas-admin-ui-textarea-CGLSIW13.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs +107 -0
- package/fesm2022/tinya-code-gas-admin-ui-time-BcHzsTWf.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-upload.service-C1g545w5.mjs +60 -0
- package/fesm2022/tinya-code-gas-admin-ui-upload.service-C1g545w5.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs +141 -0
- package/fesm2022/tinya-code-gas-admin-ui-url-GO4LZi__.mjs.map +1 -0
- package/fesm2022/tinya-code-gas-admin-ui.mjs +4403 -0
- package/fesm2022/tinya-code-gas-admin-ui.mjs.map +1 -0
- package/package.json +31 -3
- package/types/tinya-code-gas-admin-ui.d.ts +3099 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { Component, computed, input } from "@angular/core";
|
|
3
|
+
var BarChart = class BarChart {
|
|
4
|
+
label = input.required(...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
|
|
5
|
+
data = input([], ...ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []);
|
|
6
|
+
unit = input("", ...ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []);
|
|
7
|
+
max = computed(() => Math.max(0, ...this.data().map((row) => row.value)), ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
|
|
8
|
+
height(value) {
|
|
9
|
+
if (value === 0) return 0;
|
|
10
|
+
const max = this.max();
|
|
11
|
+
if (max === 0) return 0;
|
|
12
|
+
return Math.max(2, value / max * 100);
|
|
13
|
+
}
|
|
14
|
+
summary = computed(() => {
|
|
15
|
+
const rows = this.data();
|
|
16
|
+
if (rows.length === 0) return "Sin datos.";
|
|
17
|
+
const top = rows.reduce((best, row) => row.value > best.value ? row : best, rows[0]);
|
|
18
|
+
const unit = this.unit();
|
|
19
|
+
return `${rows.length} categorías. Mayor: ${top.label} con ${top.value}${unit}. Menor: ${rows.reduce((low, row) => row.value < low.value ? row : low, rows[0]).label}.`;
|
|
20
|
+
}, ...ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []);
|
|
21
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
22
|
+
minVersion: "12.0.0",
|
|
23
|
+
version: "22.2.3",
|
|
24
|
+
ngImport: i0,
|
|
25
|
+
type: BarChart,
|
|
26
|
+
deps: [],
|
|
27
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
28
|
+
});
|
|
29
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
30
|
+
minVersion: "17.0.0",
|
|
31
|
+
version: "22.2.3",
|
|
32
|
+
type: BarChart,
|
|
33
|
+
isStandalone: true,
|
|
34
|
+
selector: "app-bar-chart",
|
|
35
|
+
inputs: {
|
|
36
|
+
label: {
|
|
37
|
+
classPropertyName: "label",
|
|
38
|
+
publicName: "label",
|
|
39
|
+
isSignal: true,
|
|
40
|
+
isRequired: true,
|
|
41
|
+
transformFunction: null
|
|
42
|
+
},
|
|
43
|
+
data: {
|
|
44
|
+
classPropertyName: "data",
|
|
45
|
+
publicName: "data",
|
|
46
|
+
isSignal: true,
|
|
47
|
+
isRequired: false,
|
|
48
|
+
transformFunction: null
|
|
49
|
+
},
|
|
50
|
+
unit: {
|
|
51
|
+
classPropertyName: "unit",
|
|
52
|
+
publicName: "unit",
|
|
53
|
+
isSignal: true,
|
|
54
|
+
isRequired: false,
|
|
55
|
+
transformFunction: null
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
ngImport: i0,
|
|
59
|
+
template: `
|
|
60
|
+
<div class="rounded-lg border border-neutral/20 bg-surface p-4">
|
|
61
|
+
<p class="mb-3 text-sm text-neutral">{{ label() }}</p>
|
|
62
|
+
|
|
63
|
+
@if (data().length === 0) {
|
|
64
|
+
<p class="text-sm text-neutral/60" data-testid="empty">Sin datos.</p>
|
|
65
|
+
} @else {
|
|
66
|
+
<div role="img" [attr.aria-label]="summary()" class="flex h-32 items-end gap-2">
|
|
67
|
+
@for (row of data(); track row.label) {
|
|
68
|
+
<div class="flex min-w-0 flex-1 flex-col items-center justify-end gap-1">
|
|
69
|
+
<span class="text-xs tabular-nums text-neutral"> {{ row.value }}{{ unit() }} </span>
|
|
70
|
+
<div class="w-full rounded-t bg-primary" [style.height.%]="height(row.value)"></div>
|
|
71
|
+
<span class="w-full truncate text-center text-xs text-neutral">{{ row.label }}</span>
|
|
72
|
+
</div>
|
|
73
|
+
}
|
|
74
|
+
</div>
|
|
75
|
+
}
|
|
76
|
+
</div>
|
|
77
|
+
`,
|
|
78
|
+
isInline: true
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
82
|
+
minVersion: "12.0.0",
|
|
83
|
+
version: "22.2.3",
|
|
84
|
+
ngImport: i0,
|
|
85
|
+
type: BarChart,
|
|
86
|
+
decorators: [{
|
|
87
|
+
type: Component,
|
|
88
|
+
args: [{
|
|
89
|
+
selector: "app-bar-chart",
|
|
90
|
+
template: `
|
|
91
|
+
<div class="rounded-lg border border-neutral/20 bg-surface p-4">
|
|
92
|
+
<p class="mb-3 text-sm text-neutral">{{ label() }}</p>
|
|
93
|
+
|
|
94
|
+
@if (data().length === 0) {
|
|
95
|
+
<p class="text-sm text-neutral/60" data-testid="empty">Sin datos.</p>
|
|
96
|
+
} @else {
|
|
97
|
+
<div role="img" [attr.aria-label]="summary()" class="flex h-32 items-end gap-2">
|
|
98
|
+
@for (row of data(); track row.label) {
|
|
99
|
+
<div class="flex min-w-0 flex-1 flex-col items-center justify-end gap-1">
|
|
100
|
+
<span class="text-xs tabular-nums text-neutral"> {{ row.value }}{{ unit() }} </span>
|
|
101
|
+
<div class="w-full rounded-t bg-primary" [style.height.%]="height(row.value)"></div>
|
|
102
|
+
<span class="w-full truncate text-center text-xs text-neutral">{{ row.label }}</span>
|
|
103
|
+
</div>
|
|
104
|
+
}
|
|
105
|
+
</div>
|
|
106
|
+
}
|
|
107
|
+
</div>
|
|
108
|
+
`
|
|
109
|
+
}]
|
|
110
|
+
}],
|
|
111
|
+
propDecorators: {
|
|
112
|
+
label: [{
|
|
113
|
+
type: i0.Input,
|
|
114
|
+
args: [{
|
|
115
|
+
isSignal: true,
|
|
116
|
+
alias: "label",
|
|
117
|
+
required: true
|
|
118
|
+
}]
|
|
119
|
+
}],
|
|
120
|
+
data: [{
|
|
121
|
+
type: i0.Input,
|
|
122
|
+
args: [{
|
|
123
|
+
isSignal: true,
|
|
124
|
+
alias: "data",
|
|
125
|
+
required: false
|
|
126
|
+
}]
|
|
127
|
+
}],
|
|
128
|
+
unit: [{
|
|
129
|
+
type: i0.Input,
|
|
130
|
+
args: [{
|
|
131
|
+
isSignal: true,
|
|
132
|
+
alias: "unit",
|
|
133
|
+
required: false
|
|
134
|
+
}]
|
|
135
|
+
}]
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
export { BarChart };
|
|
139
|
+
|
|
140
|
+
//# sourceMappingURL=tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinya-code-gas-admin-ui-bar-chart-G7sEMSBY.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/widgets/bar-chart/bar-chart.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\nexport interface BarDatum {\n label: string;\n value: number;\n}\n\n/**\n * Barras por categoría, sin librería: se dibujan con CSS y un `@for` de\n * Angular (~1 K gz frente a los 61,4 K de Chart.js — viabilidad B2.1).\n *\n * Accesibilidad (plan 3.2): la grilla es `role=\"img\"` con un `aria-label`\n * que resume los datos, de modo que un lector de pantalla no recorra cada\n * barra suelta sino que escuche «8 categorías. Mayor: …».\n */\n@Component({\n selector: 'app-bar-chart',\n template: `\n <div class=\"rounded-lg border border-neutral/20 bg-surface p-4\">\n <p class=\"mb-3 text-sm text-neutral\">{{ label() }}</p>\n\n @if (data().length === 0) {\n <p class=\"text-sm text-neutral/60\" data-testid=\"empty\">Sin datos.</p>\n } @else {\n <div role=\"img\" [attr.aria-label]=\"summary()\" class=\"flex h-32 items-end gap-2\">\n @for (row of data(); track row.label) {\n <div class=\"flex min-w-0 flex-1 flex-col items-center justify-end gap-1\">\n <span class=\"text-xs tabular-nums text-neutral\"> {{ row.value }}{{ unit() }} </span>\n <div class=\"w-full rounded-t bg-primary\" [style.height.%]=\"height(row.value)\"></div>\n <span class=\"w-full truncate text-center text-xs text-neutral\">{{ row.label }}</span>\n </div>\n }\n </div>\n }\n </div>\n `,\n})\nexport class BarChart {\n /** Título del gráfico. */\n readonly label = input.required<string>();\n /** Series a dibujar; vacío ⇒ estado «Sin datos». */\n readonly data = input<BarDatum[]>([]);\n /** Sufijo de las cifras del eje («unidades», «S/»). */\n readonly unit = input('');\n\n private readonly max = computed(() => Math.max(0, ...this.data().map((row) => row.value)));\n\n /**\n * Altura relativa de una barra. `max = 0` ⇒ 0 % (nada de división por\n * cero); un valor de 0 se queda en 0, y los demás bajan a un 2 % mínimo\n * para que la barra siga siendo visible.\n */\n protected height(value: number): number {\n if (value === 0) {\n return 0;\n }\n const max = this.max();\n if (max === 0) {\n return 0;\n }\n return Math.max(2, (value / max) * 100);\n }\n\n protected readonly summary = computed(() => {\n const rows = this.data();\n if (rows.length === 0) {\n return 'Sin datos.';\n }\n const top = rows.reduce((best, row) => (row.value > best.value ? row : best), rows[0]);\n const unit = this.unit();\n return (\n `${rows.length} categorías. Mayor: ${top.label} con ${top.value}${unit}. ` +\n `Menor: ${rows.reduce((low, row) => (row.value < low.value ? row : low), rows[0]).label}.`\n );\n });\n}\n"],"mappings":";;AAqCA,IAAa,WAAb,MAAa,SAAQ;CAEV,QAAQ,MAAM,SAAkB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEhC,OAAO,MAAkB,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAE5B,OAAO,MAAM,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAER,MAAM,eAAe,KAAK,IAAI,GAAG,GAAG,KAAK,KAAI,CAAE,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,MAAA,CAAA,+BAAA,CAAA,CAAA;CAOhF,OAAO,OAAa;EAC5B,IAAI,UAAU,GACZ,OAAO;EAET,MAAM,MAAM,KAAK,IAAG;EACpB,IAAI,QAAQ,GACV,OAAO;EAET,OAAO,KAAK,IAAI,GAAI,QAAQ,MAAO,GAAG;CACxC;CAEmB,UAAU,eAAc;EACzC,MAAM,OAAO,KAAK,KAAI;EACtB,IAAI,KAAK,WAAW,GAClB,OAAO;EAET,MAAM,MAAM,KAAK,QAAQ,MAAM,QAAS,IAAI,QAAQ,KAAK,QAAQ,MAAM,MAAO,KAAK,EAAE;EACrF,MAAM,OAAO,KAAK,KAAI;EACtB,OACE,GAAG,KAAK,OAAM,sBAAuB,IAAI,MAAK,OAAQ,IAAI,QAAQ,KAAI,WAC5D,KAAK,QAAQ,KAAK,QAAS,IAAI,QAAQ,IAAI,QAAQ,MAAM,KAAM,KAAK,EAAE,CAAC,CAAC,MAAK;CAE3F,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CArCS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAQ,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAR,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAQ,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UApBT;;;;;;;;;;;;;;;;;;;EAkBT,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAtBpB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;;;;;;;;;;;;;;;;;;;EAmBX,CAAA"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { n as FieldAria } from "./tinya-code-gas-admin-ui-field-aria-BD1Wiggc.mjs";
|
|
2
|
+
import { t as childTree } from "./tinya-code-gas-admin-ui-field-node-CIK6KNN_.mjs";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import { Component, computed, input } from "@angular/core";
|
|
5
|
+
import { FormField } from "@angular/forms/signals";
|
|
6
|
+
var FieldBoolean = class FieldBoolean {
|
|
7
|
+
field = input.required(...ngDevMode ? [{ debugName: "field" }] : /* istanbul ignore next */ []);
|
|
8
|
+
tree = input.required(...ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []);
|
|
9
|
+
node = computed(() => childTree(this.tree(), this.field().key), ...ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []);
|
|
10
|
+
state = computed(() => this.node()(), ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
|
|
11
|
+
currentLabel = computed(() => {
|
|
12
|
+
const on = this.state().value() === true;
|
|
13
|
+
const field = this.field();
|
|
14
|
+
if (on) return field.trueLabel ?? "Sí";
|
|
15
|
+
return field.falseLabel ?? "No";
|
|
16
|
+
}, ...ngDevMode ? [{ debugName: "currentLabel" }] : /* istanbul ignore next */ []);
|
|
17
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
18
|
+
minVersion: "12.0.0",
|
|
19
|
+
version: "22.2.3",
|
|
20
|
+
ngImport: i0,
|
|
21
|
+
type: FieldBoolean,
|
|
22
|
+
deps: [],
|
|
23
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
24
|
+
});
|
|
25
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
26
|
+
minVersion: "17.1.0",
|
|
27
|
+
version: "22.2.3",
|
|
28
|
+
type: FieldBoolean,
|
|
29
|
+
isStandalone: true,
|
|
30
|
+
selector: "app-field-boolean",
|
|
31
|
+
inputs: {
|
|
32
|
+
field: {
|
|
33
|
+
classPropertyName: "field",
|
|
34
|
+
publicName: "field",
|
|
35
|
+
isSignal: true,
|
|
36
|
+
isRequired: true,
|
|
37
|
+
transformFunction: null
|
|
38
|
+
},
|
|
39
|
+
tree: {
|
|
40
|
+
classPropertyName: "tree",
|
|
41
|
+
publicName: "tree",
|
|
42
|
+
isSignal: true,
|
|
43
|
+
isRequired: true,
|
|
44
|
+
transformFunction: null
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
ngImport: i0,
|
|
48
|
+
template: `
|
|
49
|
+
<label class="inline-flex cursor-pointer items-center gap-2">
|
|
50
|
+
<input type="checkbox" class="peer sr-only" [id]="state().name()" [formField]="node()" />
|
|
51
|
+
<span
|
|
52
|
+
class="relative h-5 w-9 shrink-0 rounded-full bg-neutral/30 transition-colors peer-checked:bg-primary after:absolute after:top-0.5 after:left-0.5 after:h-4 after:w-4 after:rounded-full after:bg-white after:transition-transform after:content-[''] peer-checked:after:translate-x-4"
|
|
53
|
+
></span>
|
|
54
|
+
<span class="text-sm">{{ currentLabel() }}</span>
|
|
55
|
+
</label>
|
|
56
|
+
`,
|
|
57
|
+
isInline: true,
|
|
58
|
+
dependencies: [{
|
|
59
|
+
kind: "directive",
|
|
60
|
+
type: FieldAria,
|
|
61
|
+
selector: "input[id], select[id], textarea[id], output[id]"
|
|
62
|
+
}, {
|
|
63
|
+
kind: "directive",
|
|
64
|
+
type: FormField,
|
|
65
|
+
selector: "[formField]",
|
|
66
|
+
inputs: ["formField"],
|
|
67
|
+
exportAs: ["formField"]
|
|
68
|
+
}]
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
72
|
+
minVersion: "12.0.0",
|
|
73
|
+
version: "22.2.3",
|
|
74
|
+
ngImport: i0,
|
|
75
|
+
type: FieldBoolean,
|
|
76
|
+
decorators: [{
|
|
77
|
+
type: Component,
|
|
78
|
+
args: [{
|
|
79
|
+
selector: "app-field-boolean",
|
|
80
|
+
imports: [FieldAria, FormField],
|
|
81
|
+
template: `
|
|
82
|
+
<label class="inline-flex cursor-pointer items-center gap-2">
|
|
83
|
+
<input type="checkbox" class="peer sr-only" [id]="state().name()" [formField]="node()" />
|
|
84
|
+
<span
|
|
85
|
+
class="relative h-5 w-9 shrink-0 rounded-full bg-neutral/30 transition-colors peer-checked:bg-primary after:absolute after:top-0.5 after:left-0.5 after:h-4 after:w-4 after:rounded-full after:bg-white after:transition-transform after:content-[''] peer-checked:after:translate-x-4"
|
|
86
|
+
></span>
|
|
87
|
+
<span class="text-sm">{{ currentLabel() }}</span>
|
|
88
|
+
</label>
|
|
89
|
+
`
|
|
90
|
+
}]
|
|
91
|
+
}],
|
|
92
|
+
propDecorators: {
|
|
93
|
+
field: [{
|
|
94
|
+
type: i0.Input,
|
|
95
|
+
args: [{
|
|
96
|
+
isSignal: true,
|
|
97
|
+
alias: "field",
|
|
98
|
+
required: true
|
|
99
|
+
}]
|
|
100
|
+
}],
|
|
101
|
+
tree: [{
|
|
102
|
+
type: i0.Input,
|
|
103
|
+
args: [{
|
|
104
|
+
isSignal: true,
|
|
105
|
+
alias: "tree",
|
|
106
|
+
required: true
|
|
107
|
+
}]
|
|
108
|
+
}]
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
export { FieldBoolean };
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinya-code-gas-admin-ui-boolean-B2ASKL0E.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/fields/boolean/boolean.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\nimport { FormField } from '@angular/forms/signals';\n\nimport type { BooleanField } from '../../core/models/schema.model';\nimport { FieldAria } from '../field-aria';\nimport { childTree, type RootTree } from '../field-node';\n\n/**\n * Interruptor booleano (base.md §5.1) con `trueLabel`/`falseLabel`.\n * Checkbox nativo + `formField` (se estiliza como switch con `peer-checked`).\n */\n@Component({\n selector: 'app-field-boolean',\n imports: [FieldAria, FormField],\n template: `\n <label class=\"inline-flex cursor-pointer items-center gap-2\">\n <input type=\"checkbox\" class=\"peer sr-only\" [id]=\"state().name()\" [formField]=\"node()\" />\n <span\n class=\"relative h-5 w-9 shrink-0 rounded-full bg-neutral/30 transition-colors peer-checked:bg-primary after:absolute after:top-0.5 after:left-0.5 after:h-4 after:w-4 after:rounded-full after:bg-white after:transition-transform after:content-[''] peer-checked:after:translate-x-4\"\n ></span>\n <span class=\"text-sm\">{{ currentLabel() }}</span>\n </label>\n `,\n})\nexport class FieldBoolean {\n readonly field = input.required<BooleanField>();\n readonly tree = input.required<RootTree>();\n\n protected readonly node = computed(() => childTree<boolean>(this.tree(), this.field().key));\n protected readonly state = computed(() => this.node()());\n\n protected readonly currentLabel = computed(() => {\n const on = this.state().value() === true;\n const field = this.field();\n if (on) {\n return field.trueLabel ?? 'Sí';\n }\n return field.falseLabel ?? 'No';\n });\n}\n"],"mappings":";;;;;AAwBA,IAAa,eAAb,MAAa,aAAY;CACd,QAAQ,MAAM,SAAwB,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACtC,OAAO,MAAM,SAAoB,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEvB,OAAO,eAAe,UAAmB,KAAK,KAAI,GAAI,KAAK,MAAK,CAAE,CAAC,GAAG,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CACxE,QAAQ,eAAe,KAAK,KAAI,CAAE,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAErC,eAAe,eAAc;EAC9C,MAAM,KAAK,KAAK,MAAK,CAAE,CAAC,MAAK,MAAO;EACpC,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,IACF,OAAO,MAAM,aAAa;EAE5B,OAAO,MAAM,cAAc;CAC7B,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,eAAA,CAAA,+BAAA,CAAA,CAAA;CAdS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAY,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAZ,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAY,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,UAAA;EAAA,UAVb;;;;;;;;;EAQT,UAAA;EAAA,cAAA,CAAA;GAAA,MAAA;GAAA,MATS;GAAS,UAAA;EAAA,GAAA;GAAA,MAAA;GAAA,MAAE;GAAS,UAAA;GAAA,QAAA,CAAA,WAAA;GAAA,UAAA,CAAA,WAAA;EAAA,CAAA;CAAA,CAAA;;AAWnB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAY,YAAA,CAAA;EAbxB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS,CAAC,WAAW,SAAS;GAC9B,UAAU;;;;;;;;;EASX,CAAA"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { Component, computed, input } from "@angular/core";
|
|
3
|
+
const BASE = "inline-flex cursor-pointer items-center justify-center gap-2 rounded-lg font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50";
|
|
4
|
+
const VARIANTS = {
|
|
5
|
+
primary: "bg-primary text-surface hover:bg-primary/90",
|
|
6
|
+
outline: "border border-neutral/40 bg-surface text-neutral hover:bg-neutral/10",
|
|
7
|
+
danger: "bg-danger text-surface hover:bg-danger/90",
|
|
8
|
+
ghost: "text-neutral hover:bg-neutral/10"
|
|
9
|
+
};
|
|
10
|
+
const SIZES = {
|
|
11
|
+
md: "px-4 py-2 text-sm min-h-11 lg:min-h-0",
|
|
12
|
+
sm: "px-2 py-1 text-xs min-h-11 lg:min-h-0",
|
|
13
|
+
icon: "p-1 min-h-11 min-w-11 lg:min-h-0 lg:min-w-0"
|
|
14
|
+
};
|
|
15
|
+
var Button = class Button {
|
|
16
|
+
variant = input("primary", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
|
|
17
|
+
size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
|
|
18
|
+
type = input("button", ...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
|
|
19
|
+
disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
|
|
20
|
+
loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
|
|
21
|
+
classes = computed(() => `${BASE} ${VARIANTS[this.variant()]} ${SIZES[this.size()]}`, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
|
|
22
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
23
|
+
minVersion: "12.0.0",
|
|
24
|
+
version: "22.2.3",
|
|
25
|
+
ngImport: i0,
|
|
26
|
+
type: Button,
|
|
27
|
+
deps: [],
|
|
28
|
+
target: i0.ɵɵFactoryTarget.Component
|
|
29
|
+
});
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({
|
|
31
|
+
minVersion: "17.0.0",
|
|
32
|
+
version: "22.2.3",
|
|
33
|
+
type: Button,
|
|
34
|
+
isStandalone: true,
|
|
35
|
+
selector: "button[app-button]",
|
|
36
|
+
inputs: {
|
|
37
|
+
variant: {
|
|
38
|
+
classPropertyName: "variant",
|
|
39
|
+
publicName: "variant",
|
|
40
|
+
isSignal: true,
|
|
41
|
+
isRequired: false,
|
|
42
|
+
transformFunction: null
|
|
43
|
+
},
|
|
44
|
+
size: {
|
|
45
|
+
classPropertyName: "size",
|
|
46
|
+
publicName: "size",
|
|
47
|
+
isSignal: true,
|
|
48
|
+
isRequired: false,
|
|
49
|
+
transformFunction: null
|
|
50
|
+
},
|
|
51
|
+
type: {
|
|
52
|
+
classPropertyName: "type",
|
|
53
|
+
publicName: "type",
|
|
54
|
+
isSignal: true,
|
|
55
|
+
isRequired: false,
|
|
56
|
+
transformFunction: null
|
|
57
|
+
},
|
|
58
|
+
disabled: {
|
|
59
|
+
classPropertyName: "disabled",
|
|
60
|
+
publicName: "disabled",
|
|
61
|
+
isSignal: true,
|
|
62
|
+
isRequired: false,
|
|
63
|
+
transformFunction: null
|
|
64
|
+
},
|
|
65
|
+
loading: {
|
|
66
|
+
classPropertyName: "loading",
|
|
67
|
+
publicName: "loading",
|
|
68
|
+
isSignal: true,
|
|
69
|
+
isRequired: false,
|
|
70
|
+
transformFunction: null
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
host: { properties: {
|
|
74
|
+
"class": "classes()",
|
|
75
|
+
"type": "type()",
|
|
76
|
+
"disabled": "disabled() || loading()",
|
|
77
|
+
"attr.aria-busy": "loading() || null"
|
|
78
|
+
} },
|
|
79
|
+
ngImport: i0,
|
|
80
|
+
template: `
|
|
81
|
+
@if (loading()) {
|
|
82
|
+
<span
|
|
83
|
+
class="size-4 animate-spin rounded-full border-2 border-current border-t-transparent"
|
|
84
|
+
aria-hidden="true"
|
|
85
|
+
></span>
|
|
86
|
+
}
|
|
87
|
+
<ng-content />
|
|
88
|
+
`,
|
|
89
|
+
isInline: true
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
93
|
+
minVersion: "12.0.0",
|
|
94
|
+
version: "22.2.3",
|
|
95
|
+
ngImport: i0,
|
|
96
|
+
type: Button,
|
|
97
|
+
decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{
|
|
100
|
+
selector: "button[app-button]",
|
|
101
|
+
host: {
|
|
102
|
+
"[class]": "classes()",
|
|
103
|
+
"[type]": "type()",
|
|
104
|
+
"[disabled]": "disabled() || loading()",
|
|
105
|
+
"[attr.aria-busy]": "loading() || null"
|
|
106
|
+
},
|
|
107
|
+
template: `
|
|
108
|
+
@if (loading()) {
|
|
109
|
+
<span
|
|
110
|
+
class="size-4 animate-spin rounded-full border-2 border-current border-t-transparent"
|
|
111
|
+
aria-hidden="true"
|
|
112
|
+
></span>
|
|
113
|
+
}
|
|
114
|
+
<ng-content />
|
|
115
|
+
`
|
|
116
|
+
}]
|
|
117
|
+
}],
|
|
118
|
+
propDecorators: {
|
|
119
|
+
variant: [{
|
|
120
|
+
type: i0.Input,
|
|
121
|
+
args: [{
|
|
122
|
+
isSignal: true,
|
|
123
|
+
alias: "variant",
|
|
124
|
+
required: false
|
|
125
|
+
}]
|
|
126
|
+
}],
|
|
127
|
+
size: [{
|
|
128
|
+
type: i0.Input,
|
|
129
|
+
args: [{
|
|
130
|
+
isSignal: true,
|
|
131
|
+
alias: "size",
|
|
132
|
+
required: false
|
|
133
|
+
}]
|
|
134
|
+
}],
|
|
135
|
+
type: [{
|
|
136
|
+
type: i0.Input,
|
|
137
|
+
args: [{
|
|
138
|
+
isSignal: true,
|
|
139
|
+
alias: "type",
|
|
140
|
+
required: false
|
|
141
|
+
}]
|
|
142
|
+
}],
|
|
143
|
+
disabled: [{
|
|
144
|
+
type: i0.Input,
|
|
145
|
+
args: [{
|
|
146
|
+
isSignal: true,
|
|
147
|
+
alias: "disabled",
|
|
148
|
+
required: false
|
|
149
|
+
}]
|
|
150
|
+
}],
|
|
151
|
+
loading: [{
|
|
152
|
+
type: i0.Input,
|
|
153
|
+
args: [{
|
|
154
|
+
isSignal: true,
|
|
155
|
+
alias: "loading",
|
|
156
|
+
required: false
|
|
157
|
+
}]
|
|
158
|
+
}]
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
export { Button as t };
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=tinya-code-gas-admin-ui-button-BQjNW8KB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tinya-code-gas-admin-ui-button-BQjNW8KB.mjs","names":[],"sources":["../../../projects/gas-admin-ui/src/lib/shared/components/button/button.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\nexport type ButtonVariant = 'primary' | 'outline' | 'danger' | 'ghost';\nexport type ButtonSize = 'md' | 'sm' | 'icon';\n\nconst BASE =\n 'inline-flex cursor-pointer items-center justify-center gap-2 rounded-lg font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50';\n\nconst VARIANTS: Record<ButtonVariant, string> = {\n primary: 'bg-primary text-surface hover:bg-primary/90',\n outline: 'border border-neutral/40 bg-surface text-neutral hover:bg-neutral/10',\n danger: 'bg-danger text-surface hover:bg-danger/90',\n ghost: 'text-neutral hover:bg-neutral/10',\n};\n\n/**\n * Tamaño: el padding y el tip-size viven AQUÍ, no en `BASE`. Dos botones\n * con la misma propiedad (px-4 vs px-2) los resolvería el orden del CSS\n * generado, no el código — el motivo por el que los chips del textarea\n * acabaron con `!important`.\n *\n * Mobile-first: todas arrancan en `min-h-11` (44 px, objetivo táctil de la\n * guía mobile §8.2) y en `lg` relajan al tamaño de escritorio, así el mismo\n * componente cumple la guía táctil sin engordar la UI de escritorio.\n * - `md` → botón de texto (Guardar, Cancelar…)\n * - `sm` → chips y acciones compactas (texto `xs`)\n * - `icon` → sólo glifo, cuadrado (toolbars de filas, arrastre)\n */\nconst SIZES: Record<ButtonSize, string> = {\n md: 'px-4 py-2 text-sm min-h-11 lg:min-h-0',\n sm: 'px-2 py-1 text-xs min-h-11 lg:min-h-0',\n icon: 'p-1 min-h-11 min-w-11 lg:min-h-0 lg:min-w-0',\n};\n\n/**\n * Botón nativo (selector por atributo, patrón Material `button[mat-button]`):\n * conserva semántica y estilos de `<button>` y las clases del consumidor.\n */\n@Component({\n selector: 'button[app-button]',\n host: {\n '[class]': 'classes()',\n '[type]': 'type()',\n '[disabled]': 'disabled() || loading()',\n '[attr.aria-busy]': 'loading() || null',\n },\n template: `\n @if (loading()) {\n <span\n class=\"size-4 animate-spin rounded-full border-2 border-current border-t-transparent\"\n aria-hidden=\"true\"\n ></span>\n }\n <ng-content />\n `,\n})\nexport class Button {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('md');\n readonly type = input<'button' | 'submit'>('button');\n readonly disabled = input(false);\n readonly loading = input(false);\n\n readonly classes = computed(() => `${BASE} ${VARIANTS[this.variant()]} ${SIZES[this.size()]}`);\n}\n"],"mappings":";;AAKA,MAAM,OACJ;AAEF,MAAM,WAA0C;CAC9C,SAAS;CACT,SAAS;CACT,QAAQ;CACR,OAAO;AACR;AAeD,MAAM,QAAoC;CACxC,IAAI;CACJ,IAAI;CACJ,MAAM;AACP;AAwBD,IAAa,SAAb,MAAa,OAAM;CACR,UAAU,MAAqB,WAAU,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACzC,OAAO,MAAkB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC9B,OAAO,MAA2B,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAC3C,WAAW,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACvB,UAAU,MAAM,OAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAEtB,UAAU,eAAe,GAAG,KAAI,GAAI,SAAS,KAAK,QAAO,GAAG,GAAI,MAAM,KAAK,KAAI,MAAM,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CAPnF,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAM,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAN,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAM,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,UAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,SAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,YAAA;GAAA,SAAA;GAAA,QAAA;GAAA,YAAA;GAAA,kBAAA;EAAA,EAAA;EAAA,UAAA;EAAA,UAVP;;;;;;;;;EAQT,UAAA;CAAA,CAAA;;AAEU,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAM,YAAA,CAAA;EAlBlB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,MAAM;IACJ,WAAW;IACX,UAAU;IACV,cAAc;IACd,oBAAoB;GACrB;GACD,UAAU;;;;;;;;;EASX,CAAA"}
|