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,766 @@
1
+ /* !! AUTO-GENERATED by tools/extractor — DO NOT EDIT !! */
2
+ /* Source: shadcn/ui base-nova (manifest: vendor/shadcn/manifest.json) */
3
+
4
+ /* (1) ダークモード変換: クラスベース(.dark) */
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ /* (2) semanticトークン(:root = light、.dark = dark): upstream cssVars の統合 */
8
+ :root {
9
+ --radius: 0.625rem;
10
+ --accent: oklch(0.97 0 0);
11
+ --accent-foreground: oklch(0.205 0 0);
12
+ --background: oklch(1 0 0);
13
+ --border: oklch(0.922 0 0);
14
+ --card: oklch(1 0 0);
15
+ --card-foreground: oklch(0.145 0 0);
16
+ --chart-1: oklch(0.87 0 0);
17
+ --chart-2: oklch(0.556 0 0);
18
+ --chart-3: oklch(0.439 0 0);
19
+ --chart-4: oklch(0.371 0 0);
20
+ --chart-5: oklch(0.269 0 0);
21
+ --destructive: oklch(0.577 0.245 27.325);
22
+ --foreground: oklch(0.145 0 0);
23
+ --input: oklch(0.922 0 0);
24
+ --muted: oklch(0.97 0 0);
25
+ --muted-foreground: oklch(0.556 0 0);
26
+ --popover: oklch(1 0 0);
27
+ --popover-foreground: oklch(0.145 0 0);
28
+ --primary: oklch(0.205 0 0);
29
+ --primary-foreground: oklch(0.985 0 0);
30
+ --ring: oklch(0.708 0 0);
31
+ --secondary: oklch(0.97 0 0);
32
+ --secondary-foreground: oklch(0.205 0 0);
33
+ --sidebar: oklch(0.985 0 0);
34
+ --sidebar-accent: oklch(0.97 0 0);
35
+ --sidebar-accent-foreground: oklch(0.205 0 0);
36
+ --sidebar-border: oklch(0.922 0 0);
37
+ --sidebar-foreground: oklch(0.145 0 0);
38
+ --sidebar-primary: oklch(0.205 0 0);
39
+ --sidebar-primary-foreground: oklch(0.985 0 0);
40
+ --sidebar-ring: oklch(0.708 0 0);
41
+ }
42
+ .dark {
43
+ --accent: oklch(0.269 0 0);
44
+ --accent-foreground: oklch(0.985 0 0);
45
+ --background: oklch(0.145 0 0);
46
+ --border: oklch(1 0 0 / 10%);
47
+ --card: oklch(0.205 0 0);
48
+ --card-foreground: oklch(0.985 0 0);
49
+ --chart-1: oklch(0.87 0 0);
50
+ --chart-2: oklch(0.556 0 0);
51
+ --chart-3: oklch(0.439 0 0);
52
+ --chart-4: oklch(0.371 0 0);
53
+ --chart-5: oklch(0.269 0 0);
54
+ --destructive: oklch(0.704 0.191 22.216);
55
+ --foreground: oklch(0.985 0 0);
56
+ --input: oklch(1 0 0 / 15%);
57
+ --muted: oklch(0.269 0 0);
58
+ --muted-foreground: oklch(0.708 0 0);
59
+ --popover: oklch(0.205 0 0);
60
+ --popover-foreground: oklch(0.985 0 0);
61
+ --primary: oklch(0.922 0 0);
62
+ --primary-foreground: oklch(0.205 0 0);
63
+ --ring: oklch(0.556 0 0);
64
+ --secondary: oklch(0.269 0 0);
65
+ --secondary-foreground: oklch(0.985 0 0);
66
+ --sidebar: oklch(0.205 0 0);
67
+ --sidebar-accent: oklch(0.269 0 0);
68
+ --sidebar-accent-foreground: oklch(0.985 0 0);
69
+ --sidebar-border: oklch(1 0 0 / 10%);
70
+ --sidebar-foreground: oklch(0.985 0 0);
71
+ --sidebar-primary: oklch(0.488 0.243 264.376);
72
+ --sidebar-primary-foreground: oklch(0.985 0 0);
73
+ --sidebar-ring: oklch(0.556 0 0);
74
+ }
75
+
76
+ @theme inline {
77
+ --color-accent: var(--accent);
78
+ --color-accent-foreground: var(--accent-foreground);
79
+ --color-background: var(--background);
80
+ --color-border: var(--border);
81
+ --color-card: var(--card);
82
+ --color-card-foreground: var(--card-foreground);
83
+ --color-chart-1: var(--chart-1);
84
+ --color-chart-2: var(--chart-2);
85
+ --color-chart-3: var(--chart-3);
86
+ --color-chart-4: var(--chart-4);
87
+ --color-chart-5: var(--chart-5);
88
+ --color-destructive: var(--destructive);
89
+ --color-foreground: var(--foreground);
90
+ --color-input: var(--input);
91
+ --color-muted: var(--muted);
92
+ --color-muted-foreground: var(--muted-foreground);
93
+ --color-popover: var(--popover);
94
+ --color-popover-foreground: var(--popover-foreground);
95
+ --color-primary: var(--primary);
96
+ --color-primary-foreground: var(--primary-foreground);
97
+ --color-ring: var(--ring);
98
+ --color-secondary: var(--secondary);
99
+ --color-secondary-foreground: var(--secondary-foreground);
100
+ --color-sidebar: var(--sidebar);
101
+ --color-sidebar-accent: var(--sidebar-accent);
102
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
103
+ --color-sidebar-border: var(--sidebar-border);
104
+ --color-sidebar-foreground: var(--sidebar-foreground);
105
+ --color-sidebar-primary: var(--sidebar-primary);
106
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
107
+ --color-sidebar-ring: var(--sidebar-ring);
108
+ --radius-sm: calc(var(--radius) - 4px);
109
+ --radius-md: calc(var(--radius) - 2px);
110
+ --radius-lg: var(--radius);
111
+ --radius-xl: calc(var(--radius) + 4px);
112
+ }
113
+ /* npm shadcn パッケージ同梱 tailwind.css の verbatim取り込み。upstream 実アプリでは
114
+ `@import "shadcn/tailwind.css"` で読まれる定義群(data-* カスタムバリアント、
115
+ accordion キーフレーム、no-scrollbar、scroll-fade、shimmer 等)。手書きで断片を
116
+ 再現せず vendor スナップショットから丸ごと取り込む(欠落=描画差異になるため) */
117
+ @theme inline {
118
+ @keyframes accordion-down {
119
+ from {
120
+ height: 0;
121
+ }
122
+ to {
123
+ height: var(
124
+ --radix-accordion-content-height,
125
+ var(--accordion-panel-height, auto)
126
+ );
127
+ }
128
+ }
129
+
130
+ @keyframes accordion-up {
131
+ from {
132
+ height: var(
133
+ --radix-accordion-content-height,
134
+ var(--accordion-panel-height, auto)
135
+ );
136
+ }
137
+ to {
138
+ height: 0;
139
+ }
140
+ }
141
+ }
142
+
143
+ /* Custom variants */
144
+ @custom-variant data-open {
145
+ &:where([data-state="open"]),
146
+ &:where([data-open]:not([data-open="false"])) {
147
+ @slot;
148
+ }
149
+ }
150
+
151
+ @custom-variant data-closed {
152
+ &:where([data-state="closed"]),
153
+ &:where([data-closed]:not([data-closed="false"])) {
154
+ @slot;
155
+ }
156
+ }
157
+
158
+ @custom-variant data-checked {
159
+ &:where([data-state="checked"]),
160
+ &:where([data-checked]:not([data-checked="false"])) {
161
+ @slot;
162
+ }
163
+ }
164
+
165
+ @custom-variant data-unchecked {
166
+ &:where([data-state="unchecked"]),
167
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
168
+ @slot;
169
+ }
170
+ }
171
+
172
+ @custom-variant data-selected {
173
+ &:where([data-selected="true"]) {
174
+ @slot;
175
+ }
176
+ }
177
+
178
+ @custom-variant data-disabled {
179
+ &:where([data-disabled="true"]),
180
+ &:where([data-disabled]:not([data-disabled="false"])) {
181
+ @slot;
182
+ }
183
+ }
184
+
185
+ @custom-variant data-active {
186
+ &:where([data-state="active"]),
187
+ &:where([data-active]:not([data-active="false"])) {
188
+ @slot;
189
+ }
190
+ }
191
+
192
+ @custom-variant data-horizontal {
193
+ &:where([data-orientation="horizontal"]) {
194
+ @slot;
195
+ }
196
+ }
197
+
198
+ @custom-variant data-vertical {
199
+ &:where([data-orientation="vertical"]) {
200
+ @slot;
201
+ }
202
+ }
203
+
204
+ @utility no-scrollbar {
205
+ -ms-overflow-style: none;
206
+ scrollbar-width: none;
207
+
208
+ &::-webkit-scrollbar {
209
+ display: none;
210
+ }
211
+ }
212
+
213
+ /* scroll-fade */
214
+ @property --scroll-fade-t {
215
+ syntax: "<length-percentage>";
216
+ inherits: false;
217
+ initial-value: 0px;
218
+ }
219
+ @property --scroll-fade-b {
220
+ syntax: "<length-percentage>";
221
+ inherits: false;
222
+ initial-value: 0px;
223
+ }
224
+ @property --scroll-fade-s {
225
+ syntax: "<length-percentage>";
226
+ inherits: false;
227
+ initial-value: 0px;
228
+ }
229
+ @property --scroll-fade-e {
230
+ syntax: "<length-percentage>";
231
+ inherits: false;
232
+ initial-value: 0px;
233
+ }
234
+ @property --scroll-fade-mask {
235
+ syntax: "*";
236
+ inherits: false;
237
+ }
238
+
239
+ @theme inline {
240
+ @keyframes scroll-fade-reveal-t {
241
+ from {
242
+ --scroll-fade-t: 0px;
243
+ }
244
+ to {
245
+ --scroll-fade-t: var(--_scroll-fade-size-t, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
246
+ }
247
+ }
248
+ @keyframes scroll-fade-reveal-b {
249
+ from {
250
+ --scroll-fade-b: var(--_scroll-fade-size-b, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
251
+ }
252
+ to {
253
+ --scroll-fade-b: 0px;
254
+ }
255
+ }
256
+ @keyframes scroll-fade-reveal-s {
257
+ from {
258
+ --scroll-fade-s: 0px;
259
+ }
260
+ to {
261
+ --scroll-fade-s: var(--_scroll-fade-size-s, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
262
+ }
263
+ }
264
+ @keyframes scroll-fade-reveal-e {
265
+ from {
266
+ --scroll-fade-e: var(--_scroll-fade-size-e, var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10))));
267
+ }
268
+ to {
269
+ --scroll-fade-e: 0px;
270
+ }
271
+ }
272
+ }
273
+
274
+ @utility scroll-fade {
275
+ --_scroll-fade-size-t: var(
276
+ --scroll-fade-t-size,
277
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
278
+ );
279
+ --_scroll-fade-size-b: var(
280
+ --scroll-fade-b-size,
281
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
282
+ );
283
+ --scroll-fade-block: linear-gradient(
284
+ to bottom,
285
+ transparent 0,
286
+ #000 var(--scroll-fade-t, 0px),
287
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
288
+ transparent 100%
289
+ );
290
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
291
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
292
+ -webkit-mask-composite: source-in;
293
+ mask-composite: intersect;
294
+ -webkit-mask-repeat: no-repeat;
295
+ mask-repeat: no-repeat;
296
+
297
+ @supports (animation-timeline: scroll()) {
298
+ animation:
299
+ scroll-fade-reveal-t 1ms ease-in-out,
300
+ scroll-fade-reveal-b 1ms ease-in-out;
301
+ animation-timeline: scroll(self y), scroll(self y);
302
+ animation-range:
303
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
304
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
305
+ animation-fill-mode: both;
306
+ }
307
+
308
+ @supports not (animation-timeline: scroll()) {
309
+ --scroll-fade-t: var(--_scroll-fade-size-t);
310
+ --scroll-fade-b: var(--_scroll-fade-size-b);
311
+ }
312
+ }
313
+
314
+ @utility scroll-fade-y {
315
+ --_scroll-fade-size-t: var(
316
+ --scroll-fade-t-size,
317
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
318
+ );
319
+ --_scroll-fade-size-b: var(
320
+ --scroll-fade-b-size,
321
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
322
+ );
323
+ --scroll-fade-block: linear-gradient(
324
+ to bottom,
325
+ transparent 0,
326
+ #000 var(--scroll-fade-t, 0px),
327
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
328
+ transparent 100%
329
+ );
330
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
331
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-block));
332
+ -webkit-mask-composite: source-in;
333
+ mask-composite: intersect;
334
+ -webkit-mask-repeat: no-repeat;
335
+ mask-repeat: no-repeat;
336
+
337
+ @supports (animation-timeline: scroll()) {
338
+ animation:
339
+ scroll-fade-reveal-t 1ms ease-in-out,
340
+ scroll-fade-reveal-b 1ms ease-in-out;
341
+ animation-timeline: scroll(self y), scroll(self y);
342
+ animation-range:
343
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
344
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
345
+ animation-fill-mode: both;
346
+ }
347
+
348
+ @supports not (animation-timeline: scroll()) {
349
+ --scroll-fade-t: var(--_scroll-fade-size-t);
350
+ --scroll-fade-b: var(--_scroll-fade-size-b);
351
+ }
352
+ }
353
+
354
+ @utility scroll-fade-x {
355
+ --_scroll-fade-size-s: var(
356
+ --scroll-fade-s-size,
357
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
358
+ );
359
+ --_scroll-fade-size-e: var(
360
+ --scroll-fade-e-size,
361
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
362
+ );
363
+ --scroll-fade-inline: linear-gradient(
364
+ to right,
365
+ transparent 0,
366
+ #000 var(--scroll-fade-s, 0px),
367
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
368
+ transparent 100%
369
+ );
370
+ &:where([dir="rtl"], [dir="rtl"] *) {
371
+ --scroll-fade-inline: linear-gradient(
372
+ to left,
373
+ transparent 0,
374
+ #000 var(--scroll-fade-s, 0px),
375
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
376
+ transparent 100%
377
+ );
378
+ }
379
+ -webkit-mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
380
+ mask-image: var(--scroll-fade-mask, var(--scroll-fade-inline));
381
+ -webkit-mask-composite: source-in;
382
+ mask-composite: intersect;
383
+ -webkit-mask-repeat: no-repeat;
384
+ mask-repeat: no-repeat;
385
+
386
+ @supports (animation-timeline: scroll()) {
387
+ animation:
388
+ scroll-fade-reveal-s 1ms ease-in-out,
389
+ scroll-fade-reveal-e 1ms ease-in-out;
390
+ animation-timeline: scroll(self inline), scroll(self inline);
391
+ animation-range:
392
+ 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24)),
393
+ calc(100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))) 100%;
394
+ animation-fill-mode: both;
395
+ }
396
+
397
+ @supports not (animation-timeline: scroll()) {
398
+ --scroll-fade-s: var(--_scroll-fade-size-s);
399
+ --scroll-fade-e: var(--_scroll-fade-size-e);
400
+ }
401
+ }
402
+
403
+ @utility scroll-fade-t {
404
+ --_scroll-fade-size-t: var(
405
+ --scroll-fade-t-size,
406
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
407
+ );
408
+ --scroll-fade-mask: linear-gradient(
409
+ to bottom,
410
+ transparent 0,
411
+ #000 var(--scroll-fade-t, 0px),
412
+ #000 100%
413
+ );
414
+ -webkit-mask-image: var(--scroll-fade-mask);
415
+ mask-image: var(--scroll-fade-mask);
416
+ -webkit-mask-composite: source-in;
417
+ mask-composite: intersect;
418
+ -webkit-mask-repeat: no-repeat;
419
+ mask-repeat: no-repeat;
420
+
421
+ @supports (animation-timeline: scroll()) {
422
+ animation: scroll-fade-reveal-t 1ms ease-in-out;
423
+ animation-timeline: scroll(self y);
424
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
425
+ animation-fill-mode: both;
426
+ }
427
+
428
+ @supports not (animation-timeline: scroll()) {
429
+ --scroll-fade-t: var(--_scroll-fade-size-t);
430
+ }
431
+ }
432
+
433
+ @utility scroll-fade-b {
434
+ --_scroll-fade-size-b: var(
435
+ --scroll-fade-b-size,
436
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
437
+ );
438
+ --scroll-fade-mask: linear-gradient(
439
+ to bottom,
440
+ #000 0,
441
+ #000 calc(100% - var(--scroll-fade-b, 0px)),
442
+ transparent 100%
443
+ );
444
+ -webkit-mask-image: var(--scroll-fade-mask);
445
+ mask-image: var(--scroll-fade-mask);
446
+ -webkit-mask-composite: source-in;
447
+ mask-composite: intersect;
448
+ -webkit-mask-repeat: no-repeat;
449
+ mask-repeat: no-repeat;
450
+
451
+ @supports (animation-timeline: scroll()) {
452
+ animation: scroll-fade-reveal-b 1ms ease-in-out;
453
+ animation-timeline: scroll(self y);
454
+ animation-range: calc(
455
+ 100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))
456
+ )
457
+ 100%;
458
+ animation-fill-mode: both;
459
+ }
460
+
461
+ @supports not (animation-timeline: scroll()) {
462
+ --scroll-fade-b: var(--_scroll-fade-size-b);
463
+ }
464
+ }
465
+
466
+ @utility scroll-fade-l {
467
+ --_scroll-fade-size-s: var(
468
+ --scroll-fade-s-size,
469
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
470
+ );
471
+ --scroll-fade-mask: linear-gradient(
472
+ to right,
473
+ transparent 0,
474
+ #000 var(--scroll-fade-s, 0px),
475
+ #000 100%
476
+ );
477
+ -webkit-mask-image: var(--scroll-fade-mask);
478
+ mask-image: var(--scroll-fade-mask);
479
+ -webkit-mask-composite: source-in;
480
+ mask-composite: intersect;
481
+ -webkit-mask-repeat: no-repeat;
482
+ mask-repeat: no-repeat;
483
+
484
+ @supports (animation-timeline: scroll()) {
485
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
486
+ animation-timeline: scroll(self x);
487
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
488
+ animation-fill-mode: both;
489
+ }
490
+
491
+ @supports not (animation-timeline: scroll()) {
492
+ --scroll-fade-s: var(--_scroll-fade-size-s);
493
+ }
494
+ }
495
+
496
+ @utility scroll-fade-r {
497
+ --_scroll-fade-size-e: var(
498
+ --scroll-fade-e-size,
499
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
500
+ );
501
+ --scroll-fade-mask: linear-gradient(
502
+ to right,
503
+ #000 0,
504
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
505
+ transparent 100%
506
+ );
507
+ -webkit-mask-image: var(--scroll-fade-mask);
508
+ mask-image: var(--scroll-fade-mask);
509
+ -webkit-mask-composite: source-in;
510
+ mask-composite: intersect;
511
+ -webkit-mask-repeat: no-repeat;
512
+ mask-repeat: no-repeat;
513
+
514
+ @supports (animation-timeline: scroll()) {
515
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
516
+ animation-timeline: scroll(self x);
517
+ animation-range: calc(
518
+ 100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))
519
+ )
520
+ 100%;
521
+ animation-fill-mode: both;
522
+ }
523
+
524
+ @supports not (animation-timeline: scroll()) {
525
+ --scroll-fade-e: var(--_scroll-fade-size-e);
526
+ }
527
+ }
528
+
529
+ @utility scroll-fade-s {
530
+ --_scroll-fade-size-s: var(
531
+ --scroll-fade-s-size,
532
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
533
+ );
534
+ --scroll-fade-mask: linear-gradient(
535
+ to right,
536
+ transparent 0,
537
+ #000 var(--scroll-fade-s, 0px),
538
+ #000 100%
539
+ );
540
+ &:where([dir="rtl"], [dir="rtl"] *) {
541
+ --scroll-fade-mask: linear-gradient(
542
+ to left,
543
+ transparent 0,
544
+ #000 var(--scroll-fade-s, 0px),
545
+ #000 100%
546
+ );
547
+ }
548
+ -webkit-mask-image: var(--scroll-fade-mask);
549
+ mask-image: var(--scroll-fade-mask);
550
+ -webkit-mask-composite: source-in;
551
+ mask-composite: intersect;
552
+ -webkit-mask-repeat: no-repeat;
553
+ mask-repeat: no-repeat;
554
+
555
+ @supports (animation-timeline: scroll()) {
556
+ animation: scroll-fade-reveal-s 1ms ease-in-out;
557
+ animation-timeline: scroll(self inline);
558
+ animation-range: 0 var(--scroll-fade-reveal, calc(var(--spacing) * 24));
559
+ animation-fill-mode: both;
560
+ }
561
+
562
+ @supports not (animation-timeline: scroll()) {
563
+ --scroll-fade-s: var(--_scroll-fade-size-s);
564
+ }
565
+ }
566
+
567
+ @utility scroll-fade-e {
568
+ --_scroll-fade-size-e: var(
569
+ --scroll-fade-e-size,
570
+ var(--scroll-fade-size, min(12%, calc(var(--spacing) * 10)))
571
+ );
572
+ --scroll-fade-mask: linear-gradient(
573
+ to right,
574
+ #000 0,
575
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
576
+ transparent 100%
577
+ );
578
+ &:where([dir="rtl"], [dir="rtl"] *) {
579
+ --scroll-fade-mask: linear-gradient(
580
+ to left,
581
+ #000 0,
582
+ #000 calc(100% - var(--scroll-fade-e, 0px)),
583
+ transparent 100%
584
+ );
585
+ }
586
+ -webkit-mask-image: var(--scroll-fade-mask);
587
+ mask-image: var(--scroll-fade-mask);
588
+ -webkit-mask-composite: source-in;
589
+ mask-composite: intersect;
590
+ -webkit-mask-repeat: no-repeat;
591
+ mask-repeat: no-repeat;
592
+
593
+ @supports (animation-timeline: scroll()) {
594
+ animation: scroll-fade-reveal-e 1ms ease-in-out;
595
+ animation-timeline: scroll(self inline);
596
+ animation-range: calc(
597
+ 100% - var(--scroll-fade-reveal, calc(var(--spacing) * 24))
598
+ )
599
+ 100%;
600
+ animation-fill-mode: both;
601
+ }
602
+
603
+ @supports not (animation-timeline: scroll()) {
604
+ --scroll-fade-e: var(--_scroll-fade-size-e);
605
+ }
606
+ }
607
+
608
+ @utility scroll-fade-* {
609
+ --scroll-fade-size: calc(var(--spacing) * --value(integer));
610
+ --scroll-fade-size: --value([length], [percentage]);
611
+ }
612
+
613
+ @utility scroll-fade-t-* {
614
+ --scroll-fade-t-size: calc(var(--spacing) * --value(integer));
615
+ --scroll-fade-t-size: --value([length], [percentage]);
616
+ }
617
+
618
+ @utility scroll-fade-b-* {
619
+ --scroll-fade-b-size: calc(var(--spacing) * --value(integer));
620
+ --scroll-fade-b-size: --value([length], [percentage]);
621
+ }
622
+
623
+ @utility scroll-fade-s-* {
624
+ --scroll-fade-s-size: calc(var(--spacing) * --value(integer));
625
+ --scroll-fade-s-size: --value([length], [percentage]);
626
+ }
627
+
628
+ @utility scroll-fade-e-* {
629
+ --scroll-fade-e-size: calc(var(--spacing) * --value(integer));
630
+ --scroll-fade-e-size: --value([length], [percentage]);
631
+ }
632
+
633
+ @utility scroll-fade-none {
634
+ --scroll-fade-mask: none;
635
+ }
636
+
637
+ /* shimmer */
638
+ @property --shimmer-angle {
639
+ syntax: "<angle>";
640
+ inherits: true;
641
+ initial-value: 20deg;
642
+ }
643
+ @property --shimmer-image {
644
+ syntax: "*";
645
+ inherits: false;
646
+ }
647
+ @property --shimmer-text-fill {
648
+ syntax: "*";
649
+ inherits: false;
650
+ }
651
+
652
+ @theme inline {
653
+ @keyframes tw-shimmer {
654
+ from {
655
+ background-position: 100% 0;
656
+ }
657
+ to {
658
+ background-position: 0 0;
659
+ }
660
+ }
661
+ }
662
+
663
+ @utility shimmer {
664
+ --_spread: var(--shimmer-spread, calc(3ch + 40px));
665
+ --_base: currentColor;
666
+ --_highlight: var(
667
+ --shimmer-color,
668
+ oklch(from currentColor l c h / calc(alpha* 0.2))
669
+ );
670
+
671
+ background-image: var(
672
+ --shimmer-image,
673
+ linear-gradient(
674
+ calc(90deg + var(--shimmer-angle)),
675
+ var(--_base) calc(50% - var(--_spread)),
676
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%)
677
+ calc(50% - var(--_spread) * 0.5),
678
+ var(--_highlight) 50%,
679
+ color-mix(in oklch, var(--_highlight), var(--_base) 50%)
680
+ calc(50% + var(--_spread) * 0.5),
681
+ var(--_base) calc(50% + var(--_spread))
682
+ )
683
+ );
684
+ background-repeat: no-repeat;
685
+ background-size: calc(200% + var(--_spread) * 2) 100%;
686
+ background-position: 0 0;
687
+ background-clip: text;
688
+ -webkit-background-clip: text;
689
+ -webkit-text-fill-color: var(--shimmer-text-fill, transparent);
690
+ animation: tw-shimmer var(--shimmer-duration, 2s) linear infinite;
691
+
692
+ @variant dark {
693
+ --_highlight: var(
694
+ --shimmer-color,
695
+ oklch(from currentColor max(0.8, calc(l + 0.4)) c h / calc(alpha + 0.4))
696
+ );
697
+ }
698
+
699
+ &:where([dir="rtl"], [dir="rtl"] *) {
700
+ animation-direction: reverse;
701
+ }
702
+ }
703
+
704
+ @utility shimmer-once {
705
+ animation-iteration-count: 1;
706
+ }
707
+
708
+ @utility shimmer-reverse {
709
+ animation-direction: reverse;
710
+ }
711
+
712
+ @utility shimmer-none {
713
+ --shimmer-image: none;
714
+ --shimmer-text-fill: currentColor;
715
+ }
716
+
717
+ @utility shimmer-color-* {
718
+ --shimmer-color: --value(--color, [color]);
719
+ --shimmer-color: color-mix(
720
+ in oklch,
721
+ --value(--color, [color]) calc(--modifier(integer) * 1%),
722
+ transparent
723
+ );
724
+ }
725
+
726
+ @utility shimmer-duration-* {
727
+ --shimmer-duration: calc(--value(integer) * 1ms);
728
+ }
729
+
730
+ @utility shimmer-spread-* {
731
+ --shimmer-spread: calc(var(--spacing) * --value(integer));
732
+ --shimmer-spread: --value([length], [percentage]);
733
+ }
734
+
735
+ @utility shimmer-angle-* {
736
+ --shimmer-angle: calc(--value(integer) * 1deg);
737
+ }
738
+
739
+ @media (prefers-reduced-motion: reduce) {
740
+ .shimmer {
741
+ animation: none;
742
+ background-image: none;
743
+ -webkit-text-fill-color: currentColor;
744
+ }
745
+ }
746
+
747
+ /* (5) 実行時規則: 閉じた dialog/popover はユーティリティでも可視化しない */
748
+ dialog:not([open]):not(:popover-open),
749
+ [popover]:not(:popover-open):not(dialog[open]) {
750
+ display: none;
751
+ }
752
+
753
+ /* (5) 実行時規則: details 移植コンポーネントの summary マーカーは upstream に無い */
754
+ summary[data-slot='collapsible-trigger']::marker {
755
+ content: none;
756
+ }
757
+
758
+ /* (6) ベースレイヤー: 既定のボーダー色と身体の配色(upstream r/styles 相当) */
759
+ @layer base {
760
+ * {
761
+ @apply border-border outline-ring/50;
762
+ }
763
+ body {
764
+ @apply bg-background text-foreground;
765
+ }
766
+ }