shadcn-phlex 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 (113) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +195 -0
  3. data/app.css +20 -0
  4. data/css/shadcn-source.css +3 -0
  5. data/css/shadcn-tailwind.css +160 -0
  6. data/css/themes/mauve.css +62 -0
  7. data/css/themes/mist.css +62 -0
  8. data/css/themes/neutral.css +74 -0
  9. data/css/themes/olive.css +62 -0
  10. data/css/themes/stone.css +62 -0
  11. data/css/themes/taupe.css +62 -0
  12. data/css/themes/zinc.css +62 -0
  13. data/js/controllers/accordion_controller.js +135 -0
  14. data/js/controllers/checkbox_controller.js +52 -0
  15. data/js/controllers/collapsible_controller.js +85 -0
  16. data/js/controllers/combobox_controller.js +168 -0
  17. data/js/controllers/command_controller.js +171 -0
  18. data/js/controllers/context_menu_controller.js +132 -0
  19. data/js/controllers/dark_mode_controller.js +106 -0
  20. data/js/controllers/dialog_controller.js +205 -0
  21. data/js/controllers/drawer_controller.js +161 -0
  22. data/js/controllers/dropdown_menu_controller.js +189 -0
  23. data/js/controllers/hover_card_controller.js +85 -0
  24. data/js/controllers/index.js +89 -0
  25. data/js/controllers/menubar_controller.js +171 -0
  26. data/js/controllers/navigation_menu_controller.js +160 -0
  27. data/js/controllers/popover_controller.js +151 -0
  28. data/js/controllers/radio_group_controller.js +78 -0
  29. data/js/controllers/scroll_area_controller.js +117 -0
  30. data/js/controllers/select_controller.js +198 -0
  31. data/js/controllers/sheet_controller.js +130 -0
  32. data/js/controllers/slider_controller.js +142 -0
  33. data/js/controllers/switch_controller.js +40 -0
  34. data/js/controllers/tabs_controller.js +96 -0
  35. data/js/controllers/toast_controller.js +206 -0
  36. data/js/controllers/toggle_controller.js +30 -0
  37. data/js/controllers/toggle_group_controller.js +73 -0
  38. data/js/controllers/tooltip_controller.js +146 -0
  39. data/lib/generators/shadcn_phlex/component_generator.rb +79 -0
  40. data/lib/generators/shadcn_phlex/install_generator.rb +217 -0
  41. data/lib/shadcn/base.rb +27 -0
  42. data/lib/shadcn/engine.rb +24 -0
  43. data/lib/shadcn/kit.rb +1158 -0
  44. data/lib/shadcn/themes/accent_colors.rb +106 -0
  45. data/lib/shadcn/themes/base_colors.rb +313 -0
  46. data/lib/shadcn/ui/accordion.rb +135 -0
  47. data/lib/shadcn/ui/alert.rb +79 -0
  48. data/lib/shadcn/ui/alert_dialog.rb +220 -0
  49. data/lib/shadcn/ui/aspect_ratio.rb +35 -0
  50. data/lib/shadcn/ui/avatar.rb +134 -0
  51. data/lib/shadcn/ui/badge.rb +48 -0
  52. data/lib/shadcn/ui/breadcrumb.rb +180 -0
  53. data/lib/shadcn/ui/button.rb +63 -0
  54. data/lib/shadcn/ui/button_group.rb +58 -0
  55. data/lib/shadcn/ui/card.rb +133 -0
  56. data/lib/shadcn/ui/checkbox.rb +72 -0
  57. data/lib/shadcn/ui/collapsible.rb +76 -0
  58. data/lib/shadcn/ui/combobox.rb +229 -0
  59. data/lib/shadcn/ui/command.rb +256 -0
  60. data/lib/shadcn/ui/context_menu.rb +319 -0
  61. data/lib/shadcn/ui/dialog.rb +226 -0
  62. data/lib/shadcn/ui/direction.rb +23 -0
  63. data/lib/shadcn/ui/drawer.rb +217 -0
  64. data/lib/shadcn/ui/dropdown_menu.rb +384 -0
  65. data/lib/shadcn/ui/empty.rb +97 -0
  66. data/lib/shadcn/ui/field.rb +126 -0
  67. data/lib/shadcn/ui/hover_card.rb +75 -0
  68. data/lib/shadcn/ui/input.rb +36 -0
  69. data/lib/shadcn/ui/input_group.rb +32 -0
  70. data/lib/shadcn/ui/input_otp.rb +112 -0
  71. data/lib/shadcn/ui/item.rb +115 -0
  72. data/lib/shadcn/ui/kbd.rb +45 -0
  73. data/lib/shadcn/ui/label.rb +28 -0
  74. data/lib/shadcn/ui/menubar.rb +345 -0
  75. data/lib/shadcn/ui/native_select.rb +31 -0
  76. data/lib/shadcn/ui/navigation_menu.rb +238 -0
  77. data/lib/shadcn/ui/pagination.rb +224 -0
  78. data/lib/shadcn/ui/popover.rb +147 -0
  79. data/lib/shadcn/ui/progress.rb +40 -0
  80. data/lib/shadcn/ui/radio_group.rb +92 -0
  81. data/lib/shadcn/ui/resizable.rb +108 -0
  82. data/lib/shadcn/ui/scroll_area.rb +75 -0
  83. data/lib/shadcn/ui/select.rb +235 -0
  84. data/lib/shadcn/ui/separator.rb +36 -0
  85. data/lib/shadcn/ui/sheet.rb +231 -0
  86. data/lib/shadcn/ui/sidebar.rb +420 -0
  87. data/lib/shadcn/ui/skeleton.rb +23 -0
  88. data/lib/shadcn/ui/slider.rb +72 -0
  89. data/lib/shadcn/ui/sonner.rb +177 -0
  90. data/lib/shadcn/ui/spinner.rb +58 -0
  91. data/lib/shadcn/ui/switch.rb +75 -0
  92. data/lib/shadcn/ui/table.rb +154 -0
  93. data/lib/shadcn/ui/tabs.rb +154 -0
  94. data/lib/shadcn/ui/text_field.rb +146 -0
  95. data/lib/shadcn/ui/textarea.rb +32 -0
  96. data/lib/shadcn/ui/theme_toggle.rb +74 -0
  97. data/lib/shadcn/ui/toggle.rb +66 -0
  98. data/lib/shadcn/ui/toggle_group.rb +75 -0
  99. data/lib/shadcn/ui/tooltip.rb +78 -0
  100. data/lib/shadcn/ui/typography.rb +217 -0
  101. data/lib/shadcn/version.rb +5 -0
  102. data/lib/shadcn-phlex.rb +6 -0
  103. data/lib/shadcn.rb +80 -0
  104. data/package.json +14 -0
  105. data/skills/shadcn-phlex/SKILL.md +190 -0
  106. data/skills/shadcn-phlex/evals/evals.json +90 -0
  107. data/skills/shadcn-phlex/references/component-catalog.md +355 -0
  108. data/skills/shadcn-phlex/rules/composition.md +235 -0
  109. data/skills/shadcn-phlex/rules/forms.md +151 -0
  110. data/skills/shadcn-phlex/rules/helpers.md +54 -0
  111. data/skills/shadcn-phlex/rules/stimulus.md +61 -0
  112. data/skills/shadcn-phlex/rules/styling.md +177 -0
  113. metadata +209 -0
data/lib/shadcn/kit.rb ADDED
@@ -0,0 +1,1158 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shadcn
4
+ # Include this module in any Phlex view to get short helper methods
5
+ # for all Shadcn UI components.
6
+ #
7
+ # class MyView < Phlex::HTML
8
+ # include Shadcn::Kit
9
+ #
10
+ # def view_template
11
+ # ui_card do
12
+ # ui_card_header do
13
+ # ui_card_title { "Hello" }
14
+ # end
15
+ # ui_card_content do
16
+ # ui_button(variant: :destructive) { "Delete" }
17
+ # end
18
+ # end
19
+ # end
20
+ # end
21
+ module Kit
22
+ # ── Accordion ──────────────────────────────────────────────
23
+
24
+ def ui_accordion(**attrs, &block)
25
+ render Shadcn::UI::Accordion.new(**attrs, &block)
26
+ end
27
+
28
+ def ui_accordion_item(**attrs, &block)
29
+ render Shadcn::UI::AccordionItem.new(**attrs, &block)
30
+ end
31
+
32
+ def ui_accordion_trigger(**attrs, &block)
33
+ render Shadcn::UI::AccordionTrigger.new(**attrs, &block)
34
+ end
35
+
36
+ def ui_accordion_content(**attrs, &block)
37
+ render Shadcn::UI::AccordionContent.new(**attrs, &block)
38
+ end
39
+
40
+ # ── Alert ──────────────────────────────────────────────────
41
+
42
+ def ui_alert(**attrs, &block)
43
+ render Shadcn::UI::Alert.new(**attrs, &block)
44
+ end
45
+
46
+ def ui_alert_title(**attrs, &block)
47
+ render Shadcn::UI::AlertTitle.new(**attrs, &block)
48
+ end
49
+
50
+ def ui_alert_description(**attrs, &block)
51
+ render Shadcn::UI::AlertDescription.new(**attrs, &block)
52
+ end
53
+
54
+ # ── Alert Dialog ───────────────────────────────────────────
55
+
56
+ def ui_alert_dialog(**attrs, &block)
57
+ render Shadcn::UI::AlertDialog.new(**attrs, &block)
58
+ end
59
+
60
+ def ui_alert_dialog_trigger(**attrs, &block)
61
+ render Shadcn::UI::AlertDialogTrigger.new(**attrs, &block)
62
+ end
63
+
64
+ def ui_alert_dialog_overlay(**attrs, &block)
65
+ render Shadcn::UI::AlertDialogOverlay.new(**attrs, &block)
66
+ end
67
+
68
+ def ui_alert_dialog_content(**attrs, &block)
69
+ render Shadcn::UI::AlertDialogContent.new(**attrs, &block)
70
+ end
71
+
72
+ def ui_alert_dialog_header(**attrs, &block)
73
+ render Shadcn::UI::AlertDialogHeader.new(**attrs, &block)
74
+ end
75
+
76
+ def ui_alert_dialog_footer(**attrs, &block)
77
+ render Shadcn::UI::AlertDialogFooter.new(**attrs, &block)
78
+ end
79
+
80
+ def ui_alert_dialog_title(**attrs, &block)
81
+ render Shadcn::UI::AlertDialogTitle.new(**attrs, &block)
82
+ end
83
+
84
+ def ui_alert_dialog_description(**attrs, &block)
85
+ render Shadcn::UI::AlertDialogDescription.new(**attrs, &block)
86
+ end
87
+
88
+ def ui_alert_dialog_action(**attrs, &block)
89
+ render Shadcn::UI::AlertDialogAction.new(**attrs, &block)
90
+ end
91
+
92
+ def ui_alert_dialog_cancel(**attrs, &block)
93
+ render Shadcn::UI::AlertDialogCancel.new(**attrs, &block)
94
+ end
95
+
96
+ # ── Aspect Ratio ───────────────────────────────────────────
97
+
98
+ def ui_aspect_ratio(**attrs, &block)
99
+ render Shadcn::UI::AspectRatio.new(**attrs, &block)
100
+ end
101
+
102
+ # ── Avatar ─────────────────────────────────────────────────
103
+
104
+ def ui_avatar(**attrs, &block)
105
+ render Shadcn::UI::Avatar.new(**attrs, &block)
106
+ end
107
+
108
+ def ui_avatar_image(**attrs, &block)
109
+ render Shadcn::UI::AvatarImage.new(**attrs, &block)
110
+ end
111
+
112
+ def ui_avatar_fallback(**attrs, &block)
113
+ render Shadcn::UI::AvatarFallback.new(**attrs, &block)
114
+ end
115
+
116
+ def ui_avatar_badge(**attrs, &block)
117
+ render Shadcn::UI::AvatarBadge.new(**attrs, &block)
118
+ end
119
+
120
+ def ui_avatar_group(**attrs, &block)
121
+ render Shadcn::UI::AvatarGroup.new(**attrs, &block)
122
+ end
123
+
124
+ def ui_avatar_group_count(**attrs, &block)
125
+ render Shadcn::UI::AvatarGroupCount.new(**attrs, &block)
126
+ end
127
+
128
+ # ── Badge ──────────────────────────────────────────────────
129
+
130
+ def ui_badge(**attrs, &block)
131
+ render Shadcn::UI::Badge.new(**attrs, &block)
132
+ end
133
+
134
+ # ── Breadcrumb ─────────────────────────────────────────────
135
+
136
+ def ui_breadcrumb(**attrs, &block)
137
+ render Shadcn::UI::Breadcrumb.new(**attrs, &block)
138
+ end
139
+
140
+ def ui_breadcrumb_list(**attrs, &block)
141
+ render Shadcn::UI::BreadcrumbList.new(**attrs, &block)
142
+ end
143
+
144
+ def ui_breadcrumb_item(**attrs, &block)
145
+ render Shadcn::UI::BreadcrumbItem.new(**attrs, &block)
146
+ end
147
+
148
+ def ui_breadcrumb_link(**attrs, &block)
149
+ render Shadcn::UI::BreadcrumbLink.new(**attrs, &block)
150
+ end
151
+
152
+ def ui_breadcrumb_page(**attrs, &block)
153
+ render Shadcn::UI::BreadcrumbPage.new(**attrs, &block)
154
+ end
155
+
156
+ def ui_breadcrumb_separator(**attrs, &block)
157
+ render Shadcn::UI::BreadcrumbSeparator.new(**attrs, &block)
158
+ end
159
+
160
+ def ui_breadcrumb_ellipsis(**attrs, &block)
161
+ render Shadcn::UI::BreadcrumbEllipsis.new(**attrs, &block)
162
+ end
163
+
164
+ # ── Button ─────────────────────────────────────────────────
165
+
166
+ def ui_button(**attrs, &block)
167
+ render Shadcn::UI::Button.new(**attrs, &block)
168
+ end
169
+
170
+ def ui_button_group(**attrs, &block)
171
+ render Shadcn::UI::ButtonGroup.new(**attrs, &block)
172
+ end
173
+
174
+ def ui_button_group_text(**attrs, &block)
175
+ render Shadcn::UI::ButtonGroupText.new(**attrs, &block)
176
+ end
177
+
178
+ # ── Card ───────────────────────────────────────────────────
179
+
180
+ def ui_card(**attrs, &block)
181
+ render Shadcn::UI::Card.new(**attrs, &block)
182
+ end
183
+
184
+ def ui_card_header(**attrs, &block)
185
+ render Shadcn::UI::CardHeader.new(**attrs, &block)
186
+ end
187
+
188
+ def ui_card_title(**attrs, &block)
189
+ render Shadcn::UI::CardTitle.new(**attrs, &block)
190
+ end
191
+
192
+ def ui_card_description(**attrs, &block)
193
+ render Shadcn::UI::CardDescription.new(**attrs, &block)
194
+ end
195
+
196
+ def ui_card_action(**attrs, &block)
197
+ render Shadcn::UI::CardAction.new(**attrs, &block)
198
+ end
199
+
200
+ def ui_card_content(**attrs, &block)
201
+ render Shadcn::UI::CardContent.new(**attrs, &block)
202
+ end
203
+
204
+ def ui_card_footer(**attrs, &block)
205
+ render Shadcn::UI::CardFooter.new(**attrs, &block)
206
+ end
207
+
208
+ # ── Checkbox ───────────────────────────────────────────────
209
+
210
+ def ui_checkbox(**attrs, &block)
211
+ render Shadcn::UI::Checkbox.new(**attrs, &block)
212
+ end
213
+
214
+ # ── Collapsible ────────────────────────────────────────────
215
+
216
+ def ui_collapsible(**attrs, &block)
217
+ render Shadcn::UI::Collapsible.new(**attrs, &block)
218
+ end
219
+
220
+ def ui_collapsible_trigger(**attrs, &block)
221
+ render Shadcn::UI::CollapsibleTrigger.new(**attrs, &block)
222
+ end
223
+
224
+ def ui_collapsible_content(**attrs, &block)
225
+ render Shadcn::UI::CollapsibleContent.new(**attrs, &block)
226
+ end
227
+
228
+ # ── Combobox ───────────────────────────────────────────────
229
+
230
+ def ui_combobox(**attrs, &block)
231
+ render Shadcn::UI::Combobox.new(**attrs, &block)
232
+ end
233
+
234
+ def ui_combobox_trigger(**attrs, &block)
235
+ render Shadcn::UI::ComboboxTrigger.new(**attrs, &block)
236
+ end
237
+
238
+ def ui_combobox_value(**attrs, &block)
239
+ render Shadcn::UI::ComboboxValue.new(**attrs, &block)
240
+ end
241
+
242
+ def ui_combobox_content(**attrs, &block)
243
+ render Shadcn::UI::ComboboxContent.new(**attrs, &block)
244
+ end
245
+
246
+ def ui_combobox_input(**attrs, &block)
247
+ render Shadcn::UI::ComboboxInput.new(**attrs, &block)
248
+ end
249
+
250
+ def ui_combobox_item(**attrs, &block)
251
+ render Shadcn::UI::ComboboxItem.new(**attrs, &block)
252
+ end
253
+
254
+ def ui_combobox_empty(**attrs, &block)
255
+ render Shadcn::UI::ComboboxEmpty.new(**attrs, &block)
256
+ end
257
+
258
+ # ── Command ────────────────────────────────────────────────
259
+
260
+ def ui_command(**attrs, &block)
261
+ render Shadcn::UI::Command.new(**attrs, &block)
262
+ end
263
+
264
+ def ui_command_dialog(**attrs, &block)
265
+ render Shadcn::UI::CommandDialog.new(**attrs, &block)
266
+ end
267
+
268
+ def ui_command_input(**attrs, &block)
269
+ render Shadcn::UI::CommandInput.new(**attrs, &block)
270
+ end
271
+
272
+ def ui_command_list(**attrs, &block)
273
+ render Shadcn::UI::CommandList.new(**attrs, &block)
274
+ end
275
+
276
+ def ui_command_empty(**attrs, &block)
277
+ render Shadcn::UI::CommandEmpty.new(**attrs, &block)
278
+ end
279
+
280
+ def ui_command_group(**attrs, &block)
281
+ render Shadcn::UI::CommandGroup.new(**attrs, &block)
282
+ end
283
+
284
+ def ui_command_item(**attrs, &block)
285
+ render Shadcn::UI::CommandItem.new(**attrs, &block)
286
+ end
287
+
288
+ def ui_command_separator(**attrs, &block)
289
+ render Shadcn::UI::CommandSeparator.new(**attrs, &block)
290
+ end
291
+
292
+ def ui_command_shortcut(**attrs, &block)
293
+ render Shadcn::UI::CommandShortcut.new(**attrs, &block)
294
+ end
295
+
296
+ # ── Context Menu ───────────────────────────────────────────
297
+
298
+ def ui_context_menu(**attrs, &block)
299
+ render Shadcn::UI::ContextMenu.new(**attrs, &block)
300
+ end
301
+
302
+ def ui_context_menu_trigger(**attrs, &block)
303
+ render Shadcn::UI::ContextMenuTrigger.new(**attrs, &block)
304
+ end
305
+
306
+ def ui_context_menu_content(**attrs, &block)
307
+ render Shadcn::UI::ContextMenuContent.new(**attrs, &block)
308
+ end
309
+
310
+ def ui_context_menu_item(**attrs, &block)
311
+ render Shadcn::UI::ContextMenuItem.new(**attrs, &block)
312
+ end
313
+
314
+ def ui_context_menu_checkbox_item(**attrs, &block)
315
+ render Shadcn::UI::ContextMenuCheckboxItem.new(**attrs, &block)
316
+ end
317
+
318
+ def ui_context_menu_radio_group(**attrs, &block)
319
+ render Shadcn::UI::ContextMenuRadioGroup.new(**attrs, &block)
320
+ end
321
+
322
+ def ui_context_menu_radio_item(**attrs, &block)
323
+ render Shadcn::UI::ContextMenuRadioItem.new(**attrs, &block)
324
+ end
325
+
326
+ def ui_context_menu_label(**attrs, &block)
327
+ render Shadcn::UI::ContextMenuLabel.new(**attrs, &block)
328
+ end
329
+
330
+ def ui_context_menu_separator(**attrs, &block)
331
+ render Shadcn::UI::ContextMenuSeparator.new(**attrs, &block)
332
+ end
333
+
334
+ def ui_context_menu_shortcut(**attrs, &block)
335
+ render Shadcn::UI::ContextMenuShortcut.new(**attrs, &block)
336
+ end
337
+
338
+ def ui_context_menu_sub_trigger(**attrs, &block)
339
+ render Shadcn::UI::ContextMenuSubTrigger.new(**attrs, &block)
340
+ end
341
+
342
+ def ui_context_menu_sub_content(**attrs, &block)
343
+ render Shadcn::UI::ContextMenuSubContent.new(**attrs, &block)
344
+ end
345
+
346
+ # ── Dialog ─────────────────────────────────────────────────
347
+
348
+ def ui_dialog(**attrs, &block)
349
+ render Shadcn::UI::Dialog.new(**attrs, &block)
350
+ end
351
+
352
+ def ui_dialog_trigger(**attrs, &block)
353
+ render Shadcn::UI::DialogTrigger.new(**attrs, &block)
354
+ end
355
+
356
+ def ui_dialog_overlay(**attrs, &block)
357
+ render Shadcn::UI::DialogOverlay.new(**attrs, &block)
358
+ end
359
+
360
+ def ui_dialog_content(**attrs, &block)
361
+ render Shadcn::UI::DialogContent.new(**attrs, &block)
362
+ end
363
+
364
+ def ui_dialog_header(**attrs, &block)
365
+ render Shadcn::UI::DialogHeader.new(**attrs, &block)
366
+ end
367
+
368
+ def ui_dialog_footer(**attrs, &block)
369
+ render Shadcn::UI::DialogFooter.new(**attrs, &block)
370
+ end
371
+
372
+ def ui_dialog_title(**attrs, &block)
373
+ render Shadcn::UI::DialogTitle.new(**attrs, &block)
374
+ end
375
+
376
+ def ui_dialog_description(**attrs, &block)
377
+ render Shadcn::UI::DialogDescription.new(**attrs, &block)
378
+ end
379
+
380
+ def ui_dialog_close(**attrs, &block)
381
+ render Shadcn::UI::DialogClose.new(**attrs, &block)
382
+ end
383
+
384
+ # ── Direction ──────────────────────────────────────────────
385
+
386
+ def ui_direction(**attrs, &block)
387
+ render Shadcn::UI::Direction.new(**attrs, &block)
388
+ end
389
+
390
+ # ── Drawer ─────────────────────────────────────────────────
391
+
392
+ def ui_drawer(**attrs, &block)
393
+ render Shadcn::UI::Drawer.new(**attrs, &block)
394
+ end
395
+
396
+ def ui_drawer_trigger(**attrs, &block)
397
+ render Shadcn::UI::DrawerTrigger.new(**attrs, &block)
398
+ end
399
+
400
+ def ui_drawer_overlay(**attrs, &block)
401
+ render Shadcn::UI::DrawerOverlay.new(**attrs, &block)
402
+ end
403
+
404
+ def ui_drawer_content(**attrs, &block)
405
+ render Shadcn::UI::DrawerContent.new(**attrs, &block)
406
+ end
407
+
408
+ def ui_drawer_header(**attrs, &block)
409
+ render Shadcn::UI::DrawerHeader.new(**attrs, &block)
410
+ end
411
+
412
+ def ui_drawer_footer(**attrs, &block)
413
+ render Shadcn::UI::DrawerFooter.new(**attrs, &block)
414
+ end
415
+
416
+ def ui_drawer_title(**attrs, &block)
417
+ render Shadcn::UI::DrawerTitle.new(**attrs, &block)
418
+ end
419
+
420
+ def ui_drawer_description(**attrs, &block)
421
+ render Shadcn::UI::DrawerDescription.new(**attrs, &block)
422
+ end
423
+
424
+ def ui_drawer_close(**attrs, &block)
425
+ render Shadcn::UI::DrawerClose.new(**attrs, &block)
426
+ end
427
+
428
+ # ── Dropdown Menu ──────────────────────────────────────────
429
+
430
+ def ui_dropdown_menu(**attrs, &block)
431
+ render Shadcn::UI::DropdownMenu.new(**attrs, &block)
432
+ end
433
+
434
+ def ui_dropdown_menu_trigger(**attrs, &block)
435
+ render Shadcn::UI::DropdownMenuTrigger.new(**attrs, &block)
436
+ end
437
+
438
+ def ui_dropdown_menu_content(**attrs, &block)
439
+ render Shadcn::UI::DropdownMenuContent.new(**attrs, &block)
440
+ end
441
+
442
+ def ui_dropdown_menu_item(**attrs, &block)
443
+ render Shadcn::UI::DropdownMenuItem.new(**attrs, &block)
444
+ end
445
+
446
+ def ui_dropdown_menu_checkbox_item(**attrs, &block)
447
+ render Shadcn::UI::DropdownMenuCheckboxItem.new(**attrs, &block)
448
+ end
449
+
450
+ def ui_dropdown_menu_radio_group(**attrs, &block)
451
+ render Shadcn::UI::DropdownMenuRadioGroup.new(**attrs, &block)
452
+ end
453
+
454
+ def ui_dropdown_menu_radio_item(**attrs, &block)
455
+ render Shadcn::UI::DropdownMenuRadioItem.new(**attrs, &block)
456
+ end
457
+
458
+ def ui_dropdown_menu_label(**attrs, &block)
459
+ render Shadcn::UI::DropdownMenuLabel.new(**attrs, &block)
460
+ end
461
+
462
+ def ui_dropdown_menu_separator(**attrs, &block)
463
+ render Shadcn::UI::DropdownMenuSeparator.new(**attrs, &block)
464
+ end
465
+
466
+ def ui_dropdown_menu_shortcut(**attrs, &block)
467
+ render Shadcn::UI::DropdownMenuShortcut.new(**attrs, &block)
468
+ end
469
+
470
+ def ui_dropdown_menu_group(**attrs, &block)
471
+ render Shadcn::UI::DropdownMenuGroup.new(**attrs, &block)
472
+ end
473
+
474
+ def ui_dropdown_menu_sub_trigger(**attrs, &block)
475
+ render Shadcn::UI::DropdownMenuSubTrigger.new(**attrs, &block)
476
+ end
477
+
478
+ def ui_dropdown_menu_sub_content(**attrs, &block)
479
+ render Shadcn::UI::DropdownMenuSubContent.new(**attrs, &block)
480
+ end
481
+
482
+ # ── Empty ──────────────────────────────────────────────────
483
+
484
+ def ui_empty(**attrs, &block)
485
+ render Shadcn::UI::Empty.new(**attrs, &block)
486
+ end
487
+
488
+ def ui_empty_media(**attrs, &block)
489
+ render Shadcn::UI::EmptyMedia.new(**attrs, &block)
490
+ end
491
+
492
+ def ui_empty_title(**attrs, &block)
493
+ render Shadcn::UI::EmptyTitle.new(**attrs, &block)
494
+ end
495
+
496
+ def ui_empty_description(**attrs, &block)
497
+ render Shadcn::UI::EmptyDescription.new(**attrs, &block)
498
+ end
499
+
500
+ def ui_empty_actions(**attrs, &block)
501
+ render Shadcn::UI::EmptyActions.new(**attrs, &block)
502
+ end
503
+
504
+ # ── Field ──────────────────────────────────────────────────
505
+
506
+ def ui_field(**attrs, &block)
507
+ render Shadcn::UI::Field.new(**attrs, &block)
508
+ end
509
+
510
+ def ui_field_control(**attrs, &block)
511
+ render Shadcn::UI::FieldControl.new(**attrs, &block)
512
+ end
513
+
514
+ def ui_field_description(**attrs, &block)
515
+ render Shadcn::UI::FieldDescription.new(**attrs, &block)
516
+ end
517
+
518
+ def ui_field_error(**attrs, &block)
519
+ render Shadcn::UI::FieldError.new(**attrs, &block)
520
+ end
521
+
522
+ def ui_fieldset(**attrs, &block)
523
+ render Shadcn::UI::Fieldset.new(**attrs, &block)
524
+ end
525
+
526
+ def ui_fieldset_legend(**attrs, &block)
527
+ render Shadcn::UI::FieldsetLegend.new(**attrs, &block)
528
+ end
529
+
530
+ # ── Hover Card ─────────────────────────────────────────────
531
+
532
+ def ui_hover_card(**attrs, &block)
533
+ render Shadcn::UI::HoverCard.new(**attrs, &block)
534
+ end
535
+
536
+ def ui_hover_card_trigger(**attrs, &block)
537
+ render Shadcn::UI::HoverCardTrigger.new(**attrs, &block)
538
+ end
539
+
540
+ def ui_hover_card_content(**attrs, &block)
541
+ render Shadcn::UI::HoverCardContent.new(**attrs, &block)
542
+ end
543
+
544
+ # ── Input ──────────────────────────────────────────────────
545
+
546
+ def ui_input(**attrs, &block)
547
+ render Shadcn::UI::Input.new(**attrs, &block)
548
+ end
549
+
550
+ def ui_input_group(**attrs, &block)
551
+ render Shadcn::UI::InputGroup.new(**attrs, &block)
552
+ end
553
+
554
+ # ── Input OTP ──────────────────────────────────────────────
555
+
556
+ def ui_input_otp(**attrs, &block)
557
+ render Shadcn::UI::InputOTP.new(**attrs, &block)
558
+ end
559
+
560
+ def ui_input_otp_group(**attrs, &block)
561
+ render Shadcn::UI::InputOTPGroup.new(**attrs, &block)
562
+ end
563
+
564
+ def ui_input_otp_slot(**attrs, &block)
565
+ render Shadcn::UI::InputOTPSlot.new(**attrs, &block)
566
+ end
567
+
568
+ def ui_input_otp_separator(**attrs, &block)
569
+ render Shadcn::UI::InputOTPSeparator.new(**attrs, &block)
570
+ end
571
+
572
+ # ── Item ───────────────────────────────────────────────────
573
+
574
+ def ui_item(**attrs, &block)
575
+ render Shadcn::UI::Item.new(**attrs, &block)
576
+ end
577
+
578
+ def ui_item_media(**attrs, &block)
579
+ render Shadcn::UI::ItemMedia.new(**attrs, &block)
580
+ end
581
+
582
+ def ui_item_content(**attrs, &block)
583
+ render Shadcn::UI::ItemContent.new(**attrs, &block)
584
+ end
585
+
586
+ def ui_item_title(**attrs, &block)
587
+ render Shadcn::UI::ItemTitle.new(**attrs, &block)
588
+ end
589
+
590
+ def ui_item_description(**attrs, &block)
591
+ render Shadcn::UI::ItemDescription.new(**attrs, &block)
592
+ end
593
+
594
+ def ui_item_actions(**attrs, &block)
595
+ render Shadcn::UI::ItemActions.new(**attrs, &block)
596
+ end
597
+
598
+ # ── Kbd ────────────────────────────────────────────────────
599
+
600
+ def ui_kbd(**attrs, &block)
601
+ render Shadcn::UI::Kbd.new(**attrs, &block)
602
+ end
603
+
604
+ def ui_kbd_group(**attrs, &block)
605
+ render Shadcn::UI::KbdGroup.new(**attrs, &block)
606
+ end
607
+
608
+ # ── Label ──────────────────────────────────────────────────
609
+
610
+ def ui_label(**attrs, &block)
611
+ render Shadcn::UI::Label.new(**attrs, &block)
612
+ end
613
+
614
+ # ── Menubar ────────────────────────────────────────────────
615
+
616
+ def ui_menubar(**attrs, &block)
617
+ render Shadcn::UI::Menubar.new(**attrs, &block)
618
+ end
619
+
620
+ def ui_menubar_menu(**attrs, &block)
621
+ render Shadcn::UI::MenubarMenu.new(**attrs, &block)
622
+ end
623
+
624
+ def ui_menubar_trigger(**attrs, &block)
625
+ render Shadcn::UI::MenubarTrigger.new(**attrs, &block)
626
+ end
627
+
628
+ def ui_menubar_content(**attrs, &block)
629
+ render Shadcn::UI::MenubarContent.new(**attrs, &block)
630
+ end
631
+
632
+ def ui_menubar_item(**attrs, &block)
633
+ render Shadcn::UI::MenubarItem.new(**attrs, &block)
634
+ end
635
+
636
+ def ui_menubar_checkbox_item(**attrs, &block)
637
+ render Shadcn::UI::MenubarCheckboxItem.new(**attrs, &block)
638
+ end
639
+
640
+ def ui_menubar_radio_group(**attrs, &block)
641
+ render Shadcn::UI::MenubarRadioGroup.new(**attrs, &block)
642
+ end
643
+
644
+ def ui_menubar_radio_item(**attrs, &block)
645
+ render Shadcn::UI::MenubarRadioItem.new(**attrs, &block)
646
+ end
647
+
648
+ def ui_menubar_label(**attrs, &block)
649
+ render Shadcn::UI::MenubarLabel.new(**attrs, &block)
650
+ end
651
+
652
+ def ui_menubar_separator(**attrs, &block)
653
+ render Shadcn::UI::MenubarSeparator.new(**attrs, &block)
654
+ end
655
+
656
+ def ui_menubar_shortcut(**attrs, &block)
657
+ render Shadcn::UI::MenubarShortcut.new(**attrs, &block)
658
+ end
659
+
660
+ def ui_menubar_sub_trigger(**attrs, &block)
661
+ render Shadcn::UI::MenubarSubTrigger.new(**attrs, &block)
662
+ end
663
+
664
+ def ui_menubar_sub_content(**attrs, &block)
665
+ render Shadcn::UI::MenubarSubContent.new(**attrs, &block)
666
+ end
667
+
668
+ # ── Native Select ──────────────────────────────────────────
669
+
670
+ def ui_native_select(**attrs, &block)
671
+ render Shadcn::UI::NativeSelect.new(**attrs, &block)
672
+ end
673
+
674
+ # ── Navigation Menu ────────────────────────────────────────
675
+
676
+ def ui_navigation_menu(**attrs, &block)
677
+ render Shadcn::UI::NavigationMenu.new(**attrs, &block)
678
+ end
679
+
680
+ def ui_navigation_menu_list(**attrs, &block)
681
+ render Shadcn::UI::NavigationMenuList.new(**attrs, &block)
682
+ end
683
+
684
+ def ui_navigation_menu_item(**attrs, &block)
685
+ render Shadcn::UI::NavigationMenuItem.new(**attrs, &block)
686
+ end
687
+
688
+ def ui_navigation_menu_trigger(**attrs, &block)
689
+ render Shadcn::UI::NavigationMenuTrigger.new(**attrs, &block)
690
+ end
691
+
692
+ def ui_navigation_menu_content(**attrs, &block)
693
+ render Shadcn::UI::NavigationMenuContent.new(**attrs, &block)
694
+ end
695
+
696
+ def ui_navigation_menu_link(**attrs, &block)
697
+ render Shadcn::UI::NavigationMenuLink.new(**attrs, &block)
698
+ end
699
+
700
+ def ui_navigation_menu_viewport(**attrs, &block)
701
+ render Shadcn::UI::NavigationMenuViewport.new(**attrs, &block)
702
+ end
703
+
704
+ def ui_navigation_menu_indicator(**attrs, &block)
705
+ render Shadcn::UI::NavigationMenuIndicator.new(**attrs, &block)
706
+ end
707
+
708
+ # ── Pagination ─────────────────────────────────────────────
709
+
710
+ def ui_pagination(**attrs, &block)
711
+ render Shadcn::UI::Pagination.new(**attrs, &block)
712
+ end
713
+
714
+ def ui_pagination_content(**attrs, &block)
715
+ render Shadcn::UI::PaginationContent.new(**attrs, &block)
716
+ end
717
+
718
+ def ui_pagination_item(**attrs, &block)
719
+ render Shadcn::UI::PaginationItem.new(**attrs, &block)
720
+ end
721
+
722
+ def ui_pagination_link(**attrs, &block)
723
+ render Shadcn::UI::PaginationLink.new(**attrs, &block)
724
+ end
725
+
726
+ def ui_pagination_previous(**attrs, &block)
727
+ render Shadcn::UI::PaginationPrevious.new(**attrs, &block)
728
+ end
729
+
730
+ def ui_pagination_next(**attrs, &block)
731
+ render Shadcn::UI::PaginationNext.new(**attrs, &block)
732
+ end
733
+
734
+ def ui_pagination_ellipsis(**attrs, &block)
735
+ render Shadcn::UI::PaginationEllipsis.new(**attrs, &block)
736
+ end
737
+
738
+ # ── Popover ────────────────────────────────────────────────
739
+
740
+ def ui_popover(**attrs, &block)
741
+ render Shadcn::UI::Popover.new(**attrs, &block)
742
+ end
743
+
744
+ def ui_popover_trigger(**attrs, &block)
745
+ render Shadcn::UI::PopoverTrigger.new(**attrs, &block)
746
+ end
747
+
748
+ def ui_popover_content(**attrs, &block)
749
+ render Shadcn::UI::PopoverContent.new(**attrs, &block)
750
+ end
751
+
752
+ def ui_popover_anchor(**attrs, &block)
753
+ render Shadcn::UI::PopoverAnchor.new(**attrs, &block)
754
+ end
755
+
756
+ def ui_popover_header(**attrs, &block)
757
+ render Shadcn::UI::PopoverHeader.new(**attrs, &block)
758
+ end
759
+
760
+ def ui_popover_title(**attrs, &block)
761
+ render Shadcn::UI::PopoverTitle.new(**attrs, &block)
762
+ end
763
+
764
+ def ui_popover_description(**attrs, &block)
765
+ render Shadcn::UI::PopoverDescription.new(**attrs, &block)
766
+ end
767
+
768
+ # ── Progress ───────────────────────────────────────────────
769
+
770
+ def ui_progress(**attrs, &block)
771
+ render Shadcn::UI::Progress.new(**attrs, &block)
772
+ end
773
+
774
+ # ── Radio Group ────────────────────────────────────────────
775
+
776
+ def ui_radio_group(**attrs, &block)
777
+ render Shadcn::UI::RadioGroup.new(**attrs, &block)
778
+ end
779
+
780
+ def ui_radio_group_item(**attrs, &block)
781
+ render Shadcn::UI::RadioGroupItem.new(**attrs, &block)
782
+ end
783
+
784
+ # ── Resizable ──────────────────────────────────────────────
785
+
786
+ def ui_resizable_panel_group(**attrs, &block)
787
+ render Shadcn::UI::ResizablePanelGroup.new(**attrs, &block)
788
+ end
789
+
790
+ def ui_resizable_panel(**attrs, &block)
791
+ render Shadcn::UI::ResizablePanel.new(**attrs, &block)
792
+ end
793
+
794
+ def ui_resizable_handle(**attrs, &block)
795
+ render Shadcn::UI::ResizableHandle.new(**attrs, &block)
796
+ end
797
+
798
+ # ── Scroll Area ────────────────────────────────────────────
799
+
800
+ def ui_scroll_area(**attrs, &block)
801
+ render Shadcn::UI::ScrollArea.new(**attrs, &block)
802
+ end
803
+
804
+ def ui_scroll_bar(**attrs, &block)
805
+ render Shadcn::UI::ScrollBar.new(**attrs, &block)
806
+ end
807
+
808
+ # ── Select ─────────────────────────────────────────────────
809
+
810
+ def ui_select(**attrs, &block)
811
+ render Shadcn::UI::Select.new(**attrs, &block)
812
+ end
813
+
814
+ def ui_select_trigger(**attrs, &block)
815
+ render Shadcn::UI::SelectTrigger.new(**attrs, &block)
816
+ end
817
+
818
+ def ui_select_value(**attrs, &block)
819
+ render Shadcn::UI::SelectValue.new(**attrs, &block)
820
+ end
821
+
822
+ def ui_select_content(**attrs, &block)
823
+ render Shadcn::UI::SelectContent.new(**attrs, &block)
824
+ end
825
+
826
+ def ui_select_group(**attrs, &block)
827
+ render Shadcn::UI::SelectGroup.new(**attrs, &block)
828
+ end
829
+
830
+ def ui_select_item(**attrs, &block)
831
+ render Shadcn::UI::SelectItem.new(**attrs, &block)
832
+ end
833
+
834
+ def ui_select_label(**attrs, &block)
835
+ render Shadcn::UI::SelectLabel.new(**attrs, &block)
836
+ end
837
+
838
+ def ui_select_separator(**attrs, &block)
839
+ render Shadcn::UI::SelectSeparator.new(**attrs, &block)
840
+ end
841
+
842
+ # ── Separator ──────────────────────────────────────────────
843
+
844
+ def ui_separator(**attrs, &block)
845
+ render Shadcn::UI::Separator.new(**attrs, &block)
846
+ end
847
+
848
+ # ── Sheet ──────────────────────────────────────────────────
849
+
850
+ def ui_sheet(**attrs, &block)
851
+ render Shadcn::UI::Sheet.new(**attrs, &block)
852
+ end
853
+
854
+ def ui_sheet_trigger(**attrs, &block)
855
+ render Shadcn::UI::SheetTrigger.new(**attrs, &block)
856
+ end
857
+
858
+ def ui_sheet_overlay(**attrs, &block)
859
+ render Shadcn::UI::SheetOverlay.new(**attrs, &block)
860
+ end
861
+
862
+ def ui_sheet_content(**attrs, &block)
863
+ render Shadcn::UI::SheetContent.new(**attrs, &block)
864
+ end
865
+
866
+ def ui_sheet_header(**attrs, &block)
867
+ render Shadcn::UI::SheetHeader.new(**attrs, &block)
868
+ end
869
+
870
+ def ui_sheet_footer(**attrs, &block)
871
+ render Shadcn::UI::SheetFooter.new(**attrs, &block)
872
+ end
873
+
874
+ def ui_sheet_title(**attrs, &block)
875
+ render Shadcn::UI::SheetTitle.new(**attrs, &block)
876
+ end
877
+
878
+ def ui_sheet_description(**attrs, &block)
879
+ render Shadcn::UI::SheetDescription.new(**attrs, &block)
880
+ end
881
+
882
+ def ui_sheet_close(**attrs, &block)
883
+ render Shadcn::UI::SheetClose.new(**attrs, &block)
884
+ end
885
+
886
+ # ── Sidebar ────────────────────────────────────────────────
887
+
888
+ def ui_sidebar(**attrs, &block)
889
+ render Shadcn::UI::Sidebar.new(**attrs, &block)
890
+ end
891
+
892
+ def ui_sidebar_header(**attrs, &block)
893
+ render Shadcn::UI::SidebarHeader.new(**attrs, &block)
894
+ end
895
+
896
+ def ui_sidebar_content(**attrs, &block)
897
+ render Shadcn::UI::SidebarContent.new(**attrs, &block)
898
+ end
899
+
900
+ def ui_sidebar_footer(**attrs, &block)
901
+ render Shadcn::UI::SidebarFooter.new(**attrs, &block)
902
+ end
903
+
904
+ def ui_sidebar_group(**attrs, &block)
905
+ render Shadcn::UI::SidebarGroup.new(**attrs, &block)
906
+ end
907
+
908
+ def ui_sidebar_group_label(**attrs, &block)
909
+ render Shadcn::UI::SidebarGroupLabel.new(**attrs, &block)
910
+ end
911
+
912
+ def ui_sidebar_group_content(**attrs, &block)
913
+ render Shadcn::UI::SidebarGroupContent.new(**attrs, &block)
914
+ end
915
+
916
+ def ui_sidebar_menu(**attrs, &block)
917
+ render Shadcn::UI::SidebarMenu.new(**attrs, &block)
918
+ end
919
+
920
+ def ui_sidebar_menu_item(**attrs, &block)
921
+ render Shadcn::UI::SidebarMenuItem.new(**attrs, &block)
922
+ end
923
+
924
+ def ui_sidebar_menu_button(**attrs, &block)
925
+ render Shadcn::UI::SidebarMenuButton.new(**attrs, &block)
926
+ end
927
+
928
+ def ui_sidebar_menu_action(**attrs, &block)
929
+ render Shadcn::UI::SidebarMenuAction.new(**attrs, &block)
930
+ end
931
+
932
+ def ui_sidebar_menu_sub(**attrs, &block)
933
+ render Shadcn::UI::SidebarMenuSub.new(**attrs, &block)
934
+ end
935
+
936
+ def ui_sidebar_menu_sub_item(**attrs, &block)
937
+ render Shadcn::UI::SidebarMenuSubItem.new(**attrs, &block)
938
+ end
939
+
940
+ def ui_sidebar_menu_sub_button(**attrs, &block)
941
+ render Shadcn::UI::SidebarMenuSubButton.new(**attrs, &block)
942
+ end
943
+
944
+ def ui_sidebar_panel(**attrs, &block)
945
+ render Shadcn::UI::SidebarPanel.new(**attrs, &block)
946
+ end
947
+
948
+ def ui_sidebar_separator(**attrs, &block)
949
+ render Shadcn::UI::SidebarSeparator.new(**attrs, &block)
950
+ end
951
+
952
+ def ui_sidebar_trigger(**attrs, &block)
953
+ render Shadcn::UI::SidebarTrigger.new(**attrs, &block)
954
+ end
955
+
956
+ # ── Skeleton ───────────────────────────────────────────────
957
+
958
+ def ui_skeleton(**attrs, &block)
959
+ render Shadcn::UI::Skeleton.new(**attrs, &block)
960
+ end
961
+
962
+ # ── Slider ─────────────────────────────────────────────────
963
+
964
+ def ui_slider(**attrs, &block)
965
+ render Shadcn::UI::Slider.new(**attrs, &block)
966
+ end
967
+
968
+ # ── Spinner ────────────────────────────────────────────────
969
+
970
+ def ui_spinner(**attrs, &block)
971
+ render Shadcn::UI::Spinner.new(**attrs, &block)
972
+ end
973
+
974
+ # ── Switch ─────────────────────────────────────────────────
975
+
976
+ def ui_switch(**attrs, &block)
977
+ render Shadcn::UI::Switch.new(**attrs, &block)
978
+ end
979
+
980
+ # ── Table ──────────────────────────────────────────────────
981
+
982
+ def ui_table(**attrs, &block)
983
+ render Shadcn::UI::Table.new(**attrs, &block)
984
+ end
985
+
986
+ def ui_table_header(**attrs, &block)
987
+ render Shadcn::UI::TableHeader.new(**attrs, &block)
988
+ end
989
+
990
+ def ui_table_body(**attrs, &block)
991
+ render Shadcn::UI::TableBody.new(**attrs, &block)
992
+ end
993
+
994
+ def ui_table_footer(**attrs, &block)
995
+ render Shadcn::UI::TableFooter.new(**attrs, &block)
996
+ end
997
+
998
+ def ui_table_row(**attrs, &block)
999
+ render Shadcn::UI::TableRow.new(**attrs, &block)
1000
+ end
1001
+
1002
+ def ui_table_head(**attrs, &block)
1003
+ render Shadcn::UI::TableHead.new(**attrs, &block)
1004
+ end
1005
+
1006
+ def ui_table_cell(**attrs, &block)
1007
+ render Shadcn::UI::TableCell.new(**attrs, &block)
1008
+ end
1009
+
1010
+ def ui_table_caption(**attrs, &block)
1011
+ render Shadcn::UI::TableCaption.new(**attrs, &block)
1012
+ end
1013
+
1014
+ # ── Tabs ───────────────────────────────────────────────────
1015
+
1016
+ def ui_tabs(**attrs, &block)
1017
+ render Shadcn::UI::Tabs.new(**attrs, &block)
1018
+ end
1019
+
1020
+ def ui_tabs_list(**attrs, &block)
1021
+ render Shadcn::UI::TabsList.new(**attrs, &block)
1022
+ end
1023
+
1024
+ def ui_tabs_trigger(**attrs, &block)
1025
+ render Shadcn::UI::TabsTrigger.new(**attrs, &block)
1026
+ end
1027
+
1028
+ def ui_tabs_content(**attrs, &block)
1029
+ render Shadcn::UI::TabsContent.new(**attrs, &block)
1030
+ end
1031
+
1032
+ # ── Textarea ───────────────────────────────────────────────
1033
+
1034
+ def ui_textarea(**attrs, &block)
1035
+ render Shadcn::UI::Textarea.new(**attrs, &block)
1036
+ end
1037
+
1038
+ # ── Toast / Sonner ─────────────────────────────────────────
1039
+
1040
+ def ui_toaster(**attrs, &block)
1041
+ render Shadcn::UI::Toaster.new(**attrs, &block)
1042
+ end
1043
+
1044
+ def ui_toast(**attrs, &block)
1045
+ render Shadcn::UI::Toast.new(**attrs, &block)
1046
+ end
1047
+
1048
+ def ui_toast_title(**attrs, &block)
1049
+ render Shadcn::UI::ToastTitle.new(**attrs, &block)
1050
+ end
1051
+
1052
+ def ui_toast_description(**attrs, &block)
1053
+ render Shadcn::UI::ToastDescription.new(**attrs, &block)
1054
+ end
1055
+
1056
+ def ui_toast_action(**attrs, &block)
1057
+ render Shadcn::UI::ToastAction.new(**attrs, &block)
1058
+ end
1059
+
1060
+ def ui_toast_close(**attrs, &block)
1061
+ render Shadcn::UI::ToastClose.new(**attrs, &block)
1062
+ end
1063
+
1064
+ # ── Toggle ─────────────────────────────────────────────────
1065
+
1066
+ def ui_toggle(**attrs, &block)
1067
+ render Shadcn::UI::Toggle.new(**attrs, &block)
1068
+ end
1069
+
1070
+ def ui_toggle_group(**attrs, &block)
1071
+ render Shadcn::UI::ToggleGroup.new(**attrs, &block)
1072
+ end
1073
+
1074
+ def ui_toggle_group_item(**attrs, &block)
1075
+ render Shadcn::UI::ToggleGroupItem.new(**attrs, &block)
1076
+ end
1077
+
1078
+ # ── Tooltip ────────────────────────────────────────────────
1079
+
1080
+ def ui_tooltip(**attrs, &block)
1081
+ render Shadcn::UI::Tooltip.new(**attrs, &block)
1082
+ end
1083
+
1084
+ def ui_tooltip_trigger(**attrs, &block)
1085
+ render Shadcn::UI::TooltipTrigger.new(**attrs, &block)
1086
+ end
1087
+
1088
+ def ui_tooltip_content(**attrs, &block)
1089
+ render Shadcn::UI::TooltipContent.new(**attrs, &block)
1090
+ end
1091
+
1092
+ # ── Typography ─────────────────────────────────────────────
1093
+
1094
+ def ui_typography_h1(**attrs, &block)
1095
+ render Shadcn::UI::TypographyH1.new(**attrs, &block)
1096
+ end
1097
+
1098
+ def ui_typography_h2(**attrs, &block)
1099
+ render Shadcn::UI::TypographyH2.new(**attrs, &block)
1100
+ end
1101
+
1102
+ def ui_typography_h3(**attrs, &block)
1103
+ render Shadcn::UI::TypographyH3.new(**attrs, &block)
1104
+ end
1105
+
1106
+ def ui_typography_h4(**attrs, &block)
1107
+ render Shadcn::UI::TypographyH4.new(**attrs, &block)
1108
+ end
1109
+
1110
+ def ui_typography_p(**attrs, &block)
1111
+ render Shadcn::UI::TypographyP.new(**attrs, &block)
1112
+ end
1113
+
1114
+ def ui_typography_blockquote(**attrs, &block)
1115
+ render Shadcn::UI::TypographyBlockquote.new(**attrs, &block)
1116
+ end
1117
+
1118
+ def ui_typography_inline_code(**attrs, &block)
1119
+ render Shadcn::UI::TypographyInlineCode.new(**attrs, &block)
1120
+ end
1121
+
1122
+ def ui_typography_lead(**attrs, &block)
1123
+ render Shadcn::UI::TypographyLead.new(**attrs, &block)
1124
+ end
1125
+
1126
+ def ui_typography_large(**attrs, &block)
1127
+ render Shadcn::UI::TypographyLarge.new(**attrs, &block)
1128
+ end
1129
+
1130
+ def ui_typography_small(**attrs, &block)
1131
+ render Shadcn::UI::TypographySmall.new(**attrs, &block)
1132
+ end
1133
+
1134
+ def ui_typography_muted(**attrs, &block)
1135
+ render Shadcn::UI::TypographyMuted.new(**attrs, &block)
1136
+ end
1137
+
1138
+ def ui_typography_list(**attrs, &block)
1139
+ render Shadcn::UI::TypographyList.new(**attrs, &block)
1140
+ end
1141
+
1142
+ # ── Compound Field Helpers ─────────────────────────────────
1143
+
1144
+ def ui_text_field(**attrs, &block)
1145
+ render Shadcn::UI::TextField.new(**attrs, &block)
1146
+ end
1147
+
1148
+ def ui_textarea_field(**attrs, &block)
1149
+ render Shadcn::UI::TextareaField.new(**attrs, &block)
1150
+ end
1151
+
1152
+ # ── Theme Toggle ───────────────────────────────────────────
1153
+
1154
+ def ui_theme_toggle(**attrs, &block)
1155
+ render Shadcn::UI::ThemeToggle.new(**attrs, &block)
1156
+ end
1157
+ end
1158
+ end