@muten/shadcn 0.0.5 → 0.1.0

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 (213) hide show
  1. package/AGENTS.md +61 -6
  2. package/README.md +57 -4
  3. package/globals.css +30 -2
  4. package/kit.css +2763 -0
  5. package/motion.css +79 -0
  6. package/nova.css +1387 -0
  7. package/package.json +10 -2
  8. package/registry/accordion.muten +11 -10
  9. package/registry/agenda.js +35 -0
  10. package/registry/agenda.muten +10 -0
  11. package/registry/alert-dialog.muten +9 -12
  12. package/registry/alert.muten +8 -8
  13. package/registry/app-shell.js +9 -0
  14. package/registry/app-shell.muten +12 -0
  15. package/registry/attachment.muten +13 -9
  16. package/registry/avatar.muten +24 -5
  17. package/registry/badge.muten +23 -8
  18. package/registry/band.muten +16 -0
  19. package/registry/bar-chart.muten +7 -0
  20. package/registry/bell.muten +3 -0
  21. package/registry/bento.muten +6 -9
  22. package/registry/booking.js +21 -0
  23. package/registry/booking.muten +13 -0
  24. package/registry/breadcrumb.muten +9 -7
  25. package/registry/button-group.muten +13 -4
  26. package/registry/button.muten +21 -8
  27. package/registry/calendar.js +28 -93
  28. package/registry/calendar.muten +9 -8
  29. package/registry/canvas-viewport.js +12 -5
  30. package/registry/canvas-viewport.muten +9 -9
  31. package/registry/card-field.muten +4 -0
  32. package/registry/card.muten +12 -8
  33. package/registry/carousel.js +5 -36
  34. package/registry/carousel.muten +12 -5
  35. package/registry/chatbot.muten +9 -0
  36. package/registry/checklist.muten +6 -0
  37. package/registry/choice-list.muten +16 -0
  38. package/registry/code.js +14 -12
  39. package/registry/code.muten +6 -7
  40. package/registry/collapsible.muten +14 -10
  41. package/registry/color-picker.js +460 -41
  42. package/registry/color-picker.muten +7 -6
  43. package/registry/combobox.js +5 -0
  44. package/registry/combobox.muten +6 -23
  45. package/registry/command-palette.muten +8 -12
  46. package/registry/command.js +32 -0
  47. package/registry/command.muten +32 -11
  48. package/registry/context-menu.muten +9 -8
  49. package/registry/count-up.muten +5 -10
  50. package/registry/date-field.js +5 -0
  51. package/registry/date-field.muten +7 -0
  52. package/registry/device-frame.muten +8 -0
  53. package/registry/dialog.muten +6 -12
  54. package/registry/dirty-bar.js +19 -0
  55. package/registry/dirty-bar.muten +13 -0
  56. package/registry/drawer.muten +6 -11
  57. package/registry/dropdown-menu.muten +37 -13
  58. package/registry/empty.muten +11 -7
  59. package/registry/feature-grid.muten +10 -12
  60. package/registry/feature-rows.muten +12 -8
  61. package/registry/field-behavior.js +33 -0
  62. package/registry/field-behavior.muten +9 -0
  63. package/registry/field.muten +26 -7
  64. package/registry/file-input.js +36 -21
  65. package/registry/file-input.muten +8 -7
  66. package/registry/fixed-card.muten +25 -0
  67. package/registry/folder-picker.js +13 -15
  68. package/registry/folder-picker.muten +5 -8
  69. package/registry/gradient-blinds.muten +6 -13
  70. package/registry/hover-card.muten +7 -9
  71. package/registry/image-upload.js +5 -0
  72. package/registry/image-upload.muten +8 -0
  73. package/registry/indicator.muten +5 -0
  74. package/registry/input-group.muten +27 -4
  75. package/registry/input-otp.js +8 -35
  76. package/registry/input-otp.muten +6 -6
  77. package/registry/input.muten +8 -7
  78. package/registry/inspector.muten +13 -15
  79. package/registry/island.js +7 -0
  80. package/registry/island.muten +5 -0
  81. package/registry/item.muten +20 -7
  82. package/registry/kbd.muten +3 -3
  83. package/registry/kit/board.js +300 -0
  84. package/registry/kit/collections.js +148 -0
  85. package/registry/kit/core.js +989 -0
  86. package/registry/kit/dates.js +106 -0
  87. package/registry/kit/menus.js +90 -0
  88. package/registry/kit/overlays.js +114 -0
  89. package/registry/kit/paint.js +211 -0
  90. package/registry/kit/qrcode.js +2291 -0
  91. package/registry/kit/structure.js +393 -0
  92. package/registry/kit/table.js +198 -0
  93. package/registry/kit/values.js +179 -0
  94. package/registry/kit-layer.js +2 -0
  95. package/registry/kit-layer.muten +5 -0
  96. package/registry/kit-skeleton.js +24 -0
  97. package/registry/kit-skeleton.muten +16 -0
  98. package/registry/kit-widget.js +79 -0
  99. package/registry/kit-widget.muten +4 -0
  100. package/registry/link-btn.muten +9 -7
  101. package/registry/live-stack.js +29 -0
  102. package/registry/live-stack.muten +7 -0
  103. package/registry/logo-cloud.muten +6 -11
  104. package/registry/member-list.muten +6 -0
  105. package/registry/menubar.muten +10 -14
  106. package/registry/message-scroller.js +12 -0
  107. package/registry/message-scroller.muten +8 -4
  108. package/registry/message.muten +27 -10
  109. package/registry/messaging.muten +11 -0
  110. package/registry/modal-behavior.js +56 -0
  111. package/registry/modal-behavior.muten +4 -0
  112. package/registry/modal.muten +29 -0
  113. package/registry/money-field.js +5 -0
  114. package/registry/money-field.muten +7 -0
  115. package/registry/nav-button.muten +14 -0
  116. package/registry/navigation-menu.muten +16 -14
  117. package/registry/navpill.muten +15 -9
  118. package/registry/new-appointment.js +8 -0
  119. package/registry/new-appointment.muten +10 -0
  120. package/registry/number-field.js +34 -24
  121. package/registry/number-field.muten +8 -6
  122. package/registry/order-board.js +6 -0
  123. package/registry/order-board.muten +21 -0
  124. package/registry/overlay-behavior.js +13 -0
  125. package/registry/overlay-behavior.muten +4 -0
  126. package/registry/pagination-nav.js +6 -0
  127. package/registry/pagination-nav.muten +8 -0
  128. package/registry/pagination.muten +12 -9
  129. package/registry/password-field.muten +3 -0
  130. package/registry/permission-matrix.muten +6 -0
  131. package/registry/phone-field.js +5 -0
  132. package/registry/phone-field.muten +7 -0
  133. package/registry/phone-shell.js +7 -0
  134. package/registry/phone-shell.muten +9 -0
  135. package/registry/pill.muten +6 -5
  136. package/registry/plans.muten +4 -0
  137. package/registry/popover.muten +16 -9
  138. package/registry/pricing.muten +21 -21
  139. package/registry/progress.muten +5 -5
  140. package/registry/queue.muten +3 -0
  141. package/registry/radio-group.muten +16 -8
  142. package/registry/range-slider.js +9 -24
  143. package/registry/range-slider.muten +4 -5
  144. package/registry/resizable.js +34 -27
  145. package/registry/resizable.muten +16 -5
  146. package/registry/roving-behavior.js +16 -0
  147. package/registry/roving-behavior.muten +3 -0
  148. package/registry/row-menu.js +5 -0
  149. package/registry/row-menu.muten +5 -0
  150. package/registry/save-button.muten +11 -0
  151. package/registry/scale-slider.js +7 -0
  152. package/registry/scale-slider.muten +9 -0
  153. package/registry/scroll-area.muten +8 -4
  154. package/registry/segmented-control.muten +8 -8
  155. package/registry/separator.muten +3 -3
  156. package/registry/share-button.js +7 -0
  157. package/registry/share-button.muten +10 -0
  158. package/registry/sheet.muten +6 -10
  159. package/registry/sidebar.muten +23 -15
  160. package/registry/skeleton.muten +6 -4
  161. package/registry/slider.js +73 -27
  162. package/registry/slider.muten +6 -6
  163. package/registry/sortable-behavior.js +43 -0
  164. package/registry/sortable-behavior.muten +2 -0
  165. package/registry/sortable-list.js +10 -26
  166. package/registry/sortable-list.muten +6 -7
  167. package/registry/sortable.muten +15 -0
  168. package/registry/spark.js +14 -0
  169. package/registry/spark.muten +3 -0
  170. package/registry/spinner.muten +4 -3
  171. package/registry/split-button.muten +12 -10
  172. package/registry/stamp-card.muten +7 -0
  173. package/registry/stat-band.muten +6 -9
  174. package/registry/stat.muten +23 -0
  175. package/registry/status-bar.muten +7 -6
  176. package/registry/stepper.muten +17 -14
  177. package/registry/store-qr.js +5 -0
  178. package/registry/store-qr.muten +5 -0
  179. package/registry/swatch.muten +8 -8
  180. package/registry/switch.muten +14 -6
  181. package/registry/table-view.muten +10 -0
  182. package/registry/tabs-behavior.js +27 -0
  183. package/registry/tabs-behavior.muten +3 -0
  184. package/registry/tabs.muten +19 -10
  185. package/registry/tag-input.js +4 -27
  186. package/registry/tag-input.muten +6 -6
  187. package/registry/text.muten +7 -0
  188. package/registry/time-field.js +5 -0
  189. package/registry/time-field.muten +6 -0
  190. package/registry/timeline.muten +14 -14
  191. package/registry/toaster.js +34 -22
  192. package/registry/toaster.muten +10 -8
  193. package/registry/toggle-group.muten +11 -6
  194. package/registry/toggle.muten +8 -5
  195. package/registry/toolbar.muten +11 -6
  196. package/registry/tooltip.muten +6 -9
  197. package/registry/tree-view.js +27 -7
  198. package/registry/tree-view.muten +8 -13
  199. package/registry/vector-field.muten +9 -8
  200. package/registry/virtual-list.js +5 -0
  201. package/registry/virtual-list.muten +6 -0
  202. package/registry/weekly-hours.muten +4 -0
  203. package/registry/wordline.muten +6 -0
  204. package/registry/zoom-control.muten +9 -9
  205. package/registry.json +868 -424
  206. package/themes/bloom.css +53 -0
  207. package/themes/editorial.css +65 -0
  208. package/themes/noir.css +54 -0
  209. package/registry/chart.js +0 -34
  210. package/registry/chart.muten +0 -7
  211. package/registry/checkbox.muten +0 -8
  212. package/registry/context-menu.js +0 -34
  213. package/registry/select.muten +0 -21
package/kit.css ADDED
@@ -0,0 +1,2763 @@
1
+ /* @muten/shadcn · kit layer: what the library adds on top of Nova (import after nova.css, `class="style-nova"` on <html>).
2
+ It is the reference artifact's own CSS, as is, so every component is 1:1 with it:
3
+ 1. muten adapters (this block): what changes because muten renders an Icon as span.mu-icon > svg, a Stack as a
4
+ flex column, and a dynamic value through a CSS var.
5
+ 2. lib · the generic layer (tokens, skins, atoms, fields, overlays, pickers, cards, tables, carousel…)
6
+ 3. sys · the system kit (agenda, messaging, chat, numbers, settings, billing, team, skeletons…)
7
+ 4. pk · the color picker 5. mslider · the slider
8
+ Edit the artifact first, then copy here: the artifact is the reference. */
9
+
10
+ /* ── 1. muten adapters ── */
11
+ /* A Nova component that is a plain block in shadcn must not inherit muten's flex column; one Nova says is a row stays
12
+ a row. Unlayered + zero specificity: beats muten's base layer, loses to every Nova/kit rule that sets a display. */
13
+ :where(.style-nova .mu-stack[data-slot]) { display: block; } /* a Nova part is a plain div until Nova says otherwise */
14
+ /* Every library class was written for a <div>, whose flex default is a ROW; muten's Stack defaults to a column. */
15
+ :where(.style-nova .mu-stack[class*="cx-"], .style-nova .mu-stack[class*="cn-"], .style-nova .mu-nav[class*="cx-"]) { flex-direction: row; }
16
+ /* The generic card's header item keeps one line per text, like the artifact's .cx-ellipsis spans. */
17
+ .cn-card-header > .cn-item .cn-item-title, .cn-card-header > .cn-item .cn-item-description { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
18
+ /* The kit's layout helpers on a muten Stack: a row stays a row. */
19
+ /* The artifact's inline styles, as classes (muten writes no inline style). Same values. */
20
+ .cx-stat-body { display: flex; flex-direction: column; gap: 6px; padding: 14px 14px 12px; }
21
+ .cx-stat-row { display: flex; flex-direction: row; align-items: center; justify-content: space-between; flex-wrap: nowrap; gap: 6px; }
22
+ .cx-stat-ic:empty { display: none; }
23
+ .cx-gap-6 { gap: 6px; }
24
+ .cx-stat-ic > .mu-icon { font-size: 15px; }
25
+ /* Icons: span.mu-icon wraps the svg; it sits like the svg would. */
26
+ .style-nova .mu-icon { display: inline-flex; flex: none; line-height: 1; }
27
+ /* Avatar tone: a hue per person, chosen from data (tone 1-8) since muten does not hash names. */
28
+ .cn-avatar[data-tone] { --h: 230; }
29
+ .cn-avatar[data-tone] .cn-avatar-fallback { background: color-mix(in srgb, oklch(0.62 0.13 var(--h)) 22%, var(--background)); color: color-mix(in srgb, oklch(0.55 0.14 var(--h)) 50%, var(--foreground)); font-weight: 600; }
30
+ .cn-avatar[data-tone="1"] { --h: 25; } .cn-avatar[data-tone="2"] { --h: 70; } .cn-avatar[data-tone="3"] { --h: 140; } .cn-avatar[data-tone="4"] { --h: 190; }
31
+ .cn-avatar[data-tone="5"] { --h: 230; } .cn-avatar[data-tone="6"] { --h: 280; } .cn-avatar[data-tone="7"] { --h: 320; } .cn-avatar[data-tone="8"] { --h: 0; }
32
+ /* Alert: Nova's grid keys on a direct <svg>; give span.mu-icon the same place. */
33
+ .style-nova .cn-alert:has(> .mu-icon) { grid-template-columns: auto 1fr; column-gap: .5rem; }
34
+ .style-nova .cn-alert > .mu-icon { grid-row: span 2; translate: 0 .125rem; font-size: 16px; }
35
+ .cn-alert[data-tone="info"] > .mu-icon { color: var(--info); } .cn-alert[data-tone="ok"] > .mu-icon { color: var(--success); } .cn-alert[data-tone="wait"] > .mu-icon { color: var(--warning); }
36
+ .cn-alert[data-tone="wait"] { background: color-mix(in srgb, var(--warning) 6%, var(--card)); }
37
+ /* Progress: the value rides --w (muten's style(w: …)); Nova's flex-1 would stretch it to full. */
38
+ .cn-progress > .cn-progress-indicator:not([style*="transform"]) { flex: none; width: var(--w, 0%); transition: width 260ms cubic-bezier(.22, 1, .36, 1); }
39
+ /* Skeleton: the shimmer on Nova's block (the kit's own .cx-sk keeps working for Customs). */
40
+ .cn-skeleton { background: linear-gradient(90deg, var(--sk-a) 0%, var(--sk-b) 50%, var(--sk-a) 100%); background-size: 200% 100%; animation: cx-sk 1.3s linear infinite; }
41
+ .cn-skeleton[data-shape="circle"], .cn-skeleton[data-shape="pill"] { border-radius: 99px; }
42
+ @media (prefers-reduced-motion: reduce) { .cn-skeleton { animation: none; } }
43
+ /* Modal from muten: the root's data-open drives what the artifact's JS drove with data-state + [hidden]. Closed, the
44
+ layers stay mounted but invisible and inert; visibility flips only after the exit has played (no flicker). */
45
+ .cx-modal-root[data-open="true"] > .cx-overlay { opacity: 1; }
46
+ .cx-modal-root[data-open="true"] > .cx-modal[data-mode="dialog"] { transform: translate(-50%, -50%); opacity: 1; }
47
+ .cx-modal-root[data-open="true"] > .cx-modal[data-mode="drawer"] { transform: translateY(0); }
48
+ .cx-modal-root:not([data-open="true"]) > .cx-overlay, .cx-modal-root:not([data-open="true"]) > .cx-modal { visibility: hidden; pointer-events: none; transition-property: opacity, transform, visibility; transition-delay: 0s, 0s, 460ms; }
49
+ .cx-modal-root > .cx-overlay { border: 0; padding: 0; cursor: default; }
50
+ .cx-modal-head > .cx-modal-title { font-size: 16px; font-weight: 600; color: var(--popover-foreground); }
51
+ .cx-modal-desc { color: var(--muted-foreground); font-size: 14px; }
52
+ .cx-modal-desc:empty { display: none; }
53
+ .cx-modal-behavior { display: none; }
54
+ /* auto mode before the first open (no flash): dialog wide, drawer on a phone */
55
+ .cx-modal[data-mode="auto"] { visibility: hidden; }
56
+ /* Field from muten: an empty description/label must not take a row. The switch row's «why» is the artifact's <p>. */
57
+ .cn-field > .cn-label:empty, .cn-field > .cn-field-description:empty { display: none; }
58
+ .cx-switch-row > .cx-switch-why { grid-column: 1; margin: 0; font-size: 13px; color: var(--muted-foreground); line-height: 1.45; }
59
+ .cx-switch-row > .cx-switch-why:empty { display: none; }
60
+ .cx-switch-row > .cn-switch { margin-top: 1px; }
61
+ /* Tokens swatches from muten (the artifact paints them with <i style>): the color rides --c. */
62
+ .cx-sw > .cx-sw-i { width: 22px; height: 22px; border-radius: 6px; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--foreground) 15%, transparent); flex: none; background: var(--c); }
63
+ .cx-z > .cx-z-code { font: 12px var(--font-mono); color: var(--muted-foreground); }
64
+ .cx-z > .cx-z-v { font: 600 12px var(--font-mono); text-align: right; }
65
+ .cx-z > .cx-z-i { height: 8px; width: var(--w); border-radius: 99px; background: var(--selected); opacity: .25; }
66
+ /* Nav: the chosen one rides aria-pressed (muten writes aria-current="false" too, which [aria-current] would match). */
67
+ .style-nova .cn-button.cx-nav[aria-pressed="true"][aria-pressed][aria-pressed] {
68
+ background: var(--selected-soft); color: var(--selected); position: relative;
69
+ }
70
+ .cx-nav[aria-pressed="true"]::after { content: ""; position: absolute; left: 50%; bottom: 3px; width: 4px; height: 4px; margin-left: -2px; border-radius: 99px; background: var(--selected); }
71
+ /* Chip: a removed chip leaves with the kit's fade (muten keeps it until the animation ends). */
72
+ .cx-chip.mu-leave { animation: cx-chip-out 160ms ease forwards; }
73
+ .cx-tabs-behavior { display: none; }
74
+ .cx-tab-panel.hidden { display: none; }
75
+ /* Items that are buttons (a ChoiceItem): a row, not a centred label. */
76
+ button.cn-item { width: 100%; font: inherit; text-align: left; cursor: pointer; }
77
+ .cx-roving-behavior, .cx-sortable-behavior { display: none; }
78
+ .cx-grip > .mu-icon { font-size: 16px; }
79
+ /* Row3 from muten (the artifact writes <div><b><small>). */
80
+ .cx-row3 > .cx-row3-who { display: block; min-width: 0; }
81
+ .cx-row3 .cx-row3-t { font-weight: 500; display: block; }
82
+ .cx-row3 .cx-row3-s { color: var(--muted-foreground); font-size: 13px; }
83
+ .cx-row3 .cx-row3-s:empty { display: none; }
84
+ .cx-empty-mini > .mu-icon { font-size: 22px; color: var(--success); }
85
+ /* Text atom from a part: data-variant comes from data(), same rules as the kit's .cx-text below. */
86
+ /* Button icon motion, for span.mu-icon (the kit's rules below key on svg). */
87
+ @media (hover: hover) and (prefers-reduced-motion: no-preference) {
88
+ .cn-button > .mu-icon { transition: transform 180ms cubic-bezier(.22, 1, .36, 1); }
89
+ .cn-button:not(:disabled):hover > .mu-icon:last-child:not(:first-child) { transform: translateX(2px); }
90
+ .cn-button:not(:disabled):hover > .mu-icon:first-child:not(:last-child) { transform: scale(1.12); }
91
+ .cn-button:not(:disabled):hover > .mu-icon:only-child { transform: scale(1.12); }
92
+ }
93
+
94
+
95
+ /* ═════════════════════════ 1b. the artifact page's library rules (floating panels, drawer, svg size, checkbox, toasts) ═════════════════════════ */
96
+ .pg-pop { position: fixed; top: 0; left: 0; z-index: 60; }
97
+ .pg-drw-o { position: fixed; inset: 0; z-index: 50; background: rgb(0 0 0 / .3); backdrop-filter: blur(8px); opacity: 0; transition: opacity 450ms cubic-bezier(0.22, 1, 0.36, 1); }
98
+ .pg-drw-o[data-state="open"] { opacity: 1; }
99
+ .pg-drw { position: fixed; z-index: 50; margin: 8px; display: flex; flex-direction: column; border-radius: 24px; border: 1px solid var(--popover); background: var(--popover); color: var(--popover-foreground); font-size: 14px; box-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1); transition: transform 450ms cubic-bezier(0.22, 1, 0.36, 1); will-change: transform; outline: none; }
100
+ :root[data-theme="dark"] .pg-drw { border-color: var(--border); }
101
+ .pg-drw[data-dir="right"] { top: 0; right: 0; bottom: 0; width: calc(75% - 16px); max-width: 24rem; transform: translateX(calc(100% + 8px)); }
102
+ .pg-drw[data-dir="bottom"] { left: 0; right: 0; bottom: 0; max-height: calc(100dvh - 6rem); transform: translateY(calc(100% + 8px)); }
103
+ .pg-drw[data-state="open"] { transform: none; }
104
+ .pg-drw-handle { display: none; margin: 12px auto 0; width: 96px; height: 4px; flex: none; border-radius: 99px; background: var(--muted); }
105
+ .pg-drw[data-dir="bottom"] .pg-drw-handle { display: block; }
106
+ .pg-drw[data-dir="bottom"] > * { width: 100%; max-width: 32rem; margin-left: auto; margin-right: auto; }
107
+ .pg-drw-body { display: grid; gap: 8px; padding: 0 16px; overflow: auto; }
108
+ .pg-slot { display: flex; align-items: center; justify-content: space-between; gap: 12px; border: 1px solid var(--border); border-radius: 10px; padding: 10px 12px; cursor: pointer; }
109
+ .pg-slot b { font-weight: 500; } .pg-slot small { color: var(--muted-foreground); font-size: 12.5px; }
110
+ .pg-slot:has([data-state="checked"]) { background: color-mix(in oklch, var(--muted) 60%, transparent); }
111
+ /* icons with no size class get shadcn's default 16px (containers that size them still win) */
112
+ /* an icon with no size of its own is 16 px; an SVG that states its width (a logo, an illustration) keeps it */
113
+ .style-nova :where(svg:not([class*="size-"]):not([width])) { width: 16px; height: 16px; flex-shrink: 0; }
114
+ /* our extra for the checkbox: the check draws itself (shadcn just shows it) */
115
+ .cb-mark { width: 14px; height: 14px; }
116
+ [data-state="unchecked"] > .cn-checkbox-indicator { visibility: hidden; }
117
+ .style-nova .cb-mark path { stroke-dasharray: 24; stroke-dashoffset: 24; }
118
+ .style-nova [data-state="checked"] .cb-mark path { stroke-dashoffset: 0; transition: stroke-dashoffset 200ms cubic-bezier(0.22, 1, 0.36, 1) 40ms; }
119
+ .style-nova [data-state="checked"] > .cn-checkbox-indicator { visibility: visible; }
120
+ .style-nova .cn-checkbox { transition: background-color 150ms, border-color 150ms, color 150ms; }
121
+ .style-nova .cn-checkbox:active { scale: .92; transition: scale 100ms; }
122
+ /* the toast, as shadcn's current one (Base UI): stack, peek, expand */
123
+ .pg-toasts { position: fixed; z-index: 70; right: 16px; bottom: 16px; width: calc(100% - 32px); max-width: 384px; pointer-events: none; }
124
+ .pg-toast { position: absolute; right: 0; bottom: 0; width: 100%; pointer-events: auto; transform-origin: bottom; border-radius: calc(var(--radius) * 1.8); border: 1px solid var(--border); background: var(--popover); color: var(--popover-foreground); box-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);
125
+ --gap: .75rem; --peek: .75rem; --scale: max(0, 1 - var(--i) * 0.1); --shrink: calc(1 - var(--scale));
126
+ height: var(--front-h); z-index: calc(1000 - var(--i));
127
+ transform: translateY(calc(0px - var(--i) * var(--peek) - var(--shrink) * var(--front-h))) scale(var(--scale));
128
+ transition: transform 500ms cubic-bezier(0.22, 1, 0.36, 1), opacity 500ms, height 150ms; will-change: transform; }
129
+ .pg-toast::after { content: ""; position: absolute; top: 100%; left: 0; width: 100%; height: calc(var(--gap) + 1px); }
130
+ .pg-toasts[data-expanded] .pg-toast { height: var(--h); transform: translateY(calc(0px - var(--off) - var(--i) * var(--gap))); }
131
+ .pg-toast[data-start], .pg-toast[data-end] { transform: translateY(150%) !important; }
132
+ .pg-toast[data-limited] { opacity: 0; }
133
+ .pg-toast-c { display: flex; height: 100%; align-items: center; gap: 12px; overflow: hidden; padding: 16px; transition: opacity 250ms cubic-bezier(0.22, 1, 0.36, 1); }
134
+ .pg-toast[data-behind] .pg-toast-c { opacity: 0; }
135
+ .pg-toasts[data-expanded] .pg-toast-c { opacity: 1; }
136
+ .pg-toast-t { font-size: 14px; font-weight: 500; } .pg-toast-d { font-size: 14px; color: var(--muted-foreground); }
137
+ @media (prefers-reduced-motion: reduce) { .pg-toast, .pg-vaul { transition-duration: 1ms !important; } }
138
+
139
+ .pg-acc-icon { margin-left: auto; color: var(--muted-foreground); pointer-events: none; flex-shrink: 0; }
140
+ .pg-acc-open { display: none; }
141
+ [aria-expanded="true"] > .pg-acc-closed { display: none; } [aria-expanded="true"] > .pg-acc-open { display: inline; }
142
+
143
+ /* floating panels animate with enter/exit only: their position must never transition (shadcn's Radix places them with a transform) */
144
+ .pg-pop { transition-property: none !important; }
145
+ /* an exit animation keeps its last frame: with fill-mode none the panel snaps back to full opacity before it is hidden (the flicker) */
146
+ [data-state="closed"] { animation-fill-mode: forwards !important; }
147
+ .pg-drw.dragging, .pg-drw-o.dragging { transition: none !important; }
148
+ .pg-drw { touch-action: none; }
149
+ .pg-drw-body { touch-action: pan-y; }
150
+
151
+ /* spinner (shadcn's animate-spin) */
152
+ @keyframes pg-spin { to { transform: rotate(360deg); } }
153
+ .animate-spin { animation: pg-spin 1s linear infinite; }
154
+ .cn-progress-indicator { transition: transform 450ms ease; }
155
+ /* native select: options readable in both themes */
156
+ .pg-opt-native { background: var(--popover); color: var(--popover-foreground); }
157
+ /* textarea counter (our extra) */
158
+ .pg-count { display: flex; justify-content: space-between; gap: 12px; }
159
+ .pg-count-n { font-size: 12px; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
160
+ .pg-count-n.full { color: var(--destructive); }
161
+ /* tooltip wrappers on avatars keep the group's ring */
162
+ .pg-tipwrap { display: inline-flex; }
163
+ .cn-avatar-group .pg-tipwrap > [data-slot=avatar], .cn-avatar-group .pg-tipwrap > [data-slot=avatar-group-count] { box-shadow: 0 0 0 2px var(--background); }
164
+ /* select (ours): search row, list, highlighted item */
165
+ .pg-select { position: relative; width: 100%; }
166
+ .pg-sel-search { display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 10px; border-bottom: 1px solid var(--border); color: var(--muted-foreground); }
167
+ .pg-sel-search input { flex: 1; min-width: 0; border: 0; outline: none; background: transparent; color: var(--foreground); font-size: 14px; }
168
+ .pg-sel-search input::placeholder { color: var(--muted-foreground); }
169
+ .pg-sel-list { max-height: 240px; overflow-y: auto; }
170
+ .cn-select-content[data-slot] { max-height: 300px; overflow: hidden; display: flex; flex-direction: column; }
171
+ .cn-select-content > .cn-select-group:not(.pg-sel-list) { overflow-y: auto; }
172
+ .pg-sel-empty { padding: 20px 8px; text-align: center; font-size: 14px; color: var(--muted-foreground); }
173
+ .pg-sel-loading { display: inline-flex; align-items: center; gap: 8px; }
174
+ .cn-select-item[data-highlighted] { background: var(--accent); color: var(--accent-foreground); }
175
+ .cn-select-item { cursor: default; }
176
+
177
+
178
+ /* ═════════════════════════ 2. lib ═════════════════════════ */
179
+ /* ═══════════════════════════════════════════════════════════════════════════════════════════════════
180
+ @muten/shadcn · capa genérica (tanda 1). Todo lee tokens: un tema de muten (theme.muten + styling{})
181
+ solo redefine estas variables. Ningún componente trae un color fijo.
182
+ Tokens nuevos sobre los de shadcn:
183
+ --selected / --selected-foreground / --selected-soft lo elegido («estás aquí»): color + punto
184
+ --success · --warning · --info (+ -soft) tonos de estado para badges, avisos y filas
185
+ --overlay fondo de los modales
186
+ --z-* la escala de capas
187
+ ═══════════════════════════════════════════════════════════════════════════════════════════════════ */
188
+ :root { --font-sans: "Geist", ui-sans-serif, system-ui, sans-serif; --font-mono: "Geist Mono", ui-monospace, SFMono-Regular, monospace; }
189
+ .style-nova, [data-skin] {
190
+ --selected: var(--primary); --selected-foreground: var(--primary-foreground);
191
+ --selected-soft: color-mix(in srgb, var(--selected) 12%, transparent);
192
+ --success: oklch(0.55 0.13 155); --success-soft: color-mix(in srgb, var(--success) 14%, transparent);
193
+ --warning: oklch(0.62 0.15 60); --warning-soft: color-mix(in srgb, var(--warning) 16%, transparent);
194
+ --info: oklch(0.55 0.15 255); --info-soft: color-mix(in srgb, var(--info) 14%, transparent);
195
+ --overlay: rgb(0 0 0 / 0.1);
196
+ --on-destructive: oklch(1 0 0);
197
+ --z-content: 0; --z-sticky: 20; --z-fab: 30; --z-popover: 40; --z-sheet: 50; --z-modal: 60; --z-toast: 70;
198
+ }
199
+
200
+ /* ── pieles de ejemplo: lo único que cambia entre apps y tiendas ── */
201
+ [data-skin="storio"] {
202
+ --primary: oklch(0.18 0.01 285); --primary-foreground: oklch(0.99 0 0);
203
+ --selected: #6B46F2; --selected-foreground: #fff;
204
+ --ring: #6B46F2;
205
+ --accent: oklch(0.96 0.015 290); --accent-foreground: oklch(0.2 0.02 290);
206
+ }
207
+ :root[data-theme="dark"] [data-skin="storio"] {
208
+ --primary: oklch(0.96 0 0); --primary-foreground: oklch(0.18 0.01 285);
209
+ --selected: #9B80FF; --selected-foreground: #160d33; --ring: #9B80FF;
210
+ --accent: oklch(0.3 0.03 290); --accent-foreground: oklch(0.97 0 0);
211
+ }
212
+ [data-skin="tienda"] {
213
+ --background: #0F2C24; --foreground: #F3EEE2; --card: #14372D; --card-foreground: #F3EEE2;
214
+ --popover: #163E33; --popover-foreground: #F3EEE2;
215
+ --primary: #E6C470; --primary-foreground: #20190B;
216
+ --secondary: #1D4A3D; --secondary-foreground: #F3EEE2;
217
+ --muted: #1A4337; --muted-foreground: #B5C4B9; --accent: #1F4D40; --accent-foreground: #F3EEE2;
218
+ --border: rgb(243 238 226 / 0.13); --input: rgb(243 238 226 / 0.18); --ring: #E6C470;
219
+ --selected: #E6C470; --selected-foreground: #20190B;
220
+ --destructive: #FF8A80; --overlay: rgb(0 0 0 / 0.35);
221
+ --radius: 1rem;
222
+ color-scheme: dark;
223
+ }
224
+ [data-skin] { color: var(--foreground); }
225
+ .cx-skinbox { background: var(--background); color: var(--foreground); }
226
+
227
+ /* ── Button: the «elegido» state (color + dot, aria-current) and the save button's three moments ── */
228
+ .cn-button[aria-current], .cn-button[aria-pressed="true"].cx-nav {
229
+ background: var(--selected-soft); color: var(--selected); position: relative;
230
+ }
231
+ .cx-nav { position: relative; }
232
+ .cx-nav[aria-current]::after { content: ""; position: absolute; left: 50%; bottom: 3px; width: 4px; height: 4px; margin-left: -2px; border-radius: 99px; background: var(--selected); }
233
+ .cx-create { background: var(--primary); color: var(--primary-foreground); }
234
+ .cx-save { width: 9.25rem; justify-content: center; }
235
+ .cx-save[data-status="saving"] { pointer-events: none; opacity: .85; }
236
+ .cx-save[data-status="saved"] { background: var(--success); color: #fff; animation: cx-pop 260ms cubic-bezier(.22, 1, .36, 1); }
237
+ @keyframes cx-pop { 50% { transform: scale(1.04); } }
238
+ .cx-btn-label { display: inline-flex; align-items: center; gap: 6px; }
239
+
240
+ /* ── Badge tones + dot + removable chip ── */
241
+ .cx-tone-new { background: var(--info-soft); color: var(--info); }
242
+ .cx-tone-ok { background: var(--success-soft); color: var(--success); }
243
+ .cx-tone-wait { background: var(--warning-soft); color: var(--warning); }
244
+ .cx-tone-bad { background: color-mix(in srgb, var(--destructive) 14%, transparent); color: var(--destructive); }
245
+ .cx-tone-pro { background: var(--selected); color: var(--selected-foreground); letter-spacing: .04em; }
246
+ .cx-dot { width: 6px; height: 6px; border-radius: 99px; background: currentColor; flex: none; }
247
+
248
+
249
+
250
+
251
+ @keyframes cx-chip-out { to { opacity: 0; transform: scale(.9); } }
252
+
253
+ /* ── Item: media, price, selectable, draggable; text wraps instead of being cut ── */
254
+ .cx-item .cn-item-title, .cx-item .cn-item-description { white-space: normal; -webkit-line-clamp: unset; line-clamp: unset; display: block; overflow: visible; }
255
+ .cx-media-img { width: 40px; height: 40px; border-radius: calc(var(--radius) * .8); object-fit: cover; flex: none; background: var(--muted); }
256
+ .cx-price { margin-left: auto; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
257
+ .cx-item[data-selectable] { cursor: pointer; }
258
+ .cx-item[data-selectable][aria-checked="true"] { border-color: var(--selected); background: var(--selected-soft); }
259
+ .cx-radio { width: 18px; height: 18px; border-radius: 99px; border: 1.5px solid var(--input); flex: none; display: grid; place-items: center; transition: border-color .15s; }
260
+ [aria-checked="true"] > .cx-radio { border-color: var(--selected); }
261
+ [aria-checked="true"] > .cx-radio::after { content: ""; width: 8px; height: 8px; border-radius: 99px; background: var(--selected); }
262
+
263
+ .cx-sortable .cx-item { transition: transform 180ms cubic-bezier(.22, 1, .36, 1); background: var(--background); }
264
+ .cx-sortable .cx-item.lifting { transition: none; z-index: 2; box-shadow: 0 8px 24px -8px rgb(0 0 0 / .25); position: relative; }
265
+
266
+ /* ── Card de forma fija ── */
267
+ .cx-fixed-card { width: 100%; max-width: 380px; }
268
+ .cx-row3 { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 10px; padding: 8px 0; border-top: 1px solid var(--border); }
269
+ .cx-row3:first-child { border-top: 0; }
270
+ .cx-row3 b { font-weight: 500; display: block; }
271
+ .cx-row3 small { color: var(--muted-foreground); font-size: 13px; }
272
+ .cx-time { font-variant-numeric: tabular-nums; font-weight: 600; font-size: 13px; }
273
+
274
+ /* ── SwitchRow: the switch centred on the label's line, description below ── */
275
+ .cx-switch-row { display: grid; grid-template-columns: 1fr auto; gap: 2px 16px; align-items: start; padding: 12px 0; border-top: 1px solid var(--border); width: 100%; max-width: 420px; }
276
+ .cx-switch-row:first-child { border-top: 0; }
277
+ .cx-switch-row .cn-label { line-height: 20px; }
278
+ .cx-switch-row .cn-switch { margin-top: 1px; }
279
+ .cx-switch-row p { grid-column: 1; margin: 0; font-size: 13px; color: var(--muted-foreground); line-height: 1.45; }
280
+
281
+ /* ── Tabs with a sliding indicator, counts and horizontal scroll on the phone ── */
282
+ .cx-tabs { position: relative; display: flex; gap: 2px; padding: 3px; border-radius: var(--radius); background: var(--muted); width: max-content; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
283
+ .cx-tabs::-webkit-scrollbar { display: none; }
284
+
285
+
286
+
287
+
288
+ .cx-tab-ind { position: absolute; z-index: 0; top: 3px; height: 26px; border-radius: calc(var(--radius) * .8); background: var(--background); box-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1); transition: left 260ms cubic-bezier(.22, 1, .36, 1), width 260ms cubic-bezier(.22, 1, .36, 1); }
289
+ .cx-tabs.line { background: transparent; border-bottom: 1px solid var(--border); border-radius: 0; padding: 0; }
290
+
291
+ .cx-tabs.line .cx-tab-ind { top: auto; bottom: -1px; height: 2px; border-radius: 2px; background: var(--selected); box-shadow: none; }
292
+ .cx-panel { animation: cx-fade 180ms ease; }
293
+ @keyframes cx-fade { from { opacity: 0; } }
294
+
295
+ /* ── Booking picker: week strip + hours in one piece ── */
296
+ .cx-book { width: 100%; max-width: 420px; display: flex; flex-direction: column; gap: 14px; }
297
+ .cx-book-head { display: flex; align-items: center; justify-content: space-between; }
298
+ .cx-book-head b { font-weight: 600; }
299
+ .cx-week { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+ .cx-hours { display: flex; flex-direction: column; gap: 10px; min-height: 172px; }
311
+ .cx-hours h4 { margin: 0; font-size: 12px; font-weight: 500; color: var(--muted-foreground); }
312
+ .cx-hour-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
313
+
314
+
315
+
316
+ .cx-hour-skel { height: 34px; border-radius: calc(var(--radius) * .8); background: var(--muted); animation: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; }
317
+ @keyframes pulse { 50% { opacity: .5; } }
318
+ .cx-book-sum { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-top: 12px; border-top: 1px solid var(--border); font-size: 14px; min-height: 44px; }
319
+ .cx-book-sum span { color: var(--muted-foreground); }
320
+ .cx-book-sum b { color: var(--foreground); font-weight: 600; }
321
+
322
+ /* ── Modal adaptable: Dialog en escritorio, Drawer en el teléfono (o forzado con data-mode) ── */
323
+ .cx-overlay { position: fixed; inset: 0; z-index: var(--z-modal); background: var(--overlay); backdrop-filter: blur(4px); opacity: 0; transition: opacity 160ms ease; }
324
+ .cx-overlay[data-state="open"] { opacity: 1; }
325
+ .cx-modal { position: fixed; z-index: var(--z-modal); display: flex; flex-direction: column; background: var(--popover); color: var(--popover-foreground); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 10%, transparent), 0 20px 25px -5px rgb(0 0 0 / .1); outline: none; font-size: 14px;
326
+ --sheet-space: 16px; --sheet-tight: 8px; }
327
+ .cx-modal-head { display: flex; flex-direction: column; gap: 4px; padding: 16px 48px 12px 16px; }
328
+ .cx-modal-head b { font-size: 16px; font-weight: 600; }
329
+ .cx-modal-head span { color: var(--muted-foreground); }
330
+ .cx-modal-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 4px 16px 16px; display: flex; flex-direction: column; gap: var(--sheet-space); overscroll-behavior: contain; }
331
+ .cx-modal-foot { display: flex; gap: 8px; padding: 12px 16px calc(12px + env(safe-area-inset-bottom, 0px)); border-top: 1px solid var(--border); background: color-mix(in srgb, var(--muted) 50%, transparent); }
332
+ .cx-modal-foot { align-items: center; }
333
+ .cx-modal-foot .cn-button { height: 36px; }
334
+ .cx-modal-foot .cx-exit { flex: none; min-width: 6.5rem; }
335
+ .cx-modal-foot .cx-go { flex: 1 1 0; min-width: 0; }
336
+ .cx-modal-foot .cx-foot-note { margin-left: auto; font-size: 13px; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
337
+ .cx-modal-x { position: absolute; top: 10px; right: 10px; }
338
+ .cx-handle { display: none; width: 96px; height: 4px; margin: 10px auto 0; border-radius: 99px; background: var(--muted); flex: none; }
339
+ /* escritorio = Dialog */
340
+ .cx-modal[data-mode="dialog"] { top: 50%; left: 50%; width: min(28rem, calc(100% - 2rem)); max-height: min(36rem, calc(100dvh - 4rem)); border-radius: calc(var(--radius) * 1.4); overflow: hidden;
341
+ transform: translate(-50%, -50%) scale(.95); opacity: 0; transition: transform 160ms cubic-bezier(.22, 1, .36, 1), opacity 160ms ease; }
342
+ .cx-modal[data-mode="dialog"][data-state="open"] { transform: translate(-50%, -50%); opacity: 1; }
343
+ /* teléfono = Drawer desde abajo, arrastrable */
344
+ .cx-modal[data-mode="drawer"] { left: 0; right: 0; bottom: 0; margin-inline: auto; width: min(100%, 34rem); max-height: calc(100dvh - 3rem); border-radius: calc(var(--radius) * 1.8) calc(var(--radius) * 1.8) 0 0; overflow: hidden;
345
+ transform: translateY(100%); transition: transform 450ms cubic-bezier(.32, .72, 0, 1); touch-action: none; }
346
+ .cx-modal[data-mode="drawer"][data-state="open"] { transform: translateY(0); }
347
+ .cx-modal[data-mode="drawer"] .cx-handle { display: block; }
348
+ .cx-modal[data-mode="drawer"] .cx-modal-body { touch-action: pan-y; }
349
+ .cx-modal.dragging, .cx-overlay.dragging { transition: none !important; }
350
+ .cx-modal-list { display: flex; flex-direction: column; }
351
+ .cx-more { align-self: center; }
352
+
353
+ /* ── Capas: el botón flotante vive debajo de hojas y modales ── */
354
+ .cx-fab { position: fixed; right: 20px; bottom: 20px; z-index: var(--z-fab); display: inline-flex; align-items: center; gap: 8px; height: 44px; padding: 0 16px 0 12px; border-radius: 99px; border: 0; background: var(--primary); color: var(--primary-foreground); font: 500 14px var(--font-sans); box-shadow: 0 10px 25px -8px rgb(0 0 0 / .35); cursor: pointer; }
355
+ .cx-zscale { display: grid; gap: 6px; width: 100%; max-width: 420px; }
356
+ .cx-z { display: grid; grid-template-columns: 110px 1fr 36px; gap: 10px; align-items: center; font-size: 13px; }
357
+ .cx-z code { font: 12px var(--font-mono); color: var(--muted-foreground); }
358
+ .cx-z i { height: 8px; border-radius: 99px; background: var(--selected); opacity: .25; }
359
+ .cx-z b { font: 600 12px var(--font-mono); text-align: right; }
360
+
361
+ /* ── token swatches ── */
362
+ .cx-swatches { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; width: 100%; }
363
+ .cx-sw { display: flex; align-items: center; gap: 8px; white-space: nowrap; font: 12px var(--font-mono); color: var(--muted-foreground); }
364
+ .cx-sw i { width: 22px; height: 22px; border-radius: 6px; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--foreground) 15%, transparent); flex: none; }
365
+
366
+ /* ── 44 px touch target without changing the drawn size ── */
367
+ @media (pointer: coarse) { .cn-button { position: relative; } .cn-button::before { content: ""; position: absolute; left: 50%; top: 50%; width: max(100%, 44px); height: max(100%, 44px); transform: translate(-50%, -50%); } }
368
+
369
+ /* ── page scaffolding for this preview (not part of the library) ── */
370
+ .cx-lib { display: flex; flex-direction: column; gap: 18px; }
371
+ .cx-lib[data-skin="tienda"] { background: var(--background); border-radius: 22px; padding: 8px 14px 28px; margin-inline: -14px; }
372
+ .cx-skin-label { font-size: 12px; color: var(--muted-foreground); }
373
+ .cx-tri { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); }
374
+ .cx-skinbox { padding: 20px; border-right: 1px solid color-mix(in srgb, var(--foreground) 10%, transparent); }
375
+ .cx-skinbox:last-child { border-right: 0; }
376
+ .cx-tri-in { display: flex; flex-direction: column; gap: 14px; font-size: 14px; }
377
+ .cx-tri-name { font: 500 11px var(--font-mono); color: var(--muted-foreground); }
378
+ .cx-note { margin: 0; font-size: 12px; color: var(--muted-foreground); text-align: center; min-height: 1.4em; }
379
+ .cx-cols { display: flex; flex-wrap: wrap; gap: 24px; width: 100%; justify-content: center; align-items: flex-start; }
380
+ .cx-col { flex: 1 1 260px; max-width: 360px; display: flex; flex-direction: column; gap: 8px; }
381
+ .cx-col-h { font: 500 11px var(--font-mono); color: var(--muted-foreground); text-transform: uppercase; letter-spacing: .05em; }
382
+ .cx-radiogroup, .cx-sortable { display: flex; flex-direction: column; gap: 8px; }
383
+ .cx-radiogroup [role="radio"]:focus-visible{ outline: 2px solid var(--ring); outline-offset: 2px; }
384
+ .cx-empty-mini { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; text-align: center; color: var(--muted-foreground); font-size: 13px; height: 168px; }
385
+ .cx-empty-mini svg { width: 22px; height: 22px; color: var(--success); }
386
+ .cx-fixed-card .cn-card-content { min-height: 168px; }
387
+ .cx-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
388
+ .cx-lane { display: flex; flex-direction: column; gap: 8px; padding-top: 14px; min-height: 140px; }
389
+ .cx-lane-empty { color: var(--muted-foreground); font-size: 13px; text-align: center; padding: 40px 0; }
390
+ .cx-hours-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; text-align: center; color: var(--muted-foreground); font-size: 13px; height: 172px; }
391
+ .cx-hours-empty svg { width: 22px; height: 22px; }
392
+ .cx-list-tools { display: flex; flex-direction: column; gap: 10px; position: sticky; top: -4px; background: var(--popover); padding: 4px 0 8px; z-index: 1; }
393
+ .cx-list-row { display: grid; grid-template-columns: 48px 1fr auto; gap: 10px; align-items: center; padding: 10px 0; border-top: 1px solid var(--border); }
394
+ .cx-list-row b { font-weight: 500; display: block; }
395
+ .cx-list-row small { color: var(--muted-foreground); font-size: 13px; }
396
+ .cx-list-skel { height: 52px; border-top: 1px solid var(--border); display: flex; align-items: center; gap: 10px; }
397
+ .cx-list-skel i { display: block; height: 12px; border-radius: 6px; background: var(--muted); animation: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; }
398
+ @media (max-width: 760px) {
399
+ .cx-tri { grid-template-columns: 1fr; }
400
+ .cx-skinbox { border-right: 0; border-bottom: 1px solid color-mix(in srgb, var(--foreground) 10%, transparent); }
401
+ .cx-skinbox:last-child { border-bottom: 0; }
402
+ .pg-top-in .pg-legend { margin-left: 0; }
403
+ .cx-lib[data-skin="tienda"] { margin-inline: -8px; padding-inline: 8px; }
404
+ }
405
+ @media (max-width: 420px) { .cx-2col { grid-template-columns: 1fr; } .cx-hour-grid { grid-template-columns: repeat(3, 1fr); } }
406
+ .cx-lib .pg-live::before { content: none; }
407
+ .cx-lib .pg-live { padding-top: 32px; }
408
+
409
+
410
+ /* the page keeps its width when a modal locks the scroll: the scrollbar's lane stays reserved */
411
+ html { scrollbar-gutter: stable; }
412
+ html.cx-locked { overflow: hidden; }
413
+ /* a list modal has a fixed height: loading, filtering or paging never resizes it */
414
+ .cx-modal[data-size="tall"][data-mode="dialog"] { height: min(36rem, calc(100dvh - 4rem)); }
415
+ .cx-modal[data-size="tall"][data-mode="drawer"] { height: calc(100dvh - 3rem); }
416
+
417
+ /* ═════ tanda 2 ═════ */
418
+ .style-nova, [data-skin] { --qr-ink: oklch(0.16 0 0); --qr-paper: #fff; }
419
+ [data-skin="tienda"] { --qr-ink: #0F2C24; --qr-paper: #F3EEE2; }
420
+
421
+ /* ── Avatar: initials take a stable hue per name, mixed into the skin's own surface ── */
422
+ .cx-av .cn-avatar-fallback { background: color-mix(in srgb, oklch(0.62 0.13 var(--h)) 22%, var(--background)); color: color-mix(in srgb, oklch(0.55 0.14 var(--h)) 50%, var(--foreground)); font-weight: 600; }
423
+ .cx-av[data-size="sm"] .cn-avatar-fallback { font-size: 10px; }
424
+ .cx-av[data-size="lg"] .cn-avatar-fallback { font-size: 15px; }
425
+ .cx-av-wrap { display: inline-flex; border-radius: 99px; }
426
+ .cx-av-wrap:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
427
+ .cn-avatar-group .cx-av-wrap > .cn-avatar, .cn-avatar-group .cn-avatar-group-count { box-shadow: 0 0 0 2px var(--background); }
428
+ .cx-who { display: flex; align-items: center; gap: 10px; font-size: 14px; }
429
+ .cx-who b { display: block; font-weight: 500; }
430
+ .cx-who small { color: var(--muted-foreground); font-size: 13px; }
431
+ .cx-online { background: var(--success) !important; box-shadow: 0 0 0 2px var(--background); }
432
+ .cx-tip { position: fixed; z-index: var(--z-toast); padding: 6px 10px; border-radius: calc(var(--radius) * .8); background: var(--foreground); color: var(--background); font-size: 12px; font-weight: 500; white-space: nowrap; pointer-events: none; opacity: 0; transform: translateY(2px); transition: opacity 150ms ease, transform 150ms ease; }
433
+ .cx-tip[data-state="open"] { opacity: 1; transform: none; }
434
+
435
+ /* ── Fields ── */
436
+ .cx-form { display: flex; flex-direction: column; gap: 18px; width: 100%; max-width: 380px; }
437
+ .cx-num { font-variant-numeric: tabular-nums; }
438
+ .cx-clear { opacity: 1; transition: opacity 120ms ease; }
439
+ .cx-clear[hidden] { display: inline-flex !important; opacity: 0; pointer-events: none; }
440
+ .cx-count-line { display: flex; justify-content: space-between; gap: 12px; }
441
+ .cx-count-line span:last-child { font-variant-numeric: tabular-nums; flex: none; }
442
+ .cx-count-line[data-near] span:last-child { color: var(--warning); }
443
+ .cx-msg { min-height: 1.45em; }
444
+ .cn-field[data-invalid] .cx-msg { color: var(--destructive); }
445
+ .cn-input[aria-invalid="true"] { border-color: var(--destructive); }
446
+ .cn-input[aria-invalid="true"]:focus-visible { box-shadow: 0 0 0 3px color-mix(in srgb, var(--destructive) 20%, transparent); }
447
+
448
+ /* ── Combobox list: under the field, its width, Nova's popover look ── */
449
+ .cx-combo-list { max-height: 248px; overflow-y: auto; padding: 4px; border-radius: calc(var(--radius) * 1); background: var(--popover); color: var(--popover-foreground); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 10%, transparent), 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1); font-size: 14px; overscroll-behavior: contain;
450
+ opacity: 0; transform: scale(.96); transition: opacity 100ms ease, transform 100ms ease !important; transition-property: opacity, transform !important; }
451
+ .cx-combo-list[data-state="open"] { opacity: 1; transform: none; }
452
+ .cx-opt { display: flex; align-items: center; gap: 8px; min-height: 32px; padding: 6px 8px; border-radius: calc(var(--radius) * .6); cursor: default; user-select: none; }
453
+ .cx-opt[data-hl] { background: var(--accent); color: var(--accent-foreground); }
454
+ .cx-opt mark { background: none; color: inherit; font-weight: 600; }
455
+ .cx-opt small { margin-left: auto; color: var(--muted-foreground); font-size: 12px; }
456
+ .cx-opt .cx-tick { margin-left: auto; width: 16px; height: 16px; color: var(--selected); }
457
+ .cx-opt-new { color: var(--muted-foreground); border-top: 1px solid var(--border); border-radius: 0 0 calc(var(--radius) * .6) calc(var(--radius) * .6); margin-top: 4px; }
458
+ .cx-opt-new b { color: var(--foreground); font-weight: 600; }
459
+
460
+ /* ── Alert tones (Nova's alert, colour from tokens) ── */
461
+ .cx-alerts { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr)); gap: 12px; width: 100%; max-width: 820px; margin: 0 auto; }
462
+ .cx-alerts .cn-alert { align-content: start; }
463
+ .cx-al-row { grid-column: 2; margin-top: 8px; display: flex; gap: 8px; }
464
+ .cx-al-info > svg { color: var(--info); }
465
+ .cx-al-ok > svg { color: var(--success); }
466
+ .cx-al-wait > svg { color: var(--warning); }
467
+ .cx-al-wait { background: color-mix(in srgb, var(--warning) 6%, var(--card)); }
468
+
469
+ /* ── a tiny app screen for Band and Island (iPhone-like corners) ── */
470
+ .cx-screens { display: flex; flex-wrap: wrap; justify-content: center; gap: 28px; }
471
+ .cx-screen-wrap { display: flex; flex-direction: column; align-items: center; gap: 12px; }
472
+ .cx-screen { position: relative; width: 300px; max-width: 100%; height: 250px; border-radius: 34px; overflow: hidden; background: var(--background); box-shadow: 0 0 0 1px var(--border), 0 0 0 7px color-mix(in srgb, var(--foreground) 8%, var(--background)); display: flex; flex-direction: column; }
473
+ .cx-appbar { display: flex; align-items: center; justify-content: space-between; height: 48px; padding: 0 18px; margin-top: 30px; border-bottom: 1px solid var(--border); font-size: 15px; flex: none; }
474
+ .cx-appbar-dot { width: 26px; height: 26px; border-radius: 99px; background: var(--muted); }
475
+ .cx-fake { display: flex; flex-direction: column; gap: 10px; padding: 14px 18px; }
476
+ .cx-fake i { display: block; height: 34px; border-radius: calc(var(--radius) * .8); background: var(--muted); }
477
+ .cx-fake i:nth-child(2n) { width: 80%; }
478
+ /* Band: grows its own height in, pushes content (never covers it), one at a time */
479
+ .cx-band-slot { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 260ms cubic-bezier(.22, 1, .36, 1); flex: none; }
480
+ .cx-band-slot[data-open] { grid-template-rows: 1fr; }
481
+ .cx-band-slot > div { overflow: hidden; min-height: 0; }
482
+ .cx-band { display: flex; align-items: center; gap: 10px; padding: 9px 14px 9px 18px; font-size: 13px; line-height: 1.35; border-bottom: 1px solid var(--border); }
483
+ .cx-band svg { width: 16px; height: 16px; flex: none; }
484
+ .cx-band span { flex: 1; }
485
+ .cx-band[data-tone="warn"] { background: color-mix(in srgb, var(--warning) 14%, var(--background)); }
486
+ .cx-band[data-tone="warn"] svg { color: var(--warning); }
487
+ .cx-band[data-tone="muted"] { background: var(--muted); }
488
+ .cx-band .cn-button { flex: none; }
489
+ .cx-band-in { animation: cx-fade 200ms ease; }
490
+ /* exit: the text fades before the slot folds, so nothing is clipped mid-way */
491
+ .cx-band-slot > div > .cx-band { transition: opacity 140ms ease; }
492
+ .cx-band-slot:not([data-open]) > div > .cx-band { opacity: 0; }
493
+ /* Island: one pill that changes shape and text in place */
494
+ .cx-island { position: absolute; top: 10px; left: 50%; z-index: 3; display: flex; align-items: center; gap: 8px; height: 34px; padding: 0 14px 0 10px; border-radius: 99px; background: oklch(0.16 0 0); color: #fff; font-size: 13px; font-weight: 500; white-space: nowrap; overflow: hidden;
495
+ transform: translateX(-50%); transition: width 380ms cubic-bezier(.22, 1, .36, 1), opacity 200ms ease, transform 380ms cubic-bezier(.22, 1, .36, 1); }
496
+ .cx-island[data-state="hidden"] { opacity: 0; transform: translateX(-50%) scale(.7); }
497
+ .cx-island-icon { width: 18px; height: 18px; display: grid; place-items: center; flex: none; }
498
+ .cx-island-icon svg { width: 16px; height: 16px; }
499
+ .cx-island[data-tone="done"] .cx-island-icon { color: oklch(0.8 0.17 150); }
500
+ .cx-island[data-tone="error"] .cx-island-icon { color: oklch(0.72 0.19 25); }
501
+ .cx-island[data-tone="error"] { animation: cx-shake 320ms ease; }
502
+ .cx-island-text { transition: opacity 140ms ease; }
503
+ .cx-island-text.swap { opacity: 0; }
504
+ @keyframes cx-shake { 25% { margin-left: -4px; } 75% { margin-left: 4px; } }
505
+
506
+ /* ── Accordion chevron rotates ── */
507
+ .cx-acc-chev { margin-left: auto; width: 16px; height: 16px; flex: none; color: var(--muted-foreground); transition: transform 200ms ease; pointer-events: none; }
508
+ [aria-expanded="true"] > .cx-acc-chev { transform: rotate(180deg); }
509
+
510
+ /* ── QR ── */
511
+ .cx-qr-card { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 24px; }
512
+ .cx-qr { width: 176px; height: 176px; padding: 12px; border-radius: calc(var(--radius) * 1.4); background: var(--qr-paper); box-shadow: 0 0 0 1px var(--border); position: relative; }
513
+ .cx-qr svg { width: 100%; height: 100%; display: block; }
514
+ .cx-qr-mark { position: absolute; left: 50%; top: 50%; width: 38px; height: 38px; margin: -19px 0 0 -19px; border-radius: 10px; background: var(--qr-paper); display: grid; place-items: center; }
515
+ .cx-qr-mark span { width: 30px; height: 30px; border-radius: 8px; background: var(--qr-ink); color: var(--qr-paper); font: 700 12px var(--font-sans); display: grid; place-items: center; }
516
+ .cx-qr-side { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; font-size: 14px; }
517
+ .cx-qr-side b { font-size: 16px; font-weight: 600; }
518
+ .cx-qr-url { font: 13px var(--font-mono); color: var(--muted-foreground); user-select: all; margin-bottom: 8px; }
519
+ .cx-copy { min-width: 9.5rem; justify-content: center; }
520
+ .cx-copy[data-done] { color: var(--success); }
521
+
522
+ /* ── thin themed scrollbar for every scrolling list or sheet ── */
523
+ .cx-combo-list, .cx-modal-body, .cx-scroll { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--foreground) 22%, transparent) transparent; }
524
+ .cx-combo-list::-webkit-scrollbar, .cx-modal-body::-webkit-scrollbar, .cx-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
525
+ .cx-combo-list::-webkit-scrollbar-thumb, .cx-modal-body::-webkit-scrollbar-thumb, .cx-scroll::-webkit-scrollbar-thumb { background: color-mix(in srgb, var(--foreground) 22%, transparent); border-radius: 99px; border: 3px solid transparent; background-clip: padding-box; }
526
+ .cx-combo-list::-webkit-scrollbar-thumb:hover, .cx-modal-body::-webkit-scrollbar-thumb:hover, .cx-scroll::-webkit-scrollbar-thumb:hover { background-color: color-mix(in srgb, var(--foreground) 40%, transparent); }
527
+ .cx-combo-list::-webkit-scrollbar-track, .cx-modal-body::-webkit-scrollbar-track, .cx-scroll::-webkit-scrollbar-track { background: transparent; }
528
+ .cx-combo-list::-webkit-scrollbar-button, .cx-modal-body::-webkit-scrollbar-button, .cx-scroll::-webkit-scrollbar-button { display: none; height: 0; }
529
+
530
+ /* ═════ tanda 3 ═════ */
531
+ /* ── Slider / range: value beside the label, tokens instead of Nova's fixed white thumb ── */
532
+ .cx-sl-field { display: flex; flex-direction: column; gap: 10px; }
533
+ .cx-sl-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
534
+ .cx-sl-val { font-size: 14px; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
535
+ .cx-slider { position: relative; width: 100%; height: 16px; display: flex; align-items: center; touch-action: none; cursor: pointer; user-select: none; }
536
+ .cx-slider .cn-slider-track { width: 100%; }
537
+ .cx-slider .cn-slider-range { position: absolute; top: 0; bottom: 0; background: var(--selected); }
538
+ .cx-slider .cn-slider-thumb { position: absolute; top: 50%; margin-top: -6px; background: var(--background); border-color: var(--selected); cursor: grab; }
539
+ .cx-slider .cn-slider-thumb:focus-visible, .cx-slider .cn-slider-thumb[data-drag] { box-shadow: 0 0 0 4px color-mix(in srgb, var(--selected) 25%, transparent); }
540
+ .cx-slider .cn-slider-thumb[data-drag] { cursor: grabbing; }
541
+ .cx-sl-scale { display: flex; justify-content: space-between; font-size: 12px; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
542
+
543
+ /* ── OTP: one real input under six painted slots ── */
544
+ .cx-otp { position: relative; }
545
+ .cx-otp-input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; border: 0; padding: 0; font-size: 16px; color: transparent; caret-color: transparent; background: transparent; z-index: 1; cursor: text; letter-spacing: 2em; }
546
+ .cx-otp .cn-input-otp-slot { position: relative; display: grid; place-items: center; width: 40px; height: 44px; font-size: 18px; font-weight: 500; font-variant-numeric: tabular-nums; background: var(--background); }
547
+ .cx-otp .cn-input-otp-slot[data-active="true"] { border-color: var(--selected); box-shadow: 0 0 0 3px color-mix(in srgb, var(--selected) 22%, transparent); z-index: 1; }
548
+ .cx-otp .cx-caret { width: 1px; height: 18px; background: var(--foreground); animation: cx-blink 1s steps(1) infinite; }
549
+ @keyframes cx-blink { 50% { opacity: 0; } }
550
+ .cx-otp-sep { display: grid; place-items: center; width: 20px; }
551
+ .cx-otp-sep span { width: 8px; height: 2px; border-radius: 2px; background: var(--muted-foreground); }
552
+ .cx-otp .cn-input-otp { display: flex; align-items: center; }
553
+ .cx-otp[data-state="bad"] .cn-input-otp-slot { border-color: var(--destructive); }
554
+ .cx-otp[data-state="bad"] { animation: cx-shake 320ms ease; }
555
+ .cx-otp[data-state="ok"] .cn-input-otp-slot { border-color: var(--success); color: var(--success); }
556
+ #otp-msg[data-tone="bad"] { color: var(--destructive); }
557
+ #otp-msg[data-tone="ok"] { color: var(--success); }
558
+
559
+ /* ── Color picker ── */
560
+ .cx-swatch-row { display: flex; flex-wrap: wrap; gap: 10px; }
561
+ .cx-sw-btn { position: relative; display: grid; place-items: center; width: 32px; height: 32px; border-radius: 99px; border: 0; padding: 0; background: var(--c); cursor: pointer; box-shadow: inset 0 0 0 1px rgb(0 0 0 / .12); transition: transform 120ms ease; }
562
+ .cx-sw-btn:hover { transform: scale(1.08); }
563
+ .cx-sw-btn:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
564
+ .cx-sw-btn[aria-checked="true"]::after { content: ""; position: absolute; inset: -4px; border-radius: 99px; box-shadow: 0 0 0 2px var(--foreground); }
565
+ .cx-sw-btn svg { width: 16px; height: 16px; color: var(--on, #fff); opacity: 0; }
566
+ .cx-sw-btn[aria-checked="true"] svg { opacity: 1; }
567
+ .cx-sw-other { background: conic-gradient(from 0deg, #f43f5e, #f59e0b, #84cc16, #06b6d4, #6366f1, #d946ef, #f43f5e); display: grid; place-items: center; }
568
+ .cx-sw-other svg { opacity: 1; color: #fff; filter: drop-shadow(0 1px 1px rgb(0 0 0 / .4)); }
569
+ .cx-store-prev { gap: 14px; padding: 18px; border-radius: calc(var(--radius) * 1.6); background: var(--card); box-shadow: 0 0 0 1px var(--border); max-width: 320px; flex-basis: 300px; }
570
+ .cx-sp-head { display: flex; align-items: center; gap: 12px; font-size: 14px; }
571
+ .cx-sp-head b { display: block; font-weight: 600; }
572
+ .cx-sp-head small { color: var(--muted-foreground); font-size: 13px; }
573
+ .cx-sp-logo { width: 40px; height: 40px; border-radius: 12px; display: grid; place-items: center; background: var(--primary); color: var(--primary-foreground); font-weight: 700; font-size: 14px; transition: background-color 200ms ease, color 200ms ease; }
574
+ .cx-store-prev .cn-button { transition: background-color 200ms ease, color 200ms ease; }
575
+ .cx-picker { width: 248px; padding: 12px; border-radius: calc(var(--radius) * 1.2); background: var(--popover); color: var(--popover-foreground); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 10%, transparent), 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1); display: flex; flex-direction: column; gap: 12px;
576
+ opacity: 0; transform: scale(.96); transition: opacity 120ms ease, transform 120ms ease !important; transition-property: opacity, transform !important; }
577
+ .cx-picker[data-state="open"] { opacity: 1; transform: none; }
578
+ .cx-sv { position: relative; height: 150px; border-radius: calc(var(--radius) * .8); background: linear-gradient(to top, #000, transparent), linear-gradient(to right, #fff, hsl(var(--pk-h, 260) 100% 50%)); cursor: crosshair; touch-action: none; }
579
+ .cx-sv-dot, .cx-hue-dot { position: absolute; width: 16px; height: 16px; margin: -8px 0 0 -8px; border-radius: 99px; box-shadow: 0 0 0 2px #fff, 0 0 0 3px rgb(0 0 0 / .3); pointer-events: none; }
580
+ .cx-hue { position: relative; height: 12px; border-radius: 99px; background: linear-gradient(to right, #f00, #ff0, #0f0, #0ff, #00f, #f0f, #f00); cursor: pointer; touch-action: none; }
581
+ .cx-hue-dot { top: 50%; background: hsl(var(--pk-h, 260) 100% 50%); }
582
+ .cx-sv:focus-visible, .cx-hue:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
583
+ .cx-pk-row { display: flex; align-items: center; gap: 8px; }
584
+ .cx-pk-chip { width: 32px; height: 32px; border-radius: calc(var(--radius) * .8); flex: none; box-shadow: inset 0 0 0 1px rgb(0 0 0 / .12); }
585
+ .cx-pk-warn { margin: 0; font-size: 12px; color: var(--warning); min-height: 1.4em; line-height: 1.4; }
586
+
587
+ /* ── Tag input ── */
588
+ .cx-taginput { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-height: 32px; padding: 4px 6px; border: 1px solid var(--input); border-radius: calc(var(--radius) * 0.8); background: transparent; cursor: text; transition: border-color .15s, box-shadow .15s; }
589
+ .cx-taginput:focus-within { border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 50%, transparent); }
590
+
591
+
592
+
593
+ @keyframes cx-flash { 30% { background: var(--selected); color: var(--selected-foreground); } }
594
+ .cx-tag-field { flex: 1 1 120px; min-width: 120px; height: 22px; border: 0; outline: 0; background: transparent; color: inherit; font: inherit; font-size: 14px; padding: 0 4px; }
595
+ .cx-suggest { display: flex; flex-direction: column; gap: 8px; font-size: 12px; color: var(--muted-foreground); }
596
+
597
+
598
+
599
+
600
+ /* ── Pagination ── */
601
+ .cx-pages-wrap { width: 100%; max-width: 560px; display: flex; flex-direction: column; gap: 12px; }
602
+ .cx-pg-list { display: flex; flex-direction: column; }
603
+ .cx-pg-row { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 12px; height: 44px; border-top: 1px solid var(--border); font-size: 14px; }
604
+ .cx-pg-row:first-child { border-top: 0; }
605
+ .cx-pg-row small { color: var(--muted-foreground); margin-left: 8px; }
606
+ .cx-pg-row b { font-weight: 600; font-variant-numeric: tabular-nums; }
607
+ .cx-pg-row i { display: block; height: 12px; border-radius: 6px; background: var(--muted); animation: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; }
608
+ .cx-pg-foot { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; font-size: 13px; color: var(--muted-foreground); }
609
+ .cx-pagination { margin: 0; width: auto; }
610
+ .cx-pagination .cn-button[aria-current="page"] { pointer-events: none; }
611
+ .cx-pg-compact { display: none; font-size: 13px; color: var(--foreground); padding: 0 6px; font-variant-numeric: tabular-nums; }
612
+ @media (max-width: 520px) { .cx-pagination .cx-pg-num { display: none; } .cx-pg-compact { display: inline; } .cx-pagination .cn-pagination-previous span, .cx-pagination .cn-pagination-next span { display: none; } }
613
+
614
+ /* ── Carousel ── */
615
+ .cx-car { width: 100%; max-width: 760px; display: flex; flex-direction: column; gap: 12px; }
616
+ .cx-car-track { display: grid; grid-auto-flow: column; grid-auto-columns: 220px; gap: 12px; overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; overscroll-behavior-x: contain; padding-bottom: 10px; border-radius: calc(var(--radius) * 1.2); }
617
+ .cx-car-track:focus-visible { outline: 2px solid var(--ring); outline-offset: 4px; }
618
+ .cx-card-p { scroll-snap-align: start; display: flex; flex-direction: column; gap: 8px; font-size: 14px; }
619
+ .cx-card-p .cx-ph { aspect-ratio: 1; border-radius: calc(var(--radius) * 1.2); background: var(--g); box-shadow: inset 0 0 0 1px rgb(0 0 0 / .06); }
620
+ .cx-card-p b { font-weight: 500; }
621
+ .cx-card-p span { color: var(--muted-foreground); font-variant-numeric: tabular-nums; font-size: 13px; }
622
+ .cx-car-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
623
+ .cx-car-dots { display: flex; gap: 6px; }
624
+
625
+
626
+
627
+
628
+
629
+ /* ── Phone ── */
630
+ .cx-cc { gap: 4px; padding: 0 6px; font-variant-numeric: tabular-nums; }
631
+ .cx-cc svg { width: 12px !important; height: 12px !important; opacity: .6; }
632
+ .cx-phone .cn-input-group-input { padding-left: 4px; }
633
+ #ph-f[data-invalid] .cx-msg { color: var(--destructive); }
634
+ .cx-cc-item { display: flex; gap: 8px; }
635
+ .cx-cc-item small { margin-left: auto; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
636
+
637
+ /* ═════ arreglos tanda 3 ═════ */
638
+ /* code picker (country, currency, …): search on top, list below */
639
+ .cx-cpick { padding: 0; border-radius: var(--radius); background: var(--popover); color: var(--popover-foreground); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 10%, transparent), 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1); overflow: hidden;
640
+ opacity: 0; transform: scale(.97); transition: opacity 110ms ease, transform 110ms ease !important; transition-property: opacity, transform !important; }
641
+ .cx-cpick[data-state="open"] { opacity: 1; transform: none; }
642
+ .cx-cpick-search { display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 10px; border-bottom: 1px solid var(--border); }
643
+ .cx-cpick-search svg { width: 14px; height: 14px; color: var(--muted-foreground); flex: none; }
644
+ .cx-cpick-search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; color: inherit; font: inherit; font-size: 14px; }
645
+ .cx-cpick-list { box-shadow: none !important; border-radius: 0; max-height: 232px; opacity: 1 !important; transform: none !important; }
646
+ .cx-opt-code { min-width: 30px; font: 600 12px var(--font-mono); color: var(--muted-foreground); }
647
+ .cx-opt[aria-selected="true"] .cx-opt-code { color: var(--selected); }
648
+ /* the trigger never changes width between countries / currencies */
649
+ .cx-cc { min-width: 4.75rem; justify-content: space-between; }
650
+ #mf-cur.cx-cc { min-width: 3.75rem; }
651
+ .cx-cc-code { font: 600 12px var(--font-mono); }
652
+ .cx-cc-dial { min-width: 2.6em; text-align: left; }
653
+ /* tags: chips come in and go out, the box eases its height (JS) */
654
+
655
+ @keyframes cx-chip-in { from { opacity: 0; transform: scale(.85); } }
656
+ .cx-taginput { overflow: hidden; }
657
+ /* pagination: stacked, centred, steady */
658
+ .cx-pg-foot { flex-direction: column; justify-content: center; gap: 8px; }
659
+ .cx-pagination .cn-pagination-content { justify-content: center; }
660
+ .cx-pagination .cx-pg-num .cn-button, .cx-pg-gap { width: 32px; }
661
+ .cx-pg-gap { display: flex; justify-content: center; }
662
+ .cx-pg-list { transition: opacity 160ms ease; }
663
+ .cx-pg-list[data-loading] { opacity: .45; }
664
+ .cx-pg-empty { border-top-color: transparent; }
665
+ /* virtual list */
666
+ .cx-vlist { height: 364px; overflow-y: auto; border-radius: calc(var(--radius) * 1.2); box-shadow: 0 0 0 1px var(--border); overscroll-behavior: contain; }
667
+ .cx-vlist:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
668
+ .cx-vspace { position: relative; }
669
+ .cx-vwin { position: absolute; top: 0; left: 0; right: 0; will-change: transform; }
670
+ .cx-vrow { display: grid; grid-template-columns: 56px 1fr auto; align-items: center; gap: 10px; height: 52px; padding: 0 14px; border-bottom: 1px solid var(--border); font-size: 14px; box-sizing: border-box; }
671
+ .cx-vrow small { color: var(--muted-foreground); margin-left: 8px; font-size: 12px; }
672
+ .cx-vrow b { font-weight: 600; font-variant-numeric: tabular-nums; }
673
+ .cx-vn { color: var(--muted-foreground); font-size: 12px; }
674
+ /* carousel: no visible scrollbar (swipe, wheel, arrows and dots move it) */
675
+ .cx-car-track { scrollbar-width: none; padding-bottom: 0; }
676
+ .cx-car-track::-webkit-scrollbar { display: none; }
677
+
678
+ /* carousel: a whole number of cards per view, so no card is ever cut */
679
+ .cx-car-track { grid-auto-columns: calc((100% - 36px) / 4); }
680
+ @media (max-width: 760px) { .cx-car-track { grid-auto-columns: calc((100% - 12px) / 2); } }
681
+
682
+ /* ═════ tanda 4 ═════ */
683
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
684
+ .cx-check { width: 16px; }
685
+
686
+ /* ── DataTable: a table while its box is wide, a list of Items when the box is narrow ── */
687
+ .cx-dt-host { container-type: inline-size; width: 100%; max-width: 920px; margin: 0 auto; display: flex; flex-direction: column; transition: max-width 320ms cubic-bezier(.22, 1, .36, 1); }
688
+ .cx-dt-host[data-narrow] { max-width: 380px; }
689
+ .cx-dt-bulk { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 220ms cubic-bezier(.22, 1, .36, 1); }
690
+ .cx-dt-bulk[data-open] { grid-template-rows: 1fr; }
691
+ .cx-dt-bulk > div { overflow: hidden; min-height: 0; display: flex; align-items: center; justify-content: space-between; gap: 12px; font-size: 13px; font-weight: 500; }
692
+ .cx-dt-bulk[data-open] > div { padding: 0 4px 10px; }
693
+ .cx-dt-scroll { max-height: 380px; overflow: auto; border-radius: calc(var(--radius) * 1.2); box-shadow: 0 0 0 1px var(--border); }
694
+ .cx-dt { width: 100%; border-collapse: separate; border-spacing: 0; font-size: 14px; }
695
+ .cx-dt th { position: sticky; top: 0; z-index: 1; background: var(--muted); text-align: left; font-weight: 500; color: var(--muted-foreground); height: 40px; padding: 0 12px; border-bottom: 1px solid var(--border); white-space: nowrap; }
696
+ .cx-dt td { height: 52px; padding: 0 12px; border-bottom: 1px solid var(--border); vertical-align: middle; }
697
+ .cx-dt tbody tr:last-child td { border-bottom: 0; }
698
+ .cx-dt tbody tr { transition: background-color 120ms; }
699
+ .cx-dt tbody tr:hover { background: color-mix(in srgb, var(--muted) 50%, transparent); }
700
+ .cx-dt tbody tr[data-selected] { background: var(--selected-soft); }
701
+ .cx-dt .cx-dt-check { width: 40px; padding-right: 0; }
702
+ .cx-dt .cx-dt-num { text-align: right; }
703
+ .cx-dt td.cx-dt-num { font-variant-numeric: tabular-nums; font-weight: 600; }
704
+ .cx-dt .cx-dt-act { width: 44px; padding: 0 6px; }
705
+
706
+
707
+
708
+
709
+
710
+
711
+ .cx-dt-who b { display: block; font-weight: 500; }
712
+ .cx-dt-who small { color: var(--muted-foreground); font-size: 12px; }
713
+ .cx-dt-when { font-variant-numeric: tabular-nums; white-space: nowrap; }
714
+ @container (max-width: 560px) {
715
+ .cx-dt thead { display: none; }
716
+ .cx-dt, .cx-dt tbody { display: block; }
717
+ .cx-dt tbody tr { display: grid; grid-template-columns: auto 1fr auto; grid-template-areas: "c who amt" "c meta st"; gap: 2px 12px; align-items: center; padding: 12px; border-bottom: 1px solid var(--border); }
718
+ .cx-dt td { display: block; height: auto; padding: 0; border: 0; }
719
+ .cx-dt td.cx-dt-check { grid-area: c; align-self: center; width: auto; }
720
+ .cx-dt td.cx-dt-who { grid-area: who; }
721
+ .cx-dt td.cx-dt-svc { grid-area: meta; color: var(--muted-foreground); font-size: 13px; }
722
+ .cx-dt td.cx-dt-when { display: none; }
723
+ .cx-dt td.cx-dt-st { grid-area: st; justify-self: end; }
724
+ .cx-dt td.cx-dt-num { grid-area: amt; }
725
+ .cx-dt td.cx-dt-act { display: none; }
726
+ .cx-dt-who small { display: none; }
727
+ .cx-dt td.cx-dt-svc::after { content: " · " attr(data-when); }
728
+ }
729
+
730
+ /* ── Board ── */
731
+ .cx-board { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(250px, 1fr); max-width: 1120px !important; gap: 12px; width: 100%; max-width: 920px; margin: 0 auto; overflow-x: auto; scroll-snap-type: x proximity; padding-bottom: 4px; }
732
+ .cx-blane { scroll-snap-align: start; display: flex; flex-direction: column; gap: 8px; padding: 10px; border-radius: calc(var(--radius) * 1.4); background: var(--muted); min-height: 300px; }
733
+ .cx-lane-h { display: flex; align-items: center; justify-content: space-between; padding: 2px 4px 4px; font-size: 13px; font-weight: 600; }
734
+ .cx-lane-h .cx-count { min-width: 20px; height: 20px; padding: 0 6px; border-radius: 99px; background: var(--background); font-size: 11px; display: inline-grid; place-items: center; font-variant-numeric: tabular-nums; }
735
+ .cx-lane-list { display: flex; flex-direction: column; gap: 8px; flex: 1; border-radius: calc(var(--radius) * .9); transition: background-color 150ms; }
736
+ .cx-blane[data-over] .cx-lane-list { background: color-mix(in srgb, var(--selected) 8%, transparent); }
737
+
738
+
739
+
740
+
741
+
742
+
743
+
744
+ .cx-bph { border-radius: var(--radius); border: 1.5px dashed color-mix(in srgb, var(--selected) 55%, transparent); background: var(--selected-soft); flex: none; }
745
+ .cx-lane-empty-b { padding: 18px 8px; text-align: center; color: var(--muted-foreground); font-size: 12px; }
746
+
747
+ /* ── Picker field + wheels ── */
748
+
749
+
750
+
751
+
752
+ .cx-wheels { position: relative; display: flex; gap: 4px; height: 220px; user-select: none; }
753
+ .cx-wheels::before { content: ""; position: absolute; left: 0; right: 0; top: 50%; height: 40px; margin-top: -20px; border-radius: calc(var(--radius) * .9); background: var(--muted); pointer-events: none; }
754
+ .cx-wheel { position: relative; flex: 1; overflow-y: auto; touch-action: none; cursor: grab; overscroll-behavior: contain; scroll-snap-type: y mandatory; scrollbar-width: none; padding: 90px 0; outline: none; border-radius: calc(var(--radius) * .9);
755
+ -webkit-mask-image: linear-gradient(transparent, #000 32%, #000 68%, transparent); mask-image: linear-gradient(transparent, #000 32%, #000 68%, transparent); }
756
+ .cx-wheel::-webkit-scrollbar { display: none; }
757
+ .cx-wheel:focus-visible { box-shadow: inset 0 0 0 2px var(--ring); }
758
+ .cx-wheel-it { height: 40px; display: grid; place-items: center; scroll-snap-align: center; font-size: 17px; font-variant-numeric: tabular-nums; color: var(--muted-foreground); cursor: pointer; transition: color 120ms; white-space: nowrap; }
759
+ .cx-wheel-it[data-on] { color: var(--foreground); font-weight: 600; }
760
+ .cx-wheel-it[data-off] { opacity: .35; }
761
+ .cx-wheel[data-flex="2"] { flex: 2; }
762
+ .cx-wheel-sum { text-align: center; font-size: 14px; font-weight: 500; min-height: 1.4em; }
763
+
764
+ /* ── Upload ── */
765
+ .cx-drop { position: relative; aspect-ratio: 1; max-width: 100%; border-radius: calc(var(--radius) * 1.6); border: 1.5px dashed var(--input); background: color-mix(in srgb, var(--muted) 50%, transparent); display: grid; place-items: center; cursor: pointer; overflow: hidden; transition: border-color 150ms, background-color 150ms; }
766
+ .cx-drop:hover, .cx-drop[data-over] { border-color: var(--selected); background: var(--selected-soft); }
767
+ .cx-drop:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
768
+ .cx-drop[data-has] { border-style: solid; border-color: var(--border); cursor: default; }
769
+ .cx-drop-empty { display: flex; flex-direction: column; align-items: center; gap: 6px; text-align: center; font-size: 13px; color: var(--muted-foreground); padding: 16px; }
770
+ .cx-drop-empty svg { width: 22px; height: 22px; margin-bottom: 4px; }
771
+ .cx-drop-empty b { color: var(--foreground); font-size: 14px; font-weight: 500; }
772
+ .cx-drop[data-has] .cx-drop-empty { display: none; }
773
+ .cx-drop-img { position: absolute; inset: 0; width: 100%; height: 100%; animation: cx-fade 260ms ease; }
774
+ .cx-drop-bar { position: absolute; left: 12px; right: 12px; bottom: 12px; height: 6px; border-radius: 99px; background: rgb(255 255 255 / .55); overflow: hidden; backdrop-filter: blur(4px); }
775
+ .cx-drop-bar i { display: block; height: 100%; width: 0; border-radius: 99px; background: var(--selected); transition: width 160ms linear; }
776
+ #drop-msg[data-tone="bad"] { color: var(--destructive); }
777
+ #drop-msg[data-tone="ok"] { color: var(--success); }
778
+
779
+ /* ── Phone shell: header that shrinks, three fixed tabs ── */
780
+ .cx-phone-frame { width: 320px; max-width: 100%; height: 600px; border-radius: 46px; padding: 9px; background: color-mix(in srgb, var(--foreground) 88%, var(--background)); box-shadow: 0 30px 60px -30px rgb(0 0 0 / .45); }
781
+ .cx-ph-screen { position: relative; height: 100%; border-radius: 38px; overflow: hidden; background: var(--background); display: flex; flex-direction: column; }
782
+ .cx-ph-status { display: flex; align-items: center; justify-content: space-between; height: 44px; padding: 0 24px; font-size: 13px; font-weight: 600; flex: none; }
783
+ .cx-ph-island { width: 96px; height: 28px; border-radius: 99px; background: #000; }
784
+ .cx-ph-head { flex: none; background: color-mix(in srgb, var(--background) 92%, transparent); backdrop-filter: blur(10px); border-bottom: 1px solid transparent; transition: border-color 160ms; z-index: 2; }
785
+ .cx-ph-head[data-compact] { border-bottom-color: var(--border); }
786
+ .cx-ph-bar { display: grid; grid-template-columns: auto 1fr auto; align-items: center; height: 44px; padding: 0 6px; }
787
+ .cx-ph-small { text-align: center; font-size: 15px; font-weight: 600; opacity: 0; transform: translateY(4px); transition: opacity 160ms, transform 160ms; }
788
+ .cx-ph-head[data-compact] .cx-ph-small { opacity: 1; transform: none; }
789
+ .cx-ph-big { margin: 0; padding: 0 18px 10px; font-size: 30px; font-weight: 700; letter-spacing: -0.02em; line-height: 1.1; transform-origin: left center; }
790
+ .cx-ph-body { flex: 1; overflow-y: auto; padding: 4px 16px 16px; display: flex; flex-direction: column; gap: 8px; }
791
+ .cx-ph-nav { flex: none; display: grid; grid-template-columns: repeat(3, 1fr); padding: 6px 8px calc(6px + 18px); border-top: 1px solid var(--border); background: var(--background); }
792
+
793
+
794
+
795
+
796
+
797
+ .cx-ph-ico { position: relative; display: grid; }
798
+ .cx-ph-badge { position: absolute; top: -5px; left: 15px; min-width: 18px; height: 16px; padding: 0 4px; border-radius: 99px; background: var(--destructive); color: var(--on-destructive); font: 600 10px/16px var(--font-sans); font-style: normal; text-align: center; font-variant-numeric: tabular-nums; box-shadow: 0 0 0 2px var(--background); }
799
+ .cx-ph-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: var(--radius); background: var(--card); box-shadow: 0 0 0 1px var(--border); font-size: 13px; }
800
+ .cx-ph-row b { font-weight: 600; }
801
+ .cx-ph-row small { display: block; color: var(--muted-foreground); }
802
+ .cx-ph-row .cx-time { margin-left: auto; }
803
+ .cx-ph-sec { font-size: 12px; font-weight: 600; color: var(--muted-foreground); text-transform: uppercase; letter-spacing: .05em; margin: 8px 2px 0; }
804
+
805
+ /* ── Share ── */
806
+ .cx-share { width: 328px; padding: 14px; border-radius: calc(var(--radius) * 1.4); background: var(--popover); color: var(--popover-foreground); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 10%, transparent), 0 10px 15px -3px rgb(0 0 0 / .1); display: flex; flex-direction: column; gap: 12px;
807
+ opacity: 0; transform: scale(.97); transition: opacity 120ms ease, transform 120ms ease !important; transition-property: opacity, transform !important; }
808
+ .cx-share[data-state="open"] { opacity: 1; transform: none; }
809
+ .cx-share-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; }
810
+ .cx-share-it { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 8px 2px; border-radius: var(--radius); border: 0; background: transparent; color: var(--foreground); font: 500 11px var(--font-sans); cursor: pointer; text-decoration: none; }
811
+ .cx-share-it:hover { background: var(--accent); }
812
+ .cx-share-it:focus-visible { outline: 2px solid var(--ring); outline-offset: 0; }
813
+ .cx-share-ico { width: 44px; height: 44px; border-radius: 14px; display: grid; place-items: center; background: var(--brand, var(--muted)); color: #fff; }
814
+ .cx-share-ico svg { width: 22px; height: 22px; }
815
+ .cx-share-ico.plain { background: var(--muted); color: var(--foreground); }
816
+ .cx-share-link { display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 4px 0 12px; border-radius: var(--radius); background: var(--muted); font: 13px var(--font-mono); }
817
+ .cx-share-link span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; user-select: all; }
818
+
819
+ .cx-wheel:active { cursor: grabbing; }
820
+
821
+ /* ── Share sheet (Storio's, on tokens) ── */
822
+ .cx-modal-head span:empty { display: none; }
823
+ .cx-modal-foot:empty { display: none; }
824
+ .cx-sh { display: flex; flex-direction: column; gap: 16px; }
825
+ .cx-sh-card { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 6px; padding: 26px 16px; border-radius: calc(var(--radius) * 2); background: var(--primary); color: var(--primary-foreground); }
826
+ .cx-sh-av { width: 72px; height: 72px; border-radius: 99px; display: grid; place-items: center; margin-bottom: 4px; background: color-mix(in srgb, var(--primary-foreground) 14%, var(--primary)); font-weight: 700; font-size: 22px; }
827
+ .cx-sh-card b { font-size: 18px; font-weight: 800; letter-spacing: -.01em; }
828
+ .cx-sh-card > span:last-child { font-size: 13px; opacity: .78; }
829
+ .cx-sh-prod { position: relative; height: 15rem; border-radius: calc(var(--radius) * 2); overflow: hidden; background: var(--g); color: #fff; }
830
+ .cx-sh-prod::before { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgb(0 0 0 / .74), rgb(0 0 0 / .16) 42%, transparent 66%); }
831
+ .cx-sh-tag { position: absolute; top: 11px; right: 11px; padding: 3px 10px; border-radius: 10px; background: #fff; color: #101014; font-weight: 800; font-size: 17px; letter-spacing: -.01em; font-variant-numeric: tabular-nums; box-shadow: 0 6px 18px rgb(0 0 0 / .35); }
832
+ .cx-sh-pinfo { position: absolute; left: 0; right: 0; bottom: 0; padding: 16px 17px 18px; display: flex; flex-direction: column; gap: 2px; }
833
+ .cx-sh-pinfo b { font-size: 20px; font-weight: 800; letter-spacing: -.02em; line-height: 1.05; text-shadow: 0 2px 12px rgb(0 0 0 / .45); }
834
+ .cx-sh-pinfo span { font-size: 14px; font-weight: 600; opacity: .9; }
835
+ .cx-sh-copy { display: flex; align-items: center; gap: 10px; height: 54px; padding: 0 8px 0 14px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.4); }
836
+ .cx-sh-url { flex: 1; min-width: 0; font-size: 14px; overflow-wrap: anywhere; line-height: 1.3; }
837
+
838
+ .cx-sh-lbl { font-size: 11px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--muted-foreground); }
839
+ .cx-sh-targets { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; margin-inline: -4px; padding: 2px 4px 4px; cursor: grab; touch-action: pan-x; overscroll-behavior-x: contain; }
840
+ .cx-sh-targets::-webkit-scrollbar { display: none; }
841
+ .cx-sh-targets.dragging { cursor: grabbing; }
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+ .cx-sh-qrview { align-items: center; padding: 6px 0 4px; }
851
+ .cx-sh-qrurl { font-size: 14px; color: var(--muted-foreground); }
852
+ .cx-sh-msg:empty { display: none; }
853
+ /* fade only the edge that still has more to scroll */
854
+ .cx-sh-targets { --fl: 0px; --fr: 28px; -webkit-mask-image: linear-gradient(to right, transparent, #000 var(--fl), #000 calc(100% - var(--fr)), transparent); mask-image: linear-gradient(to right, transparent, #000 var(--fl), #000 calc(100% - var(--fr)), transparent); }
855
+ .cx-sh-targets[data-end] { --fr: 0px; }
856
+ .cx-sh-targets[data-scrolled] { --fl: 28px; }
857
+
858
+ /* ── Board card: optional parts, none fixed ── */
859
+
860
+
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+
874
+
875
+ /* ── receipt ── */
876
+ .cx-rcpt { display: flex; flex-direction: column; gap: 14px; }
877
+ .cx-rcpt-shot { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 22px 18px 16px; border-radius: calc(var(--radius) * 1.6); background: linear-gradient(#fdfcf7, #f3f1ea); color: #1b1b1f; box-shadow: inset 0 0 0 1px rgb(0 0 0 / .06); }
878
+ .cx-rcpt-ok { width: 40px; height: 40px; border-radius: 99px; display: grid; place-items: center; background: #1f9d55; color: #fff; }
879
+ .cx-rcpt-ok svg { width: 20px; height: 20px; }
880
+ .cx-rcpt-shot b { font-size: 15px; }
881
+ .cx-rcpt-amt { font-size: 26px; font-weight: 800; letter-spacing: -.02em; font-variant-numeric: tabular-nums; }
882
+ .cx-rcpt-shot dl { display: grid; grid-template-columns: auto 1fr; gap: 6px 14px; width: 100%; margin: 10px 0 0; padding-top: 12px; border-top: 1px dashed rgb(0 0 0 / .15); font-size: 13px; }
883
+ .cx-rcpt-shot dt { color: #6b6b74; }
884
+ .cx-rcpt-shot dd { margin: 0; text-align: right; font-weight: 500; }
885
+ .cx-rcpt-check { display: grid; grid-template-columns: 1fr auto auto; align-items: center; gap: 10px; padding: 10px 12px; border-radius: var(--radius); background: var(--muted); font-size: 13px; }
886
+
887
+ /* ── Board card blocks ── */
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+
896
+
897
+
898
+
899
+
900
+ .cx-map-svg { display: block; width: 100%; height: 96px; }
901
+ .mp-ground { fill: color-mix(in srgb, var(--muted) 70%, var(--background)); }
902
+ .mp-park { fill: color-mix(in srgb, var(--success) 18%, var(--background)); }
903
+ .mp-water { fill: color-mix(in srgb, var(--info) 18%, var(--background)); }
904
+ .mp-street { stroke: var(--background); stroke-width: 7; fill: none; }
905
+ .mp-minor { stroke: var(--background); stroke-width: 3; fill: none; opacity: .8; }
906
+ .mp-route { stroke: var(--selected); stroke-width: 3.5; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 2 0; }
907
+ .mp-shop { fill: var(--foreground); stroke: var(--background); stroke-width: 2.5; }
908
+ .mp-pin { fill: var(--selected); stroke: var(--background); stroke-width: 1.5; }
909
+ .mp-pin-dot { fill: var(--background); }
910
+
911
+
912
+
913
+
914
+
915
+
916
+
917
+
918
+
919
+
920
+
921
+
922
+
923
+
924
+
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+
934
+
935
+ /* board: wider than its box, so it pans; edges fade where there is more */
936
+ .cx-board { scroll-snap-type: none; cursor: grab; --fl: 0px; --fr: 0px; -webkit-mask-image: linear-gradient(to right, transparent, #000 var(--fl), #000 calc(100% - var(--fr)), transparent); mask-image: linear-gradient(to right, transparent, #000 var(--fl), #000 calc(100% - var(--fr)), transparent); }
937
+ .cx-board[data-start] { --fl: 36px; }
938
+ .cx-board[data-end] { --fr: 36px; }
939
+ .cx-board.panning { cursor: grabbing; user-select: none; }
940
+ .cx-board.panning * { pointer-events: none; }
941
+
942
+
943
+
944
+ /* ── card sizes showcase ── */
945
+ .cx-card-sizes { display: grid; grid-template-columns: repeat(3, minmax(0, 280px)); gap: 20px; justify-content: center; align-items: start; width: 100%; }
946
+ .cx-cs-col { display: flex; flex-direction: column; gap: 10px; }
947
+ .cx-cs-h b { display: block; font-size: 14px; font-weight: 600; }
948
+ .cx-cs-h span { display: block; font-size: 12px; color: var(--muted-foreground); line-height: 1.4; min-height: 2.8em; }
949
+
950
+
951
+
952
+
953
+
954
+ @media (max-width: 900px) { .cx-card-sizes { grid-template-columns: minmax(0, 320px); } }
955
+
956
+ /* ── ColorPick host rows ── */
957
+ .cx-cp-field { display: flex; flex-direction: column; gap: 6px; }
958
+ .cx-cp-hint { font-size: 12px; color: var(--muted-foreground); }
959
+ .cx-cp-hint code { font: 11px var(--font-mono); }
960
+ .cx-cp-row { display: flex; align-items: center; gap: 12px; padding: 6px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.2); cursor: pointer; width: fit-content; max-width: 100%; }
961
+ .cx-cp-row:hover { background: color-mix(in srgb, var(--muted) 60%, transparent); }
962
+ .cx-cp-val { font-size: 13px; font-weight: 500; padding-right: 6px; }
963
+ .cx-store-wall { flex: 0 1 380px; display: grid; place-items: center; padding: 32px 24px; border-radius: calc(var(--radius) * 2); box-shadow: inset 0 0 0 1px rgb(0 0 0 / .06); }
964
+
965
+ /* ── Accordion: hover and focus on the whole row (Nova underlines; the row also lights up) ── */
966
+ #acc .cn-accordion-trigger { border-radius: calc(var(--radius) * .8); margin-inline: -8px; padding-inline: 8px; width: calc(100% + 16px); transition: background-color 150ms ease, color 150ms ease; }
967
+ #acc .cn-accordion-trigger:hover { background: color-mix(in srgb, var(--foreground) 6%, transparent); text-decoration: underline; text-underline-offset: 3px; }
968
+ #acc .cn-accordion-trigger:hover .cx-acc-chev { color: var(--foreground); }
969
+ #acc .cn-accordion-trigger:focus-visible { outline: 2px solid var(--ring); outline-offset: 0; }
970
+
971
+ /* ── card groups ── */
972
+
973
+
974
+
975
+
976
+
977
+
978
+
979
+
980
+
981
+
982
+
983
+
984
+
985
+
986
+
987
+
988
+
989
+
990
+
991
+ /* ── one slider look for all (Storio's): 8 px track, 21 px thumb ringed in --primary, value bubble ── */
992
+ .cx-sl-field { gap: 6px; }
993
+ .cx-slider { margin-top: 2.1rem; height: 21px; }
994
+ .cx-slider .cn-slider-track { height: 8px; border-radius: 999px; background: var(--muted); }
995
+ .cx-slider .cn-slider-range { background: var(--primary); border-radius: 999px; }
996
+ .cx-slider .cn-slider-thumb { width: 21px; height: 21px; margin-top: -10.5px; border-radius: 50%; background: var(--background); border: 5px solid var(--primary); box-shadow: 0 2px 5px rgb(0 0 0 / .3); transition: transform .1s ease, box-shadow .15s ease; }
997
+ .cx-slider .cn-slider-thumb[data-drag] { transform: scale(1.12); }
998
+ .cx-slider .cn-slider-thumb:focus-visible { box-shadow: 0 2px 5px rgb(0 0 0 / .3), 0 0 0 4px var(--ring); outline: none; }
999
+ .cx-sl-bubble { position: absolute; bottom: calc(100% + 7px); transform: translateX(-50%); pointer-events: none; background: var(--primary); color: var(--primary-foreground); font-weight: 700; font-size: .72rem; padding: .24rem .5rem; border-radius: 8px; font-variant-numeric: tabular-nums; white-space: nowrap; box-shadow: 0 3px 10px rgb(0 0 0 / .2); }
1000
+ .cx-sl-bubble::after { content: ""; position: absolute; left: 50%; bottom: -4px; transform: translateX(-50%); border: 5px solid transparent; border-top-color: var(--primary); border-bottom: 0; }
1001
+ .mslider .mslider-input { height: 21px; }
1002
+
1003
+ /* ═════ Board card: one vertical rhythm (two measures), full width used ═════ */
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+ /* decision box */
1014
+
1015
+
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+ /* groups: same padding above and below every divider */
1022
+
1023
+
1024
+
1025
+
1026
+
1027
+ /* photos use the whole width: four equal squares */
1028
+
1029
+
1030
+
1031
+
1032
+ /* map, address, tracking, courier: each its own row with the same gap */
1033
+ .cx-map-svg { height: 112px; }
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+ /* actions fill the row: the next step widest, WhatsApp a fixed square at the end */
1045
+
1046
+
1047
+
1048
+
1049
+ /* room to breathe: wider lanes and a wider max example */
1050
+ .cx-board { grid-auto-columns: minmax(292px, 1fr) !important; max-width: 1240px !important; }
1051
+ .cx-card-sizes { grid-template-columns: minmax(0, 300px) minmax(0, 320px) minmax(0, 360px); }
1052
+
1053
+ /* ── compact delivery line on the card ── */
1054
+
1055
+
1056
+
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+ /* footer icon buttons: same square as WhatsApp; the note shows a dot */
1065
+
1066
+
1067
+
1068
+ /* the note bubble */
1069
+ .cx-notepop { width: min(300px, calc(100vw - 32px)); padding: 12px 14px 14px; border-radius: calc(var(--radius) * 1.2); background: var(--foreground); color: var(--background); box-shadow: 0 16px 36px -14px rgb(0 0 0 / .45); font-size: 13.5px; line-height: 1.5;
1070
+ opacity: 0; transform: translateY(4px) scale(.98); transition: opacity 140ms ease, transform 140ms ease !important; transition-property: opacity, transform !important; }
1071
+ .cx-notepop[data-state="open"] { opacity: 1; transform: none; }
1072
+ .cx-notepop-h { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; font-size: 12.5px; }
1073
+ .cx-notepop-h svg { width: 14px; height: 14px; opacity: .7; }
1074
+ .cx-notepop-h b { font-weight: 600; }
1075
+ .cx-notepop p { margin: 0; }
1076
+ .cx-notepop-x { margin-left: auto; display: grid; place-items: center; width: 24px; height: 24px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--background) 14%, transparent); color: inherit; cursor: pointer; }
1077
+ .cx-notepop-x svg { width: 12px; height: 12px; opacity: 1; }
1078
+ /* ── delivery modal: steps aligned to the edges ── */
1079
+ .cx-dl { display: flex; flex-direction: column; gap: 16px; }
1080
+ .cx-dl-map { border-radius: var(--radius); overflow: hidden; box-shadow: inset 0 0 0 1px var(--border); }
1081
+ .cx-dl-map .cx-map-svg { height: 170px; }
1082
+ .cx-dl-addr { display: grid; grid-template-columns: 18px 1fr; gap: 10px; align-items: start; font-size: 14px; }
1083
+ .cx-dl-addr svg { width: 18px; height: 18px; color: var(--primary); margin-top: 1px; }
1084
+ .cx-dl-addr b { display: block; font-weight: 500; line-height: 1.4; }
1085
+ .cx-dl-addr small { display: block; color: var(--muted-foreground); font-size: 13px; margin-top: 2px; }
1086
+ .cx-dl-steps { display: grid; grid-template-columns: repeat(var(--n), 1fr); gap: 6px; }
1087
+ .cx-dl-steps > div { display: flex; flex-direction: column; gap: 8px; font-size: 12.5px; color: var(--muted-foreground); }
1088
+ .cx-dl-steps i { display: block; height: 6px; border-radius: 99px; background: var(--border); }
1089
+ .cx-dl-steps [data-done] i, .cx-dl-steps [data-now] i { background: var(--primary); }
1090
+ .cx-dl-steps [data-now] span { color: var(--foreground); font-weight: 600; }
1091
+ .cx-dl-steps > div:last-child { text-align: right; }
1092
+ .cx-dl-steps > div:not(:first-child):not(:last-child) { text-align: center; }
1093
+ .cx-dl-courier { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 12px; padding: 12px; border-radius: var(--radius); background: color-mix(in srgb, var(--muted) 70%, transparent); font-size: 14px; }
1094
+ .cx-dl-courier b { display: block; font-weight: 600; }
1095
+ .cx-dl-courier small { display: block; color: var(--muted-foreground); font-size: 12.5px; }
1096
+ .cx-dl-eta { text-align: right; }
1097
+ .cx-dl-eta b { font-size: 18px; color: var(--primary); font-variant-numeric: tabular-nums; }
1098
+
1099
+ /* ── head: one line for the name (with WhatsApp next to it), one line for the detail ── */
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+ /* the customer's note: a violet strip right under the person, one line, tap to read */
1108
+
1109
+
1110
+
1111
+
1112
+
1113
+
1114
+
1115
+ /* decision box: compact, the message in one line */
1116
+
1117
+
1118
+
1119
+
1120
+
1121
+
1122
+
1123
+ .cx-req-full { margin: 0; padding: 12px 14px; border-left: 3px solid var(--warning); border-radius: 0 var(--radius) var(--radius) 0; background: color-mix(in srgb, var(--warning) 8%, var(--background)); font-size: 15px; line-height: 1.55; }
1124
+ .cx-req-next { display: flex; flex-direction: column; gap: 6px; font-size: 13px; color: var(--muted-foreground); }
1125
+ .cx-req-next b { color: var(--foreground); font-weight: 600; }
1126
+ .cx-req-next span { display: flex; align-items: center; gap: 6px; }
1127
+ .cx-req-next svg { width: 14px; height: 14px; }
1128
+ /* footer: the state change is THE button (filled), the rest secondary */
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+ /* ═════ minimal card: it only informs; reading and deciding happen in a modal ═════ */
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+
1151
+ /* products: a small strip */
1152
+
1153
+
1154
+
1155
+ /* the payment badge is the way into the receipt */
1156
+
1157
+
1158
+
1159
+
1160
+ /* footer: just the state change */
1161
+
1162
+
1163
+ .cx-req-full[data-tone="bad"] { border-left-color: var(--destructive); background: color-mix(in srgb, var(--destructive) 7%, var(--background)); }
1164
+ .cx-req-full[data-tone="info"] { border-left-color: var(--info); background: color-mix(in srgb, var(--info) 7%, var(--background)); }
1165
+
1166
+
1167
+ /* attention icons: tinted by kind, a dot says «pending» */
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+
1177
+
1178
+
1179
+ /* attention icons: their own row under the person, aligned with the name */
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+ /* real buttons look like buttons; information has no button chrome */
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+
1192
+
1193
+ /* the showcase stacks on narrow screens */
1194
+ @media (max-width: 1000px) { .cx-card-sizes { grid-template-columns: minmax(0, 360px); } }
1195
+
1196
+ /* long text never breaks a line: it ends in an ellipsis */
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+ /* the contact channel the customer chose, on the right */
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+ .cx-req-full[data-tone="note"] { border-left-color: var(--selected); background: var(--selected-soft); }
1210
+ /* Stripe receipt */
1211
+ .cx-stripe { display: flex; flex-direction: column; gap: 14px; }
1212
+ .cx-stripe-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
1213
+ .cx-stripe-amt { font-size: 28px; font-weight: 800; letter-spacing: -.02em; }
1214
+ .cx-stripe dl { display: grid; grid-template-columns: auto 1fr; gap: 8px 16px; margin: 0; padding: 14px; border-radius: var(--radius); background: color-mix(in srgb, var(--muted) 70%, transparent); font-size: 13.5px; }
1215
+ .cx-stripe dt { color: var(--muted-foreground); }
1216
+ .cx-stripe dd { margin: 0; text-align: right; }
1217
+
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+ /* card badges: quiet text with a colored dot, no tinted pill */
1224
+ .cx-modal .cx-rcpt-check .cn-badge { height: auto; padding: 0; border: 0; border-radius: 0; background: none !important; color: var(--foreground); font-size: 12.5px; font-weight: 500; gap: 6px; }
1225
+
1226
+
1227
+
1228
+
1229
+
1230
+
1231
+ /* extras stay a light outlined chip */
1232
+
1233
+
1234
+
1235
+ /* ═════ library extensions (generic, reusable by any component) ═════ */
1236
+ /* Badge · variant="status": quiet text with a tone dot */
1237
+ .cn-badge[data-variant="status"] { height: auto; padding: 0; border: 0; background: none; color: var(--foreground); font-size: 12.5px; font-weight: 500; gap: 6px; --tone: var(--muted-foreground); }
1238
+ .cn-badge[data-variant="status"]::before { content: ""; width: 7px; height: 7px; border-radius: 99px; background: var(--tone); flex: none; }
1239
+ .cn-badge[data-variant="status"][data-tone="ok"] { --tone: var(--success); }
1240
+ .cn-badge[data-variant="status"][data-tone="wait"] { --tone: var(--warning); font-weight: 600; }
1241
+ .cn-badge[data-variant="status"][data-tone="info"] { --tone: var(--info); font-weight: 600; }
1242
+ .cn-badge[data-variant="status"][data-tone="bad"] { --tone: var(--destructive); font-weight: 600; }
1243
+ /* Button · tonal: tinted by a tone (or a brand colour via --brand) */
1244
+ .cn-button.cx-tonal { --tone: var(--info); background: color-mix(in srgb, var(--tone) 13%, transparent); color: var(--tone); }
1245
+ .cn-button.cx-tonal:hover { background: color-mix(in srgb, var(--tone) 22%, transparent); color: var(--tone); }
1246
+ .cn-button.cx-tonal[data-tone="wait"] { --tone: var(--warning); }
1247
+ .cn-button.cx-tonal[data-tone="bad"] { --tone: var(--destructive); }
1248
+ .cn-button.cx-tonal[data-tone="ok"] { --tone: var(--success); }
1249
+ .cn-button.cx-tonal[data-tone="note"] { --tone: var(--selected); }
1250
+ .cn-button.cx-tonal[data-tone="brand"] { --tone: var(--brand); border-radius: 99px; }
1251
+ /* Indicator: a pending dot on any control */
1252
+ .cx-has-indicator { position: relative; overflow: visible; }
1253
+ .cx-indicator { position: absolute; top: -3px; right: -3px; width: 9px; height: 9px; border-radius: 99px; background: var(--tone, var(--selected)); box-shadow: 0 0 0 2px var(--card); }
1254
+ .cx-indicator[data-tone="wait"] { --tone: var(--warning); } .cx-indicator[data-tone="bad"] { --tone: var(--destructive); } .cx-indicator[data-tone="info"] { --tone: var(--info); } .cx-indicator[data-tone="note"] { --tone: var(--selected); }
1255
+ /* Avatar · shape="square" (product thumbnails) */
1256
+ .cn-avatar[data-shape="square"] { border-radius: calc(var(--radius) * .7); }
1257
+ .cn-avatar[data-shape="square"] .cn-avatar-image, .cn-avatar[data-shape="square"] .cn-avatar-fallback { border-radius: inherit; }
1258
+ .cn-avatar[data-shape="square"] .cn-avatar-fallback { font-size: 12px; font-weight: 600; color: var(--muted-foreground); }
1259
+ /* layout + text helpers */
1260
+ .cx-hstack { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
1261
+ .cx-fill { width: 100%; justify-content: center; }
1262
+ .cx-ellipsis { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1263
+ .cx-strong { font-weight: 600; }
1264
+ .cn-item-content { min-width: 0; }
1265
+ .cn-item-description .cx-ellipsis, .cn-item-description { overflow: hidden; text-overflow: ellipsis; }
1266
+
1267
+ /* ═════ board behaviour only (the look is the Card atom) ═════ */
1268
+ .cx-bcard { cursor: grab; touch-action: none; user-select: none; transition: transform 200ms cubic-bezier(.22, 1, .36, 1), box-shadow 150ms; }
1269
+ .cx-bcard-static { cursor: default; touch-action: auto; user-select: auto; }
1270
+ .cx-bcard:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
1271
+ .cx-bcard[data-lifted], .cx-bcard[data-held] { box-shadow: 0 0 0 2px var(--selected), 0 12px 28px -10px rgb(0 0 0 / .3); }
1272
+ .cx-bcard[data-held] { transform: scale(1.03); }
1273
+ .cx-bcard.cx-dragging { position: fixed; z-index: var(--z-toast); transition: none; cursor: grabbing; box-shadow: 0 16px 36px -12px rgb(0 0 0 / .35); transform: rotate(1.5deg); pointer-events: none; }
1274
+ .cx-bcard button, .cx-bcard a { cursor: pointer; }
1275
+ .cx-vstack { display: flex; flex-direction: column; gap: 8px; width: 100%; }
1276
+ .cx-vstack > .cx-hstack { flex-wrap: wrap; }
1277
+
1278
+ /* ═════ atoms: Button sizes (every button has a defined height) and its «chosen» state ═════ */
1279
+ /* tile: a button that stacks an icon/number over a label — 56 px; tile-lg — 76 px */
1280
+ .cn-button.cx-size-tile { height: 56px; padding: 0 6px; flex-direction: column; gap: 2px; font-size: 11.5px; line-height: 1.1; }
1281
+ .cn-button.cx-size-tile-lg { height: 76px; padding: 0 4px; flex-direction: column; gap: 6px; font-size: 12px; line-height: 1.1; }
1282
+ /* chosen: a pressed toggle wears --selected */
1283
+ /* selected wins over every variant and theme (Nova's dark outline background is more specific than a bare class) */
1284
+ .style-nova .cn-button[aria-pressed="true"][aria-pressed], [data-skin] .cn-button[aria-pressed="true"][aria-pressed] { background: var(--selected); border-color: var(--selected); color: var(--selected-foreground); }
1285
+ .style-nova .cn-button[aria-pressed="true"][aria-pressed]:hover, [data-skin] .cn-button[aria-pressed="true"][aria-pressed]:hover { background: var(--selected); color: var(--selected-foreground); }
1286
+ /* Badge · size lg (28 px) for chips that carry a button */
1287
+ .cn-badge.cx-chip { height: 28px; padding: 0 2px 0 10px; gap: 2px; font-size: 12.5px; }
1288
+ .cn-badge.cx-chip .cn-button { border-radius: 99px; }
1289
+ .cn-badge.cx-chip .cn-button svg { width: 12px; height: 12px; }
1290
+
1291
+ /* ═════ molecules built from those atoms (only what composition needs) ═════ */
1292
+ /* Tabs = Buttons + a sliding indicator + a count Badge */
1293
+ .cx-tab { position: relative; z-index: 1; color: color-mix(in srgb, var(--foreground) 62%, transparent); }
1294
+ .cx-tab:hover { background: transparent; color: var(--foreground); }
1295
+ .cx-tab[aria-selected="true"] { color: var(--foreground); }
1296
+ .cx-tabs.line .cx-tab { height: 36px; border-radius: 0; }
1297
+ .cx-tab .cx-count { min-width: 18px; height: 18px; padding: 0 5px; border-radius: 99px; background: color-mix(in srgb, var(--foreground) 9%, transparent); font-size: 11px; font-variant-numeric: tabular-nums; display: inline-grid; place-items: center; }
1298
+ .cx-tab[aria-selected="true"] .cx-count { background: var(--selected); color: var(--selected-foreground); }
1299
+ .cx-tabs:not(.line) .cx-tab-ind { height: 28px; }
1300
+ /* booking: day tile + hour buttons */
1301
+ .cx-day small { font-size: 11px; color: var(--muted-foreground); text-transform: uppercase; letter-spacing: .04em; }
1302
+ .cx-day b { font-size: 16px; font-weight: 600; font-variant-numeric: tabular-nums; }
1303
+ .cx-day i { width: 4px; height: 4px; border-radius: 99px; background: var(--success); }
1304
+ .cx-day[data-full] i, .cx-day:disabled i { background: transparent; }
1305
+ .cx-day[aria-pressed="true"] small { color: inherit; opacity: .8; }
1306
+ .cx-day[aria-pressed="true"] i { background: currentColor; }
1307
+ .cx-hour-grid .cn-button { width: 100%; font-variant-numeric: tabular-nums; }
1308
+ .cx-hour-skel { height: 28px; }
1309
+ /* table header sort buttons */
1310
+ .cx-th { margin-left: -6px; color: inherit; }
1311
+ .cx-th svg { width: 13px; height: 13px; opacity: .55; }
1312
+ th[aria-sort="ascending"] .cx-th, th[aria-sort="descending"] .cx-th { color: var(--foreground); }
1313
+ th[aria-sort="ascending"] .cx-th svg, th[aria-sort="descending"] .cx-th svg { opacity: 1; color: var(--selected); }
1314
+ .cx-dt-num .cx-th { margin-left: 0; margin-right: -6px; flex-direction: row-reverse; }
1315
+ /* phone bottom bar */
1316
+ .cx-ph-tab { width: 100%; color: var(--muted-foreground); position: relative; }
1317
+ .cx-ph-tab svg { width: 22px !important; height: 22px !important; }
1318
+ .cx-ph-tab[aria-current] { color: var(--selected); background: transparent; }
1319
+ .cx-ph-tab[aria-current]::after { content: ""; position: absolute; bottom: 4px; width: 4px; height: 4px; border-radius: 99px; background: var(--selected); }
1320
+ /* carousel dots: a real button (24 px) with a small mark */
1321
+ .cx-dotb .cx-dot-mark { width: 8px; height: 8px; border-radius: 99px; background: color-mix(in srgb, var(--foreground) 22%, transparent); transition: width 240ms cubic-bezier(.22, 1, .36, 1), background-color 200ms; }
1322
+ .cx-dotb[aria-selected="true"] { width: 34px; }
1323
+ .cx-dotb[aria-selected="true"] .cx-dot-mark { width: 22px; background: var(--selected); }
1324
+ .cx-car-dots { display: flex; gap: 0; }
1325
+ /* drag handle */
1326
+ .cx-grip { cursor: grab; touch-action: none; color: var(--muted-foreground); flex: none; }
1327
+ /* a field-like trigger (date / time) */
1328
+ .cx-picker-field { width: 100%; justify-content: flex-start; font-weight: 400; }
1329
+ .cx-picker-field span { flex: 1; text-align: left; }
1330
+ .cx-picker-field svg { color: var(--muted-foreground); }
1331
+ /* share targets */
1332
+ .cx-sh-tg { width: 72px; flex: 0 0 auto; color: var(--foreground); text-decoration: none; }
1333
+ .cx-sh-tg .cx-sh-ic { width: 46px; height: 46px; border-radius: 99px; display: grid; place-items: center; background: #fff; color: var(--brand); border: 1px solid rgb(20 16 40 / .06); box-shadow: 0 6px 16px -8px rgb(20 16 40 / .45); }
1334
+ .cx-sh-tg .cx-sh-ic.plain { background: var(--muted); color: var(--foreground); border-color: transparent; box-shadow: none; }
1335
+ .cx-sh-tg .cx-sh-ic svg { width: 22px !important; height: 22px !important; }
1336
+ .cx-sh-tg:hover { background: var(--accent); }
1337
+ .cx-sh-copybtn { flex: none; min-width: 5.5rem; }
1338
+
1339
+ /* Card · size sm: compact rhythm. Items sit edge to edge, separated only by the hairline:
1340
+ text-to-text = item padding (10) + line + item padding (10). No gap or margin stacks on top. */
1341
+ .cn-card[data-size="sm"] { gap: 0; padding-block: 0; }
1342
+ .cn-card[data-size="sm"] > .cn-card-header { padding: 12px 12px 4px; }
1343
+ .cn-card[data-size="sm"] > .cn-card-content { padding: 0 12px; }
1344
+ .cn-card[data-size="sm"] > .cn-card-footer { margin-top: 8px; padding: 10px 12px; }
1345
+ .cn-card[data-size="sm"] .cn-item-group { gap: 0; }
1346
+ .cn-card[data-size="sm"] .cn-item-separator { margin-block: 0; }
1347
+ .cn-card[data-size="sm"] .cn-item { padding: 10px 4px; }
1348
+ .cn-card[data-size="sm"] .cn-card-header .cn-item { padding: 0 4px 8px; }
1349
+ .cn-card[data-size="sm"] .cn-item-footer { margin-top: 2px; }
1350
+
1351
+ /* ═════ atom: Text ═════ */
1352
+ .cx-text { color: var(--foreground); font-size: 14px; line-height: 1.45; }
1353
+ .cx-text[data-variant="title"] { font-size: 16px; font-weight: 600; letter-spacing: -.01em; }
1354
+ .cx-text[data-variant="heading"] { font-size: 14px; font-weight: 600; }
1355
+ .cx-text[data-variant="strong"] { font-weight: 600; font-variant-numeric: tabular-nums; }
1356
+ .cx-text[data-variant="muted"] { font-size: 13px; color: var(--muted-foreground); }
1357
+ .cx-text[data-variant="caption"] { font-size: 12px; color: var(--muted-foreground); }
1358
+ .cx-text[data-variant="label"] { font-size: 12.5px; font-weight: 600; }
1359
+ p.cx-text { margin: 0; }
1360
+ /* ═════ atom: Stepper (Progress per step) ═════ */
1361
+ .cx-stepper { display: grid; grid-template-columns: repeat(var(--n), 1fr); gap: 6px; margin-top: 6px; }
1362
+ .cx-step { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
1363
+ .cx-step .cn-progress { height: 4px; }
1364
+ .cx-step .cx-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1365
+ .cx-step[data-now] .cx-text { color: var(--foreground); }
1366
+ /* choice = Item as a radio */
1367
+ .cx-choice { cursor: pointer; }
1368
+ .cx-choice[aria-checked="true"] { border-color: var(--selected); background: var(--selected-soft); }
1369
+ .cx-choice:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
1370
+ .cx-wz-days { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
1371
+ .cx-wz-sum .cn-item { padding-inline: 0; }
1372
+ /* generic cards grid */
1373
+ .cx-generic { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 290px), 1fr)); gap: 20px; width: 100%; max-width: 1240px; align-items: start; }
1374
+ .cx-modal-head .cx-stepper { margin-right: -32px; }
1375
+
1376
+ /* table filters (molecule: InputGroup + Buttons + Popover/Command + Badges) */
1377
+ .cx-dt-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; margin-bottom: 10px; }
1378
+ .cx-dt-tools { gap: 8px; }
1379
+ .cx-dt-search { width: 240px; max-width: 100%; }
1380
+ .cx-fbtn.cx-dashed { border-style: dashed; }
1381
+ .cx-fbtn .cn-badge { height: 20px; }
1382
+ .cx-fsep { height: 16px; margin: 0 2px; }
1383
+ .cx-dt-chips { gap: 6px; margin-bottom: 10px; }
1384
+ .cx-fpop { width: 240px; padding: 0; overflow: hidden; }
1385
+ .cx-fpop .cx-vstack { padding: 6px; }
1386
+ .cx-fpop .cx-vstack:has(.cx-frange) { padding: 12px; }
1387
+ .cx-fpop .cn-command-list { max-height: 260px; }
1388
+ .cx-fpop .cn-command-item { gap: 8px; cursor: pointer; }
1389
+ .cx-fpop .cn-command-item:focus-visible, .cx-fpop .cn-command-item:hover { background: var(--accent); outline: none; }
1390
+ .cx-fpop .cn-command-item .cn-checkbox { pointer-events: none; }
1391
+ .cx-fcount { margin-left: auto; font-size: 12px; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
1392
+ .cx-fclear-one { width: 100%; justify-content: center; border: 0; background: none; color: var(--foreground); font: inherit; font-size: 13px; }
1393
+ .cx-frange { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
1394
+ .cx-left { justify-content: flex-start; }
1395
+ .cx-dt-empty { padding: 28px 12px; }
1396
+
1397
+ /* ═════ Carousel (molecule) ═════ */
1398
+ .cx-car-demo { display: flex; flex-direction: column; gap: 10px; width: 100%; max-width: 820px; margin: 0 auto; }
1399
+ .cx-car { display: flex; flex-direction: column; gap: 12px; --gap: 12px; }
1400
+ .cx-car-view { position: relative; }
1401
+ .cx-car-track { display: grid; grid-auto-flow: column; grid-auto-columns: calc((100% - (var(--per) - 1) * var(--gap)) / var(--per)); gap: var(--gap); overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; overscroll-behavior-x: contain; scrollbar-width: none; border-radius: calc(var(--radius) * 1.2); }
1402
+ .cx-car-track::-webkit-scrollbar { display: none; }
1403
+ .cx-car-track.dragging { scroll-snap-type: none; scroll-behavior: auto; cursor: grabbing; user-select: none; }
1404
+ .cx-car-track:focus-visible { outline: 2px solid var(--ring); outline-offset: 4px; }
1405
+ .cx-car-slide { scroll-snap-align: start; min-width: 0; }
1406
+ .cx-car[data-center] .cx-car-track { grid-auto-columns: 72%; padding-inline: 14%; }
1407
+ .cx-car[data-center] .cx-car-slide { scroll-snap-align: center; transition: transform 260ms cubic-bezier(.22, 1, .36, 1), opacity 260ms; transform: scale(.92); opacity: .55; }
1408
+ .cx-car[data-center] .cx-car-slide[data-active] { transform: none; opacity: 1; }
1409
+ .cx-car-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 28px; }
1410
+ .cx-car-ind { flex: 1; min-width: 0; }
1411
+ .cx-car-ind .cn-progress { flex: 1; max-width: 220px; }
1412
+ .cx-car-view[data-arrows="overlay"] .cx-car-arrow { position: absolute; top: 50%; margin-top: -14px; z-index: 2; border-radius: 99px; background: var(--background); box-shadow: 0 2px 8px rgb(0 0 0 / .15); }
1413
+ .cx-car-view[data-arrows="overlay"] [data-car="prev"] { left: 10px; }
1414
+ .cx-car-view[data-arrows="overlay"] [data-car="next"] { right: 10px; }
1415
+ .cn-avatar[data-fill] { width: 100%; height: auto; aspect-ratio: 1; }
1416
+ .cx-hero { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end; gap: 6px; height: 220px; padding: 22px 56px; border-radius: calc(var(--radius) * 1.4); color: #fff; }
1417
+ .cx-hero .cx-text { color: #fff; }
1418
+ .cx-hero .cx-text[data-variant="title"] { font-size: 22px; }
1419
+ .cx-hero .cn-button { margin-top: 8px; }
1420
+ .cx-gallery-img { height: 300px; border-radius: calc(var(--radius) * 1.4); }
1421
+ .cx-thumb { padding: 2px; border-radius: calc(var(--radius) * .8); }
1422
+ .cx-thumb .cn-avatar { width: 100%; height: 100%; }
1423
+ .cx-thumb[aria-pressed="true"] { background: transparent; box-shadow: 0 0 0 2px var(--selected); }
1424
+ .cx-car-card .cn-card-header { padding: 12px 12px 4px; }
1425
+ @media (max-width: 640px) { .cx-car { --per: var(--per-sm) !important; } }
1426
+
1427
+ /* filters on the phone: search fills the row, «Filtros» beside it; chips scroll sideways */
1428
+ .cx-dt-host:has(.cx-fbtn-m) .cx-dt-tools { width: 100%; flex-wrap: nowrap; }
1429
+ .cx-dt-host:has(.cx-fbtn-m) .cx-dt-search { flex: 1; width: auto; }
1430
+ .cx-fbtn-m { flex: none; }
1431
+ .cx-fbtn-m .cn-badge { height: 18px; min-width: 18px; padding: 0 5px; margin-left: 2px; }
1432
+ .cx-dt-host:has(.cx-fbtn-m) .cx-dt-toolbar { flex-direction: column; align-items: stretch; }
1433
+ .cx-dt-host:has(.cx-fbtn-m) .cx-dt-chips { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent); mask-image: linear-gradient(to right, #000 calc(100% - 24px), transparent); }
1434
+ .cx-dt-chips .cx-chip { flex: none; }
1435
+ .cx-fsheet-opt { width: 100%; border: 0; background: none; font: inherit; color: inherit; text-align: left; gap: 10px; min-height: 40px; cursor: pointer; border-radius: calc(var(--radius) * .8); }
1436
+ .cx-fsheet-opt:hover { background: var(--accent); }
1437
+ .cx-dt-scroll { overflow-anchor: none; }
1438
+ .cx-chip.out { animation: cx-chip-out 160ms ease forwards; }
1439
+
1440
+ /* sidebar tokens come from the skin */
1441
+ .style-nova, [data-skin] { --sidebar: color-mix(in srgb, var(--muted) 55%, var(--background)); --sidebar-foreground: var(--foreground); --sidebar-accent: color-mix(in srgb, var(--foreground) 6%, transparent); --sidebar-accent-foreground: var(--foreground); --sidebar-border: var(--border); --sidebar-ring: var(--ring); --sidebar-width: 15rem; --sidebar-width-icon: 3rem; }
1442
+ /* chosen nav entry = the system's «you are here» (violet + dot), like everywhere else */
1443
+ .cn-sidebar-menu-button[data-active="true"] { background: var(--selected-soft); color: var(--selected); font-weight: 600; }
1444
+ .cn-sidebar-menu-button[data-active="true"] svg { color: var(--selected); }
1445
+ .cn-sidebar-menu-button svg { width: 16px; height: 16px; flex: none; }
1446
+ .cn-sidebar-menu-button { cursor: pointer; border: 0; background: transparent; color: var(--sidebar-foreground); font: inherit; font-size: 14px; }
1447
+ .cn-sidebar-menu-button > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1448
+ .cx-sb-two { display: flex; flex-direction: column; min-width: 0; flex: 1; line-height: 1.2; }
1449
+ .cx-sb-two .cx-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1450
+ .cn-sidebar-menu { list-style: none; margin: 0; padding: 0; gap: 2px; }
1451
+ .cn-sidebar-menu-badge { background: color-mix(in srgb, var(--foreground) 8%, transparent); }
1452
+
1453
+ /* ═════ App frame (the shell is a molecule of Sidebar + Inset + Sheet) ═════ */
1454
+ .cx-app { position: relative; display: flex; height: 600px; width: 100%; max-width: 1180px; margin: 0 auto; border-radius: calc(var(--radius) * 1.6); overflow: hidden; background: var(--background); box-shadow: 0 0 0 1px var(--border), 0 24px 60px -30px rgb(0 0 0 / .35); transition: max-width 320ms cubic-bezier(.22, 1, .36, 1); }
1455
+ .cx-app[data-narrow] { max-width: 390px; }
1456
+ .cx-app-sb { flex: none; width: var(--sidebar-width); border-right: 1px solid var(--sidebar-border); transition: width 220ms cubic-bezier(.22, 1, .36, 1); overflow: hidden; }
1457
+ .cx-app-sb[data-collapsible="icon"] { width: var(--sidebar-width-icon); }
1458
+ .cx-app-sb .cn-sidebar-inner { height: 100%; display: flex; flex-direction: column; padding: 8px; gap: 8px; }
1459
+ .cx-app-sb .cn-sidebar-content { gap: 6px; }
1460
+ .cx-app-sb[data-collapsible="icon"] .cx-sb-two, .cx-app-sb[data-collapsible="icon"] .cn-sidebar-menu-button > span:not([data-slot="avatar"]), .cx-app-sb[data-collapsible="icon"] .cn-sidebar-menu-badge, .cx-app-sb[data-collapsible="icon"] .cn-sidebar-menu-button > svg:last-child:not(:first-child) { display: none; }
1461
+ .cx-app-sb[data-collapsible="icon"] .cn-sidebar-menu-button-size-lg { width: 32px !important; height: 32px !important; padding: 0 !important; justify-content: center; }
1462
+ .cx-app-sb[data-collapsible="icon"] .cn-sidebar-menu-button-size-lg .cn-avatar { width: 28px; height: 28px; }
1463
+ .cx-app-main { position: relative; flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; }
1464
+ .cx-app-top { display: flex; align-items: center; gap: 8px; height: 52px; padding: 0 14px; border-bottom: 1px solid var(--border); flex: none; }
1465
+ .cx-app-vsep { height: 18px; }
1466
+ .cx-grow { flex: 1; }
1467
+ .cx-app-search { width: 220px; justify-content: flex-start; color: var(--muted-foreground); }
1468
+ .cx-app-search .cx-app-search-t { flex: 1; text-align: left; }
1469
+ .cx-app-page { flex: 1; overflow-y: auto; padding: 20px 22px 28px; display: flex; flex-direction: column; gap: 18px; scrollbar-width: thin; }
1470
+ .cx-app-head { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 12px; }
1471
+ .cx-app-head h1.cx-text { margin: 0; font-size: 22px; }
1472
+ .cx-app-list { gap: 8px; }
1473
+ .cx-app-row { width: 100%; text-align: left; font: inherit; color: inherit; background: var(--background); cursor: pointer; transition: background-color 150ms, border-color 150ms; }
1474
+ .cx-app-row:hover { background: color-mix(in srgb, var(--foreground) 3%, var(--background)); }
1475
+ .cx-app-row[data-active] { border-color: var(--selected); background: var(--selected-soft); }
1476
+ .cx-app-row .cn-item-actions { gap: 14px; }
1477
+ /* detail Sheet: inside the frame, slides from the right */
1478
+ .cx-app .cn-sheet-content.cx-app-sheet[data-side] { position: absolute; top: 0; bottom: 0; right: 0; left: auto; height: auto; max-width: none; width: min(380px, 100%); border-left: 1px solid var(--border); box-shadow: -18px 0 40px -24px rgb(0 0 0 / .3); gap: 0; z-index: 3; transform: translateX(100%); transition: transform 240ms cubic-bezier(.22, 1, .36, 1); }
1479
+ .cx-app .cn-sheet-content.cx-app-sheet[data-side][data-state="open"] { transform: none; }
1480
+ .cx-app-sheet .cn-sheet-header { padding: 16px 16px 8px; }
1481
+ .cx-app-sheet-body { flex: 1; overflow-y: auto; padding: 0 12px; scrollbar-width: thin; }
1482
+ .cx-app-sheet-body .cn-item-group { gap: 0; }
1483
+ .cx-app-sheet-body .cn-item-separator { margin-block: 0; }
1484
+ .cx-app-sheet .cn-sheet-footer { display: flex; flex-direction: row; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--border); }
1485
+ .cx-app-sheet .cn-sheet-footer .cx-go { flex: 1; }
1486
+ .cx-app-scrim { position: absolute; inset: 0; z-index: 2; background: var(--overlay); opacity: 0; transition: opacity 200ms; }
1487
+ .cx-app-scrim[data-state="open"] { opacity: 1; }
1488
+ /* timeline (molecule: Text + a line) */
1489
+ .cx-timeline { list-style: none; margin: 0; padding: 0 0 0 4px; display: flex; flex-direction: column; gap: 12px; }
1490
+ .cx-timeline li { position: relative; display: flex; flex-direction: column; padding-left: 18px; }
1491
+ .cx-timeline li::before { content: ""; position: absolute; left: 0; top: 6px; width: 8px; height: 8px; border-radius: 99px; background: var(--border); }
1492
+ .cx-timeline li:not(:last-child)::after { content: ""; position: absolute; left: 3.5px; top: 18px; bottom: -10px; width: 1px; background: var(--border); }
1493
+ .cx-timeline li[data-now]::before { background: var(--selected); box-shadow: 0 0 0 4px var(--selected-soft); }
1494
+ /* the shell on a narrow box: sidebar becomes an off-canvas menu */
1495
+ .cx-app[data-mobile] .cx-app-sb { position: absolute; z-index: 4; top: 0; bottom: 0; left: 0; width: min(270px, 85%); transform: translateX(-102%); transition: transform 240ms cubic-bezier(.22, 1, .36, 1); box-shadow: 18px 0 40px -24px rgb(0 0 0 / .35); }
1496
+ .cx-app[data-mobile][data-sb-open] .cx-app-sb { transform: none; }
1497
+ .cx-app[data-mobile] [data-app-scrim]:not([hidden]) { opacity: 1; z-index: 3; }
1498
+ .cx-app[data-mobile] .cx-app-search { width: 36px; padding: 0; justify-content: center; }
1499
+ .cx-app[data-mobile] .cx-app-search .cx-app-search-t, .cx-app[data-mobile] .cx-app-search .cn-kbd, .cx-app[data-mobile] nav[aria-label="Migas"] { display: none; }
1500
+ .cx-app[data-mobile] .cx-app-page { padding: 16px 14px 24px; }
1501
+ .cx-app[data-mobile] .cx-app-row .cn-item-actions .cn-badge { display: none; }
1502
+ /* command */
1503
+ .cx-cmd { border: 0; background: none; }
1504
+ .cx-cmd .cn-command-list { max-height: 320px; }
1505
+ .cx-cmd-label { padding: 8px 8px 4px; }
1506
+ .cx-cmd .cn-command-item { cursor: pointer; }
1507
+ .cx-cmd-help { gap: 14px; }
1508
+ .cx-cmd-help .cn-kbd { margin-right: 3px; }
1509
+ .cx-app .cn-sheet-overlay.cx-app-scrim { position: absolute; }
1510
+ .cn-command-input-group .cn-command-input.cn-input-group-input { padding: 0 8px; }
1511
+
1512
+
1513
+ /* ═════════════════════════ 3. sys ═════════════════════════ */
1514
+ /* ═════ Button · icon motion on hover (atom-level, every button with an icon) ═════ */
1515
+ .cn-button svg { transition: transform 180ms cubic-bezier(.22, 1, .36, 1); }
1516
+ @media (hover: hover) and (prefers-reduced-motion: no-preference) {
1517
+ .cn-button:not(:disabled):hover > svg:last-child:not(:first-child) { transform: translateX(2px); } /* trailing arrow moves on */
1518
+ .cn-button:not(:disabled):hover > svg:first-child:not(:last-child) { transform: scale(1.12); } /* leading icon lifts */
1519
+ .cn-button:not(:disabled):hover > svg:first-child:not(:last-child):has(use[href="#plus"]) { transform: rotate(90deg); }
1520
+ .cn-button:not(:disabled):hover > svg:only-child { transform: scale(1.12); }
1521
+ .cn-button:not(:disabled):hover > svg:only-child:has(use[href="#left"]) { transform: translateX(-2px); }
1522
+ .cn-button:not(:disabled):hover > svg:only-child:has(use[href="#right"]) { transform: translateX(2px); }
1523
+ .cn-button:not(:disabled):hover > svg:only-child:has(use[href="#x"]) { transform: rotate(90deg); }
1524
+ .cn-button:not(:disabled):hover > svg:only-child:has(use[href="#i-send"]) { transform: translate(2px, -2px); }
1525
+ .cn-button:not(:disabled):hover > svg:only-child:has(use[href="#i-bell"]) { animation: cx-ring 600ms ease; }
1526
+ .cn-button:not(:disabled):active > svg { transform: scale(.92); }
1527
+ }
1528
+ @keyframes cx-ring { 20% { transform: rotate(14deg); } 40% { transform: rotate(-12deg); } 60% { transform: rotate(8deg); } 80% { transform: rotate(-4deg); } }
1529
+
1530
+ /* ═════ Calendar ═════ */
1531
+ .cx-cal { position: relative; display: inline-flex; flex-direction: column; gap: 8px; padding: 12px; border-radius: calc(var(--radius) * 1.2); box-shadow: 0 0 0 1px var(--border); background: var(--background); }
1532
+ .cx-cal-nav { position: absolute; top: 10px; left: 8px; right: 8px; display: flex; justify-content: space-between; pointer-events: none; }
1533
+ .cx-cal-nav .cn-button { pointer-events: auto; }
1534
+ .cx-cal-months { display: flex; gap: 24px; flex-wrap: wrap; }
1535
+ .cx-cal-title { height: 28px; display: grid; place-items: center; margin-bottom: 4px; }
1536
+ .cx-cal-grid { display: grid; grid-template-columns: repeat(7, 32px); row-gap: 2px; }
1537
+ .cx-cal-wd { height: 28px; display: grid; place-items: center; }
1538
+ .cx-cal-day { font-variant-numeric: tabular-nums; font-weight: 400; position: relative; }
1539
+ .cx-cal-day[data-out] { color: color-mix(in srgb, var(--muted-foreground) 55%, transparent); }
1540
+ .cx-cal-day[data-today]::after { content: ""; position: absolute; bottom: 4px; left: 50%; width: 4px; height: 4px; margin-left: -2px; border-radius: 99px; background: currentColor; }
1541
+ .cx-cal-day[data-range="mid"] { background: var(--selected-soft); color: var(--foreground); border-radius: 0; }
1542
+ .cx-cal-day[data-range="edge"] { font-weight: 600; }
1543
+ .cx-cal-day:disabled { opacity: .35; }
1544
+ .cx-cal-day:focus-visible { outline: 2px solid var(--ring); outline-offset: 1px; z-index: 1; }
1545
+ .cx-range-wrap { display: flex; gap: 12px; align-items: flex-start; flex-wrap: wrap; }
1546
+ .cx-range-presets .cn-button { width: 9.5rem; }
1547
+
1548
+ /* ═════ Agenda ═════ */
1549
+ .cx-agenda { display: flex; flex-direction: column; gap: 12px; width: 100%; max-width: 1080px; margin: 0 auto; }
1550
+ .cx-ag-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; }
1551
+ .cx-ag-scroll { max-height: 520px; overflow: auto; }
1552
+ .cx-ag { position: relative; display: grid; grid-template-rows: 36px 1fr; min-width: calc(56px + var(--cols) * 140px); }
1553
+ .cx-ag-head { position: sticky; top: 0; z-index: 3; display: grid; grid-template-columns: 56px repeat(var(--cols), 1fr); background: var(--background); border-bottom: 1px solid var(--border); }
1554
+ .cx-ag-colhead { display: grid; place-items: center; font-size: 13px; font-weight: 600; border-left: 1px solid var(--border); }
1555
+ .cx-ag-body { position: relative; display: grid; grid-template-columns: 56px repeat(var(--cols), 1fr); background-image: repeating-linear-gradient(to bottom, var(--border) 0 1px, transparent 1px var(--h)); }
1556
+ .cx-ag-times { position: relative; }
1557
+ .cx-ag-times span { position: absolute; right: 8px; transform: translateY(-50%); }
1558
+ .cx-ag-times span:first-child { transform: none; }
1559
+ .cx-ag-col { position: relative; border-left: 1px solid var(--border); }
1560
+ .cx-ag-slot { position: absolute; left: 0; right: 0; border: 0; background: transparent; cursor: pointer; }
1561
+ .cx-ag-slot:hover { background: color-mix(in srgb, var(--selected) 6%, transparent); }
1562
+ .cx-ag-ev { --tone: var(--info); position: absolute; left: 4px; right: 4px; z-index: 1; display: flex; flex-direction: column; align-items: flex-start; gap: 0; overflow: hidden; padding: 4px 8px; border: 0; border-radius: calc(var(--radius) * .7); background: color-mix(in srgb, var(--tone) 20%, var(--background)); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--tone) 28%, transparent); color: var(--foreground); font: inherit; text-align: left; cursor: grab; touch-action: none; transition: box-shadow 150ms, top 160ms cubic-bezier(.22, 1, .36, 1); }
1563
+ .cx-ag-ev[data-tone="ok"] { --tone: var(--success); } .cx-ag-ev[data-tone="wait"] { --tone: var(--warning); } .cx-ag-ev[data-tone="info"] { --tone: var(--info); } .cx-ag-ev[data-tone="bad"] { --tone: var(--destructive); }
1564
+ .cx-ag-ev:hover { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--tone) 40%, transparent), 0 4px 12px -6px rgb(0 0 0 / .35); }
1565
+ .cx-ag-ev[data-dragging] { transition: none; cursor: grabbing; z-index: 2; box-shadow: 0 10px 24px -10px rgb(0 0 0 / .4); }
1566
+ .cx-ag-ev:focus-visible { outline: 2px solid var(--ring); outline-offset: 1px; }
1567
+ .cx-ag-ev .cx-text { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
1568
+ .cx-ag-now { position: absolute; left: 56px; right: 0; height: 0; border-top: 2px solid var(--destructive); z-index: 2; pointer-events: none; }
1569
+ .cx-ag-now i { position: absolute; left: -5px; top: -6px; width: 10px; height: 10px; border-radius: 99px; background: var(--destructive); }
1570
+
1571
+ /* ═════ Chat (inbox + chatbot) ═════ */
1572
+ .cx-inbox { display: grid; grid-template-columns: 300px 1fr; height: 560px; width: 100%; max-width: 980px; margin: 0 auto; border-radius: calc(var(--radius) * 1.6); overflow: hidden; box-shadow: 0 0 0 1px var(--border); background: var(--background); transition: max-width 320ms cubic-bezier(.22, 1, .36, 1); }
1573
+ .cx-inbox[data-force-narrow] { max-width: 390px; }
1574
+ .cx-ib-list { display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--border); }
1575
+ .cx-ib-items { flex: 1; overflow-y: auto; padding: 0 8px 8px; display: flex; flex-direction: column; gap: 2px; }
1576
+ .cx-ib-row { width: 100%; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: var(--radius); }
1577
+ .cx-ib-row:hover { background: color-mix(in srgb, var(--foreground) 4%, transparent); }
1578
+ .cx-ib-row[data-active] { background: var(--selected-soft); }
1579
+ .cx-ch { position: absolute; right: -4px; bottom: -4px; display: grid; place-items: center; width: 17px; height: 17px; border-radius: 99px; background: var(--background); color: var(--brand); box-shadow: 0 0 0 1.5px var(--background); }
1580
+ .cx-ch svg { width: 11px; height: 11px; }
1581
+ .cx-ib-thread { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
1582
+ .cx-ib-th { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-bottom: 1px solid var(--border); flex: none; }
1583
+ .cx-ib-back { display: none; }
1584
+ .cx-inbox[data-narrow], .cx-inbox[data-force-narrow] { grid-template-columns: 1fr; }
1585
+ .cx-inbox[data-narrow][data-view="list"] .cx-ib-thread, .cx-inbox[data-force-narrow][data-view="list"] .cx-ib-thread { display: none; }
1586
+ .cx-inbox[data-narrow][data-view="thread"] .cx-ib-list, .cx-inbox[data-force-narrow][data-view="thread"] .cx-ib-list { display: none; }
1587
+ .cx-inbox[data-narrow] .cx-ib-back, .cx-inbox[data-force-narrow] .cx-ib-back { display: inline-flex; }
1588
+ .cx-chat { flex: 1; overflow-y: auto; padding: 16px 14px; display: flex; flex-direction: column; gap: 6px; background: color-mix(in srgb, var(--muted) 35%, var(--background)); }
1589
+ .cx-chat-day { align-self: center; margin: 8px 0; padding: 2px 10px; border-radius: 99px; background: var(--background); box-shadow: 0 0 0 1px var(--border); }
1590
+ .cx-chat-msg { display: flex; flex-direction: column; max-width: min(78%, 440px); gap: 4px; }
1591
+ .cx-chat-msg[data-who="in"] { align-self: flex-start; align-items: flex-start; }
1592
+ .cx-chat-msg[data-who="out"] { align-self: flex-end; align-items: flex-end; }
1593
+ .cx-chat-bubble { display: flex; flex-direction: column; gap: 4px; padding: 8px 10px 6px; border-radius: 14px; font-size: 14px; line-height: 1.45; }
1594
+ .cx-chat-msg[data-who="in"] .cx-chat-bubble { background: var(--background); box-shadow: 0 0 0 1px var(--border); border-bottom-left-radius: 4px; }
1595
+ .cx-chat-msg[data-who="out"] .cx-chat-bubble { background: var(--primary); color: var(--primary-foreground); border-bottom-right-radius: 4px; }
1596
+ .cx-chat-msg[data-who="out"] .cx-chat-bubble .cx-text { color: inherit; opacity: .8; }
1597
+ .cx-chat-bubble p { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
1598
+ .cx-chat-meta { display: flex; align-items: center; justify-content: flex-end; gap: 3px; margin-top: -2px; }
1599
+ .cx-chat-meta .cx-text { font-size: 11px; }
1600
+ .cx-tick { width: 14px; height: 14px; opacity: .75; }
1601
+ .cx-tick[data-status="read"] { color: #53bdeb; opacity: 1; }
1602
+ .cx-chat-img { display: block; width: 220px; max-width: 100%; aspect-ratio: 4 / 3; border-radius: 10px; }
1603
+ .cx-chat-audio { display: flex; align-items: center; gap: 8px; min-width: 200px; }
1604
+ .cx-chat-audio .cn-progress { flex: 1; }
1605
+ .cx-chat-card { display: flex; flex-direction: column; gap: 2px; padding: 8px 10px; border-radius: 10px; background: color-mix(in srgb, var(--primary-foreground) 12%, transparent); }
1606
+ .cx-chat-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
1607
+ .cx-typing { flex-direction: row; gap: 4px; padding: 12px 14px; }
1608
+ .cx-typing i { width: 6px; height: 6px; border-radius: 99px; background: var(--muted-foreground); animation: cx-typing 1.2s infinite; }
1609
+ .cx-typing i:nth-child(2) { animation-delay: .15s; } .cx-typing i:nth-child(3) { animation-delay: .3s; }
1610
+ @keyframes cx-typing { 0%, 60%, 100% { opacity: .3; transform: none; } 30% { opacity: 1; transform: translateY(-3px); } }
1611
+ .cx-bot { display: flex; flex-direction: column; width: 100%; max-width: 440px; height: 520px; margin: 0 auto; border-radius: calc(var(--radius) * 1.6); overflow: hidden; box-shadow: 0 0 0 1px var(--border); background: var(--background); }
1612
+ .cx-bot-face { display: flex; align-items: center; justify-content: center; gap: 7px; width: 36px; height: 36px; flex: none; border-radius: 12px; background: var(--selected); }
1613
+ .cx-bot-face i { display: block; width: 5px; height: 9px; border-radius: 99px; background: var(--selected-foreground); animation: cx-blink-eye 4s infinite; }
1614
+ @keyframes cx-blink-eye { 0%, 92%, 100% { transform: none; } 95% { transform: scaleY(.15); } }
1615
+ .cx-bot-sugs { padding: 8px 12px; gap: 6px; border-top: 1px solid var(--border); }
1616
+ .cx-bot .cx-chat-actions .cn-button[aria-pressed="true"][aria-pressed][aria-pressed] { background: var(--selected-soft); color: var(--foreground); border-color: transparent; }
1617
+
1618
+ /* ═════ Dashboard ═════ */
1619
+ .cx-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }
1620
+ .cx-stat .cx-text[data-variant="title"] { font-size: 24px; font-variant-numeric: tabular-nums; }
1621
+ .cx-spark { width: 100%; height: 28px; margin-top: 2px; }
1622
+ .cx-chart-card { flex: 2 1 420px; min-width: 0; }
1623
+ .cx-onboard { flex: 1 1 280px; min-width: 0; }
1624
+ .cx-chart-body { display: grid; grid-template-columns: auto 1fr; gap: 8px; padding: 14px; }
1625
+ .cx-chart-y { display: flex; flex-direction: column; justify-content: space-between; height: 180px; text-align: right; }
1626
+ .cx-chart-plot { position: relative; display: grid; grid-template-rows: 180px auto; gap: 6px; }
1627
+ .cx-chart-grid { position: absolute; inset: 0 0 auto; height: 180px; display: flex; flex-direction: column; justify-content: space-between; pointer-events: none; }
1628
+ .cx-chart-grid i { border-top: 1px dashed var(--border); }
1629
+ .cx-chart-bars { position: relative; display: grid; grid-template-columns: repeat(var(--n), 1fr); gap: 4px; align-items: end; height: 180px; }
1630
+ .cx-chart-bar { display: flex; align-items: flex-end; height: 100%; padding: 0; border: 0; background: none; cursor: pointer; transform-origin: bottom; }
1631
+ .cx-chart-bar i { width: 100%; height: var(--v); border-radius: 4px 4px 0 0; background: color-mix(in srgb, var(--primary) 85%, transparent); transition: background-color 150ms; }
1632
+ .cx-chart-bar:hover i, .cx-chart-bar:focus-visible i { background: var(--selected); }
1633
+ .cx-chart-bar:focus-visible { outline: none; }
1634
+ .cx-chart-x { display: grid; grid-template-columns: repeat(var(--n), 1fr); }
1635
+ .cx-chart-x span { overflow: visible; white-space: nowrap; }
1636
+ .cx-check-dot { display: grid; place-items: center; width: 24px; height: 24px; border-radius: 99px; box-shadow: inset 0 0 0 1.5px var(--border); font-size: 12px; font-weight: 600; color: var(--muted-foreground); }
1637
+ .cx-check-dot[data-done] { background: var(--success); box-shadow: none; color: #fff; animation: cx-pop 300ms cubic-bezier(.22, 1, .36, 1); }
1638
+ .cx-check-dot svg { width: 13px; height: 13px; }
1639
+
1640
+ /* ═════ Settings ═════ */
1641
+ .cx-settings { width: 100%; max-width: 760px; }
1642
+ .cx-set-form { position: relative; display: flex; flex-direction: column; gap: 0; padding-bottom: 72px; }
1643
+ .cx-set-sec { display: grid; grid-template-columns: 220px 1fr; gap: 16px 32px; padding: 20px 0; border-top: 1px solid var(--border); }
1644
+ .cx-set-sec:first-child { border-top: 0; padding-top: 0; }
1645
+ @container (max-width: 600px) { .cx-set-sec { grid-template-columns: 1fr; } }
1646
+ .cx-settings { container-type: inline-size; }
1647
+ /* floats over the form: it never takes or gives back space, it only fades and slides */
1648
+ .cx-dirty { position: sticky; bottom: 0; z-index: 5; height: 88px; box-sizing: border-box; padding: 24px 0 16px; display: flex; justify-content: flex-end; align-items: flex-end; pointer-events: none; }
1649
+ .cx-dirty > .cx-dirty-in { position: relative; max-width: 100%; height: 48px; box-sizing: border-box; display: flex; align-items: center; gap: 16px; padding: 0 8px 0 18px; white-space: nowrap; border-radius: 99px; background: var(--foreground); color: var(--background); box-shadow: 0 16px 36px -14px rgb(0 0 0 / .45); opacity: 0; transform: translateY(10px) scale(.98); visibility: hidden; transition: opacity 180ms ease, transform 240ms cubic-bezier(.22, 1, .36, 1), visibility 0s linear 240ms; }
1650
+ .cx-dirty[data-open] > .cx-dirty-in { opacity: 1; transform: none; visibility: visible; pointer-events: auto; transition: opacity 180ms ease, transform 240ms cubic-bezier(.22, 1, .36, 1), visibility 0s; }
1651
+ @media (prefers-reduced-motion: reduce) { .cx-dirty > .cx-dirty-in { transform: none; } }
1652
+ .cx-dirty .cx-text { color: inherit; }
1653
+ .cx-dirty .cn-button-variant-ghost { color: inherit; }
1654
+ .cx-dirty .cn-button-variant-ghost:hover { background: color-mix(in srgb, var(--background) 14%, transparent); color: inherit; }
1655
+ .cx-dirty .cn-button-variant-default { background: var(--background); color: var(--foreground); }
1656
+ .cx-save-w { min-width: 7.5rem; }
1657
+ .cx-wh-day { display: grid; grid-template-columns: 150px 1fr; gap: 10px; align-items: start; padding: 10px 0; border-top: 1px solid var(--border); }
1658
+ .cx-wh-day:first-child { border-top: 0; padding-top: 0; }
1659
+ .cx-wh-name { display: flex; align-items: center; gap: 10px; height: 32px; }
1660
+ .cx-wh-ranges { display: flex; flex-direction: column; gap: 6px; min-height: 32px; justify-content: center; }
1661
+ .cx-wh-range { display: flex; align-items: center; gap: 8px; }
1662
+ @container (max-width: 520px) { .cx-wh-day { grid-template-columns: 1fr; } }
1663
+
1664
+ /* ═════ Plans, card, team, permissions ═════ */
1665
+ .cx-plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); gap: 14px; width: 100%; max-width: 920px; }
1666
+ .cx-plan { display: flex; flex-direction: column; gap: 12px; padding: 0; cursor: pointer; transition: box-shadow 160ms, transform 160ms; }
1667
+ .cx-plan:hover { transform: translateY(-2px); }
1668
+ .cx-plan[aria-checked="true"] { box-shadow: 0 0 0 2px var(--selected); }
1669
+ .cx-plan:focus-visible { outline: 2px solid var(--ring); outline-offset: 3px; }
1670
+ .cx-plan-price { display: flex; align-items: baseline; gap: 6px; }
1671
+ .cx-plan-price .cx-text[data-variant="title"] { font-size: 26px; font-variant-numeric: tabular-nums; }
1672
+ .cx-plan-feats { list-style: none; margin: 0; padding: 0 16px; display: flex; flex-direction: column; gap: 8px; }
1673
+ .cx-plan-feats li { display: flex; gap: 8px; align-items: flex-start; }
1674
+ .cx-plan-feats svg { width: 16px; height: 16px; color: var(--success); flex: none; margin-top: 2px; }
1675
+ .cx-cc-brand { font-size: 12px; font-weight: 700; color: var(--foreground); }
1676
+ #cc-msg { display: flex; align-items: center; gap: 6px; }
1677
+ #cc-msg svg { width: 14px; height: 14px; flex: none; }
1678
+ #cc-msg[data-tone="bad"] { color: var(--destructive); }
1679
+ #cc-msg[data-tone="ok"] { color: var(--success); }
1680
+ .cx-team { width: 100%; max-width: 640px; margin: 0 auto; display: flex; flex-direction: column; gap: 10px; }
1681
+ .cx-perm { min-width: 520px; }
1682
+ .cx-perm .cx-perm-c { width: 120px; text-align: center; }
1683
+ .cx-perm td { height: auto; padding-block: 10px; }
1684
+ .cx-perm .cn-checkbox:disabled { opacity: .6; }
1685
+ #perms { width: 100%; max-width: 760px; margin: 0 auto; }
1686
+
1687
+ /* ═════ Stamps, bell, queue, password ═════ */
1688
+ .cx-extras { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); gap: 24px; width: 100%; max-width: 1080px; align-items: start; }
1689
+ .cx-extras > div { display: flex; flex-direction: column; gap: 10px; }
1690
+ .cx-stamp-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; padding: 14px 16px; }
1691
+ .cx-stamp { aspect-ratio: 1; display: grid; place-items: center; border-radius: 99px; border: 1.5px dashed var(--border); color: var(--muted-foreground); }
1692
+ .cx-stamp svg { width: 18px; height: 18px; }
1693
+ .cx-stamp[data-on] { border: 0; background: var(--selected); color: var(--selected-foreground); }
1694
+ .cx-stamp[data-gift]:not([data-on]) { border-style: solid; color: var(--selected); }
1695
+ .cx-stamp[data-pop] { animation: cx-stamp-pop 420ms cubic-bezier(.22, 1.4, .36, 1); }
1696
+ @keyframes cx-stamp-pop { 0% { transform: scale(1.6) rotate(-12deg); opacity: 0; } 100% { transform: none; opacity: 1; } }
1697
+ .cx-bell-wrap { position: relative; }
1698
+ .cx-count-ind { width: auto; min-width: 18px; height: 18px; padding: 0 5px; top: -6px; right: -6px; color: var(--on-destructive); font-size: 11px; font-weight: 600; display: grid; place-items: center; font-variant-numeric: tabular-nums; }
1699
+ .cx-bellpop { width: 340px; padding: 0; overflow: hidden; }
1700
+ .cx-bell-list { max-height: 320px; overflow-y: auto; padding: 4px; }
1701
+ .cx-bell-it { width: 100%; border: 0; background: none; font: inherit; color: inherit; text-align: left; cursor: pointer; border-radius: var(--radius); }
1702
+ .cx-bell-it:hover { background: var(--accent); }
1703
+ .cx-bell-it:not([data-unread]) .cn-item-title { font-weight: 400; color: var(--muted-foreground); }
1704
+ .cx-tonal-ic { --tone: var(--info); display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; background: color-mix(in srgb, var(--tone) 13%, transparent); color: var(--tone); }
1705
+ .cx-tonal-ic[data-tone="ok"] { --tone: var(--success); } .cx-tonal-ic[data-tone="wait"] { --tone: var(--warning); } .cx-tonal-ic[data-tone="bad"] { --tone: var(--destructive); }
1706
+ .cx-tonal-ic svg { width: 16px; height: 16px; }
1707
+ .cx-unread-dot { width: 8px; height: 8px; border-radius: 99px; background: var(--selected); }
1708
+ .cx-q-pos { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 99px; background: var(--muted); font-weight: 600; font-size: 13px; font-variant-numeric: tabular-nums; }
1709
+ .cx-pw-meter { display: flex; flex-direction: column; gap: 8px; }
1710
+ .cx-pw-bars { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; }
1711
+ .cx-pw-bars .cn-progress { height: 4px; }
1712
+ .cx-pw-bars .cn-progress .cn-progress-indicator { transition: transform 260ms cubic-bezier(.22, 1, .36, 1), background-color 200ms; }
1713
+ .cx-pw-bars .cn-progress[data-tone="bad"] .cn-progress-indicator { background: var(--destructive); }
1714
+ .cx-pw-bars .cn-progress[data-tone="wait"] .cn-progress-indicator { background: var(--warning); }
1715
+ .cx-pw-bars .cn-progress[data-tone="ok"] .cn-progress-indicator { background: var(--success); }
1716
+ .cx-pw-rules { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
1717
+ .cx-pw-rules li { display: flex; align-items: center; gap: 8px; }
1718
+ .cx-pw-rules svg { width: 14px; height: 14px; color: var(--border); transition: color 200ms, transform 200ms; }
1719
+ .cx-pw-rules li[data-ok] svg { color: var(--success); transform: scale(1.15); }
1720
+ .cx-pw-rules li[data-ok] .cx-text { color: var(--foreground); }
1721
+ .cx-ag-ev:has(> .cx-text:only-child) { justify-content: center; padding-block: 0; }
1722
+ .cx-team .cn-item-group, .cx-extras .cn-item-group { gap: 0; }
1723
+ .cx-team .cn-item-separator, .cx-extras .cn-item-separator { margin-block: 0; }
1724
+ .cx-team .cn-item, .cx-extras .cn-item { padding-inline: 4px; }
1725
+
1726
+ /* ═════ native <select>: its list follows the theme (never white on white) ═════ */
1727
+ .style-nova select, [data-skin] select { color-scheme: light; background-color: var(--background); color: var(--foreground); }
1728
+ :root[data-theme="dark"] .style-nova select, :root[data-theme="dark"] [data-skin] select, [data-skin="tienda"] select { color-scheme: dark; }
1729
+ .style-nova select option, .style-nova select optgroup, [data-skin] select option { background-color: var(--popover); color: var(--popover-foreground); }
1730
+ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .style-nova select { color-scheme: dark; } }
1731
+
1732
+ /* ═════ charts fill their card, no blank band ═════ */
1733
+ .cx-chart-card, .cx-onboard { display: flex; }
1734
+ .cx-chart-card > .cn-card, .cx-onboard > .cn-card { flex: 1; }
1735
+ .cx-chart { display: flex; flex-direction: column; }
1736
+ .cx-chart-body { flex: 1; min-height: 220px; grid-template-rows: 1fr; }
1737
+ .cx-chart-y { height: auto; padding-bottom: 22px; }
1738
+ .cx-chart-plot { grid-template-rows: 1fr auto; min-height: 0; }
1739
+ .cx-chart-grid { height: auto; bottom: 22px; }
1740
+ .cx-chart-bars { height: 100%; min-height: 160px; }
1741
+
1742
+ /* ═════ chat: one height per element, everywhere ═════ */
1743
+ .cx-ib-th { height: 56px; padding: 0 14px; }
1744
+ .cx-ib-list > .cx-vstack:first-child { padding: 12px !important; gap: 10px !important; }
1745
+ .cx-ib-row { min-height: 60px; }
1746
+ .cx-bot-sugs .cn-button { height: 28px; }
1747
+ .cx-chat-bubble { min-height: 36px; }
1748
+ .cx-chat-audio { height: 32px; }
1749
+ .cx-chat-audio .cn-button { width: 28px; height: 28px; }
1750
+ .cx-stat-ic { display: grid; place-items: center; width: 28px; height: 28px; border-radius: 8px; background: var(--muted); color: var(--muted-foreground); }
1751
+ .cx-stat-ic svg { width: 15px; height: 15px; }
1752
+
1753
+ /* ═════ Agenda v2 ═════ */
1754
+ .cx-agenda { container-type: inline-size; }
1755
+ .cx-ag-who { gap: 4px; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
1756
+ .cx-ag-who .cn-button { flex: none; gap: 6px; }
1757
+ .cx-ag-who .cn-button .cn-avatar { width: 20px; height: 20px; }
1758
+ .cx-ag-who .cn-button .cn-avatar .cn-avatar-fallback { font-size: 9px; }
1759
+ .cx-ag-who .cn-button[aria-pressed="true"][aria-pressed][aria-pressed] { background: var(--selected-soft); color: var(--selected); border-color: transparent; }
1760
+ .cx-ag-strip { display: grid; grid-template-columns: repeat(7, 1fr); gap: 4px; }
1761
+ .cx-ag-day small { font-size: 11px; color: var(--muted-foreground); text-transform: uppercase; letter-spacing: .04em; }
1762
+ .cx-ag-day b { font-size: 16px; font-weight: 600; font-variant-numeric: tabular-nums; }
1763
+ .cx-ag-day .cx-ag-count { min-width: 18px; height: 16px; border-radius: 99px; font-size: 11px; font-weight: 600; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
1764
+ .cx-ag-day[data-today] b { color: var(--selected); }
1765
+ .cx-ag-day[aria-pressed="true"] small, .cx-ag-day[aria-pressed="true"] .cx-ag-count, .cx-ag-day[aria-pressed="true"] b { color: inherit; }
1766
+ .cx-ag-colhead { display: flex; align-items: center; justify-content: center; gap: 6px; }
1767
+ .cx-ag-colhead .cn-avatar { width: 22px; height: 22px; }
1768
+ .cx-ag-colhead .cn-avatar .cn-avatar-fallback { font-size: 9px; }
1769
+ .cx-ag-colhead[data-today] { color: var(--selected); }
1770
+ .cx-ag { grid-template-rows: 44px 1fr; }
1771
+ .cx-ag-off { position: absolute; left: 0; right: 0; background: repeating-linear-gradient(135deg, color-mix(in srgb, var(--muted) 90%, transparent) 0 6px, color-mix(in srgb, var(--muted) 45%, transparent) 6px 12px); pointer-events: none; display: grid; place-items: center; }
1772
+ .cx-ag-block { position: absolute; left: 3px; right: 3px; z-index: 1; display: flex; align-items: flex-start; padding: 4px 8px; border-radius: calc(var(--radius) * .6); background: repeating-linear-gradient(135deg, color-mix(in srgb, var(--foreground) 8%, transparent) 0 5px, transparent 5px 10px); box-shadow: inset 0 0 0 1px var(--border); pointer-events: none; }
1773
+ .cx-ag-ev { left: auto; right: auto; }
1774
+ .cx-ag-grip { position: absolute; left: 0; right: 0; bottom: 0; height: 7px; cursor: ns-resize; }
1775
+ .cx-ag-grip::after { content: ""; position: absolute; left: 50%; bottom: 2px; width: 18px; height: 3px; margin-left: -9px; border-radius: 99px; background: color-mix(in srgb, var(--tone) 55%, transparent); opacity: 0; transition: opacity 150ms; }
1776
+ .cx-ag-ev:hover .cx-ag-grip::after { opacity: 1; }
1777
+ .cx-ag-list { display: flex; flex-direction: column; gap: 6px; }
1778
+ .cx-ag-row { --tone: var(--info); display: flex; align-items: center; gap: 12px; min-height: 52px; padding: 8px 12px; border: 1px solid color-mix(in srgb, var(--tone) 26%, var(--border)); border-radius: var(--radius); background: color-mix(in srgb, var(--tone) 10%, var(--background)); color: var(--foreground); font: inherit; text-align: left; width: 100%; cursor: pointer; }
1779
+ .cx-ag-row[data-tone="ok"] { --tone: var(--success); } .cx-ag-row[data-tone="wait"] { --tone: var(--warning); }
1780
+ .cx-ag-row:hover { background: color-mix(in srgb, var(--tone) 16%, var(--background)); }
1781
+ .cx-ag-row-t { display: flex; flex-direction: column; width: 52px; flex: none; }
1782
+ .cx-ag-row .cn-badge { margin-left: auto; flex: none; }
1783
+ .cx-ag-row[data-kind="free"] { --tone: var(--border); border-style: dashed; background: var(--background); min-height: 44px; color: var(--muted-foreground); }
1784
+ .cx-ag-row[data-kind="free"] svg { width: 16px; height: 16px; }
1785
+ .cx-ag-row[data-kind="free"]:hover { border-color: var(--selected); color: var(--selected); }
1786
+ .cx-ag-row[data-kind="block"] { --tone: var(--muted-foreground); cursor: default; background: repeating-linear-gradient(135deg, color-mix(in srgb, var(--foreground) 5%, transparent) 0 5px, transparent 5px 10px); }
1787
+ .cx-rcpt-mini { display: block; width: 120px; aspect-ratio: 3 / 4; border-radius: 8px; box-shadow: inset 0 0 0 1px var(--border); }
1788
+ @container (max-width: 700px) { .cx-ag-bar .cx-text[data-variant="heading"] { flex-basis: 100%; order: 9; } }
1789
+
1790
+ /* time and menu triggers: field-like buttons, icon and chevron with real padding */
1791
+ .cx-time-btn { gap: 6px; padding-inline: 10px 12px; font-variant-numeric: tabular-nums; }
1792
+ .cx-time-btn svg { color: var(--muted-foreground); }
1793
+ .cx-time-btn[aria-invalid="true"] { border-color: var(--destructive); }
1794
+ .cx-sel-btn { justify-content: space-between; gap: 10px; padding-inline: 12px 10px; min-width: 128px; font-weight: 500; }
1795
+ .cx-sel-btn > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1796
+ .cx-sel-btn > svg { color: var(--muted-foreground); transition: transform 160ms ease; }
1797
+ .cx-sel-btn[aria-expanded="true"] > svg { transform: rotate(180deg); }
1798
+ .cx-selmenu { position: fixed; z-index: 60; padding: 4px; max-width: min(320px, calc(100vw - 16px)); }
1799
+ .cx-selitem { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 10px; border-radius: calc(var(--radius) - 2px); cursor: default; outline: none; }
1800
+ .cx-selitem:focus { background: var(--accent); }
1801
+ .cx-selcheck { width: 16px; height: 16px; flex: none; }
1802
+ .cx-wh-range { display: flex; align-items: center; gap: 8px; }
1803
+
1804
+ .cx-dirty .cx-grow { display: none; }
1805
+ .cx-dirty-acts { display: flex; gap: 4px; }
1806
+ @media (max-width: 480px) { .cx-dirty > .cx-dirty-in { flex: 1; min-width: 0; height: auto; min-height: 52px; padding: 6px 6px 6px 16px; gap: 8px; border-radius: 18px; white-space: normal; justify-content: space-between; } .cx-dirty-in > .cx-text { min-width: 0; line-height: 1.25; } .cx-dirty .cx-save-w { min-width: 0; } .cx-dirty-acts { flex: none; } }
1807
+
1808
+ /* ── Composer = InputGroup + Textarea + block-end addon ── */
1809
+ .cx-composer { display: flex; flex-direction: column; gap: 6px; padding: 12px; border-top: 1px solid var(--border); background: var(--background); flex: none; }
1810
+ .cx-composer-box { align-items: stretch; }
1811
+ .cx-composer-in { min-height: 40px; max-height: 160px; padding: 10px 12px 4px; font-size: 14px; line-height: 20px; overflow-y: auto; }
1812
+ .cx-composer-box > .cn-input-group-addon-align-block-end { gap: 2px; padding: 4px 6px 6px; cursor: default; }
1813
+ .cx-composer-box .cn-input-group-button-size-icon-sm { width: 32px; height: 32px; }
1814
+ .cx-composer-box [data-send] { border-radius: 99px; }
1815
+ .cx-composer-hint { margin: 0; padding-inline: 2px; }
1816
+ .cx-emoji { display: grid; grid-template-columns: repeat(5, 36px); gap: 2px; padding: 6px; width: auto; }
1817
+ .cx-emoji .cn-button { font-size: 18px; }
1818
+ .cx-chat-tag { display: inline-flex; align-items: center; gap: 3px; margin-right: 4px; font-size: 11px; font-weight: 600; opacity: .75; }
1819
+ .cx-chat-tag svg { width: 12px; height: 12px; }
1820
+ .cx-chat-sys { align-self: center; display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; color: var(--muted-foreground); }
1821
+ .cx-chat-sys svg { width: 14px; height: 14px; flex: none; }
1822
+
1823
+ /* ── Messaging: 3 panes (wide) · thread + sheet (mid) · one pane (narrow) ── */
1824
+ .cx-mx { display: grid; grid-template-columns: 320px minmax(0, 1fr) 288px; height: 640px; width: 100%; margin: 0 auto; border-radius: calc(var(--radius) * 1.6); border: 1px solid var(--border); background: var(--background); overflow: hidden; transition: max-width 260ms cubic-bezier(.22, 1, .36, 1); }
1825
+ .cx-mx[data-layout="mid"] { grid-template-columns: 300px minmax(0, 1fr); }
1826
+ .cx-mx[data-layout="narrow"] { grid-template-columns: minmax(0, 1fr); }
1827
+ .cx-mx:not([data-layout="wide"]) .cx-mx-ctx:not(.cx-mx-ctx-sheet) { display: none; }
1828
+ .cx-mx[data-layout="wide"] .cx-mx-ctxbtn { display: none; }
1829
+ .cx-mx-back { display: none; }
1830
+ .cx-mx[data-layout="narrow"] .cx-mx-back { display: inline-flex; }
1831
+ .cx-mx[data-layout="narrow"][data-view="list"] .cx-mx-thread, .cx-mx[data-layout="narrow"][data-view="thread"] .cx-mx-list { display: none; }
1832
+ .cx-mx[data-layout="narrow"] .cx-mx-hide-sm { display: none; }
1833
+
1834
+ .cx-mx-list { display: flex; flex-direction: column; min-height: 0; min-width: 0; border-right: 1px solid var(--border); }
1835
+ .cx-mx[data-layout="narrow"] .cx-mx-list { border-right: 0; }
1836
+ .cx-mx-lh { display: flex; align-items: center; gap: 8px; height: 56px; padding: 0 12px 0 16px; flex: none; }
1837
+ .cx-mx-tools { display: flex; flex-direction: column; gap: 10px; padding: 0 12px 10px; flex: none; }
1838
+ .cx-mx-chips { display: flex; gap: 6px; overflow-x: auto; margin-inline: -12px; padding-inline: 12px; scroll-padding-inline: 12px; }
1839
+ .cx-mx-chips .cn-button { flex: none; gap: 6px; }
1840
+ .cx-mx-chips .cn-button[aria-pressed="true"] .cx-mx-n { color: inherit; opacity: .7; }
1841
+ .cx-mx-n { font-variant-numeric: tabular-nums; color: var(--muted-foreground); font-weight: 500; }
1842
+ .cx-noscrollbar { scrollbar-width: none; } .cx-noscrollbar::-webkit-scrollbar { display: none; }
1843
+ .cx-mx-items { flex: 1; min-height: 0; overflow-y: auto; padding: 0 8px 8px; display: flex; flex-direction: column; gap: 2px; }
1844
+ .cx-mx-row { width: 100%; min-height: 64px; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: var(--radius); flex-wrap: nowrap; }
1845
+ .cx-mx-row:hover { background: color-mix(in srgb, var(--foreground) 4%, transparent); }
1846
+ .cx-mx-row[aria-current="true"] { background: var(--selected-soft); }
1847
+ .cx-mx-row .cn-item-content { min-width: 0; }
1848
+ .cx-mx-row .cn-item-title { display: flex; align-items: center; gap: 6px; min-width: 0; width: 100%; }
1849
+ .cx-mx-row .cn-item-title .cn-badge { flex: none; }
1850
+ .cx-mx-row:not([data-unread]) .cn-item-title { font-weight: 500; }
1851
+ .cx-mx-row[data-unread] .cn-item-description { color: var(--foreground); }
1852
+ .cx-mx-by { color: var(--muted-foreground); font-weight: 500; }
1853
+ .cx-mx-end { flex-direction: column; align-items: flex-end; gap: 6px; width: auto; flex: none; }
1854
+ .cx-mx-end .cn-badge { min-width: 20px; height: 20px; padding: 0 6px; justify-content: center; font-variant-numeric: tabular-nums; }
1855
+ .cx-mx-badge-gap { height: 20px; }
1856
+ .cx-mx-av { position: relative; display: inline-flex; flex: none; }
1857
+ .cx-mx-av .cx-ch { position: absolute; right: -6px; bottom: -5px; width: 16px; height: 16px; }
1858
+ .cx-ch-lg { position: static !important; width: 32px; height: 32px; border-radius: 10px; }
1859
+ .cx-ch-lg svg { width: 18px; height: 18px; }
1860
+ .cx-mx-lf { display: flex; align-items: center; justify-content: space-between; gap: 8px; height: 48px; padding: 0 8px 0 16px; border-top: 1px solid var(--border); flex: none; }
1861
+ .cx-mx-empty { padding: 32px 12px; }
1862
+
1863
+ .cx-mx-thread { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
1864
+ .cx-mx-th { display: flex; align-items: center; gap: 10px; height: 64px; padding: 0 12px 0 16px; border-bottom: 1px solid var(--border); flex: none; }
1865
+ .cx-mx[data-layout="narrow"] .cx-mx-th { padding-left: 8px; }
1866
+ .cx-mx-thwho { gap: 0; min-width: 0; }
1867
+ .cx-mx-th .cn-button[data-mx-resolve][aria-pressed="true"][aria-pressed] { color: var(--success); border-color: color-mix(in srgb, var(--success) 40%, var(--border)); background: color-mix(in srgb, var(--success) 8%, transparent); }
1868
+ .cx-mx-control { flex: none; overflow: hidden; }
1869
+ .cx-mx-control:empty { display: none; }
1870
+ .cx-mx-control .cn-alert, .cx-mx-quick .cn-alert { border-radius: 0; border-width: 0 0 1px; }
1871
+ .cx-mx-control .cn-alert[data-tone="wait"] { background: color-mix(in srgb, var(--warning) 8%, var(--background)); }
1872
+ .cx-mx-control .cn-alert[data-tone="wait"] > svg { color: var(--warning); }
1873
+ .cx-mx .cn-alert { padding-right: 140px; }
1874
+ .cx-mx .cn-alert-action { top: 50%; transform: translateY(-50%); }
1875
+ .cx-mx-compose { flex: none; display: flex; flex-direction: column; background: var(--background); }
1876
+ .cx-mx-compose .cx-composer { border-top: 0; padding-top: 4px; }
1877
+ .cx-mx-quick { overflow: hidden; border-top: 1px solid var(--border); }
1878
+ .cx-mx-quick .cn-alert { border-width: 0; padding-right: 170px; }
1879
+ .cx-mx-qrow { display: flex; gap: 6px; overflow-x: auto; padding: 10px 12px 6px; }
1880
+ .cx-mx-qrow .cn-button { flex: none; }
1881
+ .cx-chat-event { max-width: min(86%, 340px); }
1882
+ .cx-mx-card { width: 100%; }
1883
+ .cx-mx-card .cn-card-content { display: flex; flex-direction: column; gap: 6px; }
1884
+ .cx-mx-card .cn-card-footer { gap: 6px; flex-wrap: wrap; }
1885
+ .cx-mx-line { display: flex; justify-content: space-between; gap: 12px; }
1886
+ .cx-mx-total { padding-top: 6px; border-top: 1px dashed var(--border); }
1887
+
1888
+ .cx-mx-ctx { display: flex; flex-direction: column; gap: 20px; min-height: 0; overflow-y: auto; padding: 20px 16px; border-left: 1px solid var(--border); }
1889
+ .cx-mx-ctx-sheet { border: 0; padding: 0; overflow: visible; }
1890
+ .cx-mx-who { display: flex; flex-direction: column; align-items: center; gap: 4px; text-align: center; }
1891
+ .cx-mx-who .cx-mx-av { margin-bottom: 6px; }
1892
+ .cx-mx-stats { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--border); border-radius: var(--radius); }
1893
+ .cx-mx-stats > div { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 10px 4px; min-width: 0; }
1894
+ .cx-mx-stats > div + div { border-left: 1px solid var(--border); }
1895
+ .cx-mx-stats .cx-text[data-variant="strong"] { font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
1896
+ .cx-mx-sec { display: flex; flex-direction: column; gap: 8px; }
1897
+ .cx-mx-now { width: 100%; font: inherit; color: inherit; text-align: left; cursor: pointer; }
1898
+ .cx-mx-now:hover { background: var(--accent); }
1899
+ .cx-mx-dl { margin: 0; display: flex; flex-direction: column; gap: 8px; }
1900
+ .cx-mx-dl > div { display: flex; justify-content: space-between; gap: 12px; }
1901
+ .cx-mx-dl dd { margin: 0; text-align: right; }
1902
+ .cx-mx-acts { display: flex; flex-direction: column; align-items: stretch; gap: 2px; margin-top: auto; padding-top: 12px; border-top: 1px solid var(--border); }
1903
+ .cx-mx-acts .cn-button { justify-content: flex-start; }
1904
+ .cx-mx-danger { color: var(--destructive); }
1905
+ .cx-mx-danger:hover { background: color-mix(in srgb, var(--destructive) 10%, transparent); color: var(--destructive); }
1906
+ @media (max-width: 480px) { .cx-mx { height: 600px; } }
1907
+ .cx-mx-thname { min-width: 0; flex: 0 1 auto; }
1908
+ .cx-mx-thname > .cx-text { white-space: nowrap; }
1909
+ .cx-mx-thwho .cn-badge { flex: none; }
1910
+
1911
+ /* ── Skeletons: Nova's Skeleton + Storio's shimmer; the layout comes from the real component's classes ── */
1912
+ .cx-sk { display: block; flex: none; max-width: 100%; border-radius: calc(var(--radius) * .6); background: linear-gradient(90deg, var(--sk-a) 0%, var(--sk-b) 50%, var(--sk-a) 100%); background-size: 200% 100%; animation: cx-sk 1.3s linear infinite; }
1913
+ :root, [data-skin] { --sk-a: color-mix(in srgb, var(--foreground) 10%, transparent); --sk-b: color-mix(in srgb, var(--foreground) 4%, transparent); }
1914
+ .cx-sk[data-shape="circle"] { border-radius: 99px; }
1915
+ .cx-sk[data-shape="pill"] { border-radius: 99px; }
1916
+ .cx-sk[data-shape="bubble"] { border-radius: 14px; }
1917
+ @keyframes cx-sk { to { background-position: -200% 0; } }
1918
+ @media (prefers-reduced-motion: reduce) { .cx-sk { animation: none; } }
1919
+ .cx-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
1920
+ .cn-item .cn-item-content > .cx-sk + .cx-sk { margin-top: 6px; }
1921
+ .cx-chat-msg[data-who="out"]:has(> .cx-sk) { align-items: stretch; }
1922
+ .cx-chat-msg:has(> .cx-sk) { align-items: stretch; }
1923
+ .cx-sk-demo { min-height: 120px; }
1924
+ .cx-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; }
1925
+ .cx-sk-products { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 12px; }
1926
+ .cx-sk-card { overflow: hidden; padding: 0; gap: 0; }
1927
+ .cx-sk-media { display: block; }
1928
+ .cx-sk-media > .cx-sk { border-radius: 0; }
1929
+ .cx-sk-chatbox { display: flex; flex-direction: column; height: 360px; max-width: 440px; margin: 0 auto; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.6); overflow: hidden; }
1930
+ .cx-sk-ag { display: flex; flex-direction: column; gap: 14px; }
1931
+ .cx-sk-strip { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
1932
+ .cx-sk-grid { display: grid; grid-template-columns: 52px repeat(var(--cols), 1fr); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; height: 480px; }
1933
+ .cx-sk-hours { display: flex; flex-direction: column; gap: 38px; padding: 8px; border-right: 1px solid var(--border); }
1934
+ .cx-sk-col { position: relative; border-right: 1px solid var(--border); background: repeating-linear-gradient(to bottom, transparent 0 47px, var(--border) 47px 48px); }
1935
+ .cx-sk-col:last-child { border-right: 0; }
1936
+ .cx-sk-ev { position: absolute; left: 4px; right: 4px; }
1937
+ .cx-sk-ev > .cx-sk { height: 100% !important; }
1938
+ .cx-sk-table { display: flex; flex-direction: column; }
1939
+ .cx-sk-tr { display: flex; gap: 24px; align-items: center; height: 44px; padding: 0 12px; border-bottom: 1px solid var(--border); }
1940
+ @media (max-width: 640px) { .cx-sk-strip { grid-template-columns: repeat(4, 1fr); } .cx-sk-strip > :nth-child(n+5) { display: none; } }
1941
+
1942
+ /* ── Agenda: one frame (people + days on top, grid or list below) ── */
1943
+ .cx-ag-frame { display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.4); background: var(--card, var(--background)); overflow: hidden; }
1944
+ .cx-ag-top { display: flex; flex-direction: column; gap: 10px; padding: 12px; border-bottom: 1px solid var(--border); }
1945
+ .cx-ag-top:empty { display: none; }
1946
+ .cx-ag-strip { padding: 4px; border-radius: calc(var(--radius) * 1.1); background: color-mix(in srgb, var(--muted) 60%, transparent); }
1947
+ .cx-ag-strip .cx-ag-day { height: 56px; }
1948
+ .cx-ag-listwrap { padding: 12px; }
1949
+ .cx-ag-head { background: var(--card, var(--background)); }
1950
+ .cx-ag-off[data-all] { display: block; text-align: center; padding-top: 14px; }
1951
+ .cx-ag-off[data-all] > .cx-text { display: inline-block; padding: 2px 10px; border-radius: 99px; background: var(--card, var(--background)); box-shadow: 0 0 0 1px var(--border); }
1952
+ .cx-ag-ev { touch-action: pan-y; user-select: none; -webkit-user-select: none; cursor: grab; }
1953
+ .cx-ag-ev[data-dragging] { opacity: .35; box-shadow: none; }
1954
+ .cx-ag-ghost { z-index: 4; pointer-events: none; opacity: .95; box-shadow: 0 12px 28px -10px rgb(0 0 0 / .5); outline: 2px solid var(--tone); outline-offset: -1px; transition: top 60ms linear, height 60ms linear; }
1955
+ .cx-ag-ghost[data-invalid] { --tone: var(--destructive); background: color-mix(in srgb, var(--destructive) 16%, var(--background)); }
1956
+ .cx-ag-ghost .cx-ag-grip { display: none; }
1957
+ .cx-ag-ghost-t { position: absolute; right: 6px; bottom: 4px; padding: 1px 6px; border-radius: 6px; font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; background: var(--foreground); color: var(--background); white-space: nowrap; }
1958
+ .cx-ag-ghost[data-invalid] .cx-ag-ghost-t { background: var(--destructive); color: #fff; }
1959
+ .cx-ag-ghost { background: color-mix(in srgb, var(--tone) 16%, var(--card, var(--background))); }
1960
+ .cx-ag-ghost[data-invalid] { background: color-mix(in srgb, var(--destructive) 18%, var(--card, var(--background))); }
1961
+ /* short appointments: never shorter than one line of text */
1962
+ .cx-ag-ev { min-height: 24px; }
1963
+ .cx-ag-ev:has(> .cx-text:only-child) .cx-text, .cx-ag-ev:has(> .cx-text + .cx-ag-grip:last-child) > .cx-text:first-child { font-size: 12px; line-height: 16px; }
1964
+
1965
+ /* phone: the grid stays; columns scroll sideways under a fixed hours column */
1966
+ .cx-ag-head > span:first-child, .cx-ag-times { position: sticky; left: 0; z-index: 3; background: var(--card, var(--background)); }
1967
+ .cx-ag-times { z-index: 2; border-right: 1px solid var(--border); }
1968
+ @container (max-width: 700px) {
1969
+ .cx-ag { min-width: calc(48px + var(--cols) * 128px); }
1970
+ .cx-ag-head, .cx-ag-body { grid-template-columns: 48px repeat(var(--cols), 1fr); }
1971
+ .cx-ag-now { left: 48px; }
1972
+ .cx-ag-scroll { max-height: 70vh; }
1973
+ }
1974
+ .cx-ag-times { z-index: 5; }
1975
+ .cx-ag-head { z-index: 6; }
1976
+ .cx-ag-head > span:first-child { z-index: 7; }
1977
+ @container (max-width: 700px) {
1978
+ .cx-ag-scroll { scroll-snap-type: x mandatory; scroll-padding-left: 48px; }
1979
+ .cx-ag-col { scroll-snap-align: start; }
1980
+ }
1981
+
1982
+
1983
+ /* ═════════════════════════ 4. pk ═════════════════════════ */
1984
+ /* ═════ ColorPick de Storio, genérico (tokens de la piel) ═════ */
1985
+
1986
+ /* THE APP'S ONE COLOUR PICKER (components/ColorPick.js, used through the ColorPick / PaintPick parts).
1987
+ The trigger keeps the .cp-host/.cp-well classes, so every place that sized or ringed the old swatch
1988
+ keeps doing so. The popover (.pk-*) lives on <body> with position:fixed so no panel clips it, and turns
1989
+ into a bottom sheet on a phone. Gradients are optional per place (see the component's header). */
1990
+ .cp-host{ position:relative; display:inline-flex; }
1991
+ .cp-well{ width:2rem; height:2rem; flex:none; padding:0; cursor:pointer; border-radius:.6rem;
1992
+ border:1px solid rgba(0,0,0,.14); box-shadow:inset 0 0 0 1px rgba(255,255,255,.25); }
1993
+ /* PORTED from Fidelidad's custom swatch (.fd-sw-custom): the SAME conic RAINBOW ring, size, radii and
1994
+ card-coloured gap, so Diseño's colour pickers look identical to Fidelidad's — not just «with a ring». */
1995
+ .cp-ring .cp-host{ width:2.5rem; height:2.5rem; padding:2px; border-radius:.7rem; overflow:visible;
1996
+ display:grid; place-items:stretch;
1997
+ background:conic-gradient(from 0deg, #f43f5e, #f59e0b, #22c55e, #3b82f6, #a855f7, #f43f5e); }
1998
+ .cp-ring .cp-well{ width:100%; height:100%; border:0; border-radius:.48rem;
1999
+ box-shadow:inset 0 0 0 2px var(--card); }
2000
+ .pk-well{ position:relative; overflow:hidden; }
2001
+ .pk-dot{ position:absolute; right:3px; bottom:3px; width:14px; height:14px; border-radius:50%; background:#fff;
2002
+ display:grid; place-items:center; box-shadow:0 1px 3px rgba(0,0,0,.3); }
2003
+ .pk-scrim{ position:fixed; inset:0; z-index:var(--z-modal); background:transparent; }
2004
+ .pk-pop{ color:var(--popover-foreground); overflow-y:auto; overscroll-behavior:contain; scrollbar-width:thin; position:fixed; z-index:calc(var(--z-modal) + 1); width:292px; box-sizing:border-box; background:var(--popover); border-radius:20px;
2005
+ box-shadow:0 24px 60px -18px rgba(31,22,60,.38), 0 0 0 1px var(--border); padding:12px;
2006
+ display:flex; flex-direction:column; gap:11px; animation:pk-in .18s cubic-bezier(.2,.8,.3,1); }
2007
+ @keyframes pk-in{ from{ opacity:0; transform:translateY(6px) scale(.98); } to{ opacity:1; transform:none; } }
2008
+ @media (max-width:35rem){
2009
+ .pk-scrim{ background:rgba(16,16,20,.28); }
2010
+ .pk-pop{ left:0 !important; right:0; top:auto !important; bottom:0 !important; max-height:88dvh !important; width:auto; border-radius:22px 22px 0 0;
2011
+ padding:10px 16px calc(16px + env(safe-area-inset-bottom,0px)); animation:pk-up .24s cubic-bezier(.2,.8,.3,1); }
2012
+ .pk-pop::before{ content:""; width:38px; height:5px; border-radius:5px; background:var(--muted); margin:0 auto 2px; }
2013
+ }
2014
+ @keyframes pk-up{ from{ transform:translateY(100%); } to{ transform:none; } }
2015
+ .pk-seg{ display:flex; background:var(--muted); border-radius:12px; padding:3px; gap:2px; }
2016
+ .pk-seg button{ flex:1; font:inherit; font-size:.78rem; font-weight:600; border:0; background:transparent; border-radius:9px;
2017
+ padding:.42rem .4rem; cursor:pointer; color:var(--muted-foreground); }
2018
+ .pk-seg button.on{ background:var(--background); color:var(--foreground); box-shadow:0 1px 3px rgba(31,22,60,.14); }
2019
+ .pk-bar{ position:relative; height:26px; margin:0 10px; border-radius:9px; cursor:copy; touch-action:none; box-shadow:inset 0 0 0 1px rgba(0,0,0,.06); }
2020
+ .pk-stop{ position:absolute; top:50%; width:20px; height:30px; margin:-15px 0 0 -10px; border-radius:7px; border:2.5px solid #fff;
2021
+ box-shadow:0 1px 5px rgba(0,0,0,.35); cursor:grab; touch-action:none; }
2022
+ .pk-stop.on{ box-shadow:0 0 0 2px var(--foreground), 0 2px 8px rgba(0,0,0,.35); }
2023
+ .pk-stop.gone{ opacity:.35; }
2024
+ .pk-map{ position:relative; height:150px; touch-action:none; cursor:crosshair; }
2025
+ .pk-map canvas{ position:absolute; inset:0; width:100%; height:100%; border-radius:12px; }
2026
+ .pk-map svg{ position:absolute; inset:0; width:100%; height:100%; pointer-events:none; overflow:visible; }
2027
+ .pk-pt{ position:absolute; width:22px; height:22px; margin:-11px 0 0 -11px; border-radius:50%; border:2.5px solid #fff;
2028
+ box-shadow:0 1px 6px rgba(0,0,0,.4); pointer-events:none; display:grid; place-items:center; font-size:.58rem; font-weight:800;
2029
+ color:#fff; text-shadow:0 1px 2px rgba(0,0,0,.6); transition:width .1s, height .1s, margin .1s; }
2030
+ .pk-pt.on{ width:28px; height:28px; margin:-14px 0 0 -14px; box-shadow:0 0 0 2px var(--foreground), 0 2px 8px rgba(0,0,0,.4); }
2031
+ .pk-row{ display:flex; align-items:center; gap:8px; }
2032
+ .pk-grow{ flex:1; }
2033
+ .pk-lbl{ font-size:.7rem; font-weight:700; color:var(--muted-foreground); flex:none; width:62px; }
2034
+ .pk-range{ flex:1; min-width:0; -webkit-appearance:none; appearance:none; height:12px; border-radius:99px; outline-offset:3px; }
2035
+ .pk-range::-webkit-slider-thumb{ -webkit-appearance:none; width:18px; height:18px; border-radius:50%; background:#fff; border:2px solid #fff;
2036
+ box-shadow:0 0 0 1px rgba(0,0,0,.25), 0 1px 4px rgba(0,0,0,.3); cursor:grab; }
2037
+ .pk-range::-moz-range-thumb{ width:16px; height:16px; border-radius:50%; background:#fff; border:2px solid #fff; box-shadow:0 0 0 1px rgba(0,0,0,.25); }
2038
+ .pk-hex{ flex:1; min-width:0; display:flex; align-items:center; gap:6px; border:1px solid var(--border); border-radius:10px; padding:5px 8px; }
2039
+ .pk-hex i{ width:18px; height:18px; border-radius:5px; flex:none; box-shadow:inset 0 0 0 1px rgba(0,0,0,.1); }
2040
+ .pk-hex input{ font:600 .82rem var(--font-mono); border:0; outline:0; width:100%; min-width:0; background:transparent;
2041
+ text-transform:uppercase; color:var(--foreground); }
2042
+ .pk-ic{ font:inherit; width:32px; height:32px; flex:none; border-radius:10px; border:1px solid var(--border); background:var(--background); color:var(--foreground);
2043
+ cursor:pointer; display:grid; place-items:center; color:var(--muted-foreground); }
2044
+ .pk-ic:disabled{ opacity:.35; cursor:default; }
2045
+ .pk-ic.on{ background:var(--foreground); border-color:var(--foreground); color:var(--background); }
2046
+ .pk-dial{ width:32px; height:32px; flex:none; border-radius:50%; border:1px solid var(--border); position:relative;
2047
+ cursor:grab; touch-action:none; background:var(--background); }
2048
+ .pk-dial i{ position:absolute; left:50%; top:50%; width:2px; height:12px; margin-left:-1px; background:var(--foreground);
2049
+ border-radius:2px; transform-origin:50% 0; }
2050
+ .pk-deg{ font:600 .74rem var(--font-mono); color:var(--muted-foreground); width:34px; }
2051
+ .pk-sep{ height:1px; background:var(--border); margin:0 -12px; }
2052
+ .pk-anims{ display:grid; grid-template-columns:repeat(auto-fit, minmax(0, 1fr)); gap:4px; }
2053
+ .pk-anims button{ font:inherit; font-size:.64rem; font-weight:600; border:1px solid var(--border); background:var(--background); color:var(--foreground);
2054
+ border-radius:10px; padding:4px 2px 5px; cursor:pointer; display:flex; flex-direction:column; align-items:center; gap:3px; color:var(--muted-foreground); }
2055
+ .pk-anims button i{ width:100%; height:18px; border-radius:6px; }
2056
+ .pk-anims button.on{ border-color:var(--foreground); box-shadow:0 0 0 1px var(--foreground); color:var(--foreground); }
2057
+ .pk-sw{ display:grid; grid-template-columns:repeat(6, 1fr); gap:6px; }
2058
+ .pk-sw button{ aspect-ratio:1; width:100%; border-radius:10px; border:0; cursor:pointer; box-shadow:inset 0 0 0 1px rgba(0,0,0,.08);
2059
+ transition:transform .12s ease; }
2060
+ .pk-sw button:hover{ transform:scale(1.08); }
2061
+ .pk-recent{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
2062
+ .pk-recent button{ width:22px; height:22px; border-radius:7px; border:0; cursor:pointer; box-shadow:inset 0 0 0 1px rgba(0,0,0,.1); }
2063
+ .pk-pop button:focus-visible, .pk-pop input:focus-visible, .pk-pop [tabindex]:focus-visible{ outline:2px solid var(--ring); outline-offset:2px; }
2064
+ /* the animations a picked paint can carry (lib/paint.ts paintCss). «breathe» and «hue» move a filter, so
2065
+ a host puts them on a layer behind its text. */
2066
+ @property --pk-angle{ syntax:"<angle>"; inherits:false; initial-value:0deg; }
2067
+ @keyframes pk-flow{ 0%,100%{ background-position:0% 50%; } 50%{ background-position:100% 50%; } }
2068
+ @keyframes pk-breathe{ 0%,100%{ filter:saturate(1) brightness(1); } 50%{ filter:saturate(1.35) brightness(1.12); } }
2069
+ @keyframes pk-spin{ to{ --pk-angle:360deg; } }
2070
+ @keyframes pk-hue{ to{ filter:hue-rotate(360deg); } }
2071
+ @media (prefers-reduced-motion: reduce){ .pk-pop, .pk-well{ animation:none !important; } }
2072
+ .pk-stop::before{ content:""; position:absolute; inset:-9px -8px; }
2073
+ .pk-bar.grabbing, .pk-bar.grabbing .pk-stop{ cursor:grabbing; }
2074
+ /* «Saturación N»: the slider acts on ONE point of the gradient, and its label shows which (number + colour). */
2075
+ .pk-satlbl{ display:flex; align-items:center; gap:5px; width:auto; min-width:62px; }
2076
+ .pk-satdot{ width:16px; height:16px; flex:none; border-radius:50%; display:grid; place-items:center; font-style:normal; font-size:.56rem;
2077
+ font-weight:800; color:#fff; text-shadow:0 1px 2px rgba(0,0,0,.6); box-shadow:0 0 0 1.5px #fff, 0 0 0 2.5px rgba(0,0,0,.15); }
2078
+
2079
+
2080
+ /* ═════════════════════════ 5. mslider ═════════════════════════ */
2081
+ /* ═════ Slider de Storio (components/Slider.js), genérico ═════ */
2082
+ .mslider { --track: var(--muted); }
2083
+ .mslider { position: relative; padding-top: 2.1rem; width: 100%; }
2084
+ .mslider-bubble {
2085
+ position: absolute; top: 0; transform: translateX(-50%); pointer-events: none;
2086
+ background: var(--primary); color: var(--primary-foreground);
2087
+ font-weight: 700; font-size: .72rem; padding: .24rem .5rem; border-radius: 8px;
2088
+ font-variant-numeric: tabular-nums; white-space: nowrap;
2089
+ box-shadow: 0 3px 10px rgb(0 0 0 / .2);
2090
+ }
2091
+ .mslider-bubble::after {
2092
+ content: ""; position: absolute; left: 50%; bottom: -4px; transform: translateX(-50%);
2093
+ border: 5px solid transparent; border-top-color: var(--primary); border-bottom: 0;
2094
+ }
2095
+ .mslider-input {
2096
+ -webkit-appearance: none; appearance: none;
2097
+ width: 100%; height: 1.6rem; margin: 0; padding: 0;
2098
+ background: transparent; cursor: pointer; display: block;
2099
+ }
2100
+ .mslider-input:focus { outline: none; }
2101
+
2102
+ /* WebKit / Blink (Chrome, Safari, Edge) */
2103
+ .mslider-input::-webkit-slider-runnable-track {
2104
+ height: .5rem; border-radius: 999px;
2105
+ background: linear-gradient(var(--primary), var(--primary)) left/var(--p, 50%) 100% no-repeat, var(--track);
2106
+ }
2107
+ .mslider-input::-webkit-slider-thumb {
2108
+ -webkit-appearance: none; appearance: none;
2109
+ width: 1.3rem; height: 1.3rem; margin-top: -.4rem;
2110
+ border-radius: 50%; background: var(--background); border: .3rem solid var(--primary);
2111
+ box-shadow: 0 2px 5px rgb(0 0 0 / .3); transition: transform .1s ease;
2112
+ }
2113
+ .mslider-input:active::-webkit-slider-thumb { transform: scale(1.12); }
2114
+ .mslider-input:focus-visible::-webkit-slider-thumb { box-shadow: 0 2px 5px rgb(0 0 0 / .3), 0 0 0 4px var(--ring); }
2115
+
2116
+ /* Firefox */
2117
+ .mslider-input::-moz-range-track { height: .5rem; border-radius: 999px; background: var(--track); }
2118
+ .mslider-input::-moz-range-progress { height: .5rem; border-radius: 999px; background: var(--primary); }
2119
+ .mslider-input::-moz-range-thumb {
2120
+ width: 1.3rem; height: 1.3rem; border: .3rem solid var(--primary);
2121
+ border-radius: 50%; background: var(--background); box-shadow: 0 2px 5px rgb(0 0 0 / .3);
2122
+ }
2123
+ .mslider-input:active::-moz-range-thumb { transform: scale(1.12); }
2124
+
2125
+
2126
+
2127
+ /* ── muten adapters, kit core: the island as the app's one floating notice (the artifact showed it inside a phone) ── */
2128
+ .cx-island.cx-island-app { position: fixed; top: calc(env(safe-area-inset-top, 0px) + 12px); z-index: var(--z-toast); }
2129
+ .cx-kit-layer { color: var(--foreground); }
2130
+ .cx-gap-2 { gap: 2px; } .cx-gap-14 { gap: 14px; }
2131
+ .cx-dirty-host, .cx-kit-widget { display: contents; }
2132
+
2133
+ /* ── muten adapters, batch: people, fields, notices ── */
2134
+ .cx-who > .cx-who-t { display: block; } .cx-who .cx-who-n { display: block; font-weight: 500; } .cx-who .cx-who-s { color: var(--muted-foreground); font-size: 13px; }
2135
+ .cx-av-wrap { display: inline-flex; }
2136
+ .cn-avatar-badge.cx-online { width: 10px; height: 10px; }
2137
+ .cx-field-behavior, .cx-island-host, .cx-kit-host { display: none; }
2138
+ /* Band from muten: data-open is "true"/"false" (the artifact toggled the attribute). */
2139
+ .cx-band-slot[data-open="false"] { grid-template-rows: 0fr; }
2140
+ .cx-band-slot > .cx-band-fold { overflow: hidden; min-height: 0; }
2141
+ .cx-band-slot > .cx-band-fold > .cx-band { transition: opacity 140ms ease; }
2142
+ .cx-band-slot[data-open="false"] > .cx-band-fold > .cx-band { opacity: 0; }
2143
+ .cx-band > .mu-icon { font-size: 16px; flex: none; }
2144
+ .cx-band[data-tone="warn"] > .mu-icon { color: var(--warning); }
2145
+ .cx-band > .cx-band-text { flex: 1; }
2146
+ /* Accordion from muten: the panel folds with grid rows (exact height, no measuring) and its text fades. */
2147
+ .cn-accordion-content.cx-acc-fold { display: grid; grid-template-rows: 1fr; transition: grid-template-rows 200ms ease; animation: none; }
2148
+ .cn-accordion-content.cx-acc-fold[data-open="false"] { grid-template-rows: 0fr; }
2149
+ .cn-accordion-content.cx-acc-fold > .cn-accordion-content-inner { overflow: hidden; min-height: 0; transition: opacity 160ms ease; }
2150
+ .cn-accordion-content.cx-acc-fold[data-open="false"] > .cn-accordion-content-inner { opacity: 0; padding-bottom: 0; }
2151
+ .cn-accordion-trigger > .cx-acc-chev { margin-left: auto; font-size: 16px; color: var(--muted-foreground); transition: transform 200ms ease; }
2152
+ .cn-accordion-trigger[aria-expanded="true"] > .cx-acc-chev { transform: rotate(180deg); }
2153
+ .cn-accordion-trigger { width: 100%; }
2154
+ .cx-fake > .mu-span { display: block; height: 34px; border-radius: calc(var(--radius) * .8); background: var(--muted); }
2155
+ .cx-fake > .mu-span:nth-child(2n) { width: 80%; }
2156
+ .cx-appbar-down { margin-top: 44px; }
2157
+ .cx-otp-stack { display: flex; flex-direction: column; align-items: center; gap: 14px; }
2158
+ .cx-car-behavior, .cx-tags-host:empty, .cx-pgnav-host:empty { display: none; }
2159
+ .cx-car-slide > * { min-width: 0; }
2160
+ .cx-thumb .cx-thumb-fill { display: block; width: 100%; height: 100%; border-radius: inherit; background-size: cover; }
2161
+ /* muten adapters · collections: backgrounds that come from data ride --bg (muten's style()). */
2162
+ .cx-prod-ph { width: 100%; aspect-ratio: 1; border-radius: calc(var(--radius) * 1.2); background: var(--bg, var(--muted)); }
2163
+ .cx-hero[style*="--bg"], .cx-gallery-img[style*="--bg"] { background: var(--bg); }
2164
+ .cx-gap-8 { gap: 8px; }
2165
+ .cx-pg-row > .cx-pg-who { display: flex; flex-direction: column; } .cx-pg-row .cx-pg-sub { font-size: 12px; color: var(--muted-foreground); } .cx-pg-row > .cx-pg-amt { font-weight: 600; font-variant-numeric: tabular-nums; }
2166
+ .mu-stack.cx-car-slide { display: block; }
2167
+
2168
+ /* ── Loading: the content fades in where its skeleton was (kit-skeleton.muten) ── */
2169
+ :where(.style-nova) .cx-loading, :where(.style-nova) .cx-loaded, :where(.style-nova) .cx-sk-host { display: block; }
2170
+ .cx-loaded { animation: cx-loaded-in 180ms ease-out; }
2171
+ @keyframes cx-loaded-in { from { opacity: 0.001; } to { opacity: 1; } }
2172
+ @media (prefers-reduced-motion: reduce) { .cx-loaded { animation: none; } }
2173
+ /* a skeleton line inside an Item title takes the title's width (the title shrinks to its text otherwise) */
2174
+ .cn-item-title:has(> .cx-sk) { width: 100%; }
2175
+ .cx-sk-tr > .cx-sk { flex: 0 1 auto; min-width: 0; }
2176
+
2177
+ /* ── ToggleGroup: Base UI marks orientation and spacing with its own attributes; muten writes data-orientation and
2178
+ data-spacing, so the joined / separated / vertical looks are restated on those (toggle-group.muten) ── */
2179
+ .style-nova .cn-toggle-group { display: flex; width: fit-content; flex-direction: row; align-items: center; }
2180
+ .style-nova .cn-toggle-group[data-orientation="vertical"] { flex-direction: column; align-items: stretch; }
2181
+ .style-nova .cn-toggle-group[data-spacing="1"] { gap: 4px; }
2182
+ .style-nova .cn-toggle-group[data-spacing="2"] { gap: 8px; }
2183
+ .style-nova .cn-toggle-group[data-spacing="0"] > .cn-toggle { border-radius: 0; }
2184
+ .style-nova .cn-toggle-group[data-spacing="0"][data-orientation="horizontal"] > .cn-toggle:first-child { border-top-left-radius: var(--radius-lg, 10px); border-bottom-left-radius: var(--radius-lg, 10px); }
2185
+ .style-nova .cn-toggle-group[data-spacing="0"][data-orientation="horizontal"] > .cn-toggle:last-child { border-top-right-radius: var(--radius-lg, 10px); border-bottom-right-radius: var(--radius-lg, 10px); }
2186
+ .style-nova .cn-toggle-group[data-spacing="0"][data-orientation="horizontal"] > .cn-toggle-variant-outline:not(:first-child) { border-left-width: 0; }
2187
+ .style-nova .cn-toggle-group[data-spacing="0"][data-orientation="vertical"] > .cn-toggle:first-child { border-top-left-radius: var(--radius-lg, 10px); border-top-right-radius: var(--radius-lg, 10px); }
2188
+ .style-nova .cn-toggle-group[data-spacing="0"][data-orientation="vertical"] > .cn-toggle:last-child { border-bottom-left-radius: var(--radius-lg, 10px); border-bottom-right-radius: var(--radius-lg, 10px); }
2189
+ .style-nova .cn-toggle-group[data-spacing="0"][data-orientation="vertical"] > .cn-toggle-variant-outline:not(:first-child) { border-top-width: 0; }
2190
+ .style-nova .cn-toggle-group[data-spacing="0"][data-variant="outline"] { box-shadow: 0 1px 2px rgb(0 0 0 / .05); }
2191
+ .style-nova .cn-toggle[aria-pressed="true"] { background: var(--muted); }
2192
+ .style-nova .cn-button-group > .cx-av-wrap, .style-nova .cn-button-group > .mu-stack { display: flex; }
2193
+
2194
+ /* ── RadioGroup: muten writes data-state="true|false" (Base UI's data-checked is presence-only) ── */
2195
+ .cx-rg { display: grid; gap: 12px; }
2196
+ .cx-rg[data-orientation="horizontal"] { grid-auto-flow: column; justify-content: start; gap: 20px; }
2197
+ .cx-rg-row { display: flex; align-items: flex-start; gap: 10px; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: 6px; }
2198
+ .cx-rg-row:focus-visible { outline: none; }
2199
+ .cx-rg-row:focus-visible .cx-rg-dot { border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 50%, transparent); }
2200
+ .cx-rg-dot { position: relative; display: block; width: 16px; height: 16px; margin-top: 2px; border-radius: 99px; border: 1px solid var(--input); background: transparent; transition: background-color 150ms, border-color 150ms; }
2201
+ .cx-rg-dot[data-state="true"] { background: var(--primary); border-color: var(--primary); }
2202
+ .cx-rg-dot::after { content: ""; position: absolute; top: 50%; left: 50%; width: 8px; height: 8px; border-radius: 99px; background: var(--primary-foreground); transform: translate(-50%, -50%) scale(0); transition: transform 150ms cubic-bezier(.22, 1, .36, 1); }
2203
+ .cx-rg-dot[data-state="true"]::after { transform: translate(-50%, -50%) scale(1); }
2204
+ .cx-rg-row:active .cx-rg-dot { scale: .92; }
2205
+ .cx-rg-text { display: flex; flex-direction: column; gap: 2px; }
2206
+ .cx-rg-text > .cn-field-description:empty { display: none; }
2207
+ .cx-rg-text > .cn-label { cursor: pointer; }
2208
+
2209
+ /* ── Checkbox: muten's native primitive with Nova's look — Checkbox "Acepto" bind(x) class("cx-checkbox")
2210
+ (the primitive is a <label> around the <input>; the class lands on the label) ── */
2211
+ .cx-checkbox { display: inline-flex; align-items: flex-start; gap: 10px; width: fit-content; max-width: 100%; font-size: 14px; line-height: 20px; cursor: pointer; }
2212
+ .cx-checkbox > input[type="checkbox"] { margin-top: 2px; }
2213
+ .cx-checkbox > .mu-checkbox-label { min-width: 0; }
2214
+ .cx-checkbox > input[type="checkbox"] { appearance: none; -webkit-appearance: none; margin: 0; flex: none; width: 16px; height: 16px; border: 1px solid var(--input); border-radius: 4px; background: transparent center / 12px no-repeat; cursor: pointer; transition: background-color 150ms, border-color 150ms; }
2215
+ .cx-checkbox > input[type="checkbox"]:checked { background-color: var(--primary); border-color: var(--primary); background-image: var(--cx-check-mark); }
2216
+ .cx-checkbox { --cx-check-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); }
2217
+ :root[data-theme="dark"] .cx-checkbox { --cx-check-mark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E"); }
2218
+ .cx-checkbox > input[type="checkbox"]:focus-visible { outline: none; border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 50%, transparent); }
2219
+ .cx-checkbox:has(> input:disabled) { opacity: .5; cursor: not-allowed; }
2220
+ .cx-checkbox > input[type="checkbox"]:active { scale: .92; }
2221
+
2222
+ /* ── NumberField / VectorField (number-field.js, vector-field.muten) ── */
2223
+ .cx-nf-host { display: block; }
2224
+ .cx-nf { width: fit-content; max-width: 100%; }
2225
+ .cx-nf-input { text-align: left; font-variant-numeric: tabular-nums; field-sizing: content; min-width: 3ch; width: auto; flex: 0 1 auto; padding-right: 2px; }
2226
+ .cx-nf-prefix { font-size: 12px; font-weight: 600; color: var(--muted-foreground); min-width: 14px; }
2227
+ .cx-nf-unit { font-size: 13px; color: var(--muted-foreground); padding-right: 2px; }
2228
+ .cx-nf-steps { gap: 0; padding-right: 4px; }
2229
+ .cx-nf-btn:disabled { opacity: .35; }
2230
+ .cx-vector { display: flex; flex-wrap: wrap; gap: 8px; width: fit-content; max-width: 100%; }
2231
+ .cx-vector .cx-nf { max-width: none; }
2232
+ /* ── FileInput (file-input.js) ── */
2233
+ .cx-file-host { display: flex; flex-direction: column; gap: 8px; width: 100%; max-width: 360px; }
2234
+ .cx-file-drop { aspect-ratio: auto; min-height: 132px; }
2235
+ .cx-file-drop[data-over] { border-color: var(--primary); background: color-mix(in srgb, var(--primary) 6%, transparent); }
2236
+ .cx-file-msg { text-align: left; margin: 0; color: var(--destructive); }
2237
+ .cx-file-msg:empty { display: none; }
2238
+ .cx-file-list:empty { display: none; }
2239
+ .cx-file-list { gap: 6px; }
2240
+
2241
+ /* ── Swatch (swatch.muten) ── */
2242
+ .cx-swatches-row { display: flex; flex-direction: row; flex-wrap: wrap; gap: 8px; }
2243
+ .cx-swatch { --s: 28px; width: var(--s); height: var(--s); flex: none; padding: 0; border-radius: calc(var(--radius) * .8); border: 1px solid color-mix(in srgb, var(--foreground) 12%, transparent); background: var(--bg); cursor: pointer; transition: box-shadow 150ms, scale 120ms; }
2244
+ .cx-swatch[data-size="sm"] { --s: 20px; border-radius: calc(var(--radius) * .6); }
2245
+ .cx-swatch[data-size="lg"] { --s: 36px; }
2246
+ .cx-swatch:hover { scale: 1.06; }
2247
+ .cx-swatch:active { scale: .94; }
2248
+ .cx-swatch[aria-pressed="true"] { box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--selected, var(--ring)); }
2249
+ .cx-swatch:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--ring); }
2250
+
2251
+ /* ── Collapsible (collapsible.muten) ── */
2252
+ .cx-coll { display: flex; flex-direction: column; width: 100%; max-width: 420px; border: 1px solid var(--border); border-radius: var(--radius); }
2253
+ .cx-coll-trigger { display: flex; align-items: center; gap: 8px; width: 100%; padding: 10px 12px; border: 0; background: none; color: inherit; font: inherit; font-size: 14px; font-weight: 500; text-align: left; cursor: pointer; border-radius: var(--radius); }
2254
+ .cx-coll-trigger:hover { background: color-mix(in srgb, var(--muted) 60%, transparent); }
2255
+ .cx-coll-trigger:focus-visible { outline: none; box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 50%, transparent); }
2256
+ .cx-coll-label { flex: 1; }
2257
+ .cx-coll-hint { font-size: 13px; font-weight: 400; color: var(--muted-foreground); }
2258
+ .cx-coll-hint:empty { display: none; }
2259
+ .cx-coll-trigger[aria-expanded="true"] .cx-acc-chev { rotate: 180deg; }
2260
+ .cx-coll .cx-acc-chev { width: 16px; height: 16px; color: var(--muted-foreground); transition: rotate 200ms ease; }
2261
+ .cx-coll-inner { padding: 0 12px 12px; display: flex; flex-direction: column; gap: 8px; }
2262
+ /* ── ScrollArea (scroll-area.muten) ── */
2263
+ .cx-scroll-area { display: block; max-height: var(--h, 18rem); overflow-y: auto; overflow-x: hidden; border-radius: var(--radius); }
2264
+ .cx-scroll-area[data-orientation="horizontal"] { max-height: none; overflow-x: auto; overflow-y: hidden; }
2265
+ /* ── Resizable (resizable.muten) ── */
2266
+ .cx-rz { display: flex; flex-direction: row; width: 100%; min-height: 200px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.2); overflow: hidden; }
2267
+ .cx-rz[data-orientation="vertical"] { flex-direction: column; }
2268
+ .cx-rz-panel { min-width: 0; min-height: 0; overflow: auto; display: flex; flex-direction: column; }
2269
+ .cx-rz-handle { position: relative; flex: none; width: 1px; display: flex; align-items: center; justify-content: center; background: var(--border); cursor: col-resize; touch-action: none; outline: none; }
2270
+ .cx-rz-handle::after { content: ""; position: absolute; inset: 0 -4px; }
2271
+ .cx-rz[data-orientation="vertical"] > .cx-rz-handle { width: auto; height: 1px; cursor: row-resize; }
2272
+ .cx-rz[data-orientation="vertical"] > .cx-rz-handle::after { inset: -4px 0; }
2273
+ .cx-rz-handle:focus-visible, .cx-rz-handle[data-drag] { background: var(--ring); }
2274
+ .cx-rz-handle .cn-resizable-handle-icon { display: block; width: 4px; height: 24px; border-radius: 99px; background: var(--border); z-index: 1; }
2275
+ .cx-rz[data-orientation="vertical"] .cn-resizable-handle-icon { width: 24px; height: 4px; }
2276
+ .cx-rz-behavior { display: none; }
2277
+ /* ── Timeline (timeline.muten): the artifact's .cx-timeline on muten's Stacks ── */
2278
+ .cx-tl { display: flex; flex-direction: column; gap: 12px; padding-left: 4px; }
2279
+ .cx-tl-item { position: relative; display: flex; flex-direction: column; gap: 1px; padding-left: 18px; }
2280
+ .cx-tl-item::before { content: ""; position: absolute; left: 0; top: 6px; width: 8px; height: 8px; border-radius: 99px; background: var(--border); }
2281
+ .cx-tl-item:not(:last-child)::after { content: ""; position: absolute; left: 3.5px; top: 18px; bottom: -10px; width: 1px; background: var(--border); }
2282
+ .cx-tl-item[data-state="now"]::before { background: var(--selected, var(--primary)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--selected, var(--primary)) 20%, transparent); }
2283
+ .cx-tl-item[data-state="now"] .cx-tl-title { font-weight: 600; }
2284
+ .cx-tl-item[data-state="next"] { opacity: .55; }
2285
+ .cx-tl-desc { margin: 0; font-size: 13px; color: var(--muted-foreground); }
2286
+ .cx-tl-desc:empty { display: none; }
2287
+ /* ── Stepper (stepper.muten): bars across, numbered dots down ── */
2288
+ .cx-stp { display: grid; grid-template-columns: repeat(var(--n, 3), minmax(0, 1fr)); gap: 6px; width: 100%; max-width: 480px; }
2289
+ .cx-stp-step { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
2290
+ .cx-stp-bar { height: 4px; }
2291
+ .cx-stp-bar > .cn-progress-indicator { width: 0; transition: width 260ms cubic-bezier(.22, 1, .36, 1); }
2292
+ .cx-stp-step[data-state="done"] .cx-stp-bar > .cn-progress-indicator, .cx-stp-step[data-state="now"] .cx-stp-bar > .cn-progress-indicator { width: 100%; }
2293
+ .cx-stp-dot, .cx-stp-desc { display: none; }
2294
+ .cx-stp-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2295
+ .cx-stp-step[data-state="now"] .cx-stp-label { color: var(--foreground); font-weight: 500; }
2296
+ .cx-stp[data-orientation="vertical"] { grid-template-columns: 1fr; gap: 0; max-width: 360px; }
2297
+ .cx-stp[data-orientation="vertical"] .cx-stp-step { flex-direction: row; align-items: flex-start; gap: 12px; position: relative; padding-bottom: 20px; }
2298
+ .cx-stp[data-orientation="vertical"] .cx-stp-step:not(:last-child)::after { content: ""; position: absolute; left: 13px; top: 30px; bottom: 2px; width: 2px; border-radius: 2px; background: var(--border); }
2299
+ .cx-stp[data-orientation="vertical"] .cx-stp-step[data-state="done"]:not(:last-child)::after { background: var(--primary); }
2300
+ .cx-stp[data-orientation="vertical"] .cx-stp-bar { display: none; }
2301
+ .cx-stp[data-orientation="vertical"] .cx-stp-dot { display: grid; place-items: center; flex: none; width: 28px; height: 28px; border-radius: 99px; border: 1px solid var(--border); background: var(--background); font-size: 13px; font-weight: 600; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
2302
+ .cx-stp-check { display: none; width: 14px; height: 14px; }
2303
+ .cx-stp[data-orientation="vertical"] [data-state="done"] .cx-stp-dot { background: var(--primary); border-color: var(--primary); color: var(--primary-foreground); }
2304
+ .cx-stp[data-orientation="vertical"] [data-state="done"] .cx-stp-num { display: none; }
2305
+ .cx-stp[data-orientation="vertical"] [data-state="done"] .cx-stp-check { display: block; }
2306
+ .cx-stp[data-orientation="vertical"] [data-state="now"] .cx-stp-dot { border-color: var(--selected, var(--primary)); color: var(--foreground); box-shadow: 0 0 0 3px color-mix(in srgb, var(--selected, var(--primary)) 18%, transparent); }
2307
+ .cx-stp[data-orientation="vertical"] .cx-stp-text { display: flex; flex-direction: column; gap: 2px; padding-top: 4px; }
2308
+ .cx-stp[data-orientation="vertical"] .cx-stp-label { white-space: normal; font-size: 14px; }
2309
+ .cx-stp[data-orientation="vertical"] .cx-stp-desc { display: block; margin: 0; font-size: 13px; color: var(--muted-foreground); }
2310
+ .cx-stp[data-orientation="vertical"] .cx-stp-desc:empty { display: none; }
2311
+ /* ── Code (code.js) ── */
2312
+ .cx-code { display: block; width: 100%; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.2); background: color-mix(in srgb, var(--muted) 45%, var(--background)); overflow: hidden; }
2313
+ .cx-code-bar { display: flex; align-items: center; justify-content: space-between; padding: 6px 8px 0 14px; font-size: 12px; color: var(--muted-foreground); font-family: "Geist Mono", ui-monospace, monospace; }
2314
+ .cx-code-pre { margin: 0; padding: 8px 14px 14px; overflow-x: auto; font: 13px/1.65 "Geist Mono", ui-monospace, monospace; }
2315
+
2316
+ /* ── a picker button inside an InputGroup (MoneyField's currency, PhoneField's country): it fills the group's
2317
+ height with an even 3px inset instead of overflowing it, and the input gives way so nothing spills ── */
2318
+ .cn-input-group-addon:has(> .cx-cc) { align-self: stretch; height: auto; padding: 3px !important; }
2319
+ .cn-input-group-addon > .cx-cc { height: 100%; min-height: 0; padding-inline: 8px; border-radius: calc(var(--radius) * .6); }
2320
+ .cn-input-group > .cn-input-group-input { min-width: 0; }
2321
+ /* rows and columns the kit's modules build (the artifact page called them pg-line / pg-stack) */
2322
+ .cx-line { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px; }
2323
+ .cx-line-start { justify-content: flex-start; }
2324
+ .cx-vline { display: flex; flex-direction: column; align-items: center; gap: 14px; }
2325
+ .cx-cc[data-mf-cur] { min-width: 3.75rem; }
2326
+ /* ImageUpload (dates.js): the zone, its line and its buttons, each with room around them */
2327
+ .cx-up-host { display: flex; flex-direction: column; gap: 10px; }
2328
+ .cx-up-host > .cx-drop-msg { font-size: 13px; line-height: 1.45; min-height: 0; }
2329
+ .cx-up-host > .cx-line:not(:has(> button:not([hidden]))) { display: none; }
2330
+
2331
+ /* ── the value bubble and the end labels are optional on every slider (scale-slider / range-slider / slider) ── */
2332
+ .cx-sl-host[data-bubble="off"] .cx-sl-bubble, .cx-mslider-host[data-bubble="off"] .mslider-bubble { display: none; }
2333
+ .cx-sl-host[data-bubble="off"] .cx-slider { margin-top: 6px; }
2334
+ .cx-mslider-host[data-bubble="off"] .mslider { padding-top: 6px; }
2335
+ .cx-sl-host[data-bubble="drag"] .cx-sl-bubble, .cx-mslider-host[data-bubble="drag"] .mslider-bubble { opacity: 0; scale: .9; transition: opacity 140ms ease, scale 140ms ease; }
2336
+ .cx-sl-host[data-bubble="drag"]:is(:active, :focus-within) .cx-sl-bubble, .cx-mslider-host[data-bubble="drag"]:is(:active, :focus-within) .mslider-bubble { opacity: 1; scale: 1; }
2337
+ .cx-sl-host[data-ends="off"] .cx-sl-scale { display: none; }
2338
+
2339
+ /* ── Field horizontal: the label on the left in one line; the control and its help (or error) stacked on the right ── */
2340
+ .style-nova .cn-field.cn-field-orientation-horizontal { display: grid; grid-template-columns: var(--field-label, 10rem) minmax(0, 1fr); column-gap: 20px; row-gap: 6px; align-items: start; }
2341
+ .style-nova .cn-field.cn-field-orientation-horizontal > .cn-label { grid-column: 1; grid-row: 1 / span 3; padding-top: 7px; white-space: nowrap; }
2342
+ .style-nova .cn-field.cn-field-orientation-horizontal > :not(.cn-label) { grid-column: 2; }
2343
+
2344
+ /* PasswordField (kit.password): the meter breathes under the field; the four bars are full, rounded segments */
2345
+ .cx-pwd-host .cx-pw-meter { margin-top: 10px; gap: 10px; }
2346
+ .cx-pwd-host .cx-pw-bars { gap: 6px; }
2347
+ .cx-pwd-host .cx-pw-bars .cn-progress { height: 6px; border-radius: 99px; overflow: hidden; }
2348
+ .cx-pwd-host .cx-pw-rules { gap: 8px; margin-top: 14px; }
2349
+ /* Empty keeps a readable measure instead of stretching across the page; VirtualList fills its container */
2350
+ .style-nova .cn-empty { width: 100%; max-width: 26rem; margin-inline: auto; }
2351
+ .cx-vl-host { display: block; width: 100%; }
2352
+ /* Stepper: the dot holds the number OR the check, never both (mu-icon's own display would win over a bare class) */
2353
+ .cx-stp .cx-stp-dot > .cx-stp-check { display: none; }
2354
+ .cx-stp[data-orientation="vertical"] .cx-stp-step[data-state="done"] .cx-stp-dot > .cx-stp-check { display: block; }
2355
+ .cx-stp[data-orientation="vertical"] .cx-stp-step[data-state="done"] .cx-stp-dot > .cx-stp-num { display: none; }
2356
+
2357
+ /* ── NavButton / NavBar (nav-button.muten): the «you are here» marker is chosen, the button is any Btn ── */
2358
+ .cx-navbar { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 4px; }
2359
+ .cx-navbar[data-orientation="vertical"] { flex-direction: column; align-items: stretch; width: 100%; max-width: 240px; }
2360
+ .cx-navbar[data-orientation="vertical"] > .cx-nav { justify-content: flex-start; }
2361
+ .cx-nav-label:empty { display: none; }
2362
+ .style-nova .cn-button.cx-nav[data-marker="fill"][aria-pressed="true"] { background: var(--selected-soft); color: var(--selected); }
2363
+ .cx-nav[data-marker="fill"]::after, .cx-nav[data-marker="none"]::after { display: none; }
2364
+ .style-nova .cn-button.cx-nav[data-marker="line"][aria-pressed="true"][aria-pressed] { background: transparent; color: var(--foreground); }
2365
+ .cx-nav[data-marker="line"][aria-pressed="true"]::after { left: 10px; right: 10px; bottom: 0; width: auto; height: 2px; margin: 0; border-radius: 2px; }
2366
+ .style-nova .cn-button.cx-nav[data-marker="none"][aria-pressed="true"][aria-pressed] { background: transparent; color: var(--foreground); font-weight: 600; }
2367
+ .cx-navbar[data-orientation="vertical"] > .cx-nav[data-marker="dot"][aria-pressed="true"]::after { left: auto; right: 10px; bottom: auto; top: 50%; margin: -2px 0 0; }
2368
+ .cx-vl-host .cx-pages-wrap { max-width: none; }
2369
+ .mu-stack.cx-car-view { display: block; width: 100%; } /* the track sizes its columns in % of its width: the view must be a block, not a shrink-to-fit row */
2370
+ /* KitWidget while its kit loads: the inbox and the assistant keep their final height with the skeleton shimmer */
2371
+ .cx-mx-host.cx-kw-wait:empty { display: block; height: 640px; border-radius: calc(var(--radius) * 1.6); background: linear-gradient(90deg, var(--sk-a) 0%, var(--sk-b) 50%, var(--sk-a) 100%); background-size: 200% 100%; animation: cx-sk 1.3s linear infinite; }
2372
+ .cx-bot.cx-kw-wait:empty { display: block; height: 520px; border-radius: calc(var(--radius) * 1.6); background: linear-gradient(90deg, var(--sk-a) 0%, var(--sk-b) 50%, var(--sk-a) 100%); background-size: 200% 100%; animation: cx-sk 1.3s linear infinite; }
2373
+ @media (max-width: 480px) { .cx-mx-host.cx-kw-wait:empty { height: 600px; } }
2374
+ /* Fundamentos (docs): the radius and shadow scales drawn with the real tokens */
2375
+ .cx-radii { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; }
2376
+ .cx-radius, .cx-shadow { display: grid; place-items: center; width: 112px; height: 80px; font-size: 12px; color: var(--muted-foreground); font-family: var(--font-mono); }
2377
+ .cx-radius { border: 1px solid var(--border); background: var(--muted); border-radius: calc(var(--radius) * var(--r, 1)); }
2378
+ .cx-shadow { border-radius: var(--radius); background: var(--card); border: 1px solid color-mix(in srgb, var(--border) 60%, transparent); }
2379
+ .cx-shadow[data-level="xs"] { box-shadow: 0 1px 2px rgb(0 0 0 / .05); }
2380
+ .cx-shadow[data-level="sm"] { box-shadow: 0 1px 3px rgb(0 0 0 / .08), 0 1px 2px rgb(0 0 0 / .04); }
2381
+ .cx-shadow[data-level="md"] { box-shadow: 0 6px 16px -6px rgb(0 0 0 / .16), 0 2px 4px -2px rgb(0 0 0 / .06); }
2382
+ .cx-shadow[data-level="lg"] { box-shadow: 0 18px 40px -12px rgb(0 0 0 / .25), 0 4px 10px -4px rgb(0 0 0 / .08); }
2383
+
2384
+ /* ── floating parts (kit/overlays.js): a trigger and a panel that rises to the top layer ── */
2385
+ .cx-ov { display: inline-flex; position: relative; }
2386
+ .cx-ov.cx-ov-zone { display: flex; width: 100%; }
2387
+ .cx-ov-trigger { display: inline-flex; }
2388
+ .cx-ov-zone > .cx-ov-trigger { display: flex; width: 100%; }
2389
+ .cx-ov-behavior { display: none; }
2390
+ .cx-ov-content[popover] { position: fixed; inset: auto; margin: 0; border: 0; overflow: visible; width: var(--w, auto); max-width: calc(100vw - 16px); color: var(--popover-foreground); }
2391
+ .cx-ov-content:not([popover]) { display: none; }
2392
+ .cx-ov-content[popover]:popover-open { display: flex; flex-direction: column; }
2393
+ /* menus: items are buttons laid out as rows; the label grows, the shortcut sits at the end */
2394
+ .cx-menu { gap: 0; padding: 4px; max-height: min(24rem, calc(100dvh - 32px)); overflow-y: auto; }
2395
+ .cx-menu-item { position: relative; display: flex; align-items: center; gap: 8px; width: 100%; min-height: 32px; padding: 6px 8px; border: 0; background: none; color: inherit; font: inherit; font-size: 14px; text-align: left; cursor: default; border-radius: calc(var(--radius) * .7); outline: none; }
2396
+ .cx-menu-item:focus, .cx-menu-item:focus-visible { background: var(--accent); color: var(--accent-foreground); }
2397
+ .cx-menu-item[data-variant="destructive"] { color: var(--destructive); }
2398
+ .cx-menu-item[data-variant="destructive"]:focus { background: color-mix(in srgb, var(--destructive) 10%, transparent); color: var(--destructive); }
2399
+ .cx-menu-item > .mu-icon { width: 16px; height: 16px; flex: none; color: var(--muted-foreground); }
2400
+ .cx-menu-item[data-variant="destructive"] > .mu-icon { color: var(--destructive); }
2401
+ .cx-menu-label { flex: 1; min-width: 0; }
2402
+ .cx-menu-item .cn-dropdown-menu-shortcut:empty { display: none; }
2403
+ .cx-menu-check { padding-right: 32px; }
2404
+ .cx-menu-mark, .cx-menu-dot { position: absolute; right: 10px; display: grid; place-items: center; width: 16px; height: 16px; }
2405
+ .cx-menu-check[aria-checked="false"] .cx-menu-mark { visibility: hidden; }
2406
+ .cx-menu-dot::after { content: ""; width: 7px; height: 7px; border-radius: 99px; background: currentColor; transform: scale(0); transition: transform 120ms ease; }
2407
+ .cx-menu-check[aria-checked="true"] .cx-menu-dot::after { transform: scale(1); }
2408
+ .cx-menu-group { display: flex; flex-direction: column; }
2409
+ .cx-menu .cn-dropdown-menu-separator { display: block; height: 1px; margin: 4px -4px; background: var(--border); }
2410
+ .cx-menu .cn-dropdown-menu-label { display: block; padding: 6px 8px 4px; font-size: 12px; font-weight: 500; color: var(--muted-foreground); }
2411
+ /* the context zone */
2412
+ .cx-ctx-zone { align-items: center; justify-content: center; min-height: 140px; border: 1.5px dashed var(--input); border-radius: calc(var(--radius) * 1.2); color: var(--muted-foreground); font-size: 14px; user-select: none; -webkit-touch-callout: none; }
2413
+ .cx-ctx-zone[data-open] { border-color: var(--ring); background: color-mix(in srgb, var(--muted) 40%, transparent); }
2414
+ /* menubar */
2415
+ .cx-menubar { display: flex; flex-direction: row; align-items: center; width: fit-content; }
2416
+ .cx-menubar .cn-menubar-trigger { border: 0; background: none; color: inherit; font: inherit; font-size: 14px; font-weight: 500; padding: 3px 8px; border-radius: calc(var(--radius) * .6); cursor: default; }
2417
+ .cx-menubar .cx-ov-trigger[data-open] .cn-menubar-trigger, .cx-menubar .cn-menubar-trigger:hover { background: var(--muted); }
2418
+ /* navigation menu */
2419
+ .cx-navmenu { display: flex; flex-direction: row; align-items: center; gap: 2px; }
2420
+ .cx-navmenu-trigger { display: inline-flex; align-items: center; gap: 4px; border: 0; background: none; color: inherit; font: inherit; font-size: 14px; font-weight: 500; text-decoration: none; padding: 6px 10px; border-radius: calc(var(--radius) * .8); cursor: pointer; }
2421
+ .cx-navmenu-trigger:hover, .cx-ov-trigger[data-open] .cx-navmenu-trigger { background: var(--muted); }
2422
+ .cx-navmenu-trigger .cn-navigation-menu-trigger-icon { width: 12px; height: 12px; transition: rotate 200ms ease; }
2423
+ .cx-ov-trigger[data-open] .cn-navigation-menu-trigger-icon { rotate: 180deg; }
2424
+ .cx-navmenu-panel[popover]:popover-open { display: grid; grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr)); gap: 4px; padding: 8px; border-radius: calc(var(--radius) * 1.2); background: var(--popover); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 10%, transparent), 0 10px 30px -10px rgb(0 0 0 / .25); }
2425
+ .cx-navmenu-link { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: 10px; border-radius: calc(var(--radius) * .8); color: inherit; text-decoration: none; }
2426
+ .cx-navmenu-link:hover, .cx-navmenu-link:focus-visible { background: var(--muted); outline: none; }
2427
+ .cx-navmenu-title { font-size: 14px; font-weight: 500; }
2428
+ .cx-navmenu-desc { font-size: 13px; line-height: 1.4; color: var(--muted-foreground); }
2429
+ .cx-navmenu-desc:empty { display: none; }
2430
+ /* the panels' enter / exit (Nova's animate-in reads data-open / data-closed, which the kit sets) */
2431
+ .cx-ov-content[data-open] { animation: cx-ov-in 120ms cubic-bezier(.22, 1, .36, 1); }
2432
+ .cx-ov-content[data-closed] { animation: cx-ov-out 100ms ease forwards; }
2433
+ @keyframes cx-ov-in { from { opacity: 0; transform: scale(.96) translateY(var(--ov-dy, -4px)); } }
2434
+ @keyframes cx-ov-out { to { opacity: 0; transform: scale(.97); } }
2435
+ .cx-ov-content[data-side="top"] { --ov-dy: 4px; }
2436
+ @media (prefers-reduced-motion: reduce) { .cx-ov-content[data-open], .cx-ov-content[data-closed] { animation-duration: 1ms; } }
2437
+
2438
+ /* ── Modal mode sheet (sheet.muten): a full-height panel from a side, or full-width from the top/bottom ── */
2439
+ .cx-modal[data-mode="sheet"] { top: 0; bottom: 0; right: 0; width: min(26rem, calc(100% - 2rem)); max-height: none; border-radius: 0; overflow: hidden; transition: transform 300ms cubic-bezier(.32, .72, 0, 1); transform: translateX(100%); }
2440
+ .cx-modal[data-mode="sheet"][data-side="left"] { right: auto; left: 0; transform: translateX(-100%); }
2441
+ .cx-modal[data-mode="sheet"]:is([data-side="top"], [data-side="bottom"]) { left: 0; right: 0; width: 100%; height: auto; max-height: min(80dvh, 40rem); }
2442
+ .cx-modal[data-mode="sheet"][data-side="top"] { bottom: auto; transform: translateY(-100%); }
2443
+ .cx-modal[data-mode="sheet"][data-side="bottom"] { top: auto; transform: translateY(100%); }
2444
+ .cx-modal-root[data-open="true"] > .cx-modal[data-mode="sheet"] { transform: none; }
2445
+ .cx-modal[data-mode="sheet"] .cx-modal-body { flex: 1; }
2446
+
2447
+ /* ── Command (command.muten): search on top, the list scrolls under it ── */
2448
+ .cx-command { display: flex; flex-direction: column; width: 100%; max-width: 480px; border-radius: calc(var(--radius) * 1.2); border: 1px solid var(--border); background: var(--popover); overflow: hidden; }
2449
+ .cx-command-input { display: flex; flex-direction: row; align-items: center; gap: 8px; padding: 0 12px; border-bottom: 1px solid var(--border); }
2450
+ .cx-command-input > .mu-icon { width: 16px; height: 16px; flex: none; color: var(--muted-foreground); }
2451
+ .cx-command-input input { flex: 1; min-width: 0; height: 44px; border: 0; background: none; outline: none; font: inherit; font-size: 14px; color: inherit; }
2452
+ .cx-command-list { display: flex; flex-direction: column; max-height: 300px; overflow-y: auto; padding: 4px; }
2453
+ .cx-cmd-group { display: flex; flex-direction: column; padding: 2px 0; }
2454
+ .cx-cmd-group[hidden], .cx-cmd-item[hidden], .cx-cmd-sep[hidden], .cx-command-empty[hidden] { display: none; }
2455
+ .cx-cmd-label { padding: 6px 8px 4px; font-size: 12px; font-weight: 500; color: var(--muted-foreground); }
2456
+ .cx-cmd-item { display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 6px 8px; border: 0; border-radius: calc(var(--radius) * .7); background: none; color: inherit; font: inherit; font-size: 14px; text-align: left; cursor: default; outline: none; }
2457
+ .cx-cmd-item > .mu-icon { width: 16px; height: 16px; flex: none; color: var(--muted-foreground); }
2458
+ .cx-cmd-item[data-selected] { background: var(--accent); color: var(--accent-foreground); }
2459
+ .cx-cmd-text { flex: 1; min-width: 0; }
2460
+ .cx-cmd-item .cn-command-shortcut { font-size: 12px; letter-spacing: .08em; color: var(--muted-foreground); }
2461
+ .cx-cmd-item .cn-command-shortcut:empty { display: none; }
2462
+ .cx-cmd-sep { display: block; height: 1px; margin: 4px -4px; background: var(--border); }
2463
+ .cx-command-empty { padding: 24px 8px; text-align: center; font-size: 14px; color: var(--muted-foreground); }
2464
+ .cx-cmd-behavior { display: none; }
2465
+ .cx-palette .cx-modal-body { padding: 0; }
2466
+ .cx-palette .cx-command { max-width: none; border: 0; border-radius: 0; background: transparent; }
2467
+ /* SplitButton: the chevron is a square joined to the main button */
2468
+ .cx-split-caret { width: 32px; padding: 0; }
2469
+ .cx-toaster-host { display: none; }
2470
+ .cx-tip-wrap { display: inline-flex; }
2471
+ .cx-ov-content[popover]:not(:popover-open) { display: none !important; } /* a closed panel must not take the click: muten's .mu-stack display beats the browser's own rule */
2472
+
2473
+ /* ── Breadcrumb / Pagination (links) ── */
2474
+ .cx-breadcrumb { display: block; }
2475
+ .cx-bc-list { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; gap: 6px; font-size: 14px; color: var(--muted-foreground); }
2476
+ .cx-bc-item { color: inherit; text-decoration: none; }
2477
+ a.cx-bc-item:hover { color: var(--foreground); }
2478
+ .cn-breadcrumb-page.cx-bc-item { color: var(--foreground); font-weight: 500; }
2479
+ .cx-bc-sep, .cx-bc-more { display: inline-grid; place-items: center; }
2480
+ .cx-bc-sep .mu-icon { width: 14px; height: 14px; }
2481
+ .cx-bc-more .mu-icon { width: 16px; height: 16px; }
2482
+ .cx-pl-row { display: flex; flex-direction: row; align-items: center; gap: 4px; }
2483
+ .cx-pl-more { display: inline-grid; place-items: center; width: 32px; height: 32px; color: var(--muted-foreground); }
2484
+ /* ── AppSidebar ── */
2485
+ .cx-sidebar { display: flex; width: 248px; flex: none; border-right: 1px solid var(--border); background: color-mix(in srgb, var(--muted) 35%, var(--background)); transition: width 200ms cubic-bezier(.22, 1, .36, 1); overflow: hidden; }
2486
+ .cx-sidebar[data-collapsed="true"] { width: 56px; }
2487
+ .cx-sb-inner { display: flex; flex-direction: column; width: 100%; gap: 4px; padding: 8px; }
2488
+ .cx-sb-head, .cx-sb-foot { display: flex; flex-direction: column; gap: 4px; }
2489
+ .cx-sb-foot { margin-top: auto; }
2490
+ .cx-sb-group { display: flex; flex-direction: column; gap: 2px; padding: 8px 0 4px; }
2491
+ .cx-sb-glabel { padding: 0 8px 4px; font-size: 12px; font-weight: 500; color: var(--muted-foreground); white-space: nowrap; }
2492
+ .cx-sb-glabel:empty { display: none; }
2493
+ .cx-sb-menu { display: flex; flex-direction: column; gap: 2px; }
2494
+ .cx-sb-item { display: flex; align-items: center; gap: 8px; width: 100%; height: 32px; padding: 0 8px; border: 0; border-radius: calc(var(--radius) * .7); background: none; color: inherit; font: inherit; font-size: 14px; text-align: left; cursor: pointer; white-space: nowrap; }
2495
+ .cx-sb-item:hover { background: var(--accent); }
2496
+ .cx-sb-item[data-active="true"] { background: var(--selected-soft); color: var(--selected); font-weight: 500; }
2497
+ .cx-sb-item > .mu-icon { width: 16px; height: 16px; flex: none; }
2498
+ .cx-sb-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
2499
+ .cx-sb-count { min-width: 20px; height: 20px; padding: 0 6px; border-radius: 99px; background: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; display: inline-grid; place-items: center; }
2500
+ .cx-sb-count:empty { display: none; }
2501
+ .cx-sidebar[data-collapsed="true"] :is(.cx-sb-label, .cx-sb-count, .cx-sb-glabel) { display: none; }
2502
+ .cx-sidebar[data-collapsed="true"] .cx-sb-item { justify-content: center; padding: 0; }
2503
+ /* ── Message (message.muten): the kit's bubbles as parts ── */
2504
+ .cx-chat-msg[data-variant="received"] { align-self: flex-start; align-items: flex-start; }
2505
+ .cx-chat-msg[data-variant="sent"] { align-self: flex-end; align-items: flex-end; }
2506
+ .cx-chat-msg[data-variant="received"] .cx-chat-bubble { background: var(--background); box-shadow: 0 0 0 1px var(--border); border-bottom-left-radius: 4px; }
2507
+ .cx-chat-msg[data-variant="sent"] .cx-chat-bubble { background: var(--primary); color: var(--primary-foreground); border-bottom-right-radius: 4px; }
2508
+ .cx-chat-msg[data-variant="sent"] .cx-chat-bubble .cx-text { color: inherit; opacity: .8; }
2509
+ .cx-msg-bubble { display: flex; flex-direction: column; gap: 4px; }
2510
+ .cx-msg-body { display: flex; flex-direction: column; gap: 6px; font-size: 14px; line-height: 1.45; }
2511
+ .cx-chat-tag:empty { display: none; }
2512
+ .cx-tick { width: 14px; height: 14px; }
2513
+ .cx-tick[data-status="read"] { color: var(--info); }
2514
+ .cx-chat-msg[data-variant="sent"] .cx-tick[data-status="read"] { color: color-mix(in srgb, var(--info) 70%, var(--primary-foreground)); }
2515
+ .cx-chat-day { align-self: center; }
2516
+ .cx-msg-scroller { height: var(--h, 22rem); flex: none; width: 100%; max-width: 440px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.4); }
2517
+ .cx-msg-behavior { display: none; }
2518
+ .cx-chat-img { display: block; width: 220px; max-width: 100%; aspect-ratio: 4 / 3; border-radius: calc(var(--radius) * .8); background: var(--bg, var(--muted)) center / cover; }
2519
+ /* ── Attachment ── */
2520
+ .cx-attach { display: flex; align-items: center; gap: 10px; width: 100%; max-width: 280px; padding: 8px 12px 8px 8px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1); background: var(--background); color: var(--foreground); text-decoration: none; }
2521
+ .cx-attach:hover { background: var(--accent); }
2522
+ .cx-attach-ic { display: grid; place-items: center; width: 36px; height: 36px; flex: none; border-radius: calc(var(--radius) * .7); background: var(--muted); color: var(--muted-foreground); }
2523
+ .cx-attach[data-kind="pdf"] .cx-attach-ic { background: color-mix(in srgb, var(--destructive) 12%, transparent); color: var(--destructive); }
2524
+ .cx-attach[data-kind="image"] .cx-attach-ic { background: var(--info-soft); color: var(--info); }
2525
+ .cx-attach[data-kind="sheet"] .cx-attach-ic { background: var(--success-soft); color: var(--success); }
2526
+ .cx-attach-ic .mu-icon { width: 18px; height: 18px; }
2527
+ .cx-attach-text { display: flex; flex-direction: column; min-width: 0; }
2528
+ .cx-attach-name { font-size: 14px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2529
+ .cx-attach-size { font-size: 12px; color: var(--muted-foreground); }
2530
+ .cx-attach-size:empty { display: none; }
2531
+
2532
+ /* ── Estudio: Toolbar, StatusBar, ZoomControl, CanvasViewport, Inspector, TreeView, FolderPicker, SortableList ── */
2533
+ .cx-toolbar { display: inline-flex; flex-direction: row; align-items: center; gap: 4px; padding: 4px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.1); background: var(--popover); box-shadow: 0 4px 14px -6px rgb(0 0 0 / .18); width: fit-content; }
2534
+ .cx-toolbar-group { display: flex; flex-direction: row; align-items: center; gap: 2px; }
2535
+ .cx-toolbar-sep { width: 1px; height: 20px; margin: 0 4px; background: var(--border); flex: none; }
2536
+ .cx-status { display: flex; flex-direction: row; align-items: center; gap: 16px; width: 100%; min-height: 28px; padding: 0 12px; border-top: 1px solid var(--border); background: color-mix(in srgb, var(--muted) 45%, var(--background)); font-size: 12px; color: var(--muted-foreground); font-variant-numeric: tabular-nums; }
2537
+ .cx-status-item { display: flex; flex-direction: row; align-items: center; gap: 6px; white-space: nowrap; }
2538
+ .cx-status-item .mu-icon { width: 13px; height: 13px; }
2539
+ .cx-status-spacer { flex: 1; }
2540
+ .cx-zoom { display: inline-flex; flex-direction: row; align-items: center; gap: 2px; padding: 2px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--popover); width: fit-content; }
2541
+ .cx-zoom-value { min-width: 64px; font-variant-numeric: tabular-nums; }
2542
+ .cx-canvas { position: relative; display: block; width: 100%; height: var(--h, 360px); border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.2); overflow: hidden; }
2543
+ .cx-canvas-host { position: absolute; inset: 0; display: block; }
2544
+ .cx-canvas-host canvas { display: block; width: 100%; height: 100%; cursor: grab; touch-action: none; }
2545
+ .cx-canvas-host canvas:active { cursor: grabbing; }
2546
+ .cx-canvas-over { position: absolute; inset: 12px; display: flex; flex-direction: column; align-items: flex-start; justify-content: space-between; gap: 8px; pointer-events: none; }
2547
+ .cx-canvas-over > * { pointer-events: auto; }
2548
+ .cx-insp { display: flex; flex-direction: column; width: 100%; max-width: 320px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.2); background: var(--background); overflow: hidden; }
2549
+ .cx-insp-sec + .cx-insp-sec { border-top: 1px solid var(--border); }
2550
+ .cx-insp-head { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 10px 12px; border: 0; background: none; color: inherit; font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; }
2551
+ .cx-insp-head:hover { background: color-mix(in srgb, var(--muted) 50%, transparent); }
2552
+ .cx-insp-head .cx-acc-chev { width: 14px; height: 14px; color: var(--muted-foreground); transition: rotate 200ms ease; }
2553
+ .cx-insp-head[aria-expanded="false"] .cx-acc-chev { rotate: -90deg; }
2554
+ .cx-insp-body { display: flex; flex-direction: column; gap: 8px; padding: 2px 12px 12px; }
2555
+ .cx-insp-row { display: grid; grid-template-columns: 84px minmax(0, 1fr); align-items: center; gap: 10px; }
2556
+ .cx-insp-label { font-size: 13px; color: var(--muted-foreground); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2557
+ .cx-insp-ctl { display: flex; flex-direction: row; align-items: center; min-width: 0; }
2558
+ .cx-insp-ctl .cx-nf, .cx-insp-ctl .cx-vector { max-width: 100%; }
2559
+ .cx-tree-host { display: block; width: 100%; max-width: 320px; }
2560
+ .cx-tree { display: flex; flex-direction: column; padding: 4px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.2); }
2561
+ .cx-tree-row { display: flex; align-items: center; gap: 6px; width: 100%; height: 30px; padding-right: 8px; border: 0; border-radius: calc(var(--radius) * .6); background: none; color: inherit; font: inherit; font-size: 13px; text-align: left; cursor: pointer; outline: none; }
2562
+ .cx-tree-row:hover { background: var(--accent); }
2563
+ .cx-tree-row:focus-visible { box-shadow: inset 0 0 0 2px var(--ring); }
2564
+ .cx-tree-row[aria-selected="true"] { background: var(--selected-soft); color: var(--selected); font-weight: 500; }
2565
+ .cx-tree-chev, .cx-tree-ic { display: inline-grid; place-items: center; width: 14px; height: 14px; flex: none; color: var(--muted-foreground); }
2566
+ .cx-tree-chev svg, .cx-tree-ic svg { width: 14px; height: 14px; }
2567
+ .cx-tree-row[aria-selected="true"] .cx-tree-ic { color: inherit; }
2568
+ .cx-tree-chev-none { visibility: hidden; }
2569
+ .cx-tree-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2570
+ .cx-folder-host { display: flex; flex-direction: column; gap: 6px; }
2571
+ .cx-folder-btn[data-connected] { color: var(--selected); border-color: color-mix(in srgb, var(--selected) 40%, var(--border)); }
2572
+ .cx-folder-msg { text-align: left; margin: 0; }
2573
+ .cx-folder-msg:empty { display: none; }
2574
+ .cx-slist-host { display: block; width: 100%; max-width: 320px; }
2575
+ .cx-sl-anchor { display: none; }
2576
+ .cx-insp-sec { display: flex; flex-direction: column; }
2577
+ .cx-insp { max-width: 380px; }
2578
+ .cx-stp-text { display: flex; flex-direction: column; min-width: 0; }
2579
+
2580
+ /* ── Marketing: Pill, FeatureGrid, FeatureRows, BentoGallery, LogoCloud, StatBand, Pricing, GradientBlinds ── */
2581
+ .cx-pill { display: inline-flex; flex-direction: row; align-items: center; gap: 8px; width: fit-content; padding: 6px 14px; border: 1px solid var(--border); border-radius: 99px; background: var(--background); font-size: 13px; font-weight: 500; }
2582
+ .cx-pill .mu-icon { width: 15px; height: 15px; }
2583
+ .cx-pill[data-tone="brand"] { border-color: color-mix(in srgb, var(--selected) 30%, transparent); background: var(--selected-soft); color: var(--selected); }
2584
+ .cx-features { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr)); gap: 16px; width: 100%; }
2585
+ @media (min-width: 900px) { .cx-features { grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr)); } }
2586
+ .cx-feature { display: flex; flex-direction: column; gap: 8px; padding: 20px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.4); background: var(--card); }
2587
+ .cx-feature-ic { display: grid; place-items: center; width: 36px; height: 36px; border-radius: calc(var(--radius) * .8); background: var(--selected-soft); color: var(--selected); }
2588
+ .cx-feature-ic .mu-icon { width: 18px; height: 18px; }
2589
+ .cx-feature-t { margin: 4px 0 0; font-size: 16px; font-weight: 600; }
2590
+ .cx-feature-d { margin: 0; font-size: 14px; line-height: 1.55; color: var(--muted-foreground); }
2591
+ .cx-frows { display: flex; flex-direction: column; width: 100%; border-top: 1px solid var(--border); }
2592
+ .cx-frow { display: grid; grid-template-columns: 64px minmax(0, 4fr) minmax(0, 7fr); gap: 16px; align-items: baseline; padding: 20px 8px; border-bottom: 1px solid var(--border); }
2593
+ .cx-frow-i { font-family: var(--font-mono); font-size: 13px; color: var(--muted-foreground); }
2594
+ .cx-frow-t { margin: 0; font-size: 17px; font-weight: 600; }
2595
+ .cx-frow-d { margin: 0; font-size: 14px; line-height: 1.55; color: var(--muted-foreground); }
2596
+ @media (max-width: 640px) { .cx-frow { grid-template-columns: 40px minmax(0, 1fr); } .cx-frow-d { grid-column: 2; } }
2597
+ .cx-bento { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); grid-auto-rows: var(--row, 160px); gap: 12px; width: 100%; }
2598
+ .cx-bento-cell { grid-column: span var(--span, 2); grid-row: span var(--rows, 1); display: flex; flex-direction: column; justify-content: flex-end; gap: 4px; padding: 16px; border-radius: calc(var(--radius) * 1.4); background: var(--muted); overflow: hidden; }
2599
+ @media (max-width: 640px) { .cx-bento { grid-template-columns: 1fr; grid-auto-rows: auto; } .cx-bento-cell { grid-column: auto; grid-row: auto; min-height: 140px; } }
2600
+ .cx-logos { display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: center; gap: 16px 40px; width: 100%; }
2601
+ .cx-logo { display: flex; align-items: center; height: 28px; color: var(--muted-foreground); opacity: .7; filter: grayscale(1); transition: opacity 160ms, filter 160ms; font-size: 18px; font-weight: 700; letter-spacing: -0.02em; }
2602
+ .cx-logo:hover { opacity: 1; filter: none; color: var(--foreground); }
2603
+ .cx-logo img, .cx-logo .mu-image, .cx-logo .mu-icon { height: 100%; width: auto; }
2604
+ .cx-statband { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(50%, 160px), 1fr)); width: 100%; border-block: 1px solid var(--border); }
2605
+ .cx-statband-cell { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 24px 12px; text-align: center; }
2606
+ .cx-statband-cell + .cx-statband-cell { border-left: 1px solid var(--border); }
2607
+ .cx-statband-value { font-size: 34px; font-weight: 700; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; }
2608
+ .cx-statband-label { font-size: 13px; color: var(--muted-foreground); }
2609
+ .cx-countup { display: inline; }
2610
+ .cx-pricing { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 230px), 1fr)); gap: 16px; width: 100%; align-items: stretch; }
2611
+ .cx-tier { position: relative; display: flex; flex-direction: column; gap: 16px; padding: 24px; border: 1px solid var(--border); border-radius: calc(var(--radius) * 1.6); background: var(--card); }
2612
+ .cx-tier[data-featured="on"] { border-color: var(--selected); box-shadow: 0 0 0 1px var(--selected), 0 18px 40px -20px color-mix(in srgb, var(--selected) 45%, transparent); }
2613
+ .cx-tier-badge { position: absolute; top: -11px; left: 24px; padding: 2px 10px; border-radius: 99px; background: var(--selected); color: var(--selected-foreground); font-size: 12px; font-weight: 600; }
2614
+ .cx-tier-head { display: flex; flex-direction: column; gap: 4px; }
2615
+ .cx-tier-name { font-size: 15px; font-weight: 600; }
2616
+ .cx-tier-desc { margin: 0; font-size: 13px; color: var(--muted-foreground); }
2617
+ .cx-tier-price { display: flex; flex-direction: row; align-items: baseline; gap: 4px; }
2618
+ .cx-tier-amount { font-size: 36px; font-weight: 700; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; }
2619
+ .cx-tier-period { font-size: 14px; color: var(--muted-foreground); }
2620
+ .cx-tier-body { display: flex; flex-direction: column; gap: 10px; flex: 1; }
2621
+ .cx-tier-body > :last-child { margin-top: auto; }
2622
+ .cx-tier-feature { display: flex; flex-direction: row; align-items: center; gap: 8px; font-size: 14px; }
2623
+ .cx-tier-feature .mu-icon { width: 16px; height: 16px; color: var(--selected); flex: none; }
2624
+ .cx-blinds { position: absolute; inset: 0; z-index: 0; pointer-events: none; opacity: .8; }
2625
+ .cx-hero-blinds { position: relative; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px; min-height: 280px; width: 100%; padding: 40px 20px; border-radius: calc(var(--radius) * 1.6); overflow: hidden; text-align: center; }
2626
+ .cx-hero-blinds > :not(.cx-blinds) { position: relative; z-index: 1; }
2627
+ /* NavPill: sticky glass; it firms up as the page scrolls (scroll-driven animation; plain glass where unsupported) */
2628
+ .cx-navpill-wrap { position: sticky; top: 12px; z-index: var(--z-sticky, 20); display: flex; justify-content: center; width: 100%; padding: 0 12px; }
2629
+ .cx-navpill { display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 16px; width: 100%; max-width: 64rem; padding: 8px 8px 8px 18px; border: 1px solid color-mix(in srgb, var(--border) 70%, transparent); border-radius: 99px; background: color-mix(in srgb, var(--background) 70%, transparent); -webkit-backdrop-filter: blur(14px) saturate(1.4); backdrop-filter: blur(14px) saturate(1.4); }
2630
+ .cx-navpill a:not(.cn-button) { color: var(--muted-foreground); text-decoration: none; font-size: 14px; }
2631
+ .cx-navpill a:not(.cn-button):hover { color: var(--foreground); }
2632
+ @supports (animation-timeline: scroll()) {
2633
+ .cx-navpill { animation: cx-navpill-firm linear both; animation-timeline: scroll(); animation-range: 0 120px; }
2634
+ @keyframes cx-navpill-firm { to { background: color-mix(in srgb, var(--background) 92%, transparent); box-shadow: 0 10px 30px -14px rgb(0 0 0 / .25); } }
2635
+ }
2636
+
2637
+ /* ── Big surfaces (a landing page, a sign-in): Btn and the fields share one taller scale, xl 44 · 2xl 52 ── */
2638
+ .style-nova .cn-button-size-xl { height: 44px; gap: 8px; padding-inline: 18px; border-radius: 10px; font-size: 15px; }
2639
+ .style-nova .cn-button-size-2xl { height: 52px; gap: 10px; padding-inline: 24px; border-radius: 12px; font-size: 15.5px; }
2640
+ .style-nova .cn-button-size-icon-xl { width: 44px; height: 44px; border-radius: 10px; }
2641
+ .style-nova .cn-button-size-icon-2xl { width: 52px; height: 52px; border-radius: 12px; }
2642
+ .style-nova :is(.cn-button-size-xl, .cn-button-size-2xl, .cn-button-size-icon-xl, .cn-button-size-icon-2xl) svg:not([class*="size-"]) { width: 18px; height: 18px; }
2643
+ /* a field takes its size on itself (Input/InputGroup size) or from any container around it (FieldSet), so the kit's
2644
+ own fields (PasswordField, PhoneField…) follow too */
2645
+ .style-nova :is(.cn-input:not(.cn-input-group-input), .cn-input-group):is([data-size="xl"], .cx-fieldset[data-fields="xl"] *) { height: 44px; border-radius: 10px; font-size: 15px; }
2646
+ .style-nova :is(.cn-input:not(.cn-input-group-input), .cn-input-group):is([data-size="2xl"], .cx-fieldset[data-fields="2xl"] *) { height: 52px; border-radius: 12px; font-size: 15.5px; }
2647
+ .style-nova .cn-input:not(.cn-input-group-input):is([data-size="xl"], [data-size="2xl"], .cx-fieldset[data-fields] *) { padding-inline: 14px; }
2648
+ .style-nova .cn-input-group:is([data-size="xl"], [data-size="2xl"], .cx-fieldset[data-fields] *) { padding-inline: 4px; }
2649
+ .style-nova .cn-input-group:is([data-size="xl"], [data-size="2xl"], .cx-fieldset[data-fields] *) .cn-input-group-input { font-size: inherit; height: 100%; }
2650
+ .style-nova .cn-input-group:is([data-size="xl"], [data-size="2xl"], .cx-fieldset[data-fields] *) .cn-input-group-addon { font-size: inherit; padding-inline: 10px 4px; }
2651
+ .style-nova .cx-fieldset[data-fields] .cn-label { font-size: 14px; font-weight: 600; }
2652
+ /* filled: the soft field of a landing (muted fill, no line); it turns to the page color with the ring on focus */
2653
+ .style-nova :is(.cn-input:not(.cn-input-group-input), .cn-input-group):is([data-variant="filled"], .cx-fieldset[data-look="filled"] *) { background: var(--muted); border-color: transparent; }
2654
+ .style-nova .cn-input:not(.cn-input-group-input):is([data-variant="filled"], .cx-fieldset[data-look="filled"] *):focus-visible,
2655
+ .style-nova .cn-input-group:is([data-variant="filled"], .cx-fieldset[data-look="filled"] *):focus-within { background: var(--background); border-color: var(--ring); }
2656
+ .style-nova .cn-input-group:is([data-variant="filled"], .cx-fieldset[data-look="filled"] *) .cn-input-group-input { background: transparent; }
2657
+ .cx-fieldset { display: flex; flex-direction: column; gap: 18px; }
2658
+
2659
+ /* ── Field pieces: FieldSeparator (a line with a word in the middle) and FieldHead (a label with an action beside it) ── */
2660
+ .cn-field-separator { position: relative; display: flex; align-items: center; justify-content: center; height: 20px; }
2661
+ .cn-field-separator > .cn-separator { position: absolute; left: 0; right: 0; top: 50%; }
2662
+ .cn-field-separator-content { position: relative; padding: 0 10px; background: var(--background); color: var(--muted-foreground); font-size: 13px; }
2663
+ .cn-field:has(> .cx-field-head) { flex-direction: column; }
2664
+ .cn-field:has(> .cx-field-head) > .cn-label:empty { display: none; }
2665
+ .cx-field-head { display: flex; flex-direction: row; justify-content: space-between; align-items: baseline; gap: 12px; }
2666
+
2667
+ /* ── NavPill look="tray": a tray (radius 18) in the muted fill at rest; once the page moves it turns to glass and the
2668
+ call to action (.cx-nav-cta) turns primary. On a phone the links, the language and «Entrar» (.cx-nav-hide-sm) fold
2669
+ into the menu button (.cx-nav-menu) and the call to action stays. ── */
2670
+ .cx-navpill-wrap[data-look="tray"] { top: 16px; padding: 0; }
2671
+ .cx-navpill[data-look="tray"] { max-width: 1008px; height: 60px; padding: 0 8px 0 20px; gap: 32px; justify-content: flex-start; border: 0; border-radius: 18px; background: var(--muted); box-shadow: none; -webkit-backdrop-filter: none; backdrop-filter: none; animation: none; }
2672
+ .cx-navpill .cx-nav-links { display: flex; flex-direction: row; align-items: center; gap: 26px; }
2673
+ .cx-navpill[data-look="tray"] a:not(.cn-button) { font-size: 14.5px; font-weight: 500; }
2674
+ .cx-navpill a[aria-current="page"] { color: var(--foreground); }
2675
+ .cx-navpill[data-look="tray"] .cx-nav-cta { height: 44px; padding: 0 18px; border-radius: 10px; font-size: 14.5px; background: var(--background); color: var(--foreground); box-shadow: 0 1px 2px rgb(11 11 13 / .06); }
2676
+ .cx-navpill .cx-nav-menu { display: none; }
2677
+ @supports (animation-timeline: scroll()) {
2678
+ .cx-navpill[data-look="tray"], .cx-navpill[data-look="tray"] .cx-nav-cta { animation-timeline: scroll(); animation-range: 0 64px; animation-fill-mode: both; animation-timing-function: linear; }
2679
+ .cx-navpill[data-look="tray"] { animation-name: cx-tray-glass; }
2680
+ .cx-navpill[data-look="tray"] .cx-nav-cta { animation-name: cx-tray-cta; }
2681
+ @keyframes cx-tray-glass { to { background: color-mix(in srgb, var(--background) 82%, transparent); -webkit-backdrop-filter: blur(20px) saturate(1.8); backdrop-filter: blur(20px) saturate(1.8); box-shadow: 0 0 0 1px rgb(11 11 13 / .06), 0 12px 32px -18px rgb(11 11 13 / .35); } }
2682
+ @keyframes cx-tray-cta { to { background: var(--primary); color: var(--primary-foreground); } }
2683
+ }
2684
+ @media (max-width: 640px) {
2685
+ .cx-navpill-wrap[data-look="tray"] { padding: 0 12px; top: 12px; }
2686
+ .cx-navpill[data-look="tray"] { height: 56px; gap: 8px; padding: 0 6px 0 16px; border-radius: 16px; }
2687
+ .cx-navpill[data-look="tray"] .cx-nav-links, .cx-navpill[data-look="tray"] .cx-nav-hide-sm { display: none; }
2688
+ .cx-navpill[data-look="tray"] .cx-nav-cta { height: 40px; padding: 0 14px; font-size: 14px; }
2689
+ .cx-navpill .cx-nav-menu { display: inline-flex; }
2690
+ }
2691
+ @media (prefers-reduced-motion: reduce) { .cx-navpill[data-look="tray"], .cx-navpill[data-look="tray"] .cx-nav-cta { animation: none; } }
2692
+
2693
+ /* ── PricingTier: was (the old price, struck), note (how it is billed) and lead (the line over the features) ── */
2694
+ .cx-tier-was { margin-left: 8px; color: var(--muted-foreground); text-decoration: line-through; font-size: 14px; }
2695
+ .cx-tier-note { margin: 0; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }
2696
+ .cx-tier-lead { color: var(--muted-foreground); font-size: 13px; font-weight: 500; }
2697
+ .cx-tab .cn-badge { margin-left: 6px; }
2698
+ /* a group row inside a table (the plans compared, by topic) */
2699
+ .cn-table-row[data-group="on"] > .cn-table-cell { padding-top: 20px; font-weight: 600; font-size: 12px; color: var(--muted-foreground); }
2700
+
2701
+ /* ── Stepper look="list": a numbered list for «how it works»: ruled rows, a number in a round chip (the current one
2702
+ filled), the step in strong type and its line under it. No bars, no checks. ── */
2703
+ .cx-stp[data-look="list"] { display: flex; flex-direction: column; gap: 0; max-width: none; }
2704
+ .cx-stp[data-look="list"] .cx-stp-step { flex-direction: row; align-items: flex-start; gap: 18px; padding: 20px 0; border-top: 1px solid var(--border); }
2705
+ .cx-stp[data-look="list"] .cx-stp-step:last-child { border-bottom: 1px solid var(--border); }
2706
+ .cx-stp[data-look="list"] .cx-stp-step::after, .cx-stp[data-look="list"] .cx-stp-bar, .cx-stp[data-look="list"] .cx-stp-check { display: none; }
2707
+ .cx-stp[data-look="list"] .cx-stp-dot { display: grid; place-items: center; flex: none; width: 32px; height: 32px; border-radius: 99px; background: var(--muted); color: var(--foreground); font-size: 14px; font-weight: 600; font-variant-numeric: tabular-nums; transition: background-color 200ms ease, color 200ms ease; }
2708
+ .cx-stp[data-look="list"] .cx-stp-dot { border: 0; box-shadow: none; }
2709
+ .cx-stp[data-look="list"] [data-state] .cx-stp-dot { border: 0; box-shadow: none; }
2710
+ .cx-stp[data-look="list"] [data-state="now"] .cx-stp-dot { background: var(--primary); color: var(--primary-foreground); }
2711
+ .cx-stp[data-look="list"] [data-state="done"] .cx-stp-dot { background: var(--muted); color: var(--foreground); }
2712
+ .cx-stp[data-look="list"] .cx-stp-num { display: block; }
2713
+ .cx-stp[data-look="list"] .cx-stp-text { display: flex; flex-direction: column; gap: 4px; padding-top: 4px; min-width: 0; }
2714
+ .cx-stp[data-look="list"] .cx-stp-label { white-space: normal; font-size: 18px; font-weight: 600; letter-spacing: -0.02em; color: var(--foreground); }
2715
+ .cx-stp[data-look="list"] .cx-stp-desc { display: block; margin: 0; font-size: 15px; line-height: 1.6; color: var(--muted-foreground); }
2716
+
2717
+ /* ── WordLine: a line of words set as type (who it is for), muted words joined by dots in ink; a strong word stands out ── */
2718
+ .cx-wordline { display: block; margin: 0; font-size: clamp(28px, 4vw, 44px); line-height: 1.25; letter-spacing: -0.04em; font-weight: 700; color: color-mix(in srgb, var(--muted-foreground) 55%, var(--background)); text-wrap: pretty; }
2719
+ .cx-word { display: inline-block; white-space: nowrap; }
2720
+ .cx-word[data-tone="strong"] { color: var(--foreground); }
2721
+ /* the dot rides after each word, so a line breaks after it and never starts with one */
2722
+ .cx-word:not(:last-child)::after { content: " ·"; color: var(--foreground); margin-right: 0.28em; }
2723
+
2724
+ /* ── Accordion size="lg": the questions of a landing page, taller rows and bigger type ── */
2725
+ .style-nova .cn-accordion[data-size="lg"] .cn-accordion-trigger { padding-block: 22px; font-size: 17px; font-weight: 600; letter-spacing: -0.01em; }
2726
+ .style-nova .cn-accordion[data-size="lg"] .cn-accordion-trigger .cx-acc-chev { width: 18px; height: 18px; }
2727
+ .style-nova .cn-accordion[data-size="lg"] .cn-accordion-content-inner { padding-bottom: 22px; font-size: 15.5px; line-height: 1.65; max-width: 680px; color: var(--muted-foreground); }
2728
+
2729
+ /* ── DeviceFrame: a phone or a browser window around a picture of a product ── */
2730
+ .cx-device { position: relative; display: flex; flex-direction: column; flex: none; overflow: hidden; background: var(--background); box-shadow: 0 0 0 1px var(--border), 0 30px 60px -34px rgb(11 11 13 / .45); }
2731
+ .cx-device[data-kind="phone"] { width: 280px; padding: 6px; border-radius: 44px; }
2732
+ .cx-device[data-kind="browser"] { width: 100%; }
2733
+ .cx-device[data-sized="true"] { width: var(--w); }
2734
+ .cx-device > :not(img) { flex: 1; min-height: 0; border-radius: inherit; }
2735
+ .cx-device[data-kind="phone"] > :not(img) { border-radius: 38px; }
2736
+ .cx-device[data-kind="browser"] > :not(img) { border-radius: 0 0 13px 13px; }
2737
+ .cx-device[data-kind="phone"] > img { display: block; width: 100%; height: auto; border-radius: 38px; object-fit: cover; object-position: top; }
2738
+ .cx-device[data-kind="browser"] { border-radius: 14px; padding-top: 36px; }
2739
+ .cx-device[data-kind="browser"]::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 36px; border-bottom: 1px solid var(--border); background: radial-gradient(circle at 18px 18px, var(--border) 4px, transparent 4.5px), radial-gradient(circle at 34px 18px, var(--border) 4px, transparent 4.5px), radial-gradient(circle at 50px 18px, var(--border) 4px, transparent 4.5px), var(--muted); }
2740
+ .cx-device[data-kind="browser"] > img { display: block; width: 100%; height: auto; }
2741
+ .cx-device[data-crop="true"] { height: var(--h); }
2742
+ .cx-device[data-crop="true"] > img { height: 100%; object-fit: cover; object-position: top; }
2743
+ .cx-device[data-crop="true"]::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 30%; background: linear-gradient(to bottom, transparent, var(--background)); pointer-events: none; }
2744
+
2745
+ /* ── LiveStack: news that keeps arriving; the newest in front, the older ones step back behind it ── */
2746
+ .cx-live { position: relative; display: block; width: 100%; max-width: 380px; height: var(--live-h, 200px); }
2747
+ .cx-live-card { position: absolute; left: 0; right: 0; top: 0; z-index: calc(10 - var(--i, 0)); display: flex; align-items: center; gap: 12px; padding: 14px 16px; border-radius: calc(var(--radius) * 1.6); border: 1px solid var(--border); background: var(--card); color: var(--card-foreground); box-shadow: 0 18px 36px -24px rgb(11 11 13 / .45); transform-origin: top center; transform: translateY(calc(var(--i, 0) * 14px)) scale(calc(1 - var(--i, 0) * 0.05)); opacity: calc(1 - var(--i, 0) * 0.28); transition: transform 560ms cubic-bezier(.23, 1, .32, 1), opacity 420ms ease, filter 420ms ease; }
2748
+ .cx-live-card[data-enter] { transform: translateY(-28px) scale(.96); opacity: 0; filter: blur(4px); }
2749
+ .cx-live-card + .cx-live-card + .cx-live-card + .cx-live-card { opacity: 0; }
2750
+ .cx-live-ic { display: grid; place-items: center; flex: none; width: 36px; height: 36px; border-radius: 10px; background: var(--muted); color: var(--foreground); }
2751
+ .cx-live-ic svg { width: 18px; height: 18px; }
2752
+ .cx-live-card[data-tone="ok"] .cx-live-ic { background: var(--success-soft); color: var(--success); }
2753
+ .cx-live-card[data-tone="wait"] .cx-live-ic { background: var(--warning-soft); color: var(--warning); }
2754
+ .cx-live-card[data-tone="info"] .cx-live-ic { background: var(--selected-soft); color: var(--selected); }
2755
+ .cx-live-tx { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
2756
+ .cx-live-tx b { font-size: 14px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2757
+ .cx-live-tx span { font-size: 13px; color: var(--muted-foreground); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2758
+ .cx-live-card small { flex: none; align-self: flex-start; font-size: 12px; color: var(--muted-foreground); }
2759
+ @media (prefers-reduced-motion: reduce) { .cx-live-card { transition: none; } }
2760
+
2761
+ /* ── Press: anything you press gives way a little (0.97), so the page feels it heard you ── */
2762
+ .style-nova .cn-button { transition-property: color, background-color, border-color, box-shadow, transform; transition-duration: 160ms; transition-timing-function: cubic-bezier(.23, 1, .32, 1); }
2763
+ .style-nova .cn-button:active:not(:disabled) { transform: scale(0.97); }