bulkrax 9.3.5 → 9.4.0

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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -1
  3. data/app/assets/javascripts/bulkrax/application.js +2 -1
  4. data/app/assets/javascripts/bulkrax/bulkrax.js +13 -4
  5. data/app/assets/javascripts/bulkrax/bulkrax_utils.js +96 -0
  6. data/app/assets/javascripts/bulkrax/datatables.js +1 -0
  7. data/app/assets/javascripts/bulkrax/entries.js +17 -10
  8. data/app/assets/javascripts/bulkrax/importers.js.erb +9 -2
  9. data/app/assets/javascripts/bulkrax/importers_stepper.js +2420 -0
  10. data/app/assets/stylesheets/bulkrax/application.css +1 -1
  11. data/app/assets/stylesheets/bulkrax/stepper/_header.scss +83 -0
  12. data/app/assets/stylesheets/bulkrax/stepper/_mixins.scss +26 -0
  13. data/app/assets/stylesheets/bulkrax/stepper/_navigation.scss +103 -0
  14. data/app/assets/stylesheets/bulkrax/stepper/_responsive.scss +46 -0
  15. data/app/assets/stylesheets/bulkrax/stepper/_review.scss +92 -0
  16. data/app/assets/stylesheets/bulkrax/stepper/_settings.scss +106 -0
  17. data/app/assets/stylesheets/bulkrax/stepper/_success.scss +26 -0
  18. data/app/assets/stylesheets/bulkrax/stepper/_summary.scss +171 -0
  19. data/app/assets/stylesheets/bulkrax/stepper/_upload.scss +339 -0
  20. data/app/assets/stylesheets/bulkrax/stepper/_validation.scss +237 -0
  21. data/app/assets/stylesheets/bulkrax/stepper/_variables.scss +46 -0
  22. data/app/assets/stylesheets/bulkrax/stepper.scss +32 -0
  23. data/app/controllers/bulkrax/guided_imports_controller.rb +175 -0
  24. data/app/controllers/bulkrax/importers_controller.rb +28 -31
  25. data/app/controllers/concerns/bulkrax/guided_import_demo_scenarios.rb +201 -0
  26. data/app/controllers/concerns/bulkrax/importer_file_handler.rb +217 -0
  27. data/app/factories/bulkrax/object_factory.rb +3 -2
  28. data/app/factories/bulkrax/valkyrie_object_factory.rb +61 -17
  29. data/app/jobs/bulkrax/importer_job.rb +11 -4
  30. data/app/models/bulkrax/csv_entry.rb +27 -7
  31. data/app/models/bulkrax/entry.rb +4 -0
  32. data/app/models/bulkrax/importer.rb +31 -1
  33. data/app/models/concerns/bulkrax/has_matchers.rb +2 -2
  34. data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +6 -5
  35. data/app/parsers/bulkrax/application_parser.rb +31 -5
  36. data/app/parsers/bulkrax/csv_parser.rb +42 -10
  37. data/app/parsers/concerns/bulkrax/csv_parser/csv_template_generation.rb +73 -0
  38. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation.rb +133 -0
  39. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation_helpers.rb +282 -0
  40. data/app/parsers/concerns/bulkrax/csv_parser/csv_validation_hierarchy.rb +96 -0
  41. data/app/services/bulkrax/csv_template/column_builder.rb +60 -0
  42. data/app/services/bulkrax/csv_template/column_descriptor.rb +58 -0
  43. data/app/services/bulkrax/csv_template/csv_builder.rb +83 -0
  44. data/app/services/bulkrax/csv_template/explanation_builder.rb +57 -0
  45. data/app/services/bulkrax/csv_template/field_analyzer.rb +56 -0
  46. data/app/services/bulkrax/csv_template/file_path_generator.rb +47 -0
  47. data/app/services/bulkrax/csv_template/file_validator.rb +68 -0
  48. data/app/services/bulkrax/csv_template/mapping_manager.rb +55 -0
  49. data/app/services/bulkrax/csv_template/model_loader.rb +50 -0
  50. data/app/services/bulkrax/csv_template/row_builder.rb +35 -0
  51. data/app/services/bulkrax/csv_template/schema_analyzer.rb +70 -0
  52. data/app/services/bulkrax/csv_template/split_formatter.rb +44 -0
  53. data/app/services/bulkrax/csv_template/value_determiner.rb +68 -0
  54. data/app/services/bulkrax/stepper_response_formatter.rb +347 -0
  55. data/app/services/bulkrax/validation_error_csv_builder.rb +99 -0
  56. data/app/validators/bulkrax/csv_row/child_reference.rb +56 -0
  57. data/app/validators/bulkrax/csv_row/circular_reference.rb +71 -0
  58. data/app/validators/bulkrax/csv_row/controlled_vocabulary.rb +74 -0
  59. data/app/validators/bulkrax/csv_row/duplicate_identifier.rb +63 -0
  60. data/app/validators/bulkrax/csv_row/missing_source_identifier.rb +31 -0
  61. data/app/validators/bulkrax/csv_row/parent_reference.rb +59 -0
  62. data/app/validators/bulkrax/csv_row/required_values.rb +64 -0
  63. data/app/views/bulkrax/guided_imports/new.html.erb +567 -0
  64. data/app/views/bulkrax/importers/index.html.erb +6 -1
  65. data/app/views/bulkrax/importers/new.html.erb +1 -1
  66. data/app/views/bulkrax/importers/show.html.erb +17 -1
  67. data/config/i18n-tasks.yml +195 -0
  68. data/config/locales/bulkrax.de.yml +504 -0
  69. data/config/locales/bulkrax.en.yml +459 -233
  70. data/config/locales/bulkrax.es.yml +504 -0
  71. data/config/locales/bulkrax.fr.yml +504 -0
  72. data/config/locales/bulkrax.it.yml +504 -0
  73. data/config/locales/bulkrax.pt-BR.yml +504 -0
  74. data/config/locales/bulkrax.zh.yml +503 -0
  75. data/config/routes.rb +10 -1
  76. data/lib/bulkrax/data/demo_scenarios.json +2235 -0
  77. data/lib/bulkrax/version.rb +1 -1
  78. data/lib/bulkrax.rb +31 -0
  79. metadata +55 -16
  80. data/app/services/bulkrax/sample_csv_service/column_builder.rb +0 -58
  81. data/app/services/bulkrax/sample_csv_service/column_descriptor.rb +0 -56
  82. data/app/services/bulkrax/sample_csv_service/csv_builder.rb +0 -82
  83. data/app/services/bulkrax/sample_csv_service/explanation_builder.rb +0 -51
  84. data/app/services/bulkrax/sample_csv_service/field_analyzer.rb +0 -54
  85. data/app/services/bulkrax/sample_csv_service/file_path_generator.rb +0 -16
  86. data/app/services/bulkrax/sample_csv_service/mapping_manager.rb +0 -36
  87. data/app/services/bulkrax/sample_csv_service/model_loader.rb +0 -40
  88. data/app/services/bulkrax/sample_csv_service/row_builder.rb +0 -33
  89. data/app/services/bulkrax/sample_csv_service/schema_analyzer.rb +0 -69
  90. data/app/services/bulkrax/sample_csv_service/split_formatter.rb +0 -42
  91. data/app/services/bulkrax/sample_csv_service/value_determiner.rb +0 -67
  92. data/app/services/bulkrax/sample_csv_service.rb +0 -78
  93. /data/{app/services → lib}/wings/custom_queries/find_by_source_identifier.rb +0 -0
@@ -10,6 +10,6 @@
10
10
  * files in this directory. Styles in this file should be added after the last require_* statement.
11
11
  * It is generally better to create a new file per style scope.
12
12
  *
13
- *= require_tree .
13
+ *= require_directory .
14
14
  *= require_self
15
15
  */
@@ -0,0 +1,83 @@
1
+ /* ====== Stepper Header ====== */
2
+ .stepper-header {
3
+ margin-bottom: 40px;
4
+ position: relative;
5
+ }
6
+
7
+ .step-item {
8
+ gap: 8px;
9
+ position: relative;
10
+ z-index: 2;
11
+
12
+ &.active {
13
+ .step-circle {
14
+ background: $color-primary;
15
+ border-color: $color-primary;
16
+ color: #fff;
17
+ box-shadow: 0 4px 8px rgba($color-primary, 0.3);
18
+ }
19
+
20
+ .step-label {
21
+ color: $color-primary;
22
+ font-weight: 700;
23
+ }
24
+ }
25
+
26
+ &.completed {
27
+ .step-circle {
28
+ background: $color-success;
29
+ border-color: $color-success;
30
+ color: #fff;
31
+
32
+ .fa:not(.step-check) {
33
+ display: none;
34
+ }
35
+
36
+ .step-check {
37
+ display: inline;
38
+ }
39
+ }
40
+
41
+ .step-label {
42
+ color: $color-success-dark;
43
+ font-weight: 700;
44
+ }
45
+ }
46
+ }
47
+
48
+ .step-circle {
49
+ width: 50px;
50
+ height: 50px;
51
+ border-radius: 50%;
52
+ background: $bg-light;
53
+ border: 2px solid $border-color;
54
+ color: $color-text-disabled;
55
+ font-size: 18px;
56
+ transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, box-shadow 0.3s ease;
57
+ position: relative;
58
+
59
+ .step-check {
60
+ display: none;
61
+ }
62
+ }
63
+
64
+ .step-label {
65
+ font-size: 12px;
66
+ font-weight: 500;
67
+ color: $color-text-disabled;
68
+ text-align: center;
69
+ transition: color 0.3s ease;
70
+ }
71
+
72
+ .step-connector {
73
+ flex: 1;
74
+ height: 2px;
75
+ background: $border-color;
76
+ margin: 0 10px 25px;
77
+ max-width: 120px;
78
+ transition: background 0.3s ease;
79
+
80
+ &.completed {
81
+ background: $color-success;
82
+ }
83
+ }
@@ -0,0 +1,26 @@
1
+ @mixin flex-center {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ }
6
+
7
+ @mixin dropzone-base($border-style, $padding-top, $padding-bottom) {
8
+ border: 2px $border-style $border-color;
9
+ border-radius: $border-radius;
10
+ width: 100%;
11
+ text-align: center;
12
+ margin: 25px 0 40px;
13
+ padding: $padding-top 20px $padding-bottom;
14
+ cursor: pointer;
15
+ transition: border-color 0.3s ease, background-color 0.3s ease;
16
+
17
+ &:hover {
18
+ border-color: $color-primary;
19
+ background: rgba($color-primary, 0.02);
20
+ }
21
+
22
+ &.dragover {
23
+ border-color: $color-primary;
24
+ background: rgba($color-primary, 0.05);
25
+ }
26
+ }
@@ -0,0 +1,103 @@
1
+ /* ====== Step Navigation ====== */
2
+ .step-navigation {
3
+ gap: 15px;
4
+ margin-top: 30px;
5
+ padding-top: 20px;
6
+ border-top: 1px solid #f0f0f0;
7
+
8
+ .btn {
9
+ min-width: 120px;
10
+ font-weight: 600;
11
+ }
12
+
13
+ .fa {
14
+ font-size: 14px;
15
+ }
16
+
17
+ >div {
18
+ gap: 10px;
19
+ }
20
+ }
21
+
22
+ .start-over-nav-btn {
23
+ gap: 6px;
24
+ }
25
+
26
+ .step-nav-right {
27
+ gap: 8px;
28
+ }
29
+
30
+ .upload-notifications {
31
+ margin-top: 15px;
32
+ }
33
+
34
+ .upload-notification {
35
+ padding: 12px 16px;
36
+ margin-bottom: 10px;
37
+ border-radius: 4px;
38
+ border-left: 4px solid;
39
+ display: flex;
40
+ align-items: center;
41
+ animation: slideIn 0.3s ease-out;
42
+
43
+ // Notification severity variants
44
+ $notification-variants: (
45
+ error: (bg: $bg-error, border: $color-error, text: $color-error-dark),
46
+ warning: (bg: $bg-warning, border: $color-warning, text: $color-warning-dark),
47
+ info: (bg: $bg-info, border: $color-info, text: $color-info-dark),
48
+ );
49
+
50
+ @each $name, $colors in $notification-variants {
51
+ &.notification-#{$name} {
52
+ background-color: map-get($colors, bg);
53
+ border-color: map-get($colors, border);
54
+ color: map-get($colors, text);
55
+ }
56
+ }
57
+ }
58
+
59
+ .upload-notification-icon {
60
+ margin-right: 12px;
61
+ font-size: 18px;
62
+ }
63
+
64
+ .upload-notification-content {
65
+ flex: 1;
66
+ }
67
+
68
+ .upload-notification-close {
69
+ margin-left: 12px;
70
+ cursor: pointer;
71
+ opacity: 0.5;
72
+
73
+ &:hover {
74
+ opacity: 1;
75
+ }
76
+ }
77
+
78
+ .skip-validation-label {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 6px;
82
+ margin: 0;
83
+ font-weight: normal;
84
+ cursor: pointer;
85
+ user-select: none;
86
+ font-size: 14px;
87
+
88
+ input[type="checkbox"] {
89
+ cursor: pointer;
90
+ }
91
+ }
92
+
93
+ @keyframes slideIn {
94
+ from {
95
+ opacity: 0;
96
+ transform: translateY(-10px);
97
+ }
98
+
99
+ to {
100
+ opacity: 1;
101
+ transform: translateY(0);
102
+ }
103
+ }
@@ -0,0 +1,46 @@
1
+ /* ====== Responsive ====== */
2
+ @media (max-width: 768px) {
3
+ .stepper-wrapper {
4
+ padding: 20px 15px;
5
+ }
6
+
7
+ .stepper-header {
8
+ margin-bottom: 30px;
9
+ }
10
+
11
+ .step-circle {
12
+ width: 40px;
13
+ height: 40px;
14
+ font-size: 16px;
15
+ }
16
+
17
+ .step-label {
18
+ font-size: 11px;
19
+ }
20
+
21
+ .step-connector {
22
+ max-width: 60px;
23
+ margin: 0 5px;
24
+ }
25
+
26
+ .visibility-card {
27
+ margin-bottom: 10px;
28
+ }
29
+
30
+ .step-navigation {
31
+ flex-direction: column;
32
+ gap: 10px;
33
+ }
34
+
35
+ .step-navigation .btn {
36
+ width: 100%;
37
+ }
38
+
39
+ .success-actions {
40
+ flex-direction: column;
41
+ }
42
+
43
+ .success-actions .btn {
44
+ width: 100%;
45
+ }
46
+ }
@@ -0,0 +1,92 @@
1
+ /* ====== Review Summary ====== */
2
+ .review-summary {
3
+ margin: 25px 0;
4
+
5
+ .alert-success {
6
+ background-color: rgba($color-success, 0.1);
7
+ }
8
+ }
9
+
10
+ .review-header {
11
+ display: flex;
12
+ align-items: center;
13
+ gap: 10px;
14
+ margin-bottom: 20px;
15
+
16
+ .fa {
17
+ font-size: 24px;
18
+ color: $color-success;
19
+ }
20
+
21
+ h3 {
22
+ font-size: 16px;
23
+ font-weight: 600;
24
+ color: $color-success-dark;
25
+ margin: 0;
26
+ }
27
+ }
28
+
29
+ .review-section {
30
+ margin-bottom: 20px;
31
+ padding-bottom: 15px;
32
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
33
+
34
+ &:last-child {
35
+ border-bottom: none;
36
+ padding-bottom: 0;
37
+ }
38
+
39
+ h4 {
40
+ font-size: 14px;
41
+ font-weight: 600;
42
+ color: $color-success-dark;
43
+ margin-bottom: 8px;
44
+ }
45
+
46
+ p {
47
+ font-size: 13px;
48
+ color: $color-text-dark;
49
+ margin: 3px 0;
50
+ }
51
+ }
52
+
53
+ .review-warnings {
54
+ h4 {
55
+ color: $color-warning-dark;
56
+ }
57
+ }
58
+
59
+ .review-warnings-list {
60
+ font-size: 12px;
61
+ color: $color-warning-dark;
62
+
63
+ ul {
64
+ margin: 0;
65
+ padding-left: 0;
66
+ list-style: none;
67
+ }
68
+ }
69
+
70
+ .large-import-warning {
71
+ margin-bottom: 20px;
72
+
73
+ .alert {
74
+ display: flex;
75
+ align-items: flex-start;
76
+ gap: 12px;
77
+ }
78
+
79
+ .fa {
80
+ font-size: .875rem;
81
+ margin-top: 2px;
82
+ }
83
+
84
+ strong {
85
+ display: block;
86
+ margin-bottom: 5px;
87
+ }
88
+
89
+ p {
90
+ margin: 0;
91
+ }
92
+ }
@@ -0,0 +1,106 @@
1
+ /* ====== Settings Form ====== */
2
+ .settings-form {
3
+ margin: 25px 0;
4
+
5
+ .form-group {
6
+ margin-bottom: 25px;
7
+
8
+ fieldset {
9
+ border: none;
10
+ padding: 0;
11
+ margin: 0;
12
+ }
13
+ }
14
+
15
+ .control-label {
16
+ font-size: 14px;
17
+ font-weight: 500;
18
+ color: $color-text-dark;
19
+ margin-bottom: 8px;
20
+ }
21
+
22
+ }
23
+
24
+ /* ====== Visibility Options ====== */
25
+ .visibility-options {
26
+ margin-top: 8px;
27
+ }
28
+
29
+ .visibility-card {
30
+ padding: 20px 15px;
31
+ border: 2px solid $border-color;
32
+ border-radius: $border-radius;
33
+ text-align: center;
34
+ cursor: pointer;
35
+ transition: border-color 0.3s ease, background-color 0.3s ease, box-shadow 0.3s ease;
36
+
37
+ &:hover {
38
+ border-color: $color-text-disabled;
39
+ }
40
+
41
+ &.active {
42
+ border-color: $color-primary;
43
+ background: $bg-primary-light;
44
+ box-shadow: 0 2px 4px rgba($color-primary, 0.1);
45
+
46
+ .visibility-icon,
47
+ .visibility-label {
48
+ color: $color-primary;
49
+ }
50
+ }
51
+ }
52
+
53
+ .visibility-icon {
54
+ font-size: 22px;
55
+ color: $color-text-disabled;
56
+ margin-bottom: 10px;
57
+ transition: color 0.3s ease;
58
+ }
59
+
60
+ .visibility-label {
61
+ font-size: 14px;
62
+ font-weight: 600;
63
+ color: $color-text-dark;
64
+ margin-bottom: 4px;
65
+ display: block;
66
+ }
67
+
68
+ .visibility-desc {
69
+ font-size: 12px;
70
+ color: $color-text-muted;
71
+ }
72
+
73
+ /* ====== Optional Settings (Bootstrap 4 Card) ====== */
74
+ .optional-settings-accordion {
75
+ .card {
76
+ margin-bottom: 0;
77
+ border: 1px solid $border-color;
78
+ }
79
+
80
+ .card-body {
81
+ padding: 20px;
82
+ }
83
+
84
+ .fa-cog {
85
+ margin-right: 8px;
86
+ }
87
+
88
+ .card-header {
89
+ cursor: pointer;
90
+ padding: 0;
91
+ background: $bg-light;
92
+
93
+ .btn-link {
94
+ text-decoration: none;
95
+ color: $color-text-dark;
96
+ font-size: 14px;
97
+ font-weight: 500;
98
+ padding: 12px 16px;
99
+
100
+ &:hover {
101
+ text-decoration: none;
102
+ background: $bg-muted;
103
+ }
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,26 @@
1
+ /* ====== Success State ====== */
2
+ .import-success-state {
3
+ padding: 60px 20px;
4
+ }
5
+
6
+ .success-card {
7
+ max-width: 500px;
8
+ margin: 0 auto;
9
+
10
+ h2 { font-size: 24px; font-weight: bold; color: $color-text-dark; margin-bottom: 10px; }
11
+ p { color: $color-text-muted; margin-bottom: 30px; }
12
+ }
13
+
14
+ .success-icon {
15
+ width: 80px;
16
+ height: 80px;
17
+ margin: 0 auto 20px;
18
+ background: $bg-success;
19
+ border-radius: 50%;
20
+ color: $color-success;
21
+ font-size: 40px;
22
+ }
23
+
24
+ .success-actions {
25
+ gap: 15px;
26
+ }
@@ -0,0 +1,171 @@
1
+ /* ====== Import Summary ====== */
2
+ .import-summary {
3
+ margin-top: 30px;
4
+
5
+ h3 {
6
+ font-size: 14px;
7
+ font-weight: 600;
8
+ color: $color-text-dark;
9
+ margin-bottom: 15px;
10
+ }
11
+ }
12
+
13
+ .summary-card {
14
+ text-align: center;
15
+ padding: 20px;
16
+ border-radius: $border-radius;
17
+ border: 1px solid;
18
+ }
19
+
20
+ // Summary card variants
21
+ $summary-variants: (
22
+ collections: (bg: $bg-info, border: $border-info-light, number: $color-info-dark, label: $color-info-dark),
23
+ works: (bg: $bg-success, border: $border-success, number: $color-success-dark, label: $color-success-dark),
24
+ filesets: (bg: $bg-light, border: $border-color, number: $color-text-default, label: $color-text-muted),
25
+ );
26
+
27
+ @each $name, $colors in $summary-variants {
28
+ .summary-card-#{$name} {
29
+ background: map-get($colors, bg);
30
+ border-color: map-get($colors, border);
31
+
32
+ .summary-number {
33
+ color: map-get($colors, number);
34
+ }
35
+
36
+ .summary-label {
37
+ color: map-get($colors, label);
38
+ }
39
+ }
40
+ }
41
+
42
+ .summary-number {
43
+ font-size: 28px;
44
+ font-weight: bold;
45
+ margin-bottom: 5px;
46
+ }
47
+
48
+ .summary-label {
49
+ font-size: 12px;
50
+ font-weight: 500;
51
+ }
52
+
53
+ .hierarchy-accordions {
54
+ margin-top: 20px;
55
+ }
56
+
57
+ /* ====== Tree View ====== */
58
+ .hierarchy-tree {
59
+ font-size: 13px;
60
+ }
61
+
62
+ .tree-item {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 6px;
66
+ padding: 6px 4px;
67
+ cursor: pointer;
68
+ border-radius: 4px;
69
+ transition: background 0.2s ease;
70
+
71
+ &:hover {
72
+ background: rgba(0, 0, 0, 0.03);
73
+ }
74
+
75
+ &:focus-visible {
76
+ outline: 2px solid #4a90d9;
77
+ outline-offset: -2px;
78
+ }
79
+ }
80
+
81
+ .tree-chevron {
82
+ font-size: 12px;
83
+ color: $color-text-muted;
84
+ transition: transform 0.2s ease;
85
+ width: 12px;
86
+ display: inline-block;
87
+ text-align: center;
88
+
89
+ &.tree-chevron-hidden {
90
+ visibility: hidden;
91
+ }
92
+ }
93
+
94
+ .tree-spacer {
95
+ display: inline-block;
96
+ width: 10px;
97
+ }
98
+
99
+ .tree-label {
100
+ color: $color-text-dark;
101
+ }
102
+
103
+ .tree-item-existing {
104
+ opacity: 0.7;
105
+ }
106
+
107
+ .tree-label-existing {
108
+ color: $color-text-muted;
109
+ font-style: italic;
110
+ }
111
+
112
+ .tree-existing-badge {
113
+ display: inline-block;
114
+ font-size: 10px;
115
+ font-weight: 600;
116
+ color: $color-text-muted;
117
+ background: $bg-muted;
118
+ border-radius: 10px;
119
+ padding: 1px 7px;
120
+ margin-left: 6px;
121
+ white-space: nowrap;
122
+ vertical-align: middle;
123
+ }
124
+
125
+ .tree-shared-badge {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ gap: 3px;
129
+ font-size: 10px;
130
+ font-weight: 600;
131
+ color: $color-info-dark;
132
+ background: $bg-info;
133
+ border: 1px solid $border-info-light;
134
+ border-radius: 10px;
135
+ padding: 1px 7px;
136
+ margin-left: 6px;
137
+ white-space: nowrap;
138
+
139
+ .fa {
140
+ font-size: 9px;
141
+ }
142
+ }
143
+
144
+ .tree-children {
145
+ margin-left: 8px;
146
+ }
147
+
148
+ /* ====== Warning Acknowledgment ====== */
149
+ .warning-acknowledgment {
150
+ margin-top: 20px;
151
+ }
152
+
153
+ .acknowledgment-checkbox {
154
+ display: flex;
155
+ align-items: flex-start;
156
+ gap: 12px;
157
+ padding: 15px;
158
+ background: $bg-warning;
159
+ border: 1px solid $border-warning;
160
+ border-radius: $border-radius;
161
+ cursor: pointer;
162
+ font-size: 14px;
163
+ color: $color-warning-dark;
164
+ margin: 0;
165
+
166
+ input[type='checkbox'] {
167
+ margin-top: 2px;
168
+ cursor: pointer;
169
+ accent-color: $color-warning;
170
+ }
171
+ }