alchemy_cms 8.2.7 → 8.3.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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -1
  3. data/app/assets/builds/alchemy/admin.css +1 -1
  4. data/app/assets/builds/alchemy/alchemy_admin.min.js +1 -1
  5. data/app/assets/builds/alchemy/alchemy_admin.min.js.map +1 -1
  6. data/app/assets/builds/alchemy/dark-theme.css +1 -1
  7. data/app/assets/builds/alchemy/light-theme.css +1 -1
  8. data/app/assets/builds/alchemy/preview.min.js +1 -1
  9. data/app/assets/builds/alchemy/theme.css +1 -1
  10. data/app/assets/builds/alchemy/welcome.css +1 -1
  11. data/app/assets/builds/tinymce/skins/content/alchemy/content.min.css +1 -1
  12. data/app/assets/builds/tinymce/skins/content/alchemy-dark/content.min.css +1 -1
  13. data/app/assets/builds/tinymce/skins/ui/alchemy/skin.min.css +1 -1
  14. data/app/assets/builds/tinymce/skins/ui/alchemy-dark/skin.min.css +1 -1
  15. data/app/assets/images/alchemy/admin/logo.svg +27 -0
  16. data/app/assets/images/alchemy/icons-sprite.svg +1 -1
  17. data/app/components/alchemy/admin/dashboard/widget.rb +40 -0
  18. data/app/components/alchemy/admin/dashboard/widgets/attachment_counts.rb +17 -0
  19. data/app/components/alchemy/admin/dashboard/widgets/element_usage.rb +37 -0
  20. data/app/components/alchemy/admin/dashboard/widgets/greeting.html.erb +13 -0
  21. data/app/components/alchemy/admin/dashboard/widgets/greeting.rb +21 -0
  22. data/app/components/alchemy/admin/dashboard/widgets/locked_pages.html.erb +54 -0
  23. data/app/components/alchemy/admin/dashboard/widgets/locked_pages.rb +20 -0
  24. data/app/components/alchemy/admin/dashboard/widgets/online_users.html.erb +22 -0
  25. data/app/components/alchemy/admin/dashboard/widgets/online_users.rb +19 -0
  26. data/app/components/alchemy/admin/dashboard/widgets/page_counts.rb +23 -0
  27. data/app/components/alchemy/admin/dashboard/widgets/page_usage.rb +46 -0
  28. data/app/components/alchemy/admin/dashboard/widgets/picture_counts.rb +17 -0
  29. data/app/components/alchemy/admin/dashboard/widgets/recent_pages.html.erb +41 -0
  30. data/app/components/alchemy/admin/dashboard/widgets/recent_pages.rb +16 -0
  31. data/app/components/alchemy/admin/dashboard/widgets/sites.html.erb +29 -0
  32. data/app/components/alchemy/admin/dashboard/widgets/sites.rb +15 -0
  33. data/app/components/alchemy/admin/dashboard/widgets/stat_widget.html.erb +23 -0
  34. data/app/components/alchemy/admin/dashboard/widgets/stat_widget.rb +19 -0
  35. data/app/components/alchemy/admin/dashboard/widgets/system_info.html.erb +32 -0
  36. data/app/components/alchemy/admin/dashboard/widgets/system_info.rb +37 -0
  37. data/app/components/alchemy/admin/dashboard/widgets/usage_widget.html.erb +42 -0
  38. data/app/components/alchemy/admin/dashboard/widgets/usage_widget.rb +66 -0
  39. data/app/components/alchemy/admin/dashboard/widgets/user_counts.rb +25 -0
  40. data/app/components/alchemy/admin/element_editor.html.erb +27 -20
  41. data/app/components/alchemy/admin/element_schedule_timestamps.rb +33 -0
  42. data/app/components/alchemy/admin/element_select.rb +4 -3
  43. data/app/components/alchemy/admin/page_node.html.erb +1 -20
  44. data/app/components/alchemy/admin/page_publication_fields.html.erb +30 -0
  45. data/app/components/alchemy/admin/page_publication_fields.rb +18 -0
  46. data/app/components/alchemy/admin/page_status_indicators.html.erb +29 -0
  47. data/app/components/alchemy/admin/page_status_indicators.rb +9 -0
  48. data/app/components/alchemy/admin/publish_element_button.html.erb +12 -4
  49. data/app/components/alchemy/ingredients/headline_editor.rb +1 -1
  50. data/app/controllers/alchemy/admin/dashboard/widgets_controller.rb +21 -0
  51. data/app/controllers/alchemy/admin/dashboard_controller.rb +3 -12
  52. data/app/controllers/alchemy/pages_controller.rb +5 -4
  53. data/app/helpers/alchemy/elements_block_helper.rb +1 -0
  54. data/app/javascript/alchemy_admin/components/auto_submit.js +15 -9
  55. data/app/javascript/alchemy_admin/components/char_counter.js +17 -7
  56. data/app/javascript/alchemy_admin/components/clipboard_button.js +2 -6
  57. data/app/javascript/alchemy_admin/components/color_select.js +13 -4
  58. data/app/javascript/alchemy_admin/components/datepicker.js +11 -14
  59. data/app/javascript/alchemy_admin/components/dialog_link.js +5 -2
  60. data/app/javascript/alchemy_admin/components/element_editor/delete_element_button.js +6 -3
  61. data/app/javascript/alchemy_admin/components/element_editor.js +45 -28
  62. data/app/javascript/alchemy_admin/components/element_select.js +7 -4
  63. data/app/javascript/alchemy_admin/components/elements_window.js +38 -31
  64. data/app/javascript/alchemy_admin/components/elements_window_handle.js +7 -3
  65. data/app/javascript/alchemy_admin/components/file_editor.js +5 -2
  66. data/app/javascript/alchemy_admin/components/ingredient_group.js +6 -4
  67. data/app/javascript/alchemy_admin/components/link_buttons/link_button.js +1 -2
  68. data/app/javascript/alchemy_admin/components/link_buttons/unlink_button.js +1 -2
  69. data/app/javascript/alchemy_admin/components/link_buttons.js +6 -2
  70. data/app/javascript/alchemy_admin/components/list_filter.js +44 -29
  71. data/app/javascript/alchemy_admin/components/message.js +22 -15
  72. data/app/javascript/alchemy_admin/components/overlay.js +5 -7
  73. data/app/javascript/alchemy_admin/components/page_publication_fields.js +38 -25
  74. data/app/javascript/alchemy_admin/components/picture_description_select.js +5 -2
  75. data/app/javascript/alchemy_admin/components/picture_editor.js +5 -10
  76. data/app/javascript/alchemy_admin/components/picture_thumbnail.js +4 -5
  77. data/app/javascript/alchemy_admin/components/preview_window.js +5 -10
  78. data/app/javascript/alchemy_admin/components/publish_page_button.js +2 -5
  79. data/app/javascript/alchemy_admin/components/remote_select.js +53 -23
  80. data/app/javascript/alchemy_admin/components/select.js +169 -26
  81. data/app/javascript/alchemy_admin/components/sortable_elements.js +1 -1
  82. data/app/javascript/alchemy_admin/components/spinner.js +11 -11
  83. data/app/javascript/alchemy_admin/components/tags_autocomplete.js +9 -1
  84. data/app/javascript/alchemy_admin/components/tinymce.js +16 -22
  85. data/app/javascript/alchemy_admin/components/uploader/file_upload.js +48 -45
  86. data/app/javascript/alchemy_admin/components/uploader/progress.js +70 -84
  87. data/app/javascript/alchemy_admin/components/uploader.js +71 -46
  88. data/app/javascript/alchemy_admin/dialog.js +3 -0
  89. data/app/javascript/alchemy_admin/hotkeys.js +0 -18
  90. data/app/javascript/alchemy_admin/image_cropper.js +7 -9
  91. data/app/javascript/alchemy_admin/initializer.js +21 -0
  92. data/app/javascript/alchemy_admin/utils/dispatch_page_dirty_event.js +7 -0
  93. data/app/javascript/tinymce/plugins/alchemy_link/index.js +9 -0
  94. data/app/jobs/alchemy/base_job.rb +2 -2
  95. data/app/jobs/alchemy/invalidate_elements_cache_job.rb +33 -0
  96. data/app/models/alchemy/page/page_naming.rb +28 -5
  97. data/app/models/alchemy/page/page_natures.rb +7 -2
  98. data/app/models/alchemy/page/page_scopes.rb +2 -2
  99. data/app/models/alchemy/page/url_path.rb +7 -2
  100. data/app/models/alchemy/page.rb +2 -2
  101. data/app/models/alchemy/page_definition.rb +1 -0
  102. data/app/models/alchemy/permissions.rb +1 -1
  103. data/app/models/concerns/alchemy/relatable_resource.rb +8 -0
  104. data/app/services/alchemy/page_finder.rb +88 -0
  105. data/app/stylesheets/alchemy/_custom-properties.scss +6 -4
  106. data/app/stylesheets/alchemy/_mixins.scss +1 -7
  107. data/app/stylesheets/alchemy/_themes.scss +13 -1
  108. data/app/stylesheets/alchemy/admin/_tom-select.scss +240 -0
  109. data/app/stylesheets/alchemy/admin/archive.scss +0 -1
  110. data/app/stylesheets/alchemy/admin/base.scss +0 -19
  111. data/app/stylesheets/alchemy/admin/dashboard.scss +395 -28
  112. data/app/stylesheets/alchemy/admin/elements.scss +14 -17
  113. data/app/stylesheets/alchemy/admin/form_fields.scss +3 -3
  114. data/app/stylesheets/alchemy/admin/forms.scss +107 -93
  115. data/app/stylesheets/alchemy/admin/icons.scss +28 -0
  116. data/app/stylesheets/alchemy/admin/image_library.scss +20 -10
  117. data/app/stylesheets/alchemy/admin/navigation.scss +4 -1
  118. data/app/stylesheets/alchemy/admin/popover.scss +3 -5
  119. data/app/stylesheets/alchemy/admin/resource_info.scss +11 -17
  120. data/app/stylesheets/alchemy/admin/shoelace.scss +8 -0
  121. data/app/stylesheets/alchemy/admin/sitemap.scss +5 -0
  122. data/app/stylesheets/alchemy/admin/tables.scss +32 -3
  123. data/app/stylesheets/alchemy/admin/toolbar.scss +0 -1
  124. data/app/stylesheets/alchemy/admin.scss +1 -0
  125. data/app/stylesheets/tinymce/skins/ui/alchemy/skin.scss +0 -4
  126. data/app/stylesheets/tinymce/skins/ui/alchemy-dark/skin.scss +0 -4
  127. data/app/types/alchemy/wildcard_url_type.rb +48 -0
  128. data/app/views/alchemy/_menubar.html.erb +1 -5
  129. data/app/views/alchemy/admin/attachments/edit.html.erb +6 -3
  130. data/app/views/alchemy/admin/dashboard/_dashboard.html.erb +3 -2
  131. data/app/views/alchemy/admin/dashboard/_footer.html.erb +22 -0
  132. data/app/views/alchemy/admin/dashboard/_stats.html.erb +7 -0
  133. data/app/views/alchemy/admin/dashboard/_top.html.erb +4 -12
  134. data/app/views/alchemy/admin/dashboard/_widgets.html.erb +7 -0
  135. data/app/views/alchemy/admin/dashboard/index.html.erb +0 -17
  136. data/app/views/alchemy/admin/dashboard/info.html.erb +1 -62
  137. data/app/views/alchemy/admin/dashboard/widgets/show.html.erb +3 -0
  138. data/app/views/alchemy/admin/elements/_form.html.erb +2 -1
  139. data/app/views/alchemy/admin/elements/_schedule.html.erb +2 -15
  140. data/app/views/alchemy/admin/elements/_schedule_fields.html.erb +2 -0
  141. data/app/views/alchemy/admin/layoutpages/edit.html.erb +6 -3
  142. data/app/views/alchemy/admin/nodes/_page_nodes.html.erb +10 -8
  143. data/app/views/alchemy/admin/pages/_form.html.erb +25 -19
  144. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +2 -32
  145. data/app/views/alchemy/admin/pages/_table.html.erb +1 -18
  146. data/app/views/alchemy/admin/pages/configure.html.erb +2 -2
  147. data/app/views/alchemy/admin/pages/info.html.erb +6 -0
  148. data/app/views/alchemy/admin/resources/_form.html.erb +7 -4
  149. data/app/views/alchemy/admin/resources/edit.html.erb +3 -1
  150. data/app/views/alchemy/admin/resources/new.html.erb +3 -1
  151. data/app/views/alchemy/admin/styleguide/index.html.erb +52 -30
  152. data/app/views/alchemy/admin/translations/_en.js +4 -0
  153. data/app/views/layouts/alchemy/admin.html.erb +3 -3
  154. data/config/importmap.rb +2 -0
  155. data/config/locales/alchemy.en.yml +15 -0
  156. data/config/routes.rb +1 -0
  157. data/lib/alchemy/configuration/class_option.rb +46 -3
  158. data/lib/alchemy/configuration/collection_option.rb +4 -0
  159. data/lib/alchemy/configurations/dashboard.rb +79 -0
  160. data/lib/alchemy/configurations/main.rb +15 -0
  161. data/lib/alchemy/engine.rb +9 -3
  162. data/lib/alchemy/sprockets/skip_builds_compression.rb +33 -0
  163. data/lib/alchemy/test_support/capybara_helpers.rb +17 -0
  164. data/lib/alchemy/test_support/relatable_resource_examples.rb +20 -0
  165. data/lib/alchemy/test_support/rspec_matchers.rb +8 -0
  166. data/lib/alchemy/test_support/shared_publishable_examples.rb +38 -31
  167. data/lib/alchemy/tinymce.rb +1 -1
  168. data/lib/alchemy/version.rb +17 -3
  169. data/vendor/javascript/cropperjs.min.js +1 -1
  170. data/vendor/javascript/flatpickr.min.js +1 -1
  171. data/vendor/javascript/floating-ui.min.js +1 -0
  172. data/vendor/javascript/keymaster.min.js +1 -1
  173. data/vendor/javascript/rails-ujs.min.js +1 -1
  174. data/vendor/javascript/shoelace.min.js +93 -93
  175. data/vendor/javascript/sortable.min.js +1 -1
  176. data/vendor/javascript/tinymce.min.js +5 -1
  177. data/vendor/javascript/tom-select.min.js +1 -0
  178. metadata +57 -18
  179. data/app/javascript/alchemy_admin/components/alchemy_html_element.js +0 -129
  180. data/app/views/alchemy/admin/dashboard/_left_column.html.erb +0 -4
  181. data/app/views/alchemy/admin/dashboard/_right_column.html.erb +0 -9
  182. data/app/views/alchemy/admin/dashboard/widgets/_locked_pages.html.erb +0 -52
  183. data/app/views/alchemy/admin/dashboard/widgets/_recent_pages.html.erb +0 -34
  184. data/app/views/alchemy/admin/dashboard/widgets/_sites.html.erb +0 -25
  185. data/app/views/alchemy/admin/dashboard/widgets/_users.html.erb +0 -21
  186. data/app/views/alchemy/admin/languages/edit.html.erb +0 -1
  187. data/app/views/alchemy/admin/languages/new.html.erb +0 -1
  188. data/app/views/alchemy/admin/sites/edit.html.erb +0 -1
  189. data/app/views/alchemy/admin/sites/new.html.erb +0 -1
@@ -1,26 +1,247 @@
1
+ @use "../variables" as vars;
2
+
1
3
  #dashboard {
4
+ display: flex;
5
+ flex-direction: column;
2
6
  overflow: auto;
3
- padding: var(--spacing-4) 0;
4
7
  width: 100%;
8
+ min-height: 100%;
5
9
  position: relative;
6
10
 
7
- h1 {
8
- font-size: 1.5em;
9
- margin: 0 0 var(--spacing-2) var(--spacing-2);
11
+ .greeting {
12
+ grid-column: span 4;
13
+ flex: 1 1 50%;
14
+ padding: var(--spacing-4) var(--spacing-3) var(--spacing-4);
15
+
16
+ @media (min-width: vars.$medium-screen-break-point) {
17
+ grid-column: span 2;
18
+ }
19
+
20
+ @media (min-width: vars.$large-screen-break-point) {
21
+ grid-column: span 2;
22
+ }
23
+
24
+ h1 {
25
+ font-size: var(--font-size_large);
26
+ margin-top: 0;
27
+ }
28
+
29
+ p {
30
+ margin: var(--spacing-4) 0;
31
+ }
32
+
33
+ .user-name {
34
+ white-space: nowrap;
35
+ }
36
+ }
37
+
38
+ alchemy-message {
39
+ &:last-child {
40
+ margin-bottom: 0;
41
+ }
42
+ }
43
+
44
+ .top-row {
45
+ display: grid;
46
+ grid-template-columns: repeat(4, 1fr);
47
+ padding: var(--spacing-2);
48
+ gap: var(--spacing-4);
49
+ align-items: stretch;
50
+ }
51
+
52
+ footer {
53
+ display: flex;
54
+ margin: auto 0 0;
55
+ padding-top: var(--spacing-6);
56
+ justify-content: center;
57
+ color: var(--text-color-muted);
58
+ text-align: center;
59
+
60
+ ul {
61
+ display: flex;
62
+ justify-content: center;
63
+ flex-direction: column;
64
+ gap: var(--spacing-1);
65
+ list-style-type: none;
66
+
67
+ li {
68
+ white-space: nowrap;
69
+ }
70
+
71
+ @media (min-width: vars.$medium-screen-break-point) {
72
+ flex-direction: row;
73
+ gap: var(--spacing-6);
74
+ }
75
+ }
10
76
  }
11
77
 
12
- p {
13
- margin: 0 0 var(--spacing-4) var(--spacing-2);
78
+ .stats {
79
+ display: grid;
80
+ grid-template-columns: repeat(8, 1fr);
81
+ padding: var(--spacing-2);
82
+ gap: var(--spacing-4);
83
+ align-items: stretch;
14
84
  }
15
85
 
16
- .column {
17
- width: 50%;
18
- float: left;
19
- padding-right: var(--spacing-4);
86
+ .widgets {
87
+ display: grid;
88
+ grid-template-columns: repeat(4, 1fr);
89
+ grid-auto-flow: dense;
90
+ padding: var(--spacing-2);
91
+ gap: var(--spacing-4);
92
+ align-items: start;
20
93
  }
21
94
 
22
95
  .widget {
23
- margin-bottom: var(--spacing-4);
96
+ position: relative;
97
+ min-height: 92px;
98
+ grid-column: span var(--col-span, 4);
99
+ border-radius: var(--border-radius_large);
100
+ background-color: var(--dashboard-widget-background-color);
101
+ box-shadow: var(--dashboard-widget-box-shadow);
102
+ --table-row-height: var(--spacing-6);
103
+
104
+ @media (min-width: vars.$medium-screen-break-point) {
105
+ --col-span: 2;
106
+ }
107
+
108
+ @media (min-width: vars.$xxlarge-screen-break-point) {
109
+ --col-span: 1;
110
+ }
111
+
112
+ &.stat {
113
+ --col-span: 4;
114
+ min-height: 115px;
115
+
116
+ .widget-body {
117
+ gap: var(--spacing-2);
118
+ padding: var(--spacing-4);
119
+
120
+ .count {
121
+ font-weight: bold;
122
+ font-size: var(--font-size_xlarge);
123
+ }
124
+ }
125
+
126
+ @media (min-width: vars.$medium-screen-break-point) {
127
+ --col-span: 2;
128
+ }
129
+
130
+ @media (min-width: vars.$xxlarge-screen-break-point) {
131
+ --col-span: 1;
132
+ }
133
+ }
134
+
135
+ &.usage {
136
+ --table-row-height: var(--spacing-7);
137
+ min-height: 237px;
138
+
139
+ @media (min-width: vars.$xxlarge-screen-break-point) {
140
+ --col-span: 2;
141
+ }
142
+ }
143
+
144
+ &.wide {
145
+ --col-span: 4;
146
+
147
+ @media (min-width: vars.$xxlarge-screen-break-point) {
148
+ --col-span: 2;
149
+ }
150
+ }
151
+
152
+ &.system-info {
153
+ grid-column: span 4;
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: center;
157
+ gap: var(--spacing-4);
158
+ padding: var(--spacing-4);
159
+
160
+ @media (min-width: vars.$medium-screen-break-point) {
161
+ grid-column: span 2;
162
+ }
163
+
164
+ @media (min-width: vars.$large-screen-break-point) {
165
+ flex-direction: row;
166
+ }
167
+
168
+ @media (min-width: vars.$xxlarge-screen-break-point) {
169
+ grid-column: 4;
170
+ }
171
+ }
172
+
173
+ .label-with-icon {
174
+ display: inline-flex;
175
+ align-items: center;
176
+ gap: var(--icon-gap, var(--spacing-2));
177
+
178
+ > alchemy-icon,
179
+ > svg {
180
+ width: var(--icon-size, var(--icon-size-md));
181
+ height: var(--icon-size, var(--icon-size-md));
182
+ flex-shrink: 0;
183
+ }
184
+ }
185
+ }
186
+
187
+ .widget-body {
188
+ display: flex;
189
+ flex-direction: column;
190
+
191
+ header {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: space-between;
195
+ padding: var(--spacing-3) var(--spacing-4);
196
+ font-weight: var(--font-weight_bold);
197
+ line-height: 1.6;
198
+ border-bottom: 2px solid var(--table-border-color);
199
+
200
+ aside {
201
+ font-weight: normal;
202
+ }
203
+ }
204
+
205
+ alchemy-message {
206
+ margin: var(--spacing-4) var(--spacing-4);
207
+ }
208
+
209
+ .table-scroll {
210
+ max-height: calc(var(--table-row-height) * 10);
211
+ overflow-y: auto;
212
+ border-radius: var(--border-radius_large);
213
+
214
+ background:
215
+ linear-gradient(
216
+ var(--dashboard-widget-background-color) 30%,
217
+ var(--table-scroll-fade-color)
218
+ )
219
+ center top,
220
+ linear-gradient(
221
+ var(--table-scroll-fade-color),
222
+ var(--dashboard-widget-background-color) 70%
223
+ )
224
+ center bottom,
225
+ radial-gradient(
226
+ ellipse 75% 125% at 50% -50%,
227
+ var(--table-scroll-shadow-color),
228
+ transparent
229
+ )
230
+ center top,
231
+ radial-gradient(
232
+ ellipse 75% 125% at 50% 150%,
233
+ var(--table-scroll-shadow-color),
234
+ transparent
235
+ )
236
+ center bottom;
237
+ background-repeat: no-repeat;
238
+ background-size:
239
+ 100% 24px,
240
+ 100% 24px,
241
+ 100% 10px,
242
+ 100% 10px;
243
+ background-attachment: local, local, scroll, scroll;
244
+ }
24
245
 
25
246
  h2 {
26
247
  padding: var(--spacing-2);
@@ -32,31 +253,180 @@
32
253
  }
33
254
 
34
255
  table {
256
+ border-spacing: 0;
257
+ border-radius: var(--border-radius_large);
258
+
259
+ &.usage-stats {
260
+ td {
261
+ padding: var(--spacing-2) var(--spacing-4);
262
+ border: 0 none;
263
+ }
264
+
265
+ td.usage-stats--bar {
266
+ width: 50%;
267
+ padding: var(--spacing-2);
268
+
269
+ .bar {
270
+ display: inline-flex;
271
+ height: var(--spacing-2);
272
+ border-radius: var(--border-radius_medium);
273
+ min-width: 1px;
274
+ overflow: hidden;
275
+
276
+ .bar__public,
277
+ .bar__draft {
278
+ height: 100%;
279
+ background-color: #{"oklch(65% 0.15 var(--bar-hue, 0))"};
280
+ }
281
+
282
+ .bar__draft {
283
+ opacity: 0.35;
284
+ }
285
+ }
286
+ }
287
+
288
+ td.usage-stats--label {
289
+ width: 30%;
290
+ }
291
+
292
+ td.usage-stats--value {
293
+ width: 10%;
294
+ font-variant-numeric: tabular-nums;
295
+ text-align: end;
296
+ white-space: nowrap;
297
+ }
298
+ }
299
+
300
+ tr {
301
+ &:first-child {
302
+ td,
303
+ th {
304
+ &:first-child {
305
+ border-top-left-radius: var(--border-radius_large);
306
+ }
307
+ }
308
+
309
+ td,
310
+ th {
311
+ &:last-child {
312
+ border-top-right-radius: var(--border-radius_large);
313
+ }
314
+ }
315
+ }
316
+
317
+ &:last-child {
318
+ td,
319
+ th {
320
+ &:first-child {
321
+ border-bottom-left-radius: var(--border-radius_large);
322
+ }
323
+ }
324
+
325
+ td,
326
+ th {
327
+ border-bottom-width: 0;
328
+
329
+ &:last-child {
330
+ border-bottom-right-radius: var(--border-radius_large);
331
+ }
332
+ }
333
+ }
334
+
335
+ &:hover td {
336
+ background-color: transparent;
337
+ }
338
+ }
339
+
340
+ th,
341
+ td {
342
+ padding: var(--spacing-3) var(--spacing-4);
343
+ }
344
+
345
+ th {
346
+ border-right-width: 0;
347
+ }
348
+
35
349
  td {
36
350
  position: relative;
351
+ border-bottom: 1px solid var(--table-border-color);
352
+ border-right: 0 none;
37
353
 
38
- &:first-child {
39
- width: 40%;
354
+ &.button {
355
+ width: 5%;
356
+ }
357
+
358
+ &.name {
359
+ width: 20%;
360
+ }
361
+
362
+ &.page_name {
363
+ width: 45%;
364
+ }
365
+
366
+ &.site_name {
367
+ width: 20%;
368
+ }
369
+
370
+ .label-with-icon {
371
+ align-items: start;
372
+
373
+ > alchemy-icon,
374
+ > svg {
375
+ margin-block-start: 0.3em;
376
+ }
40
377
  }
41
378
 
42
- form {
43
- float: right;
379
+ .button_to {
380
+ display: inline-flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ padding-block-start: var(--spacing-1);
44
384
  }
45
385
  }
46
386
  }
47
387
  }
48
- }
49
388
 
50
- .logo {
51
- display: flex;
52
- flex-direction: column;
53
- justify-content: center;
54
- align-items: center;
55
- margin-bottom: 0.5em;
389
+ .version-info {
390
+ display: flex;
391
+ flex: 1 1 100%;
392
+ flex-direction: column;
393
+ gap: 0.5rem;
394
+ align-items: center;
395
+
396
+ @media (min-width: vars.$large-screen-break-point) {
397
+ flex-basis: 50%;
398
+ align-items: start;
399
+ padding-left: var(--spacing-4);
400
+ }
401
+
402
+ .version {
403
+ font-weight: var(--font-weight_bold);
404
+ }
56
405
 
57
- svg {
58
- width: 200px;
59
- height: auto;
406
+ .ruby-rails-version {
407
+ display: inline-flex;
408
+ gap: var(--spacing-2);
409
+ --icon-gap: var(--spacing-1);
410
+ --icon-size: var(--icon-size-sm);
411
+ font-size: var(--font-size_small);
412
+ }
413
+ }
414
+
415
+ .logo {
416
+ display: flex;
417
+ flex: 1 1 100%;
418
+ justify-content: center;
419
+
420
+ @media (min-width: vars.$large-screen-break-point) {
421
+ flex-basis: 50%;
422
+ padding-right: var(--spacing-4);
423
+ }
424
+
425
+ > svg {
426
+ width: auto;
427
+ max-width: 100%;
428
+ height: 60px;
429
+ }
60
430
  }
61
431
  }
62
432
 
@@ -64,9 +434,6 @@ alchemy-update-check {
64
434
  display: flex;
65
435
  position: relative;
66
436
  height: 16px;
67
- margin-bottom: 2em;
68
- text-align: center;
69
- justify-content: center;
70
437
 
71
438
  > span {
72
439
  display: inline-flex;
@@ -388,7 +388,7 @@ button.element-toggle {
388
388
  pointer-events: none;
389
389
  }
390
390
 
391
- .element-body {
391
+ .element-ingredient-editors {
392
392
  margin: var(--spacing-1) var(--spacing-2);
393
393
  }
394
394
 
@@ -436,14 +436,9 @@ button.element-toggle {
436
436
  .alchemy-popover {
437
437
  width: 360px;
438
438
  padding-bottom: var(--spacing-0);
439
-
440
- label {
441
- margin-bottom: var(--spacing-1);
442
- font-size: var(--font-size_small);
443
- }
444
439
  }
445
440
 
446
- .element-body {
441
+ .element-ingredient-editors {
447
442
  margin: var(--spacing-2);
448
443
  }
449
444
 
@@ -465,11 +460,13 @@ button.element-toggle {
465
460
 
466
461
  .autocomplete_tag_list {
467
462
  display: block;
468
- margin-top: var(--spacing-1);
469
- padding: var(--spacing-1) 0;
463
+ padding: var(--spacing-2) var(--spacing-2) var(--spacing-3);
464
+ border-top: 1px solid var(--element-toolbar-border-color);
470
465
 
471
466
  label {
467
+ display: block;
472
468
  font-size: var(--font-size_small);
469
+ text-indent: 1px;
473
470
  }
474
471
 
475
472
  .select2-container {
@@ -595,22 +592,22 @@ alchemy-publish-element-button {
595
592
 
596
593
  .ingredient-group {
597
594
  width: 100%;
598
- padding: var(--spacing-1) 0;
599
- position: relative;
600
- border-bottom: 1px solid var(--element-toolbar-border-color);
595
+ padding: var(--spacing-1) var(--spacing-2);
596
+ border-top: 1px solid var(--element-toolbar-border-color);
601
597
 
602
- &:last-child {
603
- border-bottom: none;
604
- padding-bottom: 0;
598
+ &:first-of-type {
599
+ margin-top: var(--spacing-1);
605
600
  }
606
601
 
607
602
  summary {
608
603
  display: flex;
609
604
  align-items: center;
610
- justify-content: space-between;
611
- font-weight: bold;
605
+ justify-content: start;
606
+ gap: var(--spacing-0);
612
607
  text-decoration: none;
613
608
  padding: var(--spacing-1) 1px;
609
+ margin-left: calc(-1 * var(--spacing-1));
610
+ cursor: pointer;
614
611
  }
615
612
 
616
613
  &[open] {
@@ -46,7 +46,7 @@ textarea {
46
46
 
47
47
  .alchemy-char-counter {
48
48
  display: block;
49
- clear: both;
49
+ grid-column: 2;
50
50
  text-align: right;
51
51
 
52
52
  &.too-long {
@@ -71,8 +71,8 @@ fieldset {
71
71
  color: var(--border-color);
72
72
  }
73
73
 
74
- .page-publication-date-fields {
75
- margin: var(--spacing-2) 0;
74
+ form .input .page-publication-date-fields.input-row {
75
+ margin: var(--spacing-4) 0 var(--spacing-2) 0;
76
76
 
77
77
  &.hidden {
78
78
  display: none;