trestle 0.10.0.pre → 0.10.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
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
  }