@sumaris-net/ngx-components 18.17.7-rc3 → 18.18.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 (167) hide show
  1. package/doc/changelog.md +6 -1
  2. package/esm2022/src/app/admin/users/users-select.modal.mjs +1 -1
  3. package/esm2022/src/app/admin/users/users.mjs +1 -1
  4. package/esm2022/src/app/core/about/about.modal.mjs +1 -1
  5. package/esm2022/src/app/core/account/account.page.mjs +1 -1
  6. package/esm2022/src/app/core/account/new-token.form.mjs +1 -1
  7. package/esm2022/src/app/core/account/new-token.modal.mjs +1 -1
  8. package/esm2022/src/app/core/account/password/change-password.form.mjs +1 -1
  9. package/esm2022/src/app/core/account/password/change-password.page.mjs +1 -1
  10. package/esm2022/src/app/core/account/token.table.mjs +1 -1
  11. package/esm2022/src/app/core/auth/auth.form.mjs +1 -1
  12. package/esm2022/src/app/core/auth/auth.modal.mjs +1 -1
  13. package/esm2022/src/app/core/auth/reset-password.modal.mjs +1 -1
  14. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +1 -1
  15. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +1 -1
  16. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +1 -1
  17. package/esm2022/src/app/core/form/list/list.form.mjs +1 -1
  18. package/esm2022/src/app/core/form/properties/properties-file.service.mjs +133 -0
  19. package/esm2022/src/app/core/form/properties/properties.form.mjs +97 -19
  20. package/esm2022/src/app/core/form/properties/properties.module.mjs +53 -5
  21. package/esm2022/src/app/core/form/properties/properties.table.mjs +1 -1
  22. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +4 -5
  23. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +1 -1
  24. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +1 -1
  25. package/esm2022/src/app/core/form/username/username.form.mjs +1 -1
  26. package/esm2022/src/app/core/home/home.mjs +1 -1
  27. package/esm2022/src/app/core/icon/icon.component.mjs +1 -1
  28. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +1 -1
  29. package/esm2022/src/app/core/menu/menu.component.mjs +1 -1
  30. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +1 -1
  31. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +1 -1
  32. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +1 -1
  33. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +1 -1
  34. package/esm2022/src/app/core/peer/select-peer.modal.mjs +1 -1
  35. package/esm2022/src/app/core/register/register-confirm.page.mjs +1 -1
  36. package/esm2022/src/app/core/register/register.form.mjs +1 -1
  37. package/esm2022/src/app/core/register/register.modal.mjs +1 -1
  38. package/esm2022/src/app/core/services/account.service.mjs +2 -2
  39. package/esm2022/src/app/core/services/local-settings.service.mjs +43 -42
  40. package/esm2022/src/app/core/services/model/config.model.mjs +1 -1
  41. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +1 -1
  42. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +1 -1
  43. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +1 -1
  44. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +1 -1
  45. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +1 -1
  46. package/esm2022/src/app/core/settings/settings.page.mjs +2 -2
  47. package/esm2022/src/app/core/table/async-table.class.mjs +3 -3
  48. package/esm2022/src/app/core/table/column/actions-column.component.mjs +1 -1
  49. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +1 -1
  50. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  51. package/esm2022/src/app/core/table/table-select-columns.component.mjs +1 -1
  52. package/esm2022/src/app/core/table/table.class.mjs +3 -3
  53. package/esm2022/src/app/core/table/table.pipes.mjs +1 -1
  54. package/esm2022/src/app/core/table/table.utils.mjs +1 -1
  55. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  56. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  57. package/esm2022/src/app/shared/audio/audio.testing.mjs +1 -1
  58. package/esm2022/src/app/shared/debug/debug.component.mjs +1 -1
  59. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +1 -1
  60. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +1 -1
  61. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +1 -1
  62. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +1 -1
  63. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +1 -1
  64. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +1 -1
  65. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +1 -1
  66. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +1 -1
  67. package/esm2022/src/app/shared/form/field.component.mjs +1 -1
  68. package/esm2022/src/app/shared/form/loading-spinner.mjs +11 -11
  69. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +1 -1
  70. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +3 -3
  71. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +1 -1
  72. package/esm2022/src/app/shared/markdown/markdown.component.mjs +17 -17
  73. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +1 -1
  74. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +1 -1
  75. package/esm2022/src/app/shared/markdown/markdown.service.mjs +1 -1
  76. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +1 -1
  77. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +1 -1
  78. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +1 -1
  79. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +1 -1
  80. package/esm2022/src/app/shared/material/badge/badge.test.mjs +3 -3
  81. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +1 -1
  82. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +1 -1
  83. package/esm2022/src/app/shared/material/chips/material.chips.mjs +1 -1
  84. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +1 -1
  85. package/esm2022/src/app/shared/material/datetime/material.date.mjs +1 -1
  86. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +1 -1
  87. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +3 -3
  88. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +1 -1
  89. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +1 -1
  90. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +1 -1
  91. package/esm2022/src/app/shared/material/duration/material.duration.mjs +1 -1
  92. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +1 -1
  93. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +1 -1
  94. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +1 -1
  95. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +1 -1
  96. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +1 -1
  97. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +1 -1
  98. package/esm2022/src/app/shared/material/test/test-component.mjs +43 -43
  99. package/esm2022/src/app/shared/material/testing/common.test.mjs +1 -1
  100. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +1 -1
  101. package/esm2022/src/app/shared/material/text/text-form.component.mjs +1 -1
  102. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
  103. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +1 -1
  104. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +1 -1
  105. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +1 -1
  106. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +1 -1
  107. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +1 -1
  108. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +1 -1
  109. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +1 -1
  110. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +1 -1
  111. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +1 -1
  112. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +1 -1
  113. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +1 -1
  114. package/esm2022/src/app/shared/pipes/form.pipes.mjs +1 -1
  115. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +1 -1
  116. package/esm2022/src/app/shared/pipes/html.pipes.mjs +1 -1
  117. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +1 -1
  118. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +1 -1
  119. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +1 -1
  120. package/esm2022/src/app/shared/pipes/math.pipes.mjs +1 -1
  121. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +1 -1
  122. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +1 -1
  123. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +1 -1
  124. package/esm2022/src/app/shared/pipes/property.pipes.mjs +1 -1
  125. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +1 -1
  126. package/esm2022/src/app/shared/pipes/string.pipes.mjs +1 -1
  127. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +1 -1
  128. package/esm2022/src/app/shared/pipes/types.pipes.mjs +1 -1
  129. package/esm2022/src/app/shared/pipes/url.pipes.mjs +1 -1
  130. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +1 -1
  131. package/esm2022/src/app/shared/testing/maskito.test.mjs +1 -1
  132. package/esm2022/src/app/shared/testing/observable.test.mjs +1 -1
  133. package/esm2022/src/app/shared/testing/tests.page.mjs +1 -1
  134. package/esm2022/src/app/shared/toast/toast.testing.mjs +1 -1
  135. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +1 -1
  136. package/esm2022/src/app/shared/toolbar/toolbar.mjs +1 -1
  137. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +1 -1
  138. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +1 -1
  139. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +1 -1
  140. package/esm2022/src/app/social/feed/feed.component.mjs +3 -3
  141. package/esm2022/src/app/social/feed/feed.directive.mjs +1 -1
  142. package/esm2022/src/app/social/feed/feed.page.mjs +1 -1
  143. package/esm2022/src/app/social/feed/testing/feed.testing.mjs +1 -1
  144. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +1 -1
  145. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +1 -1
  146. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +1 -1
  147. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +1 -1
  148. package/esm2022/src/app/social/message/message.form.mjs +1 -1
  149. package/esm2022/src/app/social/message/message.modal.mjs +1 -1
  150. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +1 -1
  151. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +1 -1
  152. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +1 -1
  153. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +1 -1
  154. package/fesm2022/sumaris-net.ngx-components.mjs +422 -184
  155. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  156. package/package.json +1 -1
  157. package/src/app/core/form/properties/properties-file.service.d.ts +26 -0
  158. package/src/app/core/form/properties/properties.form.d.ts +18 -2
  159. package/src/app/core/form/properties/properties.module.d.ts +8 -1
  160. package/src/app/core/services/local-settings.service.d.ts +9 -8
  161. package/src/app/core/table/async-table.class.d.ts +3 -1
  162. package/src/app/core/table/table.class.d.ts +3 -1
  163. package/src/assets/i18n/en-US.json +32 -3
  164. package/src/assets/i18n/en.json +32 -3
  165. package/src/assets/i18n/fr.json +34 -4
  166. package/src/assets/manifest.json +1 -1
  167. package/src/theme/_ngx-components.scss +1009 -1009
@@ -1,1009 +1,1009 @@
1
-
2
- body,
3
- html {
4
- padding: 0;
5
- margin: 0;
6
- }
7
-
8
- *::selection {
9
- background: var(--ion-color-shade, rgba(var(--ion-color-text-rgb, 0, 0, 0), 0.3));
10
- }
11
-
12
- // Text style
13
- // --------------------------------------------------
14
- .text-italic {
15
- font-style: italic;
16
- }
17
- .ion-text-wrap {
18
- white-space: normal;
19
- word-wrap: break-word;
20
- }
21
-
22
- // Page Container Structure
23
- // --------------------------------------------------
24
-
25
- .ion-page-invisible {
26
- opacity: 0;
27
- }
28
-
29
- ion-toolbar ion-title,
30
- app-toolbar ion-title {
31
- small {
32
- font-weight: normal;
33
- br {
34
- display: none;
35
- visibility: hidden;
36
- }
37
- }
38
- // Add a separator, after the <small> part
39
- small:first-of-type:after {
40
- content: " - ";
41
- }
42
- }
43
-
44
- @media screen and (max-width: $screen-sm-max) {
45
- ion-toolbar ion-title,
46
- app-toolbar ion-title {
47
- small {
48
- @include font-size(10pt);
49
- }
50
- small br {
51
- display: unset;
52
- visibility: unset;
53
- }
54
- // Add a separator, after the <small> part
55
- small:first-of-type:after {
56
- content: "";
57
- }
58
- }
59
- }
60
-
61
- // Ionic Safe Margins
62
- // --------------------------------------------------
63
- html.plt-ios.plt-hybrid,
64
- html.plt-ios.plt-pwa {
65
- --ion-statusbar-padding: 20px;
66
- }
67
-
68
- html {
69
- --ion-safe-area-top: var(--ion-statusbar-padding);
70
- }
71
-
72
- // TODO: remove once Safari 11.2 dies
73
- @supports (padding-top: constant(safe-area-inset-top)) {
74
- html {
75
- --ion-safe-area-top: constant(safe-area-inset-top);
76
- --ion-safe-area-bottom: constant(safe-area-inset-bottom);
77
- --ion-safe-area-left: constant(safe-area-inset-left);
78
- --ion-safe-area-right: constant(safe-area-inset-right);
79
- }
80
- }
81
-
82
- @supports (padding-top: env(safe-area-inset-top)) {
83
- html {
84
- --ion-safe-area-top: env(safe-area-inset-top);
85
- --ion-safe-area-bottom: env(safe-area-inset-bottom);
86
- --ion-safe-area-left: env(safe-area-inset-left);
87
- --ion-safe-area-right: env(safe-area-inset-right);
88
- }
89
- }
90
-
91
- // --------------------------------------------------
92
- // Back button in app toolbar
93
- // --------------------------------------------------
94
-
95
- .ion-page.can-go-back {
96
- app-toolbar {
97
-
98
- ion-menu-toggle {
99
- display: none !important;
100
- }
101
-
102
- // Back button
103
- ion-back-button,
104
- ion-button.back-button {
105
- display: inline-block !important;
106
- }
107
- }
108
- }
109
-
110
- // --------------------------------------------------
111
- // Main Menu
112
- // --------------------------------------------------
113
- .split-pane-md.split-pane-visible > .split-pane-side {
114
- max-width: #{$app-menu-width} !important;
115
- }
116
-
117
- ion-menu.menu-side-left {
118
- .menu-inner {
119
- .scroll {
120
- overflow-y: auto !important;
121
-
122
- .scroll-inner {
123
- min-height: auto !important;
124
- }
125
- }
126
- }
127
- }
128
-
129
-
130
- mat-form-field {
131
- .mat-paginator-page-size-select {
132
- @include font-size-important(14px);
133
- }
134
- }
135
-
136
-
137
- // --- mat-date-short-field
138
- mat-calendar.mat-date-short-panel {
139
- // Hide some buttons (e.g. to change the period)
140
- // and the month view
141
- .mat-calendar-period-button,
142
- mat-year-view {
143
- visibility: hidden;
144
- display: none;
145
- }
146
- }
147
-
148
- @media screen and (min-width: $screen-sm) {
149
- form.form-container {
150
- ion-grid {
151
- ion-col[size-sm="auto"] > mat-date-time-field {
152
- // When inside a form + grid : fix <ion-col size-sm="auto"> alignment in some screen resolution
153
- max-width: 200px;
154
- }
155
- }
156
- }
157
- }
158
- // --------------------------------------------------
159
- // mat-checkbox
160
- // --------------------------------------------------
161
-
162
- mat-checkbox {
163
- .mat-checkbox-checkmark {
164
- .mat-checkbox-checkmark-path {
165
- // TODO: change to accent-contrast
166
- stroke: white !important;
167
- }
168
- }
169
- }
170
-
171
- // --------------------------------------------------
172
- // mat-autocomplete and mat-select panel
173
- // --------------------------------------------------
174
-
175
- // When simple text option, add a padding
176
- mat-option {
177
-
178
- .mdc-list-item__primary-text {
179
- display: inline-block;
180
- flex-grow: 1;
181
- box-sizing: border-box;
182
- }
183
- .mat-option-text:not(:has(ion-row)),
184
- .mat-option-text:has(ion-searchbar),
185
- .mdc-list-item__primary-text:has(ion-searchbar) {
186
- padding: 0 !important;
187
- }
188
- ion-row,
189
- .mat-option-text:has(ion-row),
190
- .mdc-list-item__primary-text:has(ion-row) {
191
- padding: 0;
192
- width: 100%; // Fix sumaris-app#943
193
- }
194
- mat-autocomplete-footer {
195
- .mat-option-text,
196
- .mdc-list-item__primary-text {
197
- padding: 0 !important;
198
- }
199
- }
200
- }
201
-
202
- mat-option:not(:last-of-type) {
203
- border-bottom: 1px solid #{$app-select-option-border-color};
204
- }
205
-
206
-
207
- .cdk-overlay-pane:has(.mat-mdc-select-panel) {
208
- --min-width: 200px;
209
- --max-width: calc(min(100%, 100vw - 64px));
210
- min-width: var(--min-width) !important;
211
- max-width: var(--max-width) !important;
212
-
213
- // FIXME : This is a workaround find at : https://github.com/angular/components/issues/26000#issuecomment-1563107933
214
- &:has(.mat-select-panel-fit-content) {
215
- --min-width: fit-content !important;
216
- }
217
-
218
- .mat-mdc-select-panel {
219
- --mat-switch-visible-track-transition: transform 75ms 50ms cubic-bezier(0, 0, 0.2, 1);
220
- transition: --mat-switch-visible-track-transition;
221
- transform: scaleY(1) !important;
222
-
223
- &.hidden {
224
- transform: scaleY(0) !important;
225
- }
226
-
227
- .mat-mdc-option {
228
- // When option text wrap, do not increase the option height
229
- ion-col.ion-text-wrap {
230
- max-height: var(--mat-option-max-height, #{$mat-option-max-height});
231
- }
232
- }
233
- }
234
-
235
- }
236
-
237
-
238
- .cdk-overlay-pane:has(.mat-mdc-autocomplete-panel) {
239
- --min-width: 200px;
240
- --max-width: calc(min(100%, 100vw - 64px));
241
- min-width: var(--min-width) !important;
242
- max-width: var(--max-width) !important;
243
-
244
- // FIXME : This is a workaround find at : https://github.com/angular/components/issues/26000#issuecomment-1563107933
245
- &:has(.mat-select-panel-fit-content) {
246
- --min-width: fit-content !important;
247
- }
248
-
249
- &:has(.min-width-medium),
250
- &:has(.mat-mdc-autocomplete-panel-medium-size) {
251
- --min-width: 300px;
252
- }
253
-
254
- &:has(.min-width-large),
255
- &:has(.mat-mdc-autocomplete-panel-large-size) {
256
- --min-width: 400px;
257
- }
258
-
259
- &:has(.min-width-xlarge),
260
- &:has(.mat-mdc-autocomplete-panel-xlarge-size) {
261
- --min-width: 450px;
262
- }
263
-
264
- &:has(.min-width-80vw) {
265
- --min-width: 80vw;
266
- }
267
-
268
- &:has(.mat-mdc-autocomplete-panel-full-size),
269
- &:has(.full-size) {
270
- --margin-left: 32px;
271
- --margin-right: 32px;
272
- --min-width: calc(100vw - var(--margin-left) - var(--margin-right));
273
- --max-width: calc(100vw - var(--margin-left) - var(--margin-right));
274
- position: fixed;
275
- left: var(--margin-left) !important;
276
- right: unset !important;
277
- }
278
- }
279
-
280
- .mat-mdc-select-panel,
281
- .mat-mdc-autocomplete-panel {
282
- /* when multiple selection enable */
283
- .mat-mdc-option mat-pseudo-checkbox,
284
- .mat-mdc-option .mat-pseudo-checkbox-full {
285
- margin-left: 12px;
286
- margin-right: 4px;
287
- }
288
-
289
- padding: 0 !important;
290
- }
291
-
292
- ion-list,
293
- .mat-mdc-menu-panel {
294
- &.ion-list-popover {
295
- padding: 0 !important;
296
- }
297
- }
298
-
299
- // --------------------------------------------------
300
- // mat-autocomplete-field
301
- // --------------------------------------------------
302
-
303
- // Define useful variable
304
- html.plt-ios {
305
- --ion-searchbar-height: 60px;
306
- //--ion-toolbar-height: 58px;
307
- }
308
- html {
309
- //--ion-searchbar-height: 58px;
310
- }
311
-
312
- ion-list,
313
- .mat-mdc-menu-panel,
314
- .mat-mdc-select-panel,
315
- .mat-mdc-autocomplete-panel {
316
-
317
- /* Avoid bad display, when opening panel for the first time */
318
- &.ng-trigger-transformPanel {
319
- ion-searchbar.mat-select-header,
320
- ion-searchbar.mat-autocomplete-header {
321
- visibility: visible;
322
- display: flex;
323
- opacity: 1;
324
- transition: opacity 0.3s ease-in-out;
325
- }
326
- }
327
-
328
- .mat-mdc-optgroup.mat-select-searchbar,
329
- .mat-mdc-option.mat-autocomplete-searchbar
330
- {
331
- padding: 0 !important;
332
- height: var(--ion-searchbar-height, 58px) !important;
333
- background-color: var(--ion-color-secondary100) !important;
334
- pointer-events: inherit !important;
335
-
336
- .mat-mdc-optgroup-label {
337
- background-color: var(--ion-color-secondary100) !important;
338
- padding: 0;
339
- display: block;
340
- }
341
-
342
- /* hide pseudo checkbox, in the searchbar*/
343
- mat-pseudo-checkbox {
344
- visibility: hidden;
345
- display: none;
346
- }
347
-
348
- &.mat-select-searchbar-sticky {
349
- z-index: 1001;
350
- /* Set header as sticky*/
351
- position: -webkit-sticky;
352
- position: sticky;
353
- top: 0;
354
- }
355
-
356
- .searchbar-input {
357
- --background: var(--app-form-field-background-color, var(--ion-background-color));
358
- padding-inline-end: 34px; // Keep a place for the clear button
359
- }
360
- }
361
-
362
- ion-row.ion-list-header,
363
- ion-row.mat-select-header,
364
- ion-row.mat-menu-header,
365
- ion-row.mat-autocomplete-header {
366
- &.multiple {
367
- /* Offset due to mat-pseudo-checkbox */
368
- padding-left: 32px;
369
- }
370
- &.column {
371
- /* Set header as sticky*/
372
- position: -webkit-sticky;
373
- position: sticky;
374
- top: 0;
375
- z-index: 1001;
376
- background-color: var(--ion-color-secondary);
377
- border-bottom: 1px solid #{$app-select-option-border-color};
378
- color: var(--ion-color-secondary-contrast);
379
- line-height: 20px;
380
- @include font-size(12px);
381
- font-weight: 500;
382
- height: 20px;
383
- ion-col {
384
- white-space: nowrap;
385
- text-overflow: ellipsis;
386
- }
387
- &.mat-select-searchbar-sticky {
388
- /* offset because of the searchbar height */
389
- top: var(--ion-searchbar-height, 58px);
390
- }
391
- }
392
-
393
- }
394
-
395
- ion-row.ion-list-footer,
396
- ion-row.mat-select-footer,
397
- ion-row.mat-menu-footer,
398
- ion-row.mat-autocomplete-footer,
399
- mat-option.mat-autocomplete-footer {
400
- /* Set footer as sticky*/
401
- position: -webkit-sticky;
402
- position: sticky;
403
- bottom: 0;
404
- z-index: 1001;
405
- border-top: 1px solid #{$app-select-option-border-color};
406
- background-color: var(--ion-toolbar-background, #{$ion-toolbar-background});
407
- color: var(--ion-color-medium) !important; // not working on mobile form because the mat-option is disabled
408
- @include font-size(12px);
409
- font-weight: 500;
410
- height: 20px;
411
- min-height: 20px;
412
- line-height: 20px;
413
- opacity: 1 !important;
414
-
415
- ion-col {
416
- white-space: nowrap;
417
- text-overflow: ellipsis;
418
- }
419
- }
420
-
421
- ion-row {
422
- --ion-grid-column-padding: 0;
423
-
424
- ion-col {
425
- --padding-start: 8px;
426
- padding: 0 !important;
427
- padding-left: var(--padding-start, 0) !important;
428
- text-overflow: ellipsis;
429
- overflow: hidden;
430
- white-space: nowrap;
431
- }
432
- }
433
-
434
- .odd {
435
- background: var(--ion-light-color-shade, $light);
436
- }
437
-
438
- .mat-mdc-option[no-padding],
439
- mat-option[no-padding] {
440
- padding: 0 !important;
441
- }
442
- }
443
-
444
- // --------------------------------------------------
445
- // Table > Filter expansion panel
446
- // --------------------------------------------------
447
-
448
- mat-expansion-panel {
449
-
450
- &.filter-panel {
451
-
452
- background: var(--ion-color-secondary50);
453
- color: var(--ion-color-secondary50-contrast);
454
- margin-bottom: 5px;
455
-
456
- .form-container {
457
- mat-form-field {
458
- width: 100%;
459
-
460
- .datetime-md {
461
- padding: 0 !important;
462
- }
463
- }
464
- }
465
-
466
- mat-action-row {
467
- ion-label {
468
- line-height: 36px;
469
- }
470
- }
471
- }
472
-
473
- &.filter-panel-floating {
474
- z-index: 999;
475
- position: absolute;
476
- top: 0;
477
- left: 0;
478
- right: 0;
479
- }
480
-
481
- &.filter-panel-pinned {
482
- overflow-y: scroll;
483
- }
484
-
485
- .mat-expansion-panel-header,
486
- mat-expansion-panel-header {
487
- padding: var(--expansion-panel-header-padding, var(--expansion-panel-padding));
488
- }
489
- .mat-expansion-panel-body {
490
- padding: var(--expansion-panel-padding, var(--ion-padding));
491
- }
492
- }
493
-
494
- // --------------------------------------------------
495
- // Form buttons bar
496
- // --------------------------------------------------
497
- app-form-buttons-bar {
498
- --form-buttons-bar-buttons-width: 400px;
499
- --form-buttons-bar-content-max-width: calc(100% - var(--form-buttons-bar-buttons-width) - 40px /*right menu toggle button*/);
500
- .app-form-buttons-bar-content {
501
- max-width: var(--form-buttons-bar-content-max-width);
502
- }
503
- }
504
-
505
- // --------------------------------------------------
506
- // Ion-select
507
- // --------------------------------------------------
508
-
509
- ion-popover.select-popover {
510
- .popover-content {
511
- min-width: calc(min(80%, 200px));
512
- }
513
- }
514
-
515
- @media screen and (min-width: $screen-sm) {
516
- ion-popover.select-popover {
517
- .popover-content {
518
- min-width: 300px;
519
- }
520
-
521
- ion-radio .radio-icon {
522
- border: 0 !important;
523
- }
524
- }
525
- }
526
-
527
-
528
- // --------------------------------------------------
529
- // Ionic list
530
- // --------------------------------------------------
531
- ion-list {
532
- ion-item.ion-item-selected {
533
- --ion-color-base: var(--ion-color-secondary100);
534
- --ion-color-contrast: var(--ion-color-secondary100-contrast);
535
-
536
- &:before {
537
- background: var(--ion-color-base) !important;
538
- color: var(--ion-color-contrast) !important;
539
- }
540
- }
541
- }
542
-
543
- // ------------------------
544
- // Other material component
545
-
546
- .flex-spacer,
547
- .toolbar-spacer {
548
- flex: 1 1 auto;
549
- }
550
-
551
- ion-toolbar {
552
- --min-height: var(--ion-toolbar-height, 56px);
553
- }
554
- ion-toolbar[translucent] {
555
- --background: transparent !important;
556
- }
557
-
558
- // --- mat-stepper component
559
- mat-horizontal-stepper {
560
- .mat-horizontal-stepper-header-container {
561
- padding: 0;
562
- }
563
-
564
- .mat-horizontal-content-container {
565
- padding: 0;
566
- }
567
- }
568
-
569
-
570
- // Extra small device: Phones (<767px)
571
- @media screen and (max-width: $screen-xs-max) {
572
- mat-horizontal-stepper {
573
- .mat-horizontal-stepper-header-container {
574
- .mat-horizontal-stepper-header {
575
- padding-left: 5px;
576
- }
577
-
578
- .mat-stepper-horizontal-line {
579
- display: none;
580
- }
581
- }
582
-
583
- .mat-horizontal-content-container {
584
- padding: 0;
585
- }
586
- }
587
- }
588
-
589
- mat-button-toggle.mat-button-toggle-checked,
590
- mat-button-toggle.mat-button-toggle-checked.mat-button-toggle-disabled {
591
- background-color: var(--ion-color-light);
592
- color: white;
593
- }
594
-
595
- // --------------------------------------------------
596
- // Material menu
597
- // --------------------------------------------------
598
-
599
-
600
- .mat-mdc-menu-panel {
601
-
602
- // width = 400px
603
- &.mat-menu-size-400 {
604
- min-width: unset;
605
- width: 400px;
606
- max-width: calc(90vw);
607
- }
608
- // width = 75vw
609
- &.mat-menu-size-75vw {
610
- min-width: unset;
611
- width: calc(75vw);
612
- max-width: calc(90vw);
613
- }
614
- // width = 100vw
615
- &.mat-menu-size-100vw {
616
- min-width: unset;
617
- width: calc(100vw);
618
- max-width: calc(100vw);
619
- }
620
-
621
- // No padding
622
- &.ion-no-padding {
623
- .mat-mdc-menu-content {
624
- padding: 0 !important;
625
- }
626
- }
627
-
628
- // Small menu item (e.g. for actions on a table row)
629
- &.mat-mdc-menu-item-small-height .mat-mdc-menu-item,
630
- .mat-mdc-menu-item.mat-mdc-menu-item-small-height
631
- {
632
- padding: 0 8px;
633
- height: 35px;
634
- line-height: 35px;
635
- }
636
- // Reduce the font size, on label just inside a mat-menu (e.g. see trips.page.html)
637
- .mat-mdc-menu-content > ion-label {
638
- @include font-size(12px);
639
- }
640
-
641
- .mat-mdc-menu-content {
642
- .mat-mdc-menu-item {
643
- --mat-menu-item-label-text-color: var(--ion-text-color);
644
- // Required for the dark theme (otherwise the icon will be dark)
645
- --mat-menu-item-icon-color: rgba(var(--ion-text-color-rgb, 255, 255, 255), 0.54);
646
- }
647
- }
648
-
649
- .mat-mdc-menu-content ion-item > ion-icon[slot="start"] {
650
- margin-right: 16px;
651
- vertical-align: middle;
652
- }
653
-
654
- // Menu title (e.g. see extraction map)
655
- .mat-mdc-menu-item.mat-mdc-menu-title {
656
- padding: 0 8px;
657
- height: 27px;
658
- line-height: 27px;
659
- @include font-size(12px);
660
- pointer-events: none;
661
- color: var(--ion-color-medium, rgba(0, 0, 0, 0.38));
662
- }
663
- }
664
-
665
- // --------------------------------------------------
666
- // Alert
667
- // --------------------------------------------------
668
-
669
- ion-alert button.alert-button {
670
- cursor: pointer;
671
- }
672
-
673
-
674
- // --------------------------------------------------
675
- // Overlay
676
- // --------------------------------------------------
677
-
678
- .cdk-overlay-dark-backdrop {
679
- background: rgba(var(--ion-backdrop-color-rgb, 0,0,0), var(--ion-backdrop-opacity, 0.32));
680
- }
681
-
682
- // --------------------------------------------------
683
- // Date and time picker
684
- // --------------------------------------------------
685
- // Date picker
686
- .mat-datepicker-content {
687
- --mat-datepicker-calendar-container-background-color: var(--ion-background-color, #fff) !important;
688
- --mat-datepicker-calendar-container-text-color: var(--ion-text-color, #000000) !important;
689
- --mat-datepicker-calendar-date-text-color: var(--ion-text-color);
690
- --mat-datepicker-calendar-body-label-text-color: var(--ion-color-step-500);
691
- --mat-datepicker-calendar-header-text-color: var(--ion-color-step-500);
692
- }
693
- mat-calendar {
694
- .mat-calendar-header {
695
- background-color: var(--ion-color-secondary) !important;
696
- color: var(--ion-color-secondary-contrast) !important;
697
-
698
- button {
699
- color: var(--ion-color-secondary-contrast) !important;
700
- }
701
- }
702
-
703
- .mat-calendar-body-selected {
704
- background-color: var(--ion-color-accent) !important;
705
- color: var(--ion-color-accent-contrast) !important;
706
- font-weight: bold;
707
- }
708
-
709
- .mat-calendar-arrow {
710
- border-top-color: var(--ion-color-secondary-contrast) !important;
711
- }
712
- }
713
-
714
- @media (orientation: landscape) {
715
- .mat-datepicker-content-touch {
716
- height: fit-content !important;
717
- min-height: 310px;
718
-
719
- .mat-calendar-controls {
720
- margin-top: 0;
721
- }
722
- .mat-datepicker-content-container {
723
- &.mat-datepicker-content-container-with-actions {
724
- height: unset !important;
725
- }
726
- .mat-datepicker-actions {
727
- background-color: var(--mat-datepicker-calendar-container-background-color);
728
- margin-top: -12px;
729
- }
730
- }
731
- }
732
- }
733
-
734
-
735
- // --------------------------------------------------
736
- // Time picker
737
- // --------------------------------------------------
738
-
739
- .timepicker {
740
- .timepicker-header,
741
- .timepicker-header .mat-toolbar.mat-accent{
742
- // Change header color to 'secondary'
743
- --mat-toolbar-container-background-color: var(--ion-color-secondary) !important;
744
- --mat-toolbar-container-text-color: var(--ion-color-secondary-contrast) !important;
745
- }
746
-
747
- ngx-mat-timepicker-face .clock-face {
748
- background-color: var(--app-form-field-background-color) !important;
749
-
750
- .mat-toolbar.mat-accent {
751
- --mat-toolbar-container-background-color: var(--ion-color-accent);
752
- --mat-toolbar-container-text-color: var(--ion-color-accent-contrast);
753
- }
754
- button.mat-mdc-mini-fab {
755
- &.mat-unthemed {
756
- --mat-fab-small-foreground-color: var(--ion-text-color);
757
- }
758
-
759
- &.mat-accent {
760
- --mdc-fab-small-container-color: var(--ion-color-accent);
761
- --mat-fab-small-foreground-color: var(--ion-color-accent-contrast);
762
- }
763
- }
764
- }
765
- }
766
-
767
-
768
- .ngx-mat-timepicker-dialog {
769
- // Increase max-width for very small screen
770
- --mat-dialog-container-small-max-width: calc(100vw - var(--ion-padding, 16px) * 2);
771
- }
772
-
773
- // --------------------------------------------------
774
- // Mat chip field
775
- // --------------------------------------------------
776
-
777
- .mat-mdc-form-field-type-mat-chip-grid {
778
- .mat-mdc-form-field-infix {
779
- --mdc-chip-container-height: 24px !important;
780
- }
781
- }
782
-
783
-
784
- // --------------------------------------------------
785
- // Pages
786
- // --------------------------------------------------
787
- ion-item {
788
- ion-label.error {
789
- line-height: 16px;
790
- line-break: normal;
791
- overflow: visible;
792
- white-space: normal;
793
- }
794
- }
795
-
796
- // --------------------------------------------------
797
- // Modal
798
- // --------------------------------------------------
799
-
800
- ion-modal.stack-modal {
801
- --box-shadow: 0 28px 48px rgba(0, 0, 0, 0.4);
802
- --backdrop-opacity: var(--ion-backdrop-opacity, 0.32);
803
- }
804
-
805
- ion-modal.modal-large {
806
- --min-height: calc(100% - 50px) !important;
807
- --min-width: calc(100% - 100px) !important;
808
- }
809
- ion-modal.modal-fullscreen {
810
- --min-height: calc(100%) !important;
811
- --min-width: calc(100%) !important;
812
- }
813
- ion-modal.modal-notifications {
814
- --min-height: calc(100% - 50px) !important;
815
- }
816
-
817
-
818
- // --------------------------------------------------
819
- // Popover
820
- // --------------------------------------------------
821
-
822
- .popover-large {
823
- --min-width: calc(min(500px, 80%));
824
- }
825
-
826
- .popover-notifications {
827
- --popover-top: 0;
828
- --max-height: calc(90vh - 40px /* header + footer height */ - var(--popover-top, 0px) - var(--offset-y, 0px));
829
-
830
- ion-item {
831
- --ion-item-background-color-hover: var(--ion-color-light);
832
- &.unread {
833
- --ion-item-background: rgba(var(--ion-color-secondary100-rgb), 0.2);
834
- --ion-item-background-color-hover: rgba(var(--ion-color-secondary100-rgb), 0.3);
835
- }
836
- }
837
- }
838
-
839
- // --------------------------------------------------
840
- // Large button with icon floating on right
841
- // --------------------------------------------------
842
- .flex-margin ion-icon,
843
- .flex-margin span {
844
- margin-left: auto;
845
- }
846
-
847
- // --------------------------------------------------
848
- // Icon tooltip, and title
849
- // --------------------------------------------------
850
- // Fix Button icon name overrides button's own title on mouse over
851
- /*ion-icon[name='chatbox'] {
852
- pointer-events: none !important;
853
- }*/
854
- .mat-cell {
855
- /* smaller size, for the comment icon */
856
- mat-icon.comment {
857
- @include font-size(16pt);
858
- height: 100%;
859
- vertical-align: center;
860
- color: var(--ion-color-tertiary, grey);
861
-
862
- &.disabled {
863
- color: var(--ion-color-medium, grey);
864
- }
865
- }
866
- }
867
-
868
- // --------------------------------------------------
869
- // Icon inside text
870
- // --------------------------------------------------
871
- mat-icon,
872
- ion-icon {
873
- &.text-size {
874
- font-size: 1em;
875
- width: 1em;
876
- height: 1em;
877
- }
878
- }
879
- ion-button[expand="block"],
880
- ion-button[expand="full"],
881
- .mat-button,
882
- .mat-raised-button {
883
- mat-icon,
884
- ion-icon {
885
- &[slot] {
886
- pointer-events: none;
887
- width: 24px;
888
- height: 24px;
889
- }
890
- &[slot='start'],
891
- &[slot='end'] {
892
- margin-left: unset;
893
- margin-right: unset;
894
- margin-top: 0;
895
- margin-bottom: 0;
896
- }
897
- &t[slot='start'] {
898
- margin-inline-start: -0.3em;
899
- margin-inline-end: 0.3em;
900
- }
901
- &[slot='end'] {
902
- margin-inline-start: 0.3em;
903
- margin-inline-end: -0.3em;
904
- }
905
- &.ion-float-start[slot='start'] {
906
- position: absolute;
907
- left: 0;
908
- }
909
- &.ion-float-end[slot='end'] {
910
- position: absolute;
911
- right: 0;
912
- }
913
- }
914
- }
915
-
916
- // --------------------------------------------------
917
- // Icon multiple
918
- // --------------------------------------------------
919
- ion-icon.icon-secondary,
920
- mat-icon.icon-secondary,
921
- .mat-mdc-icon-button .mat-icon.icon-secondary {
922
- position: absolute;
923
- left: 0;
924
- }
925
-
926
- // --------------------------------------------------
927
- // Toast
928
- // --------------------------------------------------
929
- ion-toast {
930
- --background: var(--ion-color-dark);
931
- --color: var(--ion-color-dark-contrast);
932
- --button-color: var(--color);
933
-
934
- &.secondary {
935
- --background: var(--ion-color-secondary);
936
- --color: var(--ion-color-secondary-contrast);
937
- }
938
- &.accent {
939
- --background: var(--ion-color-accent);
940
- --color: var(--ion-color-accent-contrast);
941
- }
942
- &.danger {
943
- --background: var(--ion-color-danger);
944
- --color: var(--ion-color-danger-contrast);
945
- }
946
-
947
- /* -- workaround because toast animation failed */
948
- --toast-max-height: 75px;
949
-
950
- &.toast-stack-offset-1 {
951
- --toast-stack-offset: 1;
952
- }
953
- &.toast-stack-offset-2 {
954
- --toast-stack-offset: 2;
955
- }
956
- &.toast-stack-offset-3 {
957
- --toast-stack-offset: 3;
958
- }
959
- &.toast-stack-offset-4 {
960
- --toast-stack-offset: 4;
961
- }
962
-
963
- &.toast-stacked-top {
964
- --toast-top: calc(var(--toast-stack-offset, 0) * var(--toast-max-height, 0px));
965
- transform: translateY(var(--toast-top));
966
- }
967
- &.toast-stacked-bottom {
968
- --toast-bottom: calc((var(--toast-stack-offset, 0) + 1) * var(--toast-max-height, 0px));
969
- transform: translateY(var(--toast-bottom));
970
- }
971
- }
972
-
973
- // --------------------------------------------------
974
- // Refresher
975
- // --------------------------------------------------
976
- ion-refresher.refresher-native {
977
- z-index: 1000;
978
- }
979
-
980
- // --------------------------------------------------
981
- // Mat Side
982
- // --------------------------------------------------
983
- .mat-drawer-container {
984
- --mat-sidenav-container-text-color: var(--ion-text-color);
985
- --mat-sidenav-container-background-color: var(--ion-background-color);
986
- --mat-sidenav-container-divider-color: var(--ion-border-color, rgba(0, 0, 0, 0.12));
987
- --mat-sidenav-container-elevation-shadow: 4px 0px 16px rgba(0, 0, 0, 0.18);
988
- --mat-sidenav-content-text-color: var(--ion-text-color);
989
- --mat-sidenav-content-background-color: var(--ion-background-color);
990
- --mat-sidenav-scrim-color: rgba(var(--ion-backdrop-color-rgb), var(--ion-backdrop-opacity));
991
- }
992
-
993
- // --------------------------------------------------
994
- // Named filter
995
- // --------------------------------------------------
996
-
997
- ion-toolbar app-named-filter-selector,
998
- mat-toolbar app-named-filter-selector {
999
-
1000
- // Hide subscript wrapper (will hide hint)
1001
- .mat-mdc-form-field-subscript-wrapper {
1002
- display: none;
1003
- visibility: hidden;
1004
- }
1005
- }
1006
-
1007
- // --------------------------------------------------
1008
- // Toolbar
1009
- // --------------------------------------------------
1
+
2
+ body,
3
+ html {
4
+ padding: 0;
5
+ margin: 0;
6
+ }
7
+
8
+ *::selection {
9
+ background: var(--ion-color-shade, rgba(var(--ion-color-text-rgb, 0, 0, 0), 0.3));
10
+ }
11
+
12
+ // Text style
13
+ // --------------------------------------------------
14
+ .text-italic {
15
+ font-style: italic;
16
+ }
17
+ .ion-text-wrap {
18
+ white-space: normal;
19
+ word-wrap: break-word;
20
+ }
21
+
22
+ // Page Container Structure
23
+ // --------------------------------------------------
24
+
25
+ .ion-page-invisible {
26
+ opacity: 0;
27
+ }
28
+
29
+ ion-toolbar ion-title,
30
+ app-toolbar ion-title {
31
+ small {
32
+ font-weight: normal;
33
+ br {
34
+ display: none;
35
+ visibility: hidden;
36
+ }
37
+ }
38
+ // Add a separator, after the <small> part
39
+ small:first-of-type:after {
40
+ content: " - ";
41
+ }
42
+ }
43
+
44
+ @media screen and (max-width: $screen-sm-max) {
45
+ ion-toolbar ion-title,
46
+ app-toolbar ion-title {
47
+ small {
48
+ @include font-size(10pt);
49
+ }
50
+ small br {
51
+ display: unset;
52
+ visibility: unset;
53
+ }
54
+ // Add a separator, after the <small> part
55
+ small:first-of-type:after {
56
+ content: "";
57
+ }
58
+ }
59
+ }
60
+
61
+ // Ionic Safe Margins
62
+ // --------------------------------------------------
63
+ html.plt-ios.plt-hybrid,
64
+ html.plt-ios.plt-pwa {
65
+ --ion-statusbar-padding: 20px;
66
+ }
67
+
68
+ html {
69
+ --ion-safe-area-top: var(--ion-statusbar-padding);
70
+ }
71
+
72
+ // TODO: remove once Safari 11.2 dies
73
+ @supports (padding-top: constant(safe-area-inset-top)) {
74
+ html {
75
+ --ion-safe-area-top: constant(safe-area-inset-top);
76
+ --ion-safe-area-bottom: constant(safe-area-inset-bottom);
77
+ --ion-safe-area-left: constant(safe-area-inset-left);
78
+ --ion-safe-area-right: constant(safe-area-inset-right);
79
+ }
80
+ }
81
+
82
+ @supports (padding-top: env(safe-area-inset-top)) {
83
+ html {
84
+ --ion-safe-area-top: env(safe-area-inset-top);
85
+ --ion-safe-area-bottom: env(safe-area-inset-bottom);
86
+ --ion-safe-area-left: env(safe-area-inset-left);
87
+ --ion-safe-area-right: env(safe-area-inset-right);
88
+ }
89
+ }
90
+
91
+ // --------------------------------------------------
92
+ // Back button in app toolbar
93
+ // --------------------------------------------------
94
+
95
+ .ion-page.can-go-back {
96
+ app-toolbar {
97
+
98
+ ion-menu-toggle {
99
+ display: none !important;
100
+ }
101
+
102
+ // Back button
103
+ ion-back-button,
104
+ ion-button.back-button {
105
+ display: inline-block !important;
106
+ }
107
+ }
108
+ }
109
+
110
+ // --------------------------------------------------
111
+ // Main Menu
112
+ // --------------------------------------------------
113
+ .split-pane-md.split-pane-visible > .split-pane-side {
114
+ max-width: #{$app-menu-width} !important;
115
+ }
116
+
117
+ ion-menu.menu-side-left {
118
+ .menu-inner {
119
+ .scroll {
120
+ overflow-y: auto !important;
121
+
122
+ .scroll-inner {
123
+ min-height: auto !important;
124
+ }
125
+ }
126
+ }
127
+ }
128
+
129
+
130
+ mat-form-field {
131
+ .mat-paginator-page-size-select {
132
+ @include font-size-important(14px);
133
+ }
134
+ }
135
+
136
+
137
+ // --- mat-date-short-field
138
+ mat-calendar.mat-date-short-panel {
139
+ // Hide some buttons (e.g. to change the period)
140
+ // and the month view
141
+ .mat-calendar-period-button,
142
+ mat-year-view {
143
+ visibility: hidden;
144
+ display: none;
145
+ }
146
+ }
147
+
148
+ @media screen and (min-width: $screen-sm) {
149
+ form.form-container {
150
+ ion-grid {
151
+ ion-col[size-sm="auto"] > mat-date-time-field {
152
+ // When inside a form + grid : fix <ion-col size-sm="auto"> alignment in some screen resolution
153
+ max-width: 200px;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ // --------------------------------------------------
159
+ // mat-checkbox
160
+ // --------------------------------------------------
161
+
162
+ mat-checkbox {
163
+ .mat-checkbox-checkmark {
164
+ .mat-checkbox-checkmark-path {
165
+ // TODO: change to accent-contrast
166
+ stroke: white !important;
167
+ }
168
+ }
169
+ }
170
+
171
+ // --------------------------------------------------
172
+ // mat-autocomplete and mat-select panel
173
+ // --------------------------------------------------
174
+
175
+ // When simple text option, add a padding
176
+ mat-option {
177
+
178
+ .mdc-list-item__primary-text {
179
+ display: inline-block;
180
+ flex-grow: 1;
181
+ box-sizing: border-box;
182
+ }
183
+ .mat-option-text:not(:has(ion-row)),
184
+ .mat-option-text:has(ion-searchbar),
185
+ .mdc-list-item__primary-text:has(ion-searchbar) {
186
+ padding: 0 !important;
187
+ }
188
+ ion-row,
189
+ .mat-option-text:has(ion-row),
190
+ .mdc-list-item__primary-text:has(ion-row) {
191
+ padding: 0;
192
+ width: 100%; // Fix sumaris-app#943
193
+ }
194
+ mat-autocomplete-footer {
195
+ .mat-option-text,
196
+ .mdc-list-item__primary-text {
197
+ padding: 0 !important;
198
+ }
199
+ }
200
+ }
201
+
202
+ mat-option:not(:last-of-type) {
203
+ border-bottom: 1px solid #{$app-select-option-border-color};
204
+ }
205
+
206
+
207
+ .cdk-overlay-pane:has(.mat-mdc-select-panel) {
208
+ --min-width: 200px;
209
+ --max-width: calc(min(100%, 100vw - 64px));
210
+ min-width: var(--min-width) !important;
211
+ max-width: var(--max-width) !important;
212
+
213
+ // FIXME : This is a workaround find at : https://github.com/angular/components/issues/26000#issuecomment-1563107933
214
+ &:has(.mat-select-panel-fit-content) {
215
+ --min-width: fit-content !important;
216
+ }
217
+
218
+ .mat-mdc-select-panel {
219
+ --mat-switch-visible-track-transition: transform 75ms 50ms cubic-bezier(0, 0, 0.2, 1);
220
+ transition: --mat-switch-visible-track-transition;
221
+ transform: scaleY(1) !important;
222
+
223
+ &.hidden {
224
+ transform: scaleY(0) !important;
225
+ }
226
+
227
+ .mat-mdc-option {
228
+ // When option text wrap, do not increase the option height
229
+ ion-col.ion-text-wrap {
230
+ max-height: var(--mat-option-max-height, #{$mat-option-max-height});
231
+ }
232
+ }
233
+ }
234
+
235
+ }
236
+
237
+
238
+ .cdk-overlay-pane:has(.mat-mdc-autocomplete-panel) {
239
+ --min-width: 200px;
240
+ --max-width: calc(min(100%, 100vw - 64px));
241
+ min-width: var(--min-width) !important;
242
+ max-width: var(--max-width) !important;
243
+
244
+ // FIXME : This is a workaround find at : https://github.com/angular/components/issues/26000#issuecomment-1563107933
245
+ &:has(.mat-select-panel-fit-content) {
246
+ --min-width: fit-content !important;
247
+ }
248
+
249
+ &:has(.min-width-medium),
250
+ &:has(.mat-mdc-autocomplete-panel-medium-size) {
251
+ --min-width: 300px;
252
+ }
253
+
254
+ &:has(.min-width-large),
255
+ &:has(.mat-mdc-autocomplete-panel-large-size) {
256
+ --min-width: 400px;
257
+ }
258
+
259
+ &:has(.min-width-xlarge),
260
+ &:has(.mat-mdc-autocomplete-panel-xlarge-size) {
261
+ --min-width: 450px;
262
+ }
263
+
264
+ &:has(.min-width-80vw) {
265
+ --min-width: 80vw;
266
+ }
267
+
268
+ &:has(.mat-mdc-autocomplete-panel-full-size),
269
+ &:has(.full-size) {
270
+ --margin-left: 32px;
271
+ --margin-right: 32px;
272
+ --min-width: calc(100vw - var(--margin-left) - var(--margin-right));
273
+ --max-width: calc(100vw - var(--margin-left) - var(--margin-right));
274
+ position: fixed;
275
+ left: var(--margin-left) !important;
276
+ right: unset !important;
277
+ }
278
+ }
279
+
280
+ .mat-mdc-select-panel,
281
+ .mat-mdc-autocomplete-panel {
282
+ /* when multiple selection enable */
283
+ .mat-mdc-option mat-pseudo-checkbox,
284
+ .mat-mdc-option .mat-pseudo-checkbox-full {
285
+ margin-left: 12px;
286
+ margin-right: 4px;
287
+ }
288
+
289
+ padding: 0 !important;
290
+ }
291
+
292
+ ion-list,
293
+ .mat-mdc-menu-panel {
294
+ &.ion-list-popover {
295
+ padding: 0 !important;
296
+ }
297
+ }
298
+
299
+ // --------------------------------------------------
300
+ // mat-autocomplete-field
301
+ // --------------------------------------------------
302
+
303
+ // Define useful variable
304
+ html.plt-ios {
305
+ --ion-searchbar-height: 60px;
306
+ //--ion-toolbar-height: 58px;
307
+ }
308
+ html {
309
+ //--ion-searchbar-height: 58px;
310
+ }
311
+
312
+ ion-list,
313
+ .mat-mdc-menu-panel,
314
+ .mat-mdc-select-panel,
315
+ .mat-mdc-autocomplete-panel {
316
+
317
+ /* Avoid bad display, when opening panel for the first time */
318
+ &.ng-trigger-transformPanel {
319
+ ion-searchbar.mat-select-header,
320
+ ion-searchbar.mat-autocomplete-header {
321
+ visibility: visible;
322
+ display: flex;
323
+ opacity: 1;
324
+ transition: opacity 0.3s ease-in-out;
325
+ }
326
+ }
327
+
328
+ .mat-mdc-optgroup.mat-select-searchbar,
329
+ .mat-mdc-option.mat-autocomplete-searchbar
330
+ {
331
+ padding: 0 !important;
332
+ height: var(--ion-searchbar-height, 58px) !important;
333
+ background-color: var(--ion-color-secondary100) !important;
334
+ pointer-events: inherit !important;
335
+
336
+ .mat-mdc-optgroup-label {
337
+ background-color: var(--ion-color-secondary100) !important;
338
+ padding: 0;
339
+ display: block;
340
+ }
341
+
342
+ /* hide pseudo checkbox, in the searchbar*/
343
+ mat-pseudo-checkbox {
344
+ visibility: hidden;
345
+ display: none;
346
+ }
347
+
348
+ &.mat-select-searchbar-sticky {
349
+ z-index: 1001;
350
+ /* Set header as sticky*/
351
+ position: -webkit-sticky;
352
+ position: sticky;
353
+ top: 0;
354
+ }
355
+
356
+ .searchbar-input {
357
+ --background: var(--app-form-field-background-color, var(--ion-background-color));
358
+ padding-inline-end: 34px; // Keep a place for the clear button
359
+ }
360
+ }
361
+
362
+ ion-row.ion-list-header,
363
+ ion-row.mat-select-header,
364
+ ion-row.mat-menu-header,
365
+ ion-row.mat-autocomplete-header {
366
+ &.multiple {
367
+ /* Offset due to mat-pseudo-checkbox */
368
+ padding-left: 32px;
369
+ }
370
+ &.column {
371
+ /* Set header as sticky*/
372
+ position: -webkit-sticky;
373
+ position: sticky;
374
+ top: 0;
375
+ z-index: 1001;
376
+ background-color: var(--ion-color-secondary);
377
+ border-bottom: 1px solid #{$app-select-option-border-color};
378
+ color: var(--ion-color-secondary-contrast);
379
+ line-height: 20px;
380
+ @include font-size(12px);
381
+ font-weight: 500;
382
+ height: 20px;
383
+ ion-col {
384
+ white-space: nowrap;
385
+ text-overflow: ellipsis;
386
+ }
387
+ &.mat-select-searchbar-sticky {
388
+ /* offset because of the searchbar height */
389
+ top: var(--ion-searchbar-height, 58px);
390
+ }
391
+ }
392
+
393
+ }
394
+
395
+ ion-row.ion-list-footer,
396
+ ion-row.mat-select-footer,
397
+ ion-row.mat-menu-footer,
398
+ ion-row.mat-autocomplete-footer,
399
+ mat-option.mat-autocomplete-footer {
400
+ /* Set footer as sticky*/
401
+ position: -webkit-sticky;
402
+ position: sticky;
403
+ bottom: 0;
404
+ z-index: 1001;
405
+ border-top: 1px solid #{$app-select-option-border-color};
406
+ background-color: var(--ion-toolbar-background, #{$ion-toolbar-background});
407
+ color: var(--ion-color-medium) !important; // not working on mobile form because the mat-option is disabled
408
+ @include font-size(12px);
409
+ font-weight: 500;
410
+ height: 20px;
411
+ min-height: 20px;
412
+ line-height: 20px;
413
+ opacity: 1 !important;
414
+
415
+ ion-col {
416
+ white-space: nowrap;
417
+ text-overflow: ellipsis;
418
+ }
419
+ }
420
+
421
+ ion-row {
422
+ --ion-grid-column-padding: 0;
423
+
424
+ ion-col {
425
+ --padding-start: 8px;
426
+ padding: 0 !important;
427
+ padding-left: var(--padding-start, 0) !important;
428
+ text-overflow: ellipsis;
429
+ overflow: hidden;
430
+ white-space: nowrap;
431
+ }
432
+ }
433
+
434
+ .odd {
435
+ background: var(--ion-light-color-shade, $light);
436
+ }
437
+
438
+ .mat-mdc-option[no-padding],
439
+ mat-option[no-padding] {
440
+ padding: 0 !important;
441
+ }
442
+ }
443
+
444
+ // --------------------------------------------------
445
+ // Table > Filter expansion panel
446
+ // --------------------------------------------------
447
+
448
+ mat-expansion-panel {
449
+
450
+ &.filter-panel {
451
+
452
+ background: var(--ion-color-secondary50);
453
+ color: var(--ion-color-secondary50-contrast);
454
+ margin-bottom: 5px;
455
+
456
+ .form-container {
457
+ mat-form-field {
458
+ width: 100%;
459
+
460
+ .datetime-md {
461
+ padding: 0 !important;
462
+ }
463
+ }
464
+ }
465
+
466
+ mat-action-row {
467
+ ion-label {
468
+ line-height: 36px;
469
+ }
470
+ }
471
+ }
472
+
473
+ &.filter-panel-floating {
474
+ z-index: 999;
475
+ position: absolute;
476
+ top: 0;
477
+ left: 0;
478
+ right: 0;
479
+ }
480
+
481
+ &.filter-panel-pinned {
482
+ overflow-y: scroll;
483
+ }
484
+
485
+ .mat-expansion-panel-header,
486
+ mat-expansion-panel-header {
487
+ padding: var(--expansion-panel-header-padding, var(--expansion-panel-padding));
488
+ }
489
+ .mat-expansion-panel-body {
490
+ padding: var(--expansion-panel-padding, var(--ion-padding));
491
+ }
492
+ }
493
+
494
+ // --------------------------------------------------
495
+ // Form buttons bar
496
+ // --------------------------------------------------
497
+ app-form-buttons-bar {
498
+ --form-buttons-bar-buttons-width: 400px;
499
+ --form-buttons-bar-content-max-width: calc(100% - var(--form-buttons-bar-buttons-width) - 40px /*right menu toggle button*/);
500
+ .app-form-buttons-bar-content {
501
+ max-width: var(--form-buttons-bar-content-max-width);
502
+ }
503
+ }
504
+
505
+ // --------------------------------------------------
506
+ // Ion-select
507
+ // --------------------------------------------------
508
+
509
+ ion-popover.select-popover {
510
+ .popover-content {
511
+ min-width: calc(min(80%, 200px));
512
+ }
513
+ }
514
+
515
+ @media screen and (min-width: $screen-sm) {
516
+ ion-popover.select-popover {
517
+ .popover-content {
518
+ min-width: 300px;
519
+ }
520
+
521
+ ion-radio .radio-icon {
522
+ border: 0 !important;
523
+ }
524
+ }
525
+ }
526
+
527
+
528
+ // --------------------------------------------------
529
+ // Ionic list
530
+ // --------------------------------------------------
531
+ ion-list {
532
+ ion-item.ion-item-selected {
533
+ --ion-color-base: var(--ion-color-secondary100);
534
+ --ion-color-contrast: var(--ion-color-secondary100-contrast);
535
+
536
+ &:before {
537
+ background: var(--ion-color-base) !important;
538
+ color: var(--ion-color-contrast) !important;
539
+ }
540
+ }
541
+ }
542
+
543
+ // ------------------------
544
+ // Other material component
545
+
546
+ .flex-spacer,
547
+ .toolbar-spacer {
548
+ flex: 1 1 auto;
549
+ }
550
+
551
+ ion-toolbar {
552
+ --min-height: var(--ion-toolbar-height, 56px);
553
+ }
554
+ ion-toolbar[translucent] {
555
+ --background: transparent !important;
556
+ }
557
+
558
+ // --- mat-stepper component
559
+ mat-horizontal-stepper {
560
+ .mat-horizontal-stepper-header-container {
561
+ padding: 0;
562
+ }
563
+
564
+ .mat-horizontal-content-container {
565
+ padding: 0;
566
+ }
567
+ }
568
+
569
+
570
+ // Extra small device: Phones (<767px)
571
+ @media screen and (max-width: $screen-xs-max) {
572
+ mat-horizontal-stepper {
573
+ .mat-horizontal-stepper-header-container {
574
+ .mat-horizontal-stepper-header {
575
+ padding-left: 5px;
576
+ }
577
+
578
+ .mat-stepper-horizontal-line {
579
+ display: none;
580
+ }
581
+ }
582
+
583
+ .mat-horizontal-content-container {
584
+ padding: 0;
585
+ }
586
+ }
587
+ }
588
+
589
+ mat-button-toggle.mat-button-toggle-checked,
590
+ mat-button-toggle.mat-button-toggle-checked.mat-button-toggle-disabled {
591
+ background-color: var(--ion-color-light);
592
+ color: white;
593
+ }
594
+
595
+ // --------------------------------------------------
596
+ // Material menu
597
+ // --------------------------------------------------
598
+
599
+
600
+ .mat-mdc-menu-panel {
601
+
602
+ // width = 400px
603
+ &.mat-menu-size-400 {
604
+ min-width: unset;
605
+ width: 400px;
606
+ max-width: calc(90vw);
607
+ }
608
+ // width = 75vw
609
+ &.mat-menu-size-75vw {
610
+ min-width: unset;
611
+ width: calc(75vw);
612
+ max-width: calc(90vw);
613
+ }
614
+ // width = 100vw
615
+ &.mat-menu-size-100vw {
616
+ min-width: unset;
617
+ width: calc(100vw);
618
+ max-width: calc(100vw);
619
+ }
620
+
621
+ // No padding
622
+ &.ion-no-padding {
623
+ .mat-mdc-menu-content {
624
+ padding: 0 !important;
625
+ }
626
+ }
627
+
628
+ // Small menu item (e.g. for actions on a table row)
629
+ &.mat-mdc-menu-item-small-height .mat-mdc-menu-item,
630
+ .mat-mdc-menu-item.mat-mdc-menu-item-small-height
631
+ {
632
+ padding: 0 8px;
633
+ height: 35px;
634
+ line-height: 35px;
635
+ }
636
+ // Reduce the font size, on label just inside a mat-menu (e.g. see trips.page.html)
637
+ .mat-mdc-menu-content > ion-label {
638
+ @include font-size(12px);
639
+ }
640
+
641
+ .mat-mdc-menu-content {
642
+ .mat-mdc-menu-item {
643
+ --mat-menu-item-label-text-color: var(--ion-text-color);
644
+ // Required for the dark theme (otherwise the icon will be dark)
645
+ --mat-menu-item-icon-color: rgba(var(--ion-text-color-rgb, 255, 255, 255), 0.54);
646
+ }
647
+ }
648
+
649
+ .mat-mdc-menu-content ion-item > ion-icon[slot="start"] {
650
+ margin-right: 16px;
651
+ vertical-align: middle;
652
+ }
653
+
654
+ // Menu title (e.g. see extraction map)
655
+ .mat-mdc-menu-item.mat-mdc-menu-title {
656
+ padding: 0 8px;
657
+ height: 27px;
658
+ line-height: 27px;
659
+ @include font-size(12px);
660
+ pointer-events: none;
661
+ color: var(--ion-color-medium, rgba(0, 0, 0, 0.38));
662
+ }
663
+ }
664
+
665
+ // --------------------------------------------------
666
+ // Alert
667
+ // --------------------------------------------------
668
+
669
+ ion-alert button.alert-button {
670
+ cursor: pointer;
671
+ }
672
+
673
+
674
+ // --------------------------------------------------
675
+ // Overlay
676
+ // --------------------------------------------------
677
+
678
+ .cdk-overlay-dark-backdrop {
679
+ background: rgba(var(--ion-backdrop-color-rgb, 0,0,0), var(--ion-backdrop-opacity, 0.32));
680
+ }
681
+
682
+ // --------------------------------------------------
683
+ // Date and time picker
684
+ // --------------------------------------------------
685
+ // Date picker
686
+ .mat-datepicker-content {
687
+ --mat-datepicker-calendar-container-background-color: var(--ion-background-color, #fff) !important;
688
+ --mat-datepicker-calendar-container-text-color: var(--ion-text-color, #000000) !important;
689
+ --mat-datepicker-calendar-date-text-color: var(--ion-text-color);
690
+ --mat-datepicker-calendar-body-label-text-color: var(--ion-color-step-500);
691
+ --mat-datepicker-calendar-header-text-color: var(--ion-color-step-500);
692
+ }
693
+ mat-calendar {
694
+ .mat-calendar-header {
695
+ background-color: var(--ion-color-secondary) !important;
696
+ color: var(--ion-color-secondary-contrast) !important;
697
+
698
+ button {
699
+ color: var(--ion-color-secondary-contrast) !important;
700
+ }
701
+ }
702
+
703
+ .mat-calendar-body-selected {
704
+ background-color: var(--ion-color-accent) !important;
705
+ color: var(--ion-color-accent-contrast) !important;
706
+ font-weight: bold;
707
+ }
708
+
709
+ .mat-calendar-arrow {
710
+ border-top-color: var(--ion-color-secondary-contrast) !important;
711
+ }
712
+ }
713
+
714
+ @media (orientation: landscape) {
715
+ .mat-datepicker-content-touch {
716
+ height: fit-content !important;
717
+ min-height: 310px;
718
+
719
+ .mat-calendar-controls {
720
+ margin-top: 0;
721
+ }
722
+ .mat-datepicker-content-container {
723
+ &.mat-datepicker-content-container-with-actions {
724
+ height: unset !important;
725
+ }
726
+ .mat-datepicker-actions {
727
+ background-color: var(--mat-datepicker-calendar-container-background-color);
728
+ margin-top: -12px;
729
+ }
730
+ }
731
+ }
732
+ }
733
+
734
+
735
+ // --------------------------------------------------
736
+ // Time picker
737
+ // --------------------------------------------------
738
+
739
+ .timepicker {
740
+ .timepicker-header,
741
+ .timepicker-header .mat-toolbar.mat-accent{
742
+ // Change header color to 'secondary'
743
+ --mat-toolbar-container-background-color: var(--ion-color-secondary) !important;
744
+ --mat-toolbar-container-text-color: var(--ion-color-secondary-contrast) !important;
745
+ }
746
+
747
+ ngx-mat-timepicker-face .clock-face {
748
+ background-color: var(--app-form-field-background-color) !important;
749
+
750
+ .mat-toolbar.mat-accent {
751
+ --mat-toolbar-container-background-color: var(--ion-color-accent);
752
+ --mat-toolbar-container-text-color: var(--ion-color-accent-contrast);
753
+ }
754
+ button.mat-mdc-mini-fab {
755
+ &.mat-unthemed {
756
+ --mat-fab-small-foreground-color: var(--ion-text-color);
757
+ }
758
+
759
+ &.mat-accent {
760
+ --mdc-fab-small-container-color: var(--ion-color-accent);
761
+ --mat-fab-small-foreground-color: var(--ion-color-accent-contrast);
762
+ }
763
+ }
764
+ }
765
+ }
766
+
767
+
768
+ .ngx-mat-timepicker-dialog {
769
+ // Increase max-width for very small screen
770
+ --mat-dialog-container-small-max-width: calc(100vw - var(--ion-padding, 16px) * 2);
771
+ }
772
+
773
+ // --------------------------------------------------
774
+ // Mat chip field
775
+ // --------------------------------------------------
776
+
777
+ .mat-mdc-form-field-type-mat-chip-grid {
778
+ .mat-mdc-form-field-infix {
779
+ --mdc-chip-container-height: 24px !important;
780
+ }
781
+ }
782
+
783
+
784
+ // --------------------------------------------------
785
+ // Pages
786
+ // --------------------------------------------------
787
+ ion-item {
788
+ ion-label.error {
789
+ line-height: 16px;
790
+ line-break: normal;
791
+ overflow: visible;
792
+ white-space: normal;
793
+ }
794
+ }
795
+
796
+ // --------------------------------------------------
797
+ // Modal
798
+ // --------------------------------------------------
799
+
800
+ ion-modal.stack-modal {
801
+ --box-shadow: 0 28px 48px rgba(0, 0, 0, 0.4);
802
+ --backdrop-opacity: var(--ion-backdrop-opacity, 0.32);
803
+ }
804
+
805
+ ion-modal.modal-large {
806
+ --min-height: calc(100% - 50px) !important;
807
+ --min-width: calc(100% - 100px) !important;
808
+ }
809
+ ion-modal.modal-fullscreen {
810
+ --min-height: calc(100%) !important;
811
+ --min-width: calc(100%) !important;
812
+ }
813
+ ion-modal.modal-notifications {
814
+ --min-height: calc(100% - 50px) !important;
815
+ }
816
+
817
+
818
+ // --------------------------------------------------
819
+ // Popover
820
+ // --------------------------------------------------
821
+
822
+ .popover-large {
823
+ --min-width: calc(min(500px, 80%));
824
+ }
825
+
826
+ .popover-notifications {
827
+ --popover-top: 0;
828
+ --max-height: calc(90vh - 40px /* header + footer height */ - var(--popover-top, 0px) - var(--offset-y, 0px));
829
+
830
+ ion-item {
831
+ --ion-item-background-color-hover: var(--ion-color-light);
832
+ &.unread {
833
+ --ion-item-background: rgba(var(--ion-color-secondary100-rgb), 0.2);
834
+ --ion-item-background-color-hover: rgba(var(--ion-color-secondary100-rgb), 0.3);
835
+ }
836
+ }
837
+ }
838
+
839
+ // --------------------------------------------------
840
+ // Large button with icon floating on right
841
+ // --------------------------------------------------
842
+ .flex-margin ion-icon,
843
+ .flex-margin span {
844
+ margin-left: auto;
845
+ }
846
+
847
+ // --------------------------------------------------
848
+ // Icon tooltip, and title
849
+ // --------------------------------------------------
850
+ // Fix Button icon name overrides button's own title on mouse over
851
+ /*ion-icon[name='chatbox'] {
852
+ pointer-events: none !important;
853
+ }*/
854
+ .mat-cell {
855
+ /* smaller size, for the comment icon */
856
+ mat-icon.comment {
857
+ @include font-size(16pt);
858
+ height: 100%;
859
+ vertical-align: center;
860
+ color: var(--ion-color-tertiary, grey);
861
+
862
+ &.disabled {
863
+ color: var(--ion-color-medium, grey);
864
+ }
865
+ }
866
+ }
867
+
868
+ // --------------------------------------------------
869
+ // Icon inside text
870
+ // --------------------------------------------------
871
+ mat-icon,
872
+ ion-icon {
873
+ &.text-size {
874
+ font-size: 1em;
875
+ width: 1em;
876
+ height: 1em;
877
+ }
878
+ }
879
+ ion-button[expand="block"],
880
+ ion-button[expand="full"],
881
+ .mat-button,
882
+ .mat-raised-button {
883
+ mat-icon,
884
+ ion-icon {
885
+ &[slot] {
886
+ pointer-events: none;
887
+ width: 24px;
888
+ height: 24px;
889
+ }
890
+ &[slot='start'],
891
+ &[slot='end'] {
892
+ margin-left: unset;
893
+ margin-right: unset;
894
+ margin-top: 0;
895
+ margin-bottom: 0;
896
+ }
897
+ &t[slot='start'] {
898
+ margin-inline-start: -0.3em;
899
+ margin-inline-end: 0.3em;
900
+ }
901
+ &[slot='end'] {
902
+ margin-inline-start: 0.3em;
903
+ margin-inline-end: -0.3em;
904
+ }
905
+ &.ion-float-start[slot='start'] {
906
+ position: absolute;
907
+ left: 0;
908
+ }
909
+ &.ion-float-end[slot='end'] {
910
+ position: absolute;
911
+ right: 0;
912
+ }
913
+ }
914
+ }
915
+
916
+ // --------------------------------------------------
917
+ // Icon multiple
918
+ // --------------------------------------------------
919
+ ion-icon.icon-secondary,
920
+ mat-icon.icon-secondary,
921
+ .mat-mdc-icon-button .mat-icon.icon-secondary {
922
+ position: absolute;
923
+ left: 0;
924
+ }
925
+
926
+ // --------------------------------------------------
927
+ // Toast
928
+ // --------------------------------------------------
929
+ ion-toast {
930
+ --background: var(--ion-color-dark);
931
+ --color: var(--ion-color-dark-contrast);
932
+ --button-color: var(--color);
933
+
934
+ &.secondary {
935
+ --background: var(--ion-color-secondary);
936
+ --color: var(--ion-color-secondary-contrast);
937
+ }
938
+ &.accent {
939
+ --background: var(--ion-color-accent);
940
+ --color: var(--ion-color-accent-contrast);
941
+ }
942
+ &.danger {
943
+ --background: var(--ion-color-danger);
944
+ --color: var(--ion-color-danger-contrast);
945
+ }
946
+
947
+ /* -- workaround because toast animation failed */
948
+ --toast-max-height: 75px;
949
+
950
+ &.toast-stack-offset-1 {
951
+ --toast-stack-offset: 1;
952
+ }
953
+ &.toast-stack-offset-2 {
954
+ --toast-stack-offset: 2;
955
+ }
956
+ &.toast-stack-offset-3 {
957
+ --toast-stack-offset: 3;
958
+ }
959
+ &.toast-stack-offset-4 {
960
+ --toast-stack-offset: 4;
961
+ }
962
+
963
+ &.toast-stacked-top {
964
+ --toast-top: calc(var(--toast-stack-offset, 0) * var(--toast-max-height, 0px));
965
+ transform: translateY(var(--toast-top));
966
+ }
967
+ &.toast-stacked-bottom {
968
+ --toast-bottom: calc((var(--toast-stack-offset, 0) + 1) * var(--toast-max-height, 0px));
969
+ transform: translateY(var(--toast-bottom));
970
+ }
971
+ }
972
+
973
+ // --------------------------------------------------
974
+ // Refresher
975
+ // --------------------------------------------------
976
+ ion-refresher.refresher-native {
977
+ z-index: 1000;
978
+ }
979
+
980
+ // --------------------------------------------------
981
+ // Mat Side
982
+ // --------------------------------------------------
983
+ .mat-drawer-container {
984
+ --mat-sidenav-container-text-color: var(--ion-text-color);
985
+ --mat-sidenav-container-background-color: var(--ion-background-color);
986
+ --mat-sidenav-container-divider-color: var(--ion-border-color, rgba(0, 0, 0, 0.12));
987
+ --mat-sidenav-container-elevation-shadow: 4px 0px 16px rgba(0, 0, 0, 0.18);
988
+ --mat-sidenav-content-text-color: var(--ion-text-color);
989
+ --mat-sidenav-content-background-color: var(--ion-background-color);
990
+ --mat-sidenav-scrim-color: rgba(var(--ion-backdrop-color-rgb), var(--ion-backdrop-opacity));
991
+ }
992
+
993
+ // --------------------------------------------------
994
+ // Named filter
995
+ // --------------------------------------------------
996
+
997
+ ion-toolbar app-named-filter-selector,
998
+ mat-toolbar app-named-filter-selector {
999
+
1000
+ // Hide subscript wrapper (will hide hint)
1001
+ .mat-mdc-form-field-subscript-wrapper {
1002
+ display: none;
1003
+ visibility: hidden;
1004
+ }
1005
+ }
1006
+
1007
+ // --------------------------------------------------
1008
+ // Toolbar
1009
+ // --------------------------------------------------