@shibui-ui/ui 1.25.1 → 1.26.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 (322) hide show
  1. package/dist/index.js +68 -68
  2. package/dist/index107.js +2 -2
  3. package/dist/index107.js.map +1 -1
  4. package/dist/index108.js +2 -2
  5. package/dist/index108.js.map +1 -1
  6. package/dist/index109.js +2 -2
  7. package/dist/index109.js.map +1 -1
  8. package/dist/index11.js +1 -1
  9. package/dist/index110.js +2 -2
  10. package/dist/index110.js.map +1 -1
  11. package/dist/index115.js +2 -2
  12. package/dist/index115.js.map +1 -1
  13. package/dist/index116.js +2 -2
  14. package/dist/index116.js.map +1 -1
  15. package/dist/index117.js +2 -2
  16. package/dist/index117.js.map +1 -1
  17. package/dist/index118.js +2 -2
  18. package/dist/index118.js.map +1 -1
  19. package/dist/index119.js +2 -2
  20. package/dist/index119.js.map +1 -1
  21. package/dist/index120.js +2 -2
  22. package/dist/index120.js.map +1 -1
  23. package/dist/index121.js +2 -2
  24. package/dist/index121.js.map +1 -1
  25. package/dist/index122.js +2 -2
  26. package/dist/index122.js.map +1 -1
  27. package/dist/index123.js +2 -2
  28. package/dist/index123.js.map +1 -1
  29. package/dist/index124.js +2 -2
  30. package/dist/index124.js.map +1 -1
  31. package/dist/index125.js +2 -2
  32. package/dist/index125.js.map +1 -1
  33. package/dist/index126.js +2 -2
  34. package/dist/index126.js.map +1 -1
  35. package/dist/index127.js +2 -2
  36. package/dist/index127.js.map +1 -1
  37. package/dist/index128.js +2 -2
  38. package/dist/index128.js.map +1 -1
  39. package/dist/index129.js +2 -2
  40. package/dist/index129.js.map +1 -1
  41. package/dist/index130.js +2 -2
  42. package/dist/index130.js.map +1 -1
  43. package/dist/index131.js +2 -2
  44. package/dist/index131.js.map +1 -1
  45. package/dist/index132.js +2 -2
  46. package/dist/index132.js.map +1 -1
  47. package/dist/index133.js +2 -2
  48. package/dist/index133.js.map +1 -1
  49. package/dist/index134.js +2 -2
  50. package/dist/index134.js.map +1 -1
  51. package/dist/index135.js +2 -2
  52. package/dist/index135.js.map +1 -1
  53. package/dist/index136.js +2 -2
  54. package/dist/index136.js.map +1 -1
  55. package/dist/index137.js +2 -2
  56. package/dist/index137.js.map +1 -1
  57. package/dist/index138.js +2 -2
  58. package/dist/index138.js.map +1 -1
  59. package/dist/index139.js +2 -2
  60. package/dist/index139.js.map +1 -1
  61. package/dist/index140.js +2 -2
  62. package/dist/index140.js.map +1 -1
  63. package/dist/index141.js +2 -2
  64. package/dist/index141.js.map +1 -1
  65. package/dist/index142.js +2 -2
  66. package/dist/index142.js.map +1 -1
  67. package/dist/index143.js +2 -2
  68. package/dist/index143.js.map +1 -1
  69. package/dist/index144.js +2 -2
  70. package/dist/index144.js.map +1 -1
  71. package/dist/index145.js +2 -2
  72. package/dist/index145.js.map +1 -1
  73. package/dist/index146.js +2 -2
  74. package/dist/index146.js.map +1 -1
  75. package/dist/index147.js +2 -2
  76. package/dist/index147.js.map +1 -1
  77. package/dist/index148.js +2 -2
  78. package/dist/index148.js.map +1 -1
  79. package/dist/index149.js +2 -2
  80. package/dist/index149.js.map +1 -1
  81. package/dist/index150.js +2 -2
  82. package/dist/index150.js.map +1 -1
  83. package/dist/index151.js +2 -2
  84. package/dist/index151.js.map +1 -1
  85. package/dist/index152.js +2 -2
  86. package/dist/index152.js.map +1 -1
  87. package/dist/index153.js +2 -2
  88. package/dist/index153.js.map +1 -1
  89. package/dist/index154.js +2 -2
  90. package/dist/index154.js.map +1 -1
  91. package/dist/index155.js +2 -2
  92. package/dist/index155.js.map +1 -1
  93. package/dist/index156.js +2 -2
  94. package/dist/index156.js.map +1 -1
  95. package/dist/index157.js +2 -2
  96. package/dist/index157.js.map +1 -1
  97. package/dist/index158.js +2 -2
  98. package/dist/index158.js.map +1 -1
  99. package/dist/index159.js +2 -2
  100. package/dist/index159.js.map +1 -1
  101. package/dist/index160.js +2 -2
  102. package/dist/index160.js.map +1 -1
  103. package/dist/index161.js +2 -2
  104. package/dist/index161.js.map +1 -1
  105. package/dist/index162.js +2 -2
  106. package/dist/index162.js.map +1 -1
  107. package/dist/index163.js +2 -2
  108. package/dist/index163.js.map +1 -1
  109. package/dist/index164.js +2 -2
  110. package/dist/index164.js.map +1 -1
  111. package/dist/index165.js +2 -2
  112. package/dist/index165.js.map +1 -1
  113. package/dist/index166.js +2 -2
  114. package/dist/index166.js.map +1 -1
  115. package/dist/index167.js +2 -2
  116. package/dist/index167.js.map +1 -1
  117. package/dist/index168.js +2 -2
  118. package/dist/index168.js.map +1 -1
  119. package/dist/index169.js +2 -2
  120. package/dist/index169.js.map +1 -1
  121. package/dist/index170.js +2 -2
  122. package/dist/index170.js.map +1 -1
  123. package/dist/index171.js +2 -2
  124. package/dist/index171.js.map +1 -1
  125. package/dist/index172.js +2 -2
  126. package/dist/index172.js.map +1 -1
  127. package/dist/index173.js +2 -2
  128. package/dist/index173.js.map +1 -1
  129. package/dist/index174.js +2 -2
  130. package/dist/index174.js.map +1 -1
  131. package/dist/index175.js +2 -2
  132. package/dist/index175.js.map +1 -1
  133. package/dist/index176.js +2 -2
  134. package/dist/index176.js.map +1 -1
  135. package/dist/index177.js +2 -2
  136. package/dist/index177.js.map +1 -1
  137. package/dist/index178.js +2 -2
  138. package/dist/index178.js.map +1 -1
  139. package/dist/index194.js +6 -97
  140. package/dist/index194.js.map +1 -1
  141. package/dist/index195.js +2 -2
  142. package/dist/index197.js +18 -2
  143. package/dist/index197.js.map +1 -1
  144. package/dist/index198.js +2 -74
  145. package/dist/index198.js.map +1 -1
  146. package/dist/index199.js +74 -64
  147. package/dist/index199.js.map +1 -1
  148. package/dist/index200.js +2 -2
  149. package/dist/index201.js +2 -57
  150. package/dist/index201.js.map +1 -1
  151. package/dist/index202.js +39 -2
  152. package/dist/index202.js.map +1 -1
  153. package/dist/index203.js +2 -2
  154. package/dist/index204.js +219 -144
  155. package/dist/index204.js.map +1 -1
  156. package/dist/index205.js +82 -43
  157. package/dist/index205.js.map +1 -1
  158. package/dist/index206.js +2 -51
  159. package/dist/index206.js.map +1 -1
  160. package/dist/index207.js +94 -2
  161. package/dist/index207.js.map +1 -1
  162. package/dist/index208.js +2 -33
  163. package/dist/index208.js.map +1 -1
  164. package/dist/index209.js +268 -2
  165. package/dist/index209.js.map +1 -1
  166. package/dist/index210.js +2 -6
  167. package/dist/index210.js.map +1 -1
  168. package/dist/index211.js +21 -2
  169. package/dist/index211.js.map +1 -1
  170. package/dist/index212.js +2 -260
  171. package/dist/index212.js.map +1 -1
  172. package/dist/index213.js +8 -16
  173. package/dist/index213.js.map +1 -1
  174. package/dist/index214.js +2 -2
  175. package/dist/index215.js +15 -2
  176. package/dist/index215.js.map +1 -1
  177. package/dist/index216.js +2 -66
  178. package/dist/index216.js.map +1 -1
  179. package/dist/index217.js +146 -24
  180. package/dist/index217.js.map +1 -1
  181. package/dist/index218.js +2 -2
  182. package/dist/index219.js +5 -2
  183. package/dist/index219.js.map +1 -1
  184. package/dist/index220.js +2 -81
  185. package/dist/index220.js.map +1 -1
  186. package/dist/index221.js +6 -78
  187. package/dist/index221.js.map +1 -1
  188. package/dist/index222.js +2 -2
  189. package/dist/index223.js +2 -133
  190. package/dist/index223.js.map +1 -1
  191. package/dist/index224.js +92 -2
  192. package/dist/index224.js.map +1 -1
  193. package/dist/index225.js +59 -2
  194. package/dist/index225.js.map +1 -1
  195. package/dist/index226.js +2 -72
  196. package/dist/index226.js.map +1 -1
  197. package/dist/index227.js +97 -94
  198. package/dist/index227.js.map +1 -1
  199. package/dist/index228.js +2 -2
  200. package/dist/index229.js +2 -71
  201. package/dist/index229.js.map +1 -1
  202. package/dist/index230.js +74 -2
  203. package/dist/index230.js.map +1 -1
  204. package/dist/index231.js +74 -2
  205. package/dist/index231.js.map +1 -1
  206. package/dist/index232.js +2 -12
  207. package/dist/index232.js.map +1 -1
  208. package/dist/index233.js +53 -5
  209. package/dist/index233.js.map +1 -1
  210. package/dist/index234.js +2 -2
  211. package/dist/index235.js +2 -18
  212. package/dist/index235.js.map +1 -1
  213. package/dist/index236.js +162 -2
  214. package/dist/index236.js.map +1 -1
  215. package/dist/index237.js +43 -84
  216. package/dist/index237.js.map +1 -1
  217. package/dist/index238.js +51 -2
  218. package/dist/index238.js.map +1 -1
  219. package/dist/index239.js +2 -2
  220. package/dist/index240.js +33 -39
  221. package/dist/index240.js.map +1 -1
  222. package/dist/index241.js +2 -2
  223. package/dist/index242.js +5 -236
  224. package/dist/index242.js.map +1 -1
  225. package/dist/index243.js +2 -82
  226. package/dist/index243.js.map +1 -1
  227. package/dist/index244.js +260 -2
  228. package/dist/index244.js.map +1 -1
  229. package/dist/index245.js +16 -93
  230. package/dist/index245.js.map +1 -1
  231. package/dist/index246.js +2 -2
  232. package/dist/index247.js +2 -268
  233. package/dist/index247.js.map +1 -1
  234. package/dist/index248.js +66 -2
  235. package/dist/index248.js.map +1 -1
  236. package/dist/index249.js +24 -13
  237. package/dist/index249.js.map +1 -1
  238. package/dist/index250.js +2 -2
  239. package/dist/index251.js +2 -9
  240. package/dist/index251.js.map +1 -1
  241. package/dist/index252.js +81 -2
  242. package/dist/index252.js.map +1 -1
  243. package/dist/index253.js +78 -12
  244. package/dist/index253.js.map +1 -1
  245. package/dist/index254.js +2 -2
  246. package/dist/index255.js +111 -132
  247. package/dist/index255.js.map +1 -1
  248. package/dist/index256.js +2 -2
  249. package/dist/index257.js +2 -5
  250. package/dist/index257.js.map +1 -1
  251. package/dist/index258.js +72 -2
  252. package/dist/index258.js.map +1 -1
  253. package/dist/index259.js +93 -5
  254. package/dist/index259.js.map +1 -1
  255. package/dist/index260.js +2 -2
  256. package/dist/index261.js +71 -2
  257. package/dist/index261.js.map +1 -1
  258. package/dist/index262.js +2 -92
  259. package/dist/index262.js.map +1 -1
  260. package/dist/index263.js +2 -59
  261. package/dist/index263.js.map +1 -1
  262. package/dist/index264.js +12 -2
  263. package/dist/index264.js.map +1 -1
  264. package/dist/index3.js +73 -73
  265. package/dist/index3.js.map +1 -1
  266. package/dist/index34.js +1 -1
  267. package/dist/index347.js +1 -1
  268. package/dist/index352.js +26 -19
  269. package/dist/index352.js.map +1 -1
  270. package/dist/index353.js +24 -13
  271. package/dist/index353.js.map +1 -1
  272. package/dist/index354.js +6 -20
  273. package/dist/index354.js.map +1 -1
  274. package/dist/index355.js +18 -56
  275. package/dist/index355.js.map +1 -1
  276. package/dist/index356.js +57 -55
  277. package/dist/index356.js.map +1 -1
  278. package/dist/index357.js +64 -32
  279. package/dist/index357.js.map +1 -1
  280. package/dist/index44.js +1 -1
  281. package/dist/index47.js +1 -1
  282. package/dist/index49.js +2 -2
  283. package/dist/index50.js +2 -2
  284. package/dist/index51.js +2 -2
  285. package/dist/index52.js +2 -2
  286. package/dist/index53.js +3 -3
  287. package/dist/index54.js +2 -2
  288. package/dist/index55.js +2 -2
  289. package/dist/index56.js +3 -3
  290. package/dist/index57.js +2 -2
  291. package/dist/index58.js +2 -2
  292. package/dist/index59.js +2 -2
  293. package/dist/index60.js +2 -2
  294. package/dist/index61.js +2 -2
  295. package/dist/index62.js +2 -2
  296. package/dist/index63.js +2 -2
  297. package/dist/index64.js +2 -2
  298. package/dist/index65.js +2 -2
  299. package/dist/index66.js +1 -1
  300. package/dist/index67.js +1 -1
  301. package/dist/index68.js +2 -2
  302. package/dist/index69.js +2 -2
  303. package/dist/index70.js +2 -2
  304. package/dist/index71.js +2 -2
  305. package/dist/index72.js +2 -2
  306. package/dist/index73.js +2 -2
  307. package/dist/index74.js +2 -2
  308. package/dist/index75.js +2 -2
  309. package/dist/index76.js +2 -2
  310. package/dist/index77.js +2 -2
  311. package/dist/index78.js +2 -2
  312. package/dist/index79.js +2 -2
  313. package/dist/index80.js +2 -2
  314. package/dist/index81.js +2 -2
  315. package/dist/index82.js +1 -1
  316. package/dist/index83.js +2 -2
  317. package/dist/index84.js +2 -2
  318. package/dist/shared/icons/icon-registry.d.ts +2 -2
  319. package/dist/shared/icons/icon-registry.d.ts.map +1 -1
  320. package/dist/src/shared/icons/icon-registry.d.ts +2 -2
  321. package/dist/src/shared/icons/icon-registry.d.ts.map +1 -1
  322. package/package.json +1 -1
package/dist/index227.js CHANGED
@@ -1,100 +1,103 @@
1
- import { nothing, html } from "lit";
2
- function selectTemplate(props) {
3
- const {
4
- label,
5
- placeholder,
6
- hint,
7
- errorMessage,
8
- required,
9
- optional,
10
- open,
11
- error,
12
- selectedLabel,
13
- hasSelection,
14
- multi,
15
- selectedCount,
16
- searchable,
17
- searchQuery,
18
- visibleCount,
19
- onTriggerClick,
20
- onSearchInput,
21
- onConfirm
22
- } = props;
23
- const labelTpl = label ? html`
24
- <label class="sel-label">
25
- ${label}
26
- ${required ? html`<span class="sel-label-req" aria-hidden="true">*</span>` : nothing}
27
- ${optional ? html`<span class="sel-label-opt">(opcional)</span>` : nothing}
28
- </label>` : nothing;
29
- const hintTpl = error && errorMessage ? html`<span class="sel-hint is-error">${errorMessage}</span>` : hint ? html`<span class="sel-hint">${hint}</span>` : nothing;
30
- const triggerValueTpl = multi ? selectedCount > 0 ? html`
31
- <span class="sel-trigger-value">
32
- ${selectedCount} seleccionada${selectedCount !== 1 ? "s" : ""}
33
- <span class="sel-trigger-count">${selectedCount}</span>
34
- </span>` : html`<span class="sel-trigger-value is-placeholder">${placeholder}</span>` : hasSelection ? html`<span class="sel-trigger-value">${selectedLabel}</span>` : html`<span class="sel-trigger-value is-placeholder">${placeholder}</span>`;
35
- const searchTpl = searchable ? html`
36
- <div class="sel-panel-search">
37
- <span class="sel-panel-search-icon" aria-hidden="true"></span>
38
- <input
39
- type="text"
40
- placeholder="Buscar…"
41
- .value="${searchQuery}"
42
- @input="${onSearchInput}"
43
- autocomplete="off"
44
- aria-label="Buscar opciones"
45
- >
46
- </div>` : nothing;
47
- const footerTpl = multi ? html`
48
- <div class="sel-panel-footer">
49
- <span class="sel-panel-footer-text">
50
- ${selectedCount} seleccionada${selectedCount !== 1 ? "s" : ""}
51
- </span>
52
- <button
53
- class="sel-panel-footer-btn"
54
- type="button"
55
- @click="${onConfirm}"
56
- >Confirmar</button>
57
- </div>` : nothing;
58
- const emptyTpl = searchable && searchQuery && visibleCount === 0 ? html`<div class="sel-panel-empty">Sin resultados</div>` : nothing;
1
+ import { html, nothing } from "lit";
2
+ import { classMap as e } from "./index352.js";
3
+ function renderSep(separator) {
4
+ if (separator === "chevron") {
5
+ return html`
6
+ <span class="bc-sep" aria-hidden="true">
7
+ <lib-icon name="caret-right" size="xs"></lib-icon>
8
+ </span>
9
+ `;
10
+ }
11
+ return html`<span class="bc-sep" aria-hidden="true"></span>`;
12
+ }
13
+ function renderIcon(icon) {
14
+ if (!icon) return nothing;
15
+ return html`<span class="bc-icon"><lib-icon name="${icon}" size="xs"></lib-icon></span>`;
16
+ }
17
+ function renderLink(item, index, separator, onNavigate) {
18
+ return html`
19
+ <li class="bc-item">
20
+ <a
21
+ class="bc-link"
22
+ href="${item.href ?? "#"}"
23
+ @click="${(e2) => {
24
+ e2.preventDefault();
25
+ onNavigate(item, index);
26
+ }}"
27
+ >
28
+ ${renderIcon(item.icon)}
29
+ ${item.label ? html`${item.label}` : nothing}
30
+ </a>
31
+ ${renderSep(separator)}
32
+ </li>
33
+ `;
34
+ }
35
+ function renderCurrent(item) {
36
+ return html`
37
+ <li class="bc-item">
38
+ <span class="bc-current" aria-current="page">
39
+ ${renderIcon(item.icon)}
40
+ ${item.label ? html`${item.label}` : nothing}
41
+ </span>
42
+ </li>
43
+ `;
44
+ }
45
+ function renderEllipsis(separator, onExpand) {
46
+ return html`
47
+ <li class="bc-item">
48
+ <button
49
+ class="bc-ellipsis"
50
+ aria-label="Mostrar ruta completa"
51
+ @click="${onExpand}"
52
+ >…</button>
53
+ ${renderSep(separator)}
54
+ </li>
55
+ `;
56
+ }
57
+ function renderItems(p) {
58
+ const { items, separator, maxVisible, expanded, onExpand, onNavigate } = p;
59
+ const shouldCollapse = maxVisible > 0 && items.length > maxVisible && !expanded;
60
+ if (shouldCollapse) {
61
+ const first = items[0];
62
+ const last = items[items.length - 1];
63
+ if (!first || !last) return [];
64
+ return [
65
+ renderLink(first, 0, separator, onNavigate),
66
+ renderEllipsis(separator, onExpand),
67
+ last.href ? renderLink(last, items.length - 1, separator, onNavigate) : renderCurrent(last)
68
+ ];
69
+ }
70
+ return items.map((item, i) => {
71
+ const isLast = i === items.length - 1;
72
+ if (isLast || !item.href) return renderCurrent(item);
73
+ return renderLink(item, i, separator, onNavigate);
74
+ });
75
+ }
76
+ function breadcrumbTemplate(p) {
77
+ const bcClasses = {
78
+ "bc": true,
79
+ "bc-slash": p.separator === "slash",
80
+ "bc-chevron": p.separator === "chevron",
81
+ "bc-dot": p.separator === "dot",
82
+ "bc-line": p.separator === "line",
83
+ "bc-sm": p.size === "sm",
84
+ "bc-lg": p.size === "lg",
85
+ "bc-filled": p.surface === "filled",
86
+ "bc-pill": p.surface === "pill",
87
+ "bc-kaki": p.accent === "kaki",
88
+ "bc-celadon": p.accent === "celadon",
89
+ "bc-bold": p.accent === "bold",
90
+ "bc-dark": p.dark
91
+ };
59
92
  return html`
60
- <div class="sel-field">
61
-
62
- ${labelTpl}
63
-
64
- <div class="sel-custom">
65
- <button
66
- class="sel-trigger"
67
- type="button"
68
- aria-haspopup="listbox"
69
- aria-expanded="${open}"
70
- @click="${onTriggerClick}"
71
- >
72
- ${triggerValueTpl}
73
- <span class="sel-trigger-chevron" aria-hidden="true"></span>
74
- </button>
75
-
76
- <div
77
- class="sel-panel"
78
- role="listbox"
79
- aria-multiselectable="${multi}"
80
- >
81
- ${searchTpl}
82
-
83
- <div class="sel-panel-list">
84
- <slot></slot>
85
- ${emptyTpl}
86
- </div>
87
-
88
- ${footerTpl}
89
- </div>
90
- </div>
91
-
92
- ${hintTpl}
93
-
94
- </div>
93
+ <nav class="${e(bcClasses)}" aria-label="breadcrumb">
94
+ <ol class="bc-list">
95
+ ${renderItems(p)}
96
+ </ol>
97
+ </nav>
95
98
  `;
96
99
  }
97
100
  export {
98
- selectTemplate
101
+ breadcrumbTemplate
99
102
  };
100
103
  //# sourceMappingURL=index227.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index227.js","sources":["../src/components/molecules/select/lib-select.html.ts"],"sourcesContent":["import { html, nothing, TemplateResult } from 'lit';\nimport type { SelectSize, SelectVariant } from './lib-select.types';\n\nexport interface SelectTemplateProps {\n /* Field meta */\n label: string;\n placeholder: string;\n hint: string;\n errorMessage: string;\n required: boolean;\n optional: boolean;\n\n /* State */\n open: boolean;\n disabled: boolean;\n error: boolean;\n dark: boolean;\n\n /* Appearance */\n size: SelectSize;\n variant: SelectVariant;\n\n /* Single selection */\n selectedLabel: string;\n hasSelection: boolean;\n\n /* Multi selection */\n multi: boolean;\n selectedCount: number;\n\n /* Searchable */\n searchable: boolean;\n searchQuery: string;\n visibleCount: number;\n\n /* Handlers */\n onTriggerClick: (e: Event) => void;\n onSearchInput: (e: Event) => void;\n onConfirm: () => void;\n}\n\n/**\n * Template para lib-select.\n * Las opciones son elementos slotted — lib-select-option hijos en el light DOM.\n */\nexport function selectTemplate(props: SelectTemplateProps): TemplateResult {\n const {\n label, placeholder, hint, errorMessage,\n required, optional,\n open, error,\n selectedLabel, hasSelection,\n multi, selectedCount,\n searchable, searchQuery, visibleCount,\n onTriggerClick, onSearchInput, onConfirm,\n } = props;\n\n /* ── Label section ── */\n const labelTpl = label\n ? html`\n <label class=\"sel-label\">\n ${label}\n ${required ? html`<span class=\"sel-label-req\" aria-hidden=\"true\">*</span>` : nothing}\n ${optional ? html`<span class=\"sel-label-opt\">(opcional)</span>` : nothing}\n </label>`\n : nothing;\n\n /* ── Hint / error message ── */\n const hintTpl = error && errorMessage\n ? html`<span class=\"sel-hint is-error\">${errorMessage}</span>`\n : hint\n ? html`<span class=\"sel-hint\">${hint}</span>`\n : nothing;\n\n /* ── Trigger value display ── */\n const triggerValueTpl = multi\n ? selectedCount > 0\n ? html`\n <span class=\"sel-trigger-value\">\n ${selectedCount} seleccionada${selectedCount !== 1 ? 's' : ''}\n <span class=\"sel-trigger-count\">${selectedCount}</span>\n </span>`\n : html`<span class=\"sel-trigger-value is-placeholder\">${placeholder}</span>`\n : hasSelection\n ? html`<span class=\"sel-trigger-value\">${selectedLabel}</span>`\n : html`<span class=\"sel-trigger-value is-placeholder\">${placeholder}</span>`;\n\n /* ── Search row ── */\n const searchTpl = searchable\n ? html`\n <div class=\"sel-panel-search\">\n <span class=\"sel-panel-search-icon\" aria-hidden=\"true\"></span>\n <input\n type=\"text\"\n placeholder=\"Buscar…\"\n .value=\"${searchQuery}\"\n @input=\"${onSearchInput}\"\n autocomplete=\"off\"\n aria-label=\"Buscar opciones\"\n >\n </div>`\n : nothing;\n\n /* ── Panel footer for multi ── */\n const footerTpl = multi\n ? html`\n <div class=\"sel-panel-footer\">\n <span class=\"sel-panel-footer-text\">\n ${selectedCount} seleccionada${selectedCount !== 1 ? 's' : ''}\n </span>\n <button\n class=\"sel-panel-footer-btn\"\n type=\"button\"\n @click=\"${onConfirm}\"\n >Confirmar</button>\n </div>`\n : nothing;\n\n /* ── Empty state when search yields 0 results ── */\n const emptyTpl = searchable && searchQuery && visibleCount === 0\n ? html`<div class=\"sel-panel-empty\">Sin resultados</div>`\n : nothing;\n\n return html`\n <div class=\"sel-field\">\n\n ${labelTpl}\n\n <div class=\"sel-custom\">\n <button\n class=\"sel-trigger\"\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"${open}\"\n @click=\"${onTriggerClick}\"\n >\n ${triggerValueTpl}\n <span class=\"sel-trigger-chevron\" aria-hidden=\"true\"></span>\n </button>\n\n <div\n class=\"sel-panel\"\n role=\"listbox\"\n aria-multiselectable=\"${multi}\"\n >\n ${searchTpl}\n\n <div class=\"sel-panel-list\">\n <slot></slot>\n ${emptyTpl}\n </div>\n\n ${footerTpl}\n </div>\n </div>\n\n ${hintTpl}\n\n </div>\n `;\n}"],"names":[],"mappings":";AA6CO,SAAS,eAAe,OAA4C;AACzE,QAAM;AAAA,IACJ;AAAA,IAAO;AAAA,IAAa;AAAA,IAAM;AAAA,IAC1B;AAAA,IAAU;AAAA,IACV;AAAA,IAAM;AAAA,IACN;AAAA,IAAe;AAAA,IACf;AAAA,IAAO;AAAA,IACP;AAAA,IAAY;AAAA,IAAa;AAAA,IACzB;AAAA,IAAgB;AAAA,IAAe;AAAA,EAAA,IAC7B;AAGJ,QAAM,WAAW,QACb;AAAA;AAAA,YAEM,KAAK;AAAA,YACL,WAAW,gEAAgE,OAAO;AAAA,YAClF,WAAW,sDAAsD,OAAO;AAAA,oBAE9E;AAGJ,QAAM,UAAU,SAAS,eACrB,uCAAuC,YAAY,YACnD,OACE,8BAA8B,IAAI,YAClC;AAGN,QAAM,kBAAkB,QACpB,gBAAgB,IACd;AAAA;AAAA,cAEM,aAAa,gBAAgB,kBAAkB,IAAI,MAAM,EAAE;AAAA,8CAC3B,aAAa;AAAA,qBAEnD,sDAAsD,WAAW,YACnE,eACE,uCAAuC,aAAa,YACpD,sDAAsD,WAAW;AAGvE,QAAM,YAAY,aACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMgB,WAAW;AAAA,sBACX,aAAa;AAAA;AAAA;AAAA;AAAA,kBAK7B;AAGJ,QAAM,YAAY,QACd;AAAA;AAAA;AAAA,cAGQ,aAAa,gBAAgB,kBAAkB,IAAI,MAAM,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,sBAKnD,SAAS;AAAA;AAAA,kBAGzB;AAGJ,QAAM,WAAW,cAAc,eAAe,iBAAiB,IAC3D,0DACA;AAEJ,SAAO;AAAA;AAAA;AAAA,QAGD,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAOW,IAAI;AAAA,oBACX,cAAc;AAAA;AAAA,YAEtB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAOO,KAAK;AAAA;AAAA,YAE3B,SAAS;AAAA;AAAA;AAAA;AAAA,cAIP,QAAQ;AAAA;AAAA;AAAA,YAGV,SAAS;AAAA;AAAA;AAAA;AAAA,QAIb,OAAO;AAAA;AAAA;AAAA;AAIf;"}
1
+ {"version":3,"file":"index227.js","sources":["../src/components/molecules/breadcrumb/lib-breadcrumb.html.ts"],"sourcesContent":["import { html, nothing, TemplateResult } from 'lit';\nimport { classMap } from 'lit/directives/class-map.js';\nimport type {\n BreadcrumbItem,\n BreadcrumbSeparator,\n BreadcrumbSize,\n BreadcrumbSurface,\n BreadcrumbAccent,\n} from './lib-breadcrumb.types';\n\nexport interface BreadcrumbTemplateProps {\n items: BreadcrumbItem[];\n separator: BreadcrumbSeparator;\n size: BreadcrumbSize;\n surface: BreadcrumbSurface;\n accent: BreadcrumbAccent;\n dark: boolean;\n /** Si > 0 y items.length > maxVisible, colapsa los crumbs intermedios. */\n maxVisible: number;\n /** Estado interno: ¿está expandido el truncado? */\n expanded: boolean;\n onExpand: () => void;\n onNavigate: (item: BreadcrumbItem, index: number) => void;\n}\n\n/* ── Separador ─────────────────────────────────────────── */\nfunction renderSep(separator: BreadcrumbSeparator): TemplateResult {\n if (separator === 'chevron') {\n return html`\n <span class=\"bc-sep\" aria-hidden=\"true\">\n <lib-icon name=\"caret-right\" size=\"xs\"></lib-icon>\n </span>\n `;\n }\n return html`<span class=\"bc-sep\" aria-hidden=\"true\"></span>`;\n}\n\n/* ── Icono opcional dentro de un crumb ─────────────────── */\nfunction renderIcon(icon?: string): TemplateResult | typeof nothing {\n if (!icon) return nothing;\n return html`<span class=\"bc-icon\"><lib-icon name=\"${icon}\" size=\"xs\"></lib-icon></span>`;\n}\n\n/* ── Crumb enlazable (ancestro) ─────────────────────────── */\nfunction renderLink(\n item: BreadcrumbItem,\n index: number,\n separator: BreadcrumbSeparator,\n onNavigate: BreadcrumbTemplateProps['onNavigate'],\n): TemplateResult {\n return html`\n <li class=\"bc-item\">\n <a\n class=\"bc-link\"\n href=\"${item.href ?? '#'}\"\n @click=\"${(e: Event):void => { e.preventDefault(); onNavigate(item, index); }}\"\n >\n ${renderIcon(item.icon)}\n ${item.label ? html`${item.label}` : nothing}\n </a>\n ${renderSep(separator)}\n </li>\n `;\n}\n\n/* ── Crumb activo (último) ──────────────────────────────── */\nfunction renderCurrent(item: BreadcrumbItem): TemplateResult {\n return html`\n <li class=\"bc-item\">\n <span class=\"bc-current\" aria-current=\"page\">\n ${renderIcon(item.icon)}\n ${item.label ? html`${item.label}` : nothing}\n </span>\n </li>\n `;\n}\n\n/* ── Botón de ellipsis (truncado) ──────────────────────── */\nfunction renderEllipsis(\n separator: BreadcrumbSeparator,\n onExpand: () => void,\n): TemplateResult {\n return html`\n <li class=\"bc-item\">\n <button\n class=\"bc-ellipsis\"\n aria-label=\"Mostrar ruta completa\"\n @click=\"${onExpand}\"\n >…</button>\n ${renderSep(separator)}\n </li>\n `;\n}\n\n/* ── Lista de ítems con lógica de collapse ─────────────── */\nfunction renderItems(p: BreadcrumbTemplateProps): TemplateResult[] {\n const { items, separator, maxVisible, expanded, onExpand, onNavigate } = p;\n\n const shouldCollapse =\n maxVisible > 0 &&\n items.length > maxVisible &&\n !expanded;\n\n if (shouldCollapse) {\n const first = items[0];\n const last = items[items.length - 1];\n\n if (!first || !last) return [];\n\n return [\n renderLink(first, 0, separator, onNavigate),\n renderEllipsis(separator, onExpand),\n last.href\n ? renderLink(last, items.length - 1, separator, onNavigate)\n : renderCurrent(last),\n ];\n }\n\n return items.map((item, i) => {\n const isLast = i === items.length - 1;\n if (isLast || !item.href) return renderCurrent(item);\n return renderLink(item, i, separator, onNavigate);\n });\n}\n\n/* ── Template principal ─────────────────────────────────── */\nexport function breadcrumbTemplate(p: BreadcrumbTemplateProps): TemplateResult {\n const bcClasses = {\n 'bc': true,\n 'bc-slash': p.separator === 'slash',\n 'bc-chevron': p.separator === 'chevron',\n 'bc-dot': p.separator === 'dot',\n 'bc-line': p.separator === 'line',\n 'bc-sm': p.size === 'sm',\n 'bc-lg': p.size === 'lg',\n 'bc-filled': p.surface === 'filled',\n 'bc-pill': p.surface === 'pill',\n 'bc-kaki': p.accent === 'kaki',\n 'bc-celadon': p.accent === 'celadon',\n 'bc-bold': p.accent === 'bold',\n 'bc-dark': p.dark,\n };\n\n return html`\n <nav class=\"${classMap(bcClasses)}\" aria-label=\"breadcrumb\">\n <ol class=\"bc-list\">\n ${renderItems(p)}\n </ol>\n </nav>\n `;\n}"],"names":["e","classMap"],"mappings":";;AA0BA,SAAS,UAAU,WAAgD;AACjE,MAAI,cAAc,WAAW;AAC3B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKT;AACA,SAAO;AACT;AAGA,SAAS,WAAW,MAAgD;AAClE,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,6CAA6C,IAAI;AAC1D;AAGA,SAAS,WACP,MACA,OACA,WACA,YACgB;AAChB,SAAO;AAAA;AAAA;AAAA;AAAA,gBAIO,KAAK,QAAQ,GAAG;AAAA,kBACd,CAACA,OAAkB;AAAE,IAAAA,GAAE,eAAA;AAAkB,eAAW,MAAM,KAAK;AAAA,EAAG,CAAC;AAAA;AAAA,UAE3E,WAAW,KAAK,IAAI,CAAC;AAAA,UACrB,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK,OAAO;AAAA;AAAA,QAE5C,UAAU,SAAS,CAAC;AAAA;AAAA;AAG5B;AAGA,SAAS,cAAc,MAAsC;AAC3D,SAAO;AAAA;AAAA;AAAA,UAGC,WAAW,KAAK,IAAI,CAAC;AAAA,UACrB,KAAK,QAAQ,OAAO,KAAK,KAAK,KAAK,OAAO;AAAA;AAAA;AAAA;AAIpD;AAGA,SAAS,eACP,WACA,UACgB;AAChB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,kBAKS,QAAQ;AAAA;AAAA,QAElB,UAAU,SAAS,CAAC;AAAA;AAAA;AAG5B;AAGA,SAAS,YAAY,GAA8C;AACjE,QAAM,EAAE,OAAO,WAAW,YAAY,UAAU,UAAU,eAAe;AAEzE,QAAM,iBACJ,aAAa,KACb,MAAM,SAAS,cACf,CAAC;AAEH,MAAI,gBAAgB;AAClB,UAAM,QAAQ,MAAM,CAAC;AACrB,UAAM,OAAQ,MAAM,MAAM,SAAS,CAAC;AAEpC,QAAI,CAAC,SAAS,CAAC,aAAa,CAAA;AAE5B,WAAO;AAAA,MACL,WAAW,OAAO,GAAG,WAAW,UAAU;AAAA,MAC1C,eAAe,WAAW,QAAQ;AAAA,MAClC,KAAK,OACD,WAAW,MAAM,MAAM,SAAS,GAAG,WAAW,UAAU,IACxD,cAAc,IAAI;AAAA,IAAA;AAAA,EAE1B;AAEA,SAAO,MAAM,IAAI,CAAC,MAAM,MAAM;AAC5B,UAAM,SAAS,MAAM,MAAM,SAAS;AACpC,QAAI,UAAU,CAAC,KAAK,KAAM,QAAO,cAAc,IAAI;AACnD,WAAO,WAAW,MAAM,GAAG,WAAW,UAAU;AAAA,EAClD,CAAC;AACH;AAGO,SAAS,mBAAmB,GAA4C;AAC7E,QAAM,YAAY;AAAA,IAChB,MAAiB;AAAA,IACjB,YAAiB,EAAE,cAAc;AAAA,IACjC,cAAiB,EAAE,cAAc;AAAA,IACjC,UAAiB,EAAE,cAAc;AAAA,IACjC,WAAiB,EAAE,cAAc;AAAA,IACjC,SAAiB,EAAE,SAAS;AAAA,IAC5B,SAAiB,EAAE,SAAS;AAAA,IAC5B,aAAiB,EAAE,YAAY;AAAA,IAC/B,WAAiB,EAAE,YAAY;AAAA,IAC/B,WAAiB,EAAE,WAAW;AAAA,IAC9B,cAAiB,EAAE,WAAW;AAAA,IAC9B,WAAiB,EAAE,WAAW;AAAA,IAC9B,WAAiB,EAAE;AAAA,EAAA;AAGrB,SAAO;AAAA,kBACSC,EAAS,SAAS,CAAC;AAAA;AAAA,UAE3B,YAAY,CAAC,CAAC;AAAA;AAAA;AAAA;AAIxB;"}
package/dist/index228.js CHANGED
@@ -1,5 +1,5 @@
1
- const selectCss = `@layer tokens,reset,components;@layer reset{:host{display:block;position:relative;width:100%}*,*:before,*:after{box-sizing:border-box}}@layer components{.sel-field{display:flex;flex-direction:column;gap:var(--lib-space-xs);width:100%}.sel-label{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wider);text-transform:uppercase;color:var(--text-secondary);display:flex;align-items:center;gap:var(--lib-space-xs);-webkit-user-select:none;user-select:none}.sel-label-req{color:var(--color-error);font-size:14px;line-height:1}.sel-label-opt{font-size:9px;letter-spacing:var(--tracking-wide);color:var(--text-muted);text-transform:uppercase}.sel-hint{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-muted)}.sel-hint.is-error{color:var(--color-error);display:flex;align-items:center;gap:var(--lib-space-xs)}.sel-hint.is-ok{color:var(--color-celadon-500);display:flex;align-items:center;gap:var(--lib-space-xs)}.sel-custom{position:relative;width:100%}.sel-trigger{display:flex;align-items:center;gap:var(--lib-space-sm);width:100%;padding:var(--lib-space-sm) var(--lib-space-md);font-family:var(--lib-font-body);font-size:var(--text-sm);color:var(--text-secondary);background:var(--bg-elevated);border:1px solid var(--border-default);border-radius:var(--radius-none);cursor:pointer;text-align:left;outline:none;transition:border-color var(--duration-base) var(--ease-default),background var(--duration-base) var(--ease-default),box-shadow var(--duration-base) var(--ease-default);-webkit-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.sel-trigger:hover:not([disabled]){background:var(--bg-surface);border-color:var(--border-strong)}.sel-trigger:focus-visible{border-color:var(--color-washi-800);box-shadow:0 0 0 3px #1a140e14;outline:none}:host([open]) .sel-trigger{border-color:var(--color-washi-800);box-shadow:0 0 0 3px #1a140e14}:host([disabled]) .sel-trigger{opacity:.38;cursor:not-allowed;pointer-events:none;background:var(--bg-surface)}:host([error]) .sel-trigger{border-color:var(--color-error-border, #C44030);background:var(--color-error-light, #F5DDD9);color:var(--color-error)}:host([error][open]) .sel-trigger{box-shadow:0 0 0 3px #8c2a1a1f}.sel-trigger-value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:var(--lib-space-sm);line-height:var(--leading-snug)}.sel-trigger-value.is-placeholder{color:var(--text-muted)}.sel-trigger-count{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);background:var(--color-washi-900);color:var(--color-washi-50);padding:1px 6px;border-radius:var(--radius-full);flex-shrink:0}.sel-trigger-chevron{flex-shrink:0;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--text-muted);transition:transform var(--duration-slow) var(--ease-default);pointer-events:none}:host([open]) .sel-trigger-chevron{transform:rotate(180deg);border-top-color:var(--text-primary)}:host([variant="filled"]) .sel-trigger{background:var(--bg-surface);border-color:transparent}:host([variant="filled"]) .sel-trigger:hover:not([disabled]){background:var(--color-washi-200);border-color:transparent}:host([variant="filled"][open]) .sel-trigger{background:var(--bg-elevated);border-color:var(--color-washi-800)}:host([variant="ghost"]) .sel-trigger{background:transparent;border:none;border-bottom:1px solid var(--border-default);border-radius:0;padding-left:0}:host([variant="ghost"]) .sel-trigger:hover:not([disabled]){background:transparent;border-bottom-color:var(--border-strong)}:host([variant="ghost"][open]) .sel-trigger{box-shadow:0 1px 0 0 var(--color-washi-800);border-bottom-color:var(--color-washi-800)}:host([size="sm"]) .sel-trigger{padding:var(--lib-space-xs) var(--lib-space-sm);font-size:var(--text-xs)}:host([size="sm"]) .sel-label{font-size:10px}:host([size="lg"]) .sel-trigger{padding:var(--lib-space-md) var(--lib-space-lg);font-size:var(--text-base)}.sel-panel{position:absolute;top:calc(100% + 4px);left:0;right:0;min-width:100%;z-index:var(--z-toast, 300);background:var(--bg-elevated);border:1px solid var(--border-default);box-shadow:0 8px 24px #1a140e1f,0 2px 6px #1a140e12;opacity:0;transform:translateY(-6px) scaleY(.97);transform-origin:top center;pointer-events:none;transition:opacity .16s var(--ease-default),transform .2s var(--ease-default)}:host([open]) .sel-panel{opacity:1;transform:translateY(0) scaleY(1);pointer-events:auto}.sel-panel-search{display:flex;align-items:center;gap:var(--lib-space-sm);padding:var(--lib-space-sm) var(--lib-space-md);border-bottom:1px solid var(--border-subtle);color:var(--text-muted)}.sel-panel-search-icon{font-size:14px;flex-shrink:0;display:flex;align-items:center;color:var(--text-muted)}.sel-panel-search-icon:before{content:"";display:block;width:14px;height:14px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 256 256'%3E%3Cpath fill='%239A8878' d='M229.66 218.34l-50.07-50.07a88.19 88.19 0 1 0-11.31 11.31l50.06 50.07a8 8 0 0 0 11.32-11.31ZM40 112a72 72 0 1 1 72 72 72.08 72.08 0 0 1-72-72Z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain}.sel-panel-search input{flex:1;font-family:var(--lib-font-body);font-size:var(--text-sm);color:var(--text-primary);background:transparent;border:none;outline:none}.sel-panel-search input::placeholder{color:var(--text-muted)}.sel-panel-list{max-height:240px;overflow-y:auto;overscroll-behavior:contain}.sel-panel-list::-webkit-scrollbar{width:4px}.sel-panel-list::-webkit-scrollbar-track{background:transparent}.sel-panel-list::-webkit-scrollbar-thumb{background:var(--color-washi-300);border-radius:2px}.sel-group-label{font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--text-muted);padding:var(--lib-space-sm) var(--lib-space-md) var(--lib-space-xs)}.sel-sep{height:1px;background:var(--border-subtle);margin:var(--lib-space-xs) 0}.sel-option{display:flex;align-items:center;gap:var(--lib-space-sm);padding:var(--lib-space-sm) var(--lib-space-md);cursor:pointer;transition:background var(--duration-fast) var(--ease-default),color var(--duration-fast) var(--ease-default);position:relative}.sel-option:hover{background:var(--bg-surface)}.sel-option.is-selected{background:var(--color-washi-100)}.sel-option.is-focused{background:var(--bg-surface)}.sel-option.is-disabled{opacity:.38;cursor:not-allowed;pointer-events:none}.sel-option.is-hidden{display:none}.sel-option-icon{font-size:16px;color:var(--text-muted);flex-shrink:0;display:flex}.sel-option:hover .sel-option-icon,.sel-option.is-selected .sel-option-icon{color:var(--text-secondary)}.sel-option-body{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}.sel-option-label{font-family:var(--lib-font-body);font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-snug)}.sel-option-desc{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-muted)}.sel-option:hover .sel-option-label,.sel-option.is-selected .sel-option-label{color:var(--text-primary)}.sel-dot{width:8px;height:8px;border-radius:var(--radius-full);flex-shrink:0}.sel-option-check{margin-left:auto;flex-shrink:0;width:14px;height:14px;opacity:0;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 256 256'%3E%3Cpath fill='%23221C16' d='M229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69 218.34 66.34a8 8 0 0 1 11.32 11.32Z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:contain}.sel-option.is-selected .sel-option-check{opacity:1}.sel-panel-footer{padding:var(--lib-space-sm) var(--lib-space-md);border-top:1px solid var(--border-subtle);display:flex;align-items:center;justify-content:space-between;gap:var(--lib-space-sm)}.sel-panel-footer-text{font-family:var(--lib-font-mono);font-size:10px;color:var(--text-muted);letter-spacing:var(--tracking-wide)}.sel-panel-footer-btn{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wider);text-transform:uppercase;background:var(--color-washi-900);color:var(--color-washi-50);border:none;padding:var(--lib-space-xs) var(--lib-space-md);cursor:pointer;transition:background var(--duration-base) var(--ease-default)}.sel-panel-footer-btn:hover{background:var(--color-washi-800)}.sel-panel-empty{padding:var(--lib-space-lg) var(--lib-space-md);text-align:center;font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wider);color:var(--text-muted);text-transform:uppercase}:host([dark]) .sel-label{color:#574a43}:host([dark]) .sel-hint{color:#3c302a}:host([dark]) .sel-trigger{background:#100704;border-color:#231813;color:#998c84}:host([dark]) .sel-trigger:hover:not([disabled]){background:#150a06;border-color:#372b26}:host([dark][open]) .sel-trigger{border-color:#6d6059;box-shadow:0 0 0 3px #ffffff0d}:host([dark]) .sel-trigger-chevron{border-top-color:#433831}:host([dark][open]) .sel-trigger-chevron{border-top-color:#998c84}:host([dark]) .sel-trigger-value.is-placeholder{color:#3c302a}:host([dark]) .sel-panel{background:#0c0402;border-color:#1e130e}:host([dark]) .sel-panel-search{border-color:#190f0a}:host([dark]) .sel-panel-search input{color:#a99b93}:host([dark]) .sel-group-label{color:#312620}:host([dark]) .sel-sep{background:#190f0a}:host([dark]) .sel-option:hover{background:#150a06}:host([dark]) .sel-option.is-selected{background:#190f0a}:host([dark]) .sel-option-label{color:#7b6f67}:host([dark]) .sel-option:hover .sel-option-label{color:#b9aba2}:host([dark]) .sel-option.is-selected .sel-option-label{color:#c8bbb2}:host([dark]) .sel-option-desc{color:#362b25}:host([dark]) .sel-option-check{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 256 256'%3E%3Cpath fill='%23FAF7F4' d='M229.66 77.66l-128 128a8 8 0 0 1-11.32 0l-56-56a8 8 0 0 1 11.32-11.32L96 188.69 218.34 66.34a8 8 0 0 1 11.32 11.32Z'/%3E%3C/svg%3E")}:host([dark]) .sel-panel-footer{border-color:#190f0a}:host([dark]) .sel-panel-footer-text{color:#362b25}}`;
1
+ const componentCss = '@layer tokens,reset,components;@layer reset{:host{display:block}*,*:before,*:after{box-sizing:border-box}}@layer components{.bc{display:flex;align-items:center}.bc-list{display:flex;align-items:center;flex-wrap:wrap;list-style:none;gap:0;padding:0;margin:0}.bc-item{display:flex;align-items:center;gap:0;position:relative}.bc-link{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-muted);text-decoration:none;padding:var(--lib-space-xs) var(--lib-space-xs);transition:color var(--duration-fast);white-space:nowrap;display:flex;align-items:center;gap:var(--lib-space-xs)}.bc-link:hover{color:var(--text-primary)}.bc-current{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-secondary);white-space:nowrap;padding:var(--lib-space-xs) var(--lib-space-xs);display:flex;align-items:center;gap:var(--lib-space-xs)}.bc-sep{display:flex;align-items:center;padding:0 var(--lib-space-sm);color:var(--color-washi-300);-webkit-user-select:none;user-select:none;flex-shrink:0}.bc-slash .bc-sep:before{content:"/";font-family:var(--lib-font-mono);font-size:10px;line-height:1}.bc-dot .bc-sep:before{content:"·";font-family:var(--lib-font-mono);font-size:13px;line-height:1}.bc-line .bc-sep:before{content:"—";font-family:var(--lib-font-mono);font-size:10px;line-height:1}.bc-chevron .bc-sep{padding:0 var(--lib-space-xs);font-size:12px}.bc-chevron .bc-sep:before{content:none}.bc-icon{font-size:13px;display:flex;align-items:center;opacity:.7}.bc-sm .bc-link,.bc-sm .bc-current{font-size:10px;letter-spacing:var(--tracking-wide)}.bc-sm .bc-sep{padding:0 var(--lib-space-xs)}.bc-sm .bc-icon{font-size:11px}.bc-lg .bc-link,.bc-lg .bc-current{font-family:var(--lib-font-body);font-size:var(--text-sm);letter-spacing:0}.bc-lg .bc-icon{font-size:15px}.bc-filled{background:var(--bg-surface);border:1px solid var(--border-subtle);padding:var(--lib-space-sm) var(--lib-space-md)}.bc-pill .bc-link{background:var(--bg-surface);border:1px solid var(--border-subtle);padding:var(--lib-space-xs) var(--lib-space-sm);transition:background var(--duration-fast),border-color var(--duration-fast),color var(--duration-fast)}.bc-pill .bc-link:hover{background:var(--color-washi-200);border-color:var(--border-default);color:var(--text-primary)}.bc-pill .bc-current{background:var(--color-washi-900);color:var(--color-washi-50);border:1px solid var(--color-washi-900);padding:var(--lib-space-xs) var(--lib-space-sm)}.bc-pill .bc-sep{padding:0 var(--lib-space-sm)}.bc-kaki .bc-current,.bc-kaki .bc-link:hover{color:var(--color-kaki-500)}.bc-celadon .bc-current,.bc-celadon .bc-link:hover{color:var(--color-celadon-500)}.bc-bold .bc-current{color:var(--text-primary);font-weight:600}.bc-ellipsis{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-muted);background:var(--bg-surface);border:1px solid var(--border-subtle);padding:1px var(--lib-space-sm);cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast);line-height:1.6;display:inline-flex;align-items:center}.bc-ellipsis:hover{background:var(--color-washi-200);border-color:var(--border-default);color:var(--text-primary)}.bc-dropdown-wrap{position:relative}.bc-dropdown-panel{position:absolute;top:calc(100% + 4px);left:0;z-index:var(--z-dropdown, 300);background:var(--bg-elevated);border:1px solid var(--border-default);box-shadow:var(--shadow-md);min-width:180px;opacity:0;transform:translateY(-4px) scaleY(.97);transform-origin:top left;pointer-events:none;transition:opacity .16s var(--ease-out),transform .18s var(--ease-out)}.bc-dropdown-panel.is-open{opacity:1;transform:translateY(0) scaleY(1);pointer-events:auto}.bc-dropdown-item{display:flex;align-items:center;gap:var(--lib-space-sm);padding:var(--lib-space-sm) var(--lib-space-md);font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-secondary);text-decoration:none;cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast)}.bc-dropdown-item:hover{background:var(--bg-surface);color:var(--text-primary)}.bc-dropdown-item-icon{font-size:14px;color:var(--text-muted);display:flex;flex-shrink:0}.bc-dark .bc-link{color:#3c302a}.bc-dark .bc-link:hover{color:#998c84}.bc-dark .bc-current{color:#7b6f67}.bc-dark .bc-sep{color:#231813}.bc-dark.bc-filled{background:#100704;border-color:#1e130e}.bc-dark .bc-ellipsis{background:#100704;border-color:#1e130e;color:#433831}.bc-dark .bc-ellipsis:hover{background:#190f0a;color:#998c84}.bc-dark.bc-pill .bc-link{background:#100704;border-color:#1e130e}.bc-dark.bc-pill .bc-link:hover{background:#1e130e}.bc-dark.bc-pill .bc-current{background:#8a7d75;color:var(--color-washi-950);border-color:#8a7d75}.bc-dark .bc-dropdown-panel{background:#150a06;border-color:#231813}.bc-dark .bc-dropdown-item{color:#574a43}.bc-dark .bc-dropdown-item:hover{background:#1e130e;color:#998c84}}';
2
2
  export {
3
- selectCss as default
3
+ componentCss as default
4
4
  };
5
5
  //# sourceMappingURL=index228.js.map
package/dist/index229.js CHANGED
@@ -1,74 +1,5 @@
1
- import { nothing, html } from "lit";
2
- import { unsafeHTML as o } from "./index352.js";
3
- function renderBadge(item) {
4
- return item.badge != null ? html`<span class="tb-badge">${item.badge}</span>` : nothing;
5
- }
6
- function renderTab(item, context) {
7
- const isActive = context.active === item.id;
8
- const isDisabled = item.disabled === true;
9
- return html`
10
- ${item.group ? html`<div class="tb-label">${item.group}</div>` : nothing}
11
- <button
12
- id="tab-${item.id}"
13
- class="tb-tab ${isActive ? "is-active" : ""} ${isDisabled ? "is-disabled" : ""}"
14
- role="tab"
15
- aria-selected="${isActive}"
16
- aria-controls="panel-${item.id}"
17
- tabindex="${isActive ? "0" : "-1"}"
18
- data-id="${item.id}"
19
- data-label="${item.label}"
20
- ?disabled="${isDisabled}"
21
- @click="${(e) => context._handleClick(e)}"
22
- >
23
- ${item.icon ? html`${o(item.icon)}` : nothing}
24
- ${item.label}
25
- ${renderBadge(item)}
26
- </button>
27
- `;
28
- }
29
- function renderPanel(item, context) {
30
- const isActive = context.active === item.id;
31
- return html`
32
- <div
33
- class="tb-panel ${isActive ? "is-active" : ""}"
34
- role="tabpanel"
35
- id="panel-${item.id}"
36
- aria-labelledby="tab-${item.id}"
37
- >
38
- <slot name="${item.id}"></slot>
39
- </div>
40
- `;
41
- }
42
- function tabsTemplate(context) {
43
- const tabs = context.items ?? [];
44
- const showInk = !["pill", "card", "outline", "vertical"].includes(context.variant);
45
- return html`
46
- <div class="tb" part="root">
47
-
48
- <!-- Tab list -->
49
- <div
50
- class="tb-list"
51
- part="list"
52
- role="tablist"
53
- aria-label="${context.ariaLabel || nothing}"
54
-
55
- @keydown="${(e) => context._handleKey(e)}"
56
- >
57
- ${tabs.map((item) => renderTab(item, context))}
58
- </div>
59
-
60
- <!-- Ink bar (posicionada por JS, solo para variantes underline) -->
61
- ${showInk ? html`<div class="tb-ink" part="ink" style="left:${context._inkLeft}px;width:${context._inkWidth}px;"></div>` : nothing}
62
-
63
- <!-- Panels -->
64
- <div class="tb-panels" part="panels">
65
- ${tabs.map((item) => renderPanel(item, context))}
66
- </div>
67
-
68
- </div>
69
- `;
70
- }
1
+ const groupCss = '@layer tokens,reset,components;@layer reset{:host{display:inline-flex;align-items:stretch;vertical-align:middle;position:relative}*,*:before,*:after{box-sizing:border-box}}@layer components{.bg-wrap{display:inline-flex;align-items:stretch;position:relative}:host([block]){display:flex;width:100%}:host([block]) .bg-wrap{display:flex;width:100%}:host([block]) ::slotted(lib-button){flex:1}:host([orientation="vertical"]) .bg-wrap{flex-direction:column;align-items:stretch}:host([orientation="vertical"][block]) .bg-wrap{width:100%}}:host(lib-button-sep){display:inline-flex;flex-shrink:0;align-self:stretch;width:1px;background:var(--border-default);position:relative;z-index:1}:host(lib-button-sep[dark]){background:#ffffff1a}@layer reset{:host(lib-button-split){display:inline-flex;align-items:stretch;position:relative;vertical-align:middle}}@layer components{.split-wrap{display:inline-flex;align-items:stretch;position:relative}.split-menu{position:absolute;top:calc(100% + 5px);left:0;min-width:190px;background:var(--bg-elevated);border:1px solid var(--border-subtle);box-shadow:0 8px 24px #1a140e1a;z-index:50;display:none;opacity:0;transform:translateY(-4px);transition:opacity var(--duration-base) var(--ease-out),transform var(--duration-base) var(--ease-out)}.split-menu.is-open{opacity:1;transform:none}.split-menu-item,.split-menu ::slotted(button){display:flex;width:100%;align-items:center;gap:var(--lib-space-sm);padding:var(--lib-space-sm) var(--lib-space-md);background:none;border:none;border-bottom:1px solid var(--color-washi-100);font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:.1em;text-transform:uppercase;color:var(--text-secondary);cursor:pointer;text-align:left;transition:background var(--duration-fast),color var(--duration-fast)}.split-menu-item:last-child,.split-menu ::slotted(button:last-child){border-bottom:none}.split-menu-item:hover,.split-menu ::slotted(button:hover){background:var(--bg-base);color:var(--text-primary)}.split-menu-item:disabled,.split-menu ::slotted(button:disabled){opacity:.38;cursor:not-allowed}:host([dark]) .split-menu{background:var(--color-washi-800);border-color:#ffffff14;box-shadow:0 8px 24px #0000004d}:host([dark]) .split-menu-item,:host([dark]) .split-menu ::slotted(button){border-bottom-color:#ffffff0d;color:#faf7f473}:host([dark]) .split-menu-item:hover,:host([dark]) .split-menu ::slotted(button:hover){background:#ffffff12;color:#faf7f4d9}}';
71
2
  export {
72
- tabsTemplate
3
+ groupCss as default
73
4
  };
74
5
  //# sourceMappingURL=index229.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index229.js","sources":["../src/components/molecules/tabs/lib-tabs.html.ts"],"sourcesContent":["import { html, TemplateResult, nothing } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport type { LibTabs } from './lib-tabs.component';\nimport type { TabItem, TabsVariant } from './lib-tabs.types';\n\n/* ── Badge ── */\nfunction renderBadge(item: TabItem): TemplateResult | typeof nothing {\n return item.badge != null\n ? html`<span class=\"tb-badge\">${item.badge}</span>`\n : nothing;\n}\n\n/* ── Tab button ── */\nfunction renderTab(item: TabItem, context: LibTabs): TemplateResult {\n const isActive = context.active === item.id;\n const isDisabled = item.disabled === true;\n\n return html`\n ${item.group\n ? html`<div class=\"tb-label\">${item.group}</div>`\n : nothing}\n <button\n id=\"tab-${item.id}\"\n class=\"tb-tab ${isActive ? 'is-active' : ''} ${isDisabled ? 'is-disabled' : ''}\"\n role=\"tab\"\n aria-selected=\"${isActive}\"\n aria-controls=\"panel-${item.id}\"\n tabindex=\"${isActive ? '0' : '-1'}\"\n data-id=\"${item.id}\"\n data-label=\"${item.label}\"\n ?disabled=\"${isDisabled}\"\n @click=\"${(e:Event):void=> context._handleClick(e as CustomEvent)}\"\n >\n ${item.icon ? html`${unsafeHTML(item.icon)}` : nothing}\n ${item.label}\n ${renderBadge(item)}\n </button>\n `;\n}\n\n/* ── Panel ── */\nfunction renderPanel(item: TabItem, context: LibTabs): TemplateResult {\n const isActive = context.active === item.id;\n return html`\n <div\n class=\"tb-panel ${isActive ? 'is-active' : ''}\"\n role=\"tabpanel\"\n id=\"panel-${item.id}\"\n aria-labelledby=\"tab-${item.id}\"\n >\n <slot name=\"${item.id}\"></slot>\n </div>\n `;\n}\n\n/* ── Main template ── */\nexport function tabsTemplate(context: LibTabs): TemplateResult {\n const tabs = (context.items ?? []) as TabItem[];\n\n /* La ink bar solo aplica en underline (y sus modificadores kintsugi/glitch) */\n const showInk = !(['pill', 'card', 'outline', 'vertical'] as TabsVariant[]).includes(context.variant);\n\n return html`\n <div class=\"tb\" part=\"root\">\n\n <!-- Tab list -->\n <div\n class=\"tb-list\"\n part=\"list\"\n role=\"tablist\"\n aria-label=\"${context.ariaLabel || nothing}\"\n \n @keydown=\"${(e: KeyboardEvent): void => context._handleKey(e)}\"\n >\n ${tabs.map(item => renderTab(item, context))}\n </div>\n\n <!-- Ink bar (posicionada por JS, solo para variantes underline) -->\n ${showInk\n ? html`<div class=\"tb-ink\" part=\"ink\" style=\"left:${context._inkLeft}px;width:${context._inkWidth}px;\"></div>`\n : nothing}\n\n <!-- Panels -->\n <div class=\"tb-panels\" part=\"panels\">\n ${tabs.map(item => renderPanel(item, context))}\n </div>\n\n </div>\n `;\n}"],"names":["unsafeHTML"],"mappings":";;AAMA,SAAS,YAAY,MAAgD;AACnE,SAAO,KAAK,SAAS,OACjB,8BAA8B,KAAK,KAAK,YACxC;AACN;AAGA,SAAS,UAAU,MAAe,SAAkC;AAClE,QAAM,WAAa,QAAQ,WAAW,KAAK;AAC3C,QAAM,aAAa,KAAK,aAAa;AAErC,SAAO;AAAA,MACH,KAAK,QACH,6BAA6B,KAAK,KAAK,WACvC,OAAO;AAAA;AAAA,gBAEC,KAAK,EAAE;AAAA,sBACD,WAAW,cAAc,EAAE,IAAI,aAAa,gBAAgB,EAAE;AAAA;AAAA,uBAE7D,QAAQ;AAAA,6BACF,KAAK,EAAE;AAAA,kBAClB,WAAW,MAAM,IAAI;AAAA,iBACtB,KAAK,EAAE;AAAA,oBACJ,KAAK,KAAK;AAAA,mBACX,UAAU;AAAA,gBACb,CAAC,MAAgB,QAAQ,aAAa,CAAgB,CAAC;AAAA;AAAA,QAE/D,KAAK,OAAO,OAAOA,EAAW,KAAK,IAAI,CAAC,KAAK,OAAO;AAAA,QACpD,KAAK,KAAK;AAAA,QACV,YAAY,IAAI,CAAC;AAAA;AAAA;AAGzB;AAGA,SAAS,YAAY,MAAe,SAAkC;AACpE,QAAM,WAAW,QAAQ,WAAW,KAAK;AACzC,SAAO;AAAA;AAAA,wBAEe,WAAW,cAAc,EAAE;AAAA;AAAA,kBAEjC,KAAK,EAAE;AAAA,6BACI,KAAK,EAAE;AAAA;AAAA,oBAEhB,KAAK,EAAE;AAAA;AAAA;AAG3B;AAGO,SAAS,aAAa,SAAkC;AAC7D,QAAM,OAAQ,QAAQ,SAAS,CAAA;AAG/B,QAAM,UAAU,CAAE,CAAC,QAAQ,QAAQ,WAAW,UAAU,EAAoB,SAAS,QAAQ,OAAO;AAEpG,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAQa,QAAQ,aAAa,OAAO;AAAA;AAAA,oBAE9B,CAAC,MAA2B,QAAQ,WAAW,CAAC,CAAC;AAAA;AAAA,UAE3D,KAAK,IAAI,CAAA,SAAQ,UAAU,MAAM,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,QAI5C,UACE,kDAAkD,QAAQ,QAAQ,YAAY,QAAQ,SAAS,gBAC/F,OAAO;AAAA;AAAA;AAAA;AAAA,UAIP,KAAK,IAAI,CAAA,SAAQ,YAAY,MAAM,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAKtD;"}
1
+ {"version":3,"file":"index229.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/dist/index230.js CHANGED
@@ -1,5 +1,77 @@
1
- const tabsCss = '@layer tokens,reset,components;@layer reset{:host{display:block;position:relative}*,*:before,*:after{box-sizing:border-box}button{font:inherit;background:none;border:none;padding:0;margin:0;cursor:pointer}}@layer components{.tb{position:relative}.tb-list{display:flex;align-items:flex-end;position:relative;gap:0}.tb-tab{position:relative;display:inline-flex;align-items:center;gap:var(--lib-space-xs);padding:var(--lib-space-md) var(--lib-space-xl);height:44px;font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:.14em;text-transform:uppercase;color:var(--color-washi-400);background:none;border:none;cursor:pointer;white-space:nowrap;transition:color var(--duration-base) var(--ease-out),background var(--duration-base) var(--ease-out);outline:none;flex-shrink:0;-webkit-user-select:none;user-select:none}.tb-tab:hover{color:var(--color-washi-700)}.tb-tab.is-active{color:var(--color-washi-900)}.tb-tab:focus-visible{outline:2px solid var(--color-kaki-400);outline-offset:-2px}.tb-tab.is-disabled{opacity:.35;pointer-events:none}.tb-tab svg{width:13px;height:13px;stroke:currentcolor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.tb-badge{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 4px;font-size:9px;font-family:var(--lib-font-mono);letter-spacing:0;background:var(--color-washi-200);color:var(--color-washi-600);border-radius:999px;transition:background var(--duration-base),color var(--duration-base)}.tb-tab.is-active .tb-badge{background:var(--color-kaki-500);color:#fff}.tb-label{font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--color-washi-400);padding:0 var(--lib-space-xl) var(--lib-space-md)}.tb-label+.tb-label,.tb-label:not(:first-child){margin-top:var(--lib-space-2xl)}:host([size="sm"]) .tb-tab{height:36px;padding:var(--lib-space-xs) var(--lib-space-lg);font-size:10px}:host([size="lg"]) .tb-tab{height:52px;padding:var(--lib-space-lg) var(--lib-space-2xl);letter-spacing:.18em}.tb-panels{position:relative}.tb-panel{display:none}.tb-panel.is-active{display:block;animation:tb-in var(--duration-slow) var(--ease-out) both}@keyframes tb-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}:host([variant="underline"]) .tb-list{border-bottom:1px solid var(--color-washi-200);gap:var(--lib-space-xs)}:host([variant="underline"]) .tb-panels{padding-top:var(--lib-space-2xl)}:host([variant="underline"]) .tb-tab.is-active{color:var(--color-kaki-600)}.tb-ink{position:absolute;bottom:0;height:2px;background:var(--color-kaki-500);transition:left var(--duration-slow) var(--ease-bounce),width var(--duration-slow) var(--ease-bounce);pointer-events:none;z-index:2}:host([variant="underline"][color="celadon"]) .tb-tab.is-active{color:var(--color-celadon-500)}:host([variant="underline"][color="celadon"]) .tb-ink{background:var(--color-celadon-500)}:host([variant="underline"][color="celadon"]) .tb-tab.is-active .tb-badge{background:var(--color-celadon-500)}:host([variant="pill"]) .tb-list{gap:var(--lib-space-xs);padding:var(--lib-space-xs);background:var(--color-washi-100);border:1px solid var(--color-washi-200);display:inline-flex}:host([variant="pill"]) .tb-tab{border-radius:2px;height:36px;padding:var(--lib-space-xs) var(--lib-space-lg)}:host([variant="pill"]) .tb-tab.is-active{background:#fff;color:var(--color-washi-900);box-shadow:0 1px 4px #1a140e1a}:host([variant="pill"]) .tb-panels{padding-top:var(--lib-space-2xl)}:host([variant="pill"]) .tb-ink{display:none}:host([variant="pill"][color="kaki"]) .tb-tab.is-active{background:var(--color-kaki-500);color:#fff}:host([variant="pill"][color="kaki"]) .tb-tab.is-active .tb-badge{background:#ffffff4d;color:#fff}:host([variant="pill"][color="celadon"]) .tb-tab.is-active{background:var(--color-celadon-500);color:#fff}:host([variant="pill"][round]) .tb-list{border-radius:999px}:host([variant="pill"][round]) .tb-tab{border-radius:999px}:host([variant="card"]) .tb-list{gap:2px;align-items:flex-end}:host([variant="card"]) .tb-tab{border:1px solid transparent;border-bottom:none;background:var(--color-washi-100);color:var(--color-washi-400);height:40px;margin-bottom:-1px;padding:0 var(--lib-space-xl);border-radius:2px 2px 0 0}:host([variant="card"]) .tb-tab:hover{background:var(--color-washi-50);color:var(--color-washi-700)}:host([variant="card"]) .tb-tab.is-active{background:#fff;color:var(--color-washi-900);border-color:var(--color-washi-200);border-bottom-color:#fff;z-index:1;height:44px}:host([variant="card"]) .tb-panels{border:1px solid var(--color-washi-200);background:#fff;padding:var(--lib-space-2xl)}:host([variant="card"]) .tb-ink{display:none}:host([variant="outline"]) .tb-list{border-bottom:1px solid var(--color-washi-200);gap:var(--lib-space-xs)}:host([variant="outline"]) .tb-tab{border:1px solid transparent;border-bottom:none;margin-bottom:-1px}:host([variant="outline"]) .tb-tab.is-active{border-color:var(--color-washi-200);border-bottom-color:var(--color-washi-50);background:var(--color-washi-50);color:var(--color-washi-900)}:host([variant="outline"]) .tb-panels{padding-top:var(--lib-space-2xl)}:host([variant="outline"]) .tb-ink{display:none}:host([variant="vertical"]) .tb{display:grid;grid-template-columns:180px 1fr;gap:0;align-items:start}:host([variant="vertical"]) .tb-list{flex-direction:column;align-items:stretch;border-right:1px solid var(--color-washi-200);border-bottom:none;gap:0;padding:var(--lib-space-xs) 0;grid-column:1;grid-row:1}:host([variant="vertical"]) .tb-ink{display:none}:host([variant="vertical"]) .tb-panels{padding:var(--lib-space-xs) 0 var(--lib-space-xs) var(--lib-space-2xl);grid-column:2;grid-row:1}:host([variant="vertical"]) .tb-tab{height:auto;padding:var(--lib-space-md) var(--lib-space-xl);text-align:left;border-left:2px solid transparent;border-radius:0;justify-content:flex-start}:host([variant="vertical"]) .tb-tab:hover{border-left-color:var(--color-washi-300)}:host([variant="vertical"]) .tb-tab.is-active{border-left-color:var(--color-kaki-500);color:var(--color-kaki-600);background:var(--color-kaki-50)}:host([variant="vertical"]) .tb-panel.is-active{animation:tb-in-h var(--duration-slow) var(--ease-out) both}@keyframes tb-in-h{0%{opacity:0;transform:translate(8px)}to{opacity:1;transform:none}}:host([variant="vertical"]) .tb-label{padding:0 var(--lib-space-xl) var(--lib-space-md)}:host([dark]){background:var(--color-washi-950)}:host([dark]) .tb-tab{color:#faf7f440}:host([dark]) .tb-tab:hover{color:#faf7f499}:host([dark]) .tb-tab:focus-visible{outline-color:var(--color-kaki-400)}:host([dark]) .tb-badge{background:#ffffff1a;color:#faf7f466}:host([dark]) .tb-tab.is-active .tb-badge{background:var(--color-kaki-500);color:#fff}:host([dark]) .tb-panels{color:#faf7f499}:host([dark]) .tb-label{color:#faf7f42e}:host([dark][variant="underline"]) .tb-list{border-bottom-color:#ffffff14}:host([dark][variant="underline"]) .tb-tab.is-active{color:var(--color-kaki-400)}:host([dark][variant="underline"]) .tb-ink{background:var(--color-kaki-400)}:host([dark][variant="pill"]) .tb-list{background:#ffffff0a;border-color:#ffffff12}:host([dark][variant="pill"]) .tb-tab.is-active{background:#ffffff17;color:#faf7f4cc;box-shadow:0 1px 4px #0000004d}:host([dark][variant="pill"][color="kaki"]) .tb-tab.is-active{background:var(--color-kaki-500);color:#fff}:host([dark][variant="card"]) .tb-tab{background:#ffffff08;border-color:transparent}:host([dark][variant="card"]) .tb-tab.is-active{background:#ffffff12;border-color:#ffffff14;border-bottom-color:var(--color-washi-950);color:#faf7f4bf}:host([dark][variant="card"]) .tb-panels{background:#ffffff0a;border-color:#ffffff14}:host([dark][variant="vertical"]) .tb-list{border-right-color:#ffffff14}:host([dark][variant="vertical"]) .tb-tab.is-active{border-left-color:var(--color-kaki-500);color:var(--color-kaki-400);background:#b85a1e1a}@keyframes kintsugi-ink{0%{background-position:0% 0}to{background-position:200% 0}}:host([kintsugi][variant="underline"]) .tb-ink{background:linear-gradient(90deg,var(--color-kaki-600) 0%,var(--color-kaki-400) 25%,#F5D08A 50%,var(--color-kaki-400) 75%,var(--color-kaki-600) 100%);background-size:200% 100%;animation:kintsugi-ink 3s linear infinite}:host([kintsugi]) .tb-tab.is-active{color:var(--color-kaki-600)}:host([kintsugi]) .tb-tab.is-active .tb-badge{background:var(--color-kaki-500);color:#fff}:host([kintsugi][variant="pill"]) .tb-tab.is-active{background:linear-gradient(90deg,var(--color-kaki-600),var(--color-kaki-400),#F5D08A,var(--color-kaki-400),var(--color-kaki-600));background-size:200% 100%;animation:kintsugi-ink 3s linear infinite;color:#fff}:host([kintsugi][dark][variant="underline"]) .tb-ink{background:linear-gradient(90deg,#b85a1e66,#d97234b3,#f5d08ae6,#d97234b3,#b85a1e66);background-size:200% 100%;animation:kintsugi-ink 3.5s linear infinite}:host([kintsugi][dark]) .tb-tab.is-active{color:var(--color-kaki-400)}@keyframes tb-glitch-x{0%,88%,to{transform:translate(0)}89%{transform:translate(-2px)}90%{transform:translate(2px)}91%{transform:translate(0)}}@keyframes tb-glitch-r{0%,88%,to{opacity:0}89%{opacity:.6;transform:translate(-2px);clip-path:inset(20% 0 50% 0)}90%{opacity:.4;transform:translate(1px);clip-path:inset(55% 0 10% 0)}91%{opacity:0}}@keyframes tb-glitch-b{0%,88%,to{opacity:0}89%{opacity:.5;transform:translate(2px);clip-path:inset(50% 0 20% 0)}90%{opacity:.3;transform:translate(-1px);clip-path:inset(10% 0 60% 0)}91%{opacity:0}}@keyframes tb-glitch-flicker{0%,85%,to{opacity:1}89%{opacity:.7}89.5%{opacity:1}90%{opacity:.5}90.5%{opacity:1}}:host([glitch]) .tb-tab.is-active{animation:tb-glitch-x 6s steps(1) infinite,tb-glitch-flicker 6s steps(1) infinite;position:relative}:host([glitch]) .tb-tab.is-active:before,:host([glitch]) .tb-tab.is-active:after{content:attr(data-label);position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;font-family:var(--lib-font-mono);font-size:inherit;letter-spacing:inherit;text-transform:uppercase;pointer-events:none;padding:inherit}:host([glitch]) .tb-tab.is-active:before{color:#d97234b3;animation:tb-glitch-r 6s steps(1) infinite}:host([glitch]) .tb-tab.is-active:after{color:#4e948299;animation:tb-glitch-b 6s steps(1) infinite;animation-delay:60ms}:host([glitch][variant="underline"]) .tb-ink{background:var(--color-washi-900);animation:tb-glitch-flicker 6s steps(1) infinite!important}:host([glitch][dark]) .tb-tab.is-active:before{color:#d97234cc}:host([glitch][dark]) .tb-tab.is-active:after{color:#4e9482b3}:host([glitch][dark][variant="underline"]) .tb-ink{background:#faf7f499}:host([scroll]) .tb-list{overflow:auto hidden;scrollbar-width:none;-ms-overflow-style:none;flex-wrap:nowrap}:host([scroll]) .tb-list::-webkit-scrollbar{display:none}:host([full]) .tb-list{display:grid;grid-auto-columns:1fr;grid-auto-flow:column}:host([full]) .tb-tab{justify-content:center}}';
1
+ import { svg, html } from "lit";
2
+ const CARET = svg`
3
+ <svg width="9" height="9" viewBox="0 0 10 10" fill="none"
4
+ stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
5
+ <polyline points="2,3 5,7 8,3"/>
6
+ </svg>`;
7
+ function buttonGroupTemplate() {
8
+ return html`
9
+ <div class="bg-wrap" part="group">
10
+ <slot></slot>
11
+ </div>
12
+ `;
13
+ }
14
+ function buttonSplitTemplate(p) {
15
+ const { label, variant, size, dark, disabled, menuOpen, items } = p;
16
+ const arrowKintsugi = variant === "accent" || variant === "primary";
17
+ const menuItems = items.length > 0 ? html`${items.map((item) => html`
18
+ <button
19
+ class="split-menu-item"
20
+ ?disabled="${item.disabled ?? false}"
21
+ data-value="${item.value}"
22
+ >${item.label}</button>
23
+ `)}` : html`<slot name="menu"></slot>`;
24
+ return html`
25
+ <div class="split-wrap" part="split">
26
+
27
+ <!-- Acción principal: lib-button posición "first" -->
28
+ <lib-button
29
+ part="main"
30
+ variant="${variant}"
31
+ size="${size}"
32
+ ?dark="${dark}"
33
+ ?disabled="${disabled}"
34
+ group-pos="first"
35
+ group-shape="rounded"
36
+ @click="${p.onMainClick}"
37
+ >
38
+ <slot slot="prefix" name="prefix"></slot>
39
+ ${label}
40
+ <slot slot="suffix" name="suffix"></slot>
41
+ </lib-button>
42
+
43
+ <!-- Flecha: lib-button posición "last", icon-only -->
44
+ <lib-button
45
+ part="arrow"
46
+ variant="${variant}"
47
+ size="${size}"
48
+ ?dark="${dark}"
49
+ ?disabled="${disabled}"
50
+ group-pos="last"
51
+ group-shape="rounded"
52
+ icon-only
53
+ ?kintsugi="${arrowKintsugi}"
54
+ aria-label="Más opciones"
55
+ aria-haspopup="true"
56
+ aria-expanded="${menuOpen ? "true" : "false"}"
57
+ @click="${p.onArrowClick}"
58
+ >${CARET}</lib-button>
59
+
60
+ <!-- Menú desplegable -->
61
+ <div
62
+ class="split-menu ${menuOpen ? "is-open" : ""}"
63
+ part="menu"
64
+ style="${menuOpen ? "display:block" : "display:none"}"
65
+ role="menu"
66
+ >
67
+ ${menuItems}
68
+ </div>
69
+
70
+ </div>
71
+ `;
72
+ }
2
73
  export {
3
- tabsCss as default
74
+ buttonGroupTemplate,
75
+ buttonSplitTemplate
4
76
  };
5
77
  //# sourceMappingURL=index230.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index230.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index230.js","sources":["../src/components/molecules/button-group/lib-button-group.html.ts"],"sourcesContent":["import { html, svg, TemplateResult } from 'lit';\nimport type { LibVariant, LibSize } from '../../../types';\nimport type { SplitMenuItem } from './lib-button-group.types';\n\n/* ── Caret SVG (va dentro del slot del lib-button flecha) ── */\nconst CARET = svg`\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 10 10\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"2,3 5,7 8,3\"/>\n </svg>`;\n\n/* ────────────────────────────────────────────\n Group template\n ──────────────────────────────────────────── */\nexport function buttonGroupTemplate(): TemplateResult {\n return html`\n <div class=\"bg-wrap\" part=\"group\">\n <slot></slot>\n </div>\n `;\n}\n\n/* ────────────────────────────────────────────\n Split template — compone dos lib-button\n ──────────────────────────────────────────── */\nexport interface SplitTemplateProps {\n label: string;\n variant: LibVariant;\n size: LibSize;\n dark: boolean;\n disabled: boolean;\n menuOpen: boolean;\n items: SplitMenuItem[];\n onMainClick: (e: Event) => void;\n onArrowClick:(e: Event) => void;\n}\n\nexport function buttonSplitTemplate(p: SplitTemplateProps): TemplateResult {\n const { label, variant, size, dark, disabled, menuOpen, items } = p;\n\n /* Kintsugi en el arrow solo para variantes sólidas (accent/primary) */\n const arrowKintsugi = variant === 'accent' || variant === 'primary';\n\n const menuItems: TemplateResult = items.length > 0\n ? html`${items.map(item => html`\n <button\n class=\"split-menu-item\"\n ?disabled=\"${item.disabled ?? false}\"\n data-value=\"${item.value}\"\n >${item.label}</button>\n `)}`\n : html`<slot name=\"menu\"></slot>`;\n\n return html`\n <div class=\"split-wrap\" part=\"split\">\n\n <!-- Acción principal: lib-button posición \"first\" -->\n <lib-button\n part=\"main\"\n variant=\"${variant}\"\n size=\"${size}\"\n ?dark=\"${dark}\"\n ?disabled=\"${disabled}\"\n group-pos=\"first\"\n group-shape=\"rounded\"\n @click=\"${p.onMainClick}\"\n >\n <slot slot=\"prefix\" name=\"prefix\"></slot>\n ${label}\n <slot slot=\"suffix\" name=\"suffix\"></slot>\n </lib-button>\n\n <!-- Flecha: lib-button posición \"last\", icon-only -->\n <lib-button\n part=\"arrow\"\n variant=\"${variant}\"\n size=\"${size}\"\n ?dark=\"${dark}\"\n ?disabled=\"${disabled}\"\n group-pos=\"last\"\n group-shape=\"rounded\"\n icon-only\n ?kintsugi=\"${arrowKintsugi}\"\n aria-label=\"Más opciones\"\n aria-haspopup=\"true\"\n aria-expanded=\"${menuOpen ? 'true' : 'false'}\"\n @click=\"${p.onArrowClick}\"\n >${CARET}</lib-button>\n\n <!-- Menú desplegable -->\n <div\n class=\"split-menu ${menuOpen ? 'is-open' : ''}\"\n part=\"menu\"\n style=\"${menuOpen ? 'display:block' : 'display:none'}\"\n role=\"menu\"\n >\n ${menuItems}\n </div>\n\n </div>\n `;\n}"],"names":[],"mappings":";AAKA,MAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AASP,SAAS,sBAAsC;AACpD,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;AAiBO,SAAS,oBAAoB,GAAuC;AACzE,QAAM,EAAE,OAAO,SAAS,MAAM,MAAM,UAAU,UAAU,UAAU;AAGlE,QAAM,gBAAgB,YAAY,YAAY,YAAY;AAE1D,QAAM,YAA4B,MAAM,SAAS,IAC7C,OAAO,MAAM,IAAI,CAAA,SAAQ;AAAA;AAAA;AAAA,uBAGR,KAAK,YAAY,KAAK;AAAA,wBACrB,KAAK,KAAK;AAAA,WACvB,KAAK,KAAK;AAAA,OACd,CAAC,KACF;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMU,OAAO;AAAA,gBACV,IAAI;AAAA,iBACH,IAAI;AAAA,qBACA,QAAQ;AAAA;AAAA;AAAA,kBAGX,EAAE,WAAW;AAAA;AAAA;AAAA,UAGrB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAOI,OAAO;AAAA,gBACV,IAAI;AAAA,iBACH,IAAI;AAAA,qBACA,QAAQ;AAAA;AAAA;AAAA;AAAA,qBAIR,aAAa;AAAA;AAAA;AAAA,yBAGT,WAAW,SAAS,OAAO;AAAA,kBAClC,EAAE,YAAY;AAAA,SACvB,KAAK;AAAA;AAAA;AAAA;AAAA,4BAIc,WAAW,YAAY,EAAE;AAAA;AAAA,iBAEpC,WAAW,kBAAkB,cAAc;AAAA;AAAA;AAAA,UAGlD,SAAS;AAAA;AAAA;AAAA;AAAA;AAKnB;"}
package/dist/index231.js CHANGED
@@ -1,5 +1,77 @@
1
- const treeSelectCss = '@layer tokens,reset,components;@layer reset{*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}}@layer components{:host{display:block;position:relative}:host([disabled]){opacity:.38;pointer-events:none;cursor:not-allowed}.ts-wrap{position:relative;display:inline-flex;flex-direction:column;min-width:260px;width:100%}.ts-trigger{display:flex;align-items:center;justify-content:space-between;gap:var(--lib-space-sm);padding:calc(var(--lib-spacing-unit) * 3) var(--lib-space-md);background:var(--bg-elevated);border:1px solid var(--border-default);cursor:pointer;-webkit-user-select:none;user-select:none;transition:border-color var(--duration-base) var(--ease-default),box-shadow var(--duration-base) var(--ease-default);border-radius:var(--lib-radius-md)}.ts-trigger:hover{border-color:var(--border-strong)}:host([open]) .ts-trigger{border-color:var(--color-washi-800);box-shadow:0 0 0 3px var(--color-ink-10)}.ts-trigger-label{font-family:var(--lib-font-body);font-size:var(--text-base);color:var(--text-primary);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ts-trigger-label.is-placeholder{color:var(--text-muted)}.ts-trigger-count{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wider);color:var(--bg-elevated);background:var(--color-kaki-500);padding:2px 6px;border-radius:var(--radius-full);flex-shrink:0;line-height:1.4}.ts-trigger-chevron{flex-shrink:0;color:var(--text-muted);transition:transform var(--duration-slow) var(--ease-out)}:host([open]) .ts-trigger-chevron{transform:rotate(180deg)}.ts-dropdown{position:absolute;top:calc(100% + 4px);left:0;width:100%;min-width:260px;background:var(--bg-elevated);border:1px solid var(--border-default);box-shadow:var(--shadow-lg);z-index:var(--z-overlay);display:flex;flex-direction:column;max-height:340px;border-radius:var(--lib-radius-md);opacity:0;transform:translateY(-6px) scaleY(.97);transform-origin:top;pointer-events:none;transition:opacity var(--duration-base) var(--ease-out),transform var(--duration-base) var(--ease-out)}:host([open]) .ts-dropdown{opacity:1;transform:none;pointer-events:auto}.ts-search-wrap{padding:calc(var(--lib-spacing-unit) * 3) var(--lib-space-md);border-bottom:1px solid var(--border-subtle);display:flex;align-items:center;gap:calc(var(--lib-spacing-unit) * 3);flex-shrink:0}.ts-search-icon{color:var(--text-muted);flex-shrink:0}.ts-search{flex:1;border:none;outline:none;background:transparent;font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-primary)}.ts-search::placeholder{color:var(--text-muted)}.ts-tree{overflow-y:auto;flex:1;scrollbar-width:thin;scrollbar-color:var(--color-washi-300) transparent}.ts-node{display:flex;flex-direction:column}.ts-node-row{display:flex;align-items:center;padding:var(--lib-space-sm) var(--lib-space-md);cursor:pointer;min-height:34px;transition:background var(--duration-fast);gap:0;position:relative}.ts-node-row:hover{background:var(--color-washi-100)}.ts-node-row.is-selected{background:var(--color-kaki-50)}.ts-node-row.is-selected:hover{background:var(--color-kaki-100)}.ts-indent{display:flex;align-items:stretch;flex-shrink:0}.ts-indent-unit{width:20px;position:relative;flex-shrink:0}.ts-indent-unit:before{content:"";position:absolute;left:9px;top:-50%;bottom:-50%;width:1px;background:var(--border-subtle)}.ts-indent-unit.ts-indent-no-line:before{display:none}.ts-indent-unit.ts-indent-last:after{content:"";position:absolute;left:9px;top:50%;width:11px;height:1px;background:var(--border-subtle)}.ts-indent-unit.ts-indent-last-child:before{bottom:50%}.ts-toggle{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center;border:1px solid var(--border-default);background:var(--bg-elevated);margin-right:var(--lib-space-sm);position:relative;cursor:pointer;transition:border-color var(--duration-fast),background var(--duration-fast)}.ts-toggle:hover{border-color:var(--border-strong);background:var(--color-washi-100)}.ts-toggle-icon{width:8px;height:8px;color:var(--text-muted);transition:transform var(--duration-slow) var(--ease-out);flex-shrink:0}.ts-node.is-expanded>.ts-node-row .ts-toggle-icon{transform:rotate(90deg)}.ts-toggle-spacer{width:18px;flex-shrink:0;margin-right:var(--lib-space-sm)}.ts-checkbox{width:14px;height:14px;flex-shrink:0;border:1px solid var(--border-default);background:var(--bg-elevated);margin-right:calc(var(--lib-spacing-unit) * 3);display:flex;align-items:center;justify-content:center;transition:border-color var(--duration-base),background var(--duration-base);position:relative;border-radius:var(--lib-radius-sm)}.ts-node-row.is-selected .ts-checkbox{background:var(--color-kaki-500);border-color:var(--color-kaki-500)}.ts-node-row.is-indeterminate .ts-checkbox{background:var(--bg-elevated);border-color:var(--color-kaki-400)}.ts-checkbox-check{display:none;width:8px;height:8px;color:var(--color-white);flex-shrink:0;stroke:var(--color-white)}.ts-node-row.is-selected .ts-checkbox-check{display:block}.ts-checkbox-dash{display:none;width:8px;height:1.5px;background:var(--color-kaki-400);flex-shrink:0}.ts-node-row.is-indeterminate .ts-checkbox-dash{display:block}:host(:not([multi])) .ts-checkbox{display:none}.ts-node-label{font-family:var(--lib-font-body);font-size:var(--text-sm);color:var(--text-primary);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;transition:color var(--duration-fast)}.ts-node-row.is-selected .ts-node-label{color:var(--color-kaki-600)}.ts-node-label mark{background:var(--color-kaki-100);color:var(--color-kaki-600);border-radius:1px;padding:0 1px}.ts-node-badge{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-muted);margin-left:var(--lib-space-sm);flex-shrink:0}.ts-node-row.is-selected .ts-node-badge{color:var(--color-kaki-400)}.ts-children{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--duration-slow) var(--ease-out)}.ts-node.is-expanded>.ts-children{grid-template-rows:1fr}.ts-children-inner{overflow:hidden}.ts-footer{border-top:1px solid var(--border-subtle);padding:calc(var(--lib-spacing-unit) * 3) var(--lib-space-md);display:flex;align-items:center;justify-content:space-between;flex-shrink:0;background:var(--bg-surface)}.ts-footer-info{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-muted)}.ts-footer-actions{display:flex;gap:var(--lib-space-md)}.ts-btn{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wider);text-transform:uppercase;border:none;background:transparent;cursor:pointer;padding:var(--lib-space-xs) var(--lib-space-sm);color:var(--text-muted);transition:color var(--duration-base)}.ts-btn:hover{color:var(--text-primary)}.ts-btn-confirm{background:var(--color-washi-900);color:var(--color-washi-50);padding:var(--lib-space-xs) var(--lib-space-md);transition:background var(--duration-base)}.ts-btn-confirm:hover{background:var(--color-kaki-500)}.ts-empty{padding:var(--lib-space-xl) var(--lib-space-md);text-align:center;font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-muted)}.ts-tags{display:flex;flex-wrap:wrap;gap:var(--lib-space-sm);margin-top:calc(var(--lib-spacing-unit) * 3);min-height:26px}.ts-tag{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);text-transform:uppercase;padding:2px calc(var(--lib-spacing-unit) * 3);background:var(--color-kaki-50);border:1px solid var(--color-kaki-200);color:var(--color-kaki-600);display:flex;align-items:center;gap:var(--lib-space-sm);cursor:default;transition:background var(--duration-fast)}.ts-tag:hover{background:var(--color-kaki-100)}.ts-tag-remove{cursor:pointer;color:var(--color-kaki-400);line-height:1;font-size:11px;transition:color var(--duration-fast)}.ts-tag-remove:hover{color:var(--color-kaki-600)}:host([inline]){display:flex;flex-direction:column}.ts-inline{border:1px solid var(--border-subtle);background:var(--bg-elevated);max-height:360px;display:flex;flex-direction:column;border-radius:var(--lib-radius-md)}.ts-inline .ts-tree{flex:1}.ts-inline .ts-search-wrap,.ts-inline .ts-footer{flex-shrink:0}}';
1
+ import { html } from "lit";
2
+ const checkSvg = html`
3
+ <svg viewBox="0 0 12 12">
4
+ <polyline points="2,6 5,9 10,3"/>
5
+ </svg>`;
6
+ function checkboxCardTemplate(ctx) {
7
+ const checkClass = [
8
+ "cc-check",
9
+ ctx.inputType === "radio" || ctx.checkShape === "pill" ? "cc-check-pill" : ""
10
+ ].filter(Boolean).join(" ");
11
+ return html`
12
+ <label
13
+ class="cc"
14
+ part="label"
15
+ @click="${(e) => ctx._handleClick(e)}"
16
+ >
17
+ <!-- Input nativo — hermano directo de .cc-body para :checked ~ -->
18
+ <input
19
+ class="cc-input"
20
+ part="input"
21
+ .type="${ctx.inputType}"
22
+ .name="${ctx.name}"
23
+ .value="${ctx.value}"
24
+ .checked="${ctx.checked}"
25
+ ?disabled="${ctx.disabled}"
26
+ @change="${(e) => ctx._handleChange(e)}"
27
+ />
28
+
29
+ <div class="cc-body" part="body">
30
+
31
+ <!-- Checkmark -->
32
+ <div class="${checkClass}" part="check">${checkSvg}</div>
33
+
34
+ <!-- Slot: icono -->
35
+ <slot name="icon">
36
+ ${ctx._hasSlot("icon") ? "" : ""}
37
+ </slot>
38
+
39
+ <!-- Slot: badge -->
40
+ <slot name="badge"></slot>
41
+
42
+ <!-- Slot: título -->
43
+ <slot name="title">
44
+ ${ctx.cardTitle ? html`<div class="cc-title" part="title">${ctx.cardTitle}</div>` : ""}
45
+ </slot>
46
+
47
+ <!-- Slot: descripción -->
48
+ <slot name="desc">
49
+ ${ctx.desc ? html`<div class="cc-desc" part="desc">${ctx.desc}</div>` : ""}
50
+ </slot>
51
+
52
+ <!-- Slot: precio -->
53
+ <slot name="price"></slot>
54
+
55
+ <!-- Slot: divider -->
56
+ <slot name="divider"></slot>
57
+
58
+ <!-- Slot: features -->
59
+ <slot name="features"></slot>
60
+
61
+ <!-- Slot: imagen -->
62
+ <slot name="image"></slot>
63
+
64
+ <!-- Slot: contenido libre (default) -->
65
+ <slot></slot>
66
+
67
+ <!-- Ripple layer -->
68
+ <div class="cc-ripple" part="ripple"></div>
69
+
70
+ </div>
71
+ </label>
72
+ `;
73
+ }
2
74
  export {
3
- treeSelectCss as default
75
+ checkboxCardTemplate
4
76
  };
5
77
  //# sourceMappingURL=index231.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index231.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index231.js","sources":["../src/components/molecules/checkbox-card/lib-checkbox-card.html.ts"],"sourcesContent":["import { html, TemplateResult } from 'lit';\nimport type { LibCheckboxCard } from './lib-checkbox-card.component';\n\n/* SVG checkmark compartido */\nconst checkSvg: TemplateResult = html`\n <svg viewBox=\"0 0 12 12\">\n <polyline points=\"2,6 5,9 10,3\"/>\n </svg>`;\n\nexport function checkboxCardTemplate(ctx: LibCheckboxCard): TemplateResult {\n const checkClass = [\n 'cc-check',\n ctx.inputType === 'radio' || ctx.checkShape === 'pill' ? 'cc-check-pill' : '',\n ].filter(Boolean).join(' ');\n\n return html`\n <label\n class=\"cc\"\n part=\"label\"\n @click=\"${(e: MouseEvent): void => ctx._handleClick(e)}\"\n >\n <!-- Input nativo — hermano directo de .cc-body para :checked ~ -->\n <input\n class=\"cc-input\"\n part=\"input\"\n .type=\"${ctx.inputType}\"\n .name=\"${ctx.name}\"\n .value=\"${ctx.value}\"\n .checked=\"${ctx.checked}\"\n ?disabled=\"${ctx.disabled}\"\n @change=\"${(e: Event): void => ctx._handleChange(e)}\"\n />\n\n <div class=\"cc-body\" part=\"body\">\n\n <!-- Checkmark -->\n <div class=\"${checkClass}\" part=\"check\">${checkSvg}</div>\n\n <!-- Slot: icono -->\n <slot name=\"icon\">\n ${ctx._hasSlot('icon') ? '' : ''}\n </slot>\n\n <!-- Slot: badge -->\n <slot name=\"badge\"></slot>\n\n <!-- Slot: título -->\n <slot name=\"title\">\n ${ctx.cardTitle\n ? html`<div class=\"cc-title\" part=\"title\">${ctx.cardTitle}</div>`\n : ''}\n </slot>\n\n <!-- Slot: descripción -->\n <slot name=\"desc\">\n ${ctx.desc\n ? html`<div class=\"cc-desc\" part=\"desc\">${ctx.desc}</div>`\n : ''}\n </slot>\n\n <!-- Slot: precio -->\n <slot name=\"price\"></slot>\n\n <!-- Slot: divider -->\n <slot name=\"divider\"></slot>\n\n <!-- Slot: features -->\n <slot name=\"features\"></slot>\n\n <!-- Slot: imagen -->\n <slot name=\"image\"></slot>\n\n <!-- Slot: contenido libre (default) -->\n <slot></slot>\n\n <!-- Ripple layer -->\n <div class=\"cc-ripple\" part=\"ripple\"></div>\n\n </div>\n </label>\n `;\n}"],"names":[],"mappings":";AAIA,MAAM,WAA2B;AAAA;AAAA;AAAA;AAK1B,SAAS,qBAAqB,KAAsC;AACzE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,IAAI,cAAc,WAAW,IAAI,eAAe,SAAS,kBAAkB;AAAA,EAAA,EAC3E,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SAAO;AAAA;AAAA;AAAA;AAAA,gBAIO,CAAC,MAAwB,IAAI,aAAa,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAM3C,IAAI,SAAS;AAAA,iBACb,IAAI,IAAI;AAAA,kBACP,IAAI,KAAK;AAAA,oBACP,IAAI,OAAO;AAAA,qBACV,IAAI,QAAQ;AAAA,mBACd,CAAC,MAAmB,IAAI,cAAc,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMrC,UAAU,kBAAkB,QAAQ;AAAA;AAAA;AAAA;AAAA,YAI9C,IAAI,SAAS,MAAM,IAAI,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQ9B,IAAI,YACF,0CAA0C,IAAI,SAAS,WACvD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,YAKJ,IAAI,OACF,wCAAwC,IAAI,IAAI,WAChD,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBhB;"}