@shibui-ui/ui 1.24.1 → 1.25.1
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/dist/components/atoms/index.d.ts +45 -16
- package/dist/components/atoms/index.d.ts.map +1 -1
- package/dist/components/molecules/index.d.ts +20 -1
- package/dist/components/molecules/index.d.ts.map +1 -1
- package/dist/components/organisms/index.d.ts +17 -1
- package/dist/components/organisms/index.d.ts.map +1 -1
- package/dist/index.d.ts +3 -82
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -80
- package/dist/index.js.map +1 -1
- package/dist/index10.js +82 -18
- package/dist/index10.js.map +1 -1
- package/dist/index11.js +84 -69
- package/dist/index11.js.map +1 -1
- package/dist/index12.js +40 -26
- package/dist/index12.js.map +1 -1
- package/dist/index13.js +16 -39
- package/dist/index13.js.map +1 -1
- package/dist/index14.js +29 -44
- package/dist/index14.js.map +1 -1
- package/dist/index15.js +16 -117
- package/dist/index15.js.map +1 -1
- package/dist/index16.js +48 -40
- package/dist/index16.js.map +1 -1
- package/dist/index17.js +41 -25
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +76 -49
- package/dist/index18.js.map +1 -1
- package/dist/index19.js +19 -39
- package/dist/index19.js.map +1 -1
- package/dist/index194.js +94 -24
- package/dist/index194.js.map +1 -1
- package/dist/index195.js +2 -2
- package/dist/index197.js +2 -24
- package/dist/index197.js.map +1 -1
- package/dist/index198.js +74 -2
- package/dist/index198.js.map +1 -1
- package/dist/index199.js +64 -35
- package/dist/index199.js.map +1 -1
- package/dist/index20.js +21 -41
- package/dist/index20.js.map +1 -1
- package/dist/index200.js +2 -2
- package/dist/index201.js +54 -13
- package/dist/index201.js.map +1 -1
- package/dist/index202.js +2 -2
- package/dist/index203.js +2 -2
- package/dist/index204.js +143 -157
- package/dist/index204.js.map +1 -1
- package/dist/index205.js +43 -24
- package/dist/index205.js.map +1 -1
- package/dist/index206.js +51 -2
- package/dist/index206.js.map +1 -1
- package/dist/index207.js +2 -11
- package/dist/index207.js.map +1 -1
- package/dist/index208.js +33 -2
- package/dist/index208.js.map +1 -1
- package/dist/index209.js +2 -91
- package/dist/index209.js.map +1 -1
- package/dist/index21.js +90 -26
- package/dist/index21.js.map +1 -1
- package/dist/index210.js +6 -2
- package/dist/index210.js.map +1 -1
- package/dist/index211.js +2 -41
- package/dist/index211.js.map +1 -1
- package/dist/index212.js +260 -2
- package/dist/index212.js.map +1 -1
- package/dist/index213.js +16 -5
- package/dist/index213.js.map +1 -1
- package/dist/index214.js +2 -2
- package/dist/index215.js +2 -35
- package/dist/index215.js.map +1 -1
- package/dist/index216.js +59 -42
- package/dist/index216.js.map +1 -1
- package/dist/index217.js +32 -2
- package/dist/index217.js.map +1 -1
- package/dist/index218.js +2 -85
- package/dist/index218.js.map +1 -1
- package/dist/index219.js +2 -2
- package/dist/index22.js +41 -48
- package/dist/index22.js.map +1 -1
- package/dist/index220.js +73 -65
- package/dist/index220.js.map +1 -1
- package/dist/index221.js +81 -2
- package/dist/index221.js.map +1 -1
- package/dist/index222.js +2 -10
- package/dist/index222.js.map +1 -1
- package/dist/index223.js +133 -2
- package/dist/index223.js.map +1 -1
- package/dist/index224.js +2 -26
- package/dist/index224.js.map +1 -1
- package/dist/index225.js +2 -2
- package/dist/index226.js +66 -12
- package/dist/index226.js.map +1 -1
- package/dist/index227.js +97 -2
- package/dist/index227.js.map +1 -1
- package/dist/index228.js +2 -2
- package/dist/index229.js +62 -24
- package/dist/index229.js.map +1 -1
- package/dist/index23.js +50 -94
- package/dist/index23.js.map +1 -1
- package/dist/index230.js +2 -2
- package/dist/index231.js +2 -2
- package/dist/index232.js +12 -2
- package/dist/index232.js.map +1 -1
- package/dist/index233.js +5 -16
- package/dist/index233.js.map +1 -1
- package/dist/index234.js +2 -2
- package/dist/index235.js +11 -9
- package/dist/index235.js.map +1 -1
- package/dist/index236.js +2 -2
- package/dist/index237.js +76 -34
- package/dist/index237.js.map +1 -1
- package/dist/index238.js +2 -2
- package/dist/index239.js +2 -27
- package/dist/index239.js.map +1 -1
- package/dist/index24.js +37 -34
- package/dist/index24.js.map +1 -1
- package/dist/index240.js +39 -2
- package/dist/index240.js.map +1 -1
- package/dist/index241.js +2 -34
- package/dist/index241.js.map +1 -1
- package/dist/index242.js +235 -12
- package/dist/index242.js.map +1 -1
- package/dist/index243.js +82 -2
- package/dist/index243.js.map +1 -1
- package/dist/index244.js +2 -9
- package/dist/index244.js.map +1 -1
- package/dist/index245.js +94 -2
- package/dist/index245.js.map +1 -1
- package/dist/index246.js +2 -5
- package/dist/index246.js.map +1 -1
- package/dist/index247.js +268 -2
- package/dist/index247.js.map +1 -1
- package/dist/index248.js +2 -36
- package/dist/index248.js.map +1 -1
- package/dist/index249.js +21 -2
- package/dist/index249.js.map +1 -1
- package/dist/index25.js +51 -32
- package/dist/index25.js.map +1 -1
- package/dist/index250.js +2 -31
- package/dist/index250.js.map +1 -1
- package/dist/index251.js +9 -2
- package/dist/index251.js.map +1 -1
- package/dist/index252.js +2 -19
- package/dist/index252.js.map +1 -1
- package/dist/index253.js +15 -2
- package/dist/index253.js.map +1 -1
- package/dist/index254.js +2 -2
- package/dist/index255.js +135 -69
- package/dist/index255.js.map +1 -1
- package/dist/index256.js +2 -11
- package/dist/index256.js.map +1 -1
- package/dist/index257.js +5 -2
- package/dist/index257.js.map +1 -1
- package/dist/index258.js +2 -78
- package/dist/index258.js.map +1 -1
- package/dist/index259.js +9 -2
- package/dist/index259.js.map +1 -1
- package/dist/index26.js +31 -236
- package/dist/index26.js.map +1 -1
- package/dist/index260.js +2 -32
- package/dist/index260.js.map +1 -1
- package/dist/index261.js +2 -2
- package/dist/index262.js +92 -9
- package/dist/index262.js.map +1 -1
- package/dist/index263.js +59 -2
- package/dist/index263.js.map +1 -1
- package/dist/index264.js +2 -16
- package/dist/index264.js.map +1 -1
- package/dist/index265.js +41 -2
- package/dist/index265.js.map +1 -1
- package/dist/index266.js +2 -16
- package/dist/index266.js.map +1 -1
- package/dist/index267.js +34 -9
- package/dist/index267.js.map +1 -1
- package/dist/index268.js +8 -54
- package/dist/index268.js.map +1 -1
- package/dist/index269.js +2 -2
- package/dist/index27.js +27 -58
- package/dist/index27.js.map +1 -1
- package/dist/index270.js +42 -7
- package/dist/index270.js.map +1 -1
- package/dist/index271.js +2 -2
- package/dist/index272.js +2 -34
- package/dist/index272.js.map +1 -1
- package/dist/index273.js +16 -2
- package/dist/index273.js.map +1 -1
- package/dist/index274.js +9 -2
- package/dist/index274.js.map +1 -1
- package/dist/index275.js +6 -13
- package/dist/index275.js.map +1 -1
- package/dist/index276.js +2 -2
- package/dist/index277.js +8 -15
- package/dist/index277.js.map +1 -1
- package/dist/index278.js +2 -2
- package/dist/index279.js +55 -2
- package/dist/index279.js.map +1 -1
- package/dist/index28.js +247 -24
- package/dist/index28.js.map +1 -1
- package/dist/index280.js +2 -42
- package/dist/index280.js.map +1 -1
- package/dist/index281.js +2 -100
- package/dist/index281.js.map +1 -1
- package/dist/index282.js +20 -2
- package/dist/index282.js.map +1 -1
- package/dist/index283.js +2 -97
- package/dist/index283.js.map +1 -1
- package/dist/index284.js +33 -2
- package/dist/index284.js.map +1 -1
- package/dist/index285.js +6 -27
- package/dist/index285.js.map +1 -1
- package/dist/index286.js +2 -2
- package/dist/index287.js +9 -44
- package/dist/index287.js.map +1 -1
- package/dist/index288.js +2 -2
- package/dist/index289.js +2 -33
- package/dist/index289.js.map +1 -1
- package/dist/index29.js +249 -39
- package/dist/index29.js.map +1 -1
- package/dist/index290.js +36 -2
- package/dist/index290.js.map +1 -1
- package/dist/index291.js +2 -57
- package/dist/index291.js.map +1 -1
- package/dist/index292.js +24 -2
- package/dist/index292.js.map +1 -1
- package/dist/index293.js +2 -2
- package/dist/index294.js +26 -247
- package/dist/index294.js.map +1 -1
- package/dist/index295.js +2 -2
- package/dist/index296.js +2 -72
- package/dist/index296.js.map +1 -1
- package/dist/index297.js +42 -2
- package/dist/index297.js.map +1 -1
- package/dist/index298.js +7 -56
- package/dist/index298.js.map +1 -1
- package/dist/index299.js +2 -133
- package/dist/index299.js.map +1 -1
- package/dist/index30.js +32 -19
- package/dist/index30.js.map +1 -1
- package/dist/index300.js +30 -2
- package/dist/index300.js.map +1 -1
- package/dist/index301.js +2 -12
- package/dist/index301.js.map +1 -1
- package/dist/index302.js +34 -2
- package/dist/index302.js.map +1 -1
- package/dist/index303.js +2 -162
- package/dist/index303.js.map +1 -1
- package/dist/index304.js +26 -42
- package/dist/index304.js.map +1 -1
- package/dist/index305.js +2 -81
- package/dist/index305.js.map +1 -1
- package/dist/index306.js +10 -2
- package/dist/index306.js.map +1 -1
- package/dist/index307.js +2 -71
- package/dist/index307.js.map +1 -1
- package/dist/index308.js +2 -2
- package/dist/index309.js +19 -2
- package/dist/index309.js.map +1 -1
- package/dist/index31.js +96 -11
- package/dist/index31.js.map +1 -1
- package/dist/index310.js +2 -81
- package/dist/index310.js.map +1 -1
- package/dist/index311.js +2 -2
- package/dist/index312.js +42 -2
- package/dist/index312.js.map +1 -1
- package/dist/index313.js +2 -74
- package/dist/index313.js.map +1 -1
- package/dist/index314.js +25 -67
- package/dist/index314.js.map +1 -1
- package/dist/index315.js +2 -2
- package/dist/index316.js +9 -17
- package/dist/index316.js.map +1 -1
- package/dist/index317.js +2 -2
- package/dist/index318.js +84 -32
- package/dist/index318.js.map +1 -1
- package/dist/index319.js +2 -2
- package/dist/index32.js +40 -48
- package/dist/index32.js.map +1 -1
- package/dist/index320.js +68 -77
- package/dist/index320.js.map +1 -1
- package/dist/index321.js +2 -2
- package/dist/index322.js +12 -148
- package/dist/index322.js.map +1 -1
- package/dist/index323.js +1 -1
- package/dist/index324.js +28 -6
- package/dist/index324.js.map +1 -1
- package/dist/index325.js +2 -2
- package/dist/index326.js +78 -87
- package/dist/index326.js.map +1 -1
- package/dist/index327.js +2 -2
- package/dist/index328.js +78 -2
- package/dist/index328.js.map +1 -1
- package/dist/index329.js +2 -237
- package/dist/index329.js.map +1 -1
- package/dist/index33.js +20 -56
- package/dist/index33.js.map +1 -1
- package/dist/index330.js +11 -6
- package/dist/index330.js.map +1 -1
- package/dist/index331.js +2 -2
- package/dist/index332.js +18 -59
- package/dist/index332.js.map +1 -1
- package/dist/index333.js +2 -2
- package/dist/index334.js +12 -5
- package/dist/index334.js.map +1 -1
- package/dist/index335.js +2 -2
- package/dist/index336.js +2 -15
- package/dist/index336.js.map +1 -1
- package/dist/index337.js +88 -2
- package/dist/index337.js.map +1 -1
- package/dist/index338.js +24 -2
- package/dist/index338.js.map +1 -1
- package/dist/index339.js +2 -92
- package/dist/index339.js.map +1 -1
- package/dist/index34.js +59 -35
- package/dist/index34.js.map +1 -1
- package/dist/index340.js +42 -14
- package/dist/index340.js.map +1 -1
- package/dist/index341.js +2 -2
- package/dist/index342.js +22 -80
- package/dist/index342.js.map +1 -1
- package/dist/index343.js +2 -2
- package/dist/index344.js +2 -18
- package/dist/index344.js.map +1 -1
- package/dist/index345.js +16 -2
- package/dist/index345.js.map +1 -1
- package/dist/index346.js +2 -268
- package/dist/index346.js.map +1 -1
- package/dist/index347.js +176 -2
- package/dist/index347.js.map +1 -1
- package/dist/index348.js +2 -2
- package/dist/index349.js +35 -39
- package/dist/index349.js.map +1 -1
- package/dist/index35.js +101 -28
- package/dist/index35.js.map +1 -1
- package/dist/index350.js +3 -3
- package/dist/index350.js.map +1 -1
- package/dist/index351.js +2 -2
- package/dist/index352.js +19 -26
- package/dist/index352.js.map +1 -1
- package/dist/index357.js +26 -19
- package/dist/index357.js.map +1 -1
- package/dist/index36.js +115 -33
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +41 -115
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +34 -246
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +30 -137
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +26 -84
- package/dist/index4.js.map +1 -1
- package/dist/index40.js +26 -400
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +28 -77
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +23 -26
- package/dist/index42.js.map +1 -1
- package/dist/index43.js +36 -33
- package/dist/index43.js.map +1 -1
- package/dist/index44.js +62 -16
- package/dist/index44.js.map +1 -1
- package/dist/index45.js +138 -21
- package/dist/index45.js.map +1 -1
- package/dist/index46.js +129 -22
- package/dist/index46.js.map +1 -1
- package/dist/index47.js +41 -19
- package/dist/index47.js.map +1 -1
- package/dist/index48.js +11 -82
- package/dist/index48.js.map +1 -1
- package/dist/index49.js +56 -279
- package/dist/index49.js.map +1 -1
- package/dist/index5.js +21 -34
- package/dist/index5.js.map +1 -1
- package/dist/index50.js +280 -33
- package/dist/index50.js.map +1 -1
- package/dist/index51.js +74 -94
- package/dist/index51.js.map +1 -1
- package/dist/index52.js +66 -41
- package/dist/index52.js.map +1 -1
- package/dist/index53.js +333 -62
- package/dist/index53.js.map +1 -1
- package/dist/index54.js +96 -256
- package/dist/index54.js.map +1 -1
- package/dist/index55.js +38 -130
- package/dist/index55.js.map +1 -1
- package/dist/index56.js +251 -50
- package/dist/index56.js.map +1 -1
- package/dist/index57.js +144 -115
- package/dist/index57.js.map +1 -1
- package/dist/index58.js +93 -183
- package/dist/index58.js.map +1 -1
- package/dist/index59.js +33 -339
- package/dist/index59.js.map +1 -1
- package/dist/index6.js +2 -2
- package/dist/index60.js +102 -66
- package/dist/index60.js.map +1 -1
- package/dist/index61.js +73 -179
- package/dist/index61.js.map +1 -1
- package/dist/index62.js +117 -97
- package/dist/index62.js.map +1 -1
- package/dist/index63.js +113 -263
- package/dist/index63.js.map +1 -1
- package/dist/index64.js +258 -251
- package/dist/index64.js.map +1 -1
- package/dist/index65.js +177 -79
- package/dist/index65.js.map +1 -1
- package/dist/index66.js +261 -140
- package/dist/index66.js.map +1 -1
- package/dist/index67.js +183 -100
- package/dist/index67.js.map +1 -1
- package/dist/index68.js +28 -89
- package/dist/index68.js.map +1 -1
- package/dist/index69.js +20 -161
- package/dist/index69.js.map +1 -1
- package/dist/index7.js +394 -32
- package/dist/index7.js.map +1 -1
- package/dist/index70.js +190 -53
- package/dist/index70.js.map +1 -1
- package/dist/index71.js +204 -112
- package/dist/index71.js.map +1 -1
- package/dist/index72.js +2 -2
- package/dist/index73.js +89 -28
- package/dist/index73.js.map +1 -1
- package/dist/index74.js +126 -63
- package/dist/index74.js.map +1 -1
- package/dist/index75.js +122 -111
- package/dist/index75.js.map +1 -1
- package/dist/index76.js +67 -64
- package/dist/index76.js.map +1 -1
- package/dist/index77.js +112 -88
- package/dist/index77.js.map +1 -1
- package/dist/index78.js +87 -16
- package/dist/index78.js.map +1 -1
- package/dist/index79.js +151 -79
- package/dist/index79.js.map +1 -1
- package/dist/index8.js +25 -127
- package/dist/index8.js.map +1 -1
- package/dist/index80.js +104 -186
- package/dist/index80.js.map +1 -1
- package/dist/index81.js +59 -20
- package/dist/index81.js.map +1 -1
- package/dist/index82.js +17 -129
- package/dist/index82.js.map +1 -1
- package/dist/index83.js +88 -217
- package/dist/index83.js.map +1 -1
- package/dist/index84.js +64 -112
- package/dist/index84.js.map +1 -1
- package/dist/index9.js +30 -45
- package/dist/index9.js.map +1 -1
- package/dist/src/components/atoms/index.d.ts +45 -16
- package/dist/src/components/atoms/index.d.ts.map +1 -1
- package/dist/src/components/molecules/index.d.ts +20 -1
- package/dist/src/components/molecules/index.d.ts.map +1 -1
- package/dist/src/components/organisms/index.d.ts +17 -1
- package/dist/src/components/organisms/index.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -82
- package/dist/src/index.d.ts.map +1 -1
- package/dist/tokens.css +353 -7
- package/dist/vite.config.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index64.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { unsafeCSS, css, LitElement
|
|
2
|
-
import { property, customElement } from "lit/decorators.js";
|
|
3
|
-
import
|
|
1
|
+
import { unsafeCSS, css, LitElement } from "lit";
|
|
2
|
+
import { property, state, customElement } from "lit/decorators.js";
|
|
3
|
+
import { selectTemplate } from "./index227.js";
|
|
4
|
+
import selectCss from "./index228.js";
|
|
4
5
|
import sharedTokens from "./index196.js";
|
|
5
|
-
import { buttonGroupTemplate, buttonSplitTemplate } from "./index313.js";
|
|
6
|
-
import "./index23.js";
|
|
7
6
|
var __defProp = Object.defineProperty;
|
|
8
7
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
8
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -14,299 +13,307 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
14
13
|
if (kind && result) __defProp(target, key, result);
|
|
15
14
|
return result;
|
|
16
15
|
};
|
|
17
|
-
let
|
|
16
|
+
let LibSelect = class extends LitElement {
|
|
18
17
|
constructor() {
|
|
19
18
|
super(...arguments);
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
24
|
-
this.
|
|
19
|
+
this.label = "";
|
|
20
|
+
this.placeholder = "Selecciona una opción";
|
|
21
|
+
this.hint = "";
|
|
22
|
+
this.errorMessage = "";
|
|
23
|
+
this.required = false;
|
|
24
|
+
this.optional = false;
|
|
25
|
+
this.open = false;
|
|
26
|
+
this.disabled = false;
|
|
27
|
+
this.error = false;
|
|
25
28
|
this.dark = false;
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
29
|
+
this.size = "md";
|
|
30
|
+
this.variant = "default";
|
|
31
|
+
this.value = "";
|
|
32
|
+
this.multi = false;
|
|
33
|
+
this.searchable = false;
|
|
34
|
+
this._selectedLabel = "";
|
|
35
|
+
this._selectedValues = [];
|
|
36
|
+
this._selectedLabels = [];
|
|
37
|
+
this._searchQuery = "";
|
|
38
|
+
this._visibleCount = 0;
|
|
39
|
+
this._handleOutsideClick = (e) => {
|
|
40
|
+
if (this.open && !e.composedPath().includes(this)) {
|
|
41
|
+
this._close();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
this._handleKeyDown = (e) => {
|
|
45
|
+
if (e.key === "Escape" && this.open) {
|
|
46
|
+
this._close();
|
|
43
47
|
}
|
|
44
|
-
this._emitChange();
|
|
45
48
|
};
|
|
46
49
|
}
|
|
47
|
-
|
|
50
|
+
connectedCallback() {
|
|
51
|
+
super.connectedCallback();
|
|
52
|
+
document.addEventListener("click", this._handleOutsideClick);
|
|
53
|
+
document.addEventListener("keydown", this._handleKeyDown, true);
|
|
54
|
+
this.addEventListener("option-selected", this._handleOptionSelected);
|
|
55
|
+
}
|
|
56
|
+
disconnectedCallback() {
|
|
57
|
+
super.disconnectedCallback();
|
|
58
|
+
document.removeEventListener("click", this._handleOutsideClick);
|
|
59
|
+
document.removeEventListener("keydown", this._handleKeyDown, true);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Reacts to external value changes.
|
|
63
|
+
* Syncs _selectedLabel by inspecting slotted options.
|
|
64
|
+
*/
|
|
65
|
+
updated(changed) {
|
|
66
|
+
super.updated(changed);
|
|
67
|
+
if (changed.has("value") && this.value) {
|
|
68
|
+
this._syncSingleFromValue();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/* ─────────────────────────────────────────────────────────
|
|
72
|
+
PUBLIC API
|
|
73
|
+
───────────────────────────────────────────────────────── */
|
|
74
|
+
/** Opens the dropdown panel. */
|
|
75
|
+
openPanel() {
|
|
76
|
+
if (!this.disabled) this._open();
|
|
77
|
+
}
|
|
78
|
+
/** Closes the dropdown panel. */
|
|
79
|
+
closePanel() {
|
|
80
|
+
this._close();
|
|
81
|
+
}
|
|
82
|
+
/** Clears current selection. */
|
|
83
|
+
clear() {
|
|
84
|
+
this.value = "";
|
|
85
|
+
this._selectedLabel = "";
|
|
86
|
+
this._selectedValues = [];
|
|
87
|
+
this._selectedLabels = [];
|
|
88
|
+
this._syncOptionStates();
|
|
89
|
+
}
|
|
90
|
+
/* ─────────────────────────────────────────────────────────
|
|
91
|
+
RENDER
|
|
92
|
+
───────────────────────────────────────────────────────── */
|
|
48
93
|
render() {
|
|
49
|
-
return
|
|
94
|
+
return selectTemplate({
|
|
95
|
+
label: this.label,
|
|
96
|
+
placeholder: this.placeholder,
|
|
97
|
+
hint: this.hint,
|
|
98
|
+
errorMessage: this.errorMessage,
|
|
99
|
+
required: this.required,
|
|
100
|
+
optional: this.optional,
|
|
101
|
+
open: this.open,
|
|
102
|
+
disabled: this.disabled,
|
|
103
|
+
error: this.error,
|
|
104
|
+
dark: this.dark,
|
|
105
|
+
size: this.size,
|
|
106
|
+
variant: this.variant,
|
|
107
|
+
selectedLabel: this._selectedLabel,
|
|
108
|
+
hasSelection: !!this._selectedLabel,
|
|
109
|
+
multi: this.multi,
|
|
110
|
+
selectedCount: this._selectedValues.length,
|
|
111
|
+
searchable: this.searchable,
|
|
112
|
+
searchQuery: this._searchQuery,
|
|
113
|
+
visibleCount: this._visibleCount,
|
|
114
|
+
onTriggerClick: this._handleTriggerClick.bind(this),
|
|
115
|
+
onSearchInput: this._handleSearchInput.bind(this),
|
|
116
|
+
onConfirm: this._handleConfirm.bind(this)
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/* ─────────────────────────────────────────────────────────
|
|
120
|
+
PRIVATE METHODS
|
|
121
|
+
───────────────────────────────────────────────────────── */
|
|
122
|
+
_open() {
|
|
123
|
+
this.open = true;
|
|
124
|
+
this._updateVisibleCount();
|
|
125
|
+
this.dispatchEvent(new CustomEvent("ui-lib-select-open", {
|
|
126
|
+
bubbles: true,
|
|
127
|
+
composed: true
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
_close() {
|
|
131
|
+
this.open = false;
|
|
132
|
+
this._searchQuery = "";
|
|
133
|
+
this._showAllOptions();
|
|
134
|
+
this.dispatchEvent(new CustomEvent("ui-lib-select-close", {
|
|
135
|
+
bubbles: true,
|
|
136
|
+
composed: true
|
|
137
|
+
}));
|
|
50
138
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (
|
|
55
|
-
|
|
139
|
+
_handleTriggerClick(e) {
|
|
140
|
+
e.stopPropagation();
|
|
141
|
+
if (this.disabled) return;
|
|
142
|
+
if (this.open) {
|
|
143
|
+
this._close();
|
|
144
|
+
} else {
|
|
145
|
+
this._open();
|
|
56
146
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
147
|
+
}
|
|
148
|
+
_handleOptionSelected(e) {
|
|
149
|
+
const custom = e;
|
|
150
|
+
const { value, label } = custom.detail;
|
|
151
|
+
if (this.multi) {
|
|
152
|
+
this._toggleMultiValue(value, label);
|
|
153
|
+
} else {
|
|
154
|
+
this._selectSingle(value, label);
|
|
155
|
+
this._close();
|
|
60
156
|
}
|
|
61
157
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
158
|
+
_selectSingle(value, label) {
|
|
159
|
+
this.value = value;
|
|
160
|
+
this._selectedLabel = label;
|
|
161
|
+
this._syncOptionStates();
|
|
162
|
+
this.dispatchEvent(new CustomEvent("ui-lib-select-change", {
|
|
163
|
+
detail: { value, label },
|
|
164
|
+
bubbles: true,
|
|
165
|
+
composed: true
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
_toggleMultiValue(value, label) {
|
|
169
|
+
const idx = this._selectedValues.indexOf(value);
|
|
170
|
+
if (idx === -1) {
|
|
171
|
+
this._selectedValues = [...this._selectedValues, value];
|
|
172
|
+
this._selectedLabels = [...this._selectedLabels, label];
|
|
173
|
+
} else {
|
|
174
|
+
this._selectedValues = this._selectedValues.filter((_, i) => i !== idx);
|
|
175
|
+
this._selectedLabels = this._selectedLabels.filter((_, i) => i !== idx);
|
|
66
176
|
}
|
|
177
|
+
this._syncOptionStates();
|
|
178
|
+
}
|
|
179
|
+
_handleConfirm() {
|
|
180
|
+
this.dispatchEvent(new CustomEvent("ui-lib-select-multi-change", {
|
|
181
|
+
detail: {
|
|
182
|
+
values: [...this._selectedValues],
|
|
183
|
+
labels: [...this._selectedLabels]
|
|
184
|
+
},
|
|
185
|
+
bubbles: true,
|
|
186
|
+
composed: true
|
|
187
|
+
}));
|
|
188
|
+
this._close();
|
|
67
189
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
190
|
+
_handleSearchInput(e) {
|
|
191
|
+
const input = e.target;
|
|
192
|
+
this._searchQuery = input.value;
|
|
193
|
+
this._filterOptions(this._searchQuery);
|
|
71
194
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const
|
|
75
|
-
|
|
195
|
+
/** Filters slotted lib-select-option elements by text match. */
|
|
196
|
+
_filterOptions(query) {
|
|
197
|
+
const options = Array.from(
|
|
198
|
+
this.querySelectorAll("lib-select-option")
|
|
76
199
|
);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
} else {
|
|
85
|
-
btn.setAttribute("group-pos", "middle");
|
|
86
|
-
}
|
|
87
|
-
if (this.shape !== "flat") {
|
|
88
|
-
btn.setAttribute("group-shape", this.shape);
|
|
89
|
-
} else {
|
|
90
|
-
btn.removeAttribute("group-shape");
|
|
91
|
-
}
|
|
92
|
-
if (this.orientation === "vertical") {
|
|
93
|
-
btn.setAttribute("group-vertical", "");
|
|
94
|
-
} else {
|
|
95
|
-
btn.removeAttribute("group-vertical");
|
|
96
|
-
}
|
|
97
|
-
if (this.dark) {
|
|
98
|
-
btn.setAttribute("dark", "");
|
|
99
|
-
} else {
|
|
100
|
-
btn.removeAttribute("dark");
|
|
101
|
-
}
|
|
102
|
-
if (this.size) {
|
|
103
|
-
btn.setAttribute("size", this.size);
|
|
104
|
-
}
|
|
105
|
-
if (this.kintsugi && i > 0) {
|
|
106
|
-
btn.setAttribute("kintsugi", "");
|
|
107
|
-
} else {
|
|
108
|
-
btn.removeAttribute("kintsugi");
|
|
109
|
-
}
|
|
200
|
+
const q = query.toLowerCase().trim();
|
|
201
|
+
let visible = 0;
|
|
202
|
+
options.forEach((opt) => {
|
|
203
|
+
const text = (opt.textContent ?? "").toLowerCase();
|
|
204
|
+
const match = !q || text.includes(q);
|
|
205
|
+
opt.toggleAttribute("search-hidden", !match);
|
|
206
|
+
if (match) visible++;
|
|
110
207
|
});
|
|
208
|
+
this._visibleCount = visible;
|
|
209
|
+
}
|
|
210
|
+
_showAllOptions() {
|
|
211
|
+
const options = Array.from(this.querySelectorAll("lib-select-option"));
|
|
212
|
+
options.forEach((opt) => opt.removeAttribute("search-hidden"));
|
|
213
|
+
this._updateVisibleCount();
|
|
214
|
+
}
|
|
215
|
+
_updateVisibleCount() {
|
|
216
|
+
const options = this.querySelectorAll("lib-select-option:not([search-hidden])");
|
|
217
|
+
this._visibleCount = options.length;
|
|
218
|
+
}
|
|
219
|
+
/** Syncs selected/unselected state on all slotted option elements. */
|
|
220
|
+
_syncOptionStates() {
|
|
221
|
+
const options = Array.from(this.querySelectorAll("lib-select-option"));
|
|
222
|
+
if (this.multi) {
|
|
223
|
+
options.forEach((opt) => {
|
|
224
|
+
opt.selected = this._selectedValues.includes(opt.value ?? "");
|
|
225
|
+
});
|
|
226
|
+
} else {
|
|
227
|
+
options.forEach((opt) => {
|
|
228
|
+
opt.selected = opt.value === this.value;
|
|
229
|
+
});
|
|
230
|
+
}
|
|
111
231
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const activeIndex = [];
|
|
116
|
-
btns.forEach((btn, i) => {
|
|
232
|
+
/** Called when `value` prop changes externally — syncs label from slotted options. */
|
|
233
|
+
_syncSingleFromValue() {
|
|
234
|
+
setTimeout(() => {
|
|
117
235
|
var _a;
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
236
|
+
const options = Array.from(
|
|
237
|
+
this.querySelectorAll("lib-select-option")
|
|
238
|
+
);
|
|
239
|
+
const match = options.find((opt) => opt.value === this.value);
|
|
240
|
+
if (match) {
|
|
241
|
+
this._selectedLabel = ((_a = match.textContent) == null ? void 0 : _a.trim()) ?? "";
|
|
242
|
+
options.forEach((opt) => {
|
|
243
|
+
opt.selected = opt === match;
|
|
244
|
+
});
|
|
121
245
|
}
|
|
122
|
-
});
|
|
123
|
-
this.dispatchEvent(new CustomEvent("ui-lib-group-change", {
|
|
124
|
-
detail: { active, activeIndex },
|
|
125
|
-
bubbles: true,
|
|
126
|
-
composed: true
|
|
127
|
-
}));
|
|
246
|
+
}, 0);
|
|
128
247
|
}
|
|
129
248
|
};
|
|
130
|
-
|
|
249
|
+
LibSelect.styles = [
|
|
131
250
|
css`${unsafeCSS(sharedTokens)}`,
|
|
132
|
-
css`${unsafeCSS(
|
|
251
|
+
css`${unsafeCSS(selectCss)}`
|
|
133
252
|
];
|
|
134
253
|
__decorateClass([
|
|
135
|
-
property({ type: String
|
|
136
|
-
],
|
|
254
|
+
property({ type: String })
|
|
255
|
+
], LibSelect.prototype, "label", 2);
|
|
137
256
|
__decorateClass([
|
|
138
|
-
property({ type: String
|
|
139
|
-
],
|
|
257
|
+
property({ type: String })
|
|
258
|
+
], LibSelect.prototype, "placeholder", 2);
|
|
140
259
|
__decorateClass([
|
|
141
|
-
property({ type:
|
|
142
|
-
],
|
|
260
|
+
property({ type: String })
|
|
261
|
+
], LibSelect.prototype, "hint", 2);
|
|
262
|
+
__decorateClass([
|
|
263
|
+
property({ type: String, attribute: "error-message" })
|
|
264
|
+
], LibSelect.prototype, "errorMessage", 2);
|
|
143
265
|
__decorateClass([
|
|
144
266
|
property({ type: Boolean, reflect: true })
|
|
145
|
-
],
|
|
267
|
+
], LibSelect.prototype, "required", 2);
|
|
146
268
|
__decorateClass([
|
|
147
269
|
property({ type: Boolean, reflect: true })
|
|
148
|
-
],
|
|
270
|
+
], LibSelect.prototype, "optional", 2);
|
|
149
271
|
__decorateClass([
|
|
150
272
|
property({ type: Boolean, reflect: true })
|
|
151
|
-
],
|
|
273
|
+
], LibSelect.prototype, "open", 2);
|
|
152
274
|
__decorateClass([
|
|
153
275
|
property({ type: Boolean, reflect: true })
|
|
154
|
-
],
|
|
276
|
+
], LibSelect.prototype, "disabled", 2);
|
|
155
277
|
__decorateClass([
|
|
156
|
-
property({ type:
|
|
157
|
-
],
|
|
158
|
-
LibButtonGroup = __decorateClass([
|
|
159
|
-
customElement("lib-button-group")
|
|
160
|
-
], LibButtonGroup);
|
|
161
|
-
let LibButtonSep = class extends LitElement {
|
|
162
|
-
constructor() {
|
|
163
|
-
super(...arguments);
|
|
164
|
-
this.dark = false;
|
|
165
|
-
}
|
|
166
|
-
render() {
|
|
167
|
-
const color = this.dark ? "rgba(255,255,255,0.1)" : "var(--border-default)";
|
|
168
|
-
return html`<div style="width:1px;align-self:stretch;background:${color};flex-shrink:0;z-index:1;"></div>`;
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
LibButtonSep.styles = [
|
|
172
|
-
css`${unsafeCSS(sharedTokens)}`,
|
|
173
|
-
css`${unsafeCSS(groupCss)}`
|
|
174
|
-
];
|
|
278
|
+
property({ type: Boolean, reflect: true })
|
|
279
|
+
], LibSelect.prototype, "error", 2);
|
|
175
280
|
__decorateClass([
|
|
176
281
|
property({ type: Boolean, reflect: true })
|
|
177
|
-
],
|
|
178
|
-
LibButtonSep = __decorateClass([
|
|
179
|
-
customElement("lib-button-sep")
|
|
180
|
-
], LibButtonSep);
|
|
181
|
-
let LibButtonSplit = class extends LitElement {
|
|
182
|
-
constructor() {
|
|
183
|
-
super(...arguments);
|
|
184
|
-
this.variant = "primary";
|
|
185
|
-
this.size = "md";
|
|
186
|
-
this.dark = false;
|
|
187
|
-
this.disabled = false;
|
|
188
|
-
this.label = "";
|
|
189
|
-
this.items = "";
|
|
190
|
-
this._open = false;
|
|
191
|
-
this._onDocClick = (e) => {
|
|
192
|
-
var _a;
|
|
193
|
-
if (!this._open) return;
|
|
194
|
-
if (!this.contains(e.target) && !(((_a = this.shadowRoot) == null ? void 0 : _a.contains(e.target)) ?? false)) {
|
|
195
|
-
this._open = false;
|
|
196
|
-
this.requestUpdate();
|
|
197
|
-
}
|
|
198
|
-
};
|
|
199
|
-
this._onKeyDown = (e) => {
|
|
200
|
-
if (e.key === "Escape" && this._open) {
|
|
201
|
-
this._open = false;
|
|
202
|
-
this.requestUpdate();
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
connectedCallback() {
|
|
207
|
-
super.connectedCallback();
|
|
208
|
-
document.addEventListener("click", this._onDocClick);
|
|
209
|
-
document.addEventListener("keydown", this._onKeyDown);
|
|
210
|
-
}
|
|
211
|
-
disconnectedCallback() {
|
|
212
|
-
super.disconnectedCallback();
|
|
213
|
-
document.removeEventListener("click", this._onDocClick);
|
|
214
|
-
document.removeEventListener("keydown", this._onKeyDown);
|
|
215
|
-
}
|
|
216
|
-
render() {
|
|
217
|
-
let parsedItems = [];
|
|
218
|
-
if (this.items) {
|
|
219
|
-
try {
|
|
220
|
-
parsedItems = JSON.parse(this.items);
|
|
221
|
-
} catch {
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
return buttonSplitTemplate({
|
|
225
|
-
label: this.label,
|
|
226
|
-
variant: this.variant,
|
|
227
|
-
size: this.size,
|
|
228
|
-
dark: this.dark,
|
|
229
|
-
disabled: this.disabled,
|
|
230
|
-
menuOpen: this._open,
|
|
231
|
-
items: parsedItems,
|
|
232
|
-
onMainClick: (e) => this._onMainClick(e),
|
|
233
|
-
onArrowClick: (e) => this._onArrowClick(e)
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
_onMainClick(e) {
|
|
237
|
-
this.dispatchEvent(new CustomEvent("ui-lib-split-action", {
|
|
238
|
-
detail: { originalEvent: e },
|
|
239
|
-
bubbles: true,
|
|
240
|
-
composed: true
|
|
241
|
-
}));
|
|
242
|
-
}
|
|
243
|
-
_onArrowClick(e) {
|
|
244
|
-
e.stopPropagation();
|
|
245
|
-
this._open = !this._open;
|
|
246
|
-
this.requestUpdate();
|
|
247
|
-
if (this._open) {
|
|
248
|
-
setTimeout(() => {
|
|
249
|
-
var _a;
|
|
250
|
-
const menu = (_a = this.shadowRoot) == null ? void 0 : _a.querySelector(".split-menu");
|
|
251
|
-
if (!menu) return;
|
|
252
|
-
menu.querySelectorAll(".split-menu-item").forEach((item) => {
|
|
253
|
-
item.addEventListener("click", (ev) => {
|
|
254
|
-
var _a2;
|
|
255
|
-
ev.stopPropagation();
|
|
256
|
-
this._open = false;
|
|
257
|
-
this.requestUpdate();
|
|
258
|
-
this.dispatchEvent(new CustomEvent("ui-lib-split-select", {
|
|
259
|
-
detail: {
|
|
260
|
-
value: item.dataset["value"] ?? "",
|
|
261
|
-
label: ((_a2 = item.textContent) == null ? void 0 : _a2.trim()) ?? ""
|
|
262
|
-
},
|
|
263
|
-
bubbles: true,
|
|
264
|
-
composed: true
|
|
265
|
-
}));
|
|
266
|
-
}, { once: true });
|
|
267
|
-
});
|
|
268
|
-
const slottedMenu = menu.querySelector('slot[name="menu"]');
|
|
269
|
-
if (slottedMenu) {
|
|
270
|
-
slottedMenu.assignedElements().forEach((el) => {
|
|
271
|
-
el.addEventListener("click", (ev) => {
|
|
272
|
-
ev.stopPropagation();
|
|
273
|
-
this._open = false;
|
|
274
|
-
this.requestUpdate();
|
|
275
|
-
}, { once: true });
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
}, 0);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
};
|
|
282
|
-
LibButtonSplit.styles = [
|
|
283
|
-
css`${unsafeCSS(sharedTokens)}`,
|
|
284
|
-
css`${unsafeCSS(groupCss)}`
|
|
285
|
-
];
|
|
282
|
+
], LibSelect.prototype, "dark", 2);
|
|
286
283
|
__decorateClass([
|
|
287
284
|
property({ type: String, reflect: true })
|
|
288
|
-
],
|
|
285
|
+
], LibSelect.prototype, "size", 2);
|
|
289
286
|
__decorateClass([
|
|
290
287
|
property({ type: String, reflect: true })
|
|
291
|
-
],
|
|
288
|
+
], LibSelect.prototype, "variant", 2);
|
|
289
|
+
__decorateClass([
|
|
290
|
+
property({ type: String })
|
|
291
|
+
], LibSelect.prototype, "value", 2);
|
|
292
292
|
__decorateClass([
|
|
293
293
|
property({ type: Boolean, reflect: true })
|
|
294
|
-
],
|
|
294
|
+
], LibSelect.prototype, "multi", 2);
|
|
295
295
|
__decorateClass([
|
|
296
296
|
property({ type: Boolean, reflect: true })
|
|
297
|
-
],
|
|
297
|
+
], LibSelect.prototype, "searchable", 2);
|
|
298
298
|
__decorateClass([
|
|
299
|
-
|
|
300
|
-
],
|
|
299
|
+
state()
|
|
300
|
+
], LibSelect.prototype, "_selectedLabel", 2);
|
|
301
301
|
__decorateClass([
|
|
302
|
-
|
|
303
|
-
],
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
],
|
|
302
|
+
state()
|
|
303
|
+
], LibSelect.prototype, "_selectedValues", 2);
|
|
304
|
+
__decorateClass([
|
|
305
|
+
state()
|
|
306
|
+
], LibSelect.prototype, "_selectedLabels", 2);
|
|
307
|
+
__decorateClass([
|
|
308
|
+
state()
|
|
309
|
+
], LibSelect.prototype, "_searchQuery", 2);
|
|
310
|
+
__decorateClass([
|
|
311
|
+
state()
|
|
312
|
+
], LibSelect.prototype, "_visibleCount", 2);
|
|
313
|
+
LibSelect = __decorateClass([
|
|
314
|
+
customElement("lib-select")
|
|
315
|
+
], LibSelect);
|
|
307
316
|
export {
|
|
308
|
-
|
|
309
|
-
LibButtonSep,
|
|
310
|
-
LibButtonSplit
|
|
317
|
+
LibSelect
|
|
311
318
|
};
|
|
312
319
|
//# sourceMappingURL=index64.js.map
|
package/dist/index64.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index64.js","sources":["../src/components/molecules/button-group/lib-button-group.component.ts"],"sourcesContent":["import { LitElement, css, unsafeCSS, TemplateResult, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { LibVariant, LibSize } from '../../../types';\nimport groupCss from './lib-button-group.css?inline';\nimport sharedTokens from '../../../styles/shared/tokens.css?inline';\nimport { buttonGroupTemplate, buttonSplitTemplate } from './lib-button-group.html';\nimport type { ButtonGroupShape, ButtonGroupOrientation, SplitMenuItem } from './lib-button-group.types';\nimport type { LibButton } from '../../atoms/button/lib-button.component';\n\n/* Registro del elemento lib-button (side-effect) */\nimport '../../atoms/button/lib-button.component';\n\n/* ══════════════════════════════════════════════════════════════\n LIB-BUTTON-GROUP\n ══════════════════════════════════════════════════════════════\n Wrapper que agrupa lib-button en una unidad visual:\n · Colapsa bordes internos (margin-left: -1px)\n · Propaga shape, size, dark, kintsugi a cada hijo\n · Toggle single / multi con estado [active]\n · Separadores lib-button-sep reconocidos automáticamente\n\n @fires ui-lib-group-change — {detail: {active: string[], activeIndex: number[]}}\n*/\n@customElement('lib-button-group')\nexport class LibButtonGroup extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(groupCss)}`,\n ];\n\n /** Forma de los extremos del grupo */\n @property({ type: String, reflect: true })\n shape: ButtonGroupShape = 'flat';\n\n /** Orientación del grupo */\n @property({ type: String, reflect: true })\n orientation: ButtonGroupOrientation = 'horizontal';\n\n /** Ancho completo */\n @property({ type: Boolean, reflect: true })\n block = false;\n\n /** Activa comportamiento toggle (click activa/desactiva) */\n @property({ type: Boolean, reflect: true })\n toggle = false;\n\n /** Permite selección múltiple (requiere toggle=true) */\n @property({ type: Boolean, reflect: true })\n multi = false;\n\n /** Propaga dark a todos los lib-button hijos */\n @property({ type: Boolean, reflect: true })\n dark = false;\n\n /** Propaga kintsugi a botones accent/kaki adyacentes */\n @property({ type: Boolean, reflect: true })\n kintsugi = false;\n\n /** Tamaño propagado a todos los hijos */\n @property({ type: String, reflect: true })\n size: LibSize | '' = '';\n\n /* ── Lifecycle ── */\n\n protected override render(): TemplateResult {\n return buttonGroupTemplate();\n }\n\n override firstUpdated(): void {\n const slot = this.shadowRoot?.querySelector('slot');\n if (slot) {\n slot.addEventListener('slotchange', (): void => this._updateChildren());\n }\n this._updateChildren();\n\n if (this.toggle) {\n this.addEventListener('click', this._handleToggleClick);\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this.toggle) {\n this.removeEventListener('click', this._handleToggleClick);\n }\n }\n\n /* ── Children management ── */\n\n private _getButtons(): LibButton[] {\n return Array.from(this.querySelectorAll<LibButton>('lib-button'));\n }\n\n private _updateChildren(): void {\n const all = Array.from(this.children) as Element[];\n\n /* Solo lib-button para posicionamiento — ignorar lib-button-sep */\n const btns = all.filter((el): el is LibButton =>\n el.tagName.toLowerCase() === 'lib-button'\n );\n\n btns.forEach((btn: LibButton, i: number): void => {\n /* Position */\n if (btns.length === 1) {\n btn.removeAttribute('group-pos');\n } else if (i === 0) {\n btn.setAttribute('group-pos', 'first');\n } else if (i === btns.length - 1) {\n btn.setAttribute('group-pos', 'last');\n } else {\n btn.setAttribute('group-pos', 'middle');\n }\n\n /* Shape */\n if (this.shape !== 'flat') {\n btn.setAttribute('group-shape', this.shape);\n } else {\n btn.removeAttribute('group-shape');\n }\n\n /* Vertical */\n if (this.orientation === 'vertical') {\n btn.setAttribute('group-vertical', '');\n } else {\n btn.removeAttribute('group-vertical');\n }\n\n /* Dark */\n if (this.dark) {\n btn.setAttribute('dark', '');\n } else {\n btn.removeAttribute('dark');\n }\n\n /* Size */\n if (this.size) {\n btn.setAttribute('size', this.size);\n }\n\n /* Kintsugi — solo middle y last */\n if (this.kintsugi && i > 0) {\n btn.setAttribute('kintsugi', '');\n } else {\n btn.removeAttribute('kintsugi');\n }\n });\n }\n\n /* ── Toggle logic ── */\n\n private _handleToggleClick = (e: Event): void => {\n const target = (e.target as Element).closest('lib-button') as LibButton | null;\n if (!target || target.hasAttribute('disabled')) return;\n\n if (this.multi) {\n /* Multi: toggle individual */\n const isActive = target.hasAttribute('active');\n if (isActive) {\n target.removeAttribute('active');\n } else {\n target.setAttribute('active', '');\n }\n } else {\n /* Single: solo uno activo */\n this._getButtons().forEach((btn: LibButton): void => {\n btn.removeAttribute('active');\n });\n target.setAttribute('active', '');\n }\n\n this._emitChange();\n };\n\n private _emitChange(): void {\n const btns = this._getButtons();\n const active: string[] = [];\n const activeIndex: number[] = [];\n\n btns.forEach((btn: LibButton, i: number): void => {\n if (btn.hasAttribute('active')) {\n activeIndex.push(i);\n active.push(btn.textContent?.trim() ?? String(i));\n }\n });\n\n this.dispatchEvent(new CustomEvent('ui-lib-group-change', {\n detail: { active, activeIndex },\n bubbles: true,\n composed: true,\n }));\n }\n}\n\n/* ══════════════════════════════════════════════════════════════\n LIB-BUTTON-SEP\n ══════════════════════════════════════════════════════════════\n Separador visual explícito entre botones del grupo.\n El lib-button-group lo reconoce y no le asigna group-pos.\n*/\n@customElement('lib-button-sep')\nexport class LibButtonSep extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(groupCss)}`,\n ];\n\n @property({ type: Boolean, reflect: true })\n dark = false;\n\n protected override render(): TemplateResult {\n const color = this.dark\n ? 'rgba(255,255,255,0.1)'\n : 'var(--border-default)';\n return html`<div style=\"width:1px;align-self:stretch;background:${color};flex-shrink:0;z-index:1;\"></div>`;\n }\n}\n\n/* ══════════════════════════════════════════════════════════════\n LIB-BUTTON-SPLIT\n ══════════════════════════════════════════════════════════════\n Botón de acción principal + flecha que despliega menú.\n\n @prop variant — variante visual (igual que lib-button)\n @prop size — tamaño\n @prop dark — surface oscura\n @prop disabled\n @prop label — texto del botón principal (también slot default)\n @prop items — JSON con [{label, value, disabled?}] para el menú\n Si está vacío se usa <slot name=\"menu\">\n\n @fires ui-lib-split-action — click en acción principal\n @fires ui-lib-split-select — click en item del menú {value, label}\n*/\n@customElement('lib-button-split')\nexport class LibButtonSplit extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(groupCss)}`,\n ];\n\n @property({ type: String, reflect: true })\n variant: LibVariant = 'primary';\n\n @property({ type: String, reflect: true })\n size: LibSize = 'md';\n\n @property({ type: Boolean, reflect: true })\n dark = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: String })\n label = '';\n\n /** JSON array de items: '[{\"label\":\"Publicar\",\"value\":\"publish\"}]' */\n @property({ type: String })\n items = '';\n\n private _open = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this._onDocClick);\n document.addEventListener('keydown', this._onKeyDown);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('click', this._onDocClick);\n document.removeEventListener('keydown', this._onKeyDown);\n }\n\n protected override render(): TemplateResult {\n let parsedItems: SplitMenuItem[] = [];\n if (this.items) {\n try { parsedItems = JSON.parse(this.items) as SplitMenuItem[]; }\n catch { /* ignore */ }\n }\n\n return buttonSplitTemplate({\n label: this.label,\n variant: this.variant,\n size: this.size,\n dark: this.dark,\n disabled: this.disabled,\n menuOpen: this._open,\n items: parsedItems,\n onMainClick: (e: Event): void => this._onMainClick(e),\n onArrowClick: (e: Event): void => this._onArrowClick(e),\n });\n }\n\n private _onMainClick(e: Event): void {\n this.dispatchEvent(new CustomEvent('ui-lib-split-action', {\n detail: { originalEvent: e },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _onArrowClick(e: Event): void {\n e.stopPropagation();\n this._open = !this._open;\n this.requestUpdate();\n\n /* Delegación de clicks en items data-driven */\n if (this._open) {\n setTimeout((): void => {\n const menu = this.shadowRoot?.querySelector('.split-menu');\n if (!menu) return;\n menu.querySelectorAll<HTMLButtonElement>('.split-menu-item').forEach((item: HTMLButtonElement): void => {\n item.addEventListener('click', (ev: Event): void => {\n ev.stopPropagation();\n this._open = false;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('ui-lib-split-select', {\n detail: {\n value: item.dataset['value'] ?? '',\n label: item.textContent?.trim() ?? '',\n },\n bubbles: true,\n composed: true,\n }));\n }, { once: true });\n });\n\n /* Slot items (slotted buttons) */\n const slottedMenu = menu.querySelector<HTMLSlotElement>('slot[name=\"menu\"]');\n if (slottedMenu) {\n slottedMenu.assignedElements().forEach((el: Element): void => {\n el.addEventListener('click', (ev: Event): void => {\n ev.stopPropagation();\n this._open = false;\n this.requestUpdate();\n }, { once: true });\n });\n }\n }, 0);\n }\n }\n\n private _onDocClick = (e: MouseEvent): void => {\n if (!this._open) return;\n if (!this.contains(e.target as Node) && !(this.shadowRoot?.contains(e.target as Node) ?? false)) {\n this._open = false;\n this.requestUpdate();\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this._open) {\n this._open = false;\n this.requestUpdate();\n }\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lib-button-group': LibButtonGroup;\n 'lib-button-sep': LibButtonSep;\n 'lib-button-split': LibButtonSplit;\n }\n}"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index64.js","sources":["../src/components/molecules/select/lib-select.component.ts"],"sourcesContent":["import { LitElement, css, unsafeCSS, TemplateResult, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { selectTemplate } from './lib-select.html';\nimport selectCss from './lib-select.css?inline';\nimport sharedTokens from '../../../styles/shared/tokens.css?inline';\nimport type { SelectSize, SelectVariant, SelectChangeDetail, SelectMultiChangeDetail } from './lib-select.types';\n\n/**\n * @element lib-select\n *\n * @fires ui-lib-select-change — Single: { value, label }\n * @fires ui-lib-select-multi-change — Multi: { values, labels }\n * @fires ui-lib-select-open — Panel abierto\n * @fires ui-lib-select-close — Panel cerrado\n *\n * @slot — lib-select-option children\n */\n@customElement('lib-select')\nexport class LibSelect extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(selectCss)}`,\n ];\n\n /* ── Field meta ── */\n @property({ type: String }) label = '';\n @property({ type: String }) placeholder = 'Selecciona una opción';\n @property({ type: String }) hint = '';\n @property({ type: String, attribute: 'error-message' }) errorMessage = '';\n @property({ type: Boolean, reflect: true }) required = false;\n @property({ type: Boolean, reflect: true }) optional = false;\n\n /* ── State ── */\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) error = false;\n @property({ type: Boolean, reflect: true }) dark = false;\n\n /* ── Appearance ── */\n @property({ type: String, reflect: true }) size: SelectSize = 'md';\n @property({ type: String, reflect: true }) variant: SelectVariant = 'default';\n\n /* ── Single value ── */\n @property({ type: String }) value = '';\n\n /* ── Multi values (JSON array string or space-separated) ── */\n @property({ type: Boolean, reflect: true }) multi = false;\n\n /* ── Searchable ── */\n @property({ type: Boolean, reflect: true }) searchable = false;\n\n /* ── Internal state ── */\n @state() private _selectedLabel = '';\n @state() private _selectedValues: string[] = [];\n @state() private _selectedLabels: string[] = [];\n @state() private _searchQuery = '';\n @state() private _visibleCount = 0;\n\n /* ── Outside click handler (arrow fn for remove ref) ── */\n private readonly _handleOutsideClick = (e: MouseEvent): void => {\n if (this.open && !e.composedPath().includes(this)) {\n this._close();\n }\n };\n\n /* ── Escape key handler ── */\n private readonly _handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.open) {\n this._close();\n }\n };\n\n override connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('click', this._handleOutsideClick);\n document.addEventListener('keydown', this._handleKeyDown, true);\n\n /* Listen for option-selected events bubbled from slotted lib-select-option */\n this.addEventListener('option-selected', this._handleOptionSelected as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('click', this._handleOutsideClick);\n document.removeEventListener('keydown', this._handleKeyDown, true);\n }\n\n /**\n * Reacts to external value changes.\n * Syncs _selectedLabel by inspecting slotted options.\n */\n protected override updated(changed: PropertyValues<this>): void {\n super.updated(changed);\n\n if (changed.has('value') && this.value) {\n this._syncSingleFromValue();\n }\n }\n\n /* ─────────────────────────────────────────────────────────\n PUBLIC API\n ───────────────────────────────────────────────────────── */\n\n /** Opens the dropdown panel. */\n public openPanel(): void {\n if (!this.disabled) this._open();\n }\n\n /** Closes the dropdown panel. */\n public closePanel(): void {\n this._close();\n }\n\n /** Clears current selection. */\n public clear(): void {\n this.value = '';\n this._selectedLabel = '';\n this._selectedValues = [];\n this._selectedLabels = [];\n this._syncOptionStates();\n }\n\n /* ─────────────────────────────────────────────────────────\n RENDER\n ───────────────────────────────────────────────────────── */\n\n override render(): TemplateResult {\n return selectTemplate({\n label: this.label,\n placeholder: this.placeholder,\n hint: this.hint,\n errorMessage: this.errorMessage,\n required: this.required,\n optional: this.optional,\n\n open: this.open,\n disabled: this.disabled,\n error: this.error,\n dark: this.dark,\n\n size: this.size,\n variant: this.variant,\n\n selectedLabel: this._selectedLabel,\n hasSelection: !!this._selectedLabel,\n\n multi: this.multi,\n selectedCount: this._selectedValues.length,\n\n searchable: this.searchable,\n searchQuery: this._searchQuery,\n visibleCount: this._visibleCount,\n\n onTriggerClick: this._handleTriggerClick.bind(this),\n onSearchInput: this._handleSearchInput.bind(this),\n onConfirm: this._handleConfirm.bind(this),\n });\n }\n\n /* ─────────────────────────────────────────────────────────\n PRIVATE METHODS\n ───────────────────────────────────────────────────────── */\n\n private _open(): void {\n this.open = true;\n this._updateVisibleCount();\n this.dispatchEvent(new CustomEvent('ui-lib-select-open', {\n bubbles: true, composed: true,\n }));\n }\n\n private _close(): void {\n this.open = false;\n this._searchQuery = '';\n this._showAllOptions();\n this.dispatchEvent(new CustomEvent('ui-lib-select-close', {\n bubbles: true, composed: true,\n }));\n }\n\n private _handleTriggerClick(e: Event): void {\n e.stopPropagation();\n if (this.disabled) return;\n if (this.open) {\n this._close();\n } else {\n this._open();\n }\n }\n\n private _handleOptionSelected(e: Event): void {\n const custom = e as CustomEvent<{ value: string; label: string }>;\n const { value, label } = custom.detail;\n\n if (this.multi) {\n this._toggleMultiValue(value, label);\n } else {\n this._selectSingle(value, label);\n this._close();\n }\n }\n\n private _selectSingle(value: string, label: string): void {\n this.value = value;\n this._selectedLabel = label;\n this._syncOptionStates();\n\n this.dispatchEvent(new CustomEvent<SelectChangeDetail>('ui-lib-select-change', {\n detail: { value, label },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _toggleMultiValue(value: string, label: string): void {\n const idx = this._selectedValues.indexOf(value);\n\n if (idx === -1) {\n this._selectedValues = [...this._selectedValues, value];\n this._selectedLabels = [...this._selectedLabels, label];\n } else {\n this._selectedValues = this._selectedValues.filter((_, i) => i !== idx);\n this._selectedLabels = this._selectedLabels.filter((_, i) => i !== idx);\n }\n\n this._syncOptionStates();\n }\n\n private _handleConfirm(): void {\n this.dispatchEvent(new CustomEvent<SelectMultiChangeDetail>('ui-lib-select-multi-change', {\n detail: {\n values: [...this._selectedValues],\n labels: [...this._selectedLabels],\n },\n bubbles: true,\n composed: true,\n }));\n this._close();\n }\n\n private _handleSearchInput(e: Event): void {\n const input = e.target as HTMLInputElement;\n this._searchQuery = input.value;\n this._filterOptions(this._searchQuery);\n }\n\n /** Filters slotted lib-select-option elements by text match. */\n private _filterOptions(query: string): void {\n const options = Array.from(\n this.querySelectorAll('lib-select-option')\n ) as HTMLElement[];\n\n const q = query.toLowerCase().trim();\n let visible = 0;\n\n options.forEach(opt => {\n const text = (opt.textContent ?? '').toLowerCase();\n const match = !q || text.includes(q);\n opt.toggleAttribute('search-hidden', !match);\n if (match) visible++;\n });\n\n this._visibleCount = visible;\n }\n\n private _showAllOptions(): void {\n const options = Array.from(this.querySelectorAll('lib-select-option'));\n options.forEach(opt => opt.removeAttribute('search-hidden'));\n this._updateVisibleCount();\n }\n\n private _updateVisibleCount(): void {\n const options = this.querySelectorAll('lib-select-option:not([search-hidden])');\n this._visibleCount = options.length;\n }\n\n /** Syncs selected/unselected state on all slotted option elements. */\n private _syncOptionStates(): void {\n const options = Array.from(this.querySelectorAll('lib-select-option')) as Array<\n HTMLElement & { selected?: boolean; value?: string }\n >;\n\n if (this.multi) {\n options.forEach(opt => {\n opt.selected = this._selectedValues.includes(opt.value ?? '');\n });\n } else {\n options.forEach(opt => {\n opt.selected = opt.value === this.value;\n });\n }\n }\n\n /** Called when `value` prop changes externally — syncs label from slotted options. */\n private _syncSingleFromValue(): void {\n // Use setTimeout to allow slotted children to upgrade after hydration\n setTimeout(() => {\n const options = Array.from(\n this.querySelectorAll('lib-select-option')\n ) as Array<HTMLElement & { value?: string; selected?: boolean }>;\n\n const match = options.find(opt => opt.value === this.value);\n if (match) {\n this._selectedLabel = match.textContent?.trim() ?? '';\n options.forEach(opt => { opt.selected = opt === match; });\n }\n }, 0);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lib-select': LibSelect;\n }\n}"],"names":[],"mappings":"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"}
|