trestle 0.10.0.pre → 0.10.0.pre2

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release.yml +26 -0
  3. data/.github/workflows/rspec.yml +6 -2
  4. data/Gemfile +14 -5
  5. data/app/assets/bundle/trestle/admin.css +4 -4
  6. data/app/assets/bundle/trestle/admin.js +2 -2
  7. data/app/controllers/concerns/trestle/controller/turbo_stream.rb +12 -0
  8. data/app/controllers/concerns/trestle/resource/controller/actions.rb +3 -3
  9. data/app/controllers/trestle/application_controller.rb +1 -1
  10. data/app/helpers/trestle/modal_helper.rb +0 -5
  11. data/app/helpers/trestle/turbo/frame_helper.rb +29 -0
  12. data/app/helpers/trestle/turbo/stream_helper.rb +9 -0
  13. data/app/helpers/trestle/turbo/tag_builder.rb +21 -0
  14. data/app/helpers/trestle/url_helper.rb +1 -1
  15. data/app/views/layouts/trestle/admin.html.erb +1 -1
  16. data/app/views/layouts/trestle/admin.turbo_stream.erb +2 -9
  17. data/app/views/trestle/application/_header.html.erb +12 -10
  18. data/app/views/trestle/resource/create.turbo_stream.erb +1 -5
  19. data/app/views/trestle/resource/destroy.turbo_stream.erb +1 -1
  20. data/app/views/trestle/resource/edit.html.erb +2 -0
  21. data/app/views/trestle/resource/index.html.erb +5 -0
  22. data/app/views/trestle/resource/new.html.erb +5 -0
  23. data/app/views/trestle/resource/show.html.erb +2 -0
  24. data/app/views/trestle/resource/update.turbo_stream.erb +1 -5
  25. data/app/views/trestle/shared/_sidebar.html.erb +2 -2
  26. data/frontend/css/components/_alerts.scss +22 -20
  27. data/frontend/css/components/_avatar.scss +12 -12
  28. data/frontend/css/components/_background.scss +1 -1
  29. data/frontend/css/components/_breadcrumbs.scss +8 -29
  30. data/frontend/css/components/_buttons.scss +3 -3
  31. data/frontend/css/components/_datepicker.scss +3 -3
  32. data/frontend/css/components/_dropdown.scss +18 -26
  33. data/frontend/css/components/_forms.scss +4 -4
  34. data/frontend/css/components/_grid.scss +29 -0
  35. data/frontend/css/components/_media-grid.scss +1 -1
  36. data/frontend/css/components/_modal.scss +4 -4
  37. data/frontend/css/components/_pagination.scss +4 -8
  38. data/frontend/css/components/_popover.scss +1 -1
  39. data/frontend/css/components/_scopes.scss +4 -10
  40. data/frontend/css/components/_select.scss +8 -9
  41. data/frontend/css/components/_sort.scss +1 -1
  42. data/frontend/css/components/_table.scss +5 -5
  43. data/frontend/css/components/_tabs.scss +11 -18
  44. data/frontend/css/components/_tags.scss +16 -6
  45. data/frontend/css/components/_toolbars.scss +9 -9
  46. data/frontend/css/core/_functions.scss +0 -8
  47. data/frontend/css/core/_theme.scss +3 -0
  48. data/frontend/css/core/_typography.scss +12 -19
  49. data/frontend/css/index.scss +3 -1
  50. data/frontend/css/layout/_base.scss +4 -2
  51. data/frontend/css/layout/_content-header.scss +71 -0
  52. data/frontend/css/layout/_footer.scss +5 -7
  53. data/frontend/css/layout/_main-content.scss +107 -0
  54. data/frontend/css/layout/_navigation.scss +111 -49
  55. data/frontend/css/layout/_sidebar.scss +58 -34
  56. data/frontend/css/variables/_bootstrap.scss +30 -21
  57. data/frontend/css/variables/_trestle.scss +17 -17
  58. data/frontend/js/controllers/batch_action_controller.js +59 -0
  59. data/frontend/js/controllers/checkbox_select_controller.js +3 -0
  60. data/lib/trestle/engine.rb +18 -16
  61. data/lib/trestle/resource/toolbar.rb +18 -8
  62. data/lib/trestle/sprockets_compressor.rb +16 -0
  63. data/lib/trestle/toolbar/context.rb +7 -4
  64. data/lib/trestle/toolbar/menu.rb +8 -5
  65. data/lib/trestle/version.rb +1 -1
  66. data/package.json +1 -1
  67. data/trestle.gemspec +5 -9
  68. data/yarn.lock +17 -32
  69. metadata +34 -69
  70. data/app/controllers/concerns/trestle/controller/turbo.rb +0 -21
  71. data/app/helpers/trestle/turbo_frame_helper.rb +0 -34
  72. data/frontend/css/layout/_content.scss +0 -173
@@ -14,7 +14,7 @@ module Trestle
14
14
  def new
15
15
  respond_to do |format|
16
16
  format.html
17
- format.turbo_stream { render turbo_stream: turbo_stream_modal }
17
+ format.turbo_stream { render turbo_stream: turbo_stream.modal }
18
18
  format.json { render json: instance }
19
19
 
20
20
  yield format if block_given?
@@ -56,7 +56,7 @@ module Trestle
56
56
  else
57
57
  respond_to do |format|
58
58
  format.html
59
- format.turbo_stream { render turbo_stream: turbo_stream_modal } if modal_request?
59
+ format.turbo_stream { render turbo_stream: turbo_stream.modal } if modal_request?
60
60
  format.json { render json: instance }
61
61
 
62
62
  yield format if block_given?
@@ -75,7 +75,7 @@ module Trestle
75
75
  else
76
76
  respond_to do |format|
77
77
  format.html
78
- format.turbo_stream { render turbo_stream: turbo_stream_modal } if modal_request?
78
+ format.turbo_stream { render turbo_stream: turbo_stream.modal } if modal_request?
79
79
  format.json { render json: instance }
80
80
 
81
81
  yield format if block_given?
@@ -9,5 +9,5 @@ class Trestle::ApplicationController < ActionController::Base
9
9
  include Trestle::Controller::Modal
10
10
  include Trestle::Controller::Title
11
11
  include Trestle::Controller::Toolbars
12
- include Trestle::Controller::Turbo
12
+ include Trestle::Controller::TurboStream
13
13
  end
@@ -1,10 +1,5 @@
1
1
  module Trestle
2
2
  module ModalHelper
3
- def turbo_stream_modal(template: action_name)
4
- template = render_to_string template: action_name, prefixes: _prefixes, formats: [:html], layout: "trestle/modal"
5
- %(<turbo-stream action="modal"><template>#{template}</template></turbo-stream>).html_safe
6
- end
7
-
8
3
  def modal_options!(options)
9
4
  modal_options.merge!(options)
10
5
  end
@@ -0,0 +1,29 @@
1
+ module Trestle
2
+ module Turbo
3
+ module FrameHelper
4
+ def index_turbo_frame(options={}, &block)
5
+ defaults = {
6
+ id: "index",
7
+ data: {
8
+ controller: "reloadable",
9
+ turbo_action: "advance"
10
+ }
11
+ }
12
+
13
+ content_tag("turbo-frame", defaults.merge(options), &block)
14
+ end
15
+
16
+ def resource_turbo_frame(instance, options={}, &block)
17
+ defaults = {
18
+ id: dom_id(instance),
19
+ target: ("_top" unless modal_request?),
20
+ data: {
21
+ controller: ("deprecated--init" if modal_request? || request.post? || turbo_frame_request?)
22
+ }
23
+ }
24
+
25
+ content_tag("turbo-frame", defaults.merge(options), &block)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ module Trestle
2
+ module Turbo
3
+ module StreamHelper
4
+ def turbo_stream
5
+ Trestle::Turbo::TagBuilder.new(self)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Trestle
2
+ module Turbo
3
+ class TagBuilder < ::Turbo::Streams::TagBuilder
4
+ def modal(template=nil)
5
+ turbo_stream_action_tag :modal, template: @view_context.render(template: template || @view_context.action_name, layout: "layouts/trestle/modal", prefixes: @view_context.controller._prefixes, formats: :html)
6
+ end
7
+
8
+ def close_modal(target)
9
+ turbo_stream_action_tag :closeModal, targets: target
10
+ end
11
+
12
+ def flash
13
+ turbo_stream_action_tag :flash, template: @view_context.render(partial: "trestle/flash/flash", formats: :html)
14
+ end
15
+
16
+ def reload
17
+ turbo_stream_action_tag :reload
18
+ end
19
+ end
20
+ end
21
+ end
@@ -47,7 +47,7 @@ module Trestle
47
47
  # Determine link data options
48
48
  options[:data] ||= {}
49
49
 
50
- if MODAL_ACTIONS.include?(action) && admin.form.modal?
50
+ if MODAL_ACTIONS.include?(action) && admin.respond_to?(:form) && admin.form.modal?
51
51
  options[:data][:controller] ||= "modal-trigger"
52
52
  else
53
53
  options[:data][:turbo_frame] = "_top"
@@ -51,6 +51,6 @@
51
51
  </div>
52
52
  </div>
53
53
 
54
- <turbo-frame id="modal"></turbo-frame>
54
+ <turbo-frame id="modal" data-controller="modal-frame"></turbo-frame>
55
55
  <% end %>
56
56
  </html>
@@ -1,11 +1,4 @@
1
1
  <%= yield %>
2
2
 
3
- <% unless modal_request? %>
4
- <turbo-stream action="flash">
5
- <template>
6
- <%= render partial: "trestle/flash/flash", formats: [:html] %>
7
- </template>
8
- </turbo-stream>
9
- <% end %>
10
-
11
- <turbo-stream action="reload"></turbo-stream>
3
+ <%= turbo_stream.flash unless modal_request? %>
4
+ <%= turbo_stream.reload %>
@@ -1,16 +1,6 @@
1
1
  <header class="content-header">
2
2
  <div class="content-header-title">
3
3
  <h1><%= title %></h1>
4
-
5
- <% unless local_assigns.fetch(:hide_breadcrumbs, false) %>
6
- <ol class="breadcrumb">
7
- <% breadcrumbs.each do |breadcrumb| %>
8
- <li class="breadcrumb-item<% if breadcrumb == breadcrumbs.last %> active<% end %>">
9
- <%= link_to breadcrumb.label, breadcrumb.path, data: { turbo_frame: "_top" } %>
10
- </li>
11
- <% end %>
12
- </ol>
13
- <% end %>
14
4
  </div>
15
5
 
16
6
  <div class="content-header-toolbars">
@@ -24,4 +14,16 @@
24
14
  <%= deprecated_toolbar(:secondary) %>
25
15
  </div>
26
16
  </div>
17
+
18
+ <% unless local_assigns.fetch(:hide_breadcrumbs, false) %>
19
+ <div class="content-header-breadcrumbs">
20
+ <ol class="breadcrumb">
21
+ <% breadcrumbs.each do |breadcrumb| %>
22
+ <li class="breadcrumb-item<% if breadcrumb == breadcrumbs.last %> active<% end %>">
23
+ <%= link_to breadcrumb.label, breadcrumb.path, data: { turbo_frame: "_top" } %>
24
+ </li>
25
+ <% end %>
26
+ </ol>
27
+ </div>
28
+ <% end %>
27
29
  </header>
@@ -1,5 +1 @@
1
- <turbo-stream action="replace" target="<%= dom_id(admin.build_instance({}, params)) %>">
2
- <template>
3
- <%= render template: instance.persisted? ? "trestle/resource/show" : "trestle/resource/new", formats: [:html] %>
4
- </template>
5
- </turbo-stream>
1
+ <%= turbo_stream.replace admin.build_instance({}, params), template: "trestle/resource/#{instance.persisted? ? "show" : "new"}" %>
@@ -1 +1 @@
1
- <turbo-stream action="closeModal" target="<%= dom_id(instance) %>"></turbo-stream>
1
+ <%= turbo_stream.close_modal instance %>
@@ -5,10 +5,12 @@
5
5
 
6
6
  <% toolbar(:primary) do |t| %>
7
7
  <%= t.save_or_dismiss(:update) %>
8
+ <%= hook("edit.toolbar.primary", t) %>
8
9
  <% end %>
9
10
 
10
11
  <% toolbar(:secondary) do |t| %>
11
12
  <%= t.delete %>
13
+ <%= hook("edit.toolbar.secondary", t) %>
12
14
  <% end %>
13
15
 
14
16
  <%= resource_turbo_frame(instance) do %>
@@ -2,6 +2,11 @@
2
2
 
3
3
  <% toolbar(:primary) do |t| %>
4
4
  <%= t.new %>
5
+ <%= hook("index.toolbar.primary", t) %>
6
+ <% end %>
7
+
8
+ <% toolbar(:secondary) do |t| %>
9
+ <%= hook("index.toolbar.secondary", t) %>
5
10
  <% end %>
6
11
 
7
12
  <% content_for(:utilities) do %>
@@ -5,6 +5,11 @@
5
5
 
6
6
  <% toolbar(:primary) do |t| %>
7
7
  <%= t.save_or_dismiss(:create) %>
8
+ <%= hook("new.toolbar.primary", t) %>
9
+ <% end %>
10
+
11
+ <% toolbar(:secondary) do |t| %>
12
+ <%= hook("new.toolbar.secondary", t) %>
8
13
  <% end %>
9
14
 
10
15
  <%= resource_turbo_frame(instance) do %>
@@ -5,10 +5,12 @@
5
5
 
6
6
  <% toolbar(:primary) do |t| %>
7
7
  <%= t.save_or_dismiss(:update) %>
8
+ <%= hook("show.toolbar.primary", t) %>
8
9
  <% end %>
9
10
 
10
11
  <% toolbar(:secondary) do |t| %>
11
12
  <%= t.delete %>
13
+ <%= hook("show.toolbar.secondary", t) %>
12
14
  <% end %>
13
15
 
14
16
  <%= resource_turbo_frame(instance) do %>
@@ -1,5 +1 @@
1
- <turbo-stream action="replace" target="<%= dom_id(instance) %>">
2
- <template>
3
- <%= render template: "trestle/resource/show", formats: [:html] %>
4
- </template>
5
- </turbo-stream>
1
+ <%= turbo_stream.replace instance, template: "trestle/resource/show" %>
@@ -14,11 +14,11 @@
14
14
  <% Trestle.navigation(self).each do |group, items| %>
15
15
  <%= content_tag(:ul, class: ("collapsed" if group.present? && navigation_group_collapsed?(group)), data: { group: group.id }) do %>
16
16
  <% if group.present? %>
17
- <li class="nav-header"><%= link_to group.label, "##{group.id}", data: { action: "navigation#toggle" } %></li>
17
+ <li class="nav-header"><%= link_to content_tag(:span, group.label), "##{group.id}", data: { action: "navigation#toggle" } %></li>
18
18
  <% end %>
19
19
 
20
20
  <% items.each do |item| %>
21
- <%= content_tag(:li, class: ("active" if current_navigation_item?(item))) do %>
21
+ <%= content_tag(:li, class: ["nav-item", ("active" if current_navigation_item?(item))]) do %>
22
22
  <%= link_to item.path, item.html_options.merge(data: { controller: "navigation-tooltip" }) do %>
23
23
  <%= icon("nav-icon", item.icon) %>
24
24
  <span class="nav-label" data-navigation-tooltip-target="label"><%= item.label %></span>
@@ -3,9 +3,7 @@
3
3
  align-items: center;
4
4
 
5
5
  h3 {
6
- margin-top: 0;
7
- margin-bottom: 2px;
8
- font-size: 1.5rem;
6
+ margin-bottom: 0.125rem;
9
7
  font-weight: 600;
10
8
  }
11
9
 
@@ -25,33 +23,38 @@
25
23
  }
26
24
  }
27
25
 
26
+ @include media-breakpoint-down(md) {
27
+ --#{$prefix}alert-padding-y: 0.875rem;
28
+ }
29
+
28
30
  @include media-breakpoint-down(sm) {
29
- padding: ($alert-padding-y * 0.75) ($alert-padding-x * 0.75);
31
+ --#{$prefix}alert-padding-x: 0.625rem;
32
+ --#{$prefix}alert-padding-y: 0.75rem;
30
33
 
31
34
  h3 {
32
- font-size: 1.25rem;
35
+ font-size: 1.125rem;
33
36
  }
34
37
 
35
38
  p {
36
- font-size: 0.85rem;
39
+ font-size: 0.75rem;
37
40
  }
38
41
  }
39
42
  }
40
43
 
41
44
  .alert-icon {
42
- margin-right: $alert-padding-x;
45
+ margin-right: var(--#{$prefix}alert-padding-x);
43
46
 
44
- font-size: 40px;
45
- width: 40px;
47
+ font-size: 2.375rem;
48
+ width: 2.375rem;
46
49
 
47
50
  text-align: center;
48
51
 
49
52
  @include media-breakpoint-down(sm) {
50
- margin-left: $alert-padding-x * 0.25;
51
- margin-right: $alert-padding-x * 0.75;
53
+ margin-left: calc(var(--#{$prefix}alert-padding-x) * 0.25);
54
+ margin-right: calc(var(--#{$prefix}alert-padding-x) * 0.75);
52
55
 
53
- font-size: 32px;
54
- width: 32px;
56
+ font-size: 2rem;
57
+ width: 2rem;
55
58
  }
56
59
  }
57
60
 
@@ -60,8 +63,8 @@
60
63
 
61
64
  .btn-close {
62
65
  position: absolute;
63
- top: 0.75rem;
64
- right: $alert-padding-x;
66
+ top: calc(var(--#{$prefix}alert-padding-y) * 0.5);
67
+ right: var(--#{$prefix}alert-padding-x);
65
68
 
66
69
  color: white;
67
70
  opacity: 0.5;
@@ -72,8 +75,7 @@
72
75
  }
73
76
 
74
77
  @include media-breakpoint-down(sm) {
75
- top: 0.375rem;
76
- right: $alert-padding-x * 0.75;
78
+ right: calc(var(--#{$prefix}alert-padding-x) * 0.5);
77
79
  }
78
80
  }
79
81
  }
@@ -132,15 +134,15 @@
132
134
  &:after {
133
135
  @include icon-fa($fa-var-caret-down);
134
136
  font-size: 0.75rem;
135
- margin-left: 5px;
137
+ margin-left: 0.25rem;
136
138
  }
137
139
  }
138
140
 
139
141
  .debug-errors {
140
142
  ul {
141
143
  list-style: none;
142
- margin: 5px 0 0 0;
143
- padding: 0 0 0 5px;
144
+ margin: 0.25rem 0 0 0;
145
+ padding: 0 0 0 0.25rem;
144
146
  border-left: 4px solid rgba(white, 0.25);
145
147
  }
146
148
  }
@@ -1,11 +1,15 @@
1
1
  .avatar {
2
+ --avatar-bg: #ccc;
3
+ --avatar-size: 2.5rem;
4
+ --avatar-fallback-font-size: 0.75rem;
5
+
2
6
  display: inline-block;
3
7
  position: relative;
4
8
 
5
- width: 40px;
6
- height: 40px;
9
+ width: var(--avatar-size);
10
+ height: var(--avatar-size);
7
11
 
8
- background: #ccc;
12
+ background: var(--avatar-bg);
9
13
  border-radius: 50%;
10
14
  box-shadow: rgba(black, 0.25) 0 1px 0;
11
15
 
@@ -37,21 +41,17 @@
37
41
  align-items: center;
38
42
  justify-content: center;
39
43
 
40
- font-size: 0.8rem;
44
+ font-size: var(--avatar-fallback-font-size);
41
45
  font-weight: 500;
42
46
  }
43
47
  }
44
48
 
45
49
  .avatar-sm {
46
- width: 24px !important;
47
- height: 24px !important;
50
+ --avatar-size: 1.5rem;
51
+ --avatar-fallback-font-size: 0.625rem;
48
52
  }
49
53
 
50
54
  .avatar-lg {
51
- width: 64px !important;
52
- height: 64px !important;
53
-
54
- .avatar-fallback {
55
- font-size: 1.5rem;
56
- }
55
+ --avatar-size: 4rem;
56
+ --avatar-fallback-font-size: 1.5rem;
57
57
  }
@@ -1,5 +1,5 @@
1
1
  %textured-bg {
2
- background-image: url(../images/bright-squares.png), linear-gradient(rgba(white, 0.05), rgba(black, 0.05));
2
+ background-image: var(--theme-texture), var(--theme-gradient);
3
3
  background-repeat: repeat, no-repeat;
4
4
  }
5
5
 
@@ -1,40 +1,19 @@
1
1
  .breadcrumb {
2
- font-size: 0.85rem;
3
-
4
- .active, .active a {
5
- font-weight: normal;
6
- color: $breadcrumb-active-color;
7
-
8
- &:hover {
9
- text-decoration: none;
10
- }
11
- }
2
+ --#{$prefix}breadcrumb-font-size: 0.75rem;
3
+ --#{$prefix}breadcrumb-item-padding-x: 0.35rem;
12
4
 
13
5
  @include media-breakpoint-down(md) {
14
- font-size: 0.75rem;
6
+ --#{$prefix}breadcrumb-font-size: 0.625rem;
7
+ --#{$prefix}breadcrumb-item-padding-x: 0.25rem;
15
8
  }
16
9
  }
17
10
 
18
- // Fine-tune spacing between breadcrumb separators
19
-
20
11
  .breadcrumb-item {
21
- + .breadcrumb-item {
22
- &::before {
23
- padding-right: 0.35rem;
24
- }
12
+ a {
13
+ font-weight: normal;
25
14
  }
26
- }
27
-
28
- // Reduce breadcrumb separator spacing on mobile
29
-
30
- @include media-breakpoint-down(md) {
31
- .breadcrumb-item {
32
- + .breadcrumb-item {
33
- padding-left: divide($breadcrumb-item-padding-x, 2);
34
15
 
35
- &::before {
36
- padding-right: divide($breadcrumb-item-padding-x, 4);
37
- }
38
- }
16
+ &.active a {
17
+ color: inherit;
39
18
  }
40
19
  }
@@ -6,7 +6,7 @@
6
6
  display: inline-block;
7
7
  @include icon-fa($fa-var-spinner);
8
8
  @extend .fa-spin;
9
- margin-right: 10px;
9
+ margin-right: 0.625rem;
10
10
  }
11
11
  }
12
12
 
@@ -14,7 +14,7 @@
14
14
  font-size: 90%;
15
15
 
16
16
  + .btn-label {
17
- margin-left: 5px;
17
+ margin-left: 0.25rem;
18
18
  }
19
19
  }
20
20
  }
@@ -126,7 +126,7 @@
126
126
 
127
127
  @include button-child-visible('icon', '> i') {
128
128
  > i + .btn-label {
129
- margin-left: 5px;
129
+ margin-left: 0.25rem;
130
130
  }
131
131
  };
132
132
 
@@ -4,9 +4,9 @@
4
4
  right: 0;
5
5
  z-index: 4;
6
6
 
7
- width: 34px;
8
- height: 34px;
9
- line-height: 34px;
7
+ width: 2rem;
8
+ height: 2rem;
9
+ line-height: 2rem;
10
10
  text-align: center;
11
11
 
12
12
  color: #ccc;
@@ -7,31 +7,37 @@
7
7
 
8
8
  &:before {
9
9
  top: -$dropdown-arrow-outer-width;
10
- left: 12px;
10
+ left: 0.75rem;
11
11
 
12
12
  border-left: $dropdown-arrow-width solid transparent;
13
13
  border-right: $dropdown-arrow-width solid transparent;
14
- border-bottom: $dropdown-arrow-width solid $dropdown-border-color;
14
+ border-bottom: $dropdown-arrow-width solid var(--#{$prefix}dropdown-border-color);
15
15
  }
16
16
 
17
17
  &:after {
18
18
  top: -$dropdown-arrow-width;
19
- left: 11px;
19
+ left: 0.75rem;
20
+
21
+ margin-left: -1px;
22
+ margin-right: 0;
20
23
 
21
24
  border-left: $dropdown-arrow-outer-width solid transparent;
22
25
  border-right: $dropdown-arrow-outer-width solid transparent;
23
- border-bottom: $dropdown-arrow-outer-width solid $dropdown-bg;
26
+ border-bottom: $dropdown-arrow-outer-width solid var(--#{$prefix}dropdown-bg);
24
27
  }
25
28
 
26
29
  &.dropdown-menu-end {
27
30
  &:before {
28
31
  left: auto;
29
- right: 12px;
32
+ right: 0.75rem;
30
33
  }
31
34
 
32
35
  &:after {
33
36
  left: auto;
34
- right: 11px;
37
+ right: 0.75rem;
38
+
39
+ margin-left: 0;
40
+ margin-right: -1px;
35
41
  }
36
42
  }
37
43
 
@@ -41,7 +47,7 @@
41
47
  bottom: -$dropdown-arrow-outer-width;
42
48
 
43
49
  border-bottom: 0;
44
- border-top: $dropdown-arrow-width solid $dropdown-border-color;
50
+ border-top: $dropdown-arrow-width solid var(--#{$prefix}dropdown-border-color);
45
51
  }
46
52
 
47
53
  &:after {
@@ -49,27 +55,13 @@
49
55
  bottom: -$dropdown-arrow-width;
50
56
 
51
57
  border-bottom: 0;
52
- border-top: $dropdown-arrow-outer-width solid $dropdown-bg;
58
+ border-top: $dropdown-arrow-outer-width solid var(--bs-dropdown-bg);
53
59
  }
54
60
  }
55
- }
56
-
57
- .dropdown-menu-dark {
58
- &:before {
59
- border-bottom-color: $dropdown-dark-border-color;
60
- }
61
61
 
62
- &:after {
63
- border-bottom-color: $dropdown-dark-bg;
64
- }
65
-
66
- .dropup & {
67
- &:before {
68
- border-top-color: $dropdown-dark-border-color;
69
- }
70
-
71
- &:after {
72
- border-top-color: $dropdown-dark-bg;
73
- }
62
+ @include media-breakpoint-down(md) {
63
+ --#{$prefix}dropdown-font-size: 0.75rem;
64
+ --#{$prefix}dropdown-padding-y: 0.375rem;
65
+ --#{$prefix}dropdown-item-padding-x: 0.75rem;
74
66
  }
75
67
  }
@@ -1,6 +1,6 @@
1
1
  .form-group {
2
2
  position: relative;
3
- margin-bottom: 1rem;
3
+ margin-bottom: 0.875rem;
4
4
 
5
5
  &.has-error {
6
6
  > .form-label {
@@ -21,14 +21,14 @@ ul.invalid-feedback {
21
21
 
22
22
  .form-text {
23
23
  color: $form-text-color;
24
- font-size: 0.9rem;
24
+ font-size: 0.8125rem;
25
25
 
26
26
  @include media-breakpoint-up(sm) {
27
27
  &.floating {
28
28
  position: absolute;
29
29
  top: 0;
30
30
  right: 0;
31
- margin: 2px 0;
31
+ margin: 0.125rem 0;
32
32
  }
33
33
  }
34
34
  }
@@ -46,6 +46,6 @@ ul.invalid-feedback {
46
46
  .form-control,
47
47
  .form-select,
48
48
  .input-group-text {
49
- font-size: 16px;
49
+ font-size: 1rem;
50
50
  }
51
51
  }
@@ -0,0 +1,29 @@
1
+ .grid {
2
+ --grid-gap: var(--content-area-margin, 0);
3
+ --grid-column-count: 1;
4
+ --grid-column-min-width: 0;
5
+
6
+ display: grid;
7
+ grid-template-columns: repeat(var(--grid-column-count), minmax(var(--grid-column-min-width), 1fr));
8
+ gap: var(--grid-gap);
9
+
10
+ > .grid-col-full {
11
+ grid-column: 1 / -1;
12
+ }
13
+ }
14
+
15
+ @for $cols from 2 through 12 {
16
+ .grid-cols-#{$cols} {
17
+ --grid-column-count: #{$cols};
18
+ }
19
+ }
20
+
21
+ @each $breakpoint in map-keys($grid-breakpoints) {
22
+ @include media-breakpoint-up($breakpoint) {
23
+ @for $cols from 2 through 12 {
24
+ .grid-cols-#{$breakpoint}-#{$cols} {
25
+ --grid-column-count: #{$cols};
26
+ }
27
+ }
28
+ }
29
+ }
@@ -105,7 +105,7 @@
105
105
  }
106
106
 
107
107
  .media-grid-auto {
108
- --media-grid-item-size: 240px;
108
+ --media-grid-item-size: 15rem;
109
109
 
110
110
  grid-template-columns: repeat(auto-fill, minmax(var(--media-grid-item-size), 1fr));
111
111
  }