@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.
Files changed (460) hide show
  1. package/dist/components/atoms/index.d.ts +45 -16
  2. package/dist/components/atoms/index.d.ts.map +1 -1
  3. package/dist/components/molecules/index.d.ts +20 -1
  4. package/dist/components/molecules/index.d.ts.map +1 -1
  5. package/dist/components/organisms/index.d.ts +17 -1
  6. package/dist/components/organisms/index.d.ts.map +1 -1
  7. package/dist/index.d.ts +3 -82
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +79 -80
  10. package/dist/index.js.map +1 -1
  11. package/dist/index10.js +82 -18
  12. package/dist/index10.js.map +1 -1
  13. package/dist/index11.js +84 -69
  14. package/dist/index11.js.map +1 -1
  15. package/dist/index12.js +40 -26
  16. package/dist/index12.js.map +1 -1
  17. package/dist/index13.js +16 -39
  18. package/dist/index13.js.map +1 -1
  19. package/dist/index14.js +29 -44
  20. package/dist/index14.js.map +1 -1
  21. package/dist/index15.js +16 -117
  22. package/dist/index15.js.map +1 -1
  23. package/dist/index16.js +48 -40
  24. package/dist/index16.js.map +1 -1
  25. package/dist/index17.js +41 -25
  26. package/dist/index17.js.map +1 -1
  27. package/dist/index18.js +76 -49
  28. package/dist/index18.js.map +1 -1
  29. package/dist/index19.js +19 -39
  30. package/dist/index19.js.map +1 -1
  31. package/dist/index194.js +94 -24
  32. package/dist/index194.js.map +1 -1
  33. package/dist/index195.js +2 -2
  34. package/dist/index197.js +2 -24
  35. package/dist/index197.js.map +1 -1
  36. package/dist/index198.js +74 -2
  37. package/dist/index198.js.map +1 -1
  38. package/dist/index199.js +64 -35
  39. package/dist/index199.js.map +1 -1
  40. package/dist/index20.js +21 -41
  41. package/dist/index20.js.map +1 -1
  42. package/dist/index200.js +2 -2
  43. package/dist/index201.js +54 -13
  44. package/dist/index201.js.map +1 -1
  45. package/dist/index202.js +2 -2
  46. package/dist/index203.js +2 -2
  47. package/dist/index204.js +143 -157
  48. package/dist/index204.js.map +1 -1
  49. package/dist/index205.js +43 -24
  50. package/dist/index205.js.map +1 -1
  51. package/dist/index206.js +51 -2
  52. package/dist/index206.js.map +1 -1
  53. package/dist/index207.js +2 -11
  54. package/dist/index207.js.map +1 -1
  55. package/dist/index208.js +33 -2
  56. package/dist/index208.js.map +1 -1
  57. package/dist/index209.js +2 -91
  58. package/dist/index209.js.map +1 -1
  59. package/dist/index21.js +90 -26
  60. package/dist/index21.js.map +1 -1
  61. package/dist/index210.js +6 -2
  62. package/dist/index210.js.map +1 -1
  63. package/dist/index211.js +2 -41
  64. package/dist/index211.js.map +1 -1
  65. package/dist/index212.js +260 -2
  66. package/dist/index212.js.map +1 -1
  67. package/dist/index213.js +16 -5
  68. package/dist/index213.js.map +1 -1
  69. package/dist/index214.js +2 -2
  70. package/dist/index215.js +2 -35
  71. package/dist/index215.js.map +1 -1
  72. package/dist/index216.js +59 -42
  73. package/dist/index216.js.map +1 -1
  74. package/dist/index217.js +32 -2
  75. package/dist/index217.js.map +1 -1
  76. package/dist/index218.js +2 -85
  77. package/dist/index218.js.map +1 -1
  78. package/dist/index219.js +2 -2
  79. package/dist/index22.js +41 -48
  80. package/dist/index22.js.map +1 -1
  81. package/dist/index220.js +73 -65
  82. package/dist/index220.js.map +1 -1
  83. package/dist/index221.js +81 -2
  84. package/dist/index221.js.map +1 -1
  85. package/dist/index222.js +2 -10
  86. package/dist/index222.js.map +1 -1
  87. package/dist/index223.js +133 -2
  88. package/dist/index223.js.map +1 -1
  89. package/dist/index224.js +2 -26
  90. package/dist/index224.js.map +1 -1
  91. package/dist/index225.js +2 -2
  92. package/dist/index226.js +66 -12
  93. package/dist/index226.js.map +1 -1
  94. package/dist/index227.js +97 -2
  95. package/dist/index227.js.map +1 -1
  96. package/dist/index228.js +2 -2
  97. package/dist/index229.js +62 -24
  98. package/dist/index229.js.map +1 -1
  99. package/dist/index23.js +50 -94
  100. package/dist/index23.js.map +1 -1
  101. package/dist/index230.js +2 -2
  102. package/dist/index231.js +2 -2
  103. package/dist/index232.js +12 -2
  104. package/dist/index232.js.map +1 -1
  105. package/dist/index233.js +5 -16
  106. package/dist/index233.js.map +1 -1
  107. package/dist/index234.js +2 -2
  108. package/dist/index235.js +11 -9
  109. package/dist/index235.js.map +1 -1
  110. package/dist/index236.js +2 -2
  111. package/dist/index237.js +76 -34
  112. package/dist/index237.js.map +1 -1
  113. package/dist/index238.js +2 -2
  114. package/dist/index239.js +2 -27
  115. package/dist/index239.js.map +1 -1
  116. package/dist/index24.js +37 -34
  117. package/dist/index24.js.map +1 -1
  118. package/dist/index240.js +39 -2
  119. package/dist/index240.js.map +1 -1
  120. package/dist/index241.js +2 -34
  121. package/dist/index241.js.map +1 -1
  122. package/dist/index242.js +235 -12
  123. package/dist/index242.js.map +1 -1
  124. package/dist/index243.js +82 -2
  125. package/dist/index243.js.map +1 -1
  126. package/dist/index244.js +2 -9
  127. package/dist/index244.js.map +1 -1
  128. package/dist/index245.js +94 -2
  129. package/dist/index245.js.map +1 -1
  130. package/dist/index246.js +2 -5
  131. package/dist/index246.js.map +1 -1
  132. package/dist/index247.js +268 -2
  133. package/dist/index247.js.map +1 -1
  134. package/dist/index248.js +2 -36
  135. package/dist/index248.js.map +1 -1
  136. package/dist/index249.js +21 -2
  137. package/dist/index249.js.map +1 -1
  138. package/dist/index25.js +51 -32
  139. package/dist/index25.js.map +1 -1
  140. package/dist/index250.js +2 -31
  141. package/dist/index250.js.map +1 -1
  142. package/dist/index251.js +9 -2
  143. package/dist/index251.js.map +1 -1
  144. package/dist/index252.js +2 -19
  145. package/dist/index252.js.map +1 -1
  146. package/dist/index253.js +15 -2
  147. package/dist/index253.js.map +1 -1
  148. package/dist/index254.js +2 -2
  149. package/dist/index255.js +135 -69
  150. package/dist/index255.js.map +1 -1
  151. package/dist/index256.js +2 -11
  152. package/dist/index256.js.map +1 -1
  153. package/dist/index257.js +5 -2
  154. package/dist/index257.js.map +1 -1
  155. package/dist/index258.js +2 -78
  156. package/dist/index258.js.map +1 -1
  157. package/dist/index259.js +9 -2
  158. package/dist/index259.js.map +1 -1
  159. package/dist/index26.js +31 -236
  160. package/dist/index26.js.map +1 -1
  161. package/dist/index260.js +2 -32
  162. package/dist/index260.js.map +1 -1
  163. package/dist/index261.js +2 -2
  164. package/dist/index262.js +92 -9
  165. package/dist/index262.js.map +1 -1
  166. package/dist/index263.js +59 -2
  167. package/dist/index263.js.map +1 -1
  168. package/dist/index264.js +2 -16
  169. package/dist/index264.js.map +1 -1
  170. package/dist/index265.js +41 -2
  171. package/dist/index265.js.map +1 -1
  172. package/dist/index266.js +2 -16
  173. package/dist/index266.js.map +1 -1
  174. package/dist/index267.js +34 -9
  175. package/dist/index267.js.map +1 -1
  176. package/dist/index268.js +8 -54
  177. package/dist/index268.js.map +1 -1
  178. package/dist/index269.js +2 -2
  179. package/dist/index27.js +27 -58
  180. package/dist/index27.js.map +1 -1
  181. package/dist/index270.js +42 -7
  182. package/dist/index270.js.map +1 -1
  183. package/dist/index271.js +2 -2
  184. package/dist/index272.js +2 -34
  185. package/dist/index272.js.map +1 -1
  186. package/dist/index273.js +16 -2
  187. package/dist/index273.js.map +1 -1
  188. package/dist/index274.js +9 -2
  189. package/dist/index274.js.map +1 -1
  190. package/dist/index275.js +6 -13
  191. package/dist/index275.js.map +1 -1
  192. package/dist/index276.js +2 -2
  193. package/dist/index277.js +8 -15
  194. package/dist/index277.js.map +1 -1
  195. package/dist/index278.js +2 -2
  196. package/dist/index279.js +55 -2
  197. package/dist/index279.js.map +1 -1
  198. package/dist/index28.js +247 -24
  199. package/dist/index28.js.map +1 -1
  200. package/dist/index280.js +2 -42
  201. package/dist/index280.js.map +1 -1
  202. package/dist/index281.js +2 -100
  203. package/dist/index281.js.map +1 -1
  204. package/dist/index282.js +20 -2
  205. package/dist/index282.js.map +1 -1
  206. package/dist/index283.js +2 -97
  207. package/dist/index283.js.map +1 -1
  208. package/dist/index284.js +33 -2
  209. package/dist/index284.js.map +1 -1
  210. package/dist/index285.js +6 -27
  211. package/dist/index285.js.map +1 -1
  212. package/dist/index286.js +2 -2
  213. package/dist/index287.js +9 -44
  214. package/dist/index287.js.map +1 -1
  215. package/dist/index288.js +2 -2
  216. package/dist/index289.js +2 -33
  217. package/dist/index289.js.map +1 -1
  218. package/dist/index29.js +249 -39
  219. package/dist/index29.js.map +1 -1
  220. package/dist/index290.js +36 -2
  221. package/dist/index290.js.map +1 -1
  222. package/dist/index291.js +2 -57
  223. package/dist/index291.js.map +1 -1
  224. package/dist/index292.js +24 -2
  225. package/dist/index292.js.map +1 -1
  226. package/dist/index293.js +2 -2
  227. package/dist/index294.js +26 -247
  228. package/dist/index294.js.map +1 -1
  229. package/dist/index295.js +2 -2
  230. package/dist/index296.js +2 -72
  231. package/dist/index296.js.map +1 -1
  232. package/dist/index297.js +42 -2
  233. package/dist/index297.js.map +1 -1
  234. package/dist/index298.js +7 -56
  235. package/dist/index298.js.map +1 -1
  236. package/dist/index299.js +2 -133
  237. package/dist/index299.js.map +1 -1
  238. package/dist/index30.js +32 -19
  239. package/dist/index30.js.map +1 -1
  240. package/dist/index300.js +30 -2
  241. package/dist/index300.js.map +1 -1
  242. package/dist/index301.js +2 -12
  243. package/dist/index301.js.map +1 -1
  244. package/dist/index302.js +34 -2
  245. package/dist/index302.js.map +1 -1
  246. package/dist/index303.js +2 -162
  247. package/dist/index303.js.map +1 -1
  248. package/dist/index304.js +26 -42
  249. package/dist/index304.js.map +1 -1
  250. package/dist/index305.js +2 -81
  251. package/dist/index305.js.map +1 -1
  252. package/dist/index306.js +10 -2
  253. package/dist/index306.js.map +1 -1
  254. package/dist/index307.js +2 -71
  255. package/dist/index307.js.map +1 -1
  256. package/dist/index308.js +2 -2
  257. package/dist/index309.js +19 -2
  258. package/dist/index309.js.map +1 -1
  259. package/dist/index31.js +96 -11
  260. package/dist/index31.js.map +1 -1
  261. package/dist/index310.js +2 -81
  262. package/dist/index310.js.map +1 -1
  263. package/dist/index311.js +2 -2
  264. package/dist/index312.js +42 -2
  265. package/dist/index312.js.map +1 -1
  266. package/dist/index313.js +2 -74
  267. package/dist/index313.js.map +1 -1
  268. package/dist/index314.js +25 -67
  269. package/dist/index314.js.map +1 -1
  270. package/dist/index315.js +2 -2
  271. package/dist/index316.js +9 -17
  272. package/dist/index316.js.map +1 -1
  273. package/dist/index317.js +2 -2
  274. package/dist/index318.js +84 -32
  275. package/dist/index318.js.map +1 -1
  276. package/dist/index319.js +2 -2
  277. package/dist/index32.js +40 -48
  278. package/dist/index32.js.map +1 -1
  279. package/dist/index320.js +68 -77
  280. package/dist/index320.js.map +1 -1
  281. package/dist/index321.js +2 -2
  282. package/dist/index322.js +12 -148
  283. package/dist/index322.js.map +1 -1
  284. package/dist/index323.js +1 -1
  285. package/dist/index324.js +28 -6
  286. package/dist/index324.js.map +1 -1
  287. package/dist/index325.js +2 -2
  288. package/dist/index326.js +78 -87
  289. package/dist/index326.js.map +1 -1
  290. package/dist/index327.js +2 -2
  291. package/dist/index328.js +78 -2
  292. package/dist/index328.js.map +1 -1
  293. package/dist/index329.js +2 -237
  294. package/dist/index329.js.map +1 -1
  295. package/dist/index33.js +20 -56
  296. package/dist/index33.js.map +1 -1
  297. package/dist/index330.js +11 -6
  298. package/dist/index330.js.map +1 -1
  299. package/dist/index331.js +2 -2
  300. package/dist/index332.js +18 -59
  301. package/dist/index332.js.map +1 -1
  302. package/dist/index333.js +2 -2
  303. package/dist/index334.js +12 -5
  304. package/dist/index334.js.map +1 -1
  305. package/dist/index335.js +2 -2
  306. package/dist/index336.js +2 -15
  307. package/dist/index336.js.map +1 -1
  308. package/dist/index337.js +88 -2
  309. package/dist/index337.js.map +1 -1
  310. package/dist/index338.js +24 -2
  311. package/dist/index338.js.map +1 -1
  312. package/dist/index339.js +2 -92
  313. package/dist/index339.js.map +1 -1
  314. package/dist/index34.js +59 -35
  315. package/dist/index34.js.map +1 -1
  316. package/dist/index340.js +42 -14
  317. package/dist/index340.js.map +1 -1
  318. package/dist/index341.js +2 -2
  319. package/dist/index342.js +22 -80
  320. package/dist/index342.js.map +1 -1
  321. package/dist/index343.js +2 -2
  322. package/dist/index344.js +2 -18
  323. package/dist/index344.js.map +1 -1
  324. package/dist/index345.js +16 -2
  325. package/dist/index345.js.map +1 -1
  326. package/dist/index346.js +2 -268
  327. package/dist/index346.js.map +1 -1
  328. package/dist/index347.js +176 -2
  329. package/dist/index347.js.map +1 -1
  330. package/dist/index348.js +2 -2
  331. package/dist/index349.js +35 -39
  332. package/dist/index349.js.map +1 -1
  333. package/dist/index35.js +101 -28
  334. package/dist/index35.js.map +1 -1
  335. package/dist/index350.js +3 -3
  336. package/dist/index350.js.map +1 -1
  337. package/dist/index351.js +2 -2
  338. package/dist/index352.js +19 -26
  339. package/dist/index352.js.map +1 -1
  340. package/dist/index357.js +26 -19
  341. package/dist/index357.js.map +1 -1
  342. package/dist/index36.js +115 -33
  343. package/dist/index36.js.map +1 -1
  344. package/dist/index37.js +41 -115
  345. package/dist/index37.js.map +1 -1
  346. package/dist/index38.js +34 -246
  347. package/dist/index38.js.map +1 -1
  348. package/dist/index39.js +30 -137
  349. package/dist/index39.js.map +1 -1
  350. package/dist/index4.js +26 -84
  351. package/dist/index4.js.map +1 -1
  352. package/dist/index40.js +26 -400
  353. package/dist/index40.js.map +1 -1
  354. package/dist/index41.js +28 -77
  355. package/dist/index41.js.map +1 -1
  356. package/dist/index42.js +23 -26
  357. package/dist/index42.js.map +1 -1
  358. package/dist/index43.js +36 -33
  359. package/dist/index43.js.map +1 -1
  360. package/dist/index44.js +62 -16
  361. package/dist/index44.js.map +1 -1
  362. package/dist/index45.js +138 -21
  363. package/dist/index45.js.map +1 -1
  364. package/dist/index46.js +129 -22
  365. package/dist/index46.js.map +1 -1
  366. package/dist/index47.js +41 -19
  367. package/dist/index47.js.map +1 -1
  368. package/dist/index48.js +11 -82
  369. package/dist/index48.js.map +1 -1
  370. package/dist/index49.js +56 -279
  371. package/dist/index49.js.map +1 -1
  372. package/dist/index5.js +21 -34
  373. package/dist/index5.js.map +1 -1
  374. package/dist/index50.js +280 -33
  375. package/dist/index50.js.map +1 -1
  376. package/dist/index51.js +74 -94
  377. package/dist/index51.js.map +1 -1
  378. package/dist/index52.js +66 -41
  379. package/dist/index52.js.map +1 -1
  380. package/dist/index53.js +333 -62
  381. package/dist/index53.js.map +1 -1
  382. package/dist/index54.js +96 -256
  383. package/dist/index54.js.map +1 -1
  384. package/dist/index55.js +38 -130
  385. package/dist/index55.js.map +1 -1
  386. package/dist/index56.js +251 -50
  387. package/dist/index56.js.map +1 -1
  388. package/dist/index57.js +144 -115
  389. package/dist/index57.js.map +1 -1
  390. package/dist/index58.js +93 -183
  391. package/dist/index58.js.map +1 -1
  392. package/dist/index59.js +33 -339
  393. package/dist/index59.js.map +1 -1
  394. package/dist/index6.js +2 -2
  395. package/dist/index60.js +102 -66
  396. package/dist/index60.js.map +1 -1
  397. package/dist/index61.js +73 -179
  398. package/dist/index61.js.map +1 -1
  399. package/dist/index62.js +117 -97
  400. package/dist/index62.js.map +1 -1
  401. package/dist/index63.js +113 -263
  402. package/dist/index63.js.map +1 -1
  403. package/dist/index64.js +258 -251
  404. package/dist/index64.js.map +1 -1
  405. package/dist/index65.js +177 -79
  406. package/dist/index65.js.map +1 -1
  407. package/dist/index66.js +261 -140
  408. package/dist/index66.js.map +1 -1
  409. package/dist/index67.js +183 -100
  410. package/dist/index67.js.map +1 -1
  411. package/dist/index68.js +28 -89
  412. package/dist/index68.js.map +1 -1
  413. package/dist/index69.js +20 -161
  414. package/dist/index69.js.map +1 -1
  415. package/dist/index7.js +394 -32
  416. package/dist/index7.js.map +1 -1
  417. package/dist/index70.js +190 -53
  418. package/dist/index70.js.map +1 -1
  419. package/dist/index71.js +204 -112
  420. package/dist/index71.js.map +1 -1
  421. package/dist/index72.js +2 -2
  422. package/dist/index73.js +89 -28
  423. package/dist/index73.js.map +1 -1
  424. package/dist/index74.js +126 -63
  425. package/dist/index74.js.map +1 -1
  426. package/dist/index75.js +122 -111
  427. package/dist/index75.js.map +1 -1
  428. package/dist/index76.js +67 -64
  429. package/dist/index76.js.map +1 -1
  430. package/dist/index77.js +112 -88
  431. package/dist/index77.js.map +1 -1
  432. package/dist/index78.js +87 -16
  433. package/dist/index78.js.map +1 -1
  434. package/dist/index79.js +151 -79
  435. package/dist/index79.js.map +1 -1
  436. package/dist/index8.js +25 -127
  437. package/dist/index8.js.map +1 -1
  438. package/dist/index80.js +104 -186
  439. package/dist/index80.js.map +1 -1
  440. package/dist/index81.js +59 -20
  441. package/dist/index81.js.map +1 -1
  442. package/dist/index82.js +17 -129
  443. package/dist/index82.js.map +1 -1
  444. package/dist/index83.js +88 -217
  445. package/dist/index83.js.map +1 -1
  446. package/dist/index84.js +64 -112
  447. package/dist/index84.js.map +1 -1
  448. package/dist/index9.js +30 -45
  449. package/dist/index9.js.map +1 -1
  450. package/dist/src/components/atoms/index.d.ts +45 -16
  451. package/dist/src/components/atoms/index.d.ts.map +1 -1
  452. package/dist/src/components/molecules/index.d.ts +20 -1
  453. package/dist/src/components/molecules/index.d.ts.map +1 -1
  454. package/dist/src/components/organisms/index.d.ts +17 -1
  455. package/dist/src/components/organisms/index.d.ts.map +1 -1
  456. package/dist/src/index.d.ts +3 -82
  457. package/dist/src/index.d.ts.map +1 -1
  458. package/dist/tokens.css +353 -7
  459. package/dist/vite.config.d.ts.map +1 -1
  460. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"index55.js","sources":["../src/components/molecules/segmented-control/lib-segmented-control.component.ts"],"sourcesContent":["import { LitElement, css, unsafeCSS, TemplateResult } from 'lit';\nimport { customElement, property, state, queryAll } from 'lit/decorators.js';\nimport segmentedCss from './lib-segmented-control.css?inline';\nimport sharedTokens from '../../../styles/shared/tokens.css?inline';\nimport { segmentedTemplate } from './lib-segmented-control.html';\nimport type {\n SegmentedOption,\n SegmentedVariant,\n SegmentedSize,\n SegmentedChangeDetail,\n} from './lib-segmented-control.types';\n\n/**\n * @element lib-segmented-control\n *\n * Control de selección exclusiva entre N opciones.\n * El thumb se desplaza con `transform: translateX` calculado sobre\n * el `offsetLeft` / `offsetWidth` del option activo.\n *\n * @prop {SegmentedOption[]} options Array de opciones\n * @prop {string} value — Valor activo (reflected)\n * @prop {SegmentedVariant} variant Superficie visual (reflected)\n * @prop {SegmentedSize} size Tamaño (reflected)\n * @prop {boolean} full — Ocupa el 100% del ancho (reflected)\n * @prop {boolean} icon-only Solo iconos, sin texto (reflected)\n * @prop {boolean} disabled Deshabilitado (reflected)\n * @prop {boolean} glitch — Efecto de corrupción al cambiar (reflected)\n *\n * @fires ui-lib-change Al cambiar la selección\n * Detail: { value: string, previousValue: string }\n *\n * @slotNo usa slots; las opciones se pasan vía `.options`\n */\n@customElement('lib-segmented-control')\nexport class LibSegmentedControl extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(segmentedCss)}`,\n ];\n\n /* ── Props públicas ── */\n\n @property({ type: Array })\n options: SegmentedOption[] = [];\n\n @property({ type: String, reflect: true })\n value = '';\n\n @property({ type: String, reflect: true })\n variant: SegmentedVariant = 'outline';\n\n @property({ type: String, reflect: true })\n size: SegmentedSize = 'md';\n\n @property({ type: Boolean, reflect: true })\n full = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'icon-only' })\n iconOnly = false;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n @property({ type: Boolean, reflect: true })\n glitch = false;\n\n /* ── Estado interno ── */\n\n @state() private _thumbStyle = '';\n\n /** Referencia a los nodos .seg-option en el Shadow DOM */\n @queryAll('.seg-option')\n private declare _optionEls: NodeListOf<HTMLElement>;\n\n /* ── Ciclo de vida ── */\n\n protected override firstUpdated(): void {\n this._updateThumb();\n }\n\n protected override updated(changed: Map<PropertyKey, unknown>): void {\n if (changed.has('value') || changed.has('variant') || changed.has('options')) {\n // next microtask — el DOM ya refleja el nuevo estado\n Promise.resolve().then((): void => this._updateThumb());\n }\n }\n\n /* ── Thumb engine ── */\n\n private _updateThumb(): void {\n const idx = this.options.findIndex(o => o.value === this.value);\n if (idx === -1) return;\n\n // Acceso seguro con ! — el índice está dentro de los límites de options\n const el = this._optionEls[idx];\n if (!el) return;\n\n const isUnderline =\n this.variant === 'underline' || this.variant === 'dark-underline';\n\n const w = el.offsetWidth;\n // Para underline el offset no necesita corrección de padding del track\n const x = isUnderline\n ? el.offsetLeft\n : el.offsetLeft - this._getTrackPadding();\n\n this._thumbStyle = `width:${w}px;transform:translateX(${x}px)`;\n }\n\n private _getTrackPadding(): number {\n const track = this.renderRoot.querySelector<HTMLElement>('.seg');\n if (!track) return 3;\n return parseInt(getComputedStyle(track).paddingLeft, 10) || 3;\n }\n\n /* ── Selección ── */\n\n private _handleSelect(option: SegmentedOption, evt: MouseEvent): void {\n if (this.disabled || option.disabled) return;\n const previousValue = this.value;\n if (option.value === previousValue) return;\n\n this.value = option.value;\n\n // Glitch flash\n if (this.glitch) {\n const idx = this.options.findIndex(o => o.value === this.value);\n const node = this._optionEls[idx];\n if (node) {\n node.classList.add('glitch-on');\n setTimeout((): void => node.classList.remove('glitch-on'), 340);\n }\n }\n\n // Ripple\n this._triggerRipple(evt);\n\n this.dispatchEvent(\n new CustomEvent<SegmentedChangeDetail>('ui-lib-change', {\n detail: { value: this.value, previousValue },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _triggerRipple(evt: MouseEvent): void {\n const target = evt.currentTarget as HTMLElement | null;\n if (!target) return;\n\n let wrap = target.querySelector<HTMLElement>('.seg-ripple');\n if (!wrap) {\n wrap = document.createElement('div');\n wrap.className = 'seg-ripple';\n target.appendChild(wrap);\n }\n\n const dot = document.createElement('div');\n dot.className = 'seg-ripple-dot';\n dot.style.left = '50%';\n dot.style.top = '50%';\n dot.style.marginLeft = '-2px';\n dot.style.marginTop = '-2px';\n wrap.appendChild(dot);\n setTimeout((): void => dot.remove(), 400);\n }\n\n /* ── API pública ── */\n\n /** Selecciona un valor programáticamente */\n public select(value: string): void {\n const opt = this.options.find(o => o.value === value);\n if (opt && !opt.disabled) {\n const prev = this.value;\n this.value = value;\n this.dispatchEvent(\n new CustomEvent<SegmentedChangeDetail>('ui-lib-change', {\n detail: { value, previousValue: prev },\n bubbles: true,\n composed: true,\n })\n );\n }\n }\n\n /* ── Render ── */\n\n protected override render(): TemplateResult {\n return segmentedTemplate({\n options: this.options,\n value: this.value,\n variant: this.variant,\n size: this.size,\n full: this.full,\n iconOnly: this.iconOnly,\n disabled: this.disabled,\n glitch: this.glitch,\n thumbStyle: this._thumbStyle,\n onSelect: (opt, evt): void => this._handleSelect(opt, evt),\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lib-segmented-control': LibSegmentedControl;\n }\n}"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index55.js","sources":["../src/components/molecules/empty-state/lib-empty-state.component.ts"],"sourcesContent":["import { LitElement, css, unsafeCSS, TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { emptyStateTemplate } from './lib-empty-state.html';\nimport type { LibEmptyStateTone, LibEmptyStateLayout, LibEmptyStateSize } from './lib-empty-state.html';\nimport emptyStateCss from './lib-empty-state.css?inline';\nimport sharedTokens from '../../../styles/shared/tokens.css?inline';\n\nexport type { LibEmptyStateTone, LibEmptyStateLayout, LibEmptyStateSize };\n\n/**\n * @element lib-empty-state\n *\n * Tres zonas: ilustración (icono Phosphor o kanji), copy, acciones.\n * Todas las zonas son opcionales la mínima expresión es solo `heading`.\n *\n * @slot illustrationIcono Phosphor (o cualquier elemento visual)\n * @slot actions Botones de acción (lib-button u otros)\n *\n * @exampledefault con icono\n * <lib-empty-state heading=\"Carpeta vacía\" description=\"Sube tu primer archivo.\">\n * <ph-folder-open slot=\"illustration\" weight=\"regular\"></ph-folder-open>\n * <lib-button slot=\"actions\" variant=\"primary\">Subir</lib-button>\n * </lib-empty-state>\n *\n * @examplekanji como ilustración\n * <lib-empty-state kanji=\"無\" heading=\"Sin resultados\" description=\"Prueba otros términos.\">\n * <lib-button slot=\"actions\" variant=\"ghost\">Limpiar filtros</lib-button>\n * </lib-empty-state>\n *\n * @example — inline con tone\n * <lib-empty-state layout=\"inline\" tone=\"kaki\" heading=\"Empieza aquí\" size=\"sm\">\n * <ph-sparkle slot=\"illustration\" weight=\"regular\"></ph-sparkle>\n * <lib-button slot=\"actions\" variant=\"accent\">Crear</lib-button>\n * </lib-empty-state>\n *\n * @examplebordered (dropzone)\n * <lib-empty-state bordered heading=\"Arrastra aquí tus archivos\">\n * <ph-plus slot=\"illustration\" weight=\"regular\"></ph-plus>\n * </lib-empty-state>\n */\n@customElement('lib-empty-state')\nexport class LibEmptyState extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(emptyStateCss)}`,\n ];\n\n /**\n * Título principal del estado vacío.\n * Se usa `heading` en lugar de `title` para evitar colisión con `HTMLElement.title`.\n */\n @property({ type: String })\n heading = '';\n\n /** Texto descriptivo secundario bajo el título. */\n @property({ type: String })\n description = '';\n\n /**\n * Carácter kanji como ilustración tipográfica (ej: 無, 空, ).\n * Cuando se especifica, sustituye al slot `illustration`.\n */\n @property({ type: String })\n kanji = '';\n\n /**\n * Tono cromático del icono.\n * - neutral (default): washi\n * - kaki: cálido, primer uso, atención\n * - celadon: completado, éxito\n * - error: fallo, acceso denegado\n */\n @property({ type: String, reflect: true })\n tone: LibEmptyStateTone = 'neutral';\n\n /**\n * Disposición del componente.\n * - default: columna centrada (pantallas, modales, paneles)\n * - inline: fila con icono a la izquierda (tablas, banners)\n */\n @property({ type: String, reflect: true })\n layout: LibEmptyStateLayout = 'default';\n\n /**\n * Tamaño del componente.\n * - md (default): padding generoso, icono 72px\n * - sm: compacto para sidebars y paneles secundarios\n */\n @property({ type: String, reflect: true })\n size: LibEmptyStateSize = 'md';\n\n /** Borde punteado + fondo `bg-surface`. Para zonas drop o sin contenido explícito. */\n @property({ type: Boolean, reflect: true })\n bordered = false;\n\n /** Elimina el fondo y borde del icono. Para contextos de mínimo ruido visual. */\n @property({ type: Boolean, reflect: true })\n ghost = false;\n\n override render(): TemplateResult {\n return emptyStateTemplate({\n heading: this.heading,\n description: this.description,\n kanji: this.kanji,\n tone: this.tone,\n layout: this.layout,\n size: this.size,\n bordered: this.bordered,\n ghost: this.ghost,\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lib-empty-state': LibEmptyState;\n }\n}"],"names":[],"mappings":";;;;;;;;;;;;;;;AAyCO,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA;AAWL,SAAA,UAAU;AAIV,SAAA,cAAc;AAOd,SAAA,QAAQ;AAUR,SAAA,OAA0B;AAQ1B,SAAA,SAA8B;AAQ9B,SAAA,OAA0B;AAI1B,SAAA,WAAW;AAIX,SAAA,QAAQ;AAAA,EAAA;AAAA,EAEC,SAAyB;AAChC,WAAO,mBAAmB;AAAA,MACxB,SAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB,OAAa,KAAK;AAAA,MAClB,MAAa,KAAK;AAAA,MAClB,QAAa,KAAK;AAAA,MAClB,MAAa,KAAK;AAAA,MAClB,UAAa,KAAK;AAAA,MAClB,OAAa,KAAK;AAAA,IAAA,CACnB;AAAA,EACH;AACF;AAtEa,cACK,SAAS;AAAA,EACvB,MAAM,UAAU,YAAY,CAAC;AAAA,EAC7B,MAAM,UAAU,aAAa,CAAC;AAChC;AAOA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAVf,cAWX,WAAA,WAAA,CAAA;AAIA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAdf,cAeX,WAAA,eAAA,CAAA;AAOA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArBf,cAsBX,WAAA,SAAA,CAAA;AAUA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,GA/B9B,cAgCX,WAAA,QAAA,CAAA;AAQA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,GAvC9B,cAwCX,WAAA,UAAA,CAAA;AAQA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,MAAM;AAAA,GA/C9B,cAgDX,WAAA,QAAA,CAAA;AAIA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAnD/B,cAoDX,WAAA,YAAA,CAAA;AAIA,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAvD/B,cAwDX,WAAA,SAAA,CAAA;AAxDW,gBAAN,gBAAA;AAAA,EADN,cAAc,iBAAiB;AAAA,GACnB,aAAA;"}
package/dist/index56.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import { unsafeCSS, css, LitElement } from "lit";
2
2
  import { property, state, customElement } from "lit/decorators.js";
3
+ import { generateUniqueId } from "./index210.js";
4
+ import uploaderCss from "./index211.js";
3
5
  import sharedTokens from "./index196.js";
4
- import inputStyles from "./index297.js";
5
- import { inputTemplate } from "./index298.js";
6
+ import { fileUploaderTemplate } from "./index212.js";
6
7
  var __defProp = Object.defineProperty;
7
8
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
9
  var __decorateClass = (decorators, target, key, kind) => {
@@ -13,86 +14,286 @@ var __decorateClass = (decorators, target, key, kind) => {
13
14
  if (kind && result) __defProp(target, key, result);
14
15
  return result;
15
16
  };
16
- let LibInput = class extends LitElement {
17
+ let LibFileUploader = class extends LitElement {
17
18
  constructor() {
18
19
  super(...arguments);
19
- this.label = "";
20
- this.placeholder = "";
21
- this.type = "text";
22
- this.required = false;
20
+ this.zone = "default";
21
+ this.title = "Arrastra archivos aquí";
22
+ this.subtitle = "o busca en tu equipo";
23
+ this.hint = "PDF, DOCX, PNG, JPG · máx. 20 MB por archivo";
24
+ this.multiple = false;
25
+ this.accept = "*";
23
26
  this.disabled = false;
24
- this.error = false;
25
- this.errorMessage = "";
26
- this.value = "";
27
- this._showPassword = false;
28
- this._uuid = `lib-input-${Math.random().toString(36).slice(2, 9)}`;
27
+ this.simulate = false;
28
+ this.simulateMs = 2e3;
29
+ this._isDragover = false;
30
+ this._entries = [];
31
+ this._imagePreviewUrl = null;
29
32
  }
30
- render() {
31
- return inputTemplate({
32
- uuid: this._uuid,
33
- type: this.type,
34
- label: this.label,
35
- placeholder: this.placeholder,
36
- required: this.required,
37
- disabled: this.disabled,
38
- error: this.error,
39
- errorMessage: this.errorMessage,
40
- value: this.value,
41
- showPassword: this._showPassword,
42
- handleInput: this._handleInput.bind(this),
43
- handleTogglePassword: this._handleTogglePassword.bind(this)
33
+ /* ── Drag & Drop ── */
34
+ _onDragover(e) {
35
+ e.preventDefault();
36
+ this._isDragover = true;
37
+ }
38
+ _onDragleave() {
39
+ this._isDragover = false;
40
+ }
41
+ _onDrop(e) {
42
+ var _a;
43
+ e.preventDefault();
44
+ this._isDragover = false;
45
+ const files = Array.from(((_a = e.dataTransfer) == null ? void 0 : _a.files) ?? []);
46
+ if (files.length) this._processFiles(files);
47
+ }
48
+ /* ── Input change ── */
49
+ _onInputChange(e) {
50
+ const input = e.target;
51
+ const files = Array.from(input.files ?? []);
52
+ if (files.length) this._processFiles(files);
53
+ input.value = "";
54
+ }
55
+ /* ── Procesar archivos ── */
56
+ _processFiles(files) {
57
+ if (this.zone === "image") {
58
+ const file = files[0];
59
+ if (!file) return;
60
+ if (this._imagePreviewUrl) URL.revokeObjectURL(this._imagePreviewUrl);
61
+ const entry = {
62
+ id: generateUniqueId("fu-"),
63
+ file,
64
+ progress: 0,
65
+ status: "idle",
66
+ previewUrl: URL.createObjectURL(file)
67
+ };
68
+ this._imagePreviewUrl = entry.previewUrl ?? null;
69
+ this._entries = [entry];
70
+ this._emitFilesChange([file]);
71
+ if (this.simulate) this._simulateUpload(entry);
72
+ return;
73
+ }
74
+ const newEntries = files.map((file) => {
75
+ const isImg = file.type.startsWith("image/");
76
+ return {
77
+ id: generateUniqueId("fu-"),
78
+ file,
79
+ progress: 0,
80
+ status: "idle",
81
+ ...isImg ? { previewUrl: URL.createObjectURL(file) } : {}
82
+ };
83
+ });
84
+ this._entries = this.multiple ? [...this._entries, ...newEntries] : newEntries;
85
+ this._emitFilesChange(files);
86
+ if (this.simulate) {
87
+ newEntries.forEach((entry) => this._simulateUpload(entry));
88
+ }
89
+ }
90
+ /* ── Simulación de upload ── */
91
+ _simulateUpload(entry) {
92
+ const steps = 20;
93
+ const interval = this.simulateMs / steps;
94
+ const step = 100 / steps;
95
+ const willFail = Math.random() < 0.2;
96
+ const failAt = willFail ? Math.floor(Math.random() * 8 + 3) * step : Infinity;
97
+ entry.status = "uploading";
98
+ this.requestUpdate();
99
+ this.dispatchEvent(
100
+ new CustomEvent("ui-lib-upload-start", {
101
+ detail: { id: entry.id, file: entry.file },
102
+ bubbles: true,
103
+ composed: true
104
+ })
105
+ );
106
+ const tick = setInterval(() => {
107
+ const idx = this._entries.findIndex((e) => e.id === entry.id);
108
+ if (idx === -1) {
109
+ clearInterval(tick);
110
+ return;
111
+ }
112
+ const current = this._entries[idx];
113
+ if (!current) {
114
+ clearInterval(tick);
115
+ return;
116
+ }
117
+ const next = Math.min(current.progress + step, 100);
118
+ if (next >= failAt) {
119
+ clearInterval(tick);
120
+ this._entries = this._entries.map(
121
+ (e) => e.id === entry.id ? { ...e, progress: next, status: "error", errorMessage: "Error de conexión" } : e
122
+ );
123
+ this.requestUpdate();
124
+ this.dispatchEvent(
125
+ new CustomEvent("ui-lib-upload-error", {
126
+ detail: { id: entry.id, file: entry.file, message: "Error de conexión" },
127
+ bubbles: true,
128
+ composed: true
129
+ })
130
+ );
131
+ return;
132
+ }
133
+ if (next >= 100) {
134
+ clearInterval(tick);
135
+ this._entries = this._entries.map(
136
+ (e) => e.id === entry.id ? { ...e, progress: 100, status: "done" } : e
137
+ );
138
+ this.requestUpdate();
139
+ this.dispatchEvent(
140
+ new CustomEvent("ui-lib-upload-done", {
141
+ detail: { id: entry.id, file: entry.file },
142
+ bubbles: true,
143
+ composed: true
144
+ })
145
+ );
146
+ return;
147
+ }
148
+ this._entries = this._entries.map(
149
+ (e) => e.id === entry.id ? { ...e, progress: next } : e
150
+ );
151
+ this.requestUpdate();
152
+ }, interval);
153
+ }
154
+ /* ── Eliminar archivo ── */
155
+ _onRemove(id) {
156
+ const entry = this._entries.find((e) => e.id === id);
157
+ if (!entry) return;
158
+ if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);
159
+ this._entries = this._entries.filter((e) => e.id !== id);
160
+ this.dispatchEvent(
161
+ new CustomEvent("ui-lib-file-remove", {
162
+ detail: { id, file: entry.file },
163
+ bubbles: true,
164
+ composed: true
165
+ })
166
+ );
167
+ }
168
+ /* ── Upload all (delega a host si simulate=false) ── */
169
+ _onUploadAll() {
170
+ if (this.simulate) {
171
+ const idleEntries = this._entries.filter((e) => e.status === "idle" || e.status === "error");
172
+ idleEntries.forEach((e) => this._simulateUpload(e));
173
+ }
174
+ }
175
+ /* ── Limpiar lista ── */
176
+ _onClearAll() {
177
+ this._entries.forEach((e) => {
178
+ if (e.previewUrl) URL.revokeObjectURL(e.previewUrl);
44
179
  });
180
+ this._entries = [];
45
181
  }
46
- _handleInput(e) {
47
- const target = e.target;
48
- this.value = target.value;
182
+ /* ── Reset imagen ── */
183
+ _onResetImage() {
184
+ if (this._imagePreviewUrl) URL.revokeObjectURL(this._imagePreviewUrl);
185
+ this._imagePreviewUrl = null;
186
+ this._entries = [];
187
+ }
188
+ /* ── API pública ── */
189
+ /** Marca un archivo como completado desde el exterior */
190
+ markDone(id) {
191
+ this._entries = this._entries.map(
192
+ (e) => e.id === id ? { ...e, progress: 100, status: "done" } : e
193
+ );
194
+ }
195
+ /** Marca un archivo como error desde el exterior */
196
+ markError(id, message = "Error al subir") {
197
+ this._entries = this._entries.map(
198
+ (e) => e.id === id ? { ...e, status: "error", errorMessage: message } : e
199
+ );
200
+ }
201
+ /** Actualiza el progreso de un archivo desde el exterior */
202
+ setProgress(id, progress) {
203
+ this._entries = this._entries.map(
204
+ (e) => e.id === id ? { ...e, progress: Math.min(100, Math.max(0, progress)), status: "uploading" } : e
205
+ );
206
+ }
207
+ /** Archivos actuales en la lista */
208
+ get files() {
209
+ return [...this._entries];
210
+ }
211
+ /* ── Helpers ── */
212
+ _emitFilesChange(files) {
49
213
  this.dispatchEvent(
50
- new CustomEvent("ui-lib-input", {
51
- detail: { value: this.value },
214
+ new CustomEvent("ui-lib-files-change", {
215
+ detail: { files },
52
216
  bubbles: true,
53
217
  composed: true
54
218
  })
55
219
  );
56
220
  }
57
- _handleTogglePassword() {
58
- this._showPassword = !this._showPassword;
221
+ /* ── Lifecycle ── */
222
+ disconnectedCallback() {
223
+ super.disconnectedCallback();
224
+ this._entries.forEach((e) => {
225
+ if (e.previewUrl) URL.revokeObjectURL(e.previewUrl);
226
+ });
227
+ if (this._imagePreviewUrl) URL.revokeObjectURL(this._imagePreviewUrl);
228
+ }
229
+ /* ── Render ── */
230
+ render() {
231
+ return fileUploaderTemplate({
232
+ zone: this.zone,
233
+ title: this.title,
234
+ subtitle: this.subtitle,
235
+ hint: this.hint,
236
+ multiple: this.multiple,
237
+ accept: this.accept,
238
+ disabled: this.disabled,
239
+ isDragover: this._isDragover,
240
+ entries: this._entries,
241
+ imagePreviewUrl: this._imagePreviewUrl,
242
+ onDragover: (e) => this._onDragover(e),
243
+ onDragleave: () => this._onDragleave(),
244
+ onDrop: (e) => this._onDrop(e),
245
+ onInputChange: (e) => this._onInputChange(e),
246
+ onRemove: (id) => this._onRemove(id),
247
+ onUploadAll: () => this._onUploadAll(),
248
+ onClearAll: () => this._onClearAll(),
249
+ onResetImage: () => this._onResetImage()
250
+ });
59
251
  }
60
252
  };
61
- LibInput.styles = [
253
+ LibFileUploader.styles = [
62
254
  css`${unsafeCSS(sharedTokens)}`,
63
- css`${unsafeCSS(inputStyles)}`
255
+ css`${unsafeCSS(uploaderCss)}`
64
256
  ];
257
+ __decorateClass([
258
+ property({ type: String, reflect: true })
259
+ ], LibFileUploader.prototype, "zone", 2);
65
260
  __decorateClass([
66
261
  property({ type: String })
67
- ], LibInput.prototype, "label", 2);
262
+ ], LibFileUploader.prototype, "title", 2);
68
263
  __decorateClass([
69
264
  property({ type: String })
70
- ], LibInput.prototype, "placeholder", 2);
265
+ ], LibFileUploader.prototype, "subtitle", 2);
71
266
  __decorateClass([
72
267
  property({ type: String })
73
- ], LibInput.prototype, "type", 2);
268
+ ], LibFileUploader.prototype, "hint", 2);
74
269
  __decorateClass([
75
270
  property({ type: Boolean, reflect: true })
76
- ], LibInput.prototype, "required", 2);
271
+ ], LibFileUploader.prototype, "multiple", 2);
272
+ __decorateClass([
273
+ property({ type: String })
274
+ ], LibFileUploader.prototype, "accept", 2);
77
275
  __decorateClass([
78
276
  property({ type: Boolean, reflect: true })
79
- ], LibInput.prototype, "disabled", 2);
277
+ ], LibFileUploader.prototype, "disabled", 2);
80
278
  __decorateClass([
81
279
  property({ type: Boolean, reflect: true })
82
- ], LibInput.prototype, "error", 2);
280
+ ], LibFileUploader.prototype, "simulate", 2);
83
281
  __decorateClass([
84
- property({ type: String })
85
- ], LibInput.prototype, "errorMessage", 2);
282
+ property({ type: Number, attribute: "simulate-ms" })
283
+ ], LibFileUploader.prototype, "simulateMs", 2);
86
284
  __decorateClass([
87
- property({ type: String })
88
- ], LibInput.prototype, "value", 2);
285
+ state()
286
+ ], LibFileUploader.prototype, "_isDragover", 2);
287
+ __decorateClass([
288
+ state()
289
+ ], LibFileUploader.prototype, "_entries", 2);
89
290
  __decorateClass([
90
291
  state()
91
- ], LibInput.prototype, "_showPassword", 2);
92
- LibInput = __decorateClass([
93
- customElement("lib-input")
94
- ], LibInput);
292
+ ], LibFileUploader.prototype, "_imagePreviewUrl", 2);
293
+ LibFileUploader = __decorateClass([
294
+ customElement("lib-file-uploader")
295
+ ], LibFileUploader);
95
296
  export {
96
- LibInput
297
+ LibFileUploader
97
298
  };
98
299
  //# sourceMappingURL=index56.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index56.js","sources":["../src/components/molecules/input/lib-input.component.ts"],"sourcesContent":["import { LitElement, css, unsafeCSS, TemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport sharedTokens from '../../../styles/shared/tokens.css?inline';\nimport inputStyles from './lib-input.css?inline';\nimport { inputTemplate } from './lib-input.html';\n\nexport interface LibInputEventDetail {\n value: string;\n}\n\n/**\n * @element lib-input\n * @fires ui-lib-input - Evento disparado al cambiar el valor del input.\n * @slot prefix - Icono o elemento antes del input.\n * @slot suffix - Icono o elemento después del input.\n */\n@customElement('lib-input')\nexport class LibInput extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(inputStyles)}`,\n ];\n\n @property({ type: String }) label = '';\n @property({ type: String }) placeholder = '';\n @property({ type: String }) type: 'text' | 'email' | 'password' = 'text';\n @property({ type: Boolean, reflect: true }) required = false;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) error = false;\n @property({ type: String }) errorMessage = '';\n @property({ type: String }) value = '';\n\n @state() private _showPassword = false;\n\n private readonly _uuid = `lib-input-${Math.random().toString(36).slice(2, 9)}`;\n\n override render(): TemplateResult {\n return inputTemplate({\n uuid: this._uuid,\n type: this.type,\n label: this.label,\n placeholder: this.placeholder,\n required: this.required,\n disabled: this.disabled,\n error: this.error,\n errorMessage: this.errorMessage,\n value: this.value,\n showPassword: this._showPassword,\n handleInput: this._handleInput.bind(this),\n handleTogglePassword: this._handleTogglePassword.bind(this),\n });\n }\n\n private _handleInput(e: InputEvent): void {\n const target = e.target as HTMLInputElement;\n this.value = target.value;\n\n this.dispatchEvent(\n new CustomEvent<LibInputEventDetail>('ui-lib-input', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handleTogglePassword(): void {\n this._showPassword = !this._showPassword;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lib-input': LibInput;\n }\n}"],"names":[],"mappings":";;;;;;;;;;;;;;;AAiBO,IAAM,WAAN,cAAuB,WAAW;AAAA,EAAlC,cAAA;AAAA,UAAA,GAAA,SAAA;AAMuB,SAAA,QAAQ;AACR,SAAA,cAAc;AACd,SAAA,OAAsC;AACtB,SAAA,WAAW;AACX,SAAA,WAAW;AACX,SAAA,QAAQ;AACxB,SAAA,eAAe;AACf,SAAA,QAAQ;AAE3B,SAAQ,gBAAgB;AAEjC,SAAiB,QAAQ,aAAa,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,EAAA;AAAA,EAEnE,SAAyB;AAChC,WAAO,cAAc;AAAA,MACnB,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK,aAAa,KAAK,IAAI;AAAA,MACxC,sBAAsB,KAAK,sBAAsB,KAAK,IAAI;AAAA,IAAA,CAC3D;AAAA,EACH;AAAA,EAEQ,aAAa,GAAqB;AACxC,UAAM,SAAS,EAAE;AACjB,SAAK,QAAQ,OAAO;AAEpB,SAAK;AAAA,MACH,IAAI,YAAiC,gBAAgB;AAAA,QACnD,QAAQ,EAAE,OAAO,KAAK,MAAA;AAAA,QACtB,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEL;AAAA,EAEQ,wBAA8B;AACpC,SAAK,gBAAgB,CAAC,KAAK;AAAA,EAC7B;AACF;AApDa,SACK,SAAS;AAAA,EACvB,MAAM,UAAU,YAAY,CAAC;AAAA,EAC7B,MAAM,UAAU,WAAW,CAAC;AAC9B;AAE4B,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GANf,SAMiB,WAAA,SAAA,CAAA;AACA,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAPf,SAOiB,WAAA,eAAA,CAAA;AACA,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GARf,SAQiB,WAAA,QAAA,CAAA;AACgB,gBAAA;AAAA,EAA3C,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAT/B,SASiC,WAAA,YAAA,CAAA;AACA,gBAAA;AAAA,EAA3C,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAV/B,SAUiC,WAAA,YAAA,CAAA;AACA,gBAAA;AAAA,EAA3C,SAAS,EAAE,MAAM,SAAS,SAAS,MAAM;AAAA,GAX/B,SAWiC,WAAA,SAAA,CAAA;AAChB,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAZf,SAYiB,WAAA,gBAAA,CAAA;AACA,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAbf,SAaiB,WAAA,SAAA,CAAA;AAEX,gBAAA;AAAA,EAAhB,MAAA;AAAM,GAfI,SAeM,WAAA,iBAAA,CAAA;AAfN,WAAN,gBAAA;AAAA,EADN,cAAc,WAAW;AAAA,GACb,QAAA;"}
1
+ {"version":3,"file":"index56.js","sources":["../src/components/molecules/file-uploader/lib-file-uploader.component.ts"],"sourcesContent":["import { LitElement, css, unsafeCSS, TemplateResult } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { generateUniqueId } from '../../../core/a11y';\nimport uploaderCss from './lib-file-uploader.css?inline';\nimport sharedTokens from '../../../styles/shared/tokens.css?inline';\nimport { fileUploaderTemplate } from './lib-file-uploader.html';\nimport type {\n UploaderZone,\n FileEntry,\n FilesChangeDetail,\n UploadStartDetail,\n UploadDoneDetail,\n UploadErrorDetail,\n FileRemoveDetail,\n} from './lib-file-uploader.types';\n\n/**\n * @element lib-file-uploader\n *\n * Tres variantes de zona de drop:\n * - `zone=\"default\"` — zona grande con icono, título y lista de archivos\n * - `zone=\"compact\"` — zona horizontal para formularios, con lista adjunta\n * - `zone=\"image\"` — zona con aspect-ratio 16/7 y preview inline de imagen\n *\n * La lista de archivos muestra progreso por ítem, thumbnail para imágenes\n * y estados idle · uploading · done · error.\n *\n * El upload real se delega al exterior vía eventos. Si `simulate` es true,\n * el componente simula el upload internamente (útil en Storybook).\n *\n * @prop {UploaderZone} zone — Variante de zona (default: 'default')\n * @prop {string} title — Título de la zona\n * @prop {string} subtitle — Subtítulo (solo zone='default')\n * @prop {string} hint — Texto de restricciones (formatos, tamaño)\n * @prop {boolean} multiple — Permite múltiples archivos\n * @prop {string} accept — Tipos aceptados (e.g. '.pdf,image/*')\n * @prop {boolean} disabled — Deshabilita la zona\n * @prop {boolean} simulate — Simula upload internamente (Storybook)\n * @prop {number} simulateMs — Duración simulada en ms (default: 2000)\n *\n * @fires ui-lib-files-change — Al seleccionar/soltar archivos\n * Detail: { files: File[] }\n * @fires ui-lib-upload-start — Inicio de upload de un archivo\n * Detail: { id: string, file: File }\n * @fires ui-lib-upload-done — Upload completado\n * Detail: { id: string, file: File }\n * @fires ui-lib-upload-error — Upload fallido\n * Detail: { id: string, file: File, message: string }\n * @fires ui-lib-file-remove — Archivo eliminado de la lista\n * Detail: { id: string, file: File }\n */\n@customElement('lib-file-uploader')\nexport class LibFileUploader extends LitElement {\n static override styles = [\n css`${unsafeCSS(sharedTokens)}`,\n css`${unsafeCSS(uploaderCss)}`,\n ];\n\n /* ── Props ── */\n\n @property({ type: String, reflect: true })\n zone: UploaderZone = 'default';\n\n @property({ type: String })\n override title = 'Arrastra archivos aquí';\n\n @property({ type: String })\n subtitle = 'o busca en tu equipo';\n\n @property({ type: String })\n hint = 'PDF, DOCX, PNG, JPG · máx. 20 MB por archivo';\n\n @property({ type: Boolean, reflect: true })\n multiple = false;\n\n @property({ type: String })\n accept = '*';\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Simula el upload internamente (ideal para Storybook) */\n @property({ type: Boolean, reflect: true })\n simulate = false;\n\n /** Duración de la simulación por archivo en ms */\n @property({ type: Number, attribute: 'simulate-ms' })\n simulateMs = 2000;\n\n /* ── State ── */\n\n @state() private _isDragover = false;\n @state() private _entries: FileEntry[] = [];\n @state() private _imagePreviewUrl: string | null = null;\n\n /* ── Drag & Drop ── */\n\n private _onDragover(e: DragEvent): void {\n e.preventDefault();\n this._isDragover = true;\n }\n\n private _onDragleave(): void {\n this._isDragover = false;\n }\n\n private _onDrop(e: DragEvent): void {\n e.preventDefault();\n this._isDragover = false;\n const files = Array.from(e.dataTransfer?.files ?? []);\n if (files.length) this._processFiles(files);\n }\n\n /* ── Input change ── */\n\n private _onInputChange(e: Event): void {\n const input = e.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n if (files.length) this._processFiles(files);\n /* Limpiar el input para permitir seleccionar el mismo archivo otra vez */\n input.value = '';\n }\n\n /* ── Procesar archivos ── */\n\n private _processFiles(files: File[]): void {\n /* zone=image — solo un archivo, genera preview */\n if (this.zone === 'image') {\n const file = files[0];\n if (!file) return;\n\n /* Revocar URL anterior si existe */\n if (this._imagePreviewUrl) URL.revokeObjectURL(this._imagePreviewUrl);\n\n const entry: FileEntry = {\n id: generateUniqueId('fu-'),\n file,\n progress: 0,\n status: 'idle',\n previewUrl: URL.createObjectURL(file),\n };\n\n this._imagePreviewUrl = entry.previewUrl ?? null;\n this._entries = [entry];\n this._emitFilesChange([file]);\n\n if (this.simulate) this._simulateUpload(entry);\n return;\n }\n\n /* zone=default | compact — múltiples archivos */\n const newEntries: FileEntry[] = files.map((file): FileEntry => {\n const isImg = file.type.startsWith('image/');\n return {\n id: generateUniqueId('fu-'),\n file,\n progress: 0,\n status: 'idle',\n ...(isImg ? { previewUrl: URL.createObjectURL(file) } : {}),\n };\n });\n\n this._entries = this.multiple\n ? [...this._entries, ...newEntries]\n : newEntries;\n\n this._emitFilesChange(files);\n\n if (this.simulate) {\n newEntries.forEach(entry => this._simulateUpload(entry));\n }\n }\n\n /* ── Simulación de upload ── */\n\n private _simulateUpload(entry: FileEntry): void {\n const steps = 20;\n const interval = this.simulateMs / steps;\n const step = 100 / steps;\n\n /* Lanzar error aleatorio en ~20% de los archivos */\n const willFail = Math.random() < 0.2;\n const failAt = willFail ? Math.floor(Math.random() * 8 + 3) * step : Infinity;\n\n entry.status = 'uploading';\n this.requestUpdate();\n\n this.dispatchEvent(\n new CustomEvent<UploadStartDetail>('ui-lib-upload-start', {\n detail: { id: entry.id, file: entry.file },\n bubbles: true, composed: true,\n })\n );\n\n const tick = setInterval((): void => {\n const idx = this._entries.findIndex(e => e.id === entry.id);\n if (idx === -1) { clearInterval(tick); return; }\n\n const current = this._entries[idx];\n if (!current) { clearInterval(tick); return; }\n\n const next = Math.min(current.progress + step, 100);\n\n if (next >= failAt) {\n clearInterval(tick);\n this._entries = this._entries.map(e =>\n e.id === entry.id\n ? { ...e, progress: next, status: 'error', errorMessage: 'Error de conexión' }\n : e\n );\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent<UploadErrorDetail>('ui-lib-upload-error', {\n detail: { id: entry.id, file: entry.file, message: 'Error de conexión' },\n bubbles: true, composed: true,\n })\n );\n return;\n }\n\n if (next >= 100) {\n clearInterval(tick);\n this._entries = this._entries.map(e =>\n e.id === entry.id ? { ...e, progress: 100, status: 'done' } : e\n );\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent<UploadDoneDetail>('ui-lib-upload-done', {\n detail: { id: entry.id, file: entry.file },\n bubbles: true, composed: true,\n })\n );\n return;\n }\n\n this._entries = this._entries.map(e =>\n e.id === entry.id ? { ...e, progress: next } : e\n );\n this.requestUpdate();\n }, interval);\n }\n\n /* ── Eliminar archivo ── */\n\n private _onRemove(id: string): void {\n const entry = this._entries.find(e => e.id === id);\n if (!entry) return;\n\n /* Revocar object URL si existe */\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n\n this._entries = this._entries.filter(e => e.id !== id);\n\n this.dispatchEvent(\n new CustomEvent<FileRemoveDetail>('ui-lib-file-remove', {\n detail: { id, file: entry.file },\n bubbles: true, composed: true,\n })\n );\n }\n\n /* ── Upload all (delega a host si simulate=false) ── */\n\n private _onUploadAll(): void {\n if (this.simulate) {\n const idleEntries = this._entries.filter(e => e.status === 'idle' || e.status === 'error');\n idleEntries.forEach(e => this._simulateUpload(e));\n }\n /* Si simulate=false, el host escucha ui-lib-files-change y maneja el upload */\n }\n\n /* ── Limpiar lista ── */\n\n private _onClearAll(): void {\n this._entries.forEach(e => { if (e.previewUrl) URL.revokeObjectURL(e.previewUrl); });\n this._entries = [];\n }\n\n /* ── Reset imagen ── */\n\n private _onResetImage(): void {\n if (this._imagePreviewUrl) URL.revokeObjectURL(this._imagePreviewUrl);\n this._imagePreviewUrl = null;\n this._entries = [];\n }\n\n /* ── API pública ── */\n\n /** Marca un archivo como completado desde el exterior */\n public markDone(id: string): void {\n this._entries = this._entries.map(e =>\n e.id === id ? { ...e, progress: 100, status: 'done' } : e\n );\n }\n\n /** Marca un archivo como error desde el exterior */\n public markError(id: string, message = 'Error al subir'): void {\n this._entries = this._entries.map(e =>\n e.id === id ? { ...e, status: 'error', errorMessage: message } : e\n );\n }\n\n /** Actualiza el progreso de un archivo desde el exterior */\n public setProgress(id: string, progress: number): void {\n this._entries = this._entries.map(e =>\n e.id === id ? { ...e, progress: Math.min(100, Math.max(0, progress)), status: 'uploading' } : e\n );\n }\n\n /** Archivos actuales en la lista */\n public get files(): FileEntry[] {\n return [...this._entries];\n }\n\n /* ── Helpers ── */\n\n private _emitFilesChange(files: File[]): void {\n this.dispatchEvent(\n new CustomEvent<FilesChangeDetail>('ui-lib-files-change', {\n detail: { files },\n bubbles: true, composed: true,\n })\n );\n }\n\n /* ── Lifecycle ── */\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n /* Revocar todas las object URLs al desmontar */\n this._entries.forEach(e => { if (e.previewUrl) URL.revokeObjectURL(e.previewUrl); });\n if (this._imagePreviewUrl) URL.revokeObjectURL(this._imagePreviewUrl);\n }\n\n /* ── Render ── */\n\n protected override render(): TemplateResult {\n return fileUploaderTemplate({\n zone: this.zone,\n title: this.title,\n subtitle: this.subtitle,\n hint: this.hint,\n multiple: this.multiple,\n accept: this.accept,\n disabled: this.disabled,\n isDragover: this._isDragover,\n entries: this._entries,\n imagePreviewUrl: this._imagePreviewUrl,\n onDragover: (e): void => this._onDragover(e),\n onDragleave: (): void => this._onDragleave(),\n onDrop: (e): void => this._onDrop(e),\n onInputChange: (e): void => this._onInputChange(e),\n onRemove: (id): void => this._onRemove(id),\n onUploadAll: (): void => this._onUploadAll(),\n onClearAll: (): void => this._onClearAll(),\n onResetImage: (): void => this._onResetImage(),\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lib-file-uploader': LibFileUploader;\n }\n}"],"names":[],"mappings":"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"}