@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/registry.json CHANGED
@@ -4,624 +4,1068 @@
4
4
  "style": "shadcn zinc dark (tokens shipped by globals.css: bg-card / bg-primary / text-muted-foreground / border-border / …)",
5
5
  "components": [
6
6
  {
7
- "name": "card",
8
- "part": "Card",
9
- "file": "registry/card.muten",
10
- "description": "A surface with CardHeader / CardTitle / CardDescription / CardContent / CardFooter sub-components.",
11
- "deps": []
7
+ "name": "accordion",
8
+ "deps": [],
9
+ "part": "Accordion",
10
+ "file": "registry/accordion.muten",
11
+ "description": "Stacked expandable sections with AccordionItem; page owns a bool per item."
12
12
  },
13
13
  {
14
- "name": "badge",
15
- "part": "Badge",
16
- "file": "registry/badge.muten",
17
- "description": "A small status descriptor. variant: default | secondary | destructive | outline.",
18
- "deps": []
14
+ "name": "agenda",
15
+ "deps": [],
16
+ "part": "Agenda",
17
+ "file": "registry/agenda.muten",
18
+ "component": "Agenda",
19
+ "description": "Agenda(resources, hours, events, blocks, from, to, slot, onCreate, onChange): day/week/list, drag, resize, appointment sheet (Custom, kit core)."
20
+ },
21
+ {
22
+ "name": "alert-dialog",
23
+ "deps": [],
24
+ "part": "AlertDialog",
25
+ "file": "registry/alert-dialog.muten",
26
+ "description": "A modal requiring an explicit choice (no backdrop dismiss); page owns the open bool."
19
27
  },
20
28
  {
21
29
  "name": "alert",
30
+ "deps": [],
22
31
  "part": "Alert",
23
32
  "file": "registry/alert.muten",
24
- "description": "A callout with AlertTitle / AlertDescription. variant: default | destructive.",
25
- "deps": []
33
+ "description": "Alert(variant, tone) callout: an Icon, AlertTitle, AlertDescription, AlertAction at the corner. tone: info | ok | wait."
34
+ },
35
+ {
36
+ "name": "app-shell",
37
+ "deps": [],
38
+ "part": "AppShell",
39
+ "file": "registry/app-shell.muten",
40
+ "component": "AppShell",
41
+ "description": "AppShell(brand, user, nav, pages, rows, commands, narrow, onNavigate, onOpen, onAction): Sidebar, page header, detail Sheet, ⌘K Command."
42
+ },
43
+ {
44
+ "name": "attachment",
45
+ "deps": [],
46
+ "part": "Attachment",
47
+ "file": "registry/attachment.muten",
48
+ "description": "A file attachment chip (icon + name + size)."
26
49
  },
27
50
  {
28
51
  "name": "avatar",
52
+ "deps": [],
29
53
  "part": "Avatar",
30
54
  "file": "registry/avatar.muten",
31
- "description": "A user's initials in a circle (AvatarFallback).",
32
- "deps": []
55
+ "description": "Avatar(name, size, shape, status): initials with a stable tone from the name, name on hover, online dot · AvatarImage · AvatarGroup + AvatarMore · Who."
33
56
  },
34
57
  {
35
- "name": "switch",
36
- "part": "Switch",
37
- "file": "registry/switch.muten",
38
- "description": "A toggle; the page owns the bool + the action.",
39
- "deps": []
58
+ "name": "badge",
59
+ "deps": [],
60
+ "part": "Badge",
61
+ "file": "registry/badge.muten",
62
+ "description": "Badge(label, variant) · StatusBadge(label, tone) dot+word · ToneBadge(label, tone, dot) tinted · Chip(label, onRemove) removable."
40
63
  },
41
64
  {
42
- "name": "spinner",
43
- "part": "Spinner",
44
- "file": "registry/spinner.muten",
45
- "description": "A loading indicator (animate-spin loader).",
46
- "deps": []
65
+ "name": "band",
66
+ "deps": [],
67
+ "part": "Band",
68
+ "file": "registry/band.muten",
69
+ "description": "Band(open, tone, text, action, onAction) { Icon }: the top strip for a lasting state; folds, never clips."
47
70
  },
48
71
  {
49
- "name": "progress",
50
- "part": "Progress",
51
- "file": "registry/progress.muten",
52
- "description": "A determinate progress bar; value is 0-100.",
53
- "deps": []
72
+ "name": "bar-chart",
73
+ "deps": [
74
+ "kit-widget"
75
+ ],
76
+ "part": "BarChart",
77
+ "file": "registry/bar-chart.muten",
78
+ "description": "BarChart - bars that always fill their height, a period switch (14 días / 30 días). periods: {label, values} - the"
54
79
  },
55
80
  {
56
- "name": "separator",
57
- "part": "Separator",
58
- "file": "registry/separator.muten",
59
- "description": "A thin divider line.",
60
- "deps": []
81
+ "name": "bell",
82
+ "deps": [
83
+ "kit-widget"
84
+ ],
85
+ "part": "Bell",
86
+ "file": "registry/bell.muten",
87
+ "description": "Bell - the system's notifications: tap to see them, mark all read. Bell(items: @notices) items: {icon, tone, title, desc, time, unread}"
61
88
  },
62
89
  {
63
- "name": "empty",
64
- "part": "Empty",
65
- "file": "registry/empty.muten",
66
- "description": "An empty-state placeholder (title + description in a dashed border).",
67
- "deps": []
90
+ "name": "bento",
91
+ "deps": [],
92
+ "part": "BentoGallery",
93
+ "file": "registry/bento.muten",
94
+ "description": "BLOCK: fixed-row-height tiling gallery; cells pick their col-span. Parts: BentoGallery, BentoCell."
95
+ },
96
+ {
97
+ "name": "booking",
98
+ "deps": [],
99
+ "part": "Booking",
100
+ "file": "registry/booking.muten",
101
+ "component": "Booking",
102
+ "description": "Booking(week, taken, wait, onSelect): week strip and hours, closed and full days, skeleton while loading."
68
103
  },
69
104
  {
70
105
  "name": "breadcrumb",
106
+ "deps": [],
71
107
  "part": "Breadcrumb",
72
108
  "file": "registry/breadcrumb.muten",
73
- "description": "A breadcrumb trail with BreadcrumbLink / BreadcrumbSeparator / BreadcrumbPage.",
74
- "deps": []
75
- },
76
- {
77
- "name": "pagination",
78
- "part": "Pagination",
79
- "file": "registry/pagination.muten",
80
- "description": "Page navigation with PaginationLink / Previous / Next / Ellipsis.",
81
- "deps": []
109
+ "description": "A breadcrumb trail with BreadcrumbLink / BreadcrumbSeparator / BreadcrumbPage."
82
110
  },
83
111
  {
84
- "name": "field",
85
- "part": "Field",
86
- "file": "registry/field.muten",
87
- "description": "A labelled form control: FieldLabel / FieldDescription / FieldError.",
88
- "deps": []
112
+ "name": "button-group",
113
+ "deps": [],
114
+ "part": "ButtonGroup",
115
+ "file": "registry/button-group.muten",
116
+ "description": "A segmented row of buttons that share borders. Put btn-outline buttons inside."
89
117
  },
90
118
  {
91
- "name": "item",
92
- "part": "Item",
93
- "file": "registry/item.muten",
94
- "description": "A bordered row: ItemContent / ItemTitle / ItemDescription.",
95
- "deps": []
119
+ "name": "button",
120
+ "deps": [],
121
+ "part": "Btn",
122
+ "file": "registry/button.muten",
123
+ "description": "Btn(variant, size, onClick) { slot }: Nova button with fixed heights; icons move on hover. variant: default | outline | secondary | ghost | destructive | link. size: xs | sm | default | lg | icon | icon-xs | icon-sm | icon-lg."
96
124
  },
97
125
  {
98
- "name": "checkbox",
99
- "part": "Checkbox",
100
- "file": "registry/checkbox.muten",
101
- "description": "A checkbox; the page owns the bool + the toggle action.",
102
- "deps": []
126
+ "name": "calendar",
127
+ "deps": [],
128
+ "part": "Calendar",
129
+ "file": "registry/calendar.muten",
130
+ "component": "Calendar",
131
+ "description": "Calendar(selected, mode, months, min, onSelect): the kit month grid, single day or range, 1 or 2 months (Custom, kit core)."
103
132
  },
104
133
  {
105
- "name": "toggle",
106
- "part": "Toggle",
107
- "file": "registry/toggle.muten",
108
- "description": "A two-state button; the page owns the bool + the toggle action.",
109
- "deps": []
134
+ "name": "canvas-viewport",
135
+ "deps": [],
136
+ "part": "CanvasViewport",
137
+ "file": "registry/canvas-viewport.muten",
138
+ "component": "CanvasHost",
139
+ "description": "A <canvas> with pan/zoom (Custom) + a muten toolbar slot floating on top."
110
140
  },
111
141
  {
112
- "name": "toggle-group",
113
- "part": "ToggleGroup",
114
- "file": "registry/toggle-group.muten",
115
- "description": "Single-select toolbar with ToggleGroupItem; page owns a text state.",
116
- "deps": []
142
+ "name": "card-field",
143
+ "deps": [
144
+ "kit-widget"
145
+ ],
146
+ "part": "CardField",
147
+ "file": "registry/card-field.muten",
148
+ "description": "CardField - card number with its brand, expiry, code; validates (Luhn) and says what was saved."
117
149
  },
118
150
  {
119
- "name": "radio-group",
120
- "part": "RadioGroup",
121
- "file": "registry/radio-group.muten",
122
- "description": "Single choice with RadioGroupItem; page owns a text state.",
123
- "deps": []
151
+ "name": "card",
152
+ "deps": [],
153
+ "part": "Card",
154
+ "file": "registry/card.muten",
155
+ "description": "Card(size) surface that only conveys: CardHeader (CardTitle, CardDescription, CardAction) / CardContent / CardFooter. size: default | sm."
124
156
  },
125
157
  {
126
- "name": "collapsible",
127
- "part": "Collapsible",
128
- "file": "registry/collapsible.muten",
129
- "description": "A trigger + content shown when open; page owns the bool.",
130
- "deps": []
158
+ "name": "carousel",
159
+ "deps": [],
160
+ "part": "Carousel",
161
+ "file": "registry/carousel.muten",
162
+ "component": "Carousel",
163
+ "description": "Carousel(label, perView, center, loop, autoplay, indicator, arrows) { CarouselSlide }: one component, options instead of copies."
131
164
  },
132
165
  {
133
- "name": "accordion",
134
- "part": "Accordion",
135
- "file": "registry/accordion.muten",
136
- "description": "Stacked expandable sections with AccordionItem; page owns a bool per item.",
137
- "deps": []
166
+ "name": "chatbot",
167
+ "deps": [
168
+ "kit-widget"
169
+ ],
170
+ "part": "Chatbot",
171
+ "file": "registry/chatbot.muten",
172
+ "description": "Chatbot - the assistant: greets, offers suggestions, «thinks», writes the answer live (with Stop), can carry an"
138
173
  },
139
174
  {
140
- "name": "tabs",
141
- "part": "TabsList",
142
- "file": "registry/tabs.muten",
143
- "description": "Tab bar (TabsList/TabsTrigger) + TabsContent panels; page owns the active-tab text.",
144
- "deps": []
175
+ "name": "checklist",
176
+ "deps": [
177
+ "kit-widget"
178
+ ],
179
+ "part": "Checklist",
180
+ "file": "registry/checklist.muten",
181
+ "description": "Checklist - first steps with progress: done steps checked, the next ones with their action (onAction gets its label)."
145
182
  },
146
183
  {
147
- "name": "dialog",
148
- "part": "Dialog",
149
- "file": "registry/dialog.muten",
150
- "description": "A modal with DialogTitle/Description/Footer; page owns the open bool. Backdrop click closes.",
151
- "deps": []
184
+ "name": "choice-list",
185
+ "deps": [
186
+ "roving-behavior"
187
+ ],
188
+ "part": "ChoiceList",
189
+ "file": "registry/choice-list.muten",
190
+ "description": "ChoiceList(label) + ChoiceItem(value, current, onPick, title, description, price): Items as a radio group (arrows pick)."
152
191
  },
153
192
  {
154
- "name": "tooltip",
155
- "part": "Tooltip",
156
- "file": "registry/tooltip.muten",
157
- "description": "A hover tooltip (pure CSS, no state). The slot is the trigger.",
158
- "deps": []
193
+ "name": "code",
194
+ "deps": [],
195
+ "part": "Code",
196
+ "file": "registry/code.muten",
197
+ "component": "Code",
198
+ "description": "Syntax-highlighted code block that understands muten (shared highlight.js, same grammar as the VS Code extension)."
159
199
  },
160
200
  {
161
- "name": "dropdown-menu",
162
- "part": "DropdownMenu",
163
- "file": "registry/dropdown-menu.muten",
164
- "description": "A menu below a trigger with DropdownItem/Label/Separator; page owns the open bool.",
165
- "deps": []
201
+ "name": "collapsible",
202
+ "deps": [],
203
+ "part": "Collapsible",
204
+ "file": "registry/collapsible.muten",
205
+ "description": "A trigger + content shown when open; page owns the bool."
166
206
  },
167
207
  {
168
- "name": "popover",
169
- "part": "Popover",
170
- "file": "registry/popover.muten",
171
- "description": "A floating panel below a trigger; page owns the open bool.",
172
- "deps": []
208
+ "name": "color-picker",
209
+ "deps": [],
210
+ "part": "ColorPicker",
211
+ "file": "registry/color-picker.muten",
212
+ "component": "ColorPicker",
213
+ "description": "ColorPicker(value, modes, anims, label, onInput): Storio's colour picker (solid, gradient, animations)."
173
214
  },
174
215
  {
175
- "name": "alert-dialog",
176
- "part": "AlertDialog",
177
- "file": "registry/alert-dialog.muten",
178
- "description": "A modal requiring an explicit choice (no backdrop dismiss); page owns the open bool.",
179
- "deps": []
216
+ "name": "combobox",
217
+ "deps": [],
218
+ "part": "Combobox",
219
+ "file": "registry/combobox.muten",
220
+ "component": "Combobox",
221
+ "description": "Combobox(label, options, value, placeholder, allowNew, onChange): filters and marks the match, «Usar …» for a new value."
180
222
  },
181
223
  {
182
- "name": "sheet",
183
- "part": "Sheet",
184
- "file": "registry/sheet.muten",
185
- "description": "A panel that slides in from the right; page owns the open bool.",
186
- "deps": []
224
+ "name": "command-palette",
225
+ "deps": [],
226
+ "part": "CommandPalette",
227
+ "file": "registry/command-palette.muten",
228
+ "description": "A top-anchored modal holding a Command; page owns the open bool."
187
229
  },
188
230
  {
189
- "name": "drawer",
190
- "part": "Drawer",
191
- "file": "registry/drawer.muten",
192
- "description": "A panel that slides up from the bottom; page owns the open bool.",
193
- "deps": []
231
+ "name": "command",
232
+ "deps": [],
233
+ "part": "Command",
234
+ "file": "registry/command.muten",
235
+ "component": "CommandBehavior",
236
+ "description": "A command palette (search + grouped CommandItem list)."
194
237
  },
195
238
  {
196
- "name": "hover-card",
197
- "part": "HoverCard",
198
- "file": "registry/hover-card.muten",
199
- "description": "Richer content shown on hover (pure CSS, no state).",
200
- "deps": []
239
+ "name": "context-menu",
240
+ "deps": [],
241
+ "part": "ContextMenu",
242
+ "file": "registry/context-menu.muten",
243
+ "description": "Right-click an area to open a menu of items (Custom)."
201
244
  },
202
245
  {
203
- "name": "select",
204
- "part": "Select",
205
- "file": "registry/select.muten",
206
- "description": "A value picker with SelectItem; page owns the value text + open bool.",
207
- "deps": []
246
+ "name": "count-up",
247
+ "deps": [],
248
+ "part": "CountUp",
249
+ "file": "registry/count-up.muten",
250
+ "component": "CountUp",
251
+ "description": "Animate a formatted number (2.4M / 94% / 40ms / 99.99%) from 0 when it scrolls into view; lands on the exact target. Custom. Styled form (takes the class): `Custom CountUp inputs(to: \"2.4M\") class(\"text-4xl font-bold\")`. For stat bands + hero metrics."
208
252
  },
209
253
  {
210
- "name": "scroll-area",
211
- "part": "ScrollArea",
212
- "file": "registry/scroll-area.muten",
213
- "description": "A scrollable region with styled scrollbars.",
214
- "deps": []
254
+ "name": "date-field",
255
+ "deps": [],
256
+ "part": "DateField",
257
+ "file": "registry/date-field.muten",
258
+ "component": "DateField",
259
+ "description": "DateField(label, value, min, years, onChange): the long date; opens the date wheels."
215
260
  },
216
261
  {
217
- "name": "message",
218
- "part": "Message",
219
- "file": "registry/message.muten",
220
- "description": "Chat Message + Bubble + Marker (variant: sent | received).",
221
- "deps": []
262
+ "name": "device-frame",
263
+ "deps": [],
264
+ "part": "DeviceFrame",
265
+ "file": "registry/device-frame.muten",
266
+ "description": "DeviceFrame - a device around a picture of a product: a phone (rounded bezel) or a browser window (a bar with"
222
267
  },
223
268
  {
224
- "name": "message-scroller",
225
- "part": "MessageScroller",
226
- "file": "registry/message-scroller.muten",
227
- "description": "A scrollable column of chat messages.",
228
- "deps": []
269
+ "name": "dialog",
270
+ "deps": [],
271
+ "part": "Dialog",
272
+ "file": "registry/dialog.muten",
273
+ "description": "A modal with DialogTitle/Description/Footer; page owns the open bool. Backdrop click closes."
229
274
  },
230
275
  {
231
- "name": "attachment",
232
- "part": "Attachment",
233
- "file": "registry/attachment.muten",
234
- "description": "A file attachment chip (icon + name + size).",
235
- "deps": []
276
+ "name": "dirty-bar",
277
+ "deps": [],
278
+ "part": "SettingsForm",
279
+ "file": "registry/dirty-bar.muten",
280
+ "component": "DirtyBar",
281
+ "description": "DirtyBar - «Tienes cambios sin guardar»: a floating footer of the form it sits in. It appears when any field,"
236
282
  },
237
283
  {
238
- "name": "menubar",
239
- "part": "Menubar",
240
- "file": "registry/menubar.muten",
241
- "description": "A bar of menus (File/Edit/View); page owns which is open via a text state.",
242
- "deps": []
284
+ "name": "drawer",
285
+ "deps": [],
286
+ "part": "Drawer",
287
+ "file": "registry/drawer.muten",
288
+ "description": "A panel that slides up from the bottom; page owns the open bool."
243
289
  },
244
290
  {
245
- "name": "navigation-menu",
246
- "part": "NavigationMenu",
247
- "file": "registry/navigation-menu.muten",
248
- "description": "A nav bar with hover-revealed panels (pure CSS, no state).",
249
- "deps": []
291
+ "name": "dropdown-menu",
292
+ "deps": [],
293
+ "part": "DropdownMenu",
294
+ "file": "registry/dropdown-menu.muten",
295
+ "description": "A menu below a trigger with DropdownItem/Label/Separator; page owns the open bool."
250
296
  },
251
297
  {
252
- "name": "combobox",
253
- "part": "Combobox",
254
- "file": "registry/combobox.muten",
255
- "description": "A Select with a search box; page filters items with `each … where`.",
256
- "deps": []
298
+ "name": "empty",
299
+ "deps": [],
300
+ "part": "Empty",
301
+ "file": "registry/empty.muten",
302
+ "description": "Empty(title, description) { Icon } — what a list says when it has nothing yet."
257
303
  },
258
304
  {
259
- "name": "command",
260
- "part": "Command",
261
- "file": "registry/command.muten",
262
- "description": "A command palette (search + grouped CommandItem list).",
263
- "deps": []
305
+ "name": "feature-grid",
306
+ "deps": [],
307
+ "part": "FeatureGrid",
308
+ "file": "registry/feature-grid.muten",
309
+ "description": "BLOCK: responsive grid of feature cards (icon + title + copy). Parts: FeatureGrid, FeatureCard."
264
310
  },
265
311
  {
266
- "name": "slider",
267
- "part": "Slider",
268
- "file": "registry/slider.muten",
269
- "component": "Slider",
270
- "description": "A draggable range slider (Custom). Page owns the value number.",
271
- "deps": []
312
+ "name": "feature-rows",
313
+ "deps": [],
314
+ "part": "FeatureRows",
315
+ "file": "registry/feature-rows.muten",
316
+ "description": "BLOCK: numbered feature/schedule rows with side gutters (12-col grid inside). Parts: FeatureRows, FeatureRow."
272
317
  },
273
318
  {
274
- "name": "input-otp",
275
- "part": "InputOtp",
276
- "file": "registry/input-otp.muten",
277
- "component": "InputOtp",
278
- "description": "N single-character boxes synced to one value (Custom). Page owns the value text.",
279
- "deps": []
319
+ "name": "field-behavior",
320
+ "deps": [],
321
+ "part": "FieldBehavior",
322
+ "file": "registry/field-behavior.muten",
323
+ "component": "FieldBehavior",
324
+ "description": "FieldBehavior(kind, message, max): money thousands on blur · email checked on blur · Esc clears search · character count."
280
325
  },
281
326
  {
282
- "name": "calendar",
283
- "part": "Calendar",
284
- "file": "registry/calendar.muten",
285
- "component": "Calendar",
286
- "description": "A month-grid date picker (Custom). Page owns the selected ISO date text.",
287
- "deps": []
327
+ "name": "field",
328
+ "deps": [],
329
+ "part": "Field",
330
+ "file": "registry/field.muten",
331
+ "description": "Field(label, description, orientation) { control } + FieldRow (two columns) + FieldLabel / FieldDescription / FieldError."
288
332
  },
289
333
  {
290
- "name": "toaster",
291
- "part": "Toaster",
292
- "file": "registry/toaster.muten",
293
- "component": "Toaster",
294
- "description": "Fixed toast notifications (Custom). Page bumps a trigger counter to fire one.",
295
- "deps": []
334
+ "name": "file-input",
335
+ "deps": [],
336
+ "part": "FileInput",
337
+ "file": "registry/file-input.muten",
338
+ "component": "FileInput",
339
+ "description": "A click/drag-drop file dropzone (Custom); emits file names."
296
340
  },
297
341
  {
298
- "name": "carousel",
299
- "part": "Carousel",
300
- "file": "registry/carousel.muten",
301
- "component": "Carousel",
302
- "description": "A slide carousel over a list (Custom). Page owns the slides list.",
303
- "deps": []
342
+ "name": "fixed-card",
343
+ "deps": [],
344
+ "part": "FixedCard",
345
+ "file": "registry/fixed-card.muten",
346
+ "description": "FixedCard(title, description) + Row3(time, title, subtitle) + EmptyMini(text): a card that never grows (3 rows + «Ver todas»)."
304
347
  },
305
348
  {
306
- "name": "chart",
307
- "part": "Chart",
308
- "file": "registry/chart.muten",
309
- "component": "Chart",
310
- "description": "An SVG bar chart over a list of { label, value } (Custom).",
311
- "deps": []
349
+ "name": "folder-picker",
350
+ "deps": [],
351
+ "part": "FolderPicker",
352
+ "file": "registry/folder-picker.muten",
353
+ "component": "FolderPicker",
354
+ "description": "Connect a local folder via showDirectoryPicker (Custom); emits the name."
312
355
  },
313
356
  {
314
357
  "name": "gradient-blinds",
358
+ "deps": [
359
+ "ogl"
360
+ ],
315
361
  "part": "GradientBlinds",
316
362
  "file": "registry/gradient-blinds.muten",
317
363
  "component": "GradientBlinds",
318
- "description": "Animated WebGL gradient + diagonal-blinds hero background that follows the cursor and fades into the page (needs ogl).",
319
- "deps": [
320
- "ogl"
321
- ]
364
+ "description": "Animated WebGL gradient + diagonal-blinds hero background that follows the cursor and fades into the page (needs ogl)."
322
365
  },
323
366
  {
324
- "name": "resizable",
325
- "part": "Resizable",
326
- "file": "registry/resizable.muten",
327
- "component": "Resizable",
328
- "description": "Two panels with a draggable splitter (Custom).",
329
- "deps": []
367
+ "name": "hotkey",
368
+ "deps": [],
369
+ "part": "Hotkey",
370
+ "file": "registry/hotkey.muten",
371
+ "component": "Hotkey",
372
+ "description": "A global keyboard shortcut (Cmd/Ctrl+key), invisible (Custom)."
330
373
  },
331
374
  {
332
- "name": "context-menu",
333
- "part": "ContextMenu",
334
- "file": "registry/context-menu.muten",
335
- "component": "ContextMenu",
336
- "description": "Right-click an area to open a menu of items (Custom).",
337
- "deps": []
375
+ "name": "hover-card",
376
+ "deps": [],
377
+ "part": "HoverCard",
378
+ "file": "registry/hover-card.muten",
379
+ "description": "Richer content shown on hover (pure CSS, no state)."
338
380
  },
339
381
  {
340
- "name": "number-field",
341
- "part": "NumberField",
342
- "file": "registry/number-field.muten",
343
- "component": "NumberField",
344
- "description": "A numeric input with -/+ steppers, min/max/step (Custom).",
345
- "deps": []
382
+ "name": "image-upload",
383
+ "deps": [],
384
+ "part": "ImageUpload",
385
+ "file": "registry/image-upload.muten",
386
+ "component": "ImageUpload",
387
+ "description": "ImageUpload(title, hint, maxMb, size, uploadUrl, sample, onReady): validate, decode, crop, shrink, upload with progress."
346
388
  },
347
389
  {
348
- "name": "segmented-control",
349
- "part": "SegmentedControl",
350
- "file": "registry/segmented-control.muten",
351
- "description": "A single-select toolbar (SegmentedItem); page owns a text state.",
352
- "deps": []
390
+ "name": "indicator",
391
+ "deps": [],
392
+ "part": "Indicator",
393
+ "file": "registry/indicator.muten",
394
+ "description": "Indicator(tone): the corner dot that says something needs you."
353
395
  },
354
396
  {
355
- "name": "file-input",
356
- "part": "FileInput",
357
- "file": "registry/file-input.muten",
358
- "component": "FileInput",
359
- "description": "A click/drag-drop file dropzone (Custom); emits file names.",
360
- "deps": []
397
+ "name": "input-group",
398
+ "deps": [
399
+ "field-behavior"
400
+ ],
401
+ "part": "InputGroup",
402
+ "file": "registry/input-group.muten",
403
+ "description": "InputGroup + InputAddon(align) + GroupInput(value) · SearchInput(value, placeholder, onClear) with × only when there is text."
361
404
  },
362
405
  {
363
- "name": "color-picker",
364
- "part": "ColorPicker",
365
- "file": "registry/color-picker.muten",
366
- "component": "ColorPicker",
367
- "description": "A swatch + saturation/value + hue popover (Custom); page owns the hex.",
368
- "deps": []
406
+ "name": "input-otp",
407
+ "deps": [],
408
+ "part": "InputOtp",
409
+ "file": "registry/input-otp.muten",
410
+ "component": "InputOtp",
411
+ "description": "InputOtp(value, length, hint, state, message, resendIn, onInput): slots, caret, ok/bad, resend countdown."
369
412
  },
370
413
  {
371
- "name": "vector-field",
372
- "part": "VectorField",
373
- "file": "registry/vector-field.muten",
374
- "description": "Paired NumberFields (X/Y) for position or size.",
414
+ "name": "input",
415
+ "deps": [],
416
+ "part": "Input",
417
+ "file": "registry/input.muten",
418
+ "description": "Input(value, placeholder) and TextArea(value, placeholder): Nova fields bound to a page text state."
419
+ },
420
+ {
421
+ "name": "inspector",
422
+ "deps": [],
423
+ "part": "Inspector",
424
+ "file": "registry/inspector.muten",
425
+ "description": "Property grid: InspectorSection (collapsible) / InspectorRow (label : value slot)."
426
+ },
427
+ {
428
+ "name": "island",
429
+ "deps": [],
430
+ "part": "Island",
431
+ "file": "registry/island.muten",
432
+ "component": "Island",
433
+ "description": "Island(tone, text, ms): the one floating notice that morphs (kit core)."
434
+ },
435
+ {
436
+ "name": "item",
437
+ "deps": [],
438
+ "part": "Item",
439
+ "file": "registry/item.muten",
440
+ "description": "Item(variant, size) row with ItemMedia / ItemContent / ItemTitle / ItemDescription / ItemActions / ItemFooter; lists = ItemGroup + ItemSeparator."
441
+ },
442
+ {
443
+ "name": "kbd",
444
+ "deps": [],
445
+ "part": "Kbd",
446
+ "file": "registry/kbd.muten",
447
+ "description": "A keyboard key hint. Kbd { Span \"Ctrl\" }."
448
+ },
449
+ {
450
+ "name": "kit-layer",
451
+ "deps": [],
452
+ "part": "KitLayer",
453
+ "file": "registry/kit-layer.muten",
454
+ "component": "KitLayer",
455
+ "description": "KitLayer(): once in the shell; loads the kit core (tooltip, island, sprite)."
456
+ },
457
+ {
458
+ "name": "kit-skeleton",
459
+ "deps": [],
460
+ "part": "Skeletons",
461
+ "file": "registry/kit-skeleton.muten",
462
+ "component": "KitSkeleton",
463
+ "description": "Skeletons(kind, count) / Loading(busy, kind) { … }: content-shaped skeletons, fade on arrival."
464
+ },
465
+ {
466
+ "name": "kit-widget",
467
+ "deps": [],
468
+ "part": "KitWidget",
469
+ "file": "registry/kit-widget.muten",
470
+ "component": "KitWidget",
471
+ "description": "Host of the system kit widgets (Custom, kit core). Use the named parts."
472
+ },
473
+ {
474
+ "name": "link-btn",
475
+ "deps": [],
476
+ "part": "LinkBtn",
477
+ "file": "registry/link-btn.muten",
478
+ "description": "A navigation link styled as a button. `LinkBtn(to: \"/signup\", variant: \"default\") { Span \"Get started\" }`."
479
+ },
480
+ {
481
+ "name": "live-stack",
482
+ "deps": [],
483
+ "part": "LiveStack",
484
+ "file": "registry/live-stack.muten",
485
+ "component": "LiveStack",
486
+ "description": "LiveStack - news that keeps arriving, for a landing page: what the product does while nobody watches («Carla agendó"
487
+ },
488
+ {
489
+ "name": "logo-cloud",
490
+ "deps": [],
491
+ "part": "LogoCloud",
492
+ "file": "registry/logo-cloud.muten",
493
+ "description": "BLOCK: a 'trusted by' strip of logos, muted + grayscale until hover. Parts: LogoCloud, LogoCloudItem."
494
+ },
495
+ {
496
+ "name": "member-list",
375
497
  "deps": [
376
- "number-field"
377
- ]
498
+ "kit-widget"
499
+ ],
500
+ "part": "MemberList",
501
+ "file": "registry/member-list.muten",
502
+ "description": "MemberList - any group (team, workspace, family plan): who is in, their role in the library's menu, invite."
378
503
  },
379
504
  {
380
- "name": "tree-view",
381
- "part": "TreeView",
382
- "file": "registry/tree-view.muten",
383
- "component": "TreeView",
384
- "description": "A nested folder/file tree (Custom): expandable, selectable, icons + indent.",
385
- "deps": []
505
+ "name": "menubar",
506
+ "deps": [],
507
+ "part": "Menubar",
508
+ "file": "registry/menubar.muten",
509
+ "description": "A bar of menus (File/Edit/View); page owns which is open via a text state."
386
510
  },
387
511
  {
388
- "name": "toolbar",
389
- "part": "Toolbar",
390
- "file": "registry/toolbar.muten",
391
- "description": "A grouped button bar with ToolbarGroup / ToolbarSeparator.",
392
- "deps": []
512
+ "name": "message-scroller",
513
+ "deps": [],
514
+ "part": "MessageScroller",
515
+ "file": "registry/message-scroller.muten",
516
+ "component": "MessageScrollerBehavior",
517
+ "description": "A scrollable column of chat messages."
393
518
  },
394
519
  {
395
- "name": "canvas-viewport",
396
- "part": "CanvasViewport",
397
- "file": "registry/canvas-viewport.muten",
398
- "component": "CanvasHost",
399
- "description": "A <canvas> with pan/zoom (Custom) + a muten toolbar slot floating on top.",
400
- "deps": []
520
+ "name": "message",
521
+ "deps": [],
522
+ "part": "Message",
523
+ "file": "registry/message.muten",
524
+ "description": "Chat Message + Bubble + Marker (variant: sent | received)."
401
525
  },
402
526
  {
403
- "name": "status-bar",
404
- "part": "StatusBar",
405
- "file": "registry/status-bar.muten",
406
- "description": "A thin bottom bar with StatusItem / StatusSpacer.",
407
- "deps": []
527
+ "name": "messaging",
528
+ "deps": [
529
+ "kit-widget"
530
+ ],
531
+ "part": "Messaging",
532
+ "file": "registry/messaging.muten",
533
+ "description": "Messaging - one inbox for every channel: list (search, filters with counts, channel, state, unread), the chat (the"
408
534
  },
409
535
  {
410
- "name": "zoom-control",
411
- "part": "ZoomControl",
412
- "file": "registry/zoom-control.muten",
413
- "description": "A - 100% + zoom widget; page owns the zoom number.",
414
- "deps": []
536
+ "name": "modal-behavior",
537
+ "deps": [],
538
+ "part": "ModalBehavior",
539
+ "file": "registry/modal-behavior.muten",
540
+ "component": "ModalBehavior",
541
+ "description": "The adaptive modal's behaviour (history, Esc, focus trap, drawer drag). Used by Modal."
415
542
  },
416
543
  {
417
- "name": "split-button",
418
- "part": "SplitButton",
419
- "file": "registry/split-button.muten",
420
- "description": "A main action + a caret dropdown; page owns the open bool.",
421
- "deps": []
544
+ "name": "modal",
545
+ "deps": [
546
+ "modal-behavior"
547
+ ],
548
+ "part": "Modal",
549
+ "file": "registry/modal.muten",
550
+ "description": "Modal(open, onClose, title, description, mode, size) + ModalFooter: THE adaptive modal (Dialog on desktop, Drawer on phone). Back/Esc/overlay/✕/drag close it."
422
551
  },
423
552
  {
424
- "name": "tag-input",
425
- "part": "TagInput",
426
- "file": "registry/tag-input.muten",
427
- "component": "TagInput",
428
- "description": "Chips you add by typing + Enter (Custom); page owns a comma-joined text.",
429
- "deps": []
553
+ "name": "money-field",
554
+ "deps": [],
555
+ "part": "MoneyField",
556
+ "file": "registry/money-field.muten",
557
+ "component": "MoneyField",
558
+ "description": "MoneyField(label, value, currency, onChange): Intl currency, searchable currency list, minor units."
430
559
  },
431
560
  {
432
- "name": "swatch",
433
- "part": "SwatchPalette",
434
- "file": "registry/swatch.muten",
435
- "description": "A grid of selectable color swatches (Swatch); page owns the selected hex + colors.",
436
- "deps": []
561
+ "name": "nav-button",
562
+ "deps": [],
563
+ "part": "NavButton",
564
+ "file": "registry/nav-button.muten",
565
+ "description": "NavButton(label, current, onClick) + NavBar: chosen is a state (--selected + dot), not a variant."
566
+ },
567
+ {
568
+ "name": "navigation-menu",
569
+ "deps": [],
570
+ "part": "NavigationMenu",
571
+ "file": "registry/navigation-menu.muten",
572
+ "description": "A nav bar with hover-revealed panels (pure CSS, no state)."
573
+ },
574
+ {
575
+ "name": "navpill",
576
+ "deps": [],
577
+ "part": "NavPill",
578
+ "file": "registry/navpill.muten",
579
+ "description": "BLOCK: the floating glass navbar (sticky wrapper + glass pill + scroll animation baked in). Drop logo/links/CTA inside."
580
+ },
581
+ {
582
+ "name": "new-appointment",
583
+ "deps": [],
584
+ "part": "NewAppointment",
585
+ "file": "registry/new-appointment.muten",
586
+ "component": "NewAppointment",
587
+ "description": "NewAppointment(open, clients, services, hours, closed, onCreate, onClose): «Nueva cita» in 4 steps."
588
+ },
589
+ {
590
+ "name": "number-field",
591
+ "deps": [],
592
+ "part": "NumberField",
593
+ "file": "registry/number-field.muten",
594
+ "component": "NumberField",
595
+ "description": "A numeric input with -/+ steppers, min/max/step (Custom)."
596
+ },
597
+ {
598
+ "name": "order-board",
599
+ "deps": [],
600
+ "part": "OrderBoard",
601
+ "file": "registry/order-board.muten",
602
+ "component": "OrderBoard",
603
+ "description": "OrderBoard(lanes, cards, onChange, onAction) / OrderCards(cards, sizes): order board and card with its modals."
604
+ },
605
+ {
606
+ "name": "overlay-behavior",
607
+ "deps": [],
608
+ "part": "OverlayBehavior",
609
+ "file": "registry/overlay-behavior.muten",
610
+ "component": "OverlayBehavior",
611
+ "description": "OverlayBehavior - the opening, placing and closing of a floating panel; the floating parts (Popover, HoverCard,"
612
+ },
613
+ {
614
+ "name": "pagination-nav",
615
+ "deps": [],
616
+ "part": "PaginationNav",
617
+ "file": "registry/pagination-nav.muten",
618
+ "component": "PaginationNav",
619
+ "description": "PaginationNav(total, per, page, noun, onPage): server pages, 7 fixed slots, range line."
620
+ },
621
+ {
622
+ "name": "pagination",
623
+ "deps": [],
624
+ "part": "Pagination",
625
+ "file": "registry/pagination.muten",
626
+ "description": "Page navigation with PaginationLink / Previous / Next / Ellipsis."
627
+ },
628
+ {
629
+ "name": "password-field",
630
+ "deps": [
631
+ "kit-widget"
632
+ ],
633
+ "part": "PasswordField",
634
+ "file": "registry/password-field.muten",
635
+ "description": "PasswordField - a password with show/hide and its strength. PasswordField(label: \"Contraseña nueva\")"
636
+ },
637
+ {
638
+ "name": "permission-matrix",
639
+ "deps": [
640
+ "kit-widget"
641
+ ],
642
+ "part": "PermissionMatrix",
643
+ "file": "registry/permission-matrix.muten",
644
+ "description": "PermissionMatrix - any rows × any roles; one role can be locked (always allowed)."
645
+ },
646
+ {
647
+ "name": "phone-field",
648
+ "deps": [],
649
+ "part": "PhoneField",
650
+ "file": "registry/phone-field.muten",
651
+ "component": "PhoneField",
652
+ "description": "PhoneField(label, value, country, onChange): dial code list, mask, E.164."
653
+ },
654
+ {
655
+ "name": "phone-shell",
656
+ "deps": [],
657
+ "part": "PhoneShell",
658
+ "file": "registry/phone-shell.muten",
659
+ "component": "PhoneShell",
660
+ "description": "PhoneShell(tabs, rows, onSelect): phone frame, big title that shrinks on scroll, three fixed bottom tabs."
661
+ },
662
+ {
663
+ "name": "pill",
664
+ "deps": [],
665
+ "part": "Pill",
666
+ "file": "registry/pill.muten",
667
+ "description": "A hero eyebrow chip (rounded-full, bigger than Badge); slot-based for an icon + text."
668
+ },
669
+ {
670
+ "name": "plans",
671
+ "deps": [
672
+ "kit-widget"
673
+ ],
674
+ "part": "Plans",
675
+ "file": "registry/plans.muten",
676
+ "description": "Plans - plan cards with a monthly/yearly switch; the current plan is marked; going up is one tap, going down asks."
677
+ },
678
+ {
679
+ "name": "popover",
680
+ "deps": [],
681
+ "part": "Popover",
682
+ "file": "registry/popover.muten",
683
+ "description": "A floating panel below a trigger; page owns the open bool."
684
+ },
685
+ {
686
+ "name": "pricing",
687
+ "deps": [],
688
+ "part": "Pricing",
689
+ "file": "registry/pricing.muten",
690
+ "description": "BLOCK: a row of pricing tiers (name/price/features/CTA), featured highlight. Parts: Pricing, PricingTier, PricingFeature."
691
+ },
692
+ {
693
+ "name": "progress",
694
+ "deps": [],
695
+ "part": "Progress",
696
+ "file": "registry/progress.muten",
697
+ "description": "Progress(value, label): determinate bar 0-100 that eases between values."
698
+ },
699
+ {
700
+ "name": "queue",
701
+ "deps": [
702
+ "kit-widget"
703
+ ],
704
+ "part": "Queue",
705
+ "file": "registry/queue.muten",
706
+ "description": "Queue - a waitlist: offer a freed slot to the first in line, with a countdown. Queue(title: \"Lista de espera · sábado\", people: @waiting)"
707
+ },
708
+ {
709
+ "name": "radio-group",
710
+ "deps": [],
711
+ "part": "RadioGroup",
712
+ "file": "registry/radio-group.muten",
713
+ "description": "Single choice with RadioGroupItem; page owns a text state."
437
714
  },
438
715
  {
439
716
  "name": "range-slider",
717
+ "deps": [],
440
718
  "part": "RangeSlider",
441
719
  "file": "registry/range-slider.muten",
442
720
  "component": "RangeSlider",
443
- "description": "A two-thumb range slider (Custom); page owns the low + high numbers.",
444
- "deps": []
721
+ "description": "RangeSlider(lo, hi, min, max, step, onLo, onHi): two thumbs on the kit ScaleSlider."
722
+ },
723
+ {
724
+ "name": "resizable",
725
+ "deps": [],
726
+ "part": "ResizablePanelGroup",
727
+ "file": "registry/resizable.muten",
728
+ "component": "ResizableBehavior",
729
+ "description": "Resizable - panels you size by dragging the line between them (shadcn Nova). Each panel starts at its size (a"
730
+ },
731
+ {
732
+ "name": "roving-behavior",
733
+ "deps": [],
734
+ "part": "RovingBehavior",
735
+ "file": "registry/roving-behavior.muten",
736
+ "component": "RovingBehavior",
737
+ "description": "Arrow keys for a radio group (Custom)."
738
+ },
739
+ {
740
+ "name": "row-menu",
741
+ "deps": [],
742
+ "part": "RowMenu",
743
+ "file": "registry/row-menu.muten",
744
+ "component": "RowMenu",
745
+ "description": "RowMenu(label, items, onPick): the ⋯ menu of a row (arrows, type-ahead, Esc)."
746
+ },
747
+ {
748
+ "name": "save-button",
749
+ "deps": [],
750
+ "part": "SaveButton",
751
+ "file": "registry/save-button.muten",
752
+ "description": "SaveButton(status, onClick, label): idle → saving → saved, fixed width."
753
+ },
754
+ {
755
+ "name": "scale-slider",
756
+ "deps": [],
757
+ "part": "ScaleSlider",
758
+ "file": "registry/scale-slider.muten",
759
+ "component": "ScaleSlider",
760
+ "description": "ScaleSlider(label, min, max, step, values, gap, format, onChange): value rides on the thumb; two bubbles merge."
761
+ },
762
+ {
763
+ "name": "scroll-area",
764
+ "deps": [],
765
+ "part": "ScrollArea",
766
+ "file": "registry/scroll-area.muten",
767
+ "description": "A scrollable region with styled scrollbars."
768
+ },
769
+ {
770
+ "name": "segmented-control",
771
+ "deps": [
772
+ "tabs-behavior"
773
+ ],
774
+ "part": "SegmentedControl",
775
+ "file": "registry/segmented-control.muten",
776
+ "description": "A single-select toolbar (SegmentedItem); page owns a text state."
777
+ },
778
+ {
779
+ "name": "separator",
780
+ "deps": [],
781
+ "part": "Separator",
782
+ "file": "registry/separator.muten",
783
+ "description": "Separator(orientation): a hairline. horizontal | vertical."
784
+ },
785
+ {
786
+ "name": "share-button",
787
+ "deps": [],
788
+ "part": "ShareButton",
789
+ "file": "registry/share-button.muten",
790
+ "component": "ShareButton",
791
+ "description": "ShareButton(label, kind, name, initials, url, product…): share sheet in the adaptive modal, brand targets, QR."
792
+ },
793
+ {
794
+ "name": "sheet",
795
+ "deps": [],
796
+ "part": "Sheet",
797
+ "file": "registry/sheet.muten",
798
+ "description": "A panel that slides in from the right; page owns the open bool."
445
799
  },
446
800
  {
447
801
  "name": "sidebar",
802
+ "deps": [],
448
803
  "part": "AppSidebar",
449
804
  "file": "registry/sidebar.muten",
450
- "description": "AppSidebar - a collapsible nav panel (SidebarHeader / SidebarGroup / SidebarItem). Named AppSidebar so it never shadows muten's core Sidebar <aside> primitive.",
451
- "deps": []
805
+ "description": "AppSidebar - a collapsible nav panel (SidebarHeader / SidebarGroup / SidebarItem). Named AppSidebar so it never shadows muten's core Sidebar <aside> primitive."
806
+ },
807
+ {
808
+ "name": "skeleton",
809
+ "deps": [],
810
+ "part": "Skeleton",
811
+ "file": "registry/skeleton.muten",
812
+ "description": "Skeleton(shape) sized with class(): the shape of content not yet loaded, with a shimmer. shape: \"\" | circle | pill."
813
+ },
814
+ {
815
+ "name": "slider",
816
+ "deps": [],
817
+ "part": "Slider",
818
+ "file": "registry/slider.muten",
819
+ "component": "Slider",
820
+ "description": "Slider(value, min, max, step, suffix, onInput): Storio's slider with the value bubble."
821
+ },
822
+ {
823
+ "name": "sortable-behavior",
824
+ "deps": [],
825
+ "part": "SortableBehavior",
826
+ "file": "registry/sortable-behavior.muten",
827
+ "component": "SortableBehavior",
828
+ "description": "The drag of a Sortable (Custom)."
452
829
  },
453
830
  {
454
831
  "name": "sortable-list",
832
+ "deps": [],
455
833
  "part": "SortableList",
456
834
  "file": "registry/sortable-list.muten",
457
835
  "component": "SortableList",
458
- "description": "Drag rows to reorder (Custom); page owns a comma-joined order.",
459
- "deps": []
836
+ "description": "Drag rows to reorder (Custom); page owns a comma-joined order."
460
837
  },
461
838
  {
462
- "name": "inspector",
463
- "part": "Inspector",
464
- "file": "registry/inspector.muten",
465
- "description": "Property grid: InspectorSection (collapsible) / InspectorRow (label : value slot).",
466
- "deps": []
839
+ "name": "sortable",
840
+ "deps": [
841
+ "sortable-behavior"
842
+ ],
843
+ "part": "Sortable",
844
+ "file": "registry/sortable.muten",
845
+ "description": "Sortable(label, onReorder) + SortItem(key, title, price): drag the grip (pointer or arrows); emits the new key order."
467
846
  },
468
847
  {
469
- "name": "folder-picker",
470
- "part": "FolderPicker",
471
- "file": "registry/folder-picker.muten",
472
- "component": "FolderPicker",
473
- "description": "Connect a local folder via showDirectoryPicker (Custom); emits the name.",
474
- "deps": []
848
+ "name": "spark",
849
+ "deps": [],
850
+ "part": "Spark",
851
+ "file": "registry/spark.muten",
852
+ "component": "Spark",
853
+ "description": "Spark(series, tone): a tiny line for a series (Custom)."
475
854
  },
476
855
  {
477
- "name": "command-palette",
478
- "part": "CommandPalette",
479
- "file": "registry/command-palette.muten",
480
- "description": "A top-anchored modal holding a Command; page owns the open bool.",
481
- "deps": []
856
+ "name": "spinner",
857
+ "deps": [],
858
+ "part": "Spinner",
859
+ "file": "registry/spinner.muten",
860
+ "description": "A loading indicator (animate-spin loader)."
482
861
  },
483
862
  {
484
- "name": "hotkey",
485
- "part": "Hotkey",
486
- "file": "registry/hotkey.muten",
487
- "component": "Hotkey",
488
- "description": "A global keyboard shortcut (Cmd/Ctrl+key), invisible (Custom).",
489
- "deps": []
863
+ "name": "split-button",
864
+ "deps": [],
865
+ "part": "SplitButton",
866
+ "file": "registry/split-button.muten",
867
+ "description": "A main action + a caret dropdown; page owns the open bool."
490
868
  },
491
869
  {
492
- "name": "code",
493
- "part": "Code",
494
- "file": "registry/code.muten",
495
- "component": "Code",
496
- "description": "Syntax-highlighted code block that understands muten (shared highlight.js, same grammar as the VS Code extension).",
497
- "deps": []
870
+ "name": "stamp-card",
871
+ "deps": [
872
+ "kit-widget"
873
+ ],
874
+ "part": "StampCard",
875
+ "file": "registry/stamp-card.muten",
876
+ "description": "StampCard - a loyalty card: stamps toward a reward (good for any shop)."
877
+ },
878
+ {
879
+ "name": "stat-band",
880
+ "deps": [],
881
+ "part": "StatBand",
882
+ "file": "registry/stat-band.muten",
883
+ "description": "BLOCK: a divided row of KPI stats. Parts: StatBand, Stat(label) - value goes in the slot (Span or Custom CountUp)."
884
+ },
885
+ {
886
+ "name": "stat",
887
+ "deps": [
888
+ "spark"
889
+ ],
890
+ "part": "StatCard",
891
+ "file": "registry/stat.muten",
892
+ "description": "StatCard(label, value, delta, tone, compare, series) { Icon } + StatGrid + Spark: a number for any use."
893
+ },
894
+ {
895
+ "name": "status-bar",
896
+ "deps": [],
897
+ "part": "StatusBar",
898
+ "file": "registry/status-bar.muten",
899
+ "description": "A thin bottom bar with StatusItem / StatusSpacer."
498
900
  },
499
901
  {
500
902
  "name": "stepper",
903
+ "deps": [],
501
904
  "part": "Stepper",
502
905
  "file": "registry/stepper.muten",
503
- "description": "Horizontal or vertical step progress indicator; done steps show a check, the current step is ringed (parts: Stepper, StepperVertical, Step).",
504
- "deps": []
906
+ "description": "Horizontal or vertical step progress indicator; done steps show a check, the current step is ringed (parts: Stepper, StepperVertical, Step)."
505
907
  },
506
908
  {
507
- "name": "timeline",
508
- "part": "Timeline",
509
- "file": "registry/timeline.muten",
510
- "description": "Vertical event timeline: a dot on a connector line + title/time/description per item (parts: Timeline, TimelineItem).",
511
- "deps": []
909
+ "name": "store-qr",
910
+ "deps": [],
911
+ "part": "StoreQr",
912
+ "file": "registry/store-qr.muten",
913
+ "component": "StoreQr",
914
+ "description": "StoreQr(url, name, mark): the shop QR with its mark and «Copiar enlace»."
512
915
  },
513
916
  {
514
- "name": "pill",
515
- "part": "Pill",
516
- "file": "registry/pill.muten",
517
- "description": "A hero eyebrow chip (rounded-full, bigger than Badge); slot-based for an icon + text.",
518
- "deps": []
917
+ "name": "swatch",
918
+ "deps": [],
919
+ "part": "SwatchPalette",
920
+ "file": "registry/swatch.muten",
921
+ "description": "A grid of selectable color swatches (Swatch); page owns the selected hex + colors."
519
922
  },
520
923
  {
521
- "name": "feature-grid",
522
- "part": "FeatureGrid",
523
- "file": "registry/feature-grid.muten",
524
- "description": "BLOCK: responsive grid of feature cards (icon + title + copy). Parts: FeatureGrid, FeatureCard.",
525
- "deps": []
924
+ "name": "switch",
925
+ "deps": [],
926
+ "part": "Switch",
927
+ "file": "registry/switch.muten",
928
+ "description": "Switch(on, onToggle, label, size) + SwitchRow(on, onToggle, label, description): Nova switch, the page owns the bool."
526
929
  },
527
930
  {
528
- "name": "pricing",
529
- "part": "Pricing",
530
- "file": "registry/pricing.muten",
531
- "description": "BLOCK: a row of pricing tiers (name/price/features/CTA), featured highlight. Parts: Pricing, PricingTier, PricingFeature.",
532
- "deps": []
931
+ "name": "table-view",
932
+ "deps": [
933
+ "kit-widget"
934
+ ],
935
+ "part": "TableView",
936
+ "file": "registry/table-view.muten",
937
+ "description": "TableView(columns, rows, filters, statuses, bulk, one, many, onAction): the DataTable with filters as data, animated rows, selection, phone sheet, narrow → Items (kit core)."
533
938
  },
534
939
  {
535
- "name": "logo-cloud",
536
- "part": "LogoCloud",
537
- "file": "registry/logo-cloud.muten",
538
- "description": "BLOCK: a 'trusted by' strip of logos, muted + grayscale until hover. Parts: LogoCloud, LogoCloudItem.",
539
- "deps": []
940
+ "name": "tabs-behavior",
941
+ "deps": [],
942
+ "part": "TabsBehavior",
943
+ "file": "registry/tabs-behavior.muten",
944
+ "component": "TabsBehavior",
945
+ "description": "The sliding indicator + keys of Tabs/SegmentedControl (Custom)."
540
946
  },
541
947
  {
542
- "name": "count-up",
543
- "part": "CountUp",
544
- "file": "registry/count-up.muten",
545
- "component": "CountUp",
546
- "description": "Animate a formatted number (2.4M / 94% / 40ms / 99.99%) from 0 when it scrolls into view; lands on the exact target. Custom. Styled form (takes the class): `Custom CountUp inputs(to: \"2.4M\") class(\"text-4xl font-bold\")`. For stat bands + hero metrics.",
547
- "deps": []
948
+ "name": "tabs",
949
+ "deps": [
950
+ "tabs-behavior"
951
+ ],
952
+ "part": "Tabs",
953
+ "file": "registry/tabs.muten",
954
+ "description": "Tabs(label, variant) + TabsTrigger(value, current, label, onSelect, count) + TabsContent: sliding indicator, arrow keys; variant \"\" (segmented) | line."
548
955
  },
549
956
  {
550
- "name": "navpill",
551
- "part": "NavPill",
552
- "file": "registry/navpill.muten",
553
- "description": "BLOCK: the floating glass navbar (sticky wrapper + glass pill + scroll animation baked in). Drop logo/links/CTA inside.",
554
- "deps": []
957
+ "name": "tag-input",
958
+ "deps": [],
959
+ "part": "TagInput",
960
+ "file": "registry/tag-input.muten",
961
+ "component": "TagInput",
962
+ "description": "TagInput(value, label, suggestions, max, hint, onChange): chips in/out, height eases, cap with count."
555
963
  },
556
964
  {
557
- "name": "stat-band",
558
- "part": "StatBand",
559
- "file": "registry/stat-band.muten",
560
- "description": "BLOCK: a divided row of KPI stats. Parts: StatBand, Stat(label) - value goes in the slot (Span or Custom CountUp).",
561
- "deps": []
965
+ "name": "text",
966
+ "deps": [],
967
+ "part": "Txt",
968
+ "file": "registry/text.muten",
969
+ "description": "Txt(value, variant): the one text atom. variant: body | title | heading | strong | label | muted | caption."
562
970
  },
563
971
  {
564
- "name": "feature-rows",
565
- "part": "FeatureRows",
566
- "file": "registry/feature-rows.muten",
567
- "description": "BLOCK: numbered feature/schedule rows with side gutters (12-col grid inside). Parts: FeatureRows, FeatureRow.",
568
- "deps": []
972
+ "name": "time-field",
973
+ "deps": [],
974
+ "part": "TimeField",
975
+ "file": "registry/time-field.muten",
976
+ "component": "TimeField",
977
+ "description": "TimeField(label, value, from, to, step, onChange): opens the time wheels."
569
978
  },
570
979
  {
571
- "name": "bento",
572
- "part": "BentoGallery",
573
- "file": "registry/bento.muten",
574
- "description": "BLOCK: fixed-row-height tiling gallery; cells pick their col-span. Parts: BentoGallery, BentoCell.",
575
- "deps": []
980
+ "name": "timeline",
981
+ "deps": [],
982
+ "part": "Timeline",
983
+ "file": "registry/timeline.muten",
984
+ "description": "Vertical event timeline: a dot on a connector line + title/time/description per item (parts: Timeline, TimelineItem)."
576
985
  },
577
986
  {
578
- "name": "button-group",
579
- "part": "ButtonGroup",
580
- "file": "registry/button-group.muten",
581
- "description": "A segmented row of buttons that share borders. Put btn-outline buttons inside.",
582
- "deps": []
987
+ "name": "toaster",
988
+ "deps": [],
989
+ "part": "Toaster",
990
+ "file": "registry/toaster.muten",
991
+ "component": "Toaster",
992
+ "description": "Fixed toast notifications (Custom). Page bumps a trigger counter to fire one."
583
993
  },
584
994
  {
585
- "name": "input-group",
586
- "part": "InputGroup",
587
- "file": "registry/input-group.muten",
588
- "description": "An input with a leading icon/addon in one bordered field.",
589
- "deps": []
995
+ "name": "toggle-group",
996
+ "deps": [],
997
+ "part": "ToggleGroup",
998
+ "file": "registry/toggle-group.muten",
999
+ "description": "Single-select toolbar with ToggleGroupItem; page owns a text state."
590
1000
  },
591
1001
  {
592
- "name": "skeleton",
593
- "part": "Skeleton",
594
- "file": "registry/skeleton.muten",
595
- "description": "A loading placeholder (pulse). Add size via class: Skeleton class(\"h-4 w-32\").",
596
- "deps": []
1002
+ "name": "toggle",
1003
+ "deps": [],
1004
+ "part": "Toggle",
1005
+ "file": "registry/toggle.muten",
1006
+ "description": "A two-state button; the page owns the bool + the toggle action."
597
1007
  },
598
1008
  {
599
- "name": "kbd",
600
- "part": "Kbd",
601
- "file": "registry/kbd.muten",
602
- "description": "A keyboard key hint. Kbd { Span \"Ctrl\" }.",
603
- "deps": []
1009
+ "name": "toolbar",
1010
+ "deps": [],
1011
+ "part": "Toolbar",
1012
+ "file": "registry/toolbar.muten",
1013
+ "description": "A grouped button bar with ToolbarGroup / ToolbarSeparator."
604
1014
  },
605
1015
  {
606
- "name": "button",
607
- "part": "Btn",
608
- "file": "registry/button.muten",
609
- "description": "Plug-and-play button (part Btn - Button is a primitive). `Btn(variant: \"default\", onClick: save) { Span \"Save\" }`. variant: default|secondary|outline|ghost|destructive|link.",
610
- "deps": []
1016
+ "name": "tooltip",
1017
+ "deps": [],
1018
+ "part": "Tooltip",
1019
+ "file": "registry/tooltip.muten",
1020
+ "description": "A hover tooltip (pure CSS, no state). The slot is the trigger."
611
1021
  },
612
1022
  {
613
- "name": "input",
614
- "part": "Input",
615
- "file": "registry/input.muten",
616
- "description": "Plug-and-play text input (part Input wraps SearchField). `Input(value: q, placeholder: \"...\")` - value is two-way bound. For typed/validated fields use a Form.",
617
- "deps": []
1023
+ "name": "tree-view",
1024
+ "deps": [],
1025
+ "part": "TreeView",
1026
+ "file": "registry/tree-view.muten",
1027
+ "component": "TreeView",
1028
+ "description": "A nested folder/file tree (Custom): expandable, selectable, icons + indent."
618
1029
  },
619
1030
  {
620
- "name": "link-btn",
621
- "part": "LinkBtn",
622
- "file": "registry/link-btn.muten",
623
- "description": "A navigation link styled as a button. `LinkBtn(to: \"/signup\", variant: \"default\") { Span \"Get started\" }`.",
624
- "deps": []
1031
+ "name": "vector-field",
1032
+ "deps": [
1033
+ "number-field"
1034
+ ],
1035
+ "part": "VectorField",
1036
+ "file": "registry/vector-field.muten",
1037
+ "description": "Paired NumberFields (X/Y) for position or size."
1038
+ },
1039
+ {
1040
+ "name": "virtual-list",
1041
+ "deps": [],
1042
+ "part": "VirtualList",
1043
+ "file": "registry/virtual-list.muten",
1044
+ "component": "VirtualList",
1045
+ "description": "VirtualList(rows, total, rowHeight, label, jump): only visible rows in the DOM."
1046
+ },
1047
+ {
1048
+ "name": "weekly-hours",
1049
+ "deps": [
1050
+ "kit-widget"
1051
+ ],
1052
+ "part": "WeeklyHours",
1053
+ "file": "registry/weekly-hours.muten",
1054
+ "description": "WeeklyHours(days, onChange): a switch per day, ranges with the wheel time picker (kit core)."
1055
+ },
1056
+ {
1057
+ "name": "wordline",
1058
+ "deps": [],
1059
+ "part": "WordLine",
1060
+ "file": "registry/wordline.muten",
1061
+ "description": "WordLine - a line of words set as big type: who a product is for, what a shop does. The words sit in a soft grey,"
1062
+ },
1063
+ {
1064
+ "name": "zoom-control",
1065
+ "deps": [],
1066
+ "part": "ZoomControl",
1067
+ "file": "registry/zoom-control.muten",
1068
+ "description": "A - 100% + zoom widget; page owns the zoom number."
625
1069
  }
626
1070
  ],
627
1071
  "classComponents": {