tina4ruby 3.11.13 → 3.11.15

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 (132) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +80 -80
  3. data/LICENSE.txt +21 -21
  4. data/README.md +137 -137
  5. data/exe/tina4ruby +5 -5
  6. data/lib/tina4/ai.rb +696 -696
  7. data/lib/tina4/api.rb +189 -189
  8. data/lib/tina4/auth.rb +305 -305
  9. data/lib/tina4/auto_crud.rb +244 -244
  10. data/lib/tina4/cache.rb +154 -154
  11. data/lib/tina4/cli.rb +1449 -1449
  12. data/lib/tina4/constants.rb +46 -46
  13. data/lib/tina4/container.rb +74 -74
  14. data/lib/tina4/cors.rb +74 -74
  15. data/lib/tina4/crud.rb +692 -692
  16. data/lib/tina4/database/sqlite3_adapter.rb +165 -165
  17. data/lib/tina4/database.rb +625 -625
  18. data/lib/tina4/database_result.rb +208 -208
  19. data/lib/tina4/debug.rb +8 -8
  20. data/lib/tina4/dev.rb +14 -14
  21. data/lib/tina4/dev_admin.rb +935 -935
  22. data/lib/tina4/dev_mailbox.rb +191 -191
  23. data/lib/tina4/drivers/firebird_driver.rb +124 -110
  24. data/lib/tina4/drivers/mongodb_driver.rb +561 -561
  25. data/lib/tina4/drivers/mssql_driver.rb +112 -112
  26. data/lib/tina4/drivers/mysql_driver.rb +90 -90
  27. data/lib/tina4/drivers/odbc_driver.rb +191 -191
  28. data/lib/tina4/drivers/postgres_driver.rb +116 -106
  29. data/lib/tina4/drivers/sqlite_driver.rb +122 -122
  30. data/lib/tina4/env.rb +95 -95
  31. data/lib/tina4/error_overlay.rb +252 -252
  32. data/lib/tina4/events.rb +109 -109
  33. data/lib/tina4/field_types.rb +154 -154
  34. data/lib/tina4/frond.rb +2025 -2025
  35. data/lib/tina4/gallery/auth/meta.json +1 -1
  36. data/lib/tina4/gallery/auth/src/routes/api/gallery_auth.rb +114 -114
  37. data/lib/tina4/gallery/database/meta.json +1 -1
  38. data/lib/tina4/gallery/database/src/routes/api/gallery_db.rb +43 -43
  39. data/lib/tina4/gallery/error-overlay/meta.json +1 -1
  40. data/lib/tina4/gallery/error-overlay/src/routes/api/gallery_crash.rb +17 -17
  41. data/lib/tina4/gallery/orm/meta.json +1 -1
  42. data/lib/tina4/gallery/orm/src/routes/api/gallery_products.rb +16 -16
  43. data/lib/tina4/gallery/queue/meta.json +1 -1
  44. data/lib/tina4/gallery/queue/src/routes/api/gallery_queue.rb +325 -325
  45. data/lib/tina4/gallery/rest-api/meta.json +1 -1
  46. data/lib/tina4/gallery/rest-api/src/routes/api/gallery_hello.rb +14 -14
  47. data/lib/tina4/gallery/templates/meta.json +1 -1
  48. data/lib/tina4/gallery/templates/src/routes/gallery_page.rb +12 -12
  49. data/lib/tina4/gallery/templates/src/templates/gallery_page.twig +257 -257
  50. data/lib/tina4/graphql.rb +966 -966
  51. data/lib/tina4/health.rb +39 -39
  52. data/lib/tina4/html_element.rb +170 -170
  53. data/lib/tina4/job.rb +80 -80
  54. data/lib/tina4/localization.rb +168 -168
  55. data/lib/tina4/log.rb +203 -203
  56. data/lib/tina4/mcp.rb +696 -696
  57. data/lib/tina4/messenger.rb +587 -587
  58. data/lib/tina4/metrics.rb +793 -793
  59. data/lib/tina4/middleware.rb +445 -445
  60. data/lib/tina4/migration.rb +451 -451
  61. data/lib/tina4/orm.rb +790 -790
  62. data/lib/tina4/public/css/tina4.css +2463 -2463
  63. data/lib/tina4/public/css/tina4.min.css +1 -1
  64. data/lib/tina4/public/images/logo.svg +5 -5
  65. data/lib/tina4/public/js/frond.min.js +2 -2
  66. data/lib/tina4/public/js/tina4-dev-admin.js +565 -565
  67. data/lib/tina4/public/js/tina4-dev-admin.min.js +480 -480
  68. data/lib/tina4/public/js/tina4.min.js +92 -92
  69. data/lib/tina4/public/js/tina4js.min.js +48 -48
  70. data/lib/tina4/public/swagger/index.html +90 -90
  71. data/lib/tina4/public/swagger/oauth2-redirect.html +63 -63
  72. data/lib/tina4/query_builder.rb +380 -380
  73. data/lib/tina4/queue.rb +366 -366
  74. data/lib/tina4/queue_backends/kafka_backend.rb +80 -80
  75. data/lib/tina4/queue_backends/lite_backend.rb +298 -298
  76. data/lib/tina4/queue_backends/mongo_backend.rb +126 -126
  77. data/lib/tina4/queue_backends/rabbitmq_backend.rb +73 -73
  78. data/lib/tina4/rack_app.rb +817 -817
  79. data/lib/tina4/rate_limiter.rb +130 -130
  80. data/lib/tina4/request.rb +268 -255
  81. data/lib/tina4/response.rb +346 -346
  82. data/lib/tina4/response_cache.rb +551 -551
  83. data/lib/tina4/router.rb +406 -406
  84. data/lib/tina4/scss/tina4css/_alerts.scss +34 -34
  85. data/lib/tina4/scss/tina4css/_badges.scss +22 -22
  86. data/lib/tina4/scss/tina4css/_buttons.scss +69 -69
  87. data/lib/tina4/scss/tina4css/_cards.scss +49 -49
  88. data/lib/tina4/scss/tina4css/_forms.scss +156 -156
  89. data/lib/tina4/scss/tina4css/_grid.scss +81 -81
  90. data/lib/tina4/scss/tina4css/_modals.scss +84 -84
  91. data/lib/tina4/scss/tina4css/_nav.scss +149 -149
  92. data/lib/tina4/scss/tina4css/_reset.scss +94 -94
  93. data/lib/tina4/scss/tina4css/_tables.scss +54 -54
  94. data/lib/tina4/scss/tina4css/_typography.scss +55 -55
  95. data/lib/tina4/scss/tina4css/_utilities.scss +197 -197
  96. data/lib/tina4/scss/tina4css/_variables.scss +117 -117
  97. data/lib/tina4/scss/tina4css/base.scss +1 -1
  98. data/lib/tina4/scss/tina4css/colors.scss +48 -48
  99. data/lib/tina4/scss/tina4css/tina4.scss +17 -17
  100. data/lib/tina4/scss_compiler.rb +178 -178
  101. data/lib/tina4/seeder.rb +567 -567
  102. data/lib/tina4/service_runner.rb +303 -303
  103. data/lib/tina4/session.rb +297 -297
  104. data/lib/tina4/session_handlers/database_handler.rb +72 -72
  105. data/lib/tina4/session_handlers/file_handler.rb +67 -67
  106. data/lib/tina4/session_handlers/mongo_handler.rb +49 -49
  107. data/lib/tina4/session_handlers/redis_handler.rb +43 -43
  108. data/lib/tina4/session_handlers/valkey_handler.rb +43 -43
  109. data/lib/tina4/shutdown.rb +84 -84
  110. data/lib/tina4/sql_translation.rb +158 -158
  111. data/lib/tina4/swagger.rb +124 -124
  112. data/lib/tina4/template.rb +894 -894
  113. data/lib/tina4/templates/base.twig +26 -26
  114. data/lib/tina4/templates/errors/302.twig +14 -14
  115. data/lib/tina4/templates/errors/401.twig +9 -9
  116. data/lib/tina4/templates/errors/403.twig +29 -29
  117. data/lib/tina4/templates/errors/404.twig +29 -29
  118. data/lib/tina4/templates/errors/500.twig +38 -38
  119. data/lib/tina4/templates/errors/502.twig +9 -9
  120. data/lib/tina4/templates/errors/503.twig +12 -12
  121. data/lib/tina4/templates/errors/base.twig +37 -37
  122. data/lib/tina4/test_client.rb +159 -159
  123. data/lib/tina4/testing.rb +340 -340
  124. data/lib/tina4/validator.rb +174 -174
  125. data/lib/tina4/version.rb +1 -1
  126. data/lib/tina4/webserver.rb +312 -312
  127. data/lib/tina4/websocket.rb +343 -343
  128. data/lib/tina4/websocket_backplane.rb +190 -190
  129. data/lib/tina4/wsdl.rb +564 -564
  130. data/lib/tina4.rb +458 -458
  131. data/lib/tina4ruby.rb +4 -4
  132. metadata +3 -3
@@ -1,81 +1,81 @@
1
- // Tina4 CSS Framework - 12-Column Flexbox Grid
2
- // -----------------------------------------------
3
-
4
- .container,
5
- .container-fluid {
6
- width: 100%;
7
- padding-right: calc($grid-gutter / 2);
8
- padding-left: calc($grid-gutter / 2);
9
- margin-right: auto;
10
- margin-left: auto;
11
- }
12
-
13
- @each $bp, $max-width in $container-max-widths {
14
- @media (min-width: map-get($breakpoints, $bp)) {
15
- .container {
16
- max-width: $max-width;
17
- }
18
- }
19
- }
20
-
21
- .row {
22
- display: flex;
23
- flex-wrap: wrap;
24
- margin-right: calc($grid-gutter / -2);
25
- margin-left: calc($grid-gutter / -2);
26
- > * {
27
- flex-shrink: 0;
28
- width: 100%;
29
- max-width: 100%;
30
- padding-right: calc($grid-gutter / 2);
31
- padding-left: calc($grid-gutter / 2);
32
- }
33
- }
34
-
35
- .col {
36
- flex: 1 0 0%;
37
- }
38
-
39
- // Generate base columns
40
- @for $i from 1 through $grid-columns {
41
- .col-#{$i} {
42
- flex: 0 0 auto;
43
- width: percentage($i / $grid-columns);
44
- }
45
- }
46
- @each $i in 1, 2, 3, 4 {
47
- .offset-#{$i} {
48
- margin-left: percentage($i / $grid-columns);
49
- }
50
- }
51
- .offset-0 { margin-left: 0; }
52
-
53
- // Responsive columns (core breakpoints only for size)
54
- $grid-breakpoints: (sm, md, lg, xl);
55
-
56
- @each $bp in $grid-breakpoints {
57
- $min-width: map-get($breakpoints, $bp);
58
- @media (min-width: $min-width) {
59
- .col-#{$bp} {
60
- flex: 1 0 0%;
61
- }
62
- @for $i from 1 through $grid-columns {
63
- .col-#{$bp}-#{$i} {
64
- flex: 0 0 auto;
65
- width: percentage($i / $grid-columns);
66
- }
67
- }
68
- .offset-#{$bp}-0 { margin-left: 0; }
69
- }
70
- }
71
-
72
- // Row alignment
73
- .justify-start { justify-content: flex-start; }
74
- .justify-center { justify-content: center; }
75
- .justify-end { justify-content: flex-end; }
76
- .justify-between { justify-content: space-between; }
77
- .justify-around { justify-content: space-around; }
78
-
79
- .align-start { align-items: flex-start; }
80
- .align-center { align-items: center; }
81
- .align-end { align-items: flex-end; }
1
+ // Tina4 CSS Framework - 12-Column Flexbox Grid
2
+ // -----------------------------------------------
3
+
4
+ .container,
5
+ .container-fluid {
6
+ width: 100%;
7
+ padding-right: calc($grid-gutter / 2);
8
+ padding-left: calc($grid-gutter / 2);
9
+ margin-right: auto;
10
+ margin-left: auto;
11
+ }
12
+
13
+ @each $bp, $max-width in $container-max-widths {
14
+ @media (min-width: map-get($breakpoints, $bp)) {
15
+ .container {
16
+ max-width: $max-width;
17
+ }
18
+ }
19
+ }
20
+
21
+ .row {
22
+ display: flex;
23
+ flex-wrap: wrap;
24
+ margin-right: calc($grid-gutter / -2);
25
+ margin-left: calc($grid-gutter / -2);
26
+ > * {
27
+ flex-shrink: 0;
28
+ width: 100%;
29
+ max-width: 100%;
30
+ padding-right: calc($grid-gutter / 2);
31
+ padding-left: calc($grid-gutter / 2);
32
+ }
33
+ }
34
+
35
+ .col {
36
+ flex: 1 0 0%;
37
+ }
38
+
39
+ // Generate base columns
40
+ @for $i from 1 through $grid-columns {
41
+ .col-#{$i} {
42
+ flex: 0 0 auto;
43
+ width: percentage($i / $grid-columns);
44
+ }
45
+ }
46
+ @each $i in 1, 2, 3, 4 {
47
+ .offset-#{$i} {
48
+ margin-left: percentage($i / $grid-columns);
49
+ }
50
+ }
51
+ .offset-0 { margin-left: 0; }
52
+
53
+ // Responsive columns (core breakpoints only for size)
54
+ $grid-breakpoints: (sm, md, lg, xl);
55
+
56
+ @each $bp in $grid-breakpoints {
57
+ $min-width: map-get($breakpoints, $bp);
58
+ @media (min-width: $min-width) {
59
+ .col-#{$bp} {
60
+ flex: 1 0 0%;
61
+ }
62
+ @for $i from 1 through $grid-columns {
63
+ .col-#{$bp}-#{$i} {
64
+ flex: 0 0 auto;
65
+ width: percentage($i / $grid-columns);
66
+ }
67
+ }
68
+ .offset-#{$bp}-0 { margin-left: 0; }
69
+ }
70
+ }
71
+
72
+ // Row alignment
73
+ .justify-start { justify-content: flex-start; }
74
+ .justify-center { justify-content: center; }
75
+ .justify-end { justify-content: flex-end; }
76
+ .justify-between { justify-content: space-between; }
77
+ .justify-around { justify-content: space-around; }
78
+
79
+ .align-start { align-items: flex-start; }
80
+ .align-center { align-items: center; }
81
+ .align-end { align-items: flex-end; }
@@ -1,84 +1,84 @@
1
- // Tina4 CSS Framework - Modals
2
- // -------------------------------
3
-
4
- .modal {
5
- position: fixed;
6
- top: 0;
7
- left: 0;
8
- z-index: $zindex-modal;
9
- display: none;
10
- width: 100%;
11
- height: 100%;
12
- overflow-x: hidden;
13
- overflow-y: auto;
14
- outline: 0;
15
-
16
- &.show { display: block; }
17
- }
18
-
19
- .modal-dialog {
20
- position: relative;
21
- width: auto;
22
- margin: 1.75rem auto;
23
- max-width: 500px;
24
- }
25
-
26
- .modal-sm { max-width: 300px; }
27
- .modal-lg { max-width: 800px; }
28
-
29
- .modal-content {
30
- position: relative;
31
- display: flex;
32
- flex-direction: column;
33
- width: 100%;
34
- pointer-events: auto;
35
- background-color: $white;
36
- background-clip: padding-box;
37
- border: 1px solid rgba($black, 0.2);
38
- border-radius: $border-radius-lg;
39
- box-shadow: $shadow;
40
- outline: 0;
41
- }
42
-
43
- .modal-header {
44
- display: flex;
45
- flex-shrink: 0;
46
- align-items: center;
47
- justify-content: space-between;
48
- padding: 1rem;
49
- border-bottom: 1px solid rgba($black, 0.1);
50
- }
51
-
52
- .modal-title {
53
- margin-bottom: 0;
54
- font-weight: $font-weight-bold;
55
- }
56
-
57
- .modal-body {
58
- position: relative;
59
- flex: 1 1 auto;
60
- padding: 1rem;
61
- }
62
-
63
- .modal-footer {
64
- display: flex;
65
- flex-shrink: 0;
66
- flex-wrap: wrap;
67
- align-items: center;
68
- justify-content: flex-end;
69
- padding: 0.75rem;
70
- border-top: 1px solid rgba($black, 0.1);
71
- gap: 0.5rem;
72
- }
73
-
74
- .modal-backdrop {
75
- position: fixed;
76
- top: 0;
77
- left: 0;
78
- z-index: $zindex-backdrop;
79
- width: 100vw;
80
- height: 100vh;
81
- background-color: rgba($black, 0.5);
82
- display: none;
83
- &.show { display: block; }
84
- }
1
+ // Tina4 CSS Framework - Modals
2
+ // -------------------------------
3
+
4
+ .modal {
5
+ position: fixed;
6
+ top: 0;
7
+ left: 0;
8
+ z-index: $zindex-modal;
9
+ display: none;
10
+ width: 100%;
11
+ height: 100%;
12
+ overflow-x: hidden;
13
+ overflow-y: auto;
14
+ outline: 0;
15
+
16
+ &.show { display: block; }
17
+ }
18
+
19
+ .modal-dialog {
20
+ position: relative;
21
+ width: auto;
22
+ margin: 1.75rem auto;
23
+ max-width: 500px;
24
+ }
25
+
26
+ .modal-sm { max-width: 300px; }
27
+ .modal-lg { max-width: 800px; }
28
+
29
+ .modal-content {
30
+ position: relative;
31
+ display: flex;
32
+ flex-direction: column;
33
+ width: 100%;
34
+ pointer-events: auto;
35
+ background-color: $white;
36
+ background-clip: padding-box;
37
+ border: 1px solid rgba($black, 0.2);
38
+ border-radius: $border-radius-lg;
39
+ box-shadow: $shadow;
40
+ outline: 0;
41
+ }
42
+
43
+ .modal-header {
44
+ display: flex;
45
+ flex-shrink: 0;
46
+ align-items: center;
47
+ justify-content: space-between;
48
+ padding: 1rem;
49
+ border-bottom: 1px solid rgba($black, 0.1);
50
+ }
51
+
52
+ .modal-title {
53
+ margin-bottom: 0;
54
+ font-weight: $font-weight-bold;
55
+ }
56
+
57
+ .modal-body {
58
+ position: relative;
59
+ flex: 1 1 auto;
60
+ padding: 1rem;
61
+ }
62
+
63
+ .modal-footer {
64
+ display: flex;
65
+ flex-shrink: 0;
66
+ flex-wrap: wrap;
67
+ align-items: center;
68
+ justify-content: flex-end;
69
+ padding: 0.75rem;
70
+ border-top: 1px solid rgba($black, 0.1);
71
+ gap: 0.5rem;
72
+ }
73
+
74
+ .modal-backdrop {
75
+ position: fixed;
76
+ top: 0;
77
+ left: 0;
78
+ z-index: $zindex-backdrop;
79
+ width: 100vw;
80
+ height: 100vh;
81
+ background-color: rgba($black, 0.5);
82
+ display: none;
83
+ &.show { display: block; }
84
+ }
@@ -1,149 +1,149 @@
1
- // Tina4 CSS Framework - Navigation
2
- // -----------------------------------
3
-
4
- .nav {
5
- display: flex;
6
- flex-wrap: wrap;
7
- padding-left: 0;
8
- margin-bottom: 0;
9
- list-style: none;
10
- }
11
-
12
- .nav-item { }
13
-
14
- .nav-link {
15
- display: block;
16
- padding: 0.5rem 1rem;
17
- color: $link-color;
18
- text-decoration: none;
19
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out;
20
-
21
- &:hover, &:focus {
22
- color: $link-hover-color;
23
- }
24
-
25
- &.disabled {
26
- color: $muted;
27
- pointer-events: none;
28
- cursor: default;
29
- }
30
-
31
- &.active {
32
- color: $primary;
33
- font-weight: $font-weight-bold;
34
- }
35
- }
36
-
37
- // Navbar
38
- .navbar {
39
- position: relative;
40
- display: flex;
41
- flex-wrap: wrap;
42
- align-items: center;
43
- justify-content: space-between;
44
- padding: 0.5rem 1rem;
45
- }
46
-
47
- .navbar-brand {
48
- padding-top: 0.3125rem;
49
- padding-bottom: 0.3125rem;
50
- margin-right: 1rem;
51
- font-size: $font-size-xl;
52
- font-weight: $font-weight-bold;
53
- color: inherit;
54
- text-decoration: none;
55
- white-space: nowrap;
56
- &:hover { color: inherit; opacity: 0.8; }
57
- }
58
-
59
- .navbar-nav {
60
- display: flex;
61
- flex-direction: column;
62
- padding-left: 0;
63
- margin-bottom: 0;
64
- list-style: none;
65
- .nav-link {
66
- padding-right: 0.5rem;
67
- padding-left: 0.5rem;
68
- }
69
- }
70
-
71
- .navbar-toggler {
72
- padding: 0.25rem 0.75rem;
73
- font-size: $font-size-lg;
74
- line-height: 1;
75
- background-color: transparent;
76
- border: 1px solid rgba($black, 0.1);
77
- border-radius: $border-radius;
78
- cursor: pointer;
79
- &:focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba($primary, 0.25); }
80
- }
81
-
82
- .navbar-collapse {
83
- flex-basis: 100%;
84
- flex-grow: 1;
85
- align-items: center;
86
- display: none;
87
- &.show { display: flex; }
88
- }
89
-
90
- // Responsive expand classes
91
- @each $bp, $px in $breakpoints {
92
- .navbar-expand-#{$bp} {
93
- @media (min-width: $px) {
94
- .navbar-nav { flex-direction: row; }
95
- .navbar-collapse { display: flex; flex-basis: auto; }
96
- .navbar-toggler { display: none; }
97
- }
98
- }
99
- }
100
-
101
- // Legacy: bare .navbar also expands at lg
102
- @media (min-width: map-get($breakpoints, lg)) {
103
- .navbar-nav {
104
- flex-direction: row;
105
- }
106
- .navbar-collapse {
107
- display: flex;
108
- flex-basis: auto;
109
- }
110
- .navbar-toggler {
111
- display: none;
112
- }
113
- }
114
-
115
- .navbar-dark {
116
- color: $white;
117
- background-color: $dark;
118
- .navbar-brand { color: $white; }
119
- .nav-link { color: rgba($white, 0.75); &:hover, &.active { color: $white; } }
120
- }
121
-
122
- .navbar-light {
123
- background-color: $light;
124
- .nav-link { color: rgba($black, 0.55); &:hover, &.active { color: rgba($black, 0.9); } }
125
- }
126
-
127
- // Breadcrumb
128
- .breadcrumb {
129
- display: flex;
130
- flex-wrap: wrap;
131
- padding: 0.5rem 1rem;
132
- margin-bottom: 1rem;
133
- list-style: none;
134
- background-color: $light;
135
- border-radius: $border-radius;
136
- }
137
-
138
- .breadcrumb-item {
139
- & + .breadcrumb-item::before {
140
- display: inline-block;
141
- padding-right: 0.5rem;
142
- padding-left: 0.5rem;
143
- color: $muted;
144
- content: "/";
145
- }
146
- &.active {
147
- color: $muted;
148
- }
149
- }
1
+ // Tina4 CSS Framework - Navigation
2
+ // -----------------------------------
3
+
4
+ .nav {
5
+ display: flex;
6
+ flex-wrap: wrap;
7
+ padding-left: 0;
8
+ margin-bottom: 0;
9
+ list-style: none;
10
+ }
11
+
12
+ .nav-item { }
13
+
14
+ .nav-link {
15
+ display: block;
16
+ padding: 0.5rem 1rem;
17
+ color: $link-color;
18
+ text-decoration: none;
19
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out;
20
+
21
+ &:hover, &:focus {
22
+ color: $link-hover-color;
23
+ }
24
+
25
+ &.disabled {
26
+ color: $muted;
27
+ pointer-events: none;
28
+ cursor: default;
29
+ }
30
+
31
+ &.active {
32
+ color: $primary;
33
+ font-weight: $font-weight-bold;
34
+ }
35
+ }
36
+
37
+ // Navbar
38
+ .navbar {
39
+ position: relative;
40
+ display: flex;
41
+ flex-wrap: wrap;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ padding: 0.5rem 1rem;
45
+ }
46
+
47
+ .navbar-brand {
48
+ padding-top: 0.3125rem;
49
+ padding-bottom: 0.3125rem;
50
+ margin-right: 1rem;
51
+ font-size: $font-size-xl;
52
+ font-weight: $font-weight-bold;
53
+ color: inherit;
54
+ text-decoration: none;
55
+ white-space: nowrap;
56
+ &:hover { color: inherit; opacity: 0.8; }
57
+ }
58
+
59
+ .navbar-nav {
60
+ display: flex;
61
+ flex-direction: column;
62
+ padding-left: 0;
63
+ margin-bottom: 0;
64
+ list-style: none;
65
+ .nav-link {
66
+ padding-right: 0.5rem;
67
+ padding-left: 0.5rem;
68
+ }
69
+ }
70
+
71
+ .navbar-toggler {
72
+ padding: 0.25rem 0.75rem;
73
+ font-size: $font-size-lg;
74
+ line-height: 1;
75
+ background-color: transparent;
76
+ border: 1px solid rgba($black, 0.1);
77
+ border-radius: $border-radius;
78
+ cursor: pointer;
79
+ &:focus { outline: 0; box-shadow: 0 0 0 0.2rem rgba($primary, 0.25); }
80
+ }
81
+
82
+ .navbar-collapse {
83
+ flex-basis: 100%;
84
+ flex-grow: 1;
85
+ align-items: center;
86
+ display: none;
87
+ &.show { display: flex; }
88
+ }
89
+
90
+ // Responsive expand classes
91
+ @each $bp, $px in $breakpoints {
92
+ .navbar-expand-#{$bp} {
93
+ @media (min-width: $px) {
94
+ .navbar-nav { flex-direction: row; }
95
+ .navbar-collapse { display: flex; flex-basis: auto; }
96
+ .navbar-toggler { display: none; }
97
+ }
98
+ }
99
+ }
100
+
101
+ // Legacy: bare .navbar also expands at lg
102
+ @media (min-width: map-get($breakpoints, lg)) {
103
+ .navbar-nav {
104
+ flex-direction: row;
105
+ }
106
+ .navbar-collapse {
107
+ display: flex;
108
+ flex-basis: auto;
109
+ }
110
+ .navbar-toggler {
111
+ display: none;
112
+ }
113
+ }
114
+
115
+ .navbar-dark {
116
+ color: $white;
117
+ background-color: $dark;
118
+ .navbar-brand { color: $white; }
119
+ .nav-link { color: rgba($white, 0.75); &:hover, &.active { color: $white; } }
120
+ }
121
+
122
+ .navbar-light {
123
+ background-color: $light;
124
+ .nav-link { color: rgba($black, 0.55); &:hover, &.active { color: rgba($black, 0.9); } }
125
+ }
126
+
127
+ // Breadcrumb
128
+ .breadcrumb {
129
+ display: flex;
130
+ flex-wrap: wrap;
131
+ padding: 0.5rem 1rem;
132
+ margin-bottom: 1rem;
133
+ list-style: none;
134
+ background-color: $light;
135
+ border-radius: $border-radius;
136
+ }
137
+
138
+ .breadcrumb-item {
139
+ & + .breadcrumb-item::before {
140
+ display: inline-block;
141
+ padding-right: 0.5rem;
142
+ padding-left: 0.5rem;
143
+ color: $muted;
144
+ content: "/";
145
+ }
146
+ &.active {
147
+ color: $muted;
148
+ }
149
+ }