shadcn_view_components 0.2.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 (177) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +590 -0
  3. data/LICENSE +49 -0
  4. data/README.md +542 -0
  5. data/app/assets/javascripts/shadcn/aria_relationships.js +88 -0
  6. data/app/assets/javascripts/shadcn/controllers/accordion_controller.js +241 -0
  7. data/app/assets/javascripts/shadcn/controllers/calendar_controller.js +98 -0
  8. data/app/assets/javascripts/shadcn/controllers/carousel_controller.js +305 -0
  9. data/app/assets/javascripts/shadcn/controllers/checked_state_controller.js +121 -0
  10. data/app/assets/javascripts/shadcn/controllers/combobox_controller.js +613 -0
  11. data/app/assets/javascripts/shadcn/controllers/command_controller.js +87 -0
  12. data/app/assets/javascripts/shadcn/controllers/dialog_controller.js +208 -0
  13. data/app/assets/javascripts/shadcn/controllers/hover_card_controller.js +145 -0
  14. data/app/assets/javascripts/shadcn/controllers/input_otp_controller.js +416 -0
  15. data/app/assets/javascripts/shadcn/controllers/menu_controller.js +286 -0
  16. data/app/assets/javascripts/shadcn/controllers/menubar_controller.js +430 -0
  17. data/app/assets/javascripts/shadcn/controllers/message_scroller_controller.js +37 -0
  18. data/app/assets/javascripts/shadcn/controllers/navigation_menu_controller.js +254 -0
  19. data/app/assets/javascripts/shadcn/controllers/popover_controller.js +117 -0
  20. data/app/assets/javascripts/shadcn/controllers/resizable_controller.js +256 -0
  21. data/app/assets/javascripts/shadcn/controllers/select_controller.js +491 -0
  22. data/app/assets/javascripts/shadcn/controllers/sidebar_controller.js +30 -0
  23. data/app/assets/javascripts/shadcn/controllers/slider_controller.js +74 -0
  24. data/app/assets/javascripts/shadcn/controllers/tabs_controller.js +146 -0
  25. data/app/assets/javascripts/shadcn/controllers/toast_controller.js +81 -0
  26. data/app/assets/javascripts/shadcn/controllers/toggle_controller.js +21 -0
  27. data/app/assets/javascripts/shadcn/controllers/toggle_group_controller.js +37 -0
  28. data/app/assets/javascripts/shadcn/controllers/tooltip_controller.js +123 -0
  29. data/app/assets/javascripts/shadcn/floating_position.js +660 -0
  30. data/app/assets/javascripts/shadcn/hide_after_exit.js +53 -0
  31. data/app/assets/javascripts/shadcn/index.js +65 -0
  32. data/app/assets/javascripts/shadcn/menu_popover.js +352 -0
  33. data/app/assets/javascripts/shadcn/package.json +17 -0
  34. data/app/assets/javascripts/shadcn/state_attrs.js +13 -0
  35. data/app/assets/stylesheets/shadcn/shadcn.css +766 -0
  36. data/app/assets/tailwind/shadcn_view_components/engine.css +11 -0
  37. data/app/components/shadcn/accordion.rb +121 -0
  38. data/app/components/shadcn/alert.rb +31 -0
  39. data/app/components/shadcn/alert_dialog.rb +165 -0
  40. data/app/components/shadcn/aspect_ratio.rb +34 -0
  41. data/app/components/shadcn/attachment.rb +86 -0
  42. data/app/components/shadcn/avatar.rb +55 -0
  43. data/app/components/shadcn/badge.rb +32 -0
  44. data/app/components/shadcn/base_component.rb +239 -0
  45. data/app/components/shadcn/breadcrumb.rb +70 -0
  46. data/app/components/shadcn/bubble.rb +48 -0
  47. data/app/components/shadcn/button.html.erb +1 -0
  48. data/app/components/shadcn/button.rb +41 -0
  49. data/app/components/shadcn/button_group.rb +41 -0
  50. data/app/components/shadcn/button_styled.rb +51 -0
  51. data/app/components/shadcn/calendar.rb +276 -0
  52. data/app/components/shadcn/card.rb +18 -0
  53. data/app/components/shadcn/carousel.rb +236 -0
  54. data/app/components/shadcn/chart.rb +57 -0
  55. data/app/components/shadcn/checkbox.rb +64 -0
  56. data/app/components/shadcn/collapsible.rb +25 -0
  57. data/app/components/shadcn/combobox.rb +552 -0
  58. data/app/components/shadcn/command.rb +149 -0
  59. data/app/components/shadcn/context_menu.rb +79 -0
  60. data/app/components/shadcn/dialog.rb +180 -0
  61. data/app/components/shadcn/direction_provider.rb +18 -0
  62. data/app/components/shadcn/drawer.rb +150 -0
  63. data/app/components/shadcn/dropdown_menu.rb +242 -0
  64. data/app/components/shadcn/empty.rb +40 -0
  65. data/app/components/shadcn/field.rb +106 -0
  66. data/app/components/shadcn/floating_position_options.rb +132 -0
  67. data/app/components/shadcn/form.rb +105 -0
  68. data/app/components/shadcn/hover_card.rb +66 -0
  69. data/app/components/shadcn/input.rb +13 -0
  70. data/app/components/shadcn/input_group/button.rb +48 -0
  71. data/app/components/shadcn/input_group.rb +51 -0
  72. data/app/components/shadcn/input_otp.rb +265 -0
  73. data/app/components/shadcn/item.rb +108 -0
  74. data/app/components/shadcn/kbd.rb +9 -0
  75. data/app/components/shadcn/label.rb +12 -0
  76. data/app/components/shadcn/marker.rb +37 -0
  77. data/app/components/shadcn/menubar.rb +110 -0
  78. data/app/components/shadcn/message.rb +29 -0
  79. data/app/components/shadcn/message_scroller.rb +52 -0
  80. data/app/components/shadcn/native_checked_state.rb +74 -0
  81. data/app/components/shadcn/native_select.rb +78 -0
  82. data/app/components/shadcn/navigation_menu.rb +122 -0
  83. data/app/components/shadcn/pagination.rb +160 -0
  84. data/app/components/shadcn/popover.rb +68 -0
  85. data/app/components/shadcn/preview_base.rb +107 -0
  86. data/app/components/shadcn/progress.rb +49 -0
  87. data/app/components/shadcn/radio_group.rb +74 -0
  88. data/app/components/shadcn/resizable.rb +77 -0
  89. data/app/components/shadcn/scroll_area.rb +59 -0
  90. data/app/components/shadcn/select.rb +356 -0
  91. data/app/components/shadcn/separator.rb +42 -0
  92. data/app/components/shadcn/sheet.rb +157 -0
  93. data/app/components/shadcn/sidebar.rb +332 -0
  94. data/app/components/shadcn/skeleton.rb +13 -0
  95. data/app/components/shadcn/slider.rb +279 -0
  96. data/app/components/shadcn/sonner.rb +30 -0
  97. data/app/components/shadcn/spinner.rb +32 -0
  98. data/app/components/shadcn/switch.rb +79 -0
  99. data/app/components/shadcn/table.rb +46 -0
  100. data/app/components/shadcn/tabs.rb +119 -0
  101. data/app/components/shadcn/textarea.rb +7 -0
  102. data/app/components/shadcn/toggle.rb +66 -0
  103. data/app/components/shadcn/toggle_group.rb +127 -0
  104. data/app/components/shadcn/tooltip.rb +74 -0
  105. data/config/importmap.rb +5 -0
  106. data/lib/generators/shadcn_view_components/install_generator.rb +182 -0
  107. data/lib/shadcn_view_components/classes.rb +89 -0
  108. data/lib/shadcn_view_components/component_naming.rb +21 -0
  109. data/lib/shadcn_view_components/contracts/calendar.rb +95 -0
  110. data/lib/shadcn_view_components/engine.rb +56 -0
  111. data/lib/shadcn_view_components/generated/contracts/accordion.rb +112 -0
  112. data/lib/shadcn_view_components/generated/contracts/alert-dialog.rb +300 -0
  113. data/lib/shadcn_view_components/generated/contracts/alert.rb +104 -0
  114. data/lib/shadcn_view_components/generated/contracts/aspect-ratio.rb +34 -0
  115. data/lib/shadcn_view_components/generated/contracts/attachment.rb +224 -0
  116. data/lib/shadcn_view_components/generated/contracts/avatar.rb +149 -0
  117. data/lib/shadcn_view_components/generated/contracts/badge.rb +39 -0
  118. data/lib/shadcn_view_components/generated/contracts/breadcrumb.rb +172 -0
  119. data/lib/shadcn_view_components/generated/contracts/bubble.rb +112 -0
  120. data/lib/shadcn_view_components/generated/contracts/button-group.rb +81 -0
  121. data/lib/shadcn_view_components/generated/contracts/button.rb +81 -0
  122. data/lib/shadcn_view_components/generated/contracts/card.rb +172 -0
  123. data/lib/shadcn_view_components/generated/contracts/carousel.rb +133 -0
  124. data/lib/shadcn_view_components/generated/contracts/chart.rb +109 -0
  125. data/lib/shadcn_view_components/generated/contracts/checkbox.rb +35 -0
  126. data/lib/shadcn_view_components/generated/contracts/collapsible.rb +89 -0
  127. data/lib/shadcn_view_components/generated/contracts/combobox.rb +368 -0
  128. data/lib/shadcn_view_components/generated/contracts/command.rb +222 -0
  129. data/lib/shadcn_view_components/generated/contracts/context-menu.rb +378 -0
  130. data/lib/shadcn_view_components/generated/contracts/dialog.rb +258 -0
  131. data/lib/shadcn_view_components/generated/contracts/direction.rb +34 -0
  132. data/lib/shadcn_view_components/generated/contracts/drawer.rb +280 -0
  133. data/lib/shadcn_view_components/generated/contracts/dropdown-menu.rb +380 -0
  134. data/lib/shadcn_view_components/generated/contracts/empty.rb +150 -0
  135. data/lib/shadcn_view_components/generated/contracts/field.rb +244 -0
  136. data/lib/shadcn_view_components/generated/contracts/form.rb +62 -0
  137. data/lib/shadcn_view_components/generated/contracts/hover-card.rb +90 -0
  138. data/lib/shadcn_view_components/generated/contracts/input-group.rb +155 -0
  139. data/lib/shadcn_view_components/generated/contracts/input-otp.rb +106 -0
  140. data/lib/shadcn_view_components/generated/contracts/input.rb +34 -0
  141. data/lib/shadcn_view_components/generated/contracts/item.rb +251 -0
  142. data/lib/shadcn_view_components/generated/contracts/kbd.rb +57 -0
  143. data/lib/shadcn_view_components/generated/contracts/label.rb +34 -0
  144. data/lib/shadcn_view_components/generated/contracts/marker.rb +82 -0
  145. data/lib/shadcn_view_components/generated/contracts/menubar.rb +394 -0
  146. data/lib/shadcn_view_components/generated/contracts/message-scroller.rb +149 -0
  147. data/lib/shadcn_view_components/generated/contracts/message.rb +149 -0
  148. data/lib/shadcn_view_components/generated/contracts/native-select.rb +82 -0
  149. data/lib/shadcn_view_components/generated/contracts/navigation-menu.rb +195 -0
  150. data/lib/shadcn_view_components/generated/contracts/pagination.rb +176 -0
  151. data/lib/shadcn_view_components/generated/contracts/popover.rb +159 -0
  152. data/lib/shadcn_view_components/generated/contracts/progress.rb +126 -0
  153. data/lib/shadcn_view_components/generated/contracts/radio-group.rb +58 -0
  154. data/lib/shadcn_view_components/generated/contracts/resizable.rb +85 -0
  155. data/lib/shadcn_view_components/generated/contracts/scroll-area.rb +59 -0
  156. data/lib/shadcn_view_components/generated/contracts/select.rb +245 -0
  157. data/lib/shadcn_view_components/generated/contracts/separator.rb +34 -0
  158. data/lib/shadcn_view_components/generated/contracts/sheet.rb +209 -0
  159. data/lib/shadcn_view_components/generated/contracts/sidebar.rb +558 -0
  160. data/lib/shadcn_view_components/generated/contracts/skeleton.rb +34 -0
  161. data/lib/shadcn_view_components/generated/contracts/slider.rb +38 -0
  162. data/lib/shadcn_view_components/generated/contracts/sonner.rb +36 -0
  163. data/lib/shadcn_view_components/generated/contracts/spinner.rb +34 -0
  164. data/lib/shadcn_view_components/generated/contracts/switch.rb +35 -0
  165. data/lib/shadcn_view_components/generated/contracts/table.rb +199 -0
  166. data/lib/shadcn_view_components/generated/contracts/tabs.rb +104 -0
  167. data/lib/shadcn_view_components/generated/contracts/textarea.rb +34 -0
  168. data/lib/shadcn_view_components/generated/contracts/toggle-group.rb +62 -0
  169. data/lib/shadcn_view_components/generated/contracts/toggle.rb +39 -0
  170. data/lib/shadcn_view_components/generated/contracts/tooltip.rb +116 -0
  171. data/lib/shadcn_view_components/numeric_property_validation.rb +124 -0
  172. data/lib/shadcn_view_components/property_contract_definitions.rb +92 -0
  173. data/lib/shadcn_view_components/property_contracts.rb +42 -0
  174. data/lib/shadcn_view_components/property_validation.rb +55 -0
  175. data/lib/shadcn_view_components/version.rb +6 -0
  176. data/lib/shadcn_view_components.rb +21 -0
  177. metadata +446 -0
@@ -0,0 +1,82 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !!
5
+ # Source: shadcn/ui base-nova "marker" (item sha256: 983f995c1a0955da559120dcca9273c8db212c9a972c988944569adce50c1a9a)
6
+ # Regenerate with: rake shadcn:generate
7
+
8
+ module ShadcnViewComponents
9
+ module Contracts
10
+ module Marker
11
+ ROOT_SLOT = T.let("marker", String)
12
+
13
+ DEFAULTS = T.let({ variant: :default }.freeze, T::Hash[Symbol, Symbol])
14
+
15
+ VARIANTS = T.let({ variant: [:border, :default, :separator] }.freeze, T::Hash[Symbol, T::Array[Symbol]])
16
+
17
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
18
+ COMBINATIONS = T.let({
19
+ { variant: :border } => "group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground border-b border-border pb-2",
20
+ { variant: :default } => "group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground",
21
+ { variant: :separator } => "group/marker relative flex min-h-4 w-full items-center gap-2 text-left text-sm text-muted-foreground [&_svg:not([class*='size-'])]:size-4 [a]:underline [a]:underline-offset-3 [a]:hover:text-foreground before:mr-1 before:h-px before:min-w-0 before:flex-1 before:bg-border after:ml-1 after:h-px after:min-w-0 after:flex-1 after:bg-border"
22
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
23
+
24
+ SLOTS = T.let([
25
+ { name: "marker", tag: "div", static_attributes: {}.freeze, dynamic_attributes: ["data-variant"].freeze }.freeze
26
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
27
+
28
+ extend T::Sig
29
+
30
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
31
+ module_function def combination(options)
32
+ COMBINATIONS.fetch(options)
33
+ end
34
+ module Content
35
+ ROOT_SLOT = T.let("marker-content", String)
36
+
37
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
38
+
39
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
40
+
41
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
42
+ COMBINATIONS = T.let({
43
+ {} => "min-w-0 wrap-break-word group-data-[variant=separator]/marker:flex-none group-data-[variant=separator]/marker:text-center *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground"
44
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
45
+
46
+ SLOTS = T.let([
47
+ { name: "marker-content", tag: "span", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
48
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
49
+
50
+ extend T::Sig
51
+
52
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
53
+ module_function def combination(options)
54
+ COMBINATIONS.fetch(options)
55
+ end
56
+ end
57
+ module Icon
58
+ ROOT_SLOT = T.let("marker-icon", String)
59
+
60
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
61
+
62
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
63
+
64
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
65
+ COMBINATIONS = T.let({
66
+ {} => "size-4 shrink-0 [&_svg:not([class*='size-'])]:size-4"
67
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
68
+
69
+ SLOTS = T.let([
70
+ { name: "marker-icon", tag: "span", static_attributes: { "aria-hidden" => "true" }.freeze, dynamic_attributes: [].freeze }.freeze
71
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
72
+
73
+ extend T::Sig
74
+
75
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
76
+ module_function def combination(options)
77
+ COMBINATIONS.fetch(options)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,394 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !!
5
+ # Source: shadcn/ui base-nova "menubar" (item sha256: e22b36425af37773dd0053d93ed0305d7620ea6464ef6cd5ae0f0551a7542485)
6
+ # Regenerate with: rake shadcn:generate
7
+
8
+ module ShadcnViewComponents
9
+ module Contracts
10
+ module Menubar
11
+ ROOT_SLOT = T.let("menubar", String)
12
+
13
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
14
+
15
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
16
+
17
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
18
+ COMBINATIONS = T.let({
19
+ {} => "flex h-8 items-center gap-0.5 rounded-lg border p-[3px]"
20
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
21
+
22
+ SLOTS = T.let([
23
+ { name: "menubar", tag: "MenubarPrimitive", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
24
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
25
+
26
+ extend T::Sig
27
+
28
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
29
+ module_function def combination(options)
30
+ COMBINATIONS.fetch(options)
31
+ end
32
+ module CheckboxItem
33
+ ROOT_SLOT = T.let("menubar-checkbox-item", String)
34
+
35
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
36
+
37
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
38
+
39
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
40
+ COMBINATIONS = T.let({
41
+ {} => "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0"
42
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
43
+
44
+ SLOTS = T.let([
45
+ { name: "menubar-checkbox-item", tag: "MenuPrimitive.CheckboxItem", static_attributes: {}.freeze, dynamic_attributes: ["checked", "data-inset"].freeze }.freeze
46
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
47
+
48
+ extend T::Sig
49
+
50
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
51
+ module_function def combination(options)
52
+ COMBINATIONS.fetch(options)
53
+ end
54
+ end
55
+ module Content
56
+ ROOT_SLOT = T.let("menubar-content", String)
57
+
58
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
59
+
60
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
61
+
62
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
63
+ COMBINATIONS = T.let({
64
+ {} => "cn-menu-target cn-menu-translucent min-w-36 rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95"
65
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
66
+
67
+ SLOTS = T.let([
68
+ { name: "menubar-content", tag: "DropdownMenuContent", static_attributes: {}.freeze, dynamic_attributes: ["align", "alignOffset", "sideOffset"].freeze }.freeze
69
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
70
+
71
+ extend T::Sig
72
+
73
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
74
+ module_function def combination(options)
75
+ COMBINATIONS.fetch(options)
76
+ end
77
+ end
78
+ module Group
79
+ ROOT_SLOT = T.let("menubar-group", String)
80
+
81
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
82
+ CLASSES_SLOT = T.let("", String)
83
+
84
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
85
+
86
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
87
+
88
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
89
+ COMBINATIONS = T.let({
90
+ {} => ""
91
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
92
+
93
+ SLOTS = T.let([
94
+ { name: "menubar-group", tag: "DropdownMenuGroup", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
95
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
96
+
97
+ extend T::Sig
98
+
99
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
100
+ module_function def combination(options)
101
+ COMBINATIONS.fetch(options)
102
+ end
103
+ end
104
+ module Item
105
+ ROOT_SLOT = T.let("menubar-item", String)
106
+
107
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
108
+
109
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
110
+
111
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
112
+ COMBINATIONS = T.let({
113
+ {} => "group/menubar-item gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:opacity-50 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive!"
114
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
115
+
116
+ SLOTS = T.let([
117
+ { name: "menubar-item", tag: "DropdownMenuItem", static_attributes: {}.freeze, dynamic_attributes: ["data-inset", "data-variant"].freeze }.freeze
118
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
119
+
120
+ extend T::Sig
121
+
122
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
123
+ module_function def combination(options)
124
+ COMBINATIONS.fetch(options)
125
+ end
126
+ end
127
+ module Label
128
+ ROOT_SLOT = T.let("menubar-label", String)
129
+
130
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
131
+
132
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
133
+
134
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
135
+ COMBINATIONS = T.let({
136
+ {} => "px-1.5 py-1 text-sm font-medium data-inset:pl-7"
137
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
138
+
139
+ SLOTS = T.let([
140
+ { name: "menubar-label", tag: "DropdownMenuLabel", static_attributes: {}.freeze, dynamic_attributes: ["data-inset"].freeze }.freeze
141
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
142
+
143
+ extend T::Sig
144
+
145
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
146
+ module_function def combination(options)
147
+ COMBINATIONS.fetch(options)
148
+ end
149
+ end
150
+ module Menu
151
+ ROOT_SLOT = T.let("menubar-menu", String)
152
+
153
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
154
+ CLASSES_SLOT = T.let("", String)
155
+
156
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
157
+
158
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
159
+
160
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
161
+ COMBINATIONS = T.let({
162
+ {} => ""
163
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
164
+
165
+ SLOTS = T.let([
166
+ { name: "menubar-menu", tag: "DropdownMenu", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
167
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
168
+
169
+ extend T::Sig
170
+
171
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
172
+ module_function def combination(options)
173
+ COMBINATIONS.fetch(options)
174
+ end
175
+ end
176
+ module Portal
177
+ ROOT_SLOT = T.let("menubar-portal", String)
178
+
179
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
180
+ CLASSES_SLOT = T.let("", String)
181
+
182
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
183
+
184
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
185
+
186
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
187
+ COMBINATIONS = T.let({
188
+ {} => ""
189
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
190
+
191
+ SLOTS = T.let([
192
+ { name: "menubar-portal", tag: "DropdownMenuPortal", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
193
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
194
+
195
+ extend T::Sig
196
+
197
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
198
+ module_function def combination(options)
199
+ COMBINATIONS.fetch(options)
200
+ end
201
+ end
202
+ module RadioGroup
203
+ ROOT_SLOT = T.let("menubar-radio-group", String)
204
+
205
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
206
+ CLASSES_SLOT = T.let("", String)
207
+
208
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
209
+
210
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
211
+
212
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
213
+ COMBINATIONS = T.let({
214
+ {} => ""
215
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
216
+
217
+ SLOTS = T.let([
218
+ { name: "menubar-radio-group", tag: "DropdownMenuRadioGroup", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
219
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
220
+
221
+ extend T::Sig
222
+
223
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
224
+ module_function def combination(options)
225
+ COMBINATIONS.fetch(options)
226
+ end
227
+ end
228
+ module RadioItem
229
+ ROOT_SLOT = T.let("menubar-radio-item", String)
230
+
231
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
232
+
233
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
234
+
235
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
236
+ COMBINATIONS = T.let({
237
+ {} => "relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-1.5 pl-7 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
238
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
239
+
240
+ SLOTS = T.let([
241
+ { name: "menubar-radio-item", tag: "MenuPrimitive.RadioItem", static_attributes: {}.freeze, dynamic_attributes: ["data-inset"].freeze }.freeze
242
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
243
+
244
+ extend T::Sig
245
+
246
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
247
+ module_function def combination(options)
248
+ COMBINATIONS.fetch(options)
249
+ end
250
+ end
251
+ module Separator
252
+ ROOT_SLOT = T.let("menubar-separator", String)
253
+
254
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
255
+
256
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
257
+
258
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
259
+ COMBINATIONS = T.let({
260
+ {} => "-mx-1 my-1 h-px bg-border"
261
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
262
+
263
+ SLOTS = T.let([
264
+ { name: "menubar-separator", tag: "DropdownMenuSeparator", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
265
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
266
+
267
+ extend T::Sig
268
+
269
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
270
+ module_function def combination(options)
271
+ COMBINATIONS.fetch(options)
272
+ end
273
+ end
274
+ module Shortcut
275
+ ROOT_SLOT = T.let("menubar-shortcut", String)
276
+
277
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
278
+
279
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
280
+
281
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
282
+ COMBINATIONS = T.let({
283
+ {} => "ml-auto text-xs tracking-widest text-muted-foreground group-focus/menubar-item:text-accent-foreground"
284
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
285
+
286
+ SLOTS = T.let([
287
+ { name: "menubar-shortcut", tag: "DropdownMenuShortcut", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
288
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
289
+
290
+ extend T::Sig
291
+
292
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
293
+ module_function def combination(options)
294
+ COMBINATIONS.fetch(options)
295
+ end
296
+ end
297
+ module Sub
298
+ ROOT_SLOT = T.let("menubar-sub", String)
299
+
300
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
301
+ CLASSES_SLOT = T.let("", String)
302
+
303
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
304
+
305
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
306
+
307
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
308
+ COMBINATIONS = T.let({
309
+ {} => ""
310
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
311
+
312
+ SLOTS = T.let([
313
+ { name: "menubar-sub", tag: "DropdownMenuSub", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
314
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
315
+
316
+ extend T::Sig
317
+
318
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
319
+ module_function def combination(options)
320
+ COMBINATIONS.fetch(options)
321
+ end
322
+ end
323
+ module SubContent
324
+ ROOT_SLOT = T.let("menubar-sub-content", String)
325
+
326
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
327
+
328
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
329
+
330
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
331
+ COMBINATIONS = T.let({
332
+ {} => "cn-menu-target cn-menu-translucent min-w-32 rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95"
333
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
334
+
335
+ SLOTS = T.let([
336
+ { name: "menubar-sub-content", tag: "DropdownMenuSubContent", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
337
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
338
+
339
+ extend T::Sig
340
+
341
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
342
+ module_function def combination(options)
343
+ COMBINATIONS.fetch(options)
344
+ end
345
+ end
346
+ module SubTrigger
347
+ ROOT_SLOT = T.let("menubar-sub-trigger", String)
348
+
349
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
350
+
351
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
352
+
353
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
354
+ COMBINATIONS = T.let({
355
+ {} => "gap-1.5 rounded-md px-1.5 py-1 text-sm focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg:not([class*='size-'])]:size-4"
356
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
357
+
358
+ SLOTS = T.let([
359
+ { name: "menubar-sub-trigger", tag: "DropdownMenuSubTrigger", static_attributes: {}.freeze, dynamic_attributes: ["data-inset"].freeze }.freeze
360
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
361
+
362
+ extend T::Sig
363
+
364
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
365
+ module_function def combination(options)
366
+ COMBINATIONS.fetch(options)
367
+ end
368
+ end
369
+ module Trigger
370
+ ROOT_SLOT = T.let("menubar-trigger", String)
371
+
372
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
373
+
374
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
375
+
376
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
377
+ COMBINATIONS = T.let({
378
+ {} => "flex items-center rounded-sm px-1.5 py-[2px] text-sm font-medium outline-hidden select-none hover:bg-muted aria-expanded:bg-muted"
379
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
380
+
381
+ SLOTS = T.let([
382
+ { name: "menubar-trigger", tag: "DropdownMenuTrigger", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
383
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
384
+
385
+ extend T::Sig
386
+
387
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
388
+ module_function def combination(options)
389
+ COMBINATIONS.fetch(options)
390
+ end
391
+ end
392
+ end
393
+ end
394
+ end
@@ -0,0 +1,149 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !!
5
+ # Source: shadcn/ui base-nova "message-scroller" (item sha256: 61c4c24dc632622378c0d708a5106cbf1a063aeb2e84bd69988b1a169cefda22)
6
+ # Regenerate with: rake shadcn:generate
7
+
8
+ module ShadcnViewComponents
9
+ module Contracts
10
+ module MessageScroller
11
+ ROOT_SLOT = T.let("message-scroller", String)
12
+
13
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
14
+
15
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
16
+
17
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
18
+ COMBINATIONS = T.let({
19
+ {} => "group/message-scroller relative flex size-full min-h-0 flex-col overflow-hidden"
20
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
21
+
22
+ SLOTS = T.let([
23
+ { name: "message-scroller", tag: "MessageScrollerPrimitive.Root", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
24
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
25
+
26
+ extend T::Sig
27
+
28
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
29
+ module_function def combination(options)
30
+ COMBINATIONS.fetch(options)
31
+ end
32
+ module Button
33
+ ROOT_SLOT = T.let("message-scroller-button", String)
34
+
35
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
36
+
37
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
38
+
39
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
40
+ COMBINATIONS = T.let({
41
+ {} => "absolute inset-s-1/2 -translate-x-1/2 border-border bg-background text-foreground transition-[translate,scale,opacity] duration-200 hover:bg-muted hover:text-foreground data-[active=false]:pointer-events-none data-[active=false]:scale-95 data-[active=false]:opacity-0 data-[active=false]:duration-400 data-[active=false]:ease-[cubic-bezier(0.7,0,0.84,0)] data-[active=true]:translate-y-0 data-[active=true]:scale-100 data-[active=true]:opacity-100 data-[active=true]:ease-[cubic-bezier(0.23,1,0.32,1)] data-[direction=end]:bottom-4 data-[direction=end]:data-[active=false]:translate-y-full data-[direction=start]:top-4 data-[direction=start]:data-[active=false]:-translate-y-full rtl:translate-x-1/2 data-[direction=start]:[&_svg]:rotate-180"
42
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
43
+
44
+ SLOTS = T.let([
45
+ { name: "message-scroller-button", tag: "MessageScrollerPrimitive.Button", static_attributes: {}.freeze, dynamic_attributes: ["data-direction", "data-size", "data-variant", "direction", "render"].freeze }.freeze
46
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
47
+
48
+ extend T::Sig
49
+
50
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
51
+ module_function def combination(options)
52
+ COMBINATIONS.fetch(options)
53
+ end
54
+ end
55
+ module Content
56
+ ROOT_SLOT = T.let("message-scroller-content", String)
57
+
58
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
59
+
60
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
61
+
62
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
63
+ COMBINATIONS = T.let({
64
+ {} => "flex h-max min-h-full flex-col gap-6"
65
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
66
+
67
+ SLOTS = T.let([
68
+ { name: "message-scroller-content", tag: "MessageScrollerPrimitive.Content", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
69
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
70
+
71
+ extend T::Sig
72
+
73
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
74
+ module_function def combination(options)
75
+ COMBINATIONS.fetch(options)
76
+ end
77
+ end
78
+ module Item
79
+ ROOT_SLOT = T.let("message-scroller-item", String)
80
+
81
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
82
+
83
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
84
+
85
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
86
+ COMBINATIONS = T.let({
87
+ {} => "min-w-0 shrink-0 [contain-intrinsic-size:auto_10rem] [content-visibility:auto]"
88
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
89
+
90
+ SLOTS = T.let([
91
+ { name: "message-scroller-item", tag: "MessageScrollerPrimitive.Item", static_attributes: {}.freeze, dynamic_attributes: ["scrollAnchor"].freeze }.freeze
92
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
93
+
94
+ extend T::Sig
95
+
96
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
97
+ module_function def combination(options)
98
+ COMBINATIONS.fetch(options)
99
+ end
100
+ end
101
+ module Provider
102
+ ROOT_SLOT = T.let("", String)
103
+
104
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
105
+
106
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
107
+
108
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
109
+ COMBINATIONS = T.let({
110
+ {} => ""
111
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
112
+
113
+ SLOTS = T.let([
114
+ { name: "", tag: "MessageScrollerPrimitive.Provider", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
115
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
116
+
117
+ extend T::Sig
118
+
119
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
120
+ module_function def combination(options)
121
+ COMBINATIONS.fetch(options)
122
+ end
123
+ end
124
+ module Viewport
125
+ ROOT_SLOT = T.let("message-scroller-viewport", String)
126
+
127
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
128
+
129
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
130
+
131
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
132
+ COMBINATIONS = T.let({
133
+ {} => "size-full min-h-0 min-w-0 scroll-fade-b scrollbar-thin scrollbar-gutter-stable overflow-y-auto overscroll-contain contain-content data-autoscrolling:scrollbar-thumb-transparent data-autoscrolling:scrollbar-track-transparent"
134
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
135
+
136
+ SLOTS = T.let([
137
+ { name: "message-scroller-viewport", tag: "MessageScrollerPrimitive.Viewport", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
138
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
139
+
140
+ extend T::Sig
141
+
142
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
143
+ module_function def combination(options)
144
+ COMBINATIONS.fetch(options)
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end