@muten/shadcn 0.0.7 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/AGENTS.md +47 -0
  2. package/README.md +47 -0
  3. package/kit.css +2767 -0
  4. package/motion.css +31 -1
  5. package/nova.css +1387 -0
  6. package/package.json +6 -2
  7. package/registry/accordion.muten +11 -10
  8. package/registry/agenda.js +35 -0
  9. package/registry/agenda.muten +10 -0
  10. package/registry/alert-dialog.muten +9 -12
  11. package/registry/alert.muten +8 -8
  12. package/registry/app-shell.js +9 -0
  13. package/registry/app-shell.muten +12 -0
  14. package/registry/attachment.muten +13 -9
  15. package/registry/avatar.muten +24 -5
  16. package/registry/badge.muten +23 -8
  17. package/registry/band.muten +16 -0
  18. package/registry/bar-chart.muten +7 -0
  19. package/registry/bell.muten +3 -0
  20. package/registry/bento.muten +6 -9
  21. package/registry/booking.js +21 -0
  22. package/registry/booking.muten +13 -0
  23. package/registry/breadcrumb.muten +9 -7
  24. package/registry/button-group.muten +13 -4
  25. package/registry/button.muten +21 -8
  26. package/registry/calendar.js +28 -93
  27. package/registry/calendar.muten +9 -8
  28. package/registry/canvas-viewport.js +12 -5
  29. package/registry/canvas-viewport.muten +9 -9
  30. package/registry/card-field.muten +4 -0
  31. package/registry/card.muten +12 -8
  32. package/registry/carousel.js +5 -36
  33. package/registry/carousel.muten +12 -5
  34. package/registry/chatbot.muten +9 -0
  35. package/registry/checklist.muten +6 -0
  36. package/registry/choice-list.muten +16 -0
  37. package/registry/code.js +14 -12
  38. package/registry/code.muten +6 -7
  39. package/registry/collapsible.muten +14 -10
  40. package/registry/color-picker.js +460 -41
  41. package/registry/color-picker.muten +7 -6
  42. package/registry/combobox.js +5 -0
  43. package/registry/combobox.muten +6 -23
  44. package/registry/command-palette.muten +8 -12
  45. package/registry/command.js +32 -0
  46. package/registry/command.muten +32 -11
  47. package/registry/context-menu.muten +9 -8
  48. package/registry/count-up.muten +5 -10
  49. package/registry/date-field.js +5 -0
  50. package/registry/date-field.muten +7 -0
  51. package/registry/device-frame.muten +8 -0
  52. package/registry/dialog.muten +6 -12
  53. package/registry/dirty-bar.js +19 -0
  54. package/registry/dirty-bar.muten +13 -0
  55. package/registry/drawer.muten +6 -11
  56. package/registry/dropdown-menu.muten +37 -13
  57. package/registry/empty.muten +11 -7
  58. package/registry/feature-grid.muten +10 -12
  59. package/registry/feature-rows.muten +12 -8
  60. package/registry/field-behavior.js +33 -0
  61. package/registry/field-behavior.muten +9 -0
  62. package/registry/field.muten +26 -7
  63. package/registry/file-input.js +36 -21
  64. package/registry/file-input.muten +8 -7
  65. package/registry/fixed-card.muten +25 -0
  66. package/registry/folder-picker.js +13 -15
  67. package/registry/folder-picker.muten +5 -8
  68. package/registry/gradient-blinds.muten +6 -13
  69. package/registry/hover-card.muten +7 -9
  70. package/registry/image-upload.js +5 -0
  71. package/registry/image-upload.muten +8 -0
  72. package/registry/indicator.muten +5 -0
  73. package/registry/input-group.muten +27 -4
  74. package/registry/input-otp.js +8 -35
  75. package/registry/input-otp.muten +6 -6
  76. package/registry/input.muten +8 -7
  77. package/registry/inspector.muten +13 -15
  78. package/registry/island.js +7 -0
  79. package/registry/island.muten +5 -0
  80. package/registry/item.muten +20 -7
  81. package/registry/kbd.muten +3 -3
  82. package/registry/kit/board.js +300 -0
  83. package/registry/kit/collections.js +148 -0
  84. package/registry/kit/core.js +989 -0
  85. package/registry/kit/dates.js +106 -0
  86. package/registry/kit/menus.js +90 -0
  87. package/registry/kit/overlays.js +114 -0
  88. package/registry/kit/paint.js +211 -0
  89. package/registry/kit/qrcode.js +2291 -0
  90. package/registry/kit/structure.js +395 -0
  91. package/registry/kit/table.js +198 -0
  92. package/registry/kit/values.js +179 -0
  93. package/registry/kit-layer.js +2 -0
  94. package/registry/kit-layer.muten +5 -0
  95. package/registry/kit-skeleton.js +24 -0
  96. package/registry/kit-skeleton.muten +16 -0
  97. package/registry/kit-widget.js +79 -0
  98. package/registry/kit-widget.muten +4 -0
  99. package/registry/link-btn.muten +9 -7
  100. package/registry/live-stack.js +29 -0
  101. package/registry/live-stack.muten +7 -0
  102. package/registry/logo-cloud.muten +6 -11
  103. package/registry/member-list.muten +6 -0
  104. package/registry/menubar.muten +10 -14
  105. package/registry/message-scroller.js +12 -0
  106. package/registry/message-scroller.muten +8 -4
  107. package/registry/message.muten +27 -10
  108. package/registry/messaging.muten +11 -0
  109. package/registry/modal-behavior.js +56 -0
  110. package/registry/modal-behavior.muten +4 -0
  111. package/registry/modal.muten +29 -0
  112. package/registry/money-field.js +5 -0
  113. package/registry/money-field.muten +7 -0
  114. package/registry/nav-button.muten +14 -0
  115. package/registry/navigation-menu.muten +16 -14
  116. package/registry/navpill.muten +15 -9
  117. package/registry/new-appointment.js +8 -0
  118. package/registry/new-appointment.muten +10 -0
  119. package/registry/number-field.js +34 -24
  120. package/registry/number-field.muten +8 -6
  121. package/registry/order-board.js +6 -0
  122. package/registry/order-board.muten +21 -0
  123. package/registry/overlay-behavior.js +13 -0
  124. package/registry/overlay-behavior.muten +4 -0
  125. package/registry/pagination-nav.js +6 -0
  126. package/registry/pagination-nav.muten +8 -0
  127. package/registry/pagination.muten +12 -9
  128. package/registry/password-field.muten +3 -0
  129. package/registry/permission-matrix.muten +6 -0
  130. package/registry/phone-field.js +5 -0
  131. package/registry/phone-field.muten +7 -0
  132. package/registry/phone-shell.js +7 -0
  133. package/registry/phone-shell.muten +9 -0
  134. package/registry/pill.muten +6 -5
  135. package/registry/plans.muten +4 -0
  136. package/registry/popover.muten +16 -9
  137. package/registry/pricing.muten +21 -21
  138. package/registry/progress.muten +5 -5
  139. package/registry/queue.muten +3 -0
  140. package/registry/radio-group.muten +16 -8
  141. package/registry/range-slider.js +9 -24
  142. package/registry/range-slider.muten +4 -5
  143. package/registry/resizable.js +34 -27
  144. package/registry/resizable.muten +16 -5
  145. package/registry/roving-behavior.js +16 -0
  146. package/registry/roving-behavior.muten +3 -0
  147. package/registry/row-menu.js +5 -0
  148. package/registry/row-menu.muten +5 -0
  149. package/registry/save-button.muten +11 -0
  150. package/registry/scale-slider.js +7 -0
  151. package/registry/scale-slider.muten +9 -0
  152. package/registry/scroll-area.muten +8 -4
  153. package/registry/segmented-control.muten +8 -8
  154. package/registry/separator.muten +3 -3
  155. package/registry/share-button.js +7 -0
  156. package/registry/share-button.muten +10 -0
  157. package/registry/sheet.muten +6 -10
  158. package/registry/sidebar.muten +23 -15
  159. package/registry/skeleton.muten +6 -4
  160. package/registry/slider.js +73 -27
  161. package/registry/slider.muten +6 -6
  162. package/registry/sortable-behavior.js +43 -0
  163. package/registry/sortable-behavior.muten +2 -0
  164. package/registry/sortable-list.js +10 -26
  165. package/registry/sortable-list.muten +6 -7
  166. package/registry/sortable.muten +15 -0
  167. package/registry/spark.js +14 -0
  168. package/registry/spark.muten +3 -0
  169. package/registry/spinner.muten +4 -3
  170. package/registry/split-button.muten +12 -10
  171. package/registry/stamp-card.muten +7 -0
  172. package/registry/stat-band.muten +6 -9
  173. package/registry/stat.muten +23 -0
  174. package/registry/status-bar.muten +7 -6
  175. package/registry/stepper.muten +17 -14
  176. package/registry/store-qr.js +5 -0
  177. package/registry/store-qr.muten +5 -0
  178. package/registry/swatch.muten +8 -8
  179. package/registry/switch.muten +14 -6
  180. package/registry/table-view.muten +10 -0
  181. package/registry/tabs-behavior.js +27 -0
  182. package/registry/tabs-behavior.muten +3 -0
  183. package/registry/tabs.muten +19 -10
  184. package/registry/tag-input.js +4 -27
  185. package/registry/tag-input.muten +6 -6
  186. package/registry/text.muten +7 -0
  187. package/registry/time-field.js +5 -0
  188. package/registry/time-field.muten +6 -0
  189. package/registry/timeline.muten +14 -14
  190. package/registry/toaster.js +34 -22
  191. package/registry/toaster.muten +10 -8
  192. package/registry/toggle-group.muten +11 -6
  193. package/registry/toggle.muten +8 -5
  194. package/registry/toolbar.muten +11 -6
  195. package/registry/tooltip.muten +6 -9
  196. package/registry/tree-view.js +27 -7
  197. package/registry/tree-view.muten +8 -13
  198. package/registry/vector-field.muten +9 -8
  199. package/registry/virtual-list.js +5 -0
  200. package/registry/virtual-list.muten +6 -0
  201. package/registry/weekly-hours.muten +4 -0
  202. package/registry/wordline.muten +6 -0
  203. package/registry/zoom-control.muten +9 -9
  204. package/registry.json +872 -406
  205. package/registry/context-menu.js +0 -34
package/registry.json CHANGED
@@ -4,602 +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": []
109
+ "description": "A breadcrumb trail with BreadcrumbLink / BreadcrumbSeparator / BreadcrumbPage."
75
110
  },
76
111
  {
77
- "name": "pagination",
78
- "part": "Pagination",
79
- "file": "registry/pagination.muten",
80
- "description": "Page navigation with PaginationLink / Previous / Next / Ellipsis.",
81
- "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."
82
117
  },
83
118
  {
84
- "name": "field",
85
- "part": "Field",
86
- "file": "registry/field.muten",
87
- "description": "A labelled form control: FieldLabel / FieldDescription / FieldError.",
88
- "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."
89
124
  },
90
125
  {
91
- "name": "item",
92
- "part": "Item",
93
- "file": "registry/item.muten",
94
- "description": "A bordered row: ItemContent / ItemTitle / ItemDescription.",
95
- "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)."
96
132
  },
97
133
  {
98
- "name": "toggle",
99
- "part": "Toggle",
100
- "file": "registry/toggle.muten",
101
- "description": "A two-state button; the page owns the bool + the toggle action.",
102
- "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."
103
140
  },
104
141
  {
105
- "name": "toggle-group",
106
- "part": "ToggleGroup",
107
- "file": "registry/toggle-group.muten",
108
- "description": "Single-select toolbar with ToggleGroupItem; page owns a text state.",
109
- "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."
110
149
  },
111
150
  {
112
- "name": "radio-group",
113
- "part": "RadioGroup",
114
- "file": "registry/radio-group.muten",
115
- "description": "Single choice with RadioGroupItem; page owns a text state.",
116
- "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."
117
156
  },
118
157
  {
119
- "name": "collapsible",
120
- "part": "Collapsible",
121
- "file": "registry/collapsible.muten",
122
- "description": "A trigger + content shown when open; page owns the bool.",
123
- "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."
124
164
  },
125
165
  {
126
- "name": "accordion",
127
- "part": "Accordion",
128
- "file": "registry/accordion.muten",
129
- "description": "Stacked expandable sections with AccordionItem; page owns a bool per item.",
130
- "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"
131
173
  },
132
174
  {
133
- "name": "tabs",
134
- "part": "TabsList",
135
- "file": "registry/tabs.muten",
136
- "description": "Tab bar (TabsList/TabsTrigger) + TabsContent panels; page owns the active-tab text.",
137
- "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)."
138
182
  },
139
183
  {
140
- "name": "dialog",
141
- "part": "Dialog",
142
- "file": "registry/dialog.muten",
143
- "description": "A modal with DialogTitle/Description/Footer; page owns the open bool. Backdrop click closes.",
144
- "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)."
145
191
  },
146
192
  {
147
- "name": "tooltip",
148
- "part": "Tooltip",
149
- "file": "registry/tooltip.muten",
150
- "description": "A hover tooltip (pure CSS, no state). The slot is the trigger.",
151
- "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)."
152
199
  },
153
200
  {
154
- "name": "dropdown-menu",
155
- "part": "DropdownMenu",
156
- "file": "registry/dropdown-menu.muten",
157
- "description": "A menu below a trigger with DropdownItem/Label/Separator; page owns the open bool.",
158
- "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."
159
206
  },
160
207
  {
161
- "name": "popover",
162
- "part": "Popover",
163
- "file": "registry/popover.muten",
164
- "description": "A floating panel below a trigger; page owns the open bool.",
165
- "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)."
166
214
  },
167
215
  {
168
- "name": "alert-dialog",
169
- "part": "AlertDialog",
170
- "file": "registry/alert-dialog.muten",
171
- "description": "A modal requiring an explicit choice (no backdrop dismiss); page owns the open bool.",
172
- "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."
173
222
  },
174
223
  {
175
- "name": "sheet",
176
- "part": "Sheet",
177
- "file": "registry/sheet.muten",
178
- "description": "A panel that slides in from the right; page owns the open bool.",
179
- "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."
180
229
  },
181
230
  {
182
- "name": "drawer",
183
- "part": "Drawer",
184
- "file": "registry/drawer.muten",
185
- "description": "A panel that slides up from the bottom; page owns the open bool.",
186
- "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)."
187
237
  },
188
238
  {
189
- "name": "hover-card",
190
- "part": "HoverCard",
191
- "file": "registry/hover-card.muten",
192
- "description": "Richer content shown on hover (pure CSS, no state).",
193
- "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)."
194
244
  },
195
245
  {
196
- "name": "scroll-area",
197
- "part": "ScrollArea",
198
- "file": "registry/scroll-area.muten",
199
- "description": "A scrollable region with styled scrollbars.",
200
- "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."
201
252
  },
202
253
  {
203
- "name": "message",
204
- "part": "Message",
205
- "file": "registry/message.muten",
206
- "description": "Chat Message + Bubble + Marker (variant: sent | received).",
207
- "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."
208
260
  },
209
261
  {
210
- "name": "message-scroller",
211
- "part": "MessageScroller",
212
- "file": "registry/message-scroller.muten",
213
- "description": "A scrollable column of chat messages.",
214
- "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"
215
267
  },
216
268
  {
217
- "name": "attachment",
218
- "part": "Attachment",
219
- "file": "registry/attachment.muten",
220
- "description": "A file attachment chip (icon + name + size).",
221
- "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."
222
274
  },
223
275
  {
224
- "name": "menubar",
225
- "part": "Menubar",
226
- "file": "registry/menubar.muten",
227
- "description": "A bar of menus (File/Edit/View); page owns which is open via a text state.",
228
- "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,"
229
282
  },
230
283
  {
231
- "name": "navigation-menu",
232
- "part": "NavigationMenu",
233
- "file": "registry/navigation-menu.muten",
234
- "description": "A nav bar with hover-revealed panels (pure CSS, no state).",
235
- "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."
236
289
  },
237
290
  {
238
- "name": "combobox",
239
- "part": "Combobox",
240
- "file": "registry/combobox.muten",
241
- "description": "A Select with a search box; page filters items with `each … where`.",
242
- "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."
243
296
  },
244
297
  {
245
- "name": "command",
246
- "part": "Command",
247
- "file": "registry/command.muten",
248
- "description": "A command palette (search + grouped CommandItem list).",
249
- "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."
250
303
  },
251
304
  {
252
- "name": "slider",
253
- "part": "Slider",
254
- "file": "registry/slider.muten",
255
- "component": "Slider",
256
- "description": "A draggable range slider (Custom). Page owns the value number.",
257
- "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."
258
310
  },
259
311
  {
260
- "name": "input-otp",
261
- "part": "InputOtp",
262
- "file": "registry/input-otp.muten",
263
- "component": "InputOtp",
264
- "description": "N single-character boxes synced to one value (Custom). Page owns the value text.",
265
- "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."
266
317
  },
267
318
  {
268
- "name": "calendar",
269
- "part": "Calendar",
270
- "file": "registry/calendar.muten",
271
- "component": "Calendar",
272
- "description": "A month-grid date picker (Custom). Page owns the selected ISO date text.",
273
- "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."
274
325
  },
275
326
  {
276
- "name": "toaster",
277
- "part": "Toaster",
278
- "file": "registry/toaster.muten",
279
- "component": "Toaster",
280
- "description": "Fixed toast notifications (Custom). Page bumps a trigger counter to fire one.",
281
- "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."
282
332
  },
283
333
  {
284
- "name": "carousel",
285
- "part": "Carousel",
286
- "file": "registry/carousel.muten",
287
- "component": "Carousel",
288
- "description": "A slide carousel over a list (Custom). Page owns the slides list.",
289
- "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."
340
+ },
341
+ {
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»)."
347
+ },
348
+ {
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."
290
355
  },
291
356
  {
292
357
  "name": "gradient-blinds",
358
+ "deps": [
359
+ "ogl"
360
+ ],
293
361
  "part": "GradientBlinds",
294
362
  "file": "registry/gradient-blinds.muten",
295
363
  "component": "GradientBlinds",
296
- "description": "Animated WebGL gradient + diagonal-blinds hero background that follows the cursor and fades into the page (needs ogl).",
297
- "deps": [
298
- "ogl"
299
- ]
364
+ "description": "Animated WebGL gradient + diagonal-blinds hero background that follows the cursor and fades into the page (needs ogl)."
300
365
  },
301
366
  {
302
- "name": "resizable",
303
- "part": "Resizable",
304
- "file": "registry/resizable.muten",
305
- "component": "Resizable",
306
- "description": "Two panels with a draggable splitter (Custom).",
307
- "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)."
308
373
  },
309
374
  {
310
- "name": "context-menu",
311
- "part": "ContextMenu",
312
- "file": "registry/context-menu.muten",
313
- "component": "ContextMenu",
314
- "description": "Right-click an area to open a menu of items (Custom).",
315
- "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)."
316
380
  },
317
381
  {
318
- "name": "number-field",
319
- "part": "NumberField",
320
- "file": "registry/number-field.muten",
321
- "component": "NumberField",
322
- "description": "A numeric input with -/+ steppers, min/max/step (Custom).",
323
- "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."
324
388
  },
325
389
  {
326
- "name": "segmented-control",
327
- "part": "SegmentedControl",
328
- "file": "registry/segmented-control.muten",
329
- "description": "A single-select toolbar (SegmentedItem); page owns a text state.",
330
- "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."
331
395
  },
332
396
  {
333
- "name": "file-input",
334
- "part": "FileInput",
335
- "file": "registry/file-input.muten",
336
- "component": "FileInput",
337
- "description": "A click/drag-drop file dropzone (Custom); emits file names.",
338
- "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."
339
404
  },
340
405
  {
341
- "name": "color-picker",
342
- "part": "ColorPicker",
343
- "file": "registry/color-picker.muten",
344
- "component": "ColorPicker",
345
- "description": "A swatch + saturation/value + hue popover (Custom); page owns the hex.",
346
- "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."
347
412
  },
348
413
  {
349
- "name": "vector-field",
350
- "part": "VectorField",
351
- "file": "registry/vector-field.muten",
352
- "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",
353
497
  "deps": [
354
- "number-field"
355
- ]
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."
356
503
  },
357
504
  {
358
- "name": "tree-view",
359
- "part": "TreeView",
360
- "file": "registry/tree-view.muten",
361
- "component": "TreeView",
362
- "description": "A nested folder/file tree (Custom): expandable, selectable, icons + indent.",
363
- "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."
364
510
  },
365
511
  {
366
- "name": "toolbar",
367
- "part": "Toolbar",
368
- "file": "registry/toolbar.muten",
369
- "description": "A grouped button bar with ToolbarGroup / ToolbarSeparator.",
370
- "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."
371
518
  },
372
519
  {
373
- "name": "canvas-viewport",
374
- "part": "CanvasViewport",
375
- "file": "registry/canvas-viewport.muten",
376
- "component": "CanvasHost",
377
- "description": "A <canvas> with pan/zoom (Custom) + a muten toolbar slot floating on top.",
378
- "deps": []
520
+ "name": "message",
521
+ "deps": [],
522
+ "part": "Message",
523
+ "file": "registry/message.muten",
524
+ "description": "Chat Message + Bubble + Marker (variant: sent | received)."
379
525
  },
380
526
  {
381
- "name": "status-bar",
382
- "part": "StatusBar",
383
- "file": "registry/status-bar.muten",
384
- "description": "A thin bottom bar with StatusItem / StatusSpacer.",
385
- "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"
386
534
  },
387
535
  {
388
- "name": "zoom-control",
389
- "part": "ZoomControl",
390
- "file": "registry/zoom-control.muten",
391
- "description": "A - 100% + zoom widget; page owns the zoom number.",
392
- "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."
393
542
  },
394
543
  {
395
- "name": "split-button",
396
- "part": "SplitButton",
397
- "file": "registry/split-button.muten",
398
- "description": "A main action + a caret dropdown; page owns the open bool.",
399
- "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."
400
551
  },
401
552
  {
402
- "name": "tag-input",
403
- "part": "TagInput",
404
- "file": "registry/tag-input.muten",
405
- "component": "TagInput",
406
- "description": "Chips you add by typing + Enter (Custom); page owns a comma-joined text.",
407
- "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."
408
559
  },
409
560
  {
410
- "name": "swatch",
411
- "part": "SwatchPalette",
412
- "file": "registry/swatch.muten",
413
- "description": "A grid of selectable color swatches (Swatch); page owns the selected hex + colors.",
414
- "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."
415
714
  },
416
715
  {
417
716
  "name": "range-slider",
717
+ "deps": [],
418
718
  "part": "RangeSlider",
419
719
  "file": "registry/range-slider.muten",
420
720
  "component": "RangeSlider",
421
- "description": "A two-thumb range slider (Custom); page owns the low + high numbers.",
422
- "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."
423
799
  },
424
800
  {
425
801
  "name": "sidebar",
802
+ "deps": [],
426
803
  "part": "AppSidebar",
427
804
  "file": "registry/sidebar.muten",
428
- "description": "AppSidebar - a collapsible nav panel (SidebarHeader / SidebarGroup / SidebarItem). Named AppSidebar so it never shadows muten's core Sidebar <aside> primitive.",
429
- "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)."
430
829
  },
431
830
  {
432
831
  "name": "sortable-list",
832
+ "deps": [],
433
833
  "part": "SortableList",
434
834
  "file": "registry/sortable-list.muten",
435
835
  "component": "SortableList",
436
- "description": "Drag rows to reorder (Custom); page owns a comma-joined order.",
437
- "deps": []
836
+ "description": "Drag rows to reorder (Custom); page owns a comma-joined order."
438
837
  },
439
838
  {
440
- "name": "inspector",
441
- "part": "Inspector",
442
- "file": "registry/inspector.muten",
443
- "description": "Property grid: InspectorSection (collapsible) / InspectorRow (label : value slot).",
444
- "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."
445
846
  },
446
847
  {
447
- "name": "folder-picker",
448
- "part": "FolderPicker",
449
- "file": "registry/folder-picker.muten",
450
- "component": "FolderPicker",
451
- "description": "Connect a local folder via showDirectoryPicker (Custom); emits the name.",
452
- "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)."
453
854
  },
454
855
  {
455
- "name": "command-palette",
456
- "part": "CommandPalette",
457
- "file": "registry/command-palette.muten",
458
- "description": "A top-anchored modal holding a Command; page owns the open bool.",
459
- "deps": []
856
+ "name": "spinner",
857
+ "deps": [],
858
+ "part": "Spinner",
859
+ "file": "registry/spinner.muten",
860
+ "description": "A loading indicator (animate-spin loader)."
460
861
  },
461
862
  {
462
- "name": "hotkey",
463
- "part": "Hotkey",
464
- "file": "registry/hotkey.muten",
465
- "component": "Hotkey",
466
- "description": "A global keyboard shortcut (Cmd/Ctrl+key), invisible (Custom).",
467
- "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."
468
868
  },
469
869
  {
470
- "name": "code",
471
- "part": "Code",
472
- "file": "registry/code.muten",
473
- "component": "Code",
474
- "description": "Syntax-highlighted code block that understands muten (shared highlight.js, same grammar as the VS Code extension).",
475
- "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."
476
900
  },
477
901
  {
478
902
  "name": "stepper",
903
+ "deps": [],
479
904
  "part": "Stepper",
480
905
  "file": "registry/stepper.muten",
481
- "description": "Horizontal or vertical step progress indicator; done steps show a check, the current step is ringed (parts: Stepper, StepperVertical, Step).",
482
- "deps": []
906
+ "description": "Horizontal or vertical step progress indicator; done steps show a check, the current step is ringed (parts: Stepper, StepperVertical, Step)."
483
907
  },
484
908
  {
485
- "name": "timeline",
486
- "part": "Timeline",
487
- "file": "registry/timeline.muten",
488
- "description": "Vertical event timeline: a dot on a connector line + title/time/description per item (parts: Timeline, TimelineItem).",
489
- "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»."
490
915
  },
491
916
  {
492
- "name": "pill",
493
- "part": "Pill",
494
- "file": "registry/pill.muten",
495
- "description": "A hero eyebrow chip (rounded-full, bigger than Badge); slot-based for an icon + text.",
496
- "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."
497
922
  },
498
923
  {
499
- "name": "feature-grid",
500
- "part": "FeatureGrid",
501
- "file": "registry/feature-grid.muten",
502
- "description": "BLOCK: responsive grid of feature cards (icon + title + copy). Parts: FeatureGrid, FeatureCard.",
503
- "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."
504
929
  },
505
930
  {
506
- "name": "pricing",
507
- "part": "Pricing",
508
- "file": "registry/pricing.muten",
509
- "description": "BLOCK: a row of pricing tiers (name/price/features/CTA), featured highlight. Parts: Pricing, PricingTier, PricingFeature.",
510
- "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)."
511
938
  },
512
939
  {
513
- "name": "logo-cloud",
514
- "part": "LogoCloud",
515
- "file": "registry/logo-cloud.muten",
516
- "description": "BLOCK: a 'trusted by' strip of logos, muted + grayscale until hover. Parts: LogoCloud, LogoCloudItem.",
517
- "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)."
518
946
  },
519
947
  {
520
- "name": "count-up",
521
- "part": "CountUp",
522
- "file": "registry/count-up.muten",
523
- "component": "CountUp",
524
- "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.",
525
- "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."
526
955
  },
527
956
  {
528
- "name": "navpill",
529
- "part": "NavPill",
530
- "file": "registry/navpill.muten",
531
- "description": "BLOCK: the floating glass navbar (sticky wrapper + glass pill + scroll animation baked in). Drop logo/links/CTA inside.",
532
- "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."
533
963
  },
534
964
  {
535
- "name": "stat-band",
536
- "part": "StatBand",
537
- "file": "registry/stat-band.muten",
538
- "description": "BLOCK: a divided row of KPI stats. Parts: StatBand, Stat(label) - value goes in the slot (Span or Custom CountUp).",
539
- "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."
540
970
  },
541
971
  {
542
- "name": "feature-rows",
543
- "part": "FeatureRows",
544
- "file": "registry/feature-rows.muten",
545
- "description": "BLOCK: numbered feature/schedule rows with side gutters (12-col grid inside). Parts: FeatureRows, FeatureRow.",
546
- "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."
547
978
  },
548
979
  {
549
- "name": "bento",
550
- "part": "BentoGallery",
551
- "file": "registry/bento.muten",
552
- "description": "BLOCK: fixed-row-height tiling gallery; cells pick their col-span. Parts: BentoGallery, BentoCell.",
553
- "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)."
554
985
  },
555
986
  {
556
- "name": "button-group",
557
- "part": "ButtonGroup",
558
- "file": "registry/button-group.muten",
559
- "description": "A segmented row of buttons that share borders. Put btn-outline buttons inside.",
560
- "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."
561
993
  },
562
994
  {
563
- "name": "input-group",
564
- "part": "InputGroup",
565
- "file": "registry/input-group.muten",
566
- "description": "An input with a leading icon/addon in one bordered field.",
567
- "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."
568
1000
  },
569
1001
  {
570
- "name": "skeleton",
571
- "part": "Skeleton",
572
- "file": "registry/skeleton.muten",
573
- "description": "A loading placeholder (pulse). Add size via class: Skeleton class(\"h-4 w-32\").",
574
- "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."
575
1007
  },
576
1008
  {
577
- "name": "kbd",
578
- "part": "Kbd",
579
- "file": "registry/kbd.muten",
580
- "description": "A keyboard key hint. Kbd { Span \"Ctrl\" }.",
581
- "deps": []
1009
+ "name": "toolbar",
1010
+ "deps": [],
1011
+ "part": "Toolbar",
1012
+ "file": "registry/toolbar.muten",
1013
+ "description": "A grouped button bar with ToolbarGroup / ToolbarSeparator."
582
1014
  },
583
1015
  {
584
- "name": "button",
585
- "part": "Btn",
586
- "file": "registry/button.muten",
587
- "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.",
588
- "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."
589
1021
  },
590
1022
  {
591
- "name": "input",
592
- "part": "Input",
593
- "file": "registry/input.muten",
594
- "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.",
595
- "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."
596
1029
  },
597
1030
  {
598
- "name": "link-btn",
599
- "part": "LinkBtn",
600
- "file": "registry/link-btn.muten",
601
- "description": "A navigation link styled as a button. `LinkBtn(to: \"/signup\", variant: \"default\") { Span \"Get started\" }`.",
602
- "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."
603
1069
  }
604
1070
  ],
605
1071
  "classComponents": {