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,34 +1,34 @@
1
- // Tina4 CSS Framework - Alerts
2
- // -------------------------------
3
-
4
- .alert {
5
- position: relative;
6
- padding: 0.75rem 1rem;
7
- margin-bottom: 1rem;
8
- border: 1px solid transparent;
9
- border-radius: $border-radius;
10
- }
11
-
12
- @each $name, $color in $theme-colors {
13
- .alert-#{$name} {
14
- color: darken($color, 25%);
15
- background-color: lighten($color, 35%);
16
- border-color: lighten($color, 25%);
17
- }
18
- }
19
-
20
- .alert-dismissible {
21
- padding-right: 3rem;
22
- .btn-close {
23
- position: absolute;
24
- top: 0;
25
- right: 0;
26
- padding: 0.9375rem 1rem;
27
- background: transparent;
28
- border: 0;
29
- cursor: pointer;
30
- color: inherit;
31
- opacity: 0.5;
32
- &:hover { opacity: 0.75; }
33
- }
34
- }
1
+ // Tina4 CSS Framework - Alerts
2
+ // -------------------------------
3
+
4
+ .alert {
5
+ position: relative;
6
+ padding: 0.75rem 1rem;
7
+ margin-bottom: 1rem;
8
+ border: 1px solid transparent;
9
+ border-radius: $border-radius;
10
+ }
11
+
12
+ @each $name, $color in $theme-colors {
13
+ .alert-#{$name} {
14
+ color: darken($color, 25%);
15
+ background-color: lighten($color, 35%);
16
+ border-color: lighten($color, 25%);
17
+ }
18
+ }
19
+
20
+ .alert-dismissible {
21
+ padding-right: 3rem;
22
+ .btn-close {
23
+ position: absolute;
24
+ top: 0;
25
+ right: 0;
26
+ padding: 0.9375rem 1rem;
27
+ background: transparent;
28
+ border: 0;
29
+ cursor: pointer;
30
+ color: inherit;
31
+ opacity: 0.5;
32
+ &:hover { opacity: 0.75; }
33
+ }
34
+ }
@@ -1,22 +1,22 @@
1
- // Tina4 CSS Framework - Badges
2
- // -------------------------------
3
-
4
- .badge {
5
- display: inline-block;
6
- padding: 0.25em 0.65em;
7
- font-size: 0.75em;
8
- font-weight: $font-weight-bold;
9
- line-height: 1;
10
- color: $white;
11
- text-align: center;
12
- white-space: nowrap;
13
- vertical-align: baseline;
14
- border-radius: $border-radius-pill;
15
- }
16
-
17
- @each $name, $color in $theme-colors {
18
- .badge-#{$name} {
19
- color: if($name == "light" or $name == "warning", $dark, $white);
20
- background-color: $color;
21
- }
22
- }
1
+ // Tina4 CSS Framework - Badges
2
+ // -------------------------------
3
+
4
+ .badge {
5
+ display: inline-block;
6
+ padding: 0.25em 0.65em;
7
+ font-size: 0.75em;
8
+ font-weight: $font-weight-bold;
9
+ line-height: 1;
10
+ color: $white;
11
+ text-align: center;
12
+ white-space: nowrap;
13
+ vertical-align: baseline;
14
+ border-radius: $border-radius-pill;
15
+ }
16
+
17
+ @each $name, $color in $theme-colors {
18
+ .badge-#{$name} {
19
+ color: if($name == "light" or $name == "warning", $dark, $white);
20
+ background-color: $color;
21
+ }
22
+ }
@@ -1,69 +1,69 @@
1
- // Tina4 CSS Framework - Buttons
2
- // --------------------------------
3
-
4
- .btn {
5
- display: inline-block;
6
- font-weight: $font-weight-normal;
7
- line-height: $line-height-base;
8
- color: $body-color;
9
- text-align: center;
10
- vertical-align: middle;
11
- cursor: pointer;
12
- user-select: none;
13
- background-color: transparent;
14
- border: 1px solid transparent;
15
- padding: 0.375rem 0.75rem;
16
- font-size: $font-size-base;
17
- border-radius: $border-radius;
18
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
19
- text-decoration: none;
20
-
21
- &:disabled, &.disabled {
22
- pointer-events: none;
23
- opacity: 0.65;
24
- }
25
- }
26
-
27
- // Solid buttons
28
- @each $name, $color in $theme-colors {
29
- $text: if($name == "light" or $name == "warning", $dark, $white);
30
- .btn-#{$name} {
31
- color: $text;
32
- background-color: $color;
33
- border-color: $color;
34
- &:hover {
35
- background-color: darken($color, 8%);
36
- border-color: darken($color, 10%);
37
- }
38
- }
39
- }
40
-
41
- // Outline buttons
42
- @each $name, $color in $theme-colors {
43
- .btn-outline-#{$name} {
44
- color: $color;
45
- border-color: $color;
46
- background-color: transparent;
47
- &:hover {
48
- color: if($name == "light" or $name == "warning", $dark, $white);
49
- background-color: $color;
50
- }
51
- }
52
- }
53
-
54
- .btn-sm {
55
- padding: 0.25rem 0.5rem;
56
- font-size: $font-size-sm;
57
- border-radius: $border-radius-sm;
58
- }
59
-
60
- .btn-lg {
61
- padding: 0.5rem 1rem;
62
- font-size: $font-size-lg;
63
- border-radius: $border-radius-lg;
64
- }
65
-
66
- .btn-block {
67
- display: block;
68
- width: 100%;
69
- }
1
+ // Tina4 CSS Framework - Buttons
2
+ // --------------------------------
3
+
4
+ .btn {
5
+ display: inline-block;
6
+ font-weight: $font-weight-normal;
7
+ line-height: $line-height-base;
8
+ color: $body-color;
9
+ text-align: center;
10
+ vertical-align: middle;
11
+ cursor: pointer;
12
+ user-select: none;
13
+ background-color: transparent;
14
+ border: 1px solid transparent;
15
+ padding: 0.375rem 0.75rem;
16
+ font-size: $font-size-base;
17
+ border-radius: $border-radius;
18
+ transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
19
+ text-decoration: none;
20
+
21
+ &:disabled, &.disabled {
22
+ pointer-events: none;
23
+ opacity: 0.65;
24
+ }
25
+ }
26
+
27
+ // Solid buttons
28
+ @each $name, $color in $theme-colors {
29
+ $text: if($name == "light" or $name == "warning", $dark, $white);
30
+ .btn-#{$name} {
31
+ color: $text;
32
+ background-color: $color;
33
+ border-color: $color;
34
+ &:hover {
35
+ background-color: darken($color, 8%);
36
+ border-color: darken($color, 10%);
37
+ }
38
+ }
39
+ }
40
+
41
+ // Outline buttons
42
+ @each $name, $color in $theme-colors {
43
+ .btn-outline-#{$name} {
44
+ color: $color;
45
+ border-color: $color;
46
+ background-color: transparent;
47
+ &:hover {
48
+ color: if($name == "light" or $name == "warning", $dark, $white);
49
+ background-color: $color;
50
+ }
51
+ }
52
+ }
53
+
54
+ .btn-sm {
55
+ padding: 0.25rem 0.5rem;
56
+ font-size: $font-size-sm;
57
+ border-radius: $border-radius-sm;
58
+ }
59
+
60
+ .btn-lg {
61
+ padding: 0.5rem 1rem;
62
+ font-size: $font-size-lg;
63
+ border-radius: $border-radius-lg;
64
+ }
65
+
66
+ .btn-block {
67
+ display: block;
68
+ width: 100%;
69
+ }
@@ -1,49 +1,49 @@
1
- // Tina4 CSS Framework - Cards
2
- // ------------------------------
3
-
4
- .card {
5
- position: relative;
6
- display: flex;
7
- flex-direction: column;
8
- min-width: 0;
9
- word-wrap: break-word;
10
- background-color: $white;
11
- background-clip: border-box;
12
- border: 1px solid rgba($black, 0.125);
13
- border-radius: $border-radius-lg;
14
- }
15
-
16
- .card-header {
17
- padding: 0.75rem 1rem;
18
- margin-bottom: 0;
19
- background-color: rgba($black, 0.03);
20
- border-bottom: 1px solid rgba($black, 0.125);
21
- &:first-child { border-radius: calc($border-radius-lg - 1px) calc($border-radius-lg - 1px) 0 0; }
22
- }
23
-
24
- .card-body {
25
- flex: 1 1 auto;
26
- padding: 1rem;
27
- }
28
-
29
- .card-footer {
30
- padding: 0.75rem 1rem;
31
- background-color: rgba($black, 0.03);
32
- border-top: 1px solid rgba($black, 0.125);
33
- &:last-child { border-radius: 0 0 calc($border-radius-lg - 1px) calc($border-radius-lg - 1px); }
34
- }
35
-
36
- .card-title {
37
- margin-bottom: 0.5rem;
38
- font-weight: $font-weight-bold;
39
- }
40
-
41
- .card-text:last-child {
42
- margin-bottom: 0;
43
- }
44
-
45
- .card-img-top {
46
- width: 100%;
47
- border-top-left-radius: calc($border-radius-lg - 1px);
48
- border-top-right-radius: calc($border-radius-lg - 1px);
49
- }
1
+ // Tina4 CSS Framework - Cards
2
+ // ------------------------------
3
+
4
+ .card {
5
+ position: relative;
6
+ display: flex;
7
+ flex-direction: column;
8
+ min-width: 0;
9
+ word-wrap: break-word;
10
+ background-color: $white;
11
+ background-clip: border-box;
12
+ border: 1px solid rgba($black, 0.125);
13
+ border-radius: $border-radius-lg;
14
+ }
15
+
16
+ .card-header {
17
+ padding: 0.75rem 1rem;
18
+ margin-bottom: 0;
19
+ background-color: rgba($black, 0.03);
20
+ border-bottom: 1px solid rgba($black, 0.125);
21
+ &:first-child { border-radius: calc($border-radius-lg - 1px) calc($border-radius-lg - 1px) 0 0; }
22
+ }
23
+
24
+ .card-body {
25
+ flex: 1 1 auto;
26
+ padding: 1rem;
27
+ }
28
+
29
+ .card-footer {
30
+ padding: 0.75rem 1rem;
31
+ background-color: rgba($black, 0.03);
32
+ border-top: 1px solid rgba($black, 0.125);
33
+ &:last-child { border-radius: 0 0 calc($border-radius-lg - 1px) calc($border-radius-lg - 1px); }
34
+ }
35
+
36
+ .card-title {
37
+ margin-bottom: 0.5rem;
38
+ font-weight: $font-weight-bold;
39
+ }
40
+
41
+ .card-text:last-child {
42
+ margin-bottom: 0;
43
+ }
44
+
45
+ .card-img-top {
46
+ width: 100%;
47
+ border-top-left-radius: calc($border-radius-lg - 1px);
48
+ border-top-right-radius: calc($border-radius-lg - 1px);
49
+ }
@@ -1,156 +1,156 @@
1
- // Tina4 CSS Framework - Forms
2
- // ------------------------------
3
-
4
- .form-group {
5
- margin-bottom: 1rem;
6
- }
7
-
8
- .form-label {
9
- display: inline-block;
10
- margin-bottom: 0.5rem;
11
- font-weight: $font-weight-bold;
12
- }
13
-
14
- .form-control {
15
- display: block;
16
- width: 100%;
17
- padding: 0.375rem 0.75rem;
18
- font-size: $font-size-base;
19
- font-weight: $font-weight-normal;
20
- line-height: $line-height-base;
21
- color: $body-color;
22
- background-color: $white;
23
- background-clip: padding-box;
24
- border: 1px solid #ced4da;
25
- border-radius: $border-radius;
26
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
27
- appearance: none;
28
-
29
- &:focus {
30
- color: $body-color;
31
- background-color: $white;
32
- border-color: lighten($primary, 25%);
33
- outline: 0;
34
- box-shadow: 0 0 0 0.2rem rgba($primary, 0.25);
35
- }
36
-
37
- &::placeholder {
38
- color: $muted;
39
- opacity: 1;
40
- }
41
-
42
- &:disabled {
43
- background-color: $light;
44
- opacity: 1;
45
- }
46
- }
47
-
48
- textarea.form-control {
49
- min-height: calc(1.5em + 0.75rem + 2px);
50
- }
51
-
52
- .form-select {
53
- display: block;
54
- width: 100%;
55
- padding: 0.375rem 2.25rem 0.375rem 0.75rem;
56
- font-size: $font-size-base;
57
- font-weight: $font-weight-normal;
58
- line-height: $line-height-base;
59
- color: $body-color;
60
- background-color: $white;
61
- border: 1px solid #ced4da;
62
- border-radius: $border-radius;
63
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
64
- appearance: none;
65
-
66
- &:focus {
67
- border-color: lighten($primary, 25%);
68
- outline: 0;
69
- box-shadow: 0 0 0 0.2rem rgba($primary, 0.25);
70
- }
71
- }
72
-
73
- // Checkboxes and radios
74
- .form-check {
75
- display: block;
76
- min-height: $line-height-base * 1rem;
77
- padding-left: 1.5em;
78
- margin-bottom: 0.125rem;
79
- }
80
-
81
- .form-check-input {
82
- float: left;
83
- width: 1em;
84
- height: 1em;
85
- margin-left: -1.5em;
86
- margin-top: 0.25em;
87
- appearance: none;
88
- background-color: $white;
89
- border: 1px solid rgba($black, 0.25);
90
- &[type="checkbox"] { border-radius: 0.25em; }
91
- &[type="radio"] { border-radius: 50%; }
92
- &:checked { background-color: $primary; border-color: $primary; }
93
- &:focus { border-color: lighten($primary, 25%); outline: 0; box-shadow: 0 0 0 0.2rem rgba($primary, 0.25); }
94
- }
95
-
96
- .form-check-label { cursor: pointer; }
97
-
98
- // Validation
99
- .is-valid {
100
- border-color: $success !important;
101
- &:focus {
102
- box-shadow: 0 0 0 0.2rem rgba($success, 0.25) !important;
103
- }
104
- }
105
-
106
- .is-invalid {
107
- border-color: $danger !important;
108
- &:focus {
109
- box-shadow: 0 0 0 0.2rem rgba($danger, 0.25) !important;
110
- }
111
- }
112
-
113
- .valid-feedback,
114
- .invalid-feedback {
115
- display: none;
116
- width: 100%;
117
- margin-top: 0.25rem;
118
- font-size: 0.875em;
119
- }
120
- .valid-feedback { color: $success; }
121
- .invalid-feedback { color: $danger; }
122
-
123
- .is-valid ~ .valid-feedback,
124
- .is-invalid ~ .invalid-feedback {
125
- display: block;
126
- }
127
-
128
- // Input group
129
- .input-group {
130
- position: relative;
131
- display: flex;
132
- flex-wrap: wrap;
133
- align-items: stretch;
134
- width: 100%;
135
- > .form-control,
136
- > .form-select {
137
- position: relative;
138
- flex: 1 1 auto;
139
- width: 1%;
140
- min-width: 0;
141
- }
142
- }
143
-
144
- .input-group-text {
145
- display: flex;
146
- align-items: center;
147
- padding: 0.375rem 0.75rem;
148
- font-size: $font-size-base;
149
- line-height: $line-height-base;
150
- color: $body-color;
151
- text-align: center;
152
- white-space: nowrap;
153
- background-color: $light;
154
- border: 1px solid #ced4da;
155
- border-radius: $border-radius;
156
- }
1
+ // Tina4 CSS Framework - Forms
2
+ // ------------------------------
3
+
4
+ .form-group {
5
+ margin-bottom: 1rem;
6
+ }
7
+
8
+ .form-label {
9
+ display: inline-block;
10
+ margin-bottom: 0.5rem;
11
+ font-weight: $font-weight-bold;
12
+ }
13
+
14
+ .form-control {
15
+ display: block;
16
+ width: 100%;
17
+ padding: 0.375rem 0.75rem;
18
+ font-size: $font-size-base;
19
+ font-weight: $font-weight-normal;
20
+ line-height: $line-height-base;
21
+ color: $body-color;
22
+ background-color: $white;
23
+ background-clip: padding-box;
24
+ border: 1px solid #ced4da;
25
+ border-radius: $border-radius;
26
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
27
+ appearance: none;
28
+
29
+ &:focus {
30
+ color: $body-color;
31
+ background-color: $white;
32
+ border-color: lighten($primary, 25%);
33
+ outline: 0;
34
+ box-shadow: 0 0 0 0.2rem rgba($primary, 0.25);
35
+ }
36
+
37
+ &::placeholder {
38
+ color: $muted;
39
+ opacity: 1;
40
+ }
41
+
42
+ &:disabled {
43
+ background-color: $light;
44
+ opacity: 1;
45
+ }
46
+ }
47
+
48
+ textarea.form-control {
49
+ min-height: calc(1.5em + 0.75rem + 2px);
50
+ }
51
+
52
+ .form-select {
53
+ display: block;
54
+ width: 100%;
55
+ padding: 0.375rem 2.25rem 0.375rem 0.75rem;
56
+ font-size: $font-size-base;
57
+ font-weight: $font-weight-normal;
58
+ line-height: $line-height-base;
59
+ color: $body-color;
60
+ background-color: $white;
61
+ border: 1px solid #ced4da;
62
+ border-radius: $border-radius;
63
+ transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
64
+ appearance: none;
65
+
66
+ &:focus {
67
+ border-color: lighten($primary, 25%);
68
+ outline: 0;
69
+ box-shadow: 0 0 0 0.2rem rgba($primary, 0.25);
70
+ }
71
+ }
72
+
73
+ // Checkboxes and radios
74
+ .form-check {
75
+ display: block;
76
+ min-height: $line-height-base * 1rem;
77
+ padding-left: 1.5em;
78
+ margin-bottom: 0.125rem;
79
+ }
80
+
81
+ .form-check-input {
82
+ float: left;
83
+ width: 1em;
84
+ height: 1em;
85
+ margin-left: -1.5em;
86
+ margin-top: 0.25em;
87
+ appearance: none;
88
+ background-color: $white;
89
+ border: 1px solid rgba($black, 0.25);
90
+ &[type="checkbox"] { border-radius: 0.25em; }
91
+ &[type="radio"] { border-radius: 50%; }
92
+ &:checked { background-color: $primary; border-color: $primary; }
93
+ &:focus { border-color: lighten($primary, 25%); outline: 0; box-shadow: 0 0 0 0.2rem rgba($primary, 0.25); }
94
+ }
95
+
96
+ .form-check-label { cursor: pointer; }
97
+
98
+ // Validation
99
+ .is-valid {
100
+ border-color: $success !important;
101
+ &:focus {
102
+ box-shadow: 0 0 0 0.2rem rgba($success, 0.25) !important;
103
+ }
104
+ }
105
+
106
+ .is-invalid {
107
+ border-color: $danger !important;
108
+ &:focus {
109
+ box-shadow: 0 0 0 0.2rem rgba($danger, 0.25) !important;
110
+ }
111
+ }
112
+
113
+ .valid-feedback,
114
+ .invalid-feedback {
115
+ display: none;
116
+ width: 100%;
117
+ margin-top: 0.25rem;
118
+ font-size: 0.875em;
119
+ }
120
+ .valid-feedback { color: $success; }
121
+ .invalid-feedback { color: $danger; }
122
+
123
+ .is-valid ~ .valid-feedback,
124
+ .is-invalid ~ .invalid-feedback {
125
+ display: block;
126
+ }
127
+
128
+ // Input group
129
+ .input-group {
130
+ position: relative;
131
+ display: flex;
132
+ flex-wrap: wrap;
133
+ align-items: stretch;
134
+ width: 100%;
135
+ > .form-control,
136
+ > .form-select {
137
+ position: relative;
138
+ flex: 1 1 auto;
139
+ width: 1%;
140
+ min-width: 0;
141
+ }
142
+ }
143
+
144
+ .input-group-text {
145
+ display: flex;
146
+ align-items: center;
147
+ padding: 0.375rem 0.75rem;
148
+ font-size: $font-size-base;
149
+ line-height: $line-height-base;
150
+ color: $body-color;
151
+ text-align: center;
152
+ white-space: nowrap;
153
+ background-color: $light;
154
+ border: 1px solid #ced4da;
155
+ border-radius: $border-radius;
156
+ }