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,89 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !!
5
+ # Source: shadcn/ui base-nova "collapsible" (item sha256: bce936b20335ee04db66a0daab3ba5e0230ef91ae2da787a1dbe0ba2f5d1c1de)
6
+ # Regenerate with: rake shadcn:generate
7
+
8
+ module ShadcnViewComponents
9
+ module Contracts
10
+ module Collapsible
11
+ ROOT_SLOT = T.let("collapsible", String)
12
+
13
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
14
+ CLASSES_SLOT = T.let("", String)
15
+
16
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
17
+
18
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
19
+
20
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
21
+ COMBINATIONS = T.let({
22
+ {} => ""
23
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
24
+
25
+ SLOTS = T.let([
26
+ { name: "collapsible", tag: "CollapsiblePrimitive.Root", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
27
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
28
+
29
+ extend T::Sig
30
+
31
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
32
+ module_function def combination(options)
33
+ COMBINATIONS.fetch(options)
34
+ end
35
+ module Content
36
+ ROOT_SLOT = T.let("collapsible-content", String)
37
+
38
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
39
+ CLASSES_SLOT = T.let("", String)
40
+
41
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
42
+
43
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
44
+
45
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
46
+ COMBINATIONS = T.let({
47
+ {} => ""
48
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
49
+
50
+ SLOTS = T.let([
51
+ { name: "collapsible-content", tag: "CollapsiblePrimitive.Panel", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
52
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
53
+
54
+ extend T::Sig
55
+
56
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
57
+ module_function def combination(options)
58
+ COMBINATIONS.fetch(options)
59
+ end
60
+ end
61
+ module Trigger
62
+ ROOT_SLOT = T.let("collapsible-trigger", String)
63
+
64
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
65
+ CLASSES_SLOT = T.let("", String)
66
+
67
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
68
+
69
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
70
+
71
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
72
+ COMBINATIONS = T.let({
73
+ {} => ""
74
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
75
+
76
+ SLOTS = T.let([
77
+ { name: "collapsible-trigger", tag: "CollapsiblePrimitive.Trigger", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
78
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
79
+
80
+ extend T::Sig
81
+
82
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
83
+ module_function def combination(options)
84
+ COMBINATIONS.fetch(options)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,368 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !!
5
+ # Source: shadcn/ui base-nova "combobox" (item sha256: d9fcfddc86ce49ee43caf89e7a52892dfffd5c647add06f793cfccdacbb7fb50)
6
+ # Regenerate with: rake shadcn:generate
7
+
8
+ module ShadcnViewComponents
9
+ module Contracts
10
+ module Combobox
11
+ ROOT_SLOT = T.let("", 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
+ {} => ""
20
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
21
+
22
+ SLOTS = T.let([
23
+ { name: "", tag: "ComboboxPrimitive.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 Chip
33
+ ROOT_SLOT = T.let("combobox-chip", 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
+ {} => "flex h-[calc(--spacing(5.25))] w-fit items-center justify-center gap-1 rounded-sm bg-muted px-1.5 text-xs font-medium whitespace-nowrap text-foreground has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-data-[slot=combobox-chip-remove]:pr-0"
42
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
43
+
44
+ SLOTS = T.let([
45
+ { name: "combobox-chip", tag: "ComboboxPrimitive.Chip", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze,
46
+ { name: "combobox-chip-remove", tag: "ComboboxPrimitive.ChipRemove", static_attributes: { class: "-ml-1 opacity-50 hover:opacity-100" }.freeze, dynamic_attributes: ["render"].freeze }.freeze
47
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
48
+
49
+ extend T::Sig
50
+
51
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
52
+ module_function def combination(options)
53
+ COMBINATIONS.fetch(options)
54
+ end
55
+ end
56
+ module Chips
57
+ ROOT_SLOT = T.let("combobox-chips", String)
58
+
59
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
60
+
61
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
62
+
63
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
64
+ COMBINATIONS = T.let({
65
+ {} => "flex min-h-8 flex-wrap items-center gap-1 rounded-lg border border-input bg-transparent bg-clip-padding px-2.5 py-1 text-sm transition-colors focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50 has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 has-data-[slot=combobox-chip]:px-1 dark:bg-input/30 dark:has-aria-invalid:border-destructive/50 dark:has-aria-invalid:ring-destructive/40"
66
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
67
+
68
+ SLOTS = T.let([
69
+ { name: "combobox-chips", tag: "ComboboxPrimitive.Chips", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
70
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
71
+
72
+ extend T::Sig
73
+
74
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
75
+ module_function def combination(options)
76
+ COMBINATIONS.fetch(options)
77
+ end
78
+ end
79
+ module ChipsInput
80
+ ROOT_SLOT = T.let("combobox-chip-input", String)
81
+
82
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
83
+
84
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
85
+
86
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
87
+ COMBINATIONS = T.let({
88
+ {} => "min-w-16 flex-1 outline-none"
89
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
90
+
91
+ SLOTS = T.let([
92
+ { name: "combobox-chip-input", tag: "ComboboxPrimitive.Input", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
93
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
94
+
95
+ extend T::Sig
96
+
97
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
98
+ module_function def combination(options)
99
+ COMBINATIONS.fetch(options)
100
+ end
101
+ end
102
+ module Collection
103
+ ROOT_SLOT = T.let("combobox-collection", String)
104
+
105
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
106
+ CLASSES_SLOT = T.let("", String)
107
+
108
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
109
+
110
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
111
+
112
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
113
+ COMBINATIONS = T.let({
114
+ {} => ""
115
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
116
+
117
+ SLOTS = T.let([
118
+ { name: "combobox-collection", tag: "ComboboxPrimitive.Collection", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
119
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
120
+
121
+ extend T::Sig
122
+
123
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
124
+ module_function def combination(options)
125
+ COMBINATIONS.fetch(options)
126
+ end
127
+ end
128
+ module Content
129
+ ROOT_SLOT = T.let("", String)
130
+
131
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
132
+ CLASSES_SLOT = T.let("combobox-content", String)
133
+
134
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
135
+
136
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
137
+
138
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
139
+ COMBINATIONS = T.let({
140
+ {} => "cn-menu-target cn-menu-translucent group/combobox-content relative max-h-(--available-height) w-(--anchor-width) max-w-(--available-width) min-w-[calc(var(--anchor-width)+--spacing(7))] origin-(--transform-origin) overflow-hidden rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[chips=true]:min-w-(--anchor-width) 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-[slot=input-group]:m-1 *:data-[slot=input-group]:mb-0 *:data-[slot=input-group]:h-8 *:data-[slot=input-group]:border-input/30 *:data-[slot=input-group]:bg-input/30 *:data-[slot=input-group]:shadow-none 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"
141
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
142
+
143
+ SLOTS = T.let([
144
+ { name: "", tag: "ComboboxPrimitive.Portal", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze,
145
+ { name: "combobox-content", tag: "ComboboxPrimitive.Popup", static_attributes: {}.freeze, dynamic_attributes: ["data-chips"].freeze }.freeze
146
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
147
+
148
+ extend T::Sig
149
+
150
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
151
+ module_function def combination(options)
152
+ COMBINATIONS.fetch(options)
153
+ end
154
+ end
155
+ module Empty
156
+ ROOT_SLOT = T.let("combobox-empty", String)
157
+
158
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
159
+
160
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
161
+
162
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
163
+ COMBINATIONS = T.let({
164
+ {} => "hidden w-full justify-center py-2 text-center text-sm text-muted-foreground group-data-empty/combobox-content:flex"
165
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
166
+
167
+ SLOTS = T.let([
168
+ { name: "combobox-empty", tag: "ComboboxPrimitive.Empty", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
169
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
170
+
171
+ extend T::Sig
172
+
173
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
174
+ module_function def combination(options)
175
+ COMBINATIONS.fetch(options)
176
+ end
177
+ end
178
+ module Group
179
+ ROOT_SLOT = T.let("combobox-group", String)
180
+
181
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
182
+
183
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
184
+
185
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
186
+ COMBINATIONS = T.let({
187
+ {} => ""
188
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
189
+
190
+ SLOTS = T.let([
191
+ { name: "combobox-group", tag: "ComboboxPrimitive.Group", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
192
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
193
+
194
+ extend T::Sig
195
+
196
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
197
+ module_function def combination(options)
198
+ COMBINATIONS.fetch(options)
199
+ end
200
+ end
201
+ module Input
202
+ ROOT_SLOT = T.let("", String)
203
+
204
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
205
+
206
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
207
+
208
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
209
+ COMBINATIONS = T.let({
210
+ {} => "w-auto"
211
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
212
+
213
+ SLOTS = T.let([
214
+ { name: "", tag: "InputGroup", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze,
215
+ { name: "input-group-button", tag: "InputGroupButton", static_attributes: { class: "group-has-data-[slot=combobox-clear]/input-group:hidden data-pressed:bg-transparent" }.freeze, dynamic_attributes: ["disabled", "render"].freeze }.freeze
216
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
217
+
218
+ extend T::Sig
219
+
220
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
221
+ module_function def combination(options)
222
+ COMBINATIONS.fetch(options)
223
+ end
224
+ end
225
+ module Item
226
+ ROOT_SLOT = T.let("combobox-item", String)
227
+
228
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
229
+
230
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
231
+
232
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
233
+ COMBINATIONS = T.let({
234
+ {} => "relative flex w-full cursor-default items-center gap-2 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none data-highlighted:bg-accent data-highlighted:text-accent-foreground not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
235
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
236
+
237
+ SLOTS = T.let([
238
+ { name: "combobox-item", tag: "ComboboxPrimitive.Item", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
239
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
240
+
241
+ extend T::Sig
242
+
243
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
244
+ module_function def combination(options)
245
+ COMBINATIONS.fetch(options)
246
+ end
247
+ end
248
+ module Label
249
+ ROOT_SLOT = T.let("combobox-label", String)
250
+
251
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
252
+
253
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
254
+
255
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
256
+ COMBINATIONS = T.let({
257
+ {} => "px-2 py-1.5 text-xs text-muted-foreground"
258
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
259
+
260
+ SLOTS = T.let([
261
+ { name: "combobox-label", tag: "ComboboxPrimitive.GroupLabel", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
262
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
263
+
264
+ extend T::Sig
265
+
266
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
267
+ module_function def combination(options)
268
+ COMBINATIONS.fetch(options)
269
+ end
270
+ end
271
+ module List
272
+ ROOT_SLOT = T.let("combobox-list", String)
273
+
274
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
275
+
276
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
277
+
278
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
279
+ COMBINATIONS = T.let({
280
+ {} => "no-scrollbar max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] scroll-py-1 overflow-y-auto overscroll-contain p-1 data-empty:p-0"
281
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
282
+
283
+ SLOTS = T.let([
284
+ { name: "combobox-list", tag: "ComboboxPrimitive.List", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
285
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
286
+
287
+ extend T::Sig
288
+
289
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
290
+ module_function def combination(options)
291
+ COMBINATIONS.fetch(options)
292
+ end
293
+ end
294
+ module Separator
295
+ ROOT_SLOT = T.let("combobox-separator", String)
296
+
297
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
298
+
299
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
300
+
301
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
302
+ COMBINATIONS = T.let({
303
+ {} => "-mx-1 my-1 h-px bg-border"
304
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
305
+
306
+ SLOTS = T.let([
307
+ { name: "combobox-separator", tag: "ComboboxPrimitive.Separator", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
308
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
309
+
310
+ extend T::Sig
311
+
312
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
313
+ module_function def combination(options)
314
+ COMBINATIONS.fetch(options)
315
+ end
316
+ end
317
+ module Trigger
318
+ ROOT_SLOT = T.let("combobox-trigger", String)
319
+
320
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
321
+
322
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
323
+
324
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
325
+ COMBINATIONS = T.let({
326
+ {} => "[&_svg:not([class*='size-'])]:size-4"
327
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
328
+
329
+ SLOTS = T.let([
330
+ { name: "combobox-trigger", tag: "ComboboxPrimitive.Trigger", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
331
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
332
+
333
+ extend T::Sig
334
+
335
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
336
+ module_function def combination(options)
337
+ COMBINATIONS.fetch(options)
338
+ end
339
+ end
340
+ module Value
341
+ ROOT_SLOT = T.let("combobox-value", String)
342
+
343
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
344
+ CLASSES_SLOT = T.let("", String)
345
+
346
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
347
+
348
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
349
+
350
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
351
+ COMBINATIONS = T.let({
352
+ {} => ""
353
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
354
+
355
+ SLOTS = T.let([
356
+ { name: "combobox-value", tag: "ComboboxPrimitive.Value", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
357
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
358
+
359
+ extend T::Sig
360
+
361
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
362
+ module_function def combination(options)
363
+ COMBINATIONS.fetch(options)
364
+ end
365
+ end
366
+ end
367
+ end
368
+ end
@@ -0,0 +1,222 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ # !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !!
5
+ # Source: shadcn/ui base-nova "command" (item sha256: 9a083cac77fc075f204bd9e1ccfbf2cf622e9a32e875c6281aeac165c7b57004)
6
+ # Regenerate with: rake shadcn:generate
7
+
8
+ module ShadcnViewComponents
9
+ module Contracts
10
+ module Command
11
+ ROOT_SLOT = T.let("command", 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 size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground"
20
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
21
+
22
+ SLOTS = T.let([
23
+ { name: "command", tag: "CommandPrimitive", 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 Dialog
33
+ ROOT_SLOT = T.let("", 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
+ {} => "top-1/3 translate-y-0 overflow-hidden rounded-xl! p-0"
42
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
43
+
44
+ SLOTS = T.let([
45
+ { name: "", tag: "Dialog", static_attributes: {}.freeze, dynamic_attributes: [].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 Empty
56
+ ROOT_SLOT = T.let("command-empty", 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
+ {} => "py-6 text-center text-sm"
65
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
66
+
67
+ SLOTS = T.let([
68
+ { name: "command-empty", tag: "CommandPrimitive.Empty", 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 Group
79
+ ROOT_SLOT = T.let("command-group", 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
+ {} => "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground"
88
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
89
+
90
+ SLOTS = T.let([
91
+ { name: "command-group", tag: "CommandPrimitive.Group", static_attributes: {}.freeze, dynamic_attributes: [].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 Input
102
+ ROOT_SLOT = T.let("command-input-wrapper", String)
103
+
104
+ # 契約クラスが属する要素の data-slot(ルートがラッパー構造の場合)
105
+ CLASSES_SLOT = T.let("command-input", 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
+ {} => "w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50"
114
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
115
+
116
+ SLOTS = T.let([
117
+ { name: "command-input-wrapper", tag: "div", static_attributes: { class: "p-1 pb-0" }.freeze, dynamic_attributes: [].freeze }.freeze,
118
+ { name: "command-input", tag: "CommandPrimitive.Input", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
119
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
120
+
121
+ extend T::Sig
122
+
123
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
124
+ module_function def combination(options)
125
+ COMBINATIONS.fetch(options)
126
+ end
127
+ end
128
+ module Item
129
+ ROOT_SLOT = T.let("command-item", String)
130
+
131
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
132
+
133
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
134
+
135
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
136
+ COMBINATIONS = T.let({
137
+ {} => "group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-selected:*:[svg]:text-foreground"
138
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
139
+
140
+ SLOTS = T.let([
141
+ { name: "command-item", tag: "CommandPrimitive.Item", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
142
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
143
+
144
+ extend T::Sig
145
+
146
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
147
+ module_function def combination(options)
148
+ COMBINATIONS.fetch(options)
149
+ end
150
+ end
151
+ module List
152
+ ROOT_SLOT = T.let("command-list", String)
153
+
154
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
155
+
156
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
157
+
158
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
159
+ COMBINATIONS = T.let({
160
+ {} => "no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none"
161
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
162
+
163
+ SLOTS = T.let([
164
+ { name: "command-list", tag: "CommandPrimitive.List", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
165
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
166
+
167
+ extend T::Sig
168
+
169
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
170
+ module_function def combination(options)
171
+ COMBINATIONS.fetch(options)
172
+ end
173
+ end
174
+ module Separator
175
+ ROOT_SLOT = T.let("command-separator", String)
176
+
177
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
178
+
179
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
180
+
181
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
182
+ COMBINATIONS = T.let({
183
+ {} => "-mx-1 h-px bg-border"
184
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
185
+
186
+ SLOTS = T.let([
187
+ { name: "command-separator", tag: "CommandPrimitive.Separator", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
188
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
189
+
190
+ extend T::Sig
191
+
192
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
193
+ module_function def combination(options)
194
+ COMBINATIONS.fetch(options)
195
+ end
196
+ end
197
+ module Shortcut
198
+ ROOT_SLOT = T.let("command-shortcut", String)
199
+
200
+ DEFAULTS = T.let({}.freeze, T::Hash[Symbol, Symbol])
201
+
202
+ VARIANTS = T.let({}.freeze, T::Hash[Symbol, T::Array[Symbol]])
203
+
204
+ # キーはソート済みpropペア。値は事前解決済みの最終クラス文字列
205
+ COMBINATIONS = T.let({
206
+ {} => "ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground"
207
+ }.freeze, T::Hash[T::Hash[Symbol, Symbol], String])
208
+
209
+ SLOTS = T.let([
210
+ { name: "command-shortcut", tag: "span", static_attributes: {}.freeze, dynamic_attributes: [].freeze }.freeze
211
+ ].freeze, T::Array[T::Hash[Symbol, T.untyped]])
212
+
213
+ extend T::Sig
214
+
215
+ sig { params(options: T::Hash[Symbol, Symbol]).returns(String) }
216
+ module_function def combination(options)
217
+ COMBINATIONS.fetch(options)
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end