@qtoggle/qui 0.0.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 (202) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.json +492 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  5. package/.github/ISSUE_TEMPLATE/improvement_proposal.md +20 -0
  6. package/.github/workflows/main.yml +74 -0
  7. package/.pre-commit-config.yaml +8 -0
  8. package/LICENSE.txt +177 -0
  9. package/README.md +4 -0
  10. package/font/dejavusans-bold.woff +0 -0
  11. package/font/dejavusans-bolditalic.woff +0 -0
  12. package/font/dejavusans-italic.woff +0 -0
  13. package/font/dejavusans-regular.woff +0 -0
  14. package/img/qui-icons.svg +1937 -0
  15. package/js/base/base.js +47 -0
  16. package/js/base/condition-variable.js +92 -0
  17. package/js/base/errors.js +36 -0
  18. package/js/base/i18n.js +20 -0
  19. package/js/base/mixwith.js +135 -0
  20. package/js/base/require-js-compat.js +78 -0
  21. package/js/base/signal.js +91 -0
  22. package/js/base/singleton.js +66 -0
  23. package/js/base/timer.js +126 -0
  24. package/js/config.js +184 -0
  25. package/js/forms/common-fields/check-field.js +42 -0
  26. package/js/forms/common-fields/choice-buttons-field.js +30 -0
  27. package/js/forms/common-fields/color-combo-field.js +37 -0
  28. package/js/forms/common-fields/combo-field.js +108 -0
  29. package/js/forms/common-fields/common-fields.js +23 -0
  30. package/js/forms/common-fields/composite-field.js +132 -0
  31. package/js/forms/common-fields/custom-html-field.js +51 -0
  32. package/js/forms/common-fields/email-field.js +30 -0
  33. package/js/forms/common-fields/file-picker-field.js +46 -0
  34. package/js/forms/common-fields/jquery-ui-field.js +111 -0
  35. package/js/forms/common-fields/labels-field.js +69 -0
  36. package/js/forms/common-fields/numeric-field.js +39 -0
  37. package/js/forms/common-fields/password-field.js +28 -0
  38. package/js/forms/common-fields/phone-field.js +26 -0
  39. package/js/forms/common-fields/progress-disk-field.js +69 -0
  40. package/js/forms/common-fields/push-button-field.js +138 -0
  41. package/js/forms/common-fields/slider-field.js +51 -0
  42. package/js/forms/common-fields/text-area-field.js +34 -0
  43. package/js/forms/common-fields/text-field.js +89 -0
  44. package/js/forms/common-fields/up-down-field.js +85 -0
  45. package/js/forms/common-forms/common-forms.js +16 -0
  46. package/js/forms/common-forms/options-form.js +77 -0
  47. package/js/forms/common-forms/page-form.js +115 -0
  48. package/js/forms/form-button.js +202 -0
  49. package/js/forms/form-field.js +1183 -0
  50. package/js/forms/form.js +1181 -0
  51. package/js/forms/forms.js +68 -0
  52. package/js/global-glass.js +100 -0
  53. package/js/icons/default-stock.js +173 -0
  54. package/js/icons/icon.js +64 -0
  55. package/js/icons/icons.js +16 -0
  56. package/js/icons/multi-state-sprites-icon.js +362 -0
  57. package/js/icons/stock-icon.js +219 -0
  58. package/js/icons/stock.js +98 -0
  59. package/js/icons/stocks.js +57 -0
  60. package/js/index.js +232 -0
  61. package/js/lib/jquery.longpress.js +79 -0
  62. package/js/lib/jquery.module.js +4 -0
  63. package/js/lib/logger.module.js +4 -0
  64. package/js/lib/pep.module.js +4 -0
  65. package/js/lists/common-items/common-items.js +5 -0
  66. package/js/lists/common-items/icon-label-list-item.js +86 -0
  67. package/js/lists/common-lists/common-lists.js +5 -0
  68. package/js/lists/common-lists/page-list.js +53 -0
  69. package/js/lists/list-item.js +147 -0
  70. package/js/lists/list.js +636 -0
  71. package/js/lists/lists.js +26 -0
  72. package/js/main-ui/main-ui.js +64 -0
  73. package/js/main-ui/menu-bar.js +144 -0
  74. package/js/main-ui/options-bar.js +181 -0
  75. package/js/main-ui/status.js +185 -0
  76. package/js/main-ui/top-bar.js +59 -0
  77. package/js/messages/common-message-forms/common-message-forms.js +7 -0
  78. package/js/messages/common-message-forms/confirm-message-form.js +81 -0
  79. package/js/messages/common-message-forms/simple-message-form.js +67 -0
  80. package/js/messages/common-message-forms/sticky-simple-message-form.js +27 -0
  81. package/js/messages/message-form.js +107 -0
  82. package/js/messages/messages.js +21 -0
  83. package/js/messages/sticky-modal-page.js +98 -0
  84. package/js/messages/sticky-modal-progress-message.js +27 -0
  85. package/js/messages/toast.js +164 -0
  86. package/js/navigation.js +654 -0
  87. package/js/pages/breadcrumbs.js +124 -0
  88. package/js/pages/common-pages/common-pages.js +6 -0
  89. package/js/pages/common-pages/modal-progress-page.js +83 -0
  90. package/js/pages/common-pages/structured-page.js +46 -0
  91. package/js/pages/page.js +1018 -0
  92. package/js/pages/pages-context.js +154 -0
  93. package/js/pages/pages.js +252 -0
  94. package/js/pwa.js +337 -0
  95. package/js/sections/section.js +612 -0
  96. package/js/sections/sections.js +300 -0
  97. package/js/tables/common-cells/common-cells.js +7 -0
  98. package/js/tables/common-cells/icon-label-table-cell.js +68 -0
  99. package/js/tables/common-cells/push-button-table-cell.js +133 -0
  100. package/js/tables/common-cells/simple-table-cell.js +37 -0
  101. package/js/tables/common-tables/common-tables.js +5 -0
  102. package/js/tables/common-tables/page-table.js +55 -0
  103. package/js/tables/table-cell.js +198 -0
  104. package/js/tables/table-row.js +126 -0
  105. package/js/tables/table.js +492 -0
  106. package/js/tables/tables.js +36 -0
  107. package/js/theme.js +304 -0
  108. package/js/utils/ajax.js +126 -0
  109. package/js/utils/array.js +194 -0
  110. package/js/utils/colors.js +445 -0
  111. package/js/utils/cookies.js +65 -0
  112. package/js/utils/crypto.js +439 -0
  113. package/js/utils/css.js +234 -0
  114. package/js/utils/date.js +300 -0
  115. package/js/utils/files.js +27 -0
  116. package/js/utils/gestures.js +165 -0
  117. package/js/utils/html.js +76 -0
  118. package/js/utils/misc.js +81 -0
  119. package/js/utils/object.js +324 -0
  120. package/js/utils/promise.js +49 -0
  121. package/js/utils/string.js +192 -0
  122. package/js/utils/url.js +187 -0
  123. package/js/utils/utils.js +3 -0
  124. package/js/utils/visibility-manager.js +211 -0
  125. package/js/views/common-views/common-views.js +7 -0
  126. package/js/views/common-views/icon-label-view.js +210 -0
  127. package/js/views/common-views/progress-view.js +89 -0
  128. package/js/views/common-views/structured-view.js +368 -0
  129. package/js/views/view.js +467 -0
  130. package/js/views/views.js +3 -0
  131. package/js/widgets/base-widget.js +23 -0
  132. package/js/widgets/common-widgets/check-button.js +109 -0
  133. package/js/widgets/common-widgets/choice-buttons.js +322 -0
  134. package/js/widgets/common-widgets/color-combo.js +104 -0
  135. package/js/widgets/common-widgets/combo.js +645 -0
  136. package/js/widgets/common-widgets/common-widgets.js +17 -0
  137. package/js/widgets/common-widgets/email-input.js +7 -0
  138. package/js/widgets/common-widgets/file-picker.js +133 -0
  139. package/js/widgets/common-widgets/labels.js +132 -0
  140. package/js/widgets/common-widgets/numeric-input.js +49 -0
  141. package/js/widgets/common-widgets/password-input.js +91 -0
  142. package/js/widgets/common-widgets/phone-input.js +7 -0
  143. package/js/widgets/common-widgets/progress-disk.js +174 -0
  144. package/js/widgets/common-widgets/push-button.js +155 -0
  145. package/js/widgets/common-widgets/slider.js +455 -0
  146. package/js/widgets/common-widgets/text-area.js +52 -0
  147. package/js/widgets/common-widgets/text-input.js +174 -0
  148. package/js/widgets/common-widgets/up-down.js +351 -0
  149. package/js/widgets/widgets.js +57 -0
  150. package/js/window.js +557 -0
  151. package/jsdoc.conf.json +20 -0
  152. package/less/base.less +123 -0
  153. package/less/forms/common-fields.less +101 -0
  154. package/less/forms/common-forms.less +5 -0
  155. package/less/forms/form-button.less +21 -0
  156. package/less/forms/form-field.less +266 -0
  157. package/less/forms/form.less +131 -0
  158. package/less/global-glass.less +64 -0
  159. package/less/icon-label-view.less +82 -0
  160. package/less/icons.less +144 -0
  161. package/less/lists.less +105 -0
  162. package/less/main-ui.less +328 -0
  163. package/less/messages.less +189 -0
  164. package/less/no-effects.less +24 -0
  165. package/less/pages/breadcrumbs.less +98 -0
  166. package/less/pages/common-pages.less +36 -0
  167. package/less/pages/page.less +70 -0
  168. package/less/progress-view.less +51 -0
  169. package/less/stock-icons.less +43 -0
  170. package/less/structured-view.less +245 -0
  171. package/less/tables.less +84 -0
  172. package/less/theme-dark.less +133 -0
  173. package/less/theme-light.less +132 -0
  174. package/less/theme.less +419 -0
  175. package/less/visibility-manager.less +11 -0
  176. package/less/widgets/check-button.less +96 -0
  177. package/less/widgets/choice-buttons.less +160 -0
  178. package/less/widgets/color-combo.less +33 -0
  179. package/less/widgets/combo.less +230 -0
  180. package/less/widgets/common-buttons.less +120 -0
  181. package/less/widgets/common.less +24 -0
  182. package/less/widgets/input.less +258 -0
  183. package/less/widgets/labels.less +81 -0
  184. package/less/widgets/progress-disk.less +70 -0
  185. package/less/widgets/slider.less +199 -0
  186. package/less/widgets/updown.less +115 -0
  187. package/less/widgets/various.less +36 -0
  188. package/package.json +47 -0
  189. package/pyproject.toml +45 -0
  190. package/qui/__init__.py +110 -0
  191. package/qui/constants.py +1 -0
  192. package/qui/exceptions.py +2 -0
  193. package/qui/j2template.py +71 -0
  194. package/qui/settings.py +60 -0
  195. package/qui/templates/manifest.json +25 -0
  196. package/qui/templates/qui.html +126 -0
  197. package/qui/templates/service-worker.js +188 -0
  198. package/qui/web/__init__.py +0 -0
  199. package/qui/web/tornado.py +220 -0
  200. package/scripts/postinstall.sh +10 -0
  201. package/webpack/webpack-adjust-css-urls-loader.js +36 -0
  202. package/webpack/webpack-common.js +384 -0
@@ -0,0 +1,230 @@
1
+
2
+ @import (reference) "../base";
3
+ @import (reference) "../theme";
4
+ @import (reference) "common";
5
+
6
+
7
+ div.qui-combo-container {
8
+ position: relative;
9
+ display: inline-block;
10
+ width: 100%;
11
+ box-sizing: border-box;
12
+ vertical-align: middle;
13
+ border-radius: 0.2em;
14
+ .qui-focusable-widget();
15
+
16
+ & > div.qui-combo-button {
17
+ border: 0.0625em solid @interactive-color;
18
+ border-radius: 0.2em;
19
+ position: relative;
20
+ min-width: 2em;
21
+ background: @background-color;
22
+ color: @foreground-color;
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+
26
+ & > div.qui-combo-current-label {
27
+ padding-right: 1.8em;
28
+ min-height: 1.6875em;
29
+ }
30
+
31
+ & > span.qui-combo-arrow-separator {
32
+ position: absolute;
33
+ display: inline-block;
34
+ top: 0;
35
+ right: 1.8em;
36
+ width: 0;
37
+ height: 100%;
38
+ border-width: 0 0.0625em 0 0;
39
+ border-style: solid;
40
+ border-color: inherit;
41
+ transition: border-color @transition-duration linear;
42
+ }
43
+
44
+ & > span.qui-combo-arrow {
45
+ position: absolute;
46
+ top: 40%;
47
+ right: 0;
48
+ margin: 0 0.5em;
49
+ border-width: 0.5em 0.4em;
50
+ border-style: solid;
51
+ border-color: transparent;
52
+ border-top-color: inherit;
53
+ transition: border-color @transition-duration linear;
54
+ }
55
+
56
+ }
57
+
58
+ & > input.qui-combo-filter {
59
+ box-shadow: none;
60
+ display: none;
61
+ }
62
+
63
+ & > div.qui-combo-item-container {
64
+ position: relative;
65
+ color: @foreground-color;
66
+ border: 0.0625em solid @interactive-color;
67
+ background-color: @background-color;
68
+ margin-top: 0.0625em;
69
+ margin-bottom: -0.1875em; /* Effectively reduces height to 0 when closed */
70
+ min-width: 100%;
71
+ min-height: 0;
72
+ max-height: 0;
73
+ box-sizing: border-box;
74
+ opacity: 0;
75
+ text-align: left;
76
+ overflow: auto;
77
+ border-radius: 0 0 0.2em 0.2em;
78
+ transition: max-height @transition-duration ease,
79
+ opacity @transition-duration ease;
80
+
81
+ & > div.qui-combo-item {
82
+ white-space: nowrap;
83
+ cursor: default;
84
+ background: @background-color;
85
+ overflow: hidden;
86
+ box-sizing: border-box;
87
+ transition: background @transition-duration ease,
88
+ color @transition-duration ease,
89
+ height @transition-duration ease,
90
+ max-height @transition-duration ease;
91
+
92
+ /* There seems to be a performance issue on Chrome for Android when dealing with many items and alternating
93
+ * background colors. We use border separators in those cases. */
94
+
95
+ body.small-screen & {
96
+ border-bottom: 0.0625em solid @border-color;
97
+ }
98
+
99
+ body:NOT(.small-screen) & {
100
+
101
+ &.odd {
102
+ background: @odd-color;
103
+ }
104
+
105
+ &.odd.selected {
106
+ background: @interactive-color;
107
+ color: @foreground-interactive-color;
108
+ }
109
+
110
+ }
111
+
112
+ &.selected {
113
+ background: @interactive-color;
114
+ color: @foreground-interactive-color;
115
+ }
116
+
117
+ &.separator {
118
+ border-top: 0.0625em solid @border-color;
119
+ }
120
+
121
+ &.hidden {
122
+ max-height: 0 !important;
123
+ }
124
+
125
+ &.hidden:NOT(.separator) {
126
+ border: 0;
127
+ }
128
+
129
+ }
130
+
131
+ }
132
+
133
+ &.open {
134
+
135
+ & > div.qui-combo-button {
136
+ border-bottom-left-radius: 0;
137
+ border-bottom-right-radius: 0;
138
+ }
139
+
140
+ & > div.qui-combo-item-container {
141
+ opacity: 1;
142
+ min-height: 1.75em;
143
+ max-height: 12em;
144
+ margin-bottom: 0;
145
+ }
146
+
147
+ &.filter-enabled > input.qui-combo-filter {
148
+ display: block;
149
+ border-radius: 0;
150
+ margin-top: 0.0625em;
151
+ width: 100%;
152
+ }
153
+
154
+ }
155
+
156
+ &:FOCUS,
157
+ &.open {
158
+ .qui-focused-widget();
159
+ }
160
+
161
+ &.has-warning {
162
+
163
+ & > div.qui-combo-button,
164
+ & > input.qui-combo-filter,
165
+ & > div.qui-combo-item-container {
166
+ border-color: @warning-color;
167
+ }
168
+
169
+ &:FOCUS,
170
+ &.open {
171
+ .qui-focused-widget-warning();
172
+ }
173
+
174
+ }
175
+
176
+ &.has-error {
177
+
178
+ & > div.qui-combo-button,
179
+ & > input.qui-combo-filter,
180
+ & > div.qui-combo-item-container {
181
+ border-color: @error-color;
182
+ }
183
+
184
+ &:FOCUS,
185
+ &.open {
186
+ .qui-focused-widget-error();
187
+ }
188
+
189
+ }
190
+
191
+ &.readonly {
192
+
193
+ & > div.qui-combo-button {
194
+ border-color: @readonly-color;
195
+ cursor: default;
196
+
197
+ & > span.qui-combo-arrow {
198
+ border-top-color: @foreground-color;
199
+ }
200
+
201
+ }
202
+
203
+ &:FOCUS {
204
+ .qui-focused-widget-readonly();
205
+ }
206
+
207
+ }
208
+
209
+ &.disabled > div.qui-combo-button {
210
+ border-color: @disabled-color;
211
+ color: @disabled-color;
212
+ cursor: default;
213
+
214
+ & > span.qui-combo-arrow {
215
+ border-top-color: @disabled-color;
216
+ }
217
+ }
218
+
219
+ }
220
+
221
+
222
+ /* Simple label */
223
+
224
+ div.qui-combo-item-simple-label {
225
+ overflow: hidden;
226
+ text-overflow: ellipsis;
227
+ min-height: 1.6875em;
228
+ line-height: 1.6875em;
229
+ padding: 0 0.25em;
230
+ }
@@ -0,0 +1,120 @@
1
+
2
+ @import (reference) "../base";
3
+ @import (reference) "../theme";
4
+ @import (reference) "common";
5
+
6
+
7
+ .qui-base-button {
8
+ transition: background @transition-duration ease,
9
+ color @transition-duration ease,
10
+ opacity @transition-duration ease,
11
+ border @transition-duration ease;
12
+ box-sizing: border-box;
13
+ cursor: pointer;
14
+ .noselect;
15
+ }
16
+
17
+ .qui-base-button.disabled {
18
+ cursor: default;
19
+ }
20
+
21
+ .qui-colored-button {
22
+ color: @foreground-interactive-color;
23
+ background: @interactive-color;
24
+ }
25
+
26
+ .qui-colored-button.active {
27
+ background: @interactive-active-color;
28
+ }
29
+
30
+ .qui-foreground-button {
31
+ color: @background-color;
32
+ background: @foreground-color;
33
+ }
34
+
35
+ .qui-foreground-button.active {
36
+ background: @foreground-active-color;
37
+ }
38
+
39
+ .qui-interactive-button {
40
+ color: @foreground-interactive-color;
41
+ background: @interactive-color;
42
+ }
43
+
44
+ .qui-interactive-button.active {
45
+ background: @interactive-active-color;
46
+ }
47
+
48
+ .qui-highlight-button {
49
+ color: @foreground-interactive-color;
50
+ background: @highlight-color;
51
+ }
52
+
53
+ .qui-highlight-button.active {
54
+ background: @highlight-active-color;
55
+ }
56
+
57
+ .qui-danger-button {
58
+ color: @foreground-interactive-color;
59
+ background: @danger-color;
60
+ }
61
+
62
+ .qui-danger-button.active {
63
+ background: @danger-active-color;
64
+ }
65
+
66
+ .qui-push-button {
67
+ display: inline-block;
68
+ line-height: 1.9em;
69
+ border-radius: 0.2em;
70
+ min-width: 6em;
71
+ text-align: center;
72
+ padding: 0 0.5em;
73
+ transition+: background @transition-duration ease,
74
+ color @transition-duration ease,
75
+ opacity @transition-duration ease,
76
+ border @transition-duration ease;
77
+ .qui-focusable-widget();
78
+
79
+ &:FOCUS {
80
+ .qui-focused-widget();
81
+ }
82
+
83
+ &.qui-foreground-button:FOCUS {
84
+ .qui-focused-widget(@foreground-color);
85
+ }
86
+
87
+ &.qui-highlight-button:FOCUS {
88
+ .qui-focused-widget(@highlight-color);
89
+ }
90
+
91
+ &.qui-danger-button:FOCUS {
92
+ .qui-focused-widget(@danger-color);
93
+ }
94
+
95
+ &.qui-colored-button:FOCUS {
96
+ box-shadow+: 0 0 0 0.2em var(--focus-shadow-color);
97
+ }
98
+
99
+ & > div.qui-push-button-icon {
100
+ vertical-align: middle;
101
+ width: 1.5em;
102
+ height: 1.5em;
103
+ margin-right: 0.25em;
104
+ }
105
+
106
+ & > span.qui-push-button-caption {
107
+ vertical-align: middle;
108
+ }
109
+
110
+ }
111
+
112
+ .qui-colored-button.disabled,
113
+ .qui-foreground-button.disabled,
114
+ .qui-interactive-button.disabled,
115
+ .qui-highlight-button.disabled,
116
+ .qui-danger-button.disabled,
117
+ .qui-push-button.disabled {
118
+ background: @disabled-color;
119
+ color: @disabled-alt-color;
120
+ }
@@ -0,0 +1,24 @@
1
+
2
+ @import (reference) "../base";
3
+ @import (reference) "../theme";
4
+
5
+
6
+ .qui-focusable-widget() {
7
+ transition+: box-shadow (@transition-duration / 2) linear;
8
+ }
9
+
10
+ .qui-focused-widget(@color: @interactive-color, @percent: 30%) {
11
+ box-shadow+: 0 0 0 0.2em fade(@color, @percent);
12
+ }
13
+
14
+ .qui-focused-widget-readonly() {
15
+ .qui-focused-widget(@disabled-color, 50%);
16
+ }
17
+
18
+ .qui-focused-widget-warning() {
19
+ .qui-focused-widget(@warning-color);
20
+ }
21
+
22
+ .qui-focused-widget-error() {
23
+ .qui-focused-widget(@error-color);
24
+ }
@@ -0,0 +1,258 @@
1
+
2
+ @import (reference) "../base";
3
+ @import (reference) "../theme";
4
+ @import (reference) "common";
5
+
6
+
7
+ input[type=text],
8
+ input[type=password],
9
+ input[type=number],
10
+ input[type=tel],
11
+ input[type=email],
12
+ textarea {
13
+ border: 0.0625em solid @interactive-color;
14
+ border-radius: 0.2em;
15
+ padding: 0.25em;
16
+ background: @background-color;
17
+ color: @foreground-color;
18
+ resize: none;
19
+ transition: color @transition-duration linear,
20
+ border-color @transition-duration linear;
21
+ font-size: inherit;
22
+ font-family: inherit;
23
+ box-sizing: border-box;
24
+ .qui-focusable-widget();
25
+ }
26
+
27
+ input[type=text],
28
+ input[type=password],
29
+ input[type=number],
30
+ input[type=tel],
31
+ input[type=email] {
32
+ height: 1.75em;
33
+ }
34
+
35
+ input[type=text].has-warning,
36
+ input[type=password].has-warning,
37
+ input[type=number].has-warning,
38
+ input[type=tel].has-warning,
39
+ input[type=email].has-warning,
40
+ textarea.has-warning {
41
+ border-color: @warning-color;
42
+ }
43
+
44
+ input[type=text].has-error,
45
+ input[type=password].has-error,
46
+ input[type=number].has-error,
47
+ input[type=tel].has-error,
48
+ input[type=email].has-error,
49
+ textarea.has-error {
50
+ border-color: @error-color;
51
+ }
52
+
53
+ input[type=text]:FOCUS,
54
+ input[type=password]:FOCUS,
55
+ input[type=number]:FOCUS,
56
+ input[type=tel]:FOCUS,
57
+ input[type=email]:FOCUS,
58
+ textarea:FOCUS {
59
+ .qui-focused-widget();
60
+ }
61
+
62
+ input[type=text].has-warning:FOCUS,
63
+ input[type=password].has-warning:FOCUS,
64
+ input[type=number].has-warning:FOCUS,
65
+ input[type=tel].has-warning:FOCUS,
66
+ input[type=email].has-warning:FOCUS,
67
+ textarea.has-warning:FOCUS {
68
+ .qui-focused-widget-warning();
69
+ }
70
+
71
+ input[type=text].has-error:FOCUS,
72
+ input[type=password].has-error:FOCUS,
73
+ input[type=number].has-error:FOCUS,
74
+ input[type=tel].has-error:FOCUS,
75
+ input[type=email].has-error:FOCUS,
76
+ textarea.has-error:FOCUS {
77
+ .qui-focused-widget-error();
78
+ }
79
+
80
+ input[type=text][readonly],
81
+ input[type=password][readonly],
82
+ input[type=number][readonly],
83
+ input[type=tel][readonly],
84
+ input[type=email][readonly],
85
+ textarea[readonly] {
86
+ border-color: @readonly-color;
87
+ }
88
+
89
+ input[type=text][readonly]:FOCUS,
90
+ input[type=password][readonly]:FOCUS,
91
+ input[type=number][readonly]:FOCUS,
92
+ input[type=tel][readonly]:FOCUS,
93
+ input[type=email][readonly]:FOCUS,
94
+ textarea[readonly]:FOCUS {
95
+ .qui-focused-widget-readonly();
96
+ }
97
+
98
+ input[type=text][disabled],
99
+ input[type=password][disabled],
100
+ input[type=number][disabled],
101
+ input[type=tel][disabled],
102
+ input[type=email][disabled],
103
+ textarea[disabled] {
104
+ .noselect;
105
+ border-color: @disabled-color;
106
+ color: @disabled-color;
107
+ }
108
+
109
+
110
+ input[type=text]::selection,
111
+ input[type=password]::selection,
112
+ input[type=number]::selection,
113
+ input[type=tel]::selection,
114
+ input[type=email]::selection,
115
+ textarea::selection {
116
+ background: fade(@selection-color, 99%);
117
+ color: @background-color;
118
+ }
119
+
120
+
121
+ input[type=text]::placeholder,
122
+ input[type=password]::placeholder,
123
+ input[type=number]::placeholder,
124
+ input[type=tel]::placeholder,
125
+ input[type=email]::placeholder,
126
+ textarea::placeholder {
127
+ color: @disabled-color;
128
+ }
129
+
130
+
131
+ div.qui-text-input {
132
+ white-space: nowrap;
133
+ }
134
+
135
+
136
+ /* Password input */
137
+
138
+ div.qui-text-input.clear-enabled {
139
+
140
+ & > input[type=password] {
141
+ padding-right: 1.75em;
142
+ }
143
+
144
+ & > div.qui-password-input-clear-button {
145
+ display: inline-block;
146
+ width: 1.75em;
147
+ height: 1.75em;
148
+ padding: 0.375em;
149
+ border-left: 0.0625em solid @interactive-color;
150
+ border-radius: 0 0.2em 0.2em 0;
151
+ vertical-align: top;
152
+ position: relative;
153
+ top: 0;
154
+ right: 1.75em;
155
+ cursor: pointer;
156
+
157
+ &.active {
158
+ background: @interactive-color;
159
+ }
160
+
161
+ & > div.qui-password-input-clear-icon {
162
+ width: 1em;
163
+ height: 1em;
164
+ position: relative;
165
+ left: -0.0625em;
166
+ }
167
+
168
+ }
169
+
170
+ &.has-warning {
171
+
172
+ & > div.qui-password-input-clear-button {
173
+ border-left-color: @warning-color;
174
+
175
+ &.active {
176
+ background: @warning-color;
177
+ }
178
+
179
+ }
180
+
181
+ }
182
+
183
+ &.has-error {
184
+
185
+ & > div.qui-password-input-clear-button {
186
+ border-left-color: @error-color;
187
+
188
+ &.active {
189
+ background: @error-color;
190
+ }
191
+
192
+ }
193
+
194
+ }
195
+
196
+ }
197
+
198
+
199
+ /* File picker */
200
+
201
+ .qui-file-picker > input[type=file] {
202
+ display: none;
203
+ }
204
+
205
+ div.qui-file-picker-button {
206
+ max-width: 100%;
207
+ height: 2em;
208
+ overflow: hidden;
209
+ text-overflow: ellipsis;
210
+ }
211
+
212
+
213
+ /* Chrome oddities */
214
+
215
+ input:-webkit-autofill {
216
+ /* box-shadow here is a Chrome hack to customize autofill background */
217
+ box-shadow+: 0 0 0 100em @background-color inset !important;
218
+ -webkit-text-fill-color: @foreground-color;
219
+ .qui-focusable-widget();
220
+ }
221
+
222
+ input:-webkit-autofill:FOCUS {
223
+ /* box-shadow here is a Chrome hack to customize autofill background */
224
+ box-shadow+: 0 0 0 100em @background-color inset !important;
225
+ -webkit-text-fill-color: @foreground-color;
226
+ .qui-focused-widget();
227
+ }
228
+
229
+ input.has-warning:-webkit-autofill:FOCUS {
230
+ box-shadow+: 0 0 0 100em @background-color inset !important;
231
+ -webkit-text-fill-color: @foreground-color;
232
+ .qui-focused-widget-warning();
233
+ }
234
+
235
+ input.has-error:-webkit-autofill:FOCUS {
236
+ box-shadow+: 0 0 0 100em @background-color inset !important;
237
+ -webkit-text-fill-color: @foreground-color;
238
+ .qui-focused-widget-error();
239
+ }
240
+
241
+ input:-webkit-autofill::selection {
242
+ background: fade(@selection-color, 99%) !important;
243
+ color: @background-color !important;
244
+ -webkit-text-fill-color: @background-color !important;
245
+ }
246
+
247
+ input::-webkit-inner-spin-button,
248
+ input::-webkit-outer-spin-button {
249
+ -webkit-appearance: none;
250
+ margin: 0;
251
+ }
252
+
253
+
254
+ /* Firefox oddities */
255
+
256
+ input[type=number] {
257
+ -moz-appearance: textfield;
258
+ }
@@ -0,0 +1,81 @@
1
+
2
+ @import (reference) "../base";
3
+ @import (reference) "../theme";
4
+
5
+
6
+ div.qui-labels-container {
7
+ display: inline-block;
8
+ white-space: normal;
9
+
10
+ & > span.qui-label {
11
+ display: inline-block;
12
+ position: relative;
13
+ vertical-align: middle;
14
+ white-space: nowrap;
15
+ border-radius: 0.2em;
16
+ padding: 0.1em 0.4em;
17
+ margin: 0.125em 0.25em 0.125em 0;
18
+ font-size: 0.9em;
19
+ }
20
+
21
+ &.clickable {
22
+
23
+ & > span.qui-label {
24
+ background: @interactive-color !important;
25
+ border-color: @interactive-color !important;
26
+ color: @foreground-interactive-color !important;
27
+ cursor: pointer;
28
+ }
29
+
30
+ & > span.qui-label.active {
31
+ background: @interactive-active-color !important;
32
+ border-color: @interactive-active-color !important;
33
+ }
34
+
35
+ }
36
+
37
+ &.chevrons {
38
+
39
+ & > span.qui-label:NOT(:LAST-CHILD) {
40
+ border-top-right-radius: 0;
41
+ border-bottom-right-radius: 0;
42
+ margin-right: 0.7em;
43
+ }
44
+
45
+ & > span.qui-label:NOT(:FIRST-CHILD) {
46
+ border-top-left-radius: 0;
47
+ border-bottom-left-radius: 0;
48
+ }
49
+
50
+ & > span.qui-label:NOT(:FIRST-CHILD)::BEFORE {
51
+ content: '';
52
+ display: block;
53
+ position: absolute;
54
+ top: 0;
55
+ left: -0.5em;
56
+ border-style: solid;
57
+ border-width: 0.75em 0 0.75em 0.5em;
58
+ border-color: inherit;
59
+ border-left-color: transparent;
60
+ }
61
+
62
+ & > span.qui-label:NOT(:LAST-CHILD)::AFTER {
63
+ content: '';
64
+ display: block;
65
+ position: absolute;
66
+ top: 0;
67
+ right: -1em;
68
+ border-style: solid;
69
+ border-width: 0.75em 0.5em;
70
+ border-color: transparent;
71
+ border-left-color: inherit;
72
+ }
73
+
74
+ }
75
+
76
+ &.disabled > span.qui-label {
77
+ background: @disabled-color !important;
78
+ border-color: @disabled-color !important;
79
+ }
80
+
81
+ }