tina4ruby 3.13.96 → 3.13.98
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.
- checksums.yaml +4 -4
- data/lib/tina4/queue_backends/rabbitmq_backend.rb +28 -14
- data/lib/tina4/session.rb +13 -4
- data/lib/tina4/version.rb +1 -1
- metadata +2 -19
- data/lib/tina4/scss/tina4css/_alerts.scss +0 -34
- data/lib/tina4/scss/tina4css/_badges.scss +0 -22
- data/lib/tina4/scss/tina4css/_buttons.scss +0 -69
- data/lib/tina4/scss/tina4css/_cards.scss +0 -49
- data/lib/tina4/scss/tina4css/_forms.scss +0 -156
- data/lib/tina4/scss/tina4css/_grid.scss +0 -81
- data/lib/tina4/scss/tina4css/_modals.scss +0 -84
- data/lib/tina4/scss/tina4css/_nav.scss +0 -149
- data/lib/tina4/scss/tina4css/_pagination.scss +0 -63
- data/lib/tina4/scss/tina4css/_reset.scss +0 -94
- data/lib/tina4/scss/tina4css/_tables.scss +0 -54
- data/lib/tina4/scss/tina4css/_typography.scss +0 -55
- data/lib/tina4/scss/tina4css/_utilities.scss +0 -208
- data/lib/tina4/scss/tina4css/_variables.scss +0 -117
- data/lib/tina4/scss/tina4css/base.scss +0 -1
- data/lib/tina4/scss/tina4css/colors.scss +0 -48
- data/lib/tina4/scss/tina4css/tina4.scss +0 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: db66aec06f70379f6d717725d53c4d0a8a93c98f90cd65dff744e787a3c91593
|
|
4
|
+
data.tar.gz: 40240b850e132eec2cca262192eda3f6b3d228a2ee7c691d3b8d190a1e92bac6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4b693353e1ae71d945e7f4b4526668c7e59a57a8fe440be5355a57015857b66b7be83663573ed74340e97122ac6cbccfb70fb22294d6c8559e058f66f6615ca2
|
|
7
|
+
data.tar.gz: 1d350415d02e713d96ffc3730d9aad377d011f5079caafffeae046e2ff51f3813ca640eecc91559d0fe9ae29999666f99f71aadc1528716f15d8234ce3f66d63
|
|
@@ -210,18 +210,36 @@ module Tina4
|
|
|
210
210
|
true
|
|
211
211
|
end
|
|
212
212
|
|
|
213
|
-
#
|
|
214
|
-
#
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
213
|
+
# Not performable on RabbitMQ - raises naming the backend and the operation.
|
|
214
|
+
#
|
|
215
|
+
# purge(status) removes jobs SELECTED BY STATUS. RabbitMQ cannot address
|
|
216
|
+
# messages by status: basic.get pops the head of the queue and the only
|
|
217
|
+
# bulk operation is queue.purge, which empties the WHOLE live queue
|
|
218
|
+
# regardless of status. This used to drain that queue on any non-dead
|
|
219
|
+
# status, destroying every pending job - the destructive no-op ADR-0022
|
|
220
|
+
# invariant 6 forbids. Refusing by name is the honest answer.
|
|
221
|
+
def purge(_topic, _status)
|
|
222
|
+
raise NotImplementedError,
|
|
223
|
+
"The rabbitmq queue backend cannot perform purge(): RabbitMQ " \
|
|
224
|
+
"cannot address messages by status (basic.get pops the head of " \
|
|
225
|
+
"the queue), so a status-addressed purge would have to drain the " \
|
|
226
|
+
"entire live queue and destroy pending work. Use the file or " \
|
|
227
|
+
"mongodb backend."
|
|
221
228
|
end
|
|
222
229
|
|
|
223
|
-
|
|
224
|
-
|
|
230
|
+
# Not performable on RabbitMQ - raises naming the backend and the operation.
|
|
231
|
+
#
|
|
232
|
+
# clear() empties the queue. RabbitMQ cannot address messages by status,
|
|
233
|
+
# so the only thing it could do is queue.purge the WHOLE live queue. This
|
|
234
|
+
# used to do exactly that and return 0, silently destroying every pending
|
|
235
|
+
# job. Draining a live broker on a status-addressed clear is data loss.
|
|
236
|
+
def clear(_topic)
|
|
237
|
+
raise NotImplementedError,
|
|
238
|
+
"The rabbitmq queue backend cannot perform clear(): RabbitMQ " \
|
|
239
|
+
"cannot address messages by status (basic.get pops the head of " \
|
|
240
|
+
"the queue), so a status-addressed clear would have to drain the " \
|
|
241
|
+
"entire live queue and destroy pending work. Use the file or " \
|
|
242
|
+
"mongodb backend."
|
|
225
243
|
end
|
|
226
244
|
|
|
227
245
|
def size(topic)
|
|
@@ -251,10 +269,6 @@ module Tina4
|
|
|
251
269
|
@queues[topic] ||= @channel.queue(topic, durable: true)
|
|
252
270
|
end
|
|
253
271
|
|
|
254
|
-
def dead_status?(status)
|
|
255
|
-
%w[dead dead_letter deadletter failed].include?(status.to_s.downcase)
|
|
256
|
-
end
|
|
257
|
-
|
|
258
272
|
# Pop every message off <topic>.dead_letter and put it straight back.
|
|
259
273
|
# A READ must not consume: dead_letters() is called by dashboards and
|
|
260
274
|
# health checks, and a read that emptied the queue would destroy the very
|
data/lib/tina4/session.rb
CHANGED
|
@@ -178,8 +178,12 @@ module Tina4
|
|
|
178
178
|
# Persist the session if dirty. On a backend write failure the error is
|
|
179
179
|
# logged and false is returned — the @modified (dirty) flag is RETAINED so
|
|
180
180
|
# a later save can retry. Returns true on a successful (or no-op) write.
|
|
181
|
+
#
|
|
182
|
+
# A cleared id (@id nil, e.g. after #destroy) is a no-op: there is nothing
|
|
183
|
+
# to persist, and a write would re-create the just-destroyed record. Mirrors
|
|
184
|
+
# the Python master's `if self._session_id and self._dirty`.
|
|
181
185
|
def save
|
|
182
|
-
return true unless @modified
|
|
186
|
+
return true unless @id && @modified
|
|
183
187
|
if safe_write(@id, @data, @ttl)
|
|
184
188
|
@modified = false
|
|
185
189
|
true
|
|
@@ -188,11 +192,16 @@ module Tina4
|
|
|
188
192
|
end
|
|
189
193
|
end
|
|
190
194
|
|
|
191
|
-
# Destroy the current session.
|
|
192
|
-
#
|
|
195
|
+
# Destroy the current session. ENDS the session: the stored record is
|
|
196
|
+
# removed and the id is CLEARED (@id = nil), so a later set()+save() with no
|
|
197
|
+
# new #start has no id to persist under and cannot RESURRECT the just-
|
|
198
|
+
# destroyed record. Mirrors the Python master (nulls _session_id) and Node
|
|
199
|
+
# (nulls sessionId). A fresh session needs a new #start, which mints a new id.
|
|
193
200
|
def destroy
|
|
194
|
-
safe_destroy(@id)
|
|
201
|
+
safe_destroy(@id) if @id
|
|
202
|
+
@id = nil
|
|
195
203
|
@data = {}
|
|
204
|
+
@modified = false
|
|
196
205
|
end
|
|
197
206
|
|
|
198
207
|
# Get a session value with optional default.
|
data/lib/tina4/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tina4ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.13.
|
|
4
|
+
version: 3.13.98
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tina4 Team
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-08-
|
|
11
|
+
date: 2026-08-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rack
|
|
@@ -434,23 +434,6 @@ files:
|
|
|
434
434
|
- lib/tina4/response.rb
|
|
435
435
|
- lib/tina4/response_cache.rb
|
|
436
436
|
- lib/tina4/router.rb
|
|
437
|
-
- lib/tina4/scss/tina4css/_alerts.scss
|
|
438
|
-
- lib/tina4/scss/tina4css/_badges.scss
|
|
439
|
-
- lib/tina4/scss/tina4css/_buttons.scss
|
|
440
|
-
- lib/tina4/scss/tina4css/_cards.scss
|
|
441
|
-
- lib/tina4/scss/tina4css/_forms.scss
|
|
442
|
-
- lib/tina4/scss/tina4css/_grid.scss
|
|
443
|
-
- lib/tina4/scss/tina4css/_modals.scss
|
|
444
|
-
- lib/tina4/scss/tina4css/_nav.scss
|
|
445
|
-
- lib/tina4/scss/tina4css/_pagination.scss
|
|
446
|
-
- lib/tina4/scss/tina4css/_reset.scss
|
|
447
|
-
- lib/tina4/scss/tina4css/_tables.scss
|
|
448
|
-
- lib/tina4/scss/tina4css/_typography.scss
|
|
449
|
-
- lib/tina4/scss/tina4css/_utilities.scss
|
|
450
|
-
- lib/tina4/scss/tina4css/_variables.scss
|
|
451
|
-
- lib/tina4/scss/tina4css/base.scss
|
|
452
|
-
- lib/tina4/scss/tina4css/colors.scss
|
|
453
|
-
- lib/tina4/scss/tina4css/tina4.scss
|
|
454
437
|
- lib/tina4/seeder.rb
|
|
455
438
|
- lib/tina4/service.rb
|
|
456
439
|
- lib/tina4/service_runner.rb
|
|
@@ -1,34 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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,81 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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
|
-
}
|