@shibui-ui/ui 1.25.0 → 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 (177) hide show
  1. package/dist/index11.js +1 -1
  2. package/dist/index194.js +97 -6
  3. package/dist/index194.js.map +1 -1
  4. package/dist/index195.js +2 -2
  5. package/dist/index197.js +2 -18
  6. package/dist/index197.js.map +1 -1
  7. package/dist/index198.js +74 -2
  8. package/dist/index198.js.map +1 -1
  9. package/dist/index199.js +64 -74
  10. package/dist/index199.js.map +1 -1
  11. package/dist/index200.js +2 -2
  12. package/dist/index201.js +57 -2
  13. package/dist/index201.js.map +1 -1
  14. package/dist/index202.js +2 -39
  15. package/dist/index202.js.map +1 -1
  16. package/dist/index203.js +2 -2
  17. package/dist/index204.js +144 -219
  18. package/dist/index204.js.map +1 -1
  19. package/dist/index205.js +43 -82
  20. package/dist/index205.js.map +1 -1
  21. package/dist/index206.js +51 -2
  22. package/dist/index206.js.map +1 -1
  23. package/dist/index207.js +2 -94
  24. package/dist/index207.js.map +1 -1
  25. package/dist/index208.js +33 -2
  26. package/dist/index208.js.map +1 -1
  27. package/dist/index209.js +2 -268
  28. package/dist/index209.js.map +1 -1
  29. package/dist/index210.js +6 -2
  30. package/dist/index210.js.map +1 -1
  31. package/dist/index211.js +2 -21
  32. package/dist/index211.js.map +1 -1
  33. package/dist/index212.js +260 -2
  34. package/dist/index212.js.map +1 -1
  35. package/dist/index213.js +16 -8
  36. package/dist/index213.js.map +1 -1
  37. package/dist/index214.js +2 -2
  38. package/dist/index215.js +2 -15
  39. package/dist/index215.js.map +1 -1
  40. package/dist/index216.js +66 -2
  41. package/dist/index216.js.map +1 -1
  42. package/dist/index217.js +24 -146
  43. package/dist/index217.js.map +1 -1
  44. package/dist/index218.js +2 -2
  45. package/dist/index219.js +2 -5
  46. package/dist/index219.js.map +1 -1
  47. package/dist/index220.js +81 -2
  48. package/dist/index220.js.map +1 -1
  49. package/dist/index221.js +78 -6
  50. package/dist/index221.js.map +1 -1
  51. package/dist/index222.js +2 -2
  52. package/dist/index223.js +133 -2
  53. package/dist/index223.js.map +1 -1
  54. package/dist/index224.js +2 -92
  55. package/dist/index224.js.map +1 -1
  56. package/dist/index225.js +2 -59
  57. package/dist/index225.js.map +1 -1
  58. package/dist/index226.js +72 -2
  59. package/dist/index226.js.map +1 -1
  60. package/dist/index227.js +94 -97
  61. package/dist/index227.js.map +1 -1
  62. package/dist/index228.js +2 -2
  63. package/dist/index229.js +71 -2
  64. package/dist/index229.js.map +1 -1
  65. package/dist/index230.js +2 -74
  66. package/dist/index230.js.map +1 -1
  67. package/dist/index231.js +2 -74
  68. package/dist/index231.js.map +1 -1
  69. package/dist/index232.js +12 -2
  70. package/dist/index232.js.map +1 -1
  71. package/dist/index233.js +5 -53
  72. package/dist/index233.js.map +1 -1
  73. package/dist/index234.js +2 -2
  74. package/dist/index235.js +18 -2
  75. package/dist/index235.js.map +1 -1
  76. package/dist/index236.js +2 -162
  77. package/dist/index236.js.map +1 -1
  78. package/dist/index237.js +84 -43
  79. package/dist/index237.js.map +1 -1
  80. package/dist/index238.js +2 -51
  81. package/dist/index238.js.map +1 -1
  82. package/dist/index239.js +2 -2
  83. package/dist/index240.js +39 -33
  84. package/dist/index240.js.map +1 -1
  85. package/dist/index241.js +2 -2
  86. package/dist/index242.js +236 -5
  87. package/dist/index242.js.map +1 -1
  88. package/dist/index243.js +82 -2
  89. package/dist/index243.js.map +1 -1
  90. package/dist/index244.js +2 -260
  91. package/dist/index244.js.map +1 -1
  92. package/dist/index245.js +93 -16
  93. package/dist/index245.js.map +1 -1
  94. package/dist/index246.js +2 -2
  95. package/dist/index247.js +268 -2
  96. package/dist/index247.js.map +1 -1
  97. package/dist/index248.js +2 -66
  98. package/dist/index248.js.map +1 -1
  99. package/dist/index249.js +13 -24
  100. package/dist/index249.js.map +1 -1
  101. package/dist/index250.js +2 -2
  102. package/dist/index251.js +9 -2
  103. package/dist/index251.js.map +1 -1
  104. package/dist/index252.js +2 -81
  105. package/dist/index252.js.map +1 -1
  106. package/dist/index253.js +12 -78
  107. package/dist/index253.js.map +1 -1
  108. package/dist/index254.js +2 -2
  109. package/dist/index255.js +132 -111
  110. package/dist/index255.js.map +1 -1
  111. package/dist/index256.js +2 -2
  112. package/dist/index257.js +5 -2
  113. package/dist/index257.js.map +1 -1
  114. package/dist/index258.js +2 -72
  115. package/dist/index258.js.map +1 -1
  116. package/dist/index259.js +5 -93
  117. package/dist/index259.js.map +1 -1
  118. package/dist/index260.js +2 -2
  119. package/dist/index261.js +2 -71
  120. package/dist/index261.js.map +1 -1
  121. package/dist/index262.js +92 -2
  122. package/dist/index262.js.map +1 -1
  123. package/dist/index263.js +59 -2
  124. package/dist/index263.js.map +1 -1
  125. package/dist/index264.js +2 -12
  126. package/dist/index264.js.map +1 -1
  127. package/dist/index34.js +1 -1
  128. package/dist/index347.js +1 -1
  129. package/dist/index353.js +14 -32
  130. package/dist/index353.js.map +1 -1
  131. package/dist/index354.js +20 -6
  132. package/dist/index354.js.map +1 -1
  133. package/dist/index355.js +56 -18
  134. package/dist/index355.js.map +1 -1
  135. package/dist/index356.js +55 -57
  136. package/dist/index356.js.map +1 -1
  137. package/dist/index357.js +32 -64
  138. package/dist/index357.js.map +1 -1
  139. package/dist/index44.js +1 -1
  140. package/dist/index47.js +1 -1
  141. package/dist/index49.js +2 -2
  142. package/dist/index50.js +2 -2
  143. package/dist/index51.js +2 -2
  144. package/dist/index52.js +2 -2
  145. package/dist/index53.js +3 -3
  146. package/dist/index54.js +2 -2
  147. package/dist/index55.js +2 -2
  148. package/dist/index56.js +3 -3
  149. package/dist/index57.js +2 -2
  150. package/dist/index58.js +2 -2
  151. package/dist/index59.js +2 -2
  152. package/dist/index60.js +2 -2
  153. package/dist/index61.js +2 -2
  154. package/dist/index62.js +2 -2
  155. package/dist/index63.js +2 -2
  156. package/dist/index64.js +2 -2
  157. package/dist/index65.js +2 -2
  158. package/dist/index66.js +1 -1
  159. package/dist/index67.js +1 -1
  160. package/dist/index68.js +2 -2
  161. package/dist/index69.js +2 -2
  162. package/dist/index70.js +2 -2
  163. package/dist/index71.js +2 -2
  164. package/dist/index72.js +2 -2
  165. package/dist/index73.js +2 -2
  166. package/dist/index74.js +2 -2
  167. package/dist/index75.js +2 -2
  168. package/dist/index76.js +2 -2
  169. package/dist/index77.js +2 -2
  170. package/dist/index78.js +2 -2
  171. package/dist/index79.js +2 -2
  172. package/dist/index80.js +2 -2
  173. package/dist/index81.js +2 -2
  174. package/dist/index82.js +1 -1
  175. package/dist/index83.js +2 -2
  176. package/dist/index84.js +2 -2
  177. package/package.json +4 -4
package/dist/index202.js CHANGED
@@ -1,42 +1,5 @@
1
- const CURSOR_MODES = {
2
- ink: {
3
- dotBg: "var(--color-washi-900)",
4
- dotSize: "6px",
5
- ringBorder: "1px solid var(--color-washi-400)",
6
- ringBg: "transparent",
7
- ringSize: "36px",
8
- ringMix: "multiply",
9
- lerpFactor: 0.12
10
- },
11
- minimal: {
12
- dotBg: "var(--color-washi-600)",
13
- dotSize: "4px",
14
- ringBorder: "none",
15
- ringBg: "transparent",
16
- ringSize: "0px",
17
- ringMix: "normal",
18
- lerpFactor: 0.2
19
- },
20
- kaki: {
21
- dotBg: "var(--color-kaki-500)",
22
- dotSize: "8px",
23
- ringBorder: "1.5px solid var(--color-kaki-200, #F4C099)",
24
- ringBg: "rgba(217,114,52,0.04)",
25
- ringSize: "40px",
26
- ringMix: "normal",
27
- lerpFactor: 0.09
28
- },
29
- ghost: {
30
- dotBg: "transparent",
31
- dotSize: "0px",
32
- ringBorder: "1px solid rgba(250,247,244,0.25)",
33
- ringBg: "rgba(250,247,244,0.03)",
34
- ringSize: "28px",
35
- ringMix: "normal",
36
- lerpFactor: 0.1
37
- }
38
- };
1
+ const chipCss = '@layer tokens,reset,components;@layer reset{:host{display:inline-flex;vertical-align:middle}*,*:before,*:after{box-sizing:border-box}button{font:inherit;background:none;border:none;padding:0;margin:0;cursor:pointer}}@layer components{.chip,.chip-toggle,.chip-input{display:inline-flex;align-items:center;gap:var(--lib-space-xs);font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);line-height:1;white-space:nowrap;-webkit-user-select:none;user-select:none;border-radius:9999px;transition:background var(--duration-base) var(--ease-out),border-color var(--duration-base) var(--ease-out),color var(--duration-base) var(--ease-out),box-shadow var(--duration-base) var(--ease-out),transform var(--duration-fast)}.chip{padding:4px var(--lib-space-sm);background:var(--color-washi-100);color:var(--text-secondary);border:1px solid var(--border-subtle);cursor:default}.chip-toggle{padding:5px var(--lib-space-md);background:var(--bg-elevated);color:var(--text-secondary);border:1px solid var(--border-default);cursor:pointer;position:relative;overflow:hidden}.chip-toggle:hover{border-color:var(--border-strong);color:var(--text-primary);background:var(--bg-surface)}.chip-toggle:active{transform:scale(.96)}.chip-toggle:focus-visible{outline:2px solid var(--color-kaki-400);outline-offset:2px}:host([selected]) .chip-toggle{background:var(--color-washi-900);border-color:var(--color-washi-900);color:var(--color-washi-50);box-shadow:var(--shadow-sm)}.chip-input{padding:4px 4px 4px var(--lib-space-sm);background:var(--bg-elevated);color:var(--text-secondary);border:1px solid var(--border-default);gap:var(--lib-space-sm)}.chip-remove{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:9999px;border:none;background:transparent;color:var(--text-muted);cursor:pointer;font-size:12px;padding:0;flex-shrink:0;transition:background var(--duration-fast),color var(--duration-fast)}.chip-remove:hover{background:var(--color-washi-200);color:var(--text-primary)}.chip-remove svg{width:10px;height:10px}.chip-input.is-entering{animation:chip-enter .25s var(--ease-bounce)}@keyframes chip-enter{0%{opacity:0;transform:scale(.7)}to{opacity:1;transform:scale(1)}}.chip-input.is-removing{animation:chip-remove-anim .2s var(--ease-out) forwards}@keyframes chip-remove-anim{to{opacity:0;transform:scale(.8);max-width:0;padding:0;margin:0;border-width:0}}:host([size="xs"]) .chip{font-size:9px;padding:2px var(--lib-space-sm);letter-spacing:.04em}:host([size="xs"]) .chip-toggle{font-size:9px;padding:3px var(--lib-space-sm);letter-spacing:.04em}:host([size="xs"]) .chip-input{font-size:9px;padding:2px 2px 2px var(--lib-space-sm)}:host([size="xs"]) .chip-remove{width:14px;height:14px;font-size:10px}:host([size="xs"]) .chip-avatar{width:14px;height:14px;font-size:7px}:host([size="sm"]) .chip{font-size:10px;padding:3px var(--lib-space-sm)}:host([size="sm"]) .chip-toggle{font-size:10px;padding:4px var(--lib-space-sm)}:host([size="sm"]) .chip-input{font-size:10px;padding:3px 3px 3px var(--lib-space-sm)}:host([size="lg"]) .chip{font-size:var(--text-sm);padding:var(--lib-space-sm) var(--lib-space-md);letter-spacing:var(--tracking-wider)}:host([size="lg"]) .chip-toggle{font-size:var(--text-sm);padding:var(--lib-space-sm) var(--lib-space-md);letter-spacing:var(--tracking-wider)}:host([size="lg"]) .chip-input{font-size:var(--text-sm);padding:var(--lib-space-sm) var(--lib-space-sm) var(--lib-space-sm) var(--lib-space-md)}:host([size="lg"]) .chip-remove{width:22px;height:22px;font-size:14px}:host([size="lg"]) .chip-avatar{width:22px;height:22px;font-size:9px}:host([color="kaki"]) .chip{background:var(--color-kaki-50);color:var(--color-kaki-600);border-color:var(--color-kaki-100)}:host([color="kaki"]) .chip-toggle:not(.chip-toggle-selected){background:var(--color-kaki-50);color:var(--color-kaki-600);border-color:var(--color-kaki-100)}:host([color="kaki"]) .chip-toggle:hover:not([selected]){border-color:var(--color-kaki-400)}:host([color="kaki"][selected]) .chip-toggle{background:var(--color-kaki-500);border-color:var(--color-kaki-500);color:#fff}:host([color="kaki"]) .chip-input{background:var(--color-kaki-50);color:var(--color-kaki-600);border-color:var(--color-kaki-100)}:host([color="kaki"]) .chip-remove:hover{background:var(--color-kaki-100);color:var(--color-kaki-600)}:host([color="celadon"]) .chip{background:var(--color-celadon-100);color:var(--color-celadon-600);border-color:var(--color-celadon-100)}:host([color="celadon"]) .chip-toggle{background:var(--color-celadon-50);color:var(--color-celadon-600);border-color:var(--color-celadon-100)}:host([color="celadon"][selected]) .chip-toggle{background:var(--color-celadon-500);border-color:var(--color-celadon-500);color:#fff}:host([color="celadon"]) .chip-input{background:var(--color-celadon-50);color:var(--color-celadon-600);border-color:var(--color-celadon-100)}:host([color="celadon"]) .chip-remove:hover{background:var(--color-celadon-100);color:var(--color-celadon-600)}:host([color="error"]) .chip,:host([color="error"]) .chip-input{background:var(--color-error-light);color:var(--color-error);border-color:var(--color-error-light)}:host([color="error"]) .chip-remove:hover{background:#ebc5bf;color:var(--color-error)}:host([color="info"]) .chip{background:var(--color-info-light, #D6E8F5);color:var(--color-info, #1A4A6E);border-color:var(--color-info-light, #D6E8F5)}:host([color="dark"]) .chip{background:var(--color-washi-900);color:var(--color-washi-300);border-color:var(--color-washi-800)}:host([color="dark"]) .chip-toggle{background:var(--color-washi-800);color:var(--color-washi-300);border-color:var(--color-washi-700)}:host([color="dark"]) .chip-toggle:hover{border-color:var(--color-washi-500);color:var(--color-washi-100)}:host([color="dark"][selected]) .chip-toggle{background:var(--color-washi-50);border-color:var(--color-washi-50);color:var(--color-washi-950)}:host([color="dark"]) .chip-input{background:var(--color-washi-800);color:var(--color-washi-300);border-color:var(--color-washi-700)}:host([color="dark"]) .chip-remove:hover{background:var(--color-washi-700);color:var(--color-washi-100)}:host([dot]) .chip:before,:host([dot]) .chip-toggle:before,:host([dot]) .chip-input:before{content:"";width:6px;height:6px;border-radius:9999px;background:currentcolor;flex-shrink:0;opacity:.7}.chip-avatar{width:18px;height:18px;border-radius:9999px;object-fit:cover;flex-shrink:0;background:var(--color-washi-200);display:inline-flex;align-items:center;justify-content:center;font-size:8px;font-family:var(--lib-font-mono);color:var(--text-secondary);overflow:hidden}.chip-icon{font-size:13px;display:inline-flex;align-items:center;flex-shrink:0;opacity:.7}.chip-icon svg{width:1em;height:1em}}';
39
2
  export {
40
- CURSOR_MODES
3
+ chipCss as default
41
4
  };
42
5
  //# sourceMappingURL=index202.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index202.js","sources":["../src/components/organisms/cursor-follower/lib-cursor-follower.types.ts"],"sourcesContent":["/** Cuatro modos visuales del cursor */\nexport type CursorMode = 'ink' | 'minimal' | 'kaki' | 'ghost';\n\n/** Estados contextuales detectados automáticamente */\nexport type CursorState = 'default' | 'hover' | 'text' | 'press' | 'hidden';\n\n/** Configuración interna por modo */\nexport interface CursorModeConfig {\n dotBg: string;\n dotSize: string;\n ringBorder: string;\n ringBg: string;\n ringSize: string;\n ringMix: string;\n lerpFactor: number;\n}\n\nexport const CURSOR_MODES: Record<CursorMode, CursorModeConfig> = {\n ink: {\n dotBg: 'var(--color-washi-900)',\n dotSize: '6px',\n ringBorder: '1px solid var(--color-washi-400)',\n ringBg: 'transparent',\n ringSize: '36px',\n ringMix: 'multiply',\n lerpFactor: 0.12,\n },\n minimal: {\n dotBg: 'var(--color-washi-600)',\n dotSize: '4px',\n ringBorder: 'none',\n ringBg: 'transparent',\n ringSize: '0px',\n ringMix: 'normal',\n lerpFactor: 0.2,\n },\n kaki: {\n dotBg: 'var(--color-kaki-500)',\n dotSize: '8px',\n ringBorder: '1.5px solid var(--color-kaki-200, #F4C099)',\n ringBg: 'rgba(217,114,52,0.04)',\n ringSize: '40px',\n ringMix: 'normal',\n lerpFactor: 0.09,\n },\n ghost: {\n dotBg: 'transparent',\n dotSize: '0px',\n ringBorder: '1px solid rgba(250,247,244,0.25)',\n ringBg: 'rgba(250,247,244,0.03)',\n ringSize: '28px',\n ringMix: 'normal',\n lerpFactor: 0.1,\n },\n};"],"names":[],"mappings":"AAiBO,MAAM,eAAqD;AAAA,EAChE,KAAK;AAAA,IACH,OAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAY;AAAA,IACZ,UAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAAA,EAEd,SAAS;AAAA,IACP,OAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAY;AAAA,IACZ,UAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAAA,EAEd,MAAM;AAAA,IACJ,OAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAY;AAAA,IACZ,UAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAAA,EAEd,OAAO;AAAA,IACL,OAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAY;AAAA,IACZ,UAAY;AAAA,IACZ,SAAY;AAAA,IACZ,YAAY;AAAA,EAAA;AAEhB;"}
1
+ {"version":3,"file":"index202.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/dist/index203.js CHANGED
@@ -1,5 +1,5 @@
1
- const tableCss = '@layer tokens,reset,components;@layer reset{:host{display:block;width:100%}*,*:before,*:after{box-sizing:border-box}}@layer components{.tbl-wrap{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--border-subtle)}.tbl-wrap table{border:none}.tbl-wrap.tbl-sticky-head{max-height:380px;overflow-y:auto}.tbl-sticky-head thead th{position:sticky;top:0;z-index:3}table{width:100%;border-collapse:collapse;font-family:var(--lib-font-body);font-size:var(--text-sm);color:var(--text-secondary);background:var(--bg-elevated)}caption{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--text-muted);text-align:left;padding:var(--lib-space-sm) var(--lib-space-md);background:var(--bg-surface);border-bottom:1px solid var(--border-subtle);caption-side:top}thead th{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--text-muted);font-weight:400;padding:var(--lib-space-sm) var(--lib-space-md);text-align:left;background:var(--bg-surface);border-bottom:1px solid var(--border-default);white-space:nowrap;-webkit-user-select:none;user-select:none;position:relative}thead th.is-sortable{cursor:pointer;padding-right:var(--lib-space-lg);transition:color var(--duration-fast),background var(--duration-fast)}thead th.is-sortable:hover{color:var(--text-primary);background:var(--color-washi-200)}thead th.is-sortable:after{content:"";position:absolute;right:var(--lib-space-sm);top:50%;transform:translateY(-50%);width:0;height:0;opacity:.3;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid currentcolor;transition:opacity var(--duration-fast),transform var(--duration-base)}thead th.is-sortable:hover:after{opacity:.6}thead th.sort-asc:after{opacity:1;transform:translateY(-50%) rotate(180deg)}thead th.sort-desc:after{opacity:1;transform:translateY(-50%) rotate(0)}thead th.sort-asc,thead th.sort-desc{color:var(--text-primary);background:var(--color-washi-200)}thead th.is-num{text-align:right}tbody tr{transition:background var(--duration-fast);border-bottom:1px solid var(--border-subtle)}tbody tr:last-child{border-bottom:none}tbody td{padding:var(--lib-space-md) var(--lib-space-md);color:var(--text-secondary);font-size:var(--text-sm);vertical-align:middle;line-height:var(--leading-snug)}tfoot td{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-muted);background:var(--bg-surface);border-top:1px solid var(--border-default)}:host([size="sm"]) thead th{padding:var(--lib-space-xs) var(--lib-space-sm);font-size:9px}:host([size="sm"]) tbody td{padding:var(--lib-space-xs) var(--lib-space-sm);font-size:var(--text-xs)}:host([size="sm"]) tfoot td{padding:var(--lib-space-xs) var(--lib-space-sm)}:host([size="lg"]) thead th{padding:var(--lib-space-md) var(--lib-space-lg);font-size:11px}:host([size="lg"]) tbody td{padding:calc(var(--lib-space-md) + var(--lib-space-xs)) var(--lib-space-lg);font-size:var(--text-base)}:host([size="lg"]) tfoot td{padding:var(--lib-space-md) var(--lib-space-lg)}:host([variant="lines"]) tbody tr:hover,:host(:not([variant])) tbody tr:hover{background:var(--color-washi-50)}:host([variant="grid"]) thead th,:host([variant="grid"]) tbody td{border-right:1px solid var(--border-subtle)}:host([variant="grid"]) thead th:last-child,:host([variant="grid"]) tbody td:last-child{border-right:none}:host([variant="grid"]) tbody tr:hover{background:var(--color-washi-50)}:host([variant="striped"]) tbody tr:nth-child(2n){background:var(--bg-surface)}:host([variant="striped"]) tbody tr:hover{background:var(--color-washi-50)}:host([variant="striped"]) tbody tr:nth-child(2n):hover{background:var(--color-washi-200)}:host([variant="borderless"]) thead th{border-bottom:1px solid var(--border-default)}:host([variant="borderless"]) tbody tr{border-bottom:none}:host([variant="borderless"]) tbody td{border:none}:host([variant="borderless"]) tbody tr:hover{background:var(--bg-surface)}tbody tr.is-selected,tbody tr.is-selected:hover{background:var(--color-kaki-50);border-bottom-color:var(--color-kaki-100)}tbody tr.is-selected td{color:var(--text-primary)}tbody tr.is-error,tbody tr.is-error:hover{background:#f5ddd9;border-bottom-color:#ebc9c4}tbody tr.is-error td{color:var(--color-error)}tbody tr.is-warning,tbody tr.is-warning:hover{background:#fef9ec;border-bottom-color:#f5e6a8}tbody tr.is-warning td{color:#7a5c0a}tbody tr.is-success,tbody tr.is-success:hover{background:var(--color-celadon-50);border-bottom-color:var(--color-celadon-100)}tbody tr.is-success td{color:var(--color-celadon-600)}tbody tr.is-disabled,tbody tr.is-disabled:hover{background:transparent;opacity:.38;cursor:not-allowed}.col-sticky{position:sticky;left:0;z-index:1;background:inherit}thead .col-sticky{background:var(--bg-surface);z-index:2}.col-sticky:after{content:"";position:absolute;top:0;right:-1px;bottom:0;width:1px;background:var(--border-subtle);box-shadow:2px 0 6px #1a140e0d}.cell-num{text-align:right;font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-primary)}thead th.cell-num{color:var(--text-muted)}.cell-mono{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-muted)}.cell-truncate{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.cell-check{width:40px;padding:var(--lib-space-md) var(--lib-space-sm) var(--lib-space-md) var(--lib-space-md)!important}.cell-check input[type=checkbox]{width:14px;height:14px;accent-color:var(--color-washi-900);cursor:pointer;display:block}.cell-avatar{display:flex;align-items:center;gap:var(--lib-space-sm)}.avatar-circle{width:28px;height:28px;border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;font-family:var(--lib-font-mono);font-size:9px;flex-shrink:0;background:var(--color-washi-200);color:var(--text-secondary)}.avatar-text{display:flex;flex-direction:column;gap:1px}.avatar-name{font-size:var(--text-sm);color:var(--text-secondary);line-height:var(--leading-tight)}.avatar-hint{font-family:var(--lib-font-mono);font-size:10px;color:var(--text-muted);letter-spacing:var(--tracking-wide)}.cell-badge{display:inline-flex;align-items:center;gap:var(--lib-space-xs);font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-wider);text-transform:uppercase;padding:2px var(--lib-space-sm);white-space:nowrap}.cell-badge:before{content:"";width:5px;height:5px;border-radius:var(--radius-full);background:currentcolor;flex-shrink:0;opacity:.7}.cell-badge.tone-estable{color:var(--color-celadon-600);background:var(--color-celadon-50)}.cell-badge.tone-beta{color:var(--color-kaki-500);background:var(--color-kaki-50)}.cell-badge.tone-error{color:var(--color-error);background:#f5ddd9}.cell-badge.tone-warning{color:#7a5c0a;background:#fef9ec}.cell-badge.tone-inactive{color:var(--text-muted);background:var(--bg-surface)}.cell-badge.tone-info{color:#1a4a6e;background:#d6e8f5}.cell-progress{display:flex;align-items:center;gap:var(--lib-space-sm)}.progress-bar{flex:1;height:3px;background:var(--color-washi-200);position:relative;min-width:60px}.progress-fill{position:absolute;left:0;top:0;bottom:0;background:var(--color-washi-700);transition:width var(--duration-slow) var(--ease-out)}.progress-fill.tone-kaki{background:var(--color-kaki-500)}.progress-fill.tone-celadon{background:var(--color-celadon-500)}.progress-val{font-family:var(--lib-font-mono);font-size:10px;color:var(--text-muted);letter-spacing:var(--tracking-wide);flex-shrink:0;width:28px;text-align:right}.cell-actions{width:44px;text-align:right!important;padding-right:var(--lib-space-md)!important}.actions-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;font-size:18px;line-height:1;color:var(--text-muted);background:transparent;border:none;cursor:pointer;border-radius:var(--radius-full);transition:background var(--duration-fast),color var(--duration-fast);opacity:0}tbody tr:hover .actions-btn{opacity:1}.actions-btn:hover{background:var(--bg-surface);color:var(--text-primary)}@keyframes dt-shimmer{0%{background-position:-600px 0}to{background-position:600px 0}}.skel-line{height:10px;background:linear-gradient(90deg,var(--color-washi-200) 25%,var(--color-washi-100) 50%,var(--color-washi-200) 75%);background-size:600px 100%;animation:dt-shimmer 1.4s infinite linear;border-radius:2px}.skel-line.w-80{width:80%}.skel-line.w-60{width:60%}.skel-line.w-40{width:40%}.skel-line.w-30{width:30%}.skel-avatar{width:28px;height:28px;border-radius:var(--radius-full);background:linear-gradient(90deg,var(--color-washi-200) 25%,var(--color-washi-100) 50%,var(--color-washi-200) 75%);background-size:600px 100%;animation:dt-shimmer 1.4s infinite linear;flex-shrink:0}.skel-cell{display:flex;align-items:center;gap:var(--lib-space-sm)}.skel-badge{height:16px;width:48px;border-radius:2px;background:linear-gradient(90deg,var(--color-washi-200) 25%,var(--color-washi-100) 50%,var(--color-washi-200) 75%);background-size:600px 100%;animation:dt-shimmer 1.4s infinite linear}.empty-row td{text-align:center;padding:var(--lib-space-xl) var(--lib-space-lg)!important;border-bottom:none!important}.empty-icon{font-size:32px;color:var(--color-washi-300);display:block;margin:0 auto var(--lib-space-md)}.empty-title{font-family:var(--lib-font-display);font-size:var(--text-xl);font-weight:var(--weight-light);color:var(--text-muted);letter-spacing:var(--tracking-tight);display:block;margin-bottom:var(--lib-space-xs)}.empty-desc{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--color-washi-300);text-transform:uppercase;display:block}.tbl-toolbar{display:flex;align-items:center;gap:var(--lib-space-sm);padding:var(--lib-space-sm) var(--lib-space-md);background:var(--bg-surface);border:1px solid var(--border-subtle);border-bottom:none}.tbl-toolbar-title{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wider);text-transform:uppercase;color:var(--text-secondary)}.tbl-toolbar-count{font-family:var(--lib-font-mono);font-size:10px;color:var(--text-muted);letter-spacing:var(--tracking-wide);margin-right:auto}.tbl-toolbar-search{font-family:var(--lib-font-mono);font-size:var(--text-xs);color:var(--text-primary);background:var(--bg-elevated);border:1px solid var(--border-default);padding:var(--lib-space-xs) var(--lib-space-sm);outline:none;width:180px;transition:border-color var(--duration-base),box-shadow var(--duration-base)}.tbl-toolbar-search::placeholder{color:var(--text-muted)}.tbl-toolbar-search:focus{border-color:var(--color-washi-700);box-shadow:0 0 0 3px #1a140e14}.tbl-pagination{display:flex;align-items:center;gap:var(--lib-space-xs);padding:var(--lib-space-sm) var(--lib-space-md);border:1px solid var(--border-subtle);border-top:none;background:var(--bg-surface)}.pag-info{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-muted);margin-right:auto}.pag-btn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wide);color:var(--text-muted);background:transparent;border:1px solid transparent;cursor:pointer;transition:background var(--duration-fast),color var(--duration-fast),border-color var(--duration-fast)}.pag-btn:hover{background:var(--bg-elevated);border-color:var(--border-default);color:var(--text-primary)}.pag-btn.is-active{background:var(--color-washi-900);color:var(--color-washi-50);border-color:var(--color-washi-900)}.pag-btn:disabled{opacity:.35;cursor:not-allowed;pointer-events:none}.pag-sep{font-family:var(--lib-font-mono);font-size:10px;color:var(--text-muted);padding:0 2px}:host([dark]) table{background:#0a0403;color:#7b6f67}:host([dark]) thead th{background:#060201;color:#312620;border-bottom-color:#190f0a}:host([dark]) thead th.is-sortable:hover{background:#150a06;color:#998c84}:host([dark]) thead th.sort-asc,:host([dark]) thead th.sort-desc{background:#150a06;color:#a99b93}:host([dark]) tbody tr{border-bottom-color:#150a06}:host([dark]) tbody td{color:#7b6f67}:host([dark]) tbody td.cell-num{color:#afa299}:host([dark]) tbody tr:hover{background:#150a06}:host([dark]) .tbl-wrap{border-color:#150a06}:host([dark]) tfoot td{background:#060201;border-top-color:#190f0a;color:#362b25}:host([dark]) caption{background:#060201;color:#312620;border-color:#150a06}:host([dark]) .tbl-toolbar{background:#060201;border-color:#150a06}:host([dark]) .tbl-toolbar-title{color:#51453e}:host([dark]) .tbl-toolbar-count{color:#2a1f19}:host([dark]) .tbl-toolbar-search{background:#060201;border-color:#231813;color:#998c84}:host([dark]) .tbl-toolbar-search::placeholder{color:#312620}:host([dark]) .tbl-pagination{background:#060201;border-color:#150a06}:host([dark]) .pag-btn:hover{background:#150a06;border-color:#231813;color:#998c84}:host([dark]) .avatar-circle{background:#1e130e;color:#5f524c}:host([dark]) .avatar-name{color:#8a7d75}:host([dark]) .avatar-hint{color:#362b25}:host([dark]) .progress-bar{background:#1e130e}:host([dark]) .col-sticky{background:#0a0403}:host([dark]) thead .col-sticky{background:#060201}:host([dark]) .cell-mono{color:#362b25}:host([dark]) .actions-btn:hover{background:#1e130e;color:#998c84}:host([dark]) tbody tr.is-selected,:host([dark]) tbody tr.is-selected:hover{background:#190f0a}:host([dark]) .skel-line,:host([dark]) .skel-avatar,:host([dark]) .skel-badge{background:linear-gradient(90deg,#17100c 25%,#211815,#17100c 75%);background-size:600px 100%}}';
1
+ const pickerCss = '@layer tokens,reset,components;@layer reset{:host{display:inline-block}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}}@layer components{.cp{width:260px;background:var(--bg-elevated);border:1px solid var(--border-default);box-shadow:var(--shadow-md);-webkit-user-select:none;user-select:none;flex-shrink:0}.cp-canvas{width:100%;height:160px;position:relative;cursor:crosshair;overflow:hidden}.cp-canvas:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to right,#fff 0%,transparent 100%);pointer-events:none}.cp-canvas:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(to bottom,transparent 0%,#000 100%);pointer-events:none}.cp-thumb{position:absolute;width:14px;height:14px;border-radius:var(--radius-full);border:2px solid #fff;box-shadow:0 0 0 1px #0000004d,0 2px 4px #0003;transform:translate(-50%,-50%);z-index:2;pointer-events:none;transition:transform var(--duration-fast)}.cp-canvas:active .cp-thumb{transform:translate(-50%,-50%) scale(1.15)}.cp-sliders{display:flex;gap:var(--lib-space-sm);align-items:center;padding:var(--lib-space-sm) var(--lib-space-md) 0}.cp-preview-dot{width:28px;height:28px;border-radius:var(--radius-full);flex-shrink:0;border:1px solid rgb(0,0,0,.1);position:relative;overflow:hidden}.cp-preview-dot:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:6px 6px;background-position:0 0,0 3px,3px -3px,-3px 0}.cp-preview-color{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:var(--radius-full)}.cp-sliders-stack{display:flex;flex-direction:column;gap:var(--lib-space-xs);flex:1}.cp-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:10px;border-radius:var(--radius-full);border:1px solid rgb(0,0,0,.08);outline:none;cursor:pointer}.cp-range::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;border-radius:var(--radius-full);background:#fff;border:1px solid rgb(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:grab;transition:transform var(--duration-fast),box-shadow var(--duration-fast)}.cp-range::-webkit-slider-thumb:active{cursor:grabbing;transform:scale(1.15);box-shadow:0 2px 6px #00000040}.cp-range::-moz-range-thumb{width:14px;height:14px;border-radius:var(--radius-full);background:#fff;border:1px solid rgb(0,0,0,.25);box-shadow:0 1px 3px #0003;cursor:grab}.cp-range-hue{background:linear-gradient(to right,red,#ff8000,#ff0,#80ff00,#0f0,#00ff80,#0ff,#0080ff,#00f,#7f00ff,#f0f,#ff0080,red)}.cp-alpha-wrap{position:relative;border-radius:var(--radius-full);overflow:hidden}.cp-alpha-checker{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(45deg,#aaa 25%,transparent 25%),linear-gradient(-45deg,#aaa 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#aaa 75%),linear-gradient(-45deg,transparent 75%,#aaa 75%);background-size:8px 8px;background-position:0 0,0 4px,4px -4px,-4px 0;background-color:#eee;border-radius:var(--radius-full);border:1px solid rgb(0,0,0,.08)}.cp-alpha-checker .cp-range-alpha{position:relative;z-index:1;background:transparent;border:none}.cp-inputs-wrap{padding:var(--lib-space-sm) var(--lib-space-md);display:flex;gap:var(--lib-space-xs);align-items:flex-start;border-top:1px solid var(--border-subtle)}.cp-mode-btn{width:22px;height:22px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--text-muted);background:transparent;border:none;cursor:pointer;transition:color var(--duration-fast);margin-top:4px;padding:0}.cp-mode-btn:hover{color:var(--text-primary)}.cp-input-group{display:flex;flex-direction:column;gap:0;min-width:0}.cp-input{font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-primary);background:var(--bg-base);border:1px solid var(--border-default);padding:var(--lib-space-xs) var(--lib-space-sm);outline:none;width:100%;transition:border-color var(--duration-base),box-shadow var(--duration-base);text-transform:uppercase}.cp-input:focus{border-color:var(--color-washi-700);box-shadow:0 0 0 3px #1a140e17}.cp-input[type=number]{text-transform:none}.cp-input-label{font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--text-muted);display:block;text-align:center;margin-top:3px}.cp-saved{padding:var(--lib-space-xs) var(--lib-space-md) var(--lib-space-sm);border-top:1px solid var(--border-subtle);display:flex;align-items:center;gap:var(--lib-space-xs);flex-wrap:wrap}.cp-saved-label{font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--text-muted);width:100%}.cp-saved-add{width:20px;height:20px;border:1px dashed var(--border-default);display:flex;align-items:center;justify-content:center;font-size:14px;color:var(--text-muted);cursor:pointer;background:transparent;transition:border-color var(--duration-fast),color var(--duration-fast),background var(--duration-fast);flex-shrink:0;line-height:1}.cp-saved-add:hover{border-color:var(--color-washi-700);color:var(--text-primary);background:var(--bg-surface)}.cp-actions{display:flex;gap:var(--lib-space-xs);padding:var(--lib-space-sm) var(--lib-space-md);border-top:1px solid var(--border-subtle);background:var(--bg-surface)}.cp-btn{font-family:var(--lib-font-mono);font-size:10px;letter-spacing:var(--tracking-wider);text-transform:uppercase;border:none;padding:var(--lib-space-xs) var(--lib-space-md);cursor:pointer;transition:background var(--duration-base),color var(--duration-base);flex:1}.cp-btn-cancel{background:transparent;border:1px solid var(--border-default);color:var(--text-muted)}.cp-btn-cancel:hover{background:var(--color-washi-200);color:var(--text-primary)}.cp-btn-ok{background:var(--color-washi-900);color:var(--color-washi-50)}.cp-btn-ok:hover{background:var(--color-washi-800)}.cp-trigger-wrap{position:relative;display:inline-block}.cp-trigger{display:flex;align-items:center;gap:var(--lib-space-sm);font-family:var(--lib-font-mono);font-size:var(--text-xs);letter-spacing:var(--tracking-wide);color:var(--text-secondary);background:var(--bg-elevated);border:1px solid var(--border-default);padding:var(--lib-space-xs) var(--lib-space-sm);cursor:pointer;transition:border-color var(--duration-base),box-shadow var(--duration-base);outline:none}.cp-trigger:focus,.cp-trigger.is-open{border-color:var(--color-washi-700);box-shadow:0 0 0 3px #1a140e17}.cp-trigger-dot{width:18px;height:18px;border:1px solid rgb(0,0,0,.1);flex-shrink:0;position:relative;overflow:hidden}.cp-trigger-dot:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(45deg,#ccc 25%,transparent 25%),linear-gradient(-45deg,#ccc 25%,transparent 25%),linear-gradient(45deg,transparent 75%,#ccc 75%),linear-gradient(-45deg,transparent 75%,#ccc 75%);background-size:6px 6px;background-position:0 0,0 3px,3px -3px,-3px 0}.cp-trigger-color{position:absolute;top:0;right:0;bottom:0;left:0}.cp-trigger-wrap .cp{position:absolute;top:calc(100% + 6px);left:0;z-index:400;opacity:0;transform:translateY(-4px);pointer-events:none;transition:opacity var(--duration-base) var(--ease-out),transform var(--duration-base) var(--ease-out)}.cp-trigger-wrap .cp.is-open{opacity:1;transform:translateY(0);pointer-events:auto}.cp-swatches{display:flex;flex-direction:column;gap:var(--lib-space-sm)}.cp-swatches-row{display:flex;gap:var(--lib-space-xs);align-items:center}.cp-swatches-label{font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-widest);text-transform:uppercase;color:var(--text-muted);width:52px;flex-shrink:0}.cp-swatch{width:24px;height:24px;border:1px solid rgb(0,0,0,.08);cursor:pointer;position:relative;flex-shrink:0;transition:transform var(--duration-fast),box-shadow var(--duration-fast)}.cp-swatch:hover{transform:scale(1.18);box-shadow:0 2px 8px #0000002e;z-index:1}.cp-swatch.is-selected:after{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border:2px solid var(--color-washi-900)}.cp-swatch[data-name]:before{content:attr(data-name);position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%);font-family:var(--lib-font-mono);font-size:9px;letter-spacing:var(--tracking-wide);white-space:nowrap;background:var(--color-washi-900);color:var(--color-washi-100);padding:2px var(--lib-space-xs);pointer-events:none;opacity:0;transition:opacity var(--duration-base);z-index:10}.cp-swatch[data-name]:hover:before{opacity:1}.cp-swatch-sm{width:18px;height:18px}.cp-swatch-lg{width:32px;height:32px}.cp-swatch-xl{width:48px;height:48px}:host([dark]) .cp{background:#0a0403;border-color:#1e130e;box-shadow:0 8px 32px #00000080}:host([dark]) .cp-input{background:#060201;border-color:#231813;color:#998c84}:host([dark]) .cp-input:focus{border-color:#6d6059}:host([dark]) .cp-input-label{color:#2a1f19}:host([dark]) .cp-saved{border-color:#190f0a}:host([dark]) .cp-saved-label{color:#2a1f19}:host([dark]) .cp-saved-add{border-color:#231813;color:#362b25}:host([dark]) .cp-saved-add:hover{background:#150a06;border-color:#51453e;color:#998c84}:host([dark]) .cp-actions{background:#060201;border-color:#190f0a}:host([dark]) .cp-btn-cancel{border-color:#231813;color:#433831}:host([dark]) .cp-btn-cancel:hover{background:#190f0a;color:#998c84}:host([dark]) .cp-mode-btn{color:#362b25}:host([dark]) .cp-mode-btn:hover{color:#998c84}:host([dark]) .cp-inputs-wrap{border-color:#190f0a}:host([dark]) .cp-trigger{background:#100704;border-color:#1e130e;color:#5f524c}:host([dark]) .cp-trigger:focus,:host([dark]) .cp-trigger.is-open{border-color:#6d6059}:host([dark]) .cp-swatch.is-selected:after{border-color:#998c84}:host([dark]) .cp-swatches-label{color:#312620}:host([disabled]){pointer-events:none;opacity:.5}}';
2
2
  export {
3
- tableCss as default
3
+ pickerCss as default
4
4
  };
5
5
  //# sourceMappingURL=index203.js.map
package/dist/index204.js CHANGED
@@ -1,240 +1,165 @@
1
- import { nothing, html } from "lit";
2
- function renderBadge(value, tone) {
3
- const label = String(value ?? "");
4
- return html`<span class="cell-badge tone-${tone}">${label}</span>`;
5
- }
6
- function renderProgress(value, tone) {
7
- const pct = Math.min(100, Math.max(0, Number(value) || 0));
8
- const toneClass = tone ? `tone-${tone}` : "";
1
+ import { html, nothing } from "lit";
2
+ const ROTATE_SVG = html`<svg width="12" height="12" viewBox="0 0 12 12" fill="none" stroke="currentColor"
3
+ stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
4
+ <path d="M10 2.5A4.5 4.5 0 1 0 11 6"/>
5
+ <path d="M10 .5v2h2"/>
6
+ </svg>`;
7
+ const CARET_SVG = html`<svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor"
8
+ stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
9
+ <path d="M2 4l3 3 3-3"/>
10
+ </svg>`;
11
+ function swatchGridTemplate(props) {
12
+ const { rows, selected, onSelect } = props;
9
13
  return html`
10
- <div class="cell-progress">
11
- <div class="progress-bar">
12
- <div class="progress-fill ${toneClass}" style="width:${pct}%"></div>
13
- </div>
14
- <span class="progress-val">${pct}%</span>
14
+ <div class="cp-swatches">
15
+ ${rows.map((row) => html`
16
+ <div class="cp-swatches-row">
17
+ <span class="cp-swatches-label">${row.label}</span>
18
+ ${row.colors.map((c) => html`
19
+ <div
20
+ class="cp-swatch ${c.value.toLowerCase() === selected.toLowerCase() ? "is-selected" : ""}"
21
+ style="background:${c.value};"
22
+ data-name="${c.name ?? ""}"
23
+ @click="${() => onSelect(c)}"
24
+ role="button"
25
+ aria-label="${c.name ?? c.value}"
26
+ ></div>
27
+ `)}
28
+ </div>
29
+ `)}
15
30
  </div>
16
31
  `;
17
32
  }
18
- function renderAvatar(row, col) {
19
- const name = String(row[col.key] ?? "");
20
- const initials = col.initialsKey ? String(row[col.initialsKey] ?? "").slice(0, 2).toUpperCase() : name.split(" ").map((w) => w[0]).join("").slice(0, 2).toUpperCase();
21
- const hint = col.hintKey ? String(row[col.hintKey] ?? "") : "";
33
+ function pickerPanelTemplate(p) {
34
+ const { hex, r, g, b, h, s, l, alpha, inputMode, savedColors, showAlpha } = p;
35
+ const thumbX = s;
36
+ const thumbY = 100 - l;
37
+ const cssColor = alpha < 100 ? `rgba(${r},${g},${b},${(alpha / 100).toFixed(2)})` : hex;
38
+ const alphaGradient = `linear-gradient(to right, transparent, hsl(${h},${s}%,${l}%))`;
39
+ const inputsBlock = inputMode === "hex" ? html`
40
+ <div class="cp-input-group" style="flex:3">
41
+ <input class="cp-input" type="text" .value="${hex}" maxlength="7"
42
+ @input="${p.onHexInput}">
43
+ <span class="cp-input-label">HEX</span>
44
+ </div>
45
+ ${showAlpha ? html`
46
+ <div class="cp-input-group" style="flex:1">
47
+ <input class="cp-input" type="number" .value="${String(Math.round(alpha))}" min="0" max="100"
48
+ @input="${p.onAlphaNumInput}">
49
+ <span class="cp-input-label">A%</span>
50
+ </div>` : nothing}
51
+ ` : inputMode === "rgb" ? html`
52
+ <div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(r)}" min="0" max="255" @input="${(e) => p.onRgbInput(0, e)}"><span class="cp-input-label">R</span></div>
53
+ <div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(g)}" min="0" max="255" @input="${(e) => p.onRgbInput(1, e)}"><span class="cp-input-label">G</span></div>
54
+ <div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(b)}" min="0" max="255" @input="${(e) => p.onRgbInput(2, e)}"><span class="cp-input-label">B</span></div>
55
+ ${showAlpha ? html`<div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(Math.round(alpha))}" min="0" max="100" @input="${p.onAlphaNumInput}"><span class="cp-input-label">A%</span></div>` : nothing}
56
+ ` : html`
57
+ <div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(h)}" min="0" max="360" @input="${(e) => p.onHslInput(0, e)}"><span class="cp-input-label">H</span></div>
58
+ <div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(s)}" min="0" max="100" @input="${(e) => p.onHslInput(1, e)}"><span class="cp-input-label">S%</span></div>
59
+ <div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(l)}" min="0" max="100" @input="${(e) => p.onHslInput(2, e)}"><span class="cp-input-label">L%</span></div>
60
+ ${showAlpha ? html`<div class="cp-input-group" style="flex:1"><input class="cp-input" type="number" .value="${String(Math.round(alpha))}" min="0" max="100" @input="${p.onAlphaNumInput}"><span class="cp-input-label">A%</span></div>` : nothing}
61
+ `;
22
62
  return html`
23
- <div class="cell-avatar">
24
- <div class="avatar-circle">${initials}</div>
25
- <div class="avatar-text">
26
- <span class="avatar-name">${name}</span>
27
- ${hint ? html`<span class="avatar-hint">${hint}</span>` : nothing}
28
- </div>
63
+ <!-- Canvas 2D -->
64
+ <div class="cp-canvas"
65
+ style="background: hsl(${h},100%,50%);"
66
+ @mousedown="${p.onCanvasMousedown}"
67
+ >
68
+ <div class="cp-thumb"
69
+ style="left:${thumbX}%;top:${thumbY}%;background:${cssColor};"
70
+ ></div>
29
71
  </div>
30
- `;
31
- }
32
- function renderActionsBtn(row, idx, onRowAction) {
33
- return html`
34
- <button class="actions-btn"
35
- aria-label="Acciones"
36
- @click="${(e) => {
37
- e.stopPropagation();
38
- onRowAction(row, idx);
39
- }}"
40
- >⋯</button>
41
- `;
42
- }
43
- function renderCell(col, row, idx, onRowAction) {
44
- const value = row[col.key];
45
- switch (col.type) {
46
- case "badge": {
47
- const tone = col.toneKey ? String(row[col.toneKey] ?? "inactive") : col.badgeTone ?? "inactive";
48
- return renderBadge(value, tone);
49
- }
50
- case "progress":
51
- return renderProgress(value, col.progressTone ?? "");
52
- case "avatar":
53
- return renderAvatar(row, col);
54
- case "actions":
55
- return renderActionsBtn(row, idx, onRowAction);
56
- case "mono":
57
- return html`<span class="cell-mono">${value ?? "—"}</span>`;
58
- default:
59
- return html`${value ?? "—"}`;
60
- }
61
- }
62
- function thClasses(col, sortKey, sortDir) {
63
- const parts = [];
64
- if (col.type === "num") parts.push("cell-num", "is-num");
65
- if (col.sticky) parts.push("col-sticky");
66
- if (col.sortable) {
67
- parts.push("is-sortable");
68
- if (sortKey === col.key) parts.push(sortDir === "asc" ? "sort-asc" : "sort-desc");
69
- }
70
- return parts.join(" ");
71
- }
72
- function tdClasses(col) {
73
- const parts = [];
74
- if (col.type === "num") parts.push("cell-num");
75
- if (col.type === "actions") parts.push("cell-actions");
76
- if (col.sticky) parts.push("col-sticky");
77
- if (col.truncate) parts.push("cell-truncate");
78
- return parts.join(" ");
79
- }
80
- function rowClass(row, idx, selected) {
81
- const state = row._state;
82
- const isSelected = selected.has(idx) || state === "selected";
83
- const parts = [];
84
- if (isSelected) parts.push("is-selected");
85
- else if (state) parts.push(`is-${state}`);
86
- return parts.join(" ");
87
- }
88
- const WIDTHS = ["w-80", "w-60", "w-40", "w-60", "w-80"];
89
- function renderSkeletonCell(col, idx) {
90
- const w = WIDTHS[idx % WIDTHS.length] ?? "w-60";
91
- if (col.type === "avatar") return html`
92
- <div class="skel-cell">
93
- <div class="skel-avatar"></div>
94
- <div style="flex:1;display:flex;flex-direction:column;gap:4px;">
95
- <div class="skel-line ${w}"></div>
96
- <div class="skel-line w-40" style="height:7px;"></div>
72
+
73
+ <!-- Sliders -->
74
+ <div class="cp-sliders">
75
+ <div class="cp-preview-dot">
76
+ <div class="cp-preview-color" style="background:${cssColor};"></div>
77
+ </div>
78
+ <div class="cp-sliders-stack">
79
+ <input type="range" class="cp-range cp-range-hue"
80
+ min="0" max="360" .value="${String(h)}"
81
+ @input="${p.onHueInput}">
82
+ ${showAlpha ? html`
83
+ <div class="cp-alpha-wrap" style="height:10px;">
84
+ <div class="cp-alpha-checker">
85
+ <input type="range" class="cp-range cp-range-alpha"
86
+ min="0" max="100" .value="${String(Math.round(alpha))}"
87
+ style="background:${alphaGradient};"
88
+ @input="${p.onAlphaInput}">
89
+ </div>
90
+ </div>` : nothing}
97
91
  </div>
98
- </div>`;
99
- if (col.type === "badge") return html`<div class="skel-badge"></div>`;
100
- if (col.type === "num") return html`<div class="skel-line ${w}" style="margin-left:auto;"></div>`;
101
- return html`<div class="skel-line ${w}"></div>`;
102
- }
103
- function renderSkeleton(count, cols, selectable) {
104
- return html`${Array.from({ length: count }, (_, r) => html`
105
- <tr class="tbl-tr">
106
- ${selectable ? html`<td class="cell-check"></td>` : nothing}
107
- ${cols.map((col, c) => html`
108
- <td class="${tdClasses(col)}" style="${col.type === "actions" ? "" : ""}">
109
- ${renderSkeletonCell(col, r + c)}
110
- </td>
111
- `)}
112
- </tr>
113
- `)}`;
114
- }
115
- function renderEmpty(title, desc, colSpan) {
116
- return html`
117
- <tr class="empty-row">
118
- <td colspan="${colSpan}">
119
- <span class="empty-icon">◯</span>
120
- <span class="empty-title">${title}</span>
121
- <span class="empty-desc">${desc}</span>
122
- </td>
123
- </tr>
124
- `;
125
- }
126
- function renderToolbar(p) {
127
- const countLabel = p.query ? `${p.filteredTotal} de ${p.totalRows}` : `${p.totalRows} registros`;
128
- return html`
129
- <div class="tbl-toolbar">
130
- ${p.toolbarTitle ? html`<span class="tbl-toolbar-title">${p.toolbarTitle}</span>` : nothing}
131
- <span class="tbl-toolbar-count">${countLabel}</span>
132
- <input
133
- class="tbl-toolbar-search"
134
- type="search"
135
- placeholder="Buscar…"
136
- .value="${p.query}"
137
- @input="${(e) => p.onSearch(e.target.value)}"
138
- >
139
- <slot name="toolbar-actions"></slot>
140
92
  </div>
141
- `;
142
- }
143
- function buildPageNumbers(current, total) {
144
- if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);
145
- const pages = [1];
146
- if (current > 3) pages.push("…");
147
- const lo = Math.max(2, current - 1);
148
- const hi = Math.min(total - 1, current + 1);
149
- for (let i = lo; i <= hi; i++) pages.push(i);
150
- if (current < total - 2) pages.push("…");
151
- pages.push(total);
152
- return pages;
153
- }
154
- function renderPagination(p) {
155
- if (p.pageSize <= 0 || p.totalPages <= 1) return html``;
156
- const start = (p.page - 1) * p.pageSize + 1;
157
- const end = Math.min(p.page * p.pageSize, p.filteredTotal);
158
- const pages = buildPageNumbers(p.page, p.totalPages);
159
- return html`
160
- <div class="tbl-pagination">
161
- <span class="pag-info">${start}–${end} de ${p.filteredTotal}</span>
162
93
 
163
- <button class="pag-btn" ?disabled="${p.page <= 1}"
164
- @click="${() => p.onPageChange(p.page - 1)}">‹</button>
94
+ <!-- Inputs -->
95
+ <div class="cp-inputs-wrap">
96
+ <button class="cp-mode-btn" title="Cambiar modo" @click="${p.onModeToggle}">
97
+ ${ROTATE_SVG}
98
+ </button>
99
+ <div style="display:flex;gap:var(--lib-space-xs);flex:1;">
100
+ ${inputsBlock}
101
+ </div>
102
+ </div>
165
103
 
166
- ${pages.map((pg) => pg === "…" ? html`<span class="pag-sep">…</span>` : html`
167
- <button class="pag-btn ${p.page === pg ? "is-active" : ""}"
168
- @click="${() => p.onPageChange(pg)}">${pg}</button>
169
- `)}
104
+ <!-- Saved colors -->
105
+ <div class="cp-saved">
106
+ <span class="cp-saved-label">Guardados</span>
107
+ ${savedColors.map((sc) => html`
108
+ <div class="cp-swatch cp-swatch-sm"
109
+ style="background:${sc};"
110
+ data-name="${sc}"
111
+ @click="${() => p.onSavedClick(sc)}"
112
+ ></div>
113
+ `)}
114
+ <button class="cp-saved-add" title="Guardar color actual" @click="${p.onSaveColor}">+</button>
115
+ </div>
170
116
 
171
- <button class="pag-btn" ?disabled="${p.page >= p.totalPages}"
172
- @click="${() => p.onPageChange(p.page + 1)}">›</button>
117
+ <!-- Actions -->
118
+ <div class="cp-actions">
119
+ <button class="cp-btn cp-btn-cancel" @click="${p.onCancel}">Cancelar</button>
120
+ <button class="cp-btn cp-btn-ok" @click="${p.onApply}">Aplicar</button>
173
121
  </div>
174
122
  `;
175
123
  }
176
- function dataTableTemplate(p) {
177
- const colSpan = p.columns.length + (p.selectable ? 1 : 0);
178
- const wrapCls = `tbl-wrap${p.stickyHead ? " tbl-sticky-head" : ""}`;
124
+ function colorPickerTemplate(props) {
125
+ const {
126
+ variant,
127
+ /*label,*/
128
+ hex,
129
+ alpha,
130
+ panelOpen,
131
+ onTriggerClick
132
+ } = props;
133
+ const panel = html`
134
+ <div class="cp ${variant === "trigger" && panelOpen ? "is-open" : ""}">
135
+ ${pickerPanelTemplate(props)}
136
+ </div>
137
+ `;
138
+ if (variant === "inline") {
139
+ return panel;
140
+ }
141
+ const cssColor = alpha < 100 ? `rgba(${props.r},${props.g},${props.b},${(alpha / 100).toFixed(2)})` : hex;
179
142
  return html`
180
- ${p.toolbar ? renderToolbar(p) : nothing}
181
-
182
- <div class="${wrapCls}">
183
- <table>
184
- ${p.caption ? html`<caption>${p.caption}</caption>` : nothing}
185
-
186
- <!-- THEAD -->
187
- <thead>
188
- <tr>
189
- ${p.selectable ? html`
190
- <th class="cell-check">
191
- <input type="checkbox"
192
- .indeterminate="${p.someSelected}"
193
- .checked="${p.allSelected}"
194
- @change="${(e) => p.onSelectAll(e.target.checked, p.data.length)}">
195
- </th>
196
- ` : nothing}
197
-
198
- ${p.columns.map((col) => html`
199
- <th class="${thClasses(col, p.sortKey, p.sortDir)}"
200
- @click="${col.sortable ? () => p.onSort(col.key) : nothing}">
201
- ${col.header}
202
- </th>
203
- `)}
204
- </tr>
205
- </thead>
206
-
207
- <!-- TBODY -->
208
- <tbody>
209
- ${p.loading ? renderSkeleton(p.skeletonRows, p.columns, p.selectable) : p.data.length === 0 ? renderEmpty(p.emptyTitle, p.emptyDesc, colSpan) : p.data.map((row, idx) => {
210
- const globalIdx = (p.page - 1) * (p.pageSize || 0) + idx;
211
- return html`
212
- <tr class="${rowClass(row, globalIdx, p.selected)}">
213
- ${p.selectable ? html`
214
- <td class="cell-check">
215
- <input type="checkbox"
216
- .checked="${p.selected.has(globalIdx)}"
217
- @change="${(e) => p.onSelectRow(globalIdx, e.target.checked)}">
218
- </td>
219
- ` : nothing}
220
-
221
- ${p.columns.map((col) => html`
222
- <td class="${tdClasses(col)}">
223
- ${renderCell(col, row, globalIdx, p.onRowAction)}
224
- </td>
225
- `)}
226
- </tr>
227
- `;
228
- })}
229
- </tbody>
230
- </table>
143
+ <div class="cp-trigger-wrap">
144
+ <button
145
+ class="cp-trigger ${panelOpen ? "is-open" : ""}"
146
+ @click="${onTriggerClick}"
147
+ aria-expanded="${panelOpen}"
148
+ aria-haspopup="true"
149
+ >
150
+ <div class="cp-trigger-dot">
151
+ <div class="cp-trigger-color" style="background:${cssColor};"></div>
152
+ </div>
153
+ <span>${hex.toUpperCase()}</span>
154
+ ${CARET_SVG}
155
+ </button>
156
+ ${panel}
231
157
  </div>
232
-
233
- ${renderPagination(p)}
234
- <slot name="pagination"></slot>
235
158
  `;
236
159
  }
237
160
  export {
238
- dataTableTemplate
161
+ colorPickerTemplate,
162
+ pickerPanelTemplate,
163
+ swatchGridTemplate
239
164
  };
240
165
  //# sourceMappingURL=index204.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index204.js","sources":["../src/components/organisms/data-table/lib-data-table.html.ts"],"sourcesContent":["import { html, nothing, TemplateResult } from 'lit';\nimport type {\n TableColumn,\n TableRowData,\n TableVariant,\n TableSize,\n TableBadgeTone,\n} from './lib-data-table.types';\n\n/* ── Template Props ─────────────────────────────────────── */\nexport interface DataTableTemplateProps {\n columns: TableColumn[];\n data: TableRowData[];\n filteredTotal: number;\n totalRows: number;\n variant: TableVariant;\n size: TableSize;\n dark: boolean;\n loading: boolean;\n selectable: boolean;\n stickyHead: boolean;\n caption: string;\n emptyTitle: string;\n emptyDesc: string;\n toolbar: boolean;\n toolbarTitle: string;\n skeletonRows: number;\n sortKey: string;\n sortDir: 'asc' | 'desc';\n query: string;\n selected: Set<number>;\n allSelected: boolean;\n someSelected: boolean;\n page: number;\n pageSize: number;\n totalPages: number;\n onSort: (key: string) => void;\n onSearch: (q: string) => void;\n onSelectAll: (checked: boolean, total: number) => void;\n onSelectRow: (idx: number, checked: boolean) => void;\n onRowAction: (row: TableRowData, idx: number) => void;\n onPageChange: (p: number) => void;\n}\n\n/* ── Helpers: Cell renderers ───────────────────────────── */\n\nfunction renderBadge(value: unknown, tone: string): TemplateResult {\n const label = String(value ?? '');\n return html`<span class=\"cell-badge tone-${tone}\">${label}</span>`;\n}\n\nfunction renderProgress(value: unknown, tone: 'kaki' | 'celadon' | ''): TemplateResult {\n const pct = Math.min(100, Math.max(0, Number(value) || 0));\n const toneClass = tone ? `tone-${tone}` : '';\n return html`\n <div class=\"cell-progress\">\n <div class=\"progress-bar\">\n <div class=\"progress-fill ${toneClass}\" style=\"width:${pct}%\"></div>\n </div>\n <span class=\"progress-val\">${pct}%</span>\n </div>\n `;\n}\n\nfunction renderAvatar(row: TableRowData, col: TableColumn): TemplateResult {\n const name = String(row[col.key] ?? '');\n const initials = col.initialsKey\n ? String(row[col.initialsKey] ?? '').slice(0, 2).toUpperCase()\n : name.split(' ').map(w => w[0]).join('').slice(0, 2).toUpperCase();\n const hint = col.hintKey ? String(row[col.hintKey] ?? '') : '';\n\n return html`\n <div class=\"cell-avatar\">\n <div class=\"avatar-circle\">${initials}</div>\n <div class=\"avatar-text\">\n <span class=\"avatar-name\">${name}</span>\n ${hint ? html`<span class=\"avatar-hint\">${hint}</span>` : nothing}\n </div>\n </div>\n `;\n}\n\nfunction renderActionsBtn(row: TableRowData, idx: number, onRowAction: (r: TableRowData, i: number) => void): TemplateResult {\n return html`\n <button class=\"actions-btn\"\n aria-label=\"Acciones\"\n @click=\"${(e: Event):void => { e.stopPropagation(); onRowAction(row, idx); }}\"\n >⋯</button>\n `;\n}\n\nfunction renderCell(col: TableColumn, row: TableRowData, idx: number, onRowAction: (r: TableRowData, i: number) => void): TemplateResult {\n const value = row[col.key];\n\n switch (col.type) {\n case 'badge': {\n const tone = col.toneKey\n ? String(row[col.toneKey] ?? 'inactive')\n : (col.badgeTone ?? 'inactive');\n return renderBadge(value, tone as TableBadgeTone);\n }\n case 'progress':\n return renderProgress(value, col.progressTone ?? '');\n case 'avatar':\n return renderAvatar(row, col);\n case 'actions':\n return renderActionsBtn(row, idx, onRowAction);\n case 'mono':\n return html`<span class=\"cell-mono\">${value ?? '—'}</span>`;\n default:\n return html`${value ?? '—'}`;\n }\n}\n\n/* ── Helpers: Structural ───────────────────────────────── */\n\nfunction thClasses(col: TableColumn, sortKey: string, sortDir: 'asc' | 'desc'): string {\n const parts: string[] = [];\n if (col.type === 'num') parts.push('cell-num', 'is-num');\n if (col.sticky) parts.push('col-sticky');\n if (col.sortable) {\n parts.push('is-sortable');\n if (sortKey === col.key) parts.push(sortDir === 'asc' ? 'sort-asc' : 'sort-desc');\n }\n return parts.join(' ');\n}\n\nfunction tdClasses(col: TableColumn): string {\n const parts: string[] = [];\n if (col.type === 'num') parts.push('cell-num');\n if (col.type === 'actions') parts.push('cell-actions');\n if (col.sticky) parts.push('col-sticky');\n if (col.truncate) parts.push('cell-truncate');\n return parts.join(' ');\n}\n\nfunction rowClass(row: TableRowData, idx: number, selected: Set<number>): string {\n const state = row._state;\n const isSelected = selected.has(idx) || state === 'selected';\n const parts: string[] = [];\n if (isSelected) parts.push('is-selected');\n else if (state) parts.push(`is-${state}`);\n return parts.join(' ');\n}\n\n/* ── Skeleton rows ───────────────────────────────────────── */\nconst WIDTHS = ['w-80', 'w-60', 'w-40', 'w-60', 'w-80'] as const;\n\nfunction renderSkeletonCell(col: TableColumn, idx: number): TemplateResult {\n const w = WIDTHS[idx % WIDTHS.length] ?? 'w-60';\n if (col.type === 'avatar') return html`\n <div class=\"skel-cell\">\n <div class=\"skel-avatar\"></div>\n <div style=\"flex:1;display:flex;flex-direction:column;gap:4px;\">\n <div class=\"skel-line ${w}\"></div>\n <div class=\"skel-line w-40\" style=\"height:7px;\"></div>\n </div>\n </div>`;\n if (col.type === 'badge') return html`<div class=\"skel-badge\"></div>`;\n if (col.type === 'num') return html`<div class=\"skel-line ${w}\" style=\"margin-left:auto;\"></div>`;\n return html`<div class=\"skel-line ${w}\"></div>`;\n}\n\nfunction renderSkeleton(count: number, cols: TableColumn[], selectable: boolean): TemplateResult {\n return html`${Array.from({ length: count }, (_, r) => html`\n <tr class=\"tbl-tr\">\n ${selectable ? html`<td class=\"cell-check\"></td>` : nothing}\n ${cols.map((col, c) => html`\n <td class=\"${tdClasses(col)}\" style=\"${col.type === 'actions' ? '' : ''}\">\n ${renderSkeletonCell(col, r + c)}\n </td>\n `)}\n </tr>\n `)}`;\n}\n\n/* ── Empty state ─────────────────────────────────────────── */\nfunction renderEmpty(title: string, desc: string, colSpan: number): TemplateResult {\n return html`\n <tr class=\"empty-row\">\n <td colspan=\"${colSpan}\">\n <span class=\"empty-icon\">◯</span>\n <span class=\"empty-title\">${title}</span>\n <span class=\"empty-desc\">${desc}</span>\n </td>\n </tr>\n `;\n}\n\n/* ── Toolbar ─────────────────────────────────────────────── */\nfunction renderToolbar(p: DataTableTemplateProps): TemplateResult {\n const countLabel = p.query\n ? `${p.filteredTotal} de ${p.totalRows}`\n : `${p.totalRows} registros`;\n\n return html`\n <div class=\"tbl-toolbar\">\n ${p.toolbarTitle ? html`<span class=\"tbl-toolbar-title\">${p.toolbarTitle}</span>` : nothing}\n <span class=\"tbl-toolbar-count\">${countLabel}</span>\n <input\n class=\"tbl-toolbar-search\"\n type=\"search\"\n placeholder=\"Buscar…\"\n .value=\"${p.query}\"\n @input=\"${(e: Event):void => p.onSearch((e.target as HTMLInputElement).value)}\"\n >\n <slot name=\"toolbar-actions\"></slot>\n </div>\n `;\n}\n\n/* ── Built-in pagination bar ─────────────────────────────── */\nfunction buildPageNumbers(current: number, total: number): (number | '…')[] {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n const pages: (number | '…')[] = [1];\n if (current > 3) pages.push('…');\n const lo = Math.max(2, current - 1);\n const hi = Math.min(total - 1, current + 1);\n for (let i = lo; i <= hi; i++) pages.push(i);\n if (current < total - 2) pages.push('…');\n pages.push(total);\n return pages;\n}\n\nfunction renderPagination(p: DataTableTemplateProps): TemplateResult {\n if (p.pageSize <= 0 || p.totalPages <= 1) return html``;\n const start = (p.page - 1) * p.pageSize + 1;\n const end = Math.min(p.page * p.pageSize, p.filteredTotal);\n const pages = buildPageNumbers(p.page, p.totalPages);\n\n return html`\n <div class=\"tbl-pagination\">\n <span class=\"pag-info\">${start}–${end} de ${p.filteredTotal}</span>\n\n <button class=\"pag-btn\" ?disabled=\"${p.page <= 1}\"\n @click=\"${():void => p.onPageChange(p.page - 1)}\">‹</button>\n\n ${pages.map(pg => pg === '…'\n ? html`<span class=\"pag-sep\">…</span>`\n : html`\n <button class=\"pag-btn ${p.page === pg ? 'is-active' : ''}\"\n @click=\"${():void => p.onPageChange(pg as number)}\">${pg}</button>\n `)}\n\n <button class=\"pag-btn\" ?disabled=\"${p.page >= p.totalPages}\"\n @click=\"${():void => p.onPageChange(p.page + 1)}\">›</button>\n </div>\n `;\n}\n\n/* ── Main template ────────────────────────────────────────── */\nexport function dataTableTemplate(p: DataTableTemplateProps): TemplateResult {\n const colSpan = p.columns.length + (p.selectable ? 1 : 0);\n const wrapCls = `tbl-wrap${p.stickyHead ? ' tbl-sticky-head' : ''}`;\n\n return html`\n ${p.toolbar ? renderToolbar(p) : nothing}\n\n <div class=\"${wrapCls}\">\n <table>\n ${p.caption ? html`<caption>${p.caption}</caption>` : nothing}\n\n <!-- THEAD -->\n <thead>\n <tr>\n ${p.selectable ? html`\n <th class=\"cell-check\">\n <input type=\"checkbox\"\n .indeterminate=\"${p.someSelected}\"\n .checked=\"${p.allSelected}\"\n @change=\"${(e: Event):void =>\n p.onSelectAll((e.target as HTMLInputElement).checked, p.data.length)}\">\n </th>\n ` : nothing}\n\n ${p.columns.map(col => html`\n <th class=\"${thClasses(col, p.sortKey, p.sortDir)}\"\n @click=\"${col.sortable ? ():void => p.onSort(col.key) : nothing}\">\n ${col.header}\n </th>\n `)}\n </tr>\n </thead>\n\n <!-- TBODY -->\n <tbody>\n ${p.loading\n ? renderSkeleton(p.skeletonRows, p.columns, p.selectable)\n : p.data.length === 0\n ? renderEmpty(p.emptyTitle, p.emptyDesc, colSpan)\n : p.data.map((row, idx) => {\n const globalIdx = (p.page - 1) * (p.pageSize || 0) + idx;\n return html`\n <tr class=\"${rowClass(row, globalIdx, p.selected)}\">\n ${p.selectable ? html`\n <td class=\"cell-check\">\n <input type=\"checkbox\"\n .checked=\"${p.selected.has(globalIdx)}\"\n @change=\"${(e: Event):void =>\n p.onSelectRow(globalIdx, (e.target as HTMLInputElement).checked)}\">\n </td>\n ` : nothing}\n\n ${p.columns.map(col => html`\n <td class=\"${tdClasses(col)}\">\n ${renderCell(col, row, globalIdx, p.onRowAction)}\n </td>\n `)}\n </tr>\n `;\n })\n }\n </tbody>\n </table>\n </div>\n\n ${renderPagination(p)}\n <slot name=\"pagination\"></slot>\n `;\n}"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index204.js","sources":["../src/components/molecules/color-picker/lib-color-picker.html.ts"],"sourcesContent":["import { html, nothing, TemplateResult } from 'lit';\nimport type { ColorPickerVariant, ColorInputMode, SwatchRow, SwatchColor } from './lib-color-picker.types';\n\n/* ── Icono ↺ inline para el mode button ── */\nconst ROTATE_SVG = html`<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10 2.5A4.5 4.5 0 1 0 11 6\"/>\n <path d=\"M10 .5v2h2\"/>\n</svg>`;\n\n/* ── Caret-down para trigger ── */\nconst CARET_SVG = html`<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M2 4l3 3 3-3\"/>\n</svg>`;\n\n/* ────────────────────────────────────────────\n Interfaces de props para cada sub-sección\n ──────────────────────────────────────────── */\n\nexport interface PickerPanelProps {\n hex: string;\n r: number; g: number; b: number;\n h: number; s: number; l: number;\n alpha: number; // 0–100\n inputMode: ColorInputMode;\n savedColors: string[];\n showAlpha: boolean;\n /** Callbacks */\n onCanvasMousedown: (e: MouseEvent) => void;\n onHueInput: (e: Event) => void;\n onAlphaInput: (e: Event) => void;\n onModeToggle: () => void;\n onHexInput: (e: Event) => void;\n onRgbInput: (rIdx: 0|1|2, e: Event) => void;\n onHslInput: (cIdx: 0|1|2, e: Event) => void;\n onAlphaNumInput: (e: Event) => void;\n onSaveColor: () => void;\n onSavedClick: (hex: string) => void;\n onCancel: () => void;\n onApply: () => void;\n}\n\nexport interface SwatchGridProps {\n rows: SwatchRow[];\n selected: string;\n onSelect: (color: SwatchColor) => void;\n}\n\n/* ────────────────────────────────────────────\n Swatch grid template\n ──────────────────────────────────────────── */\nexport function swatchGridTemplate(props: SwatchGridProps): TemplateResult {\n const { rows, selected, onSelect } = props;\n return html`\n <div class=\"cp-swatches\">\n ${rows.map(row => html`\n <div class=\"cp-swatches-row\">\n <span class=\"cp-swatches-label\">${row.label}</span>\n ${row.colors.map(c => html`\n <div\n class=\"cp-swatch ${c.value.toLowerCase() === selected.toLowerCase() ? 'is-selected' : ''}\"\n style=\"background:${c.value};\"\n data-name=\"${c.name ?? ''}\"\n @click=\"${(): void => onSelect(c)}\"\n role=\"button\"\n aria-label=\"${c.name ?? c.value}\"\n ></div>\n `)}\n </div>\n `)}\n </div>\n `;\n}\n\n/* ────────────────────────────────────────────\n Picker panel template (canvas + sliders + inputs + saved + actions)\n ──────────────────────────────────────────── */\nexport function pickerPanelTemplate(p: PickerPanelProps): TemplateResult {\n const { hex, r, g, b, h, s, l, alpha, inputMode, savedColors, showAlpha } = p;\n\n /* Thumb position: x = saturation %, y = inverted lightness % */\n const thumbX = s;\n const thumbY = 100 - l;\n\n const cssColor = alpha < 100\n ? `rgba(${r},${g},${b},${(alpha / 100).toFixed(2)})`\n : hex;\n\n const alphaGradient =\n `linear-gradient(to right, transparent, hsl(${h},${s}%,${l}%))`;\n\n /* Inputs según el modo */\n const inputsBlock: TemplateResult = inputMode === 'hex'\n ? html`\n <div class=\"cp-input-group\" style=\"flex:3\">\n <input class=\"cp-input\" type=\"text\" .value=\"${hex}\" maxlength=\"7\"\n @input=\"${p.onHexInput}\">\n <span class=\"cp-input-label\">HEX</span>\n </div>\n ${showAlpha ? html`\n <div class=\"cp-input-group\" style=\"flex:1\">\n <input class=\"cp-input\" type=\"number\" .value=\"${String(Math.round(alpha))}\" min=\"0\" max=\"100\"\n @input=\"${p.onAlphaNumInput}\">\n <span class=\"cp-input-label\">A%</span>\n </div>` : nothing}\n `\n : inputMode === 'rgb'\n ? html`\n <div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(r)}\" min=\"0\" max=\"255\" @input=\"${(e: Event): void => p.onRgbInput(0, e)}\"><span class=\"cp-input-label\">R</span></div>\n <div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(g)}\" min=\"0\" max=\"255\" @input=\"${(e: Event): void => p.onRgbInput(1, e)}\"><span class=\"cp-input-label\">G</span></div>\n <div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(b)}\" min=\"0\" max=\"255\" @input=\"${(e: Event): void => p.onRgbInput(2, e)}\"><span class=\"cp-input-label\">B</span></div>\n ${showAlpha ? html`<div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(Math.round(alpha))}\" min=\"0\" max=\"100\" @input=\"${p.onAlphaNumInput}\"><span class=\"cp-input-label\">A%</span></div>` : nothing}\n `\n : html`\n <div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(h)}\" min=\"0\" max=\"360\" @input=\"${(e: Event): void => p.onHslInput(0, e)}\"><span class=\"cp-input-label\">H</span></div>\n <div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(s)}\" min=\"0\" max=\"100\" @input=\"${(e: Event): void => p.onHslInput(1, e)}\"><span class=\"cp-input-label\">S%</span></div>\n <div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(l)}\" min=\"0\" max=\"100\" @input=\"${(e: Event): void => p.onHslInput(2, e)}\"><span class=\"cp-input-label\">L%</span></div>\n ${showAlpha ? html`<div class=\"cp-input-group\" style=\"flex:1\"><input class=\"cp-input\" type=\"number\" .value=\"${String(Math.round(alpha))}\" min=\"0\" max=\"100\" @input=\"${p.onAlphaNumInput}\"><span class=\"cp-input-label\">A%</span></div>` : nothing}\n `;\n\n return html`\n <!-- Canvas 2D -->\n <div class=\"cp-canvas\"\n style=\"background: hsl(${h},100%,50%);\"\n @mousedown=\"${p.onCanvasMousedown}\"\n >\n <div class=\"cp-thumb\"\n style=\"left:${thumbX}%;top:${thumbY}%;background:${cssColor};\"\n ></div>\n </div>\n\n <!-- Sliders -->\n <div class=\"cp-sliders\">\n <div class=\"cp-preview-dot\">\n <div class=\"cp-preview-color\" style=\"background:${cssColor};\"></div>\n </div>\n <div class=\"cp-sliders-stack\">\n <input type=\"range\" class=\"cp-range cp-range-hue\"\n min=\"0\" max=\"360\" .value=\"${String(h)}\"\n @input=\"${p.onHueInput}\">\n ${showAlpha ? html`\n <div class=\"cp-alpha-wrap\" style=\"height:10px;\">\n <div class=\"cp-alpha-checker\">\n <input type=\"range\" class=\"cp-range cp-range-alpha\"\n min=\"0\" max=\"100\" .value=\"${String(Math.round(alpha))}\"\n style=\"background:${alphaGradient};\"\n @input=\"${p.onAlphaInput}\">\n </div>\n </div>` : nothing}\n </div>\n </div>\n\n <!-- Inputs -->\n <div class=\"cp-inputs-wrap\">\n <button class=\"cp-mode-btn\" title=\"Cambiar modo\" @click=\"${p.onModeToggle}\">\n ${ROTATE_SVG}\n </button>\n <div style=\"display:flex;gap:var(--lib-space-xs);flex:1;\">\n ${inputsBlock}\n </div>\n </div>\n\n <!-- Saved colors -->\n <div class=\"cp-saved\">\n <span class=\"cp-saved-label\">Guardados</span>\n ${savedColors.map(sc => html`\n <div class=\"cp-swatch cp-swatch-sm\"\n style=\"background:${sc};\"\n data-name=\"${sc}\"\n @click=\"${(): void => p.onSavedClick(sc)}\"\n ></div>\n `)}\n <button class=\"cp-saved-add\" title=\"Guardar color actual\" @click=\"${p.onSaveColor}\">+</button>\n </div>\n\n <!-- Actions -->\n <div class=\"cp-actions\">\n <button class=\"cp-btn cp-btn-cancel\" @click=\"${p.onCancel}\">Cancelar</button>\n <button class=\"cp-btn cp-btn-ok\" @click=\"${p.onApply}\">Aplicar</button>\n </div>\n `;\n}\n\n/* ────────────────────────────────────────────\n Root template — inline vs trigger\n ──────────────────────────────────────────── */\n\nexport interface ColorPickerRootProps extends PickerPanelProps {\n variant: ColorPickerVariant;\n label: string;\n panelOpen: boolean;\n onTriggerClick: () => void;\n}\n\nexport function colorPickerTemplate(props: ColorPickerRootProps): TemplateResult {\n const { variant, /*label,*/ hex, alpha, panelOpen, onTriggerClick } = props;\n\n const panel = html`\n <div class=\"cp ${variant === 'trigger' && panelOpen ? 'is-open' : ''}\">\n ${pickerPanelTemplate(props)}\n </div>\n `;\n\n if (variant === 'inline') {\n return panel;\n }\n\n /* Trigger variant — botón + panel flotante */\n const cssColor = alpha < 100\n ? `rgba(${props.r},${props.g},${props.b},${(alpha / 100).toFixed(2)})`\n : hex;\n\n return html`\n <div class=\"cp-trigger-wrap\">\n <button\n class=\"cp-trigger ${panelOpen ? 'is-open' : ''}\"\n @click=\"${onTriggerClick}\"\n aria-expanded=\"${panelOpen}\"\n aria-haspopup=\"true\"\n >\n <div class=\"cp-trigger-dot\">\n <div class=\"cp-trigger-color\" style=\"background:${cssColor};\"></div>\n </div>\n <span>${hex.toUpperCase()}</span>\n ${CARET_SVG}\n </button>\n ${panel}\n </div>\n `;\n}"],"names":[],"mappings":"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"}