@nac3/forge-cli 1.0.52 → 1.0.54

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 (404) hide show
  1. package/dist/chat/tools/design.d.ts +4 -1
  2. package/dist/chat/tools/design.d.ts.map +1 -1
  3. package/dist/chat/tools/design.js +15 -12
  4. package/dist/chat/tools/design.js.map +1 -1
  5. package/dist/design/yujin_design_resolver.d.ts +18 -1
  6. package/dist/design/yujin_design_resolver.d.ts.map +1 -1
  7. package/dist/design/yujin_design_resolver.js +54 -4
  8. package/dist/design/yujin_design_resolver.js.map +1 -1
  9. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  10. package/dist/nac3/internal_manifest.js +10 -8
  11. package/dist/nac3/internal_manifest.js.map +1 -1
  12. package/dist/version.d.ts +1 -1
  13. package/dist/version.js +1 -1
  14. package/package.json +115 -111
  15. package/yujin-design-system/_preview.mjs +77 -0
  16. package/yujin-design-system/components/_index.json +156 -0
  17. package/yujin-design-system/components/accordion.yujin.json +24 -0
  18. package/yujin-design-system/components/alert.yujin.json +30 -0
  19. package/yujin-design-system/components/avatar.yujin.json +23 -0
  20. package/yujin-design-system/components/badge.yujin.json +30 -0
  21. package/yujin-design-system/components/breadcrumb.yujin.json +22 -0
  22. package/yujin-design-system/components/button.yujin.json +35 -0
  23. package/yujin-design-system/components/card.yujin.json +33 -0
  24. package/yujin-design-system/components/checkbox.yujin.json +25 -0
  25. package/yujin-design-system/components/datepicker.yujin.json +26 -0
  26. package/yujin-design-system/components/dropdown.yujin.json +26 -0
  27. package/yujin-design-system/components/file-upload.yujin.json +25 -0
  28. package/yujin-design-system/components/form-field.yujin.json +29 -0
  29. package/yujin-design-system/components/input.yujin.json +32 -0
  30. package/yujin-design-system/components/kanban-card.yujin.json +32 -0
  31. package/yujin-design-system/components/modal.yujin.json +28 -0
  32. package/yujin-design-system/components/pagination.yujin.json +24 -0
  33. package/yujin-design-system/components/progress.yujin.json +23 -0
  34. package/yujin-design-system/components/radio.yujin.json +24 -0
  35. package/yujin-design-system/components/search-bar.yujin.json +26 -0
  36. package/yujin-design-system/components/select.yujin.json +25 -0
  37. package/yujin-design-system/components/sidebar.yujin.json +28 -0
  38. package/yujin-design-system/components/skeleton.yujin.json +23 -0
  39. package/yujin-design-system/components/slider.yujin.json +22 -0
  40. package/yujin-design-system/components/switch.yujin.json +23 -0
  41. package/yujin-design-system/components/table.yujin.json +28 -0
  42. package/yujin-design-system/components/tabs.yujin.json +28 -0
  43. package/yujin-design-system/components/toast.yujin.json +28 -0
  44. package/yujin-design-system/components/tooltip.yujin.json +27 -0
  45. package/yujin-design-system/components/topbar.yujin.json +23 -0
  46. package/yujin-design-system/components/view.yujin.json +24 -0
  47. package/yujin-design-system/fonts/README.md +31 -0
  48. package/yujin-design-system/icons/sumie/abacus-soroban.svg +1 -0
  49. package/yujin-design-system/icons/sumie/antenna-signal.svg +1 -0
  50. package/yujin-design-system/icons/sumie/anvil-block.svg +1 -0
  51. package/yujin-design-system/icons/sumie/arrow-down-trend.svg +1 -0
  52. package/yujin-design-system/icons/sumie/arrow-up-trend.svg +1 -0
  53. package/yujin-design-system/icons/sumie/aurora-band.svg +1 -0
  54. package/yujin-design-system/icons/sumie/badge-id.svg +1 -0
  55. package/yujin-design-system/icons/sumie/badge-medal.svg +1 -0
  56. package/yujin-design-system/icons/sumie/bamboo-stalk.svg +1 -0
  57. package/yujin-design-system/icons/sumie/bandage-cross.svg +1 -0
  58. package/yujin-design-system/icons/sumie/barcode-strip.svg +1 -0
  59. package/yujin-design-system/icons/sumie/barrel-cask.svg +1 -0
  60. package/yujin-design-system/icons/sumie/bell-temple.svg +1 -0
  61. package/yujin-design-system/icons/sumie/bird-perched.svg +1 -0
  62. package/yujin-design-system/icons/sumie/boat-junk.svg +1 -0
  63. package/yujin-design-system/icons/sumie/boat-sail.svg +1 -0
  64. package/yujin-design-system/icons/sumie/book-bound.svg +1 -0
  65. package/yujin-design-system/icons/sumie/bow-arrow.svg +1 -0
  66. package/yujin-design-system/icons/sumie/box-crate.svg +1 -0
  67. package/yujin-design-system/icons/sumie/box-stacked.svg +1 -0
  68. package/yujin-design-system/icons/sumie/brain-cells.svg +1 -0
  69. package/yujin-design-system/icons/sumie/branch-sakura.svg +1 -0
  70. package/yujin-design-system/icons/sumie/bridge-arched.svg +1 -0
  71. package/yujin-design-system/icons/sumie/briefcase.svg +1 -0
  72. package/yujin-design-system/icons/sumie/brush-ink.svg +1 -0
  73. package/yujin-design-system/icons/sumie/brush-tip.svg +1 -0
  74. package/yujin-design-system/icons/sumie/butterfly-wing.svg +1 -0
  75. package/yujin-design-system/icons/sumie/calendar-grid.svg +1 -0
  76. package/yujin-design-system/icons/sumie/caliper-precision.svg +1 -0
  77. package/yujin-design-system/icons/sumie/cart-basket.svg +1 -0
  78. package/yujin-design-system/icons/sumie/castle-walls.svg +1 -0
  79. package/yujin-design-system/icons/sumie/cat-whisker.svg +1 -0
  80. package/yujin-design-system/icons/sumie/check-mark.svg +1 -0
  81. package/yujin-design-system/icons/sumie/check-shield.svg +1 -0
  82. package/yujin-design-system/icons/sumie/chopsticks.svg +1 -0
  83. package/yujin-design-system/icons/sumie/circuit-node.svg +1 -0
  84. package/yujin-design-system/icons/sumie/clipboard-list.svg +1 -0
  85. package/yujin-design-system/icons/sumie/cloud-curl.svg +1 -0
  86. package/yujin-design-system/icons/sumie/cloud-platform.svg +1 -0
  87. package/yujin-design-system/icons/sumie/coin-mon.svg +1 -0
  88. package/yujin-design-system/icons/sumie/coin-stack.svg +1 -0
  89. package/yujin-design-system/icons/sumie/comb-wooden.svg +1 -0
  90. package/yujin-design-system/icons/sumie/comet-trail.svg +1 -0
  91. package/yujin-design-system/icons/sumie/compass-marine.svg +1 -0
  92. package/yujin-design-system/icons/sumie/conveyor-belt.svg +1 -0
  93. package/yujin-design-system/icons/sumie/crane-flying.svg +1 -0
  94. package/yujin-design-system/icons/sumie/cross-mark.svg +1 -0
  95. package/yujin-design-system/icons/sumie/database-disk.svg +1 -0
  96. package/yujin-design-system/icons/sumie/deer-antler.svg +1 -0
  97. package/yujin-design-system/icons/sumie/document-page.svg +1 -0
  98. package/yujin-design-system/icons/sumie/dragon-curl.svg +1 -0
  99. package/yujin-design-system/icons/sumie/eclipse-ring.svg +1 -0
  100. package/yujin-design-system/icons/sumie/envelope-letter.svg +1 -0
  101. package/yujin-design-system/icons/sumie/eye-vision.svg +1 -0
  102. package/yujin-design-system/icons/sumie/fan-folded.svg +1 -0
  103. package/yujin-design-system/icons/sumie/fan-open.svg +1 -0
  104. package/yujin-design-system/icons/sumie/fern-frond.svg +1 -0
  105. package/yujin-design-system/icons/sumie/flag-banner.svg +1 -0
  106. package/yujin-design-system/icons/sumie/flame-forge.svg +1 -0
  107. package/yujin-design-system/icons/sumie/folder-tab.svg +1 -0
  108. package/yujin-design-system/icons/sumie/forklift.svg +1 -0
  109. package/yujin-design-system/icons/sumie/fox-tail.svg +1 -0
  110. package/yujin-design-system/icons/sumie/gear-cog.svg +1 -0
  111. package/yujin-design-system/icons/sumie/gear-double.svg +1 -0
  112. package/yujin-design-system/icons/sumie/gift-wrapped.svg +1 -0
  113. package/yujin-design-system/icons/sumie/globe-grid.svg +1 -0
  114. package/yujin-design-system/icons/sumie/gong-disk.svg +1 -0
  115. package/yujin-design-system/icons/sumie/hammer-craft.svg +1 -0
  116. package/yujin-design-system/icons/sumie/handshake-knot.svg +1 -0
  117. package/yujin-design-system/icons/sumie/heart-affinity.svg +1 -0
  118. package/yujin-design-system/icons/sumie/helmet-care.svg +1 -0
  119. package/yujin-design-system/icons/sumie/horse-gallop.svg +1 -0
  120. package/yujin-design-system/icons/sumie/house-traditional.svg +1 -0
  121. package/yujin-design-system/icons/sumie/incense-stick.svg +1 -0
  122. package/yujin-design-system/icons/sumie/inkstone-suzuri.svg +1 -0
  123. package/yujin-design-system/icons/sumie/invoice-doc.svg +1 -0
  124. package/yujin-design-system/icons/sumie/iris-bloom.svg +1 -0
  125. package/yujin-design-system/icons/sumie/key-skeleton.svg +1 -0
  126. package/yujin-design-system/icons/sumie/kimono-robe.svg +1 -0
  127. package/yujin-design-system/icons/sumie/koi-leaping.svg +1 -0
  128. package/yujin-design-system/icons/sumie/koi-pond.svg +1 -0
  129. package/yujin-design-system/icons/sumie/lantern-stone.svg +1 -0
  130. package/yujin-design-system/icons/sumie/ledger-tally.svg +1 -0
  131. package/yujin-design-system/icons/sumie/lifebuoy-ring.svg +1 -0
  132. package/yujin-design-system/icons/sumie/lock-shut.svg +1 -0
  133. package/yujin-design-system/icons/sumie/lotus-flower.svg +1 -0
  134. package/yujin-design-system/icons/sumie/magnify-glass.svg +1 -0
  135. package/yujin-design-system/icons/sumie/manifest.json +1263 -0
  136. package/yujin-design-system/icons/sumie/maple-leaf.svg +1 -0
  137. package/yujin-design-system/icons/sumie/mask-noh.svg +1 -0
  138. package/yujin-design-system/icons/sumie/megaphone-flare.svg +1 -0
  139. package/yujin-design-system/icons/sumie/mic-voice.svg +1 -0
  140. package/yujin-design-system/icons/sumie/mirror-bronze.svg +1 -0
  141. package/yujin-design-system/icons/sumie/mobile-phone.svg +1 -0
  142. package/yujin-design-system/icons/sumie/moon-full.svg +1 -0
  143. package/yujin-design-system/icons/sumie/moon-half.svg +1 -0
  144. package/yujin-design-system/icons/sumie/mountain-mist.svg +1 -0
  145. package/yujin-design-system/icons/sumie/mountain-twin.svg +1 -0
  146. package/yujin-design-system/icons/sumie/owl-eye.svg +1 -0
  147. package/yujin-design-system/icons/sumie/pagoda-tiers.svg +1 -0
  148. package/yujin-design-system/icons/sumie/pallet-stack.svg +1 -0
  149. package/yujin-design-system/icons/sumie/paper-lantern.svg +1 -0
  150. package/yujin-design-system/icons/sumie/paper-plane.svg +1 -0
  151. package/yujin-design-system/icons/sumie/pay-card.svg +1 -0
  152. package/yujin-design-system/icons/sumie/pdf-stack.svg +1 -0
  153. package/yujin-design-system/icons/sumie/pencil-write.svg +1 -0
  154. package/yujin-design-system/icons/sumie/people-pair.svg +1 -0
  155. package/yujin-design-system/icons/sumie/people-trio.svg +1 -0
  156. package/yujin-design-system/icons/sumie/person-bow.svg +1 -0
  157. package/yujin-design-system/icons/sumie/phoenix-tail.svg +1 -0
  158. package/yujin-design-system/icons/sumie/piggy-bank.svg +1 -0
  159. package/yujin-design-system/icons/sumie/pin-location.svg +1 -0
  160. package/yujin-design-system/icons/sumie/pine-tree.svg +1 -0
  161. package/yujin-design-system/icons/sumie/pipeline-funnel.svg +1 -0
  162. package/yujin-design-system/icons/sumie/plane-flight.svg +1 -0
  163. package/yujin-design-system/icons/sumie/plug-power.svg +1 -0
  164. package/yujin-design-system/icons/sumie/plum-blossom.svg +1 -0
  165. package/yujin-design-system/icons/sumie/qr-grid.svg +1 -0
  166. package/yujin-design-system/icons/sumie/rabbit-hop.svg +1 -0
  167. package/yujin-design-system/icons/sumie/rain-falling.svg +1 -0
  168. package/yujin-design-system/icons/sumie/receipt-strip.svg +1 -0
  169. package/yujin-design-system/icons/sumie/reed-grass.svg +1 -0
  170. package/yujin-design-system/icons/sumie/rice-bowl.svg +1 -0
  171. package/yujin-design-system/icons/sumie/river-bend.svg +1 -0
  172. package/yujin-design-system/icons/sumie/rock-stack.svg +1 -0
  173. package/yujin-design-system/icons/sumie/rope-shimenawa.svg +1 -0
  174. package/yujin-design-system/icons/sumie/safe-vault.svg +1 -0
  175. package/yujin-design-system/icons/sumie/sake-bottle.svg +1 -0
  176. package/yujin-design-system/icons/sumie/sandal-geta.svg +1 -0
  177. package/yujin-design-system/icons/sumie/scales-balance.svg +1 -0
  178. package/yujin-design-system/icons/sumie/scroll-rolled.svg +1 -0
  179. package/yujin-design-system/icons/sumie/seal-stamp.svg +1 -0
  180. package/yujin-design-system/icons/sumie/server-rack.svg +1 -0
  181. package/yujin-design-system/icons/sumie/shield-knight.svg +1 -0
  182. package/yujin-design-system/icons/sumie/shrine-roof.svg +1 -0
  183. package/yujin-design-system/icons/sumie/signature-loop.svg +1 -0
  184. package/yujin-design-system/icons/sumie/snow-flake.svg +1 -0
  185. package/yujin-design-system/icons/sumie/spark-ai.svg +1 -0
  186. package/yujin-design-system/icons/sumie/spark-burst.svg +1 -0
  187. package/yujin-design-system/icons/sumie/speech-cloud.svg +1 -0
  188. package/yujin-design-system/icons/sumie/spider-silk.svg +1 -0
  189. package/yujin-design-system/icons/sumie/star-cluster.svg +1 -0
  190. package/yujin-design-system/icons/sumie/star-five.svg +1 -0
  191. package/yujin-design-system/icons/sumie/star-rating.svg +1 -0
  192. package/yujin-design-system/icons/sumie/sun-rising.svg +1 -0
  193. package/yujin-design-system/icons/sumie/sword-katana.svg +1 -0
  194. package/yujin-design-system/icons/sumie/tablet-flat.svg +1 -0
  195. package/yujin-design-system/icons/sumie/tag-price.svg +1 -0
  196. package/yujin-design-system/icons/sumie/target-bullseye.svg +1 -0
  197. package/yujin-design-system/icons/sumie/tax-stamp.svg +1 -0
  198. package/yujin-design-system/icons/sumie/tea-cup.svg +1 -0
  199. package/yujin-design-system/icons/sumie/tea-house.svg +1 -0
  200. package/yujin-design-system/icons/sumie/tea-pot.svg +1 -0
  201. package/yujin-design-system/icons/sumie/temple-gate.svg +1 -0
  202. package/yujin-design-system/icons/sumie/thermo-bulb.svg +1 -0
  203. package/yujin-design-system/icons/sumie/thread-spool.svg +1 -0
  204. package/yujin-design-system/icons/sumie/tiger-claw.svg +1 -0
  205. package/yujin-design-system/icons/sumie/time-clock.svg +1 -0
  206. package/yujin-design-system/icons/sumie/torii-double.svg +1 -0
  207. package/yujin-design-system/icons/sumie/train-rail.svg +1 -0
  208. package/yujin-design-system/icons/sumie/truck-cargo.svg +1 -0
  209. package/yujin-design-system/icons/sumie/turtle-shell.svg +1 -0
  210. package/yujin-design-system/icons/sumie/umbrella-folded.svg +1 -0
  211. package/yujin-design-system/icons/sumie/umbrella-wagasa.svg +1 -0
  212. package/yujin-design-system/icons/sumie/wallet-pouch.svg +1 -0
  213. package/yujin-design-system/icons/sumie/warehouse-roof.svg +1 -0
  214. package/yujin-design-system/icons/sumie/wave-curl.svg +1 -0
  215. package/yujin-design-system/icons/sumie/wave-great.svg +1 -0
  216. package/yujin-design-system/icons/sumie/willow-leaf.svg +1 -0
  217. package/yujin-design-system/icons/sumie/wind-gust.svg +1 -0
  218. package/yujin-design-system/icons/sumie/wrench-spanner.svg +1 -0
  219. package/yujin-design-system/manifest.json +69 -0
  220. package/yujin-design-system/preview.html +32 -0
  221. package/yujin-design-system/tokens/yujin-tokens.css +2386 -0
  222. package/yujin-design-system/tokens/yujin-tokens.json +1170 -0
  223. package/yujin-design-system-artdeco/icons/_generate.mjs +142 -0
  224. package/yujin-design-system-artdeco/icons/artdeco/add.svg +1 -0
  225. package/yujin-design-system-artdeco/icons/artdeco/arrow-right.svg +1 -0
  226. package/yujin-design-system-artdeco/icons/artdeco/bell.svg +1 -0
  227. package/yujin-design-system-artdeco/icons/artdeco/briefcase.svg +1 -0
  228. package/yujin-design-system-artdeco/icons/artdeco/building.svg +1 -0
  229. package/yujin-design-system-artdeco/icons/artdeco/calendar.svg +1 -0
  230. package/yujin-design-system-artdeco/icons/artdeco/chart-bar.svg +1 -0
  231. package/yujin-design-system-artdeco/icons/artdeco/chart-line.svg +1 -0
  232. package/yujin-design-system-artdeco/icons/artdeco/chat.svg +1 -0
  233. package/yujin-design-system-artdeco/icons/artdeco/check.svg +1 -0
  234. package/yujin-design-system-artdeco/icons/artdeco/chevron-right.svg +1 -0
  235. package/yujin-design-system-artdeco/icons/artdeco/clipboard.svg +1 -0
  236. package/yujin-design-system-artdeco/icons/artdeco/clock.svg +1 -0
  237. package/yujin-design-system-artdeco/icons/artdeco/close.svg +1 -0
  238. package/yujin-design-system-artdeco/icons/artdeco/coin.svg +1 -0
  239. package/yujin-design-system-artdeco/icons/artdeco/dashboard.svg +1 -0
  240. package/yujin-design-system-artdeco/icons/artdeco/database.svg +1 -0
  241. package/yujin-design-system-artdeco/icons/artdeco/delete.svg +1 -0
  242. package/yujin-design-system-artdeco/icons/artdeco/document.svg +1 -0
  243. package/yujin-design-system-artdeco/icons/artdeco/download.svg +1 -0
  244. package/yujin-design-system-artdeco/icons/artdeco/edit.svg +1 -0
  245. package/yujin-design-system-artdeco/icons/artdeco/expand.svg +1 -0
  246. package/yujin-design-system-artdeco/icons/artdeco/filter.svg +1 -0
  247. package/yujin-design-system-artdeco/icons/artdeco/folder.svg +1 -0
  248. package/yujin-design-system-artdeco/icons/artdeco/globe.svg +1 -0
  249. package/yujin-design-system-artdeco/icons/artdeco/handshake.svg +1 -0
  250. package/yujin-design-system-artdeco/icons/artdeco/heart.svg +1 -0
  251. package/yujin-design-system-artdeco/icons/artdeco/home.svg +1 -0
  252. package/yujin-design-system-artdeco/icons/artdeco/info.svg +1 -0
  253. package/yujin-design-system-artdeco/icons/artdeco/invoice.svg +1 -0
  254. package/yujin-design-system-artdeco/icons/artdeco/list.svg +1 -0
  255. package/yujin-design-system-artdeco/icons/artdeco/lock.svg +1 -0
  256. package/yujin-design-system-artdeco/icons/artdeco/mail.svg +1 -0
  257. package/yujin-design-system-artdeco/icons/artdeco/manifest.json +365 -0
  258. package/yujin-design-system-artdeco/icons/artdeco/menu.svg +1 -0
  259. package/yujin-design-system-artdeco/icons/artdeco/phone.svg +1 -0
  260. package/yujin-design-system-artdeco/icons/artdeco/search.svg +1 -0
  261. package/yujin-design-system-artdeco/icons/artdeco/send.svg +1 -0
  262. package/yujin-design-system-artdeco/icons/artdeco/settings.svg +1 -0
  263. package/yujin-design-system-artdeco/icons/artdeco/share.svg +1 -0
  264. package/yujin-design-system-artdeco/icons/artdeco/shield.svg +1 -0
  265. package/yujin-design-system-artdeco/icons/artdeco/star.svg +1 -0
  266. package/yujin-design-system-artdeco/icons/artdeco/sun.svg +1 -0
  267. package/yujin-design-system-artdeco/icons/artdeco/table.svg +1 -0
  268. package/yujin-design-system-artdeco/icons/artdeco/tag.svg +1 -0
  269. package/yujin-design-system-artdeco/icons/artdeco/target.svg +1 -0
  270. package/yujin-design-system-artdeco/icons/artdeco/user.svg +1 -0
  271. package/yujin-design-system-artdeco/icons/artdeco/users.svg +1 -0
  272. package/yujin-design-system-artdeco/icons/artdeco/warning.svg +1 -0
  273. package/yujin-design-system-artdeco/manifest.json +44 -0
  274. package/yujin-design-system-artdeco/preview.html +25 -0
  275. package/yujin-design-system-artdeco/tokens/artdeco-tokens.css +145 -0
  276. package/yujin-design-system-artdeco/tokens/artdeco-tokens.json +40 -0
  277. package/yujin-design-system-marina/icons/marina/add.svg +1 -0
  278. package/yujin-design-system-marina/icons/marina/anchor.svg +1 -0
  279. package/yujin-design-system-marina/icons/marina/arrow-right.svg +1 -0
  280. package/yujin-design-system-marina/icons/marina/bell.svg +1 -0
  281. package/yujin-design-system-marina/icons/marina/briefcase.svg +1 -0
  282. package/yujin-design-system-marina/icons/marina/building.svg +1 -0
  283. package/yujin-design-system-marina/icons/marina/calendar.svg +1 -0
  284. package/yujin-design-system-marina/icons/marina/chart-bar.svg +1 -0
  285. package/yujin-design-system-marina/icons/marina/chart-line.svg +1 -0
  286. package/yujin-design-system-marina/icons/marina/chat.svg +1 -0
  287. package/yujin-design-system-marina/icons/marina/check.svg +1 -0
  288. package/yujin-design-system-marina/icons/marina/chevron-right.svg +1 -0
  289. package/yujin-design-system-marina/icons/marina/clipboard.svg +1 -0
  290. package/yujin-design-system-marina/icons/marina/clock.svg +1 -0
  291. package/yujin-design-system-marina/icons/marina/close.svg +1 -0
  292. package/yujin-design-system-marina/icons/marina/coin.svg +1 -0
  293. package/yujin-design-system-marina/icons/marina/compass-rose.svg +1 -0
  294. package/yujin-design-system-marina/icons/marina/compass.svg +1 -0
  295. package/yujin-design-system-marina/icons/marina/dashboard.svg +1 -0
  296. package/yujin-design-system-marina/icons/marina/database.svg +1 -0
  297. package/yujin-design-system-marina/icons/marina/delete.svg +1 -0
  298. package/yujin-design-system-marina/icons/marina/document.svg +1 -0
  299. package/yujin-design-system-marina/icons/marina/download.svg +1 -0
  300. package/yujin-design-system-marina/icons/marina/drop.svg +1 -0
  301. package/yujin-design-system-marina/icons/marina/edit.svg +1 -0
  302. package/yujin-design-system-marina/icons/marina/expand.svg +1 -0
  303. package/yujin-design-system-marina/icons/marina/filter.svg +1 -0
  304. package/yujin-design-system-marina/icons/marina/fish.svg +1 -0
  305. package/yujin-design-system-marina/icons/marina/folder.svg +1 -0
  306. package/yujin-design-system-marina/icons/marina/globe.svg +1 -0
  307. package/yujin-design-system-marina/icons/marina/handshake.svg +1 -0
  308. package/yujin-design-system-marina/icons/marina/heart.svg +1 -0
  309. package/yujin-design-system-marina/icons/marina/helm.svg +1 -0
  310. package/yujin-design-system-marina/icons/marina/home.svg +1 -0
  311. package/yujin-design-system-marina/icons/marina/info.svg +1 -0
  312. package/yujin-design-system-marina/icons/marina/invoice.svg +1 -0
  313. package/yujin-design-system-marina/icons/marina/knot.svg +1 -0
  314. package/yujin-design-system-marina/icons/marina/life-ring.svg +1 -0
  315. package/yujin-design-system-marina/icons/marina/lighthouse.svg +1 -0
  316. package/yujin-design-system-marina/icons/marina/list.svg +1 -0
  317. package/yujin-design-system-marina/icons/marina/lock.svg +1 -0
  318. package/yujin-design-system-marina/icons/marina/mail.svg +1 -0
  319. package/yujin-design-system-marina/icons/marina/manifest.json +449 -0
  320. package/yujin-design-system-marina/icons/marina/menu.svg +1 -0
  321. package/yujin-design-system-marina/icons/marina/phone.svg +1 -0
  322. package/yujin-design-system-marina/icons/marina/sailboat.svg +1 -0
  323. package/yujin-design-system-marina/icons/marina/search.svg +1 -0
  324. package/yujin-design-system-marina/icons/marina/send.svg +1 -0
  325. package/yujin-design-system-marina/icons/marina/settings.svg +1 -0
  326. package/yujin-design-system-marina/icons/marina/share.svg +1 -0
  327. package/yujin-design-system-marina/icons/marina/shell.svg +1 -0
  328. package/yujin-design-system-marina/icons/marina/shield.svg +1 -0
  329. package/yujin-design-system-marina/icons/marina/star.svg +1 -0
  330. package/yujin-design-system-marina/icons/marina/sun.svg +1 -0
  331. package/yujin-design-system-marina/icons/marina/table.svg +1 -0
  332. package/yujin-design-system-marina/icons/marina/tag.svg +1 -0
  333. package/yujin-design-system-marina/icons/marina/target.svg +1 -0
  334. package/yujin-design-system-marina/icons/marina/user.svg +1 -0
  335. package/yujin-design-system-marina/icons/marina/users.svg +1 -0
  336. package/yujin-design-system-marina/icons/marina/warning.svg +1 -0
  337. package/yujin-design-system-marina/icons/marina/waves.svg +1 -0
  338. package/yujin-design-system-marina/manifest.json +44 -0
  339. package/yujin-design-system-marina/tokens/marina-tokens.css +107 -0
  340. package/yujin-design-system-marina/tokens/marina-tokens.json +130 -0
  341. package/yujin-design-system-moderna/icons/moderna/add.svg +1 -0
  342. package/yujin-design-system-moderna/icons/moderna/arrow-right.svg +1 -0
  343. package/yujin-design-system-moderna/icons/moderna/arrow-up-right.svg +1 -0
  344. package/yujin-design-system-moderna/icons/moderna/bell.svg +1 -0
  345. package/yujin-design-system-moderna/icons/moderna/bolt.svg +1 -0
  346. package/yujin-design-system-moderna/icons/moderna/briefcase.svg +1 -0
  347. package/yujin-design-system-moderna/icons/moderna/building.svg +1 -0
  348. package/yujin-design-system-moderna/icons/moderna/calendar.svg +1 -0
  349. package/yujin-design-system-moderna/icons/moderna/chart-bar.svg +1 -0
  350. package/yujin-design-system-moderna/icons/moderna/chart-line.svg +1 -0
  351. package/yujin-design-system-moderna/icons/moderna/chat.svg +1 -0
  352. package/yujin-design-system-moderna/icons/moderna/check.svg +1 -0
  353. package/yujin-design-system-moderna/icons/moderna/chevron-right.svg +1 -0
  354. package/yujin-design-system-moderna/icons/moderna/chevrons.svg +1 -0
  355. package/yujin-design-system-moderna/icons/moderna/clipboard.svg +1 -0
  356. package/yujin-design-system-moderna/icons/moderna/clock.svg +1 -0
  357. package/yujin-design-system-moderna/icons/moderna/close.svg +1 -0
  358. package/yujin-design-system-moderna/icons/moderna/coin.svg +1 -0
  359. package/yujin-design-system-moderna/icons/moderna/dashboard.svg +1 -0
  360. package/yujin-design-system-moderna/icons/moderna/database.svg +1 -0
  361. package/yujin-design-system-moderna/icons/moderna/delete.svg +1 -0
  362. package/yujin-design-system-moderna/icons/moderna/diamond.svg +1 -0
  363. package/yujin-design-system-moderna/icons/moderna/document.svg +1 -0
  364. package/yujin-design-system-moderna/icons/moderna/download.svg +1 -0
  365. package/yujin-design-system-moderna/icons/moderna/edit.svg +1 -0
  366. package/yujin-design-system-moderna/icons/moderna/expand.svg +1 -0
  367. package/yujin-design-system-moderna/icons/moderna/filter.svg +1 -0
  368. package/yujin-design-system-moderna/icons/moderna/folder.svg +1 -0
  369. package/yujin-design-system-moderna/icons/moderna/globe.svg +1 -0
  370. package/yujin-design-system-moderna/icons/moderna/grid.svg +1 -0
  371. package/yujin-design-system-moderna/icons/moderna/handshake.svg +1 -0
  372. package/yujin-design-system-moderna/icons/moderna/heart.svg +1 -0
  373. package/yujin-design-system-moderna/icons/moderna/hexagon.svg +1 -0
  374. package/yujin-design-system-moderna/icons/moderna/home.svg +1 -0
  375. package/yujin-design-system-moderna/icons/moderna/info.svg +1 -0
  376. package/yujin-design-system-moderna/icons/moderna/invoice.svg +1 -0
  377. package/yujin-design-system-moderna/icons/moderna/layers.svg +1 -0
  378. package/yujin-design-system-moderna/icons/moderna/list.svg +1 -0
  379. package/yujin-design-system-moderna/icons/moderna/lock.svg +1 -0
  380. package/yujin-design-system-moderna/icons/moderna/mail.svg +1 -0
  381. package/yujin-design-system-moderna/icons/moderna/manifest.json +457 -0
  382. package/yujin-design-system-moderna/icons/moderna/menu.svg +1 -0
  383. package/yujin-design-system-moderna/icons/moderna/phone.svg +1 -0
  384. package/yujin-design-system-moderna/icons/moderna/play.svg +1 -0
  385. package/yujin-design-system-moderna/icons/moderna/plus-square.svg +1 -0
  386. package/yujin-design-system-moderna/icons/moderna/pulse.svg +1 -0
  387. package/yujin-design-system-moderna/icons/moderna/search.svg +1 -0
  388. package/yujin-design-system-moderna/icons/moderna/send.svg +1 -0
  389. package/yujin-design-system-moderna/icons/moderna/settings.svg +1 -0
  390. package/yujin-design-system-moderna/icons/moderna/share.svg +1 -0
  391. package/yujin-design-system-moderna/icons/moderna/shield.svg +1 -0
  392. package/yujin-design-system-moderna/icons/moderna/spark.svg +1 -0
  393. package/yujin-design-system-moderna/icons/moderna/star.svg +1 -0
  394. package/yujin-design-system-moderna/icons/moderna/sun.svg +1 -0
  395. package/yujin-design-system-moderna/icons/moderna/table.svg +1 -0
  396. package/yujin-design-system-moderna/icons/moderna/tag.svg +1 -0
  397. package/yujin-design-system-moderna/icons/moderna/target-dot.svg +1 -0
  398. package/yujin-design-system-moderna/icons/moderna/target.svg +1 -0
  399. package/yujin-design-system-moderna/icons/moderna/user.svg +1 -0
  400. package/yujin-design-system-moderna/icons/moderna/users.svg +1 -0
  401. package/yujin-design-system-moderna/icons/moderna/warning.svg +1 -0
  402. package/yujin-design-system-moderna/manifest.json +44 -0
  403. package/yujin-design-system-moderna/tokens/moderna-tokens.css +106 -0
  404. package/yujin-design-system-moderna/tokens/moderna-tokens.json +130 -0
@@ -0,0 +1,2386 @@
1
+ /* ============================================================
2
+ YUJIN CRM — Design Tokens
3
+ 友人 · Precisión japonesa al servicio de la relación humana
4
+ ============================================================
5
+ Uso: importar como primer archivo CSS del proyecto.
6
+ Todas las variables aquí definidas son la fuente de verdad
7
+ del sistema visual. Ningún valor de color, tipografía o
8
+ espaciado debe hardcodearse fuera de este archivo.
9
+ ============================================================ */
10
+
11
+ :root {
12
+
13
+ /* ----------------------------------------------------------
14
+ MARCA
15
+ ---------------------------------------------------------- */
16
+ --yujin-name: "Yujin";
17
+ --yujin-kanji: "友人";
18
+
19
+
20
+ /* ----------------------------------------------------------
21
+ COLORES — Paleta base
22
+ ---------------------------------------------------------- */
23
+
24
+ /* Índigo (acento primario — acción, foco, identidad) */
25
+ --color-indigo-50: #ECEFFE;
26
+ --color-indigo-100: #C8CDFA;
27
+ --color-indigo-200: #A0A8F5;
28
+ --color-indigo-400: #5A66E8;
29
+ --color-indigo-600: #2D3A8C; /* ← color principal de marca */
30
+ --color-indigo-800: #1A2260;
31
+ --color-indigo-900: #0D1235;
32
+
33
+ /* Teal (acento secundario — éxito, activo, positivo) */
34
+ --color-teal-50: #E2F5F3;
35
+ --color-teal-100: #AADFD9;
36
+ --color-teal-200: #6EC8C0;
37
+ --color-teal-400: #1D9E94;
38
+ --color-teal-600: #0F6E66;
39
+ --color-teal-800: #074F49;
40
+ --color-teal-900: #03302C;
41
+
42
+ /* Ámbar (alertas, pendiente, atención) */
43
+ --color-amber-50: #FDF4E3;
44
+ --color-amber-100: #FAE0A8;
45
+ --color-amber-200: #F5C86A;
46
+ --color-amber-400: #D4950A;
47
+ --color-amber-600: #9B6A05;
48
+ --color-amber-800: #6B4803;
49
+ --color-amber-900: #3D2801;
50
+
51
+ /* Coral (peligro, pérdida, error) */
52
+ --color-coral-50: #FCEEE9;
53
+ --color-coral-100: #F7C9BB;
54
+ --color-coral-200: #F09F8A;
55
+ --color-coral-400: #D45840;
56
+ --color-coral-600: #943020;
57
+ --color-coral-800: #6A1F13;
58
+ --color-coral-900: #3D0E08;
59
+
60
+ /* Neutros cálidos (base de la UI — espíritu wabi-sabi) */
61
+ --color-warm-0: #FFFFFF;
62
+ --color-warm-50: #F8F7F4; /* fondo de página */
63
+ --color-warm-100: #F2F0EC; /* fondo de superficie */
64
+ --color-warm-150: #EAE8E2; /* bordes sutiles */
65
+ --color-warm-200: #DEDAD2; /* bordes normales */
66
+ --color-warm-300: #C8C5BB; /* bordes énfasis */
67
+ --color-warm-400: #A8A49A; /* texto deshabilitado */
68
+ --color-warm-500: #888480; /* texto terciario / placeholders */
69
+ --color-warm-600: #615E58; /* texto secundario */
70
+ --color-warm-700: #3E3B36; /* texto primario suave */
71
+ --color-warm-800: #2C2927; /* texto primario */
72
+ --color-warm-900: #1A1815; /* texto máxima jerarquía */
73
+
74
+ /* Ink (el color más oscuro — titulares, énfasis máximo) */
75
+ --color-ink: #1A1815;
76
+
77
+
78
+ /* ----------------------------------------------------------
79
+ COLORES — Semánticos (roles funcionales en la UI)
80
+ ---------------------------------------------------------- */
81
+
82
+ --color-bg-page: var(--color-warm-50);
83
+ --color-bg-surface: var(--color-warm-0);
84
+ --color-bg-subtle: var(--color-warm-100);
85
+ --color-bg-muted: var(--color-warm-150);
86
+
87
+ --color-border-subtle: var(--color-warm-150);
88
+ --color-border-default: var(--color-warm-200);
89
+ --color-border-strong: var(--color-warm-300);
90
+
91
+ --color-text-primary: var(--color-warm-800);
92
+ --color-text-secondary: var(--color-warm-600);
93
+ --color-text-tertiary: var(--color-warm-500);
94
+ --color-text-disabled: var(--color-warm-400);
95
+ --color-text-inverse: var(--color-warm-0);
96
+
97
+ --color-accent: var(--color-indigo-600);
98
+ --color-accent-hover: var(--color-indigo-800);
99
+ --color-accent-light: var(--color-indigo-50);
100
+ --color-accent-text: var(--color-indigo-600);
101
+
102
+ --color-success: var(--color-teal-600);
103
+ --color-success-light: var(--color-teal-50);
104
+ --color-success-text: var(--color-teal-800);
105
+
106
+ --color-warning: var(--color-amber-600);
107
+ --color-warning-light: var(--color-amber-50);
108
+ --color-warning-text: var(--color-amber-800);
109
+
110
+ --color-danger: var(--color-coral-600);
111
+ --color-danger-light: var(--color-coral-50);
112
+ --color-danger-text: var(--color-coral-800);
113
+
114
+
115
+ /* ----------------------------------------------------------
116
+ COLORES — Módulos / Entidades (iconos y tarjetas del sistema)
117
+ Cada módulo tiene un color semántico que lo identifica.
118
+ Usar siempre: bg = *-50, border = *-200, icon = *-600, text = *-800
119
+ ---------------------------------------------------------- */
120
+
121
+ /* Contactos */
122
+ --module-contacts-bg: var(--color-indigo-50);
123
+ --module-contacts-border: var(--color-indigo-200);
124
+ --module-contacts-icon: var(--color-indigo-600);
125
+ --module-contacts-text: var(--color-indigo-800);
126
+
127
+ /* Empresas */
128
+ --module-companies-bg: #EEF2FF;
129
+ --module-companies-icon: #3730A3;
130
+
131
+ /* Proveedores */
132
+ --module-suppliers-bg: var(--color-amber-50);
133
+ --module-suppliers-icon: var(--color-amber-600);
134
+
135
+ /* Asesores */
136
+ --module-advisors-bg: var(--color-teal-50);
137
+ --module-advisors-icon: var(--color-teal-600);
138
+
139
+ /* Inventario */
140
+ --module-inventory-bg: #FFF7ED;
141
+ --module-inventory-icon: #C2610C;
142
+
143
+ /* Documentos */
144
+ --module-docs-bg: var(--color-warm-100);
145
+ --module-docs-icon: var(--color-warm-600);
146
+
147
+ /* Pipeline Runs / Deals */
148
+ --module-pipeline-bg: var(--color-indigo-50);
149
+ --module-pipeline-icon: var(--color-indigo-600);
150
+
151
+ /* Tickets Soporte */
152
+ --module-tickets-bg: var(--color-coral-50);
153
+ --module-tickets-icon: var(--color-coral-600);
154
+
155
+ /* Pagos */
156
+ --module-payments-bg: var(--color-teal-50);
157
+ --module-payments-icon: var(--color-teal-600);
158
+
159
+ /* Firmas Digitales */
160
+ --module-signatures-bg: #F0FDF4;
161
+ --module-signatures-icon: #15803D;
162
+
163
+ /* Tarifas Horarias */
164
+ --module-rates-bg: var(--color-amber-50);
165
+ --module-rates-icon: var(--color-amber-600);
166
+
167
+ /* Usuarios */
168
+ --module-users-bg: var(--color-indigo-50);
169
+ --module-users-icon: var(--color-indigo-600);
170
+
171
+ /* Asistentes IA */
172
+ --module-ai-bg: #F5F3FF;
173
+ --module-ai-icon: #6D28D9;
174
+
175
+ /* Tareas */
176
+ --module-tasks-bg: var(--color-warm-100);
177
+ --module-tasks-icon: var(--color-warm-700);
178
+
179
+ /* Estadísticas */
180
+ --module-stats-bg: var(--color-indigo-50);
181
+ --module-stats-icon: var(--color-indigo-600);
182
+
183
+ /* KPIs */
184
+ --module-kpis-bg: var(--color-amber-50);
185
+ --module-kpis-icon: var(--color-amber-600);
186
+
187
+ /* Configuración / Sistema */
188
+ --module-system-bg: var(--color-warm-100);
189
+ --module-system-icon: var(--color-warm-600);
190
+
191
+ /* Seguridad */
192
+ --module-security-bg: var(--color-coral-50);
193
+ --module-security-icon: var(--color-coral-600);
194
+
195
+ /* Tenants SaaS */
196
+ --module-tenants-bg: var(--color-teal-50);
197
+ --module-tenants-icon: var(--color-teal-600);
198
+
199
+ /* Entidades Custom */
200
+ --module-custom-bg: #FDF4FF;
201
+ --module-custom-icon: #9333EA;
202
+
203
+ /* Integraciones */
204
+ --module-integrations-bg: var(--color-indigo-50);
205
+ --module-integrations-icon: var(--color-indigo-600);
206
+
207
+ /* Dashboards */
208
+ --module-dashboards-bg: var(--color-teal-50);
209
+ --module-dashboards-icon: var(--color-teal-600);
210
+
211
+
212
+ /* ----------------------------------------------------------
213
+ COLORES — Estados de Pipeline / Deal
214
+ ---------------------------------------------------------- */
215
+
216
+ --stage-lead: #6366F1; /* índigo suave */
217
+ --stage-discovery: #8B5CF6; /* violeta */
218
+ --stage-quote: var(--color-amber-400);
219
+ --stage-contract: var(--color-teal-400);
220
+ --stage-won: #16A34A; /* verde éxito */
221
+ --stage-lost: var(--color-coral-400);
222
+
223
+ --stage-lead-bg: #EEF2FF;
224
+ --stage-discovery-bg:#F5F3FF;
225
+ --stage-quote-bg: var(--color-amber-50);
226
+ --stage-contract-bg: var(--color-teal-50);
227
+ --stage-won-bg: #F0FDF4;
228
+ --stage-lost-bg: var(--color-coral-50);
229
+
230
+
231
+ /* ----------------------------------------------------------
232
+ TIPOGRAFÍA
233
+ ---------------------------------------------------------- */
234
+
235
+ /* Familias */
236
+ --font-sans: "DM Sans", "Inter", system-ui, sans-serif;
237
+ --font-display: "DM Sans", sans-serif;
238
+ --font-mono: "JetBrains Mono", "Fira Code", monospace;
239
+
240
+ /* Escala */
241
+ --text-xs: 11px;
242
+ --text-sm: 12px;
243
+ --text-base: 14px;
244
+ --text-md: 15px;
245
+ --text-lg: 17px;
246
+ --text-xl: 20px;
247
+ --text-2xl: 24px;
248
+ --text-3xl: 30px;
249
+
250
+ /* Pesos — SOLO estos dos */
251
+ --font-regular: 400;
252
+ --font-medium: 500;
253
+
254
+ /* Interlineado */
255
+ --leading-tight: 1.3;
256
+ --leading-normal: 1.6;
257
+ --leading-relaxed: 1.75;
258
+
259
+ /* Tracking */
260
+ --tracking-tight: -0.01em;
261
+ --tracking-normal: 0;
262
+ --tracking-wide: 0.04em;
263
+ --tracking-wider: 0.08em;
264
+
265
+
266
+ /* ----------------------------------------------------------
267
+ ESPACIADO — Escala 4px base
268
+ ---------------------------------------------------------- */
269
+
270
+ --space-1: 4px;
271
+ --space-2: 8px;
272
+ --space-3: 12px;
273
+ --space-4: 16px;
274
+ --space-5: 20px;
275
+ --space-6: 24px;
276
+ --space-8: 32px;
277
+ --space-10: 40px;
278
+ --space-12: 48px;
279
+ --space-16: 64px;
280
+ --space-20: 80px;
281
+
282
+
283
+ /* ----------------------------------------------------------
284
+ BORDES
285
+ ---------------------------------------------------------- */
286
+
287
+ --border-width-thin: 0.5px;
288
+ --border-width-default: 1px;
289
+ --border-width-thick: 2px; /* solo para cards destacadas / seleccionadas */
290
+
291
+ --radius-sm: 4px;
292
+ --radius-md: 8px;
293
+ --radius-lg: 12px;
294
+ --radius-xl: 16px;
295
+ --radius-full: 9999px; /* pills, badges */
296
+
297
+
298
+ /* ----------------------------------------------------------
299
+ SOMBRAS — Solo funcionales, nunca decorativas
300
+ ---------------------------------------------------------- */
301
+
302
+ --shadow-none: none;
303
+ --shadow-sm: 0 1px 2px rgba(26, 24, 21, 0.05);
304
+ --shadow-md: 0 2px 8px rgba(26, 24, 21, 0.08); /* modales, dropdowns */
305
+ --shadow-focus: 0 0 0 3px rgba(45, 58, 140, 0.15); /* ring de foco */
306
+
307
+
308
+ /* ----------------------------------------------------------
309
+ TRANSICIONES — Rápidas y funcionales
310
+ ---------------------------------------------------------- */
311
+
312
+ --transition-fast: 100ms ease-out;
313
+ --transition-base: 150ms ease-out;
314
+ --transition-slow: 200ms ease-out;
315
+
316
+
317
+ /* ----------------------------------------------------------
318
+ LAYOUT
319
+ ---------------------------------------------------------- */
320
+
321
+ --sidebar-width: 220px;
322
+ --sidebar-width-collapsed: 56px;
323
+ --topbar-height: 52px;
324
+ --content-max-width: 1200px;
325
+ --content-padding: var(--space-6);
326
+
327
+
328
+ /* ----------------------------------------------------------
329
+ ICONOGRAFÍA — Sistema Lucide (stroke 1.5px, 20px base)
330
+ ---------------------------------------------------------- */
331
+
332
+ --icon-size-sm: 16px;
333
+ --icon-size-base: 20px;
334
+ --icon-size-lg: 24px;
335
+ --icon-stroke: 1.5; /* stroke-width de Lucide */
336
+ --icon-stroke-bold: 2; /* para estados activos o énfasis */
337
+
338
+ /* Tamaño de ícono en tarjetas de módulo */
339
+ --module-card-icon-size: 28px;
340
+ --module-card-icon-bg-size: 52px; /* contenedor del ícono */
341
+ --module-card-icon-radius: var(--radius-md);
342
+
343
+ /* ----------------------------------------------------------
344
+ KANJI WATERMARK — Opción A
345
+ Marca de agua decorativa en esquina superior derecha
346
+ de cada tarjeta de módulo. Acompaña al ícono Lucide,
347
+ nunca lo reemplaza.
348
+ ---------------------------------------------------------- */
349
+
350
+ --kanji-font: "Noto Serif JP", "Yu Mincho", "游明朝", serif;
351
+ --kanji-size-lg: 72px; /* tarjetas estándar (180px wide) */
352
+ --kanji-size-md: 56px; /* tarjetas compactas */
353
+ --kanji-size-sm: 40px; /* tarjetas muy pequeñas */
354
+ --kanji-opacity: 0.06; /* decorativo puro — nunca superar 0.10 */
355
+ --kanji-weight: 700;
356
+
357
+
358
+ /* ----------------------------------------------------------
359
+ TARJETAS DEL SISTEMA (Centro de Control / Entidades)
360
+ ---------------------------------------------------------- */
361
+
362
+ --card-module-width: 180px;
363
+ --card-module-min-height: 140px;
364
+ --card-module-padding: var(--space-5);
365
+ --card-module-radius: var(--radius-lg);
366
+ --card-module-border: var(--border-width-thin) solid var(--color-border-subtle);
367
+ --card-module-bg: var(--color-bg-surface);
368
+ --card-module-bg-hover: var(--color-warm-50);
369
+
370
+ /* Tarjeta de métricas / KPI */
371
+ --card-metric-padding: var(--space-4) var(--space-5);
372
+ --card-metric-radius: var(--radius-md);
373
+ --card-metric-bg: var(--color-bg-subtle);
374
+
375
+ /* Tarjeta de entidad (deal, contacto) */
376
+ --card-entity-padding: var(--space-4);
377
+ --card-entity-radius: var(--radius-lg);
378
+ --card-entity-border: var(--border-width-thin) solid var(--color-border-subtle);
379
+ --card-entity-bg: var(--color-bg-surface);
380
+
381
+
382
+ /* ----------------------------------------------------------
383
+ SIDEBAR
384
+ ---------------------------------------------------------- */
385
+
386
+ --sidebar-bg: var(--color-bg-surface);
387
+ --sidebar-border: var(--border-width-thin) solid var(--color-border-subtle);
388
+ --sidebar-item-height: 36px;
389
+ --sidebar-item-radius: var(--radius-md);
390
+ --sidebar-item-active-bg: var(--color-accent-light);
391
+ --sidebar-item-active-text: var(--color-accent);
392
+ --sidebar-section-label-size: var(--text-xs);
393
+ --sidebar-section-label-tracking: var(--tracking-wider);
394
+
395
+
396
+ /* ----------------------------------------------------------
397
+ BADGES / PILLS
398
+ ---------------------------------------------------------- */
399
+
400
+ --badge-padding: 2px 8px;
401
+ --badge-radius: var(--radius-full);
402
+ --badge-font-size: var(--text-xs);
403
+ --badge-font-weight: var(--font-medium);
404
+
405
+
406
+ /* ----------------------------------------------------------
407
+ FORMULARIOS
408
+ ---------------------------------------------------------- */
409
+
410
+ --input-height: 36px;
411
+ --input-padding: 0 var(--space-3);
412
+ --input-radius: var(--radius-md);
413
+ --input-border: var(--border-width-default) solid var(--color-border-default);
414
+ --input-bg: var(--color-bg-surface);
415
+ --input-focus-border: var(--color-accent);
416
+ --input-focus-ring: var(--shadow-focus);
417
+ --input-font-size: var(--text-base);
418
+
419
+
420
+ /* ----------------------------------------------------------
421
+ BOTONES
422
+ ---------------------------------------------------------- */
423
+
424
+ --btn-height: 36px;
425
+ --btn-padding: 0 var(--space-4);
426
+ --btn-radius: var(--radius-md);
427
+ --btn-font-size: var(--text-base);
428
+ --btn-font-weight: var(--font-medium);
429
+ --btn-transition: var(--transition-base);
430
+
431
+ /* Primario */
432
+ --btn-primary-bg: var(--color-accent);
433
+ --btn-primary-text: var(--color-text-inverse);
434
+ --btn-primary-hover: var(--color-accent-hover);
435
+
436
+ /* Secundario */
437
+ --btn-secondary-bg: transparent;
438
+ --btn-secondary-text: var(--color-accent);
439
+ --btn-secondary-border: var(--color-accent);
440
+ --btn-secondary-hover-bg: var(--color-accent-light);
441
+
442
+ /* Ghost */
443
+ --btn-ghost-bg: transparent;
444
+ --btn-ghost-text: var(--color-text-secondary);
445
+ --btn-ghost-border: var(--color-border-default);
446
+ --btn-ghost-hover-bg: var(--color-bg-subtle);
447
+
448
+ /* Peligro */
449
+ --btn-danger-bg: var(--color-danger);
450
+ --btn-danger-text: var(--color-text-inverse);
451
+ --btn-danger-hover: var(--color-coral-800);
452
+
453
+
454
+ /* ----------------------------------------------------------
455
+ Z-INDEX
456
+ ---------------------------------------------------------- */
457
+
458
+ --z-base: 0;
459
+ --z-above: 1;
460
+ --z-dropdown: 100;
461
+ --z-sticky: 200;
462
+ --z-modal: 300;
463
+ --z-toast: 400;
464
+ --z-tooltip: 500;
465
+
466
+ }
467
+
468
+
469
+ /* ----------------------------------------------------------
470
+ HUB-SHELL TABS (Chablis#BUG-44 phase 2)
471
+ Sazanami-style tab switcher that drops into every hub-shell
472
+ surface when hub_tabs has 2+ active rows. Active tab is
473
+ underlined in indigo; hover paints a subtle indigo wash;
474
+ focus-visible reuses the form focus ring. Reduced-motion
475
+ skips the underline transition.
476
+ ---------------------------------------------------------- */
477
+
478
+ .yj-hub-tabs {
479
+ list-style: none;
480
+ margin: 0 0 14px 0;
481
+ padding: 0;
482
+ display: flex;
483
+ flex-wrap: wrap;
484
+ gap: 0;
485
+ border-bottom: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
486
+ font-family: var(--font-sans, system-ui, sans-serif);
487
+ font-size: 13px;
488
+ font-weight: var(--font-medium, 500);
489
+ color: var(--color-text-secondary, #6E6A63);
490
+ }
491
+
492
+ .yj-hub-tabs .yj-hub-tab {
493
+ cursor: pointer;
494
+ padding: 9px 16px;
495
+ margin-bottom: -1px;
496
+ border-bottom: 2px solid transparent;
497
+ user-select: none;
498
+ transition: color 140ms ease, border-color 140ms ease,
499
+ background-color 140ms ease;
500
+ }
501
+
502
+ .yj-hub-tabs .yj-hub-tab:hover {
503
+ color: var(--color-indigo-600, #2D3A8C);
504
+ background-color: var(--color-indigo-50, #ECEFFE);
505
+ }
506
+
507
+ .yj-hub-tabs .yj-hub-tab.is-active {
508
+ color: var(--color-indigo-600, #2D3A8C);
509
+ border-bottom-color: var(--color-indigo-600, #2D3A8C);
510
+ background-color: transparent;
511
+ }
512
+
513
+ .yj-hub-tabs .yj-hub-tab:focus-visible {
514
+ outline: 2px solid var(--color-indigo-400, #5A66E8);
515
+ outline-offset: -2px;
516
+ }
517
+
518
+ @media (prefers-reduced-motion: reduce) {
519
+ .yj-hub-tabs .yj-hub-tab {
520
+ transition: none;
521
+ }
522
+ }
523
+
524
+ /* ----------------------------------------------------------
525
+ HUB NO-JS FALLBACK (Torrontes#BUG-44-c67)
526
+ Rendered server-side inside a <noscript> block when the URL
527
+ carries ?hub_slug=. JS-enabled browsers drop the markup so
528
+ the table only surfaces for users who disabled scripts.
529
+ ---------------------------------------------------------- */
530
+
531
+ .yj-hub-fallback {
532
+ display: table;
533
+ width: 100%;
534
+ margin: 14px 0;
535
+ border-collapse: collapse;
536
+ font-size: 13px;
537
+ background-color: var(--color-bg-surface, #fff);
538
+ border: 1px solid var(--color-border-subtle, #eee);
539
+ }
540
+
541
+ .yj-hub-fallback caption {
542
+ text-align: left;
543
+ padding: 10px 12px;
544
+ font-size: 15px;
545
+ font-weight: 500;
546
+ color: var(--color-text-primary, #1a1a1a);
547
+ border-bottom: 1px solid var(--color-border-subtle, #eee);
548
+ }
549
+
550
+ .yj-hub-fallback th,
551
+ .yj-hub-fallback td {
552
+ padding: 8px 12px;
553
+ text-align: left;
554
+ border-bottom: 1px solid var(--color-border-subtle, #eee);
555
+ }
556
+
557
+ .yj-hub-fallback th {
558
+ background-color: var(--color-bg-subtle, #F2F0EC);
559
+ font-weight: 600;
560
+ color: var(--color-text-secondary, #555);
561
+ }
562
+
563
+ .yj-hub-fallback a {
564
+ color: var(--color-indigo-600, #2D3A8C);
565
+ text-decoration: none;
566
+ }
567
+ .yj-hub-fallback a:hover { text-decoration: underline; }
568
+
569
+ .yj-hub-fallback__form {
570
+ display: flex;
571
+ gap: 6px;
572
+ margin: 8px 0;
573
+ }
574
+ .yj-hub-fallback__form input[type="search"] {
575
+ flex: 1;
576
+ padding: 6px 10px;
577
+ border: 1px solid var(--color-border-subtle, #eee);
578
+ border-radius: 6px;
579
+ font-size: 13px;
580
+ }
581
+ .yj-hub-fallback__form button {
582
+ padding: 6px 14px;
583
+ border: 0;
584
+ border-radius: 6px;
585
+ background-color: var(--color-indigo-600, #2D3A8C);
586
+ color: #ffffff;
587
+ font-size: 12px;
588
+ cursor: pointer;
589
+ }
590
+
591
+ /* JS-enabled override: a tenant who renders the fallback OUTSIDE
592
+ <noscript> can hide it by adding .yj-hub-shell-mounted to body
593
+ once the shell has booted. */
594
+ body.yj-hub-shell-mounted .yj-hub-fallback,
595
+ body.yj-hub-shell-mounted .yj-hub-fallback__form {
596
+ display: none !important;
597
+ }
598
+
599
+ /* ----------------------------------------------------------
600
+ SIDEBAR BADGE COUNTER (Torrontes#BUG-44-c33)
601
+ Mokuji nav items decorate with a live count of pending /
602
+ overdue / unread items. Coral background + white digit so the
603
+ badge reads as "needs attention" without competing with the
604
+ active-item indigo accent.
605
+ ---------------------------------------------------------- */
606
+
607
+ .ni .yj-badge {
608
+ display: inline-flex;
609
+ align-items: center;
610
+ justify-content: center;
611
+ margin-left: 8px;
612
+ padding: 1px 6px;
613
+ min-width: 18px;
614
+ height: 18px;
615
+ border-radius: 9px;
616
+ background-color: var(--color-coral-600, #943020);
617
+ color: var(--color-text-inverse, #fff);
618
+ font-size: 10px;
619
+ font-weight: 600;
620
+ line-height: 1;
621
+ }
622
+
623
+ /* ----------------------------------------------------------
624
+ HUB EMPTY STATE (Torrontes#BUG-44-c22)
625
+ Centred sumi-e placeholder rendered when the endpoint returns
626
+ 0 items or the active filter has no matches. Icon 64px +
627
+ message (h3) + primary CTA. Ink-fade animation eases the card
628
+ into view (drops to none under prefers-reduced-motion).
629
+ ---------------------------------------------------------- */
630
+
631
+ .yj-hub-empty-state {
632
+ display: flex;
633
+ flex-direction: column;
634
+ align-items: center;
635
+ justify-content: center;
636
+ text-align: center;
637
+ padding: 48px 24px;
638
+ color: var(--color-text-secondary, #555);
639
+ animation: yj-empty-ink-fade 0.45s ease-out;
640
+ }
641
+
642
+ .yj-hub-empty-state__icon {
643
+ width: 64px;
644
+ height: 64px;
645
+ margin-bottom: 16px;
646
+ color: var(--color-text-tertiary, #888);
647
+ opacity: 0.85;
648
+ }
649
+
650
+ .yj-hub-empty-state__icon svg {
651
+ width: 100%;
652
+ height: 100%;
653
+ }
654
+
655
+ .yj-hub-empty-state__message {
656
+ margin: 0 0 8px;
657
+ font-size: 16px;
658
+ font-weight: 500;
659
+ color: var(--color-text-primary, #1a1a1a);
660
+ }
661
+
662
+ .yj-hub-empty-state__cta {
663
+ margin-top: 12px;
664
+ }
665
+
666
+ @keyframes yj-empty-ink-fade {
667
+ from { opacity: 0; transform: translateY(6px); }
668
+ to { opacity: 1; transform: translateY(0); }
669
+ }
670
+
671
+ @media (prefers-reduced-motion: reduce) {
672
+ .yj-hub-empty-state {
673
+ animation: none;
674
+ }
675
+ }
676
+
677
+ /* ----------------------------------------------------------
678
+ HUB KEYBOARD A11Y (Torrontes#BUG-44-c20)
679
+ :focus-visible on every interactive shell element so
680
+ keyboard users always see where focus lives. Outline 2px
681
+ indigo + 2px offset so the cue clears the card border.
682
+ Skip-to-content anchor lives at the top of body and is
683
+ visible only when focused (sr-only by default).
684
+ ---------------------------------------------------------- */
685
+
686
+ .yj-hub-card:focus-visible,
687
+ .yj-hub-grid:focus-visible,
688
+ .yj-hub-counter:focus-visible,
689
+ .yj-hub-card__action:focus-visible {
690
+ outline: 2px solid var(--color-indigo-400, #5A66E8);
691
+ outline-offset: 2px;
692
+ }
693
+
694
+ .yj-skip-to-content {
695
+ position: absolute;
696
+ top: -40px;
697
+ left: 0;
698
+ padding: 8px 14px;
699
+ background-color: var(--color-indigo-600, #2D3A8C);
700
+ color: var(--color-text-inverse, #FFFFFF);
701
+ font-size: 13px;
702
+ border-radius: 0 0 6px 0;
703
+ z-index: 9999;
704
+ text-decoration: none;
705
+ transition: top 0.15s ease;
706
+ }
707
+
708
+ .yj-skip-to-content:focus,
709
+ .yj-skip-to-content:focus-visible {
710
+ top: 0;
711
+ outline: 2px solid var(--color-indigo-400, #5A66E8);
712
+ outline-offset: 2px;
713
+ }
714
+
715
+ @media (prefers-reduced-motion: reduce) {
716
+ .yj-skip-to-content {
717
+ transition: none;
718
+ }
719
+ }
720
+
721
+
722
+ /* ----------------------------------------------------------
723
+ HUB REALTIME PULSE (Chablis#BUG-44-c27)
724
+ When the SSE stream emits a change for a card, the shell adds
725
+ .yj-rt-pulse to highlight the card for ~2s. Indigo glow fades
726
+ out via the keyframe; reduced-motion drops the animation and
727
+ shows a static outline instead.
728
+ ---------------------------------------------------------- */
729
+
730
+ .yj-rt-pulse {
731
+ animation: yj-rt-pulse-anim 2s ease-out;
732
+ }
733
+
734
+ @keyframes yj-rt-pulse-anim {
735
+ 0% { box-shadow: 0 0 0 0 var(--color-indigo-400, #5A66E8); }
736
+ 40% { box-shadow: 0 0 0 6px var(--color-indigo-200, rgba(90,102,232,0.35)); }
737
+ 100% { box-shadow: 0 0 0 0 transparent; }
738
+ }
739
+
740
+ @media (prefers-reduced-motion: reduce) {
741
+ .yj-rt-pulse {
742
+ animation: none;
743
+ box-shadow: 0 0 0 2px var(--color-indigo-400, #5A66E8);
744
+ }
745
+ }
746
+
747
+
748
+ /* ----------------------------------------------------------
749
+ HUB BULK SELECTION (Chablis#BUG-44-c19)
750
+ When the section carries .is-bulk-selecting:
751
+ - Cards show a checkbox glyph top-left.
752
+ - Selected cards get an indigo outline.
753
+ - Card cursor becomes pointer (selection target).
754
+ Reduced-motion drops the transition on the outline.
755
+ ---------------------------------------------------------- */
756
+
757
+ .hs-section.is-bulk-selecting .cc-card {
758
+ cursor: pointer;
759
+ position: relative;
760
+ transition: box-shadow 140ms ease;
761
+ }
762
+
763
+ .hs-section.is-bulk-selecting .cc-card::before {
764
+ content: '\2610';
765
+ position: absolute;
766
+ top: 8px;
767
+ left: 8px;
768
+ font-size: 16px;
769
+ color: var(--color-text-tertiary, #888);
770
+ z-index: 2;
771
+ }
772
+
773
+ .hs-section.is-bulk-selecting .cc-card.is-selected::before {
774
+ content: '\2611';
775
+ color: var(--color-indigo-600, #2D3A8C);
776
+ }
777
+
778
+ .hs-section.is-bulk-selecting .cc-card.is-selected {
779
+ box-shadow: 0 0 0 2px var(--color-indigo-600, #2D3A8C);
780
+ }
781
+
782
+ @media (prefers-reduced-motion: reduce) {
783
+ .hs-section.is-bulk-selecting .cc-card { transition: none; }
784
+ }
785
+
786
+
787
+ /* ----------------------------------------------------------
788
+ HUB-TABS CONFIGURATOR (Chablis#BUG-44 phase 3)
789
+ Admin-only modal for managing hub_tabs rows. Visual frame
790
+ matches the F45 list-view configurator -- white card on dim
791
+ overlay, indigo accent on the primary action, drag handles
792
+ in tertiary text.
793
+ ---------------------------------------------------------- */
794
+
795
+ .yj-hub-config-card {
796
+ background: var(--color-bg-surface, #fff);
797
+ border: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
798
+ border-radius: 8px;
799
+ width: min(720px, 100%);
800
+ box-shadow: 0 10px 30px rgba(0,0,0,0.15);
801
+ font-family: var(--font-sans, system-ui, sans-serif);
802
+ }
803
+
804
+ .yj-hub-config-head {
805
+ display: flex;
806
+ align-items: center;
807
+ justify-content: space-between;
808
+ padding: 12px 14px;
809
+ border-bottom: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
810
+ }
811
+
812
+ .yj-hub-config-body {
813
+ padding: 0;
814
+ }
815
+
816
+ .yj-hub-config-toolbar {
817
+ padding: 10px 14px;
818
+ display: flex;
819
+ align-items: center;
820
+ }
821
+
822
+ .yj-hub-config-table {
823
+ width: 100%;
824
+ border-collapse: collapse;
825
+ font-size: 12px;
826
+ }
827
+
828
+ .yj-hub-config-table thead th {
829
+ text-align: left;
830
+ padding: 6px 10px;
831
+ border-bottom: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
832
+ color: var(--color-text-secondary, #6E6A63);
833
+ font-weight: var(--font-medium, 500);
834
+ }
835
+
836
+ .yj-hub-config-table tbody td {
837
+ padding: 6px 10px;
838
+ border-bottom: 1px solid var(--color-border-subtle, rgba(0,0,0,0.05));
839
+ vertical-align: middle;
840
+ }
841
+
842
+ .yj-hub-config-table .yj-hc-drag {
843
+ color: var(--color-text-tertiary, #9C988F);
844
+ user-select: none;
845
+ }
846
+
847
+ .yj-hub-config-footer {
848
+ display: flex;
849
+ gap: 8px;
850
+ justify-content: flex-end;
851
+ padding: 10px 14px;
852
+ border-top: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
853
+ }
854
+
855
+ /* Edit modal nested inside the configurator. */
856
+ .yj-hub-config-edit {
857
+ position: fixed;
858
+ inset: 0;
859
+ background: rgba(0,0,0,0.45);
860
+ display: flex;
861
+ align-items: flex-start;
862
+ justify-content: center;
863
+ z-index: 9100;
864
+ padding: 40px 12px;
865
+ }
866
+
867
+ .yj-hub-config-edit-card {
868
+ background: var(--color-bg-surface, #fff);
869
+ border: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
870
+ border-radius: 8px;
871
+ width: min(560px, 100%);
872
+ box-shadow: 0 10px 30px rgba(0,0,0,0.18);
873
+ font-family: var(--font-sans, system-ui, sans-serif);
874
+ }
875
+
876
+ .yj-hub-config-edit-head,
877
+ .yj-hub-config-edit-foot {
878
+ display: flex;
879
+ align-items: center;
880
+ justify-content: space-between;
881
+ padding: 10px 14px;
882
+ border-bottom: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
883
+ }
884
+
885
+ .yj-hub-config-edit-foot {
886
+ border-bottom: 0;
887
+ border-top: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
888
+ justify-content: flex-end;
889
+ gap: 8px;
890
+ }
891
+
892
+ .yj-hub-config-edit-body {
893
+ padding: 12px 14px;
894
+ max-height: 60vh;
895
+ overflow: auto;
896
+ }
897
+
898
+ .yj-hub-config-row {
899
+ display: flex;
900
+ align-items: center;
901
+ gap: 10px;
902
+ margin-bottom: 8px;
903
+ font-size: 12px;
904
+ }
905
+
906
+ .yj-hub-config-row > span {
907
+ flex: 0 0 130px;
908
+ color: var(--color-text-secondary, #6E6A63);
909
+ }
910
+
911
+ .yj-hub-config-row .fi {
912
+ flex: 1;
913
+ font-size: 12px;
914
+ padding: 4px 6px;
915
+ border: 1px solid var(--color-border-default, rgba(0,0,0,0.12));
916
+ border-radius: 4px;
917
+ background: var(--color-bg-subtle, #fafafa);
918
+ }
919
+
920
+ .yj-hub-config-row--block {
921
+ align-items: flex-start;
922
+ }
923
+
924
+ .yj-hub-config-row--block .fi {
925
+ font-family: var(--font-mono, monospace);
926
+ }
927
+
928
+ .yj-hub-config-i18n {
929
+ border: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
930
+ border-radius: 6px;
931
+ padding: 10px 12px;
932
+ margin: 8px 0;
933
+ }
934
+
935
+ .yj-hub-config-i18n legend {
936
+ font-size: 11px;
937
+ color: var(--color-text-secondary, #6E6A63);
938
+ padding: 0 6px;
939
+ }
940
+
941
+ @media (prefers-reduced-motion: reduce) {
942
+ .yj-hub-config-card,
943
+ .yj-hub-config-edit-card {
944
+ transition: none;
945
+ }
946
+ }
947
+
948
+ /* Gear icon button injected into the hub header. */
949
+ .yj-hub-gear {
950
+ border: 1px solid transparent;
951
+ background: transparent;
952
+ color: var(--color-text-secondary, #6E6A63);
953
+ cursor: pointer;
954
+ padding: 4px 6px;
955
+ font-size: 14px;
956
+ border-radius: 4px;
957
+ margin-left: 8px;
958
+ transition: background-color 140ms ease, color 140ms ease;
959
+ }
960
+
961
+ .yj-hub-gear:hover {
962
+ background: var(--color-indigo-50, #ECEFFE);
963
+ color: var(--color-indigo-600, #2D3A8C);
964
+ }
965
+
966
+ .yj-hub-gear:focus-visible {
967
+ outline: 2px solid var(--color-indigo-400, #5A66E8);
968
+ outline-offset: 1px;
969
+ }
970
+
971
+
972
+ /* ----------------------------------------------------------
973
+ DARK MODE
974
+ Si en el futuro se implementa modo oscuro, sobrescribir
975
+ aquí las variables semánticas únicamente. Los tokens
976
+ primitivos (--color-indigo-*, etc.) no cambian.
977
+ ---------------------------------------------------------- */
978
+
979
+ @media (prefers-color-scheme: dark) {
980
+ :root {
981
+ /* Descomentar y ajustar si se activa dark mode */
982
+
983
+ /* --color-bg-page: #0F0E0C; */
984
+ /* --color-bg-surface: #1A1916; */
985
+ /* --color-bg-subtle: #232119; */
986
+ /* --color-bg-muted: #2C2A26; */
987
+
988
+ /* --color-border-subtle: rgba(255,255,255,0.07); */
989
+ /* --color-border-default: rgba(255,255,255,0.12); */
990
+ /* --color-border-strong: rgba(255,255,255,0.20); */
991
+
992
+ /* --color-text-primary: #E8E6E1; */
993
+ /* --color-text-secondary: #A8A49A; */
994
+ /* --color-text-tertiary: #6E6A63; */
995
+ }
996
+ }
997
+
998
+
999
+ /* ----------------------------------------------------------
1000
+ RESET MÍNIMO — Asegurar que los tokens apliquen base
1001
+ ---------------------------------------------------------- */
1002
+
1003
+ *, *::before, *::after {
1004
+ box-sizing: border-box;
1005
+ }
1006
+
1007
+ html {
1008
+ font-size: 16px;
1009
+ -webkit-font-smoothing: antialiased;
1010
+ -moz-osx-font-smoothing: grayscale;
1011
+ }
1012
+
1013
+ body {
1014
+ font-family: var(--font-sans);
1015
+ font-size: var(--text-base);
1016
+ font-weight: var(--font-regular);
1017
+ line-height: var(--leading-normal);
1018
+ color: var(--color-text-primary);
1019
+ background-color: var(--color-bg-page);
1020
+ }
1021
+
1022
+
1023
+ /* ----------------------------------------------------------
1024
+ HUB-SHELL CANONICAL 5-ZONE (Malbec#BUG-44-c1)
1025
+ Sazanami F73 is the visual reference. The 5 zones are tagged
1026
+ on every hub so QA + visual regression specs target by class,
1027
+ not by position. Card grid is uniform 280x340 with thumbnail +
1028
+ primary + description + tags chips + actions inline. Zones
1029
+ adopt Yujin tokens so a tenant theme override propagates
1030
+ without per-hub CSS.
1031
+ ---------------------------------------------------------- */
1032
+
1033
+ .yj-hub-shell {
1034
+ display: block;
1035
+ font-family: var(--font-sans, system-ui, sans-serif);
1036
+ color: var(--color-text-primary, #1A1815);
1037
+ }
1038
+
1039
+ /* Zone 1 already styled above as .yj-hub-tabs */
1040
+
1041
+ .yj-hub-zone-2 {
1042
+ /* title + counter row */
1043
+ margin-top: 0;
1044
+ margin-bottom: 14px;
1045
+ }
1046
+ .yj-hub-zone-2 h2 {
1047
+ font-family: var(--font-display, var(--font-sans));
1048
+ font-size: var(--text-2xl, 24px);
1049
+ font-weight: var(--font-medium, 500);
1050
+ letter-spacing: -0.01em;
1051
+ margin: 0;
1052
+ }
1053
+ .yj-hub-counter {
1054
+ align-self: center;
1055
+ font-size: var(--text-xs, 11px);
1056
+ color: var(--color-text-tertiary, #908B82);
1057
+ letter-spacing: 0.04em;
1058
+ }
1059
+
1060
+ .yj-hub-zone-3 {
1061
+ /* search + sector + restore + new */
1062
+ display: flex;
1063
+ flex-wrap: wrap;
1064
+ gap: 10px;
1065
+ align-items: center;
1066
+ margin-bottom: 12px;
1067
+ }
1068
+ .yj-hub-new {
1069
+ margin-left: auto;
1070
+ }
1071
+
1072
+ .yj-hub-zone-4,
1073
+ .yj-hub-grid {
1074
+ /* UR-2 (Malbec #830): cards reverted from 280x340 (BUG-44-c7) to
1075
+ UR canonical 200x168 / 200x200 (Catalogo). Aligned with
1076
+ crm_desa/demos/unified_renderers/assets/sumie-tokens.css y la
1077
+ spec UNIFIED_RENDERERS_LINEAMIENTO.md seccion 1 (Zona 4) +
1078
+ seccion 2 (Card structure). */
1079
+ display: grid;
1080
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1081
+ gap: 12px;
1082
+ margin-bottom: 14px;
1083
+ }
1084
+
1085
+ .yj-hub-card {
1086
+ background: var(--color-teal-100, #D5EAE3);
1087
+ border: 1px solid var(--color-teal-200, #B5E7E0);
1088
+ border-radius: 10px;
1089
+ padding: 12px;
1090
+ height: 168px;
1091
+ display: flex;
1092
+ flex-direction: column;
1093
+ gap: 8px;
1094
+ cursor: pointer;
1095
+ position: relative;
1096
+ overflow: hidden;
1097
+ transition: border-color 160ms ease, box-shadow 160ms ease,
1098
+ transform 160ms ease;
1099
+ }
1100
+ /* Catalog tab: cards crecen para acomodar el toggle Activar/Desactivar
1101
+ en el footer. */
1102
+ .yj-hub-zone-4[data-tab="catalog"] .yj-hub-card,
1103
+ .yj-panel[data-panel="catalog"] .yj-hub-card,
1104
+ .yj-panel[data-panel="catalog"] .yj-card {
1105
+ height: 200px;
1106
+ }
1107
+ .yj-hub-card:hover {
1108
+ border-color: var(--color-indigo-400, #5A66E8);
1109
+ box-shadow: 0 4px 16px rgba(45, 58, 140, 0.06);
1110
+ }
1111
+ .yj-hub-card:focus-visible {
1112
+ outline: 2px solid var(--color-indigo-500, #4955BC);
1113
+ outline-offset: 2px;
1114
+ }
1115
+ .yj-hub-card__thumb {
1116
+ align-self: center;
1117
+ width: 64px;
1118
+ height: 64px;
1119
+ display: flex;
1120
+ align-items: center;
1121
+ justify-content: center;
1122
+ color: var(--color-text-secondary, #6E6A63);
1123
+ }
1124
+ .yj-hub-card__title {
1125
+ font-size: var(--text-base, 14px);
1126
+ font-weight: var(--font-medium, 500);
1127
+ color: var(--color-text-primary, #1A1815);
1128
+ line-height: 1.3;
1129
+ margin: 0;
1130
+ display: -webkit-box;
1131
+ -webkit-line-clamp: 2;
1132
+ -webkit-box-orient: vertical;
1133
+ overflow: hidden;
1134
+ }
1135
+ .yj-hub-card__desc {
1136
+ font-size: var(--text-xs, 12px);
1137
+ color: var(--color-text-secondary, #6E6A63);
1138
+ line-height: 1.4;
1139
+ flex: 1;
1140
+ display: -webkit-box;
1141
+ -webkit-line-clamp: 4;
1142
+ -webkit-box-orient: vertical;
1143
+ overflow: hidden;
1144
+ }
1145
+ .yj-hub-card__tags {
1146
+ display: flex;
1147
+ flex-wrap: wrap;
1148
+ gap: 4px;
1149
+ margin-top: auto;
1150
+ }
1151
+ .yj-hub-card__tag {
1152
+ font-size: 10px;
1153
+ padding: 2px 6px;
1154
+ border-radius: 4px;
1155
+ background: var(--color-bg-subtle, rgba(0,0,0,0.04));
1156
+ color: var(--color-text-tertiary, #908B82);
1157
+ letter-spacing: 0.02em;
1158
+ }
1159
+ .yj-hub-card__actions {
1160
+ display: flex;
1161
+ flex-wrap: wrap;
1162
+ gap: 4px;
1163
+ border-top: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
1164
+ padding-top: 8px;
1165
+ }
1166
+ .yj-hub-card__action {
1167
+ font-size: 11px;
1168
+ padding: 3px 8px;
1169
+ background: transparent;
1170
+ border: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
1171
+ border-radius: 4px;
1172
+ color: var(--color-text-secondary, #6E6A63);
1173
+ cursor: pointer;
1174
+ }
1175
+ .yj-hub-card__action:hover {
1176
+ border-color: var(--color-indigo-400, #5A66E8);
1177
+ color: var(--color-indigo-600, #2D3A8C);
1178
+ }
1179
+
1180
+ .yj-hub-zone-5,
1181
+ .yj-hub-pagination {
1182
+ text-align: center;
1183
+ margin: 18px 0;
1184
+ }
1185
+
1186
+ @media (prefers-reduced-motion: reduce) {
1187
+ .yj-hub-card,
1188
+ .yj-hub-card:hover {
1189
+ transition: none;
1190
+ transform: none;
1191
+ }
1192
+ }
1193
+
1194
+
1195
+ /* ----------------------------------------------------------
1196
+ DETAIL BREADCRUMB (BUG-44-c15)
1197
+ Crm / NombreHub / NombreItem above the detail topbar. Hub
1198
+ link is interactive (click returns to the hub with state
1199
+ preserved); current item is plain text.
1200
+ ---------------------------------------------------------- */
1201
+ .yj-detail-breadcrumb {
1202
+ font-family: var(--font-sans, system-ui, sans-serif);
1203
+ font-size: 12px;
1204
+ color: var(--color-text-tertiary, #908B82);
1205
+ margin-bottom: 8px;
1206
+ display: flex;
1207
+ flex-wrap: wrap;
1208
+ align-items: center;
1209
+ gap: 4px;
1210
+ }
1211
+ .yj-detail-breadcrumb__home {
1212
+ color: var(--color-text-tertiary, #908B82);
1213
+ }
1214
+ .yj-detail-breadcrumb__sep {
1215
+ color: var(--color-text-tertiary, #908B82);
1216
+ opacity: 0.5;
1217
+ }
1218
+ .yj-detail-breadcrumb__hub-link {
1219
+ color: var(--color-indigo-600, #2D3A8C);
1220
+ text-decoration: none;
1221
+ cursor: pointer;
1222
+ }
1223
+ .yj-detail-breadcrumb__hub-link:hover,
1224
+ .yj-detail-breadcrumb__hub-link:focus-visible {
1225
+ text-decoration: underline;
1226
+ }
1227
+ .yj-detail-breadcrumb__current {
1228
+ color: var(--color-text-primary, #1A1815);
1229
+ font-weight: 500;
1230
+ }
1231
+
1232
+
1233
+ /* ----------------------------------------------------------
1234
+ HUB-STATS PANEL (BUG-44-c14)
1235
+ KPI cards row above zone 3 toolbar. Cards distribute via
1236
+ flex:1 so the row stays edge-to-edge regardless of how many
1237
+ KPIs the descriptor declares.
1238
+ ---------------------------------------------------------- */
1239
+ .yj-hub-stats-panel {
1240
+ margin-bottom: 12px;
1241
+ }
1242
+ .yj-hub-stats-panel .yj-hub-kpi {
1243
+ background: var(--color-bg-surface, #FAF8F5);
1244
+ border: 1px solid var(--color-border-default, rgba(0,0,0,0.08));
1245
+ border-radius: 8px;
1246
+ padding: 10px 14px;
1247
+ min-width: 140px;
1248
+ flex: 1;
1249
+ font-family: var(--font-sans, system-ui, sans-serif);
1250
+ }
1251
+ .yj-hub-stats-panel .yj-hub-kpi-trend {
1252
+ font-size: 11px;
1253
+ margin-left: 6px;
1254
+ }
1255
+
1256
+
1257
+ /* ----------------------------------------------------------
1258
+ HUB MOBILE RESPONSIVE (BUG-44-c16)
1259
+ Viewports <= 768px collapse to a single-column stack:
1260
+ - Cards full-width, height auto.
1261
+ - Tabs overflow-x scroll so a long list does not wrap.
1262
+ - Toolbar (zone 3) stacks vertical so search + sector
1263
+ picker each get full width.
1264
+ - Stats panel KPIs wrap to a 2x2 grid.
1265
+ - "+ New" button drops margin-left:auto so it sits flush.
1266
+ ---------------------------------------------------------- */
1267
+ @media (max-width: 768px) {
1268
+ .yj-hub-zone-1.yj-hub-tabs {
1269
+ flex-wrap: nowrap;
1270
+ overflow-x: auto;
1271
+ overflow-y: hidden;
1272
+ -webkit-overflow-scrolling: touch;
1273
+ }
1274
+ .yj-hub-zone-1.yj-hub-tabs .yj-hub-tab {
1275
+ flex: 0 0 auto;
1276
+ white-space: nowrap;
1277
+ }
1278
+
1279
+ .yj-hub-zone-2 {
1280
+ flex-direction: column;
1281
+ align-items: flex-start;
1282
+ gap: 4px;
1283
+ }
1284
+ .yj-hub-zone-2 .yj-hub-counter {
1285
+ align-self: flex-start;
1286
+ }
1287
+
1288
+ .yj-hub-zone-3 {
1289
+ flex-direction: column;
1290
+ align-items: stretch;
1291
+ }
1292
+ .yj-hub-zone-3 > * {
1293
+ flex: 1 1 auto;
1294
+ width: 100%;
1295
+ max-width: none;
1296
+ }
1297
+ .yj-hub-zone-3 .yj-hub-new {
1298
+ margin-left: 0;
1299
+ }
1300
+
1301
+ .yj-hub-zone-4,
1302
+ .yj-hub-grid {
1303
+ grid-template-columns: 1fr;
1304
+ gap: 10px;
1305
+ }
1306
+ .yj-hub-card {
1307
+ height: auto;
1308
+ min-height: 260px;
1309
+ }
1310
+
1311
+ .yj-hub-stats-panel > div {
1312
+ flex-wrap: wrap;
1313
+ }
1314
+ .yj-hub-stats-panel .yj-hub-kpi {
1315
+ min-width: calc(50% - 5px);
1316
+ flex: 1 1 calc(50% - 5px);
1317
+ }
1318
+
1319
+ /* Detail surface: breadcrumb + topbar action row stack so the
1320
+ small viewport never hides the back button. */
1321
+ .yj-detail-zone-topbar {
1322
+ flex-direction: column;
1323
+ align-items: stretch;
1324
+ gap: 6px;
1325
+ }
1326
+ }
1327
+
1328
+
1329
+ /* ----------------------------------------------------------
1330
+ CONFIRM MODAL + UNDO TOAST (BUG-44-c23)
1331
+ Shared destructive-action UX. Both surfaces use Yujin tokens
1332
+ (color, radius, spacing) so a tenant theme override propagates
1333
+ without re-styling. Reduced-motion override disables the
1334
+ countdown bar animation.
1335
+ ---------------------------------------------------------- */
1336
+ .yj-confirm-modal {
1337
+ position: fixed;
1338
+ inset: 0;
1339
+ z-index: 10000;
1340
+ display: flex;
1341
+ align-items: center;
1342
+ justify-content: center;
1343
+ font-family: var(--font-sans, system-ui, sans-serif);
1344
+ }
1345
+ .yj-confirm-modal__overlay {
1346
+ position: absolute;
1347
+ inset: 0;
1348
+ background: rgba(0,0,0,0.45);
1349
+ }
1350
+ .yj-confirm-modal__card {
1351
+ position: relative;
1352
+ background: var(--color-bg-surface, #FAF8F5);
1353
+ color: var(--color-text-primary, #1A1815);
1354
+ border: 1px solid var(--color-border-default, rgba(0,0,0,0.08));
1355
+ border-radius: 10px;
1356
+ width: min(440px, calc(100vw - 32px));
1357
+ box-shadow: 0 10px 30px rgba(0,0,0,0.18);
1358
+ z-index: 1;
1359
+ overflow: hidden;
1360
+ }
1361
+ .yj-confirm-modal__title {
1362
+ padding: 16px 20px 8px;
1363
+ font-size: 15px;
1364
+ font-weight: 600;
1365
+ }
1366
+ .yj-confirm-modal__body {
1367
+ padding: 0 20px 16px;
1368
+ font-size: 13px;
1369
+ color: var(--color-text-secondary, #6E6A63);
1370
+ line-height: 1.45;
1371
+ }
1372
+ .yj-confirm-modal__footer {
1373
+ display: flex;
1374
+ justify-content: flex-end;
1375
+ gap: 8px;
1376
+ padding: 10px 16px;
1377
+ border-top: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
1378
+ background: var(--color-bg-subtle, rgba(0,0,0,0.03));
1379
+ }
1380
+ .yj-confirm-modal__btn {
1381
+ font-size: 12px;
1382
+ padding: 6px 14px;
1383
+ border-radius: 6px;
1384
+ border: 1px solid var(--color-border-default, rgba(0,0,0,0.10));
1385
+ cursor: pointer;
1386
+ background: transparent;
1387
+ color: var(--color-text-primary, #1A1815);
1388
+ font-family: inherit;
1389
+ }
1390
+ .yj-confirm-modal__btn--ghost:hover {
1391
+ background: var(--color-bg-subtle, rgba(0,0,0,0.05));
1392
+ }
1393
+ .yj-confirm-modal__btn--primary {
1394
+ background: var(--color-indigo-600, #2D3A8C);
1395
+ border-color: var(--color-indigo-600, #2D3A8C);
1396
+ color: #fff;
1397
+ }
1398
+ .yj-confirm-modal__btn--danger {
1399
+ background: var(--color-fg-error, #943020);
1400
+ border-color: var(--color-fg-error, #943020);
1401
+ color: #fff;
1402
+ }
1403
+ .yj-confirm-modal__btn:focus-visible {
1404
+ outline: 2px solid var(--color-indigo-400, #5A66E8);
1405
+ outline-offset: 2px;
1406
+ }
1407
+
1408
+ .yj-undo-toast {
1409
+ position: fixed;
1410
+ bottom: 24px;
1411
+ left: 50%;
1412
+ transform: translateX(-50%);
1413
+ z-index: 10001;
1414
+ display: flex;
1415
+ align-items: center;
1416
+ gap: 12px;
1417
+ padding: 10px 16px;
1418
+ background: var(--color-bg-inverse, #1A1815);
1419
+ color: var(--color-text-inverse, #FAF8F5);
1420
+ border-radius: 8px;
1421
+ box-shadow: 0 6px 24px rgba(0,0,0,0.25);
1422
+ font-family: var(--font-sans, system-ui, sans-serif);
1423
+ font-size: 13px;
1424
+ overflow: hidden;
1425
+ }
1426
+ .yj-undo-toast__msg {
1427
+ flex: 1;
1428
+ }
1429
+ .yj-undo-toast__btn {
1430
+ background: transparent;
1431
+ border: 1px solid var(--color-text-inverse, #FAF8F5);
1432
+ color: inherit;
1433
+ font-size: 11px;
1434
+ padding: 4px 10px;
1435
+ border-radius: 4px;
1436
+ cursor: pointer;
1437
+ font-weight: 600;
1438
+ letter-spacing: 0.04em;
1439
+ text-transform: uppercase;
1440
+ font-family: inherit;
1441
+ }
1442
+ .yj-undo-toast__btn:hover {
1443
+ background: rgba(255,255,255,0.10);
1444
+ }
1445
+ .yj-undo-toast__bar {
1446
+ position: absolute;
1447
+ bottom: 0;
1448
+ left: 0;
1449
+ height: 3px;
1450
+ background: var(--color-indigo-400, #5A66E8);
1451
+ width: 100%;
1452
+ transform-origin: left center;
1453
+ animation: yj-undo-bar 5000ms linear forwards;
1454
+ }
1455
+ @keyframes yj-undo-bar {
1456
+ from { transform: scaleX(1); }
1457
+ to { transform: scaleX(0); }
1458
+ }
1459
+ @media (prefers-reduced-motion: reduce) {
1460
+ .yj-undo-toast__bar {
1461
+ animation: none;
1462
+ opacity: 0.4;
1463
+ }
1464
+ }
1465
+
1466
+ /* =================================================================
1467
+ BUG-44-c29 -- hub item compare side-by-side modal.
1468
+ ----------------------------------------------------------------
1469
+ Full-viewport overlay + centered dialog. Table renders one column
1470
+ per selected item (max 4) and one row per descriptor.compare_fields
1471
+ entry. Diff cells are tinted amber so the user spots divergent
1472
+ values at a glance. On screens <=768px the table flips to a
1473
+ stacked layout: each item header becomes a section and the rows
1474
+ render as label/value pairs.
1475
+ ================================================================= */
1476
+ .yj-compare-modal {
1477
+ position: fixed;
1478
+ inset: 0;
1479
+ z-index: 1100;
1480
+ display: flex;
1481
+ align-items: center;
1482
+ justify-content: center;
1483
+ }
1484
+ .yj-compare-overlay {
1485
+ position: absolute;
1486
+ inset: 0;
1487
+ background: rgba(15, 18, 36, 0.55);
1488
+ }
1489
+ .yj-compare-dialog {
1490
+ position: relative;
1491
+ background: var(--color-bg-surface, #fff);
1492
+ border: 1px solid var(--color-border-subtle, #E2E5EA);
1493
+ border-radius: 8px;
1494
+ box-shadow: 0 18px 48px rgba(0,0,0,0.18);
1495
+ width: min(94vw, 1100px);
1496
+ max-height: 86vh;
1497
+ display: flex;
1498
+ flex-direction: column;
1499
+ overflow: hidden;
1500
+ }
1501
+ .yj-compare-head {
1502
+ display: flex;
1503
+ align-items: center;
1504
+ justify-content: space-between;
1505
+ padding: 12px 18px;
1506
+ border-bottom: 1px solid var(--color-border-subtle, #E2E5EA);
1507
+ }
1508
+ .yj-compare-title {
1509
+ margin: 0;
1510
+ font-size: 16px;
1511
+ font-weight: 600;
1512
+ color: var(--color-text-primary, #15192C);
1513
+ }
1514
+ .yj-compare-close {
1515
+ font-family: inherit;
1516
+ font-size: 14px;
1517
+ line-height: 1;
1518
+ padding: 4px 10px;
1519
+ }
1520
+ .yj-compare-body {
1521
+ padding: 16px 18px;
1522
+ overflow: auto;
1523
+ }
1524
+ .yj-compare-table {
1525
+ width: 100%;
1526
+ border-collapse: collapse;
1527
+ font-size: 12px;
1528
+ color: var(--color-text-primary, #15192C);
1529
+ }
1530
+ .yj-compare-table th,
1531
+ .yj-compare-table td {
1532
+ padding: 8px 10px;
1533
+ text-align: left;
1534
+ vertical-align: top;
1535
+ border-bottom: 1px solid var(--color-border-subtle, #E8ECEF);
1536
+ }
1537
+ .yj-cmp-corner {
1538
+ width: 160px;
1539
+ background: var(--color-bg-subtle, #F5F6F8);
1540
+ }
1541
+ .yj-cmp-col-head {
1542
+ background: var(--color-bg-subtle, #F5F6F8);
1543
+ font-weight: 600;
1544
+ color: var(--color-text-primary, #15192C);
1545
+ text-align: left;
1546
+ }
1547
+ .yj-cmp-row-head {
1548
+ font-weight: 500;
1549
+ color: var(--color-text-secondary, #555);
1550
+ background: var(--color-bg-surface, #fff);
1551
+ }
1552
+ .yj-cmp-cell {
1553
+ font-variant-numeric: tabular-nums;
1554
+ }
1555
+ .yj-cmp-row-diff,
1556
+ .yj-cmp-cell-diff {
1557
+ background: var(--color-amber-50, #FEF6E2);
1558
+ }
1559
+ .yj-cmp-cell-diff {
1560
+ font-weight: 500;
1561
+ }
1562
+ .yj-cmp-null {
1563
+ color: var(--color-text-tertiary, #9AA0AC);
1564
+ font-style: italic;
1565
+ }
1566
+ @media (max-width: 768px) {
1567
+ .yj-compare-dialog {
1568
+ width: 96vw;
1569
+ max-height: 94vh;
1570
+ }
1571
+ /* Stack the table: each column becomes its own labelled section.
1572
+ Rows turn into label + value pairs so a phone screen can scroll
1573
+ vertically without horizontal overflow. */
1574
+ .yj-compare-table,
1575
+ .yj-compare-table thead,
1576
+ .yj-compare-table tbody,
1577
+ .yj-compare-table tr,
1578
+ .yj-compare-table th,
1579
+ .yj-compare-table td {
1580
+ display: block;
1581
+ }
1582
+ .yj-compare-table thead {
1583
+ display: none;
1584
+ }
1585
+ .yj-compare-table tr {
1586
+ border-top: 2px solid var(--color-border-subtle, #E2E5EA);
1587
+ padding: 8px 0;
1588
+ }
1589
+ .yj-cmp-row-head {
1590
+ font-weight: 600;
1591
+ background: transparent;
1592
+ padding-left: 0;
1593
+ }
1594
+ .yj-cmp-cell {
1595
+ padding-left: 18px;
1596
+ border-bottom: none;
1597
+ }
1598
+ }
1599
+
1600
+ /* =================================================================
1601
+ BUG-44-c30 -- hub help button (`?` icon next to the hub title).
1602
+ ----------------------------------------------------------------
1603
+ Compact circular icon styled like the existing yj-hub-gear so the
1604
+ header row stays visually balanced. Hover applies a soft indigo
1605
+ tint; focus-visible exposes the system focus ring per a11y.
1606
+ ================================================================= */
1607
+ .yj-hub-help {
1608
+ display: inline-flex;
1609
+ align-items: center;
1610
+ justify-content: center;
1611
+ width: 20px;
1612
+ height: 20px;
1613
+ margin-left: 8px;
1614
+ padding: 0;
1615
+ border: 1px solid var(--color-border-subtle, #D8DCE2);
1616
+ background: var(--color-bg-surface, #fff);
1617
+ color: var(--color-text-secondary, #555);
1618
+ border-radius: 50%;
1619
+ font-family: inherit;
1620
+ font-size: 12px;
1621
+ font-weight: 600;
1622
+ line-height: 1;
1623
+ cursor: pointer;
1624
+ vertical-align: middle;
1625
+ transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
1626
+ }
1627
+ .yj-hub-help:hover {
1628
+ background: var(--color-indigo-50, #ECEFFE);
1629
+ color: var(--color-indigo-600, #4350D8);
1630
+ border-color: var(--color-indigo-200, #A0A8F5);
1631
+ }
1632
+ .yj-hub-help:focus-visible {
1633
+ outline: 2px solid var(--color-indigo-500, #5A66E8);
1634
+ outline-offset: 2px;
1635
+ }
1636
+
1637
+ /* =================================================================
1638
+ BUG-44-c37 -- hub item drag reorder visuals.
1639
+ ----------------------------------------------------------------
1640
+ Card under HTML5 drag gets a half-opacity + rotated tilt so the
1641
+ user sees the floating ghost. Cursor=grab on hover communicates
1642
+ the affordance; cursor=grabbing during drag.
1643
+ ================================================================= */
1644
+ .cc-card[draggable="true"] {
1645
+ cursor: grab;
1646
+ }
1647
+ .cc-card[draggable="true"]:active {
1648
+ cursor: grabbing;
1649
+ }
1650
+ .cc-card.yj-dnd-dragging {
1651
+ opacity: 0.5;
1652
+ transform: rotate(-1deg);
1653
+ cursor: grabbing;
1654
+ }
1655
+ @media (prefers-reduced-motion: reduce) {
1656
+ .cc-card.yj-dnd-dragging {
1657
+ transform: none;
1658
+ }
1659
+ }
1660
+
1661
+ /* =================================================================
1662
+ BUG-44-c38 -- hub error boundary state.
1663
+ ----------------------------------------------------------------
1664
+ Mirrors the empty-state visual but tinted red so the user
1665
+ recognises a fault vs an empty data set. The retrying variant
1666
+ keeps the icon + message + countdown; the final variant adds a
1667
+ detail row with the original error + an optional request_id +
1668
+ the Reintentar CTA. Both variants stay accessible via role=alert
1669
+ / status + aria-live announcements.
1670
+ ================================================================= */
1671
+ .yj-hub-error-state {
1672
+ display: flex;
1673
+ flex-direction: column;
1674
+ align-items: center;
1675
+ justify-content: center;
1676
+ gap: 8px;
1677
+ color: var(--color-text-primary, #15192C);
1678
+ background: var(--color-bg-surface, #fff);
1679
+ border: 1px solid var(--color-rose-200, #F4B7C0);
1680
+ border-radius: 8px;
1681
+ margin: 12px 0;
1682
+ }
1683
+ .yj-hub-error-icon {
1684
+ font-size: 28px;
1685
+ color: var(--color-rose-500, #D94060);
1686
+ line-height: 1;
1687
+ }
1688
+ .yj-hub-error-msg {
1689
+ font-size: 14px;
1690
+ font-weight: 500;
1691
+ color: var(--color-rose-700, #9A2640);
1692
+ }
1693
+ .yj-hub-error-detail {
1694
+ font-size: 12px;
1695
+ color: var(--color-text-secondary, #666);
1696
+ font-family: monospace, monospace;
1697
+ max-width: 480px;
1698
+ word-break: break-word;
1699
+ }
1700
+ .yj-hub-error-reqid {
1701
+ font-size: 11px;
1702
+ color: var(--color-text-tertiary, #999);
1703
+ font-family: monospace, monospace;
1704
+ }
1705
+ .yj-hub-error-retry {
1706
+ margin-top: 14px;
1707
+ }
1708
+ .yj-hub-error-retrying {
1709
+ border-color: var(--color-amber-200, #F7E2A0);
1710
+ background: var(--color-amber-50, #FEF6E2);
1711
+ }
1712
+ .yj-hub-error-retrying .yj-hub-error-icon {
1713
+ color: var(--color-amber-600, #B8862C);
1714
+ }
1715
+ .yj-hub-error-retrying .yj-hub-error-msg {
1716
+ color: var(--color-amber-700, #8A6320);
1717
+ }
1718
+
1719
+ /* =================================================================
1720
+ BUG-44-c42 -- hub print preview + browser print.
1721
+ ----------------------------------------------------------------
1722
+ The print mode appends a .yj-hub-print-host to <body> + flips
1723
+ document.body.yj-printing on. The @media print rules hide every
1724
+ chrome element (sidebar, topbar, toolbars, action buttons, gear
1725
+ icons) and reveal only the print host. The .yj-print-only class
1726
+ matches the host's outer wrapper so screen rendering hides it
1727
+ while print rendering surfaces it.
1728
+ ================================================================= */
1729
+ .yj-print-only {
1730
+ display: none;
1731
+ }
1732
+ .yj-hub-print-host {
1733
+ background: #fff;
1734
+ color: #000;
1735
+ font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
1736
+ font-size: 11px;
1737
+ }
1738
+ .yj-hub-print-header h1 {
1739
+ margin: 0 0 8px 0;
1740
+ font-size: 18px;
1741
+ }
1742
+ .yj-hub-print-meta {
1743
+ border-collapse: collapse;
1744
+ margin-bottom: 14px;
1745
+ font-size: 10px;
1746
+ }
1747
+ .yj-hub-print-meta th {
1748
+ text-align: right;
1749
+ padding: 1px 8px 1px 0;
1750
+ color: #555;
1751
+ font-weight: 500;
1752
+ }
1753
+ .yj-hub-print-meta td {
1754
+ padding: 1px 0;
1755
+ }
1756
+ .yj-hub-print-grid {
1757
+ width: 100%;
1758
+ border-collapse: collapse;
1759
+ font-size: 10px;
1760
+ }
1761
+ .yj-hub-print-grid th,
1762
+ .yj-hub-print-grid td {
1763
+ border: 1px solid #888;
1764
+ padding: 4px 6px;
1765
+ text-align: left;
1766
+ vertical-align: top;
1767
+ }
1768
+ .yj-hub-print-grid thead th {
1769
+ background: #eee;
1770
+ font-weight: 600;
1771
+ }
1772
+ .yj-hub-print-grid tbody tr:nth-child(even) {
1773
+ background: #f7f7f7;
1774
+ }
1775
+ @media print {
1776
+ /* Show only the print host. Everything else collapses. */
1777
+ body.yj-printing .yj-print-only {
1778
+ display: block;
1779
+ }
1780
+ body.yj-printing > *:not(.yj-print-only) {
1781
+ display: none !important;
1782
+ }
1783
+ /* Defensive hides for chrome that may live deeper in the tree. */
1784
+ .yj-sidebar,
1785
+ .yj-topbar,
1786
+ .hs-toolbar,
1787
+ .yj-hub-counter,
1788
+ .yj-hub-gear,
1789
+ .yj-hub-help,
1790
+ .yj-hub-share,
1791
+ .yj-hub-export,
1792
+ .yj-hub-print,
1793
+ .yj-hub-bulkbar,
1794
+ .yj-action-button,
1795
+ .yj-gear-icon,
1796
+ .yj-hub-tabs,
1797
+ #hs-loadmore-host,
1798
+ .yj-hub-shell .yj-hub-zone-3,
1799
+ .yj-hub-shell .yj-hub-zone-5 {
1800
+ display: none !important;
1801
+ }
1802
+ /* Page break + print-area sizing. */
1803
+ .yj-hub-print-host {
1804
+ page-break-inside: avoid;
1805
+ }
1806
+ .yj-hub-print-grid tr {
1807
+ page-break-inside: avoid;
1808
+ }
1809
+ }
1810
+
1811
+ /* =================================================================
1812
+ BUG-44-c43 -- hub URL embeddable iframe.
1813
+ ----------------------------------------------------------------
1814
+ When yujin.php sees ?embed=true it stamps body.yj-embed. The CSS
1815
+ layer collapses every chrome element so the hub stands alone in
1816
+ the iframe viewport (no sidebar, no topbar, no admin gear, no
1817
+ write actions). The token-scope guard inside the JS layer
1818
+ (_yujinHubEmbedHasScope) further constrains UX surfaces; this
1819
+ block is the visual baseline.
1820
+ ================================================================= */
1821
+ body.yj-embed {
1822
+ background: var(--color-bg-app, #fff);
1823
+ margin: 0;
1824
+ padding: 0;
1825
+ }
1826
+ body.yj-embed .yj-sidebar,
1827
+ body.yj-embed #app-sidebar,
1828
+ body.yj-embed .yj-topbar,
1829
+ body.yj-embed #app-topbar,
1830
+ body.yj-embed .yj-skip-to-content,
1831
+ body.yj-embed .yj-hub-gear,
1832
+ body.yj-embed .yj-hub-new,
1833
+ body.yj-embed .yj-hub-bulkbar,
1834
+ body.yj-embed .yj-hub-select-toggle,
1835
+ body.yj-embed .yj-hub-bulk-btn,
1836
+ body.yj-embed .yj-hub-bulk-cancel,
1837
+ body.yj-embed .yj-hub-save-view,
1838
+ body.yj-embed .yj-hub-import-btn,
1839
+ body.yj-embed .yj-hub-catalog-btn,
1840
+ body.yj-embed .yj-hub-card-action[data-write="1"] {
1841
+ display: none !important;
1842
+ }
1843
+ body.yj-embed #content,
1844
+ body.yj-embed main {
1845
+ margin: 0;
1846
+ padding: 12px;
1847
+ }
1848
+ body.yj-embed .yj-hub-shell {
1849
+ margin: 0;
1850
+ }
1851
+ /* Slightly smaller toolbar font in embed mode -- partner sites
1852
+ often render the iframe at narrow widths. */
1853
+ body.yj-embed .hs-toolbar {
1854
+ font-size: 11px;
1855
+ gap: 6px;
1856
+ }
1857
+
1858
+ /* =================================================================
1859
+ BUG-44-c47 -- inline quick-edit on hub cards.
1860
+ ----------------------------------------------------------------
1861
+ The .yj-hub-card__quick-edit row sits at the bottom of the card
1862
+ between the actions and the bottom edge. Cells flip between a
1863
+ read-only display + an editable input on click; .yj-quick-edit-
1864
+ active highlights the active cell; .yj-quick-edit-error pulses
1865
+ rose to surface a server-side rollback.
1866
+ ================================================================= */
1867
+ .yj-hub-card__quick-edit {
1868
+ display: flex;
1869
+ flex-wrap: wrap;
1870
+ gap: 6px;
1871
+ margin-top: 8px;
1872
+ padding-top: 8px;
1873
+ border-top: 1px solid var(--color-border-subtle, #E2E5EA);
1874
+ font-size: 11px;
1875
+ }
1876
+ .yj-quick-edit-cell {
1877
+ display: inline-flex;
1878
+ align-items: center;
1879
+ gap: 4px;
1880
+ padding: 2px 6px;
1881
+ background: var(--color-bg-subtle, #F5F6F8);
1882
+ border: 1px solid transparent;
1883
+ border-radius: 4px;
1884
+ cursor: pointer;
1885
+ outline: none;
1886
+ transition: border-color 120ms ease, background 120ms ease;
1887
+ }
1888
+ .yj-quick-edit-cell:hover,
1889
+ .yj-quick-edit-cell:focus-visible {
1890
+ border-color: var(--color-indigo-200, #A0A8F5);
1891
+ background: var(--color-indigo-50, #ECEFFE);
1892
+ }
1893
+ .yj-quick-edit-cell.yj-quick-edit-active {
1894
+ background: var(--color-bg-surface, #fff);
1895
+ border-color: var(--color-indigo-500, #5A66E8);
1896
+ cursor: text;
1897
+ }
1898
+ .yj-quick-edit-cell.yj-quick-edit-error {
1899
+ background: var(--color-rose-50, #FCE9EE);
1900
+ border-color: var(--color-rose-500, #D94060);
1901
+ animation: yj-quick-edit-shake 320ms ease-in-out;
1902
+ }
1903
+ .yj-quick-edit-label {
1904
+ color: var(--color-text-tertiary, #999);
1905
+ font-weight: 500;
1906
+ }
1907
+ .yj-quick-edit-value {
1908
+ color: var(--color-text-primary, #15192C);
1909
+ max-width: 120px;
1910
+ overflow: hidden;
1911
+ text-overflow: ellipsis;
1912
+ white-space: nowrap;
1913
+ }
1914
+ .yj-quick-edit-input {
1915
+ font-family: inherit;
1916
+ font-size: 11px;
1917
+ padding: 1px 4px;
1918
+ border: none;
1919
+ outline: none;
1920
+ background: transparent;
1921
+ min-width: 80px;
1922
+ max-width: 180px;
1923
+ }
1924
+ @keyframes yj-quick-edit-shake {
1925
+ 0%, 100% { transform: translateX(0); }
1926
+ 20% { transform: translateX(-3px); }
1927
+ 60% { transform: translateX(3px); }
1928
+ }
1929
+ @media (prefers-reduced-motion: reduce) {
1930
+ .yj-quick-edit-cell.yj-quick-edit-error {
1931
+ animation: none;
1932
+ }
1933
+ }
1934
+
1935
+ /* =================================================================
1936
+ BUG-44-c48 -- per-hub command palette modal.
1937
+ ----------------------------------------------------------------
1938
+ Centered dialog 480px wide; input on top + filtered list below.
1939
+ Active item gets indigo bg; kbd shortcuts render to the right of
1940
+ each label in monospace.
1941
+ ================================================================= */
1942
+ .yj-cmdpal-modal {
1943
+ position: fixed;
1944
+ inset: 0;
1945
+ z-index: 1200;
1946
+ display: flex;
1947
+ align-items: flex-start;
1948
+ justify-content: center;
1949
+ padding-top: 12vh;
1950
+ }
1951
+ .yj-cmdpal-overlay {
1952
+ position: absolute;
1953
+ inset: 0;
1954
+ background: rgba(15, 18, 36, 0.45);
1955
+ }
1956
+ .yj-cmdpal-dialog {
1957
+ position: relative;
1958
+ width: min(94vw, 480px);
1959
+ background: var(--color-bg-surface, #fff);
1960
+ border: 1px solid var(--color-border-subtle, #E2E5EA);
1961
+ border-radius: 8px;
1962
+ box-shadow: 0 18px 48px rgba(0,0,0,0.18);
1963
+ overflow: hidden;
1964
+ }
1965
+ .yj-cmdpal-input {
1966
+ width: 100%;
1967
+ border: none;
1968
+ border-bottom: 1px solid var(--color-border-subtle, #E2E5EA);
1969
+ padding: 12px 14px;
1970
+ font-size: 14px;
1971
+ font-family: inherit;
1972
+ outline: none;
1973
+ background: transparent;
1974
+ color: var(--color-text-primary, #15192C);
1975
+ }
1976
+ .yj-cmdpal-list {
1977
+ list-style: none;
1978
+ margin: 0;
1979
+ padding: 4px 0;
1980
+ max-height: 50vh;
1981
+ overflow-y: auto;
1982
+ font-size: 13px;
1983
+ }
1984
+ .yj-cmdpal-item {
1985
+ display: flex;
1986
+ align-items: center;
1987
+ justify-content: space-between;
1988
+ padding: 7px 14px;
1989
+ cursor: pointer;
1990
+ color: var(--color-text-primary, #15192C);
1991
+ }
1992
+ .yj-cmdpal-item:hover {
1993
+ background: var(--color-bg-subtle, #F5F6F8);
1994
+ }
1995
+ .yj-cmdpal-active,
1996
+ .yj-cmdpal-active:hover {
1997
+ background: var(--color-indigo-50, #ECEFFE);
1998
+ color: var(--color-indigo-700, #3540C0);
1999
+ }
2000
+ .yj-cmdpal-kbd {
2001
+ font-family: monospace, monospace;
2002
+ font-size: 10px;
2003
+ padding: 1px 6px;
2004
+ border: 1px solid var(--color-border-subtle, #D8DCE2);
2005
+ border-radius: 3px;
2006
+ background: var(--color-bg-subtle, #F5F6F8);
2007
+ color: var(--color-text-secondary, #666);
2008
+ }
2009
+
2010
+ /* =================================================================
2011
+ BUG-44-c56 -- hub virtual columns row.
2012
+ ================================================================= */
2013
+ .yj-hub-card__vcol-row {
2014
+ display: flex;
2015
+ flex-wrap: wrap;
2016
+ gap: 6px;
2017
+ margin: 6px 0;
2018
+ font-size: 11px;
2019
+ }
2020
+ .yj-hub-card__vcol {
2021
+ display: inline-flex;
2022
+ align-items: center;
2023
+ gap: 4px;
2024
+ padding: 2px 6px;
2025
+ background: var(--color-violet-50, #F3EEFC);
2026
+ border: 1px solid var(--color-violet-200, #D4C2F0);
2027
+ border-radius: 3px;
2028
+ color: var(--color-violet-700, #5A2E9E);
2029
+ }
2030
+ .yj-hub-card__vcol-label {
2031
+ font-weight: 500;
2032
+ color: var(--color-violet-700, #5A2E9E);
2033
+ }
2034
+ .yj-hub-card__vcol-value {
2035
+ font-variant-numeric: tabular-nums;
2036
+ font-weight: 600;
2037
+ }
2038
+ .yj-vcol-null {
2039
+ color: var(--color-text-tertiary, #9AA0AC);
2040
+ font-style: italic;
2041
+ }
2042
+
2043
+ /* =================================================================
2044
+ BUG-44-c58 -- explicit light/dark theme tokens.
2045
+ ----------------------------------------------------------------
2046
+ Three modes:
2047
+ - body.yj-theme-light force light regardless of system pref
2048
+ - body.yj-theme-dark force dark regardless of system pref
2049
+ - body.yj-theme-auto follow @media prefers-color-scheme
2050
+ The class is set by JS reading crm_users.preferred_theme. The
2051
+ primitives (--color-indigo-*, etc) stay constant; only the
2052
+ semantic tokens swap.
2053
+ ================================================================= */
2054
+
2055
+ body.yj-theme-dark,
2056
+ body.yj-theme-auto[data-system-prefers="dark"] {
2057
+ --color-bg-page: #0F0E0C;
2058
+ --color-bg-app: #15140F;
2059
+ --color-bg-surface: #1A1916;
2060
+ --color-bg-subtle: #232119;
2061
+ --color-bg-muted: #2C2A26;
2062
+ --color-border-subtle: rgba(255,255,255,0.07);
2063
+ --color-border-default: rgba(255,255,255,0.14);
2064
+ --color-border-strong: rgba(255,255,255,0.22);
2065
+ --color-text-primary: #E8E6E1;
2066
+ --color-text-secondary: #A8A49A;
2067
+ --color-text-tertiary: #6E6A63;
2068
+ /* Card + chip backgrounds tinted toward warmer dark to soften
2069
+ the harsh pure-grey of CRMs that flip to default Bootstrap dark. */
2070
+ --color-indigo-50: #1F2249;
2071
+ --color-indigo-200: #3A4290;
2072
+ --color-amber-50: #2A2412;
2073
+ --color-amber-200: #4A3F1A;
2074
+ --color-rose-50: #2A1419;
2075
+ --color-rose-200: #4A1F2A;
2076
+ --color-violet-50: #251A35;
2077
+ --color-violet-200: #3A285A;
2078
+ }
2079
+ body.yj-theme-light,
2080
+ body.yj-theme-auto[data-system-prefers="light"] {
2081
+ /* Light is the implicit default; we explicitly pin the canonical
2082
+ tokens here so an admin who flips a tenant from auto -> light
2083
+ does not depend on the @media pref staying defaulted. */
2084
+ --color-bg-page: #FAFAF7;
2085
+ --color-bg-app: #FFFFFF;
2086
+ --color-bg-surface: #FFFFFF;
2087
+ --color-bg-subtle: #F5F6F8;
2088
+ --color-bg-muted: #ECEDEF;
2089
+ --color-text-primary: #15192C;
2090
+ --color-text-secondary: #555;
2091
+ --color-text-tertiary: #888;
2092
+ }
2093
+
2094
+ /* Topbar toggle button. Pinned to the topbar via JS; the icon
2095
+ swaps between sun (light mode active) and moon (dark mode active)
2096
+ so the affordance reads at a glance. */
2097
+ .yj-theme-toggle {
2098
+ display: inline-flex;
2099
+ align-items: center;
2100
+ justify-content: center;
2101
+ width: 24px;
2102
+ height: 24px;
2103
+ padding: 0;
2104
+ border: 1px solid var(--color-border-subtle, #E2E5EA);
2105
+ background: var(--color-bg-surface, #fff);
2106
+ color: var(--color-text-secondary, #555);
2107
+ border-radius: 50%;
2108
+ cursor: pointer;
2109
+ font-size: 13px;
2110
+ line-height: 1;
2111
+ transition: background 120ms ease, color 120ms ease;
2112
+ }
2113
+ .yj-theme-toggle:hover {
2114
+ background: var(--color-indigo-50, #ECEFFE);
2115
+ color: var(--color-indigo-600, #4350D8);
2116
+ }
2117
+ .yj-theme-toggle:focus-visible {
2118
+ outline: 2px solid var(--color-indigo-500, #5A66E8);
2119
+ outline-offset: 2px;
2120
+ }
2121
+
2122
+
2123
+ /* ==========================================================
2124
+ UR-2 (Malbec #830) -- Unified Renderers card / hub-shell
2125
+ classes (sourced from crm_desa/demos/unified_renderers/
2126
+ assets/sumie-tokens.css). Coexist with .yj-hub-* classes
2127
+ from BUG-44 c1..c70 -- NEW UR descriptors mount with
2128
+ .yj-card; legacy hubs keep .yj-hub-card (now 168/200).
2129
+ Spec autoritativa: docs/UNIFIED_RENDERERS_LINEAMIENTO.md
2130
+ ========================================================== */
2131
+
2132
+ /* ---- ZONA 1: tabs (auto-generadas por hub.tabs_kind) ---- */
2133
+ .yj-hub-zone-1 {
2134
+ margin-bottom: 16px;
2135
+ border-bottom: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
2136
+ }
2137
+ .yj-tabs {
2138
+ display: flex;
2139
+ gap: 8px;
2140
+ }
2141
+ .yj-tab {
2142
+ background: transparent;
2143
+ border: none;
2144
+ border-bottom: 2px solid transparent;
2145
+ padding: 12px 16px;
2146
+ font-size: 14px;
2147
+ font-weight: 600;
2148
+ color: var(--color-text-secondary, #615E58);
2149
+ cursor: pointer;
2150
+ font-family: inherit;
2151
+ transition: color 0.15s ease, border-color 0.15s ease;
2152
+ }
2153
+ .yj-tab:hover { color: var(--color-text-primary, #1A1815); }
2154
+ .yj-tab[aria-selected="true"] {
2155
+ color: var(--color-indigo-600, #2D3A8C);
2156
+ border-bottom-color: var(--color-indigo-600, #2D3A8C);
2157
+ }
2158
+
2159
+ /* ---- ZONA 4: paneles activos / runs / catalog ---- */
2160
+ .yj-panel[hidden] { display: none; }
2161
+
2162
+ /* ---- Card grid (UR canonical) ---- */
2163
+ .yj-card-grid {
2164
+ display: grid;
2165
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
2166
+ gap: 12px;
2167
+ }
2168
+
2169
+ .yj-card {
2170
+ position: relative;
2171
+ display: flex;
2172
+ flex-direction: column;
2173
+ align-items: flex-start;
2174
+ text-align: left;
2175
+ background: var(--color-teal-100, #D5EAE3);
2176
+ border: 1px solid var(--color-teal-200, #B5E7E0);
2177
+ border-radius: 10px;
2178
+ padding: 12px;
2179
+ cursor: pointer;
2180
+ font-family: inherit;
2181
+ color: inherit;
2182
+ width: 100%;
2183
+ height: 168px;
2184
+ box-sizing: border-box;
2185
+ overflow: hidden;
2186
+ transition: transform 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
2187
+ }
2188
+ .yj-card:hover {
2189
+ transform: translateY(-2px);
2190
+ box-shadow: 0 4px 12px rgba(45, 58, 140, 0.10);
2191
+ }
2192
+ .yj-card:focus-visible {
2193
+ outline: 2px solid var(--color-indigo-500, #5A66E8);
2194
+ outline-offset: 2px;
2195
+ }
2196
+ .yj-panel[data-panel="catalog"] .yj-card[data-active="false"] {
2197
+ opacity: 0.55;
2198
+ background: var(--color-teal-50, #ECF5F2);
2199
+ }
2200
+
2201
+ /* Kanji a TRASLUZ esquina superior derecha (watermark) */
2202
+ .yj-card-kanji-wm {
2203
+ position: absolute;
2204
+ top: -2px;
2205
+ right: 4px;
2206
+ font-family: var(--font-display, "Noto Serif JP", Georgia, serif);
2207
+ font-size: 52px;
2208
+ font-weight: 300;
2209
+ line-height: 1;
2210
+ color: var(--color-indigo-600, #2D3A8C);
2211
+ opacity: 0.12;
2212
+ pointer-events: none;
2213
+ user-select: none;
2214
+ }
2215
+
2216
+ /* Badge sumi-e top-left con icono SVG */
2217
+ .yj-card-badge {
2218
+ width: 44px;
2219
+ height: 44px;
2220
+ background: var(--color-teal-50, #ECF5F2);
2221
+ border-radius: 8px;
2222
+ margin-bottom: 8px;
2223
+ display: flex;
2224
+ align-items: center;
2225
+ justify-content: center;
2226
+ position: relative;
2227
+ background-image:
2228
+ radial-gradient(circle at 20% 30%, rgba(45, 58, 140, 0.08) 0%, transparent 40%),
2229
+ radial-gradient(circle at 70% 60%, rgba(45, 58, 140, 0.06) 0%, transparent 50%);
2230
+ color: var(--color-indigo-600, #2D3A8C);
2231
+ flex-shrink: 0;
2232
+ }
2233
+ .yj-sumie {
2234
+ width: 28px;
2235
+ height: 28px;
2236
+ fill: none;
2237
+ stroke: currentColor;
2238
+ stroke-width: 1.5;
2239
+ stroke-linecap: round;
2240
+ stroke-linejoin: round;
2241
+ }
2242
+ .yj-sumie .ink-fill { fill: currentColor; stroke: none; }
2243
+
2244
+ .yj-card-body {
2245
+ flex: 1;
2246
+ position: relative;
2247
+ z-index: 1;
2248
+ min-height: 0;
2249
+ width: 100%;
2250
+ overflow: hidden;
2251
+ }
2252
+ .yj-card-title {
2253
+ font-size: 13px;
2254
+ font-weight: 700;
2255
+ margin: 0 0 4px 0;
2256
+ color: var(--color-text-primary, #1A1815);
2257
+ line-height: 1.3;
2258
+ display: -webkit-box;
2259
+ -webkit-line-clamp: 2;
2260
+ -webkit-box-orient: vertical;
2261
+ overflow: hidden;
2262
+ }
2263
+ .yj-card-desc {
2264
+ font-size: 11px;
2265
+ color: var(--color-text-secondary, #615E58);
2266
+ margin: 0;
2267
+ line-height: 1.4;
2268
+ display: -webkit-box;
2269
+ -webkit-line-clamp: 3;
2270
+ -webkit-box-orient: vertical;
2271
+ overflow: hidden;
2272
+ }
2273
+
2274
+ /* Footer card con toggle Activar/Desactivar (solo tab Catalogo) */
2275
+ .yj-card-footer {
2276
+ margin-top: 8px;
2277
+ width: 100%;
2278
+ display: none;
2279
+ flex-shrink: 0;
2280
+ }
2281
+ .yj-panel[data-panel="catalog"] .yj-card-footer { display: flex; }
2282
+ .yj-panel[data-panel="catalog"] .yj-card { height: 200px; }
2283
+ .yj-card-toggle {
2284
+ width: 100%;
2285
+ font-size: 11px;
2286
+ padding: 6px 8px;
2287
+ }
2288
+ .yj-card[data-active="true"] .yj-card-toggle {
2289
+ border-color: var(--color-rose-500, #B0455F);
2290
+ color: var(--color-rose-500, #B0455F);
2291
+ }
2292
+ .yj-card[data-active="false"] .yj-card-toggle {
2293
+ background: var(--color-indigo-600, #2D3A8C);
2294
+ border-color: var(--color-indigo-600, #2D3A8C);
2295
+ color: white;
2296
+ }
2297
+
2298
+ /* ---- Runs table (tab Ejecuciones) ---- */
2299
+ .yj-runs {
2300
+ width: 100%;
2301
+ border-collapse: collapse;
2302
+ background: var(--color-bg-surface, #FFFFFF);
2303
+ border: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
2304
+ border-radius: 8px;
2305
+ overflow: hidden;
2306
+ font-size: 13px;
2307
+ }
2308
+ .yj-runs thead th {
2309
+ background: var(--color-teal-50, #ECF5F2);
2310
+ text-align: left;
2311
+ padding: 12px 16px;
2312
+ font-weight: 600;
2313
+ font-size: 12px;
2314
+ color: var(--color-text-secondary, #615E58);
2315
+ text-transform: uppercase;
2316
+ letter-spacing: 0.04em;
2317
+ }
2318
+ .yj-runs tbody tr {
2319
+ border-top: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
2320
+ cursor: pointer;
2321
+ transition: background 0.1s ease;
2322
+ }
2323
+ .yj-runs tbody tr:hover { background: var(--color-teal-50, #ECF5F2); }
2324
+ .yj-runs tbody td { padding: 12px 16px; vertical-align: middle; }
2325
+
2326
+ .yj-status-badge {
2327
+ display: inline-block;
2328
+ padding: 2px 8px;
2329
+ border-radius: 4px;
2330
+ font-size: 11px;
2331
+ font-weight: 600;
2332
+ text-transform: uppercase;
2333
+ letter-spacing: 0.04em;
2334
+ }
2335
+ .yj-status-badge.ok { background: var(--color-teal-100, #D5EAE3); color: #1B6B5C; }
2336
+ .yj-status-badge.fail { background: #FCE3E3; color: var(--color-rose-500, #B0455F); }
2337
+
2338
+ /* Run detail (drill-down inline) */
2339
+ .yj-run-detail {
2340
+ margin-top: 16px;
2341
+ background: var(--color-bg-surface, #FFFFFF);
2342
+ border: 1px solid var(--color-border-subtle, rgba(0,0,0,0.07));
2343
+ border-radius: 8px;
2344
+ padding: 16px 24px;
2345
+ }
2346
+ .yj-run-detail header {
2347
+ display: flex;
2348
+ justify-content: space-between;
2349
+ align-items: center;
2350
+ margin-bottom: 12px;
2351
+ }
2352
+ .yj-run-detail h3 {
2353
+ margin: 0;
2354
+ font-size: 16px;
2355
+ font-family: var(--font-display, "Noto Serif JP", Georgia, serif);
2356
+ }
2357
+ .yj-run-detail pre {
2358
+ background: #1A1815;
2359
+ color: #E0F0EC;
2360
+ padding: 16px;
2361
+ border-radius: 6px;
2362
+ font-family: "SFMono-Regular", Menlo, Consolas, monospace;
2363
+ font-size: 12px;
2364
+ line-height: 1.5;
2365
+ overflow-x: auto;
2366
+ margin: 0;
2367
+ }
2368
+
2369
+ /* Empty state */
2370
+ .yj-empty {
2371
+ text-align: center;
2372
+ padding: 32px 24px;
2373
+ color: var(--color-text-secondary, #615E58);
2374
+ font-size: 14px;
2375
+ background: var(--color-bg-surface, #FFFFFF);
2376
+ border: 1px dashed var(--color-border-subtle, rgba(0,0,0,0.07));
2377
+ border-radius: 8px;
2378
+ }
2379
+
2380
+ @media (prefers-reduced-motion: reduce) {
2381
+ .yj-card,
2382
+ .yj-card:hover {
2383
+ transition: none;
2384
+ transform: none;
2385
+ }
2386
+ }