react-ui-basics 0.0.252 → 0.0.253

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.
@@ -1,16 +1,49 @@
1
1
  import React, { ReactNode } from 'react';
2
2
  export interface NotReadyIndicatorProps {
3
3
  onChange?: (ready: boolean) => void;
4
- render?: (ready: boolean) => JSX.Element | ReactNode;
4
+ render?: (ready: boolean, notReadyElements: string[]) => JSX.Element | ReactNode;
5
5
  children?: ReactNode;
6
6
  }
7
- export declare const createReadyListener: () => {
8
- new (props: any): {
7
+ export interface NotReadyProps {
8
+ name?: string;
9
+ }
10
+ interface NotReadyIndicatorState {
11
+ r: boolean;
12
+ }
13
+ export declare const createReadyListener: () => ({
14
+ new (properties: any): {
15
+ context: any;
16
+ setState<K extends "r">(state: NotReadyIndicatorState | ((prevState: Readonly<NotReadyIndicatorState>, props: Readonly<NotReadyIndicatorProps>) => NotReadyIndicatorState | Pick<NotReadyIndicatorState, K>) | Pick<NotReadyIndicatorState, K>, callback?: () => void): void;
17
+ forceUpdate(callback?: () => void): void;
18
+ render(): React.ReactNode;
19
+ readonly props: Readonly<NotReadyIndicatorProps> & Readonly<{
20
+ children?: React.ReactNode;
21
+ }>;
22
+ state: Readonly<NotReadyIndicatorState>;
23
+ refs: {
24
+ [key: string]: React.ReactInstance;
25
+ };
26
+ componentDidMount?(): void;
27
+ shouldComponentUpdate?(nextProps: Readonly<NotReadyIndicatorProps>, nextState: Readonly<NotReadyIndicatorState>, nextContext: any): boolean;
28
+ componentWillUnmount?(): void;
29
+ componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
30
+ getSnapshotBeforeUpdate?(prevProps: Readonly<NotReadyIndicatorProps>, prevState: Readonly<NotReadyIndicatorState>): any;
31
+ componentDidUpdate?(prevProps: Readonly<NotReadyIndicatorProps>, prevState: Readonly<NotReadyIndicatorState>, snapshot?: any): void;
32
+ componentWillMount?(): void;
33
+ UNSAFE_componentWillMount?(): void;
34
+ componentWillReceiveProps?(nextProps: Readonly<NotReadyIndicatorProps>, nextContext: any): void;
35
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<NotReadyIndicatorProps>, nextContext: any): void;
36
+ componentWillUpdate?(nextProps: Readonly<NotReadyIndicatorProps>, nextState: Readonly<NotReadyIndicatorState>, nextContext: any): void;
37
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<NotReadyIndicatorProps>, nextState: Readonly<NotReadyIndicatorState>, nextContext: any): void;
38
+ };
39
+ contextType?: React.Context<any>;
40
+ } | {
41
+ new (props: NotReadyProps): {
9
42
  context: any;
10
- setState<K extends never>(state: {} | ((prevState: Readonly<{}>, props: Readonly<{}>) => {} | Pick<{}, K>) | Pick<{}, K>, callback?: () => void): void;
43
+ setState<K_1 extends never>(state: {} | ((prevState: Readonly<{}>, props: Readonly<NotReadyProps>) => {} | Pick<{}, K_1>) | Pick<{}, K_1>, callback?: () => void): void;
11
44
  forceUpdate(callback?: () => void): void;
12
45
  render(): React.ReactNode;
13
- readonly props: Readonly<{}> & Readonly<{
46
+ readonly props: Readonly<NotReadyProps> & Readonly<{
14
47
  children?: React.ReactNode;
15
48
  }>;
16
49
  state: Readonly<{}>;
@@ -18,17 +51,18 @@ export declare const createReadyListener: () => {
18
51
  [key: string]: React.ReactInstance;
19
52
  };
20
53
  componentDidMount?(): void;
21
- shouldComponentUpdate?(nextProps: Readonly<{}>, nextState: Readonly<{}>, nextContext: any): boolean;
54
+ shouldComponentUpdate?(nextProps: Readonly<NotReadyProps>, nextState: Readonly<{}>, nextContext: any): boolean;
22
55
  componentWillUnmount?(): void;
23
56
  componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
24
- getSnapshotBeforeUpdate?(prevProps: Readonly<{}>, prevState: Readonly<{}>): any;
25
- componentDidUpdate?(prevProps: Readonly<{}>, prevState: Readonly<{}>, snapshot?: any): void;
57
+ getSnapshotBeforeUpdate?(prevProps: Readonly<NotReadyProps>, prevState: Readonly<{}>): any;
58
+ componentDidUpdate?(prevProps: Readonly<NotReadyProps>, prevState: Readonly<{}>, snapshot?: any): void;
26
59
  componentWillMount?(): void;
27
60
  UNSAFE_componentWillMount?(): void;
28
- componentWillReceiveProps?(nextProps: Readonly<{}>, nextContext: any): void;
29
- UNSAFE_componentWillReceiveProps?(nextProps: Readonly<{}>, nextContext: any): void;
30
- componentWillUpdate?(nextProps: Readonly<{}>, nextState: Readonly<{}>, nextContext: any): void;
31
- UNSAFE_componentWillUpdate?(nextProps: Readonly<{}>, nextState: Readonly<{}>, nextContext: any): void;
61
+ componentWillReceiveProps?(nextProps: Readonly<NotReadyProps>, nextContext: any): void;
62
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<NotReadyProps>, nextContext: any): void;
63
+ componentWillUpdate?(nextProps: Readonly<NotReadyProps>, nextState: Readonly<{}>, nextContext: any): void;
64
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<NotReadyProps>, nextState: Readonly<{}>, nextContext: any): void;
32
65
  };
33
66
  contextType?: React.Context<any>;
34
- }[];
67
+ })[];
68
+ export {};
package/ReadyListener.js CHANGED
@@ -2,7 +2,7 @@ import ReactConstants from "./ReactConstants"; import {clientHeight as __clientH
2
2
  import { orNoop } from './Tools.js';
3
3
 
4
4
  const createReadyListener = () => {
5
- let indicator, count = 0;
5
+ let indicator, count = 0, notReadyElements = [];
6
6
  class NotReadyIndicator extends PureComponent {
7
7
  constructor(properties) {
8
8
  super(properties);
@@ -12,12 +12,13 @@ const createReadyListener = () => {
12
12
  that[ReactConstants[3]] = () => {
13
13
  const _props = props(that), renderer = _props[ReactConstants[3]], ready = state(that).r;
14
14
  if (renderer)
15
- return renderer(ready);
15
+ return renderer(ready, notReadyElements);
16
16
  else
17
17
  return (!ready && _props[ReactConstants[4]]) || null;
18
18
  };
19
19
  that[ReactConstants[0]] = that[ReactConstants[2]] = () => {
20
- orNoop(props(that)[ReactConstants[7]])(state(that).r);
20
+ // console.log('NotReadyIndicator.update.mounted', state(that).r, count)
21
+ orNoop(props(that)[ReactConstants[7]])(state(that).r && count === 0);
21
22
  };
22
23
  }
23
24
  }
@@ -25,11 +26,15 @@ const createReadyListener = () => {
25
26
  constructor(props) {
26
27
  super(props);
27
28
  const that = this;
29
+ count++;
30
+ // console.log('NotReady created')
28
31
  that[ReactConstants[0]] = () => {
29
- count++;
32
+ notReadyElements.push(__props(that).name || 'unknown');
30
33
  setState(indicator, { r: false });
31
34
  };
32
35
  that[ReactConstants[1]] = () => {
36
+ let index = notReadyElements.indexOf(__props(that).name || 'unknown');
37
+ notReadyElements.splice(index, 1);
33
38
  setState(indicator, { r: --count === 0 });
34
39
  };
35
40
  that[ReactConstants[3]] = () => null;
@@ -1 +1 @@
1
- {"version":3,"file":"ReadyListener.js","sources":["./src/ReadyListener.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;AAeO,MAAM,mBAAmB,GAAG,MAAK;AACpC,IAAA,IAAI,SAAS,EACT,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,iBAAkB,SAAQ,aAA6D,CAAA;AACzF,QAAA,WAAA,CAAY,UAAU,EAAA;YAClB,KAAK,CAAC,UAAU,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAC,CAAC,EAAE,IAAI,EAAC,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,MAAK;gBAChB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EACtB,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EACzB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE1B,gBAAA,IAAI,QAAQ;AACR,oBAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;;oBAEvB,OAAO,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AACpD,aAAC,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAK;AACtD,gBAAA,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,aAAC,CAAA;SACJ;AACJ,KAAA;IAED,MAAM,QAAS,SAAQ,aAAa,CAAA;AAChC,QAAA,WAAA,CAAY,KAAK,EAAA;YACb,KAAK,CAAC,KAAK,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,MAAK;AAC3B,gBAAA,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,SAAS,EAAE,EAAC,CAAC,EAAE,KAAK,EAAC,CAAC,CAAC;AACpC,aAAC,CAAC;AACF,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,MAAK;AAC9B,gBAAA,QAAQ,CAAC,SAAS,EAAE,EAAC,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC,EAAC,CAAC,CAAC;AAC5C,aAAC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC;SAC7B;AACJ,KAAA;AAED,IAAA,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;AACxC;;;;"}
1
+ {"version":3,"file":"ReadyListener.js","sources":["./src/ReadyListener.tsx"],"sourcesContent":[null],"names":[],"mappings":";;;AAmBO,MAAM,mBAAmB,GAAG,MAAK;IACpC,IAAI,SAAS,EACT,KAAK,GAAG,CAAC,EACT,gBAAgB,GAAa,EAAE,CAAC;IAEpC,MAAM,iBAAkB,SAAQ,aAA6D,CAAA;AACzF,QAAA,WAAA,CAAY,UAAU,EAAA;YAClB,KAAK,CAAC,UAAU,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,EAAC,CAAC,EAAE,IAAI,EAAC,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,MAAK;gBAChB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EACtB,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,EACzB,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAE1B,gBAAA,IAAI,QAAQ;AACR,oBAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;;oBAEzC,OAAO,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;AACpD,aAAC,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAK;;gBAEtD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC;AAC/D,aAAC,CAAA;SACJ;AACJ,KAAA;IAED,MAAM,QAAS,SAAQ,aAA4B,CAAA;AAC/C,QAAA,WAAA,CAAY,KAAoB,EAAA;YAC5B,KAAK,CAAC,KAAK,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,YAAA,KAAK,EAAE,CAAC;;AAER,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,MAAK;gBAC3B,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,CAAA;gBACnD,QAAQ,CAAC,SAAS,EAAE,EAAC,CAAC,EAAE,KAAK,EAAC,CAAC,CAAC;AACpC,aAAC,CAAC;AACF,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,MAAK;AAC9B,gBAAA,IAAI,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,CAAA;AAClE,gBAAA,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;AACjC,gBAAA,QAAQ,CAAC,SAAS,EAAE,EAAC,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC,EAAC,CAAC,CAAC;AAC5C,aAAC,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC;SAC7B;AACJ,KAAA;AAED,IAAA,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAA;AACxC;;;;"}
package/bundle.css CHANGED
@@ -712,15 +712,6 @@
712
712
  border: 0;
713
713
  }
714
714
 
715
- .animated {
716
- transition: opacity 250ms ease;
717
- opacity: 0;
718
- }
719
-
720
- .animated.mounting, .animated.mounted {
721
- opacity: 1;
722
- }
723
-
724
715
  .CircleProgress {
725
716
  width: 48px;
726
717
  height: 48px;
@@ -734,100 +725,6 @@
734
725
  transition: stroke-dashoffset 0.2s ease;
735
726
  }
736
727
 
737
- .DropFileInput {
738
- flex-grow: 1;
739
- }
740
-
741
- .DropFileInput .Dropzone {
742
- border: 1px dashed #808080;
743
- padding: 12px;
744
- display: flex;
745
- flex-flow: row nowrap;
746
- justify-content: center;
747
- align-items: center;
748
- color: gray;
749
- cursor: pointer;
750
- border-radius: 3px;
751
- font-weight: normal;
752
- line-height: 22px;
753
- font-size: 14px;
754
- color: #7E7E7E;
755
- max-width: 100%;
756
- word-break: break-all;
757
- word-break: break-word;
758
- }
759
-
760
- .DropFileInput .Dropzone .icon.withText {
761
- margin-right: 10px;
762
- }
763
-
764
- .Checkbox {
765
- position: relative;
766
- white-space: pre;
767
- }
768
-
769
- .Checkbox *, .Checkbox *:before, .Checkbox *:after {
770
- box-sizing: border-box;
771
- }
772
-
773
- .Checkbox label {
774
- font-family: Roboto, sans-serif;
775
- font-size: 14px;
776
- color: #1e252d;
777
- cursor: pointer;
778
- }
779
-
780
- .Checkbox label:before, .Checkbox label:after {
781
- content: "";
782
- position: absolute;
783
- left: 0;
784
- top: 0;
785
- }
786
-
787
- .Checkbox label:before {
788
- width: 20px;
789
- height: 20px;
790
- background: #fff;
791
- border: 2px solid #252525;
792
- border-radius: 2px;
793
- cursor: pointer;
794
- transition: background 0.3s;
795
- }
796
-
797
- .Checkbox input[type=checkbox] {
798
- outline: 0;
799
- margin-right: 10px;
800
- visibility: hidden;
801
- }
802
-
803
- .Checkbox input[type=checkbox]:checked + label:before {
804
- background: #4AC263;
805
- border: none;
806
- }
807
-
808
- .Checkbox input[type=checkbox]:checked + label:after {
809
- transform: rotate(-45deg);
810
- top: 6px;
811
- left: 4px;
812
- width: 12px;
813
- height: 6px;
814
- border: 2px solid #fff;
815
- border-top-style: none;
816
- border-right-style: none;
817
- }
818
-
819
- .Checkbox input[type=checkbox]:disabled + label {
820
- color: gray;
821
- }
822
-
823
- .Checkbox input[type=checkbox]:disabled + label:before {
824
- border-color: rgba(0, 0, 0, 0.26);
825
- }
826
-
827
- .Checkbox input[type=checkbox]:disabled:checked + label:before {
828
- background: rgba(0, 0, 0, 0.26);
829
- }
830
-
831
728
  .DatePicker {
832
729
  position: relative;
833
730
  }
@@ -945,6 +842,139 @@
945
842
  background-color: #51adf6;
946
843
  }
947
844
 
845
+ .animated {
846
+ transition: opacity 250ms ease;
847
+ opacity: 0;
848
+ }
849
+
850
+ .animated.mounting, .animated.mounted {
851
+ opacity: 1;
852
+ }
853
+
854
+ .DNDContainer {
855
+ position: relative;
856
+ }
857
+
858
+ .DNDContainer .Draggable[draggable=true], .DNDContainer .Draggable [draggable=true] {
859
+ cursor: pointer;
860
+ }
861
+
862
+ .DNDContainer .Draggable.placeholder {
863
+ opacity: 0.2;
864
+ }
865
+
866
+ .DNDContainer .Draggable.copy {
867
+ position: absolute;
868
+ box-sizing: border-box;
869
+ will-change: transform;
870
+ opacity: 0;
871
+ }
872
+
873
+ .DNDContainer .Draggable.dragged {
874
+ z-index: 10;
875
+ }
876
+
877
+ .DNDContainer .overlay {
878
+ position: absolute;
879
+ top: 0;
880
+ left: 0;
881
+ right: 0;
882
+ bottom: 0;
883
+ pointer-events: none;
884
+ }
885
+
886
+ .Checkbox {
887
+ position: relative;
888
+ white-space: pre;
889
+ }
890
+
891
+ .Checkbox *, .Checkbox *:before, .Checkbox *:after {
892
+ box-sizing: border-box;
893
+ }
894
+
895
+ .Checkbox label {
896
+ font-family: Roboto, sans-serif;
897
+ font-size: 14px;
898
+ color: #1e252d;
899
+ cursor: pointer;
900
+ }
901
+
902
+ .Checkbox label:before, .Checkbox label:after {
903
+ content: "";
904
+ position: absolute;
905
+ left: 0;
906
+ top: 0;
907
+ }
908
+
909
+ .Checkbox label:before {
910
+ width: 20px;
911
+ height: 20px;
912
+ background: #fff;
913
+ border: 2px solid #252525;
914
+ border-radius: 2px;
915
+ cursor: pointer;
916
+ transition: background 0.3s;
917
+ }
918
+
919
+ .Checkbox input[type=checkbox] {
920
+ outline: 0;
921
+ margin-right: 10px;
922
+ visibility: hidden;
923
+ }
924
+
925
+ .Checkbox input[type=checkbox]:checked + label:before {
926
+ background: #4AC263;
927
+ border: none;
928
+ }
929
+
930
+ .Checkbox input[type=checkbox]:checked + label:after {
931
+ transform: rotate(-45deg);
932
+ top: 6px;
933
+ left: 4px;
934
+ width: 12px;
935
+ height: 6px;
936
+ border: 2px solid #fff;
937
+ border-top-style: none;
938
+ border-right-style: none;
939
+ }
940
+
941
+ .Checkbox input[type=checkbox]:disabled + label {
942
+ color: gray;
943
+ }
944
+
945
+ .Checkbox input[type=checkbox]:disabled + label:before {
946
+ border-color: rgba(0, 0, 0, 0.26);
947
+ }
948
+
949
+ .Checkbox input[type=checkbox]:disabled:checked + label:before {
950
+ background: rgba(0, 0, 0, 0.26);
951
+ }
952
+
953
+ .CalendarMonthView {
954
+ display: flex;
955
+ flex-flow: column nowrap;
956
+ height: 100%;
957
+ }
958
+
959
+ .CalendarMonthView > .row {
960
+ display: flex;
961
+ flex-flow: row nowrap;
962
+ }
963
+
964
+ .CalendarMonthView .days {
965
+ flex-grow: 1;
966
+ position: relative;
967
+ }
968
+
969
+ .CalendarMonthView .day, .CalendarMonthView .header {
970
+ flex-grow: 1;
971
+ flex-basis: 1px;
972
+ }
973
+
974
+ .CalendarMonthView .day {
975
+ height: 100%;
976
+ }
977
+
948
978
  .DialogModal {
949
979
  overflow: hidden;
950
980
  }
@@ -987,73 +1017,171 @@
987
1017
  margin-bottom: 0;
988
1018
  }
989
1019
 
990
- .FormUploadProgress {
1020
+ .Dropzone {
1021
+ position: relative;
1022
+ }
1023
+
1024
+ .Dropzone > .overlay {
991
1025
  position: absolute;
992
1026
  left: 0;
993
1027
  right: 0;
994
1028
  top: 0;
995
1029
  bottom: 0;
996
- background-color: rgba(255, 255, 255, 0.6);
997
- z-index: 2;
1030
+ background-color: #38ADC4;
1031
+ z-index: 1;
1032
+ opacity: 0;
1033
+ transition: all 0.2s ease;
1034
+ transition-delay: 100ms;
1035
+ visibility: hidden;
1036
+ display: flex;
1037
+ justify-content: center;
1038
+ align-items: center;
998
1039
  }
999
1040
 
1000
- .FormUploadProgress.animated.mounting, .FormUploadProgress.animated.mounted {
1001
- transition-delay: 500ms;
1002
- }
1003
-
1004
- .FormUploadProgress .wrapper {
1005
- position: sticky;
1006
- top: 40%;
1007
- margin-top: 40%;
1008
- margin-left: 50%;
1009
- transform: translateX(-50%);
1041
+ .Dropzone > .overlay .drop {
1042
+ border-radius: 4px;
1043
+ border: 1px dashed #FFFFFF;
1044
+ position: absolute;
1045
+ top: 18px;
1046
+ left: 18px;
1047
+ right: 18px;
1048
+ bottom: 18px;
1010
1049
  display: flex;
1011
- flex-flow: column;
1012
1050
  justify-content: center;
1013
1051
  align-items: center;
1052
+ font-weight: 500;
1053
+ font-size: 18px;
1054
+ color: #FFFFFF;
1014
1055
  }
1015
1056
 
1016
- .FormUploadProgress .wrapper .CircleProgress, .FormUploadProgress .wrapper .SpinningProgress {
1057
+ .Dropzone.dragging > .overlay {
1058
+ opacity: 0.7;
1059
+ visibility: visible;
1060
+ transition-delay: 0s;
1061
+ }
1062
+
1063
+ .Dropzone.dragging > * {
1064
+ pointer-events: none;
1065
+ }
1066
+
1067
+ .Dropzone > input.file {
1017
1068
  position: absolute;
1018
- width: 107px;
1019
- height: 107px;
1069
+ left: 0;
1070
+ right: 0;
1071
+ top: 0;
1072
+ bottom: 0;
1073
+ width: 100%;
1074
+ height: 100%;
1075
+ opacity: 0;
1076
+ cursor: pointer;
1077
+ z-index: 1;
1078
+ }
1079
+
1080
+ .Modal {
1081
+ display: block;
1082
+ position: fixed;
1020
1083
  top: 0;
1021
1084
  left: 0;
1085
+ right: 0;
1086
+ bottom: 100%;
1087
+ overflow-y: scroll;
1088
+ transition: bottom 0ms linear;
1089
+ transition-delay: 0.2s;
1022
1090
  }
1023
1091
 
1024
- .FormUploadProgress .wrapper .CircleProgress .line, .FormUploadProgress .wrapper .SpinningProgress .line {
1025
- stroke: #2196F3;
1092
+ .Modal.show {
1093
+ transition-delay: 0s;
1094
+ bottom: 0;
1026
1095
  }
1027
1096
 
1028
- .FormUploadProgress .wrapper > .progress {
1029
- width: 107px;
1030
- height: 107px;
1031
- min-height: 107px;
1032
- display: flex;
1033
- justify-content: center;
1034
- align-items: center;
1035
- box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25);
1036
- border-radius: 50%;
1037
- background: white;
1038
- position: relative;
1097
+ .Modal > .overlay {
1098
+ position: fixed;
1099
+ top: 0;
1100
+ bottom: 100%;
1101
+ left: 0;
1102
+ right: 0;
1103
+ transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1104
+ opacity: 0;
1105
+ background-color: black;
1106
+ pointer-events: none;
1039
1107
  }
1040
1108
 
1041
- .FormUploadProgress .wrapper > .progress > .value {
1042
- display: inline-block;
1043
- margin-top: 5px;
1044
- font-weight: bold;
1045
- line-height: 16px;
1046
- font-size: 13px;
1047
- text-align: center;
1109
+ .Modal > .overlay.show {
1110
+ opacity: 0.5;
1111
+ bottom: 0;
1112
+ }
1113
+
1114
+ .Modal > .content {
1115
+ left: 50%;
1116
+ top: 10vh;
1117
+ margin-bottom: 10vh;
1118
+ font-size: 16px;
1119
+ padding: 0;
1120
+ opacity: 0;
1121
+ transition: opacity 0.25s ease, transform 0.25s ease;
1122
+ transform: scaleY(0) translateY(-200px) translateX(-50%);
1123
+ transform-origin: top;
1124
+ position: absolute;
1125
+ border-radius: 2px;
1126
+ box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.3);
1127
+ }
1128
+
1129
+ .Modal > .content.show {
1130
+ opacity: 1;
1131
+ transform: scaleY(1) translateY(0px) translateX(-50%);
1132
+ }
1133
+
1134
+ .Modal > .content > .Scrollable {
1135
+ overflow: visible;
1136
+ max-height: 80vh;
1137
+ }
1138
+
1139
+ .Modal > .content > .Scrollable > .viewport {
1140
+ min-width: 10px;
1141
+ min-height: 10px;
1142
+ }
1143
+
1144
+ .Modal > .content > .Button.close {
1145
+ top: 10px;
1146
+ right: 10px;
1147
+ position: absolute;
1148
+ }
1149
+
1150
+ .ModalMenu {
1151
+ position: absolute;
1152
+ top: 10px;
1153
+ right: 50px;
1154
+ }
1155
+
1156
+ .ModalMenu .material-icons {
1048
1157
  color: #818181;
1049
1158
  }
1050
1159
 
1051
- .FormUploadProgress .wrapper .cancel {
1052
- min-width: 107px;
1053
- margin-top: 20px;
1054
- background-color: white;
1055
- color: #F96B5C;
1056
- box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25);
1160
+ .ModalMenu .Button.animated {
1161
+ position: absolute;
1162
+ transition: opacity 150ms ease-in, right 200ms ease-in;
1163
+ opacity: 0;
1164
+ right: 0;
1165
+ top: 0;
1166
+ }
1167
+
1168
+ .ModalMenu .Button.animated.mounting, .ModalMenu .Button.animated.mounted {
1169
+ opacity: 1;
1170
+ }
1171
+
1172
+ .ModalMenu .Button.animated.unmounting {
1173
+ transition: opacity 100ms ease-out, right 200ms ease-out;
1174
+ }
1175
+
1176
+ .ModalMenu .Button.active {
1177
+ background: #EBEBEB;
1178
+ }
1179
+
1180
+ .ModalMenu .separator {
1181
+ height: 24px;
1182
+ width: 1px;
1183
+ background-color: #D9D9D9;
1184
+ margin-left: 4px;
1057
1185
  }
1058
1186
 
1059
1187
  .Button.FloatingActionButton {
@@ -1080,89 +1208,145 @@
1080
1208
  bottom: -100px;
1081
1209
  }
1082
1210
 
1083
- .CalendarMonthView {
1084
- display: flex;
1085
- flex-flow: column nowrap;
1086
- height: 100%;
1211
+ .DropFileInput {
1212
+ flex-grow: 1;
1087
1213
  }
1088
1214
 
1089
- .CalendarMonthView > .row {
1215
+ .DropFileInput .Dropzone {
1216
+ border: 1px dashed #808080;
1217
+ padding: 12px;
1090
1218
  display: flex;
1091
1219
  flex-flow: row nowrap;
1220
+ justify-content: center;
1221
+ align-items: center;
1222
+ color: gray;
1223
+ cursor: pointer;
1224
+ border-radius: 3px;
1225
+ font-weight: normal;
1226
+ line-height: 22px;
1227
+ font-size: 14px;
1228
+ color: #7E7E7E;
1229
+ max-width: 100%;
1230
+ word-break: break-all;
1231
+ word-break: break-word;
1092
1232
  }
1093
1233
 
1094
- .CalendarMonthView .days {
1095
- flex-grow: 1;
1096
- position: relative;
1234
+ .DropFileInput .Dropzone .icon.withText {
1235
+ margin-right: 10px;
1097
1236
  }
1098
1237
 
1099
- .CalendarMonthView .day, .CalendarMonthView .header {
1100
- flex-grow: 1;
1101
- flex-basis: 1px;
1238
+ .FormUploadProgress {
1239
+ position: absolute;
1240
+ left: 0;
1241
+ right: 0;
1242
+ top: 0;
1243
+ bottom: 0;
1244
+ background-color: rgba(255, 255, 255, 0.6);
1245
+ z-index: 2;
1102
1246
  }
1103
1247
 
1104
- .CalendarMonthView .day {
1105
- height: 100%;
1248
+ .FormUploadProgress.animated.mounting, .FormUploadProgress.animated.mounted {
1249
+ transition-delay: 500ms;
1106
1250
  }
1107
1251
 
1108
- .Dropzone {
1109
- position: relative;
1252
+ .FormUploadProgress .wrapper {
1253
+ position: sticky;
1254
+ top: 40%;
1255
+ margin-top: 40%;
1256
+ margin-left: 50%;
1257
+ transform: translateX(-50%);
1258
+ display: flex;
1259
+ flex-flow: column;
1260
+ justify-content: center;
1261
+ align-items: center;
1110
1262
  }
1111
1263
 
1112
- .Dropzone > .overlay {
1264
+ .FormUploadProgress .wrapper .CircleProgress, .FormUploadProgress .wrapper .SpinningProgress {
1113
1265
  position: absolute;
1114
- left: 0;
1115
- right: 0;
1266
+ width: 107px;
1267
+ height: 107px;
1116
1268
  top: 0;
1117
- bottom: 0;
1118
- background-color: #38ADC4;
1119
- z-index: 1;
1120
- opacity: 0;
1121
- transition: all 0.2s ease;
1122
- transition-delay: 100ms;
1123
- visibility: hidden;
1269
+ left: 0;
1270
+ }
1271
+
1272
+ .FormUploadProgress .wrapper .CircleProgress .line, .FormUploadProgress .wrapper .SpinningProgress .line {
1273
+ stroke: #2196F3;
1274
+ }
1275
+
1276
+ .FormUploadProgress .wrapper > .progress {
1277
+ width: 107px;
1278
+ height: 107px;
1279
+ min-height: 107px;
1124
1280
  display: flex;
1125
1281
  justify-content: center;
1126
1282
  align-items: center;
1283
+ box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25);
1284
+ border-radius: 50%;
1285
+ background: white;
1286
+ position: relative;
1127
1287
  }
1128
1288
 
1129
- .Dropzone > .overlay .drop {
1130
- border-radius: 4px;
1131
- border: 1px dashed #FFFFFF;
1132
- position: absolute;
1133
- top: 18px;
1134
- left: 18px;
1135
- right: 18px;
1136
- bottom: 18px;
1289
+ .FormUploadProgress .wrapper > .progress > .value {
1290
+ display: inline-block;
1291
+ margin-top: 5px;
1292
+ font-weight: bold;
1293
+ line-height: 16px;
1294
+ font-size: 13px;
1295
+ text-align: center;
1296
+ color: #818181;
1297
+ }
1298
+
1299
+ .FormUploadProgress .wrapper .cancel {
1300
+ min-width: 107px;
1301
+ margin-top: 20px;
1302
+ background-color: white;
1303
+ color: #F96B5C;
1304
+ box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25);
1305
+ }
1306
+
1307
+ .Snackbar {
1308
+ transform: translateX(-50%);
1309
+ overflow: hidden;
1310
+ background-color: #323232;
1311
+ padding: 14px 24px 14px 24px;
1312
+ color: #fff;
1313
+ min-width: 288px;
1314
+ max-width: 568px;
1315
+ position: fixed;
1316
+ bottom: -50px;
1317
+ left: 50%;
1137
1318
  display: flex;
1138
- justify-content: center;
1319
+ flex-wrap: nowrap;
1139
1320
  align-items: center;
1140
- font-weight: 500;
1141
- font-size: 18px;
1142
- color: #FFFFFF;
1321
+ opacity: 0;
1322
+ transition: bottom 0.25s ease, opacity 0.2s ease;
1323
+ border-radius: 4px;
1324
+ box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
1143
1325
  }
1144
1326
 
1145
- .Dropzone.dragging > .overlay {
1146
- opacity: 0.7;
1147
- visibility: visible;
1148
- transition-delay: 0s;
1327
+ .Snackbar.shown {
1328
+ bottom: 15px;
1329
+ opacity: 1;
1149
1330
  }
1150
1331
 
1151
- .Dropzone.dragging > * {
1152
- pointer-events: none;
1332
+ .Snackbar .message {
1333
+ overflow: hidden;
1334
+ line-height: 1.2em;
1335
+ min-height: 1.2em;
1336
+ max-height: 2.4em;
1337
+ flex: 1;
1153
1338
  }
1154
1339
 
1155
- .Dropzone > input.file {
1156
- position: absolute;
1157
- left: 0;
1158
- right: 0;
1159
- top: 0;
1160
- bottom: 0;
1161
- width: 100%;
1162
- height: 100%;
1163
- opacity: 0;
1164
- cursor: pointer;
1165
- z-index: 1;
1340
+ .Snackbar .action {
1341
+ text-transform: uppercase;
1342
+ font-weight: bold;
1343
+ margin-left: 48px;
1344
+ color: #bf3727;
1345
+ }
1346
+
1347
+ .Snackbar .action a {
1348
+ text-decoration: none;
1349
+ color: #bf3727;
1166
1350
  }
1167
1351
 
1168
1352
  .FilteredList {
@@ -1249,188 +1433,200 @@
1249
1433
  margin-bottom: 8px;
1250
1434
  }
1251
1435
 
1252
- .ModalMenu {
1253
- position: absolute;
1254
- top: 10px;
1255
- right: 50px;
1436
+ .SpinningProgress {
1437
+ width: 48px;
1438
+ height: 48px;
1439
+ position: relative;
1440
+ margin: 0 auto;
1256
1441
  }
1257
1442
 
1258
- .ModalMenu .material-icons {
1259
- color: #818181;
1443
+ .SpinningProgress:before {
1444
+ content: "";
1445
+ display: block;
1446
+ padding-top: 100%;
1260
1447
  }
1261
1448
 
1262
- .ModalMenu .Button.animated {
1449
+ .SpinningProgress .circular {
1450
+ animation: rotate 2s linear infinite;
1451
+ height: 100%;
1452
+ transform-origin: center center;
1453
+ width: 100%;
1263
1454
  position: absolute;
1264
- transition: opacity 150ms ease-in, right 200ms ease-in;
1265
- opacity: 0;
1266
- right: 0;
1267
1455
  top: 0;
1456
+ bottom: 0;
1457
+ left: 0;
1458
+ right: 0;
1459
+ margin: auto;
1268
1460
  }
1269
1461
 
1270
- .ModalMenu .Button.animated.mounting, .ModalMenu .Button.animated.mounted {
1271
- opacity: 1;
1462
+ .SpinningProgress .line {
1463
+ stroke: black;
1464
+ stroke-width: 2px;
1465
+ stroke-dasharray: 1, 96;
1466
+ stroke-dashoffset: 0;
1467
+ animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;
1272
1468
  }
1273
1469
 
1274
- .ModalMenu .Button.animated.unmounting {
1275
- transition: opacity 100ms ease-out, right 200ms ease-out;
1470
+ @keyframes rotate {
1471
+ 100% {
1472
+ transform: rotate(360deg);
1473
+ }
1276
1474
  }
1277
-
1278
- .ModalMenu .Button.active {
1279
- background: #EBEBEB;
1475
+ @keyframes dash {
1476
+ 0% {
1477
+ stroke-dasharray: 1, 96;
1478
+ stroke-dashoffset: 0;
1479
+ }
1480
+ 50% {
1481
+ stroke-dasharray: 43, 96;
1482
+ stroke-dashoffset: -17px;
1483
+ }
1484
+ 100% {
1485
+ stroke-dasharray: 43, 96;
1486
+ stroke-dashoffset: -53px;
1487
+ }
1280
1488
  }
1281
-
1282
- .ModalMenu .separator {
1283
- height: 24px;
1284
- width: 1px;
1285
- background-color: #D9D9D9;
1286
- margin-left: 4px;
1489
+ .TextField {
1490
+ position: relative;
1491
+ width: 100%;
1287
1492
  }
1288
1493
 
1289
- .Modal {
1290
- display: block;
1291
- position: fixed;
1292
- top: 0;
1293
- left: 0;
1294
- right: 0;
1295
- bottom: 100%;
1296
- overflow-y: scroll;
1297
- transition: bottom 0ms linear;
1298
- transition-delay: 0.2s;
1494
+ .TextField > label {
1495
+ font-family: Roboto, sans-serif;
1496
+ color: rgba(0, 0, 0, 0.5);
1497
+ font-size: 16px;
1498
+ position: absolute;
1499
+ left: 0px;
1500
+ top: 16px;
1501
+ margin-top: -16px;
1502
+ transition: all 0.2s ease;
1503
+ user-select: none;
1504
+ cursor: text;
1299
1505
  }
1300
1506
 
1301
- .Modal.show {
1302
- transition-delay: 0s;
1303
- bottom: 0;
1507
+ .TextField > input {
1508
+ font-family: Roboto, sans-serif;
1509
+ color: #1e252d;
1510
+ height: 19px;
1511
+ font-size: 16px;
1512
+ width: 100%;
1513
+ border: 0px;
1514
+ padding-bottom: 4px;
1515
+ padding-top: 0;
1516
+ outline-color: rgba(0, 0, 0, 0);
1304
1517
  }
1305
1518
 
1306
- .Modal > .overlay {
1307
- position: fixed;
1308
- top: 0;
1309
- bottom: 100%;
1310
- left: 0;
1311
- right: 0;
1312
- transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1313
- opacity: 0;
1314
- background-color: black;
1315
- pointer-events: none;
1519
+ .TextField > input:focus {
1520
+ outline: none;
1316
1521
  }
1317
1522
 
1318
- .Modal > .overlay.show {
1319
- opacity: 0.5;
1320
- bottom: 0;
1523
+ .TextField > input:disabled {
1524
+ color: gray;
1525
+ background-color: white;
1321
1526
  }
1322
1527
 
1323
- .Modal > .content {
1324
- left: 50%;
1325
- top: 10vh;
1326
- margin-bottom: 10vh;
1327
- font-size: 16px;
1328
- padding: 0;
1329
- opacity: 0;
1330
- transition: opacity 0.25s ease, transform 0.25s ease;
1331
- transform: scaleY(0) translateY(-200px) translateX(-50%);
1332
- transform-origin: top;
1333
- position: absolute;
1334
- border-radius: 2px;
1335
- box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.3);
1528
+ .TextField > input:disabled + .border {
1529
+ height: 0px;
1530
+ border-bottom: 2px dotted rgb(224, 224, 224);
1336
1531
  }
1337
1532
 
1338
- .Modal > .content.show {
1533
+ .TextField > input::placeholder {
1534
+ font-family: Roboto, sans-serif;
1535
+ color: rgba(0, 0, 0, 0.3);
1339
1536
  opacity: 1;
1340
- transform: scaleY(1) translateY(0px) translateX(-50%);
1341
- }
1342
-
1343
- .Modal > .content > .Scrollable {
1344
- overflow: visible;
1345
- max-height: 80vh;
1346
1537
  }
1347
1538
 
1348
- .Modal > .content > .Scrollable > .viewport {
1349
- min-width: 10px;
1350
- min-height: 10px;
1539
+ .TextField > .border {
1540
+ border-bottom: 1px solid rgb(224, 224, 224);
1541
+ height: 1px;
1542
+ position: relative;
1351
1543
  }
1352
1544
 
1353
- .Modal > .content > .Button.close {
1354
- top: 10px;
1355
- right: 10px;
1545
+ .TextField > .border .line {
1546
+ left: 50%;
1547
+ width: 0;
1548
+ height: 2px;
1549
+ min-height: 2px;
1550
+ background-color: rgb(0, 188, 212);
1551
+ transition: all 0.2s ease;
1356
1552
  position: absolute;
1357
1553
  }
1358
1554
 
1359
- .Snackbar {
1360
- transform: translateX(-50%);
1361
- overflow: hidden;
1362
- background-color: #323232;
1363
- padding: 14px 24px 14px 24px;
1364
- color: #fff;
1365
- min-width: 288px;
1366
- max-width: 568px;
1367
- position: fixed;
1368
- bottom: -50px;
1369
- left: 50%;
1370
- display: flex;
1371
- flex-wrap: nowrap;
1372
- align-items: center;
1555
+ .TextField > .error {
1556
+ text-align: left;
1557
+ font-size: 10px;
1558
+ min-height: 0;
1559
+ line-height: 14px;
1560
+ color: rgb(244, 67, 54);
1561
+ visibility: hidden;
1373
1562
  opacity: 0;
1374
- transition: bottom 0.25s ease, opacity 0.2s ease;
1375
- border-radius: 4px;
1376
- box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
1377
- }
1378
-
1379
- .Snackbar.shown {
1380
- bottom: 15px;
1381
- opacity: 1;
1563
+ transition: all 0.2s ease;
1382
1564
  }
1383
1565
 
1384
- .Snackbar .message {
1385
- overflow: hidden;
1386
- line-height: 1.2em;
1387
- min-height: 1.2em;
1388
- max-height: 2.4em;
1389
- flex: 1;
1566
+ .TextField.focused > label, .TextField.withValue > label {
1567
+ top: 4px;
1568
+ font-size: 12px;
1569
+ line-height: 14px;
1390
1570
  }
1391
1571
 
1392
- .Snackbar .action {
1393
- text-transform: uppercase;
1394
- font-weight: bold;
1395
- margin-left: 48px;
1396
- color: #bf3727;
1572
+ .TextField.errored > .error {
1573
+ visibility: visible;
1574
+ opacity: 1;
1397
1575
  }
1398
1576
 
1399
- .Snackbar .action a {
1400
- text-decoration: none;
1401
- color: #bf3727;
1577
+ .TextField.errored > .border {
1578
+ border-bottom-color: rgb(244, 67, 54);
1402
1579
  }
1403
1580
 
1404
- .DNDContainer {
1405
- position: relative;
1581
+ .TextField.errored > label {
1582
+ color: rgb(244, 67, 54);
1406
1583
  }
1407
1584
 
1408
- .DNDContainer .Draggable[draggable=true], .DNDContainer .Draggable [draggable=true] {
1409
- cursor: pointer;
1585
+ .TextField.focused > label {
1586
+ color: rgb(0, 188, 212);
1410
1587
  }
1411
1588
 
1412
- .DNDContainer .Draggable.placeholder {
1413
- opacity: 0.2;
1589
+ .TextField.focused > .border .line {
1590
+ left: 0;
1591
+ width: 100%;
1414
1592
  }
1415
1593
 
1416
- .DNDContainer .Draggable.copy {
1417
- position: absolute;
1418
- box-sizing: border-box;
1419
- will-change: transform;
1420
- opacity: 0;
1594
+ .TextField.disabled label, .TextField.disabled input {
1595
+ cursor: not-allowed;
1421
1596
  }
1422
1597
 
1423
- .DNDContainer .Draggable.dragged {
1424
- z-index: 10;
1598
+ .TextField.withLabel {
1599
+ margin-top: 15px;
1425
1600
  }
1426
1601
 
1427
- .DNDContainer .overlay {
1602
+ .TextField input::-webkit-contacts-auto-fill-button {
1603
+ visibility: hidden;
1604
+ display: none !important;
1605
+ pointer-events: none;
1428
1606
  position: absolute;
1429
- top: 0;
1430
- left: 0;
1431
1607
  right: 0;
1432
- bottom: 0;
1433
- pointer-events: none;
1608
+ }
1609
+
1610
+ .TextField input:-webkit-autofill {
1611
+ -webkit-box-shadow: inset 0 0 0px 9999px white;
1612
+ }
1613
+
1614
+ @keyframes shake {
1615
+ 0%, 100% {
1616
+ transform: translateX(0);
1617
+ }
1618
+ 20%, 60% {
1619
+ transform: translateX(-5px);
1620
+ }
1621
+ 40%, 80% {
1622
+ transform: translateX(5px);
1623
+ }
1624
+ }
1625
+ .TextField .shake {
1626
+ animation-duration: 0.5s;
1627
+ animation-fill-mode: both;
1628
+ animation-timing-function: ease-in-out;
1629
+ animation-name: shake;
1434
1630
  }
1435
1631
 
1436
1632
  .Scrollable {
@@ -1613,59 +1809,6 @@
1613
1809
  display: none;
1614
1810
  }
1615
1811
 
1616
- .SpinningProgress {
1617
- width: 48px;
1618
- height: 48px;
1619
- position: relative;
1620
- margin: 0 auto;
1621
- }
1622
-
1623
- .SpinningProgress:before {
1624
- content: "";
1625
- display: block;
1626
- padding-top: 100%;
1627
- }
1628
-
1629
- .SpinningProgress .circular {
1630
- animation: rotate 2s linear infinite;
1631
- height: 100%;
1632
- transform-origin: center center;
1633
- width: 100%;
1634
- position: absolute;
1635
- top: 0;
1636
- bottom: 0;
1637
- left: 0;
1638
- right: 0;
1639
- margin: auto;
1640
- }
1641
-
1642
- .SpinningProgress .line {
1643
- stroke: black;
1644
- stroke-width: 2px;
1645
- stroke-dasharray: 1, 96;
1646
- stroke-dashoffset: 0;
1647
- animation: dash 1.5s ease-in-out infinite, color 6s ease-in-out infinite;
1648
- }
1649
-
1650
- @keyframes rotate {
1651
- 100% {
1652
- transform: rotate(360deg);
1653
- }
1654
- }
1655
- @keyframes dash {
1656
- 0% {
1657
- stroke-dasharray: 1, 96;
1658
- stroke-dashoffset: 0;
1659
- }
1660
- 50% {
1661
- stroke-dasharray: 43, 96;
1662
- stroke-dashoffset: -17px;
1663
- }
1664
- 100% {
1665
- stroke-dasharray: 43, 96;
1666
- stroke-dashoffset: -53px;
1667
- }
1668
- }
1669
1812
  .Table {
1670
1813
  font-family: Roboto, sans-serif;
1671
1814
  font-size: 14px;
@@ -1788,149 +1931,6 @@
1788
1931
  margin: 0;
1789
1932
  }
1790
1933
 
1791
- .TextField {
1792
- position: relative;
1793
- width: 100%;
1794
- }
1795
-
1796
- .TextField > label {
1797
- font-family: Roboto, sans-serif;
1798
- color: rgba(0, 0, 0, 0.5);
1799
- font-size: 16px;
1800
- position: absolute;
1801
- left: 0px;
1802
- top: 16px;
1803
- margin-top: -16px;
1804
- transition: all 0.2s ease;
1805
- user-select: none;
1806
- cursor: text;
1807
- }
1808
-
1809
- .TextField > input {
1810
- font-family: Roboto, sans-serif;
1811
- color: #1e252d;
1812
- height: 19px;
1813
- font-size: 16px;
1814
- width: 100%;
1815
- border: 0px;
1816
- padding-bottom: 4px;
1817
- padding-top: 0;
1818
- outline-color: rgba(0, 0, 0, 0);
1819
- }
1820
-
1821
- .TextField > input:focus {
1822
- outline: none;
1823
- }
1824
-
1825
- .TextField > input:disabled {
1826
- color: gray;
1827
- background-color: white;
1828
- }
1829
-
1830
- .TextField > input:disabled + .border {
1831
- height: 0px;
1832
- border-bottom: 2px dotted rgb(224, 224, 224);
1833
- }
1834
-
1835
- .TextField > input::placeholder {
1836
- font-family: Roboto, sans-serif;
1837
- color: rgba(0, 0, 0, 0.3);
1838
- opacity: 1;
1839
- }
1840
-
1841
- .TextField > .border {
1842
- border-bottom: 1px solid rgb(224, 224, 224);
1843
- height: 1px;
1844
- position: relative;
1845
- }
1846
-
1847
- .TextField > .border .line {
1848
- left: 50%;
1849
- width: 0;
1850
- height: 2px;
1851
- min-height: 2px;
1852
- background-color: rgb(0, 188, 212);
1853
- transition: all 0.2s ease;
1854
- position: absolute;
1855
- }
1856
-
1857
- .TextField > .error {
1858
- text-align: left;
1859
- font-size: 10px;
1860
- min-height: 0;
1861
- line-height: 14px;
1862
- color: rgb(244, 67, 54);
1863
- visibility: hidden;
1864
- opacity: 0;
1865
- transition: all 0.2s ease;
1866
- }
1867
-
1868
- .TextField.focused > label, .TextField.withValue > label {
1869
- top: 4px;
1870
- font-size: 12px;
1871
- line-height: 14px;
1872
- }
1873
-
1874
- .TextField.errored > .error {
1875
- visibility: visible;
1876
- opacity: 1;
1877
- }
1878
-
1879
- .TextField.errored > .border {
1880
- border-bottom-color: rgb(244, 67, 54);
1881
- }
1882
-
1883
- .TextField.errored > label {
1884
- color: rgb(244, 67, 54);
1885
- }
1886
-
1887
- .TextField.focused > label {
1888
- color: rgb(0, 188, 212);
1889
- }
1890
-
1891
- .TextField.focused > .border .line {
1892
- left: 0;
1893
- width: 100%;
1894
- }
1895
-
1896
- .TextField.disabled label, .TextField.disabled input {
1897
- cursor: not-allowed;
1898
- }
1899
-
1900
- .TextField.withLabel {
1901
- margin-top: 15px;
1902
- }
1903
-
1904
- .TextField input::-webkit-contacts-auto-fill-button {
1905
- visibility: hidden;
1906
- display: none !important;
1907
- pointer-events: none;
1908
- position: absolute;
1909
- right: 0;
1910
- }
1911
-
1912
- .TextField input:-webkit-autofill {
1913
- -webkit-box-shadow: inset 0 0 0px 9999px white;
1914
- }
1915
-
1916
- @keyframes shake {
1917
- 0%, 100% {
1918
- transform: translateX(0);
1919
- }
1920
- 20%, 60% {
1921
- transform: translateX(-5px);
1922
- }
1923
- 40%, 80% {
1924
- transform: translateX(5px);
1925
- }
1926
- }
1927
- .TextField .shake {
1928
- animation-duration: 0.5s;
1929
- animation-fill-mode: both;
1930
- animation-timing-function: ease-in-out;
1931
- animation-name: shake;
1932
- }
1933
-
1934
1934
  .ScrollableTable .Scrollable .scrollbar {
1935
1935
  top: 56px;
1936
1936
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-ui-basics",
3
- "version": "0.0.252",
3
+ "version": "0.0.253",
4
4
  "description": "",
5
5
  "module": "index.js",
6
6
  "_main": "index.cjs.js",
@@ -5,17 +5,22 @@ import {orNoop} from "./Tools";
5
5
 
6
6
  export interface NotReadyIndicatorProps {
7
7
  onChange?: (ready: boolean) => void
8
- render?: (ready: boolean) => JSX.Element | ReactNode
8
+ render?: (ready: boolean, notReadyElements: string[]) => JSX.Element | ReactNode
9
9
  children?: ReactNode
10
10
  }
11
11
 
12
+ export interface NotReadyProps {
13
+ name?: string
14
+ }
15
+
12
16
  interface NotReadyIndicatorState {
13
17
  r: boolean
14
18
  }
15
19
 
16
20
  export const createReadyListener = () => {
17
21
  let indicator,
18
- count = 0;
22
+ count = 0,
23
+ notReadyElements: string[] = [];
19
24
 
20
25
  class NotReadyIndicator extends PureComponent<NotReadyIndicatorProps, NotReadyIndicatorState> {
21
26
  constructor(properties) {
@@ -29,25 +34,30 @@ export const createReadyListener = () => {
29
34
  ready = state(that).r;
30
35
 
31
36
  if (renderer)
32
- return renderer(ready);
37
+ return renderer(ready, notReadyElements);
33
38
  else
34
39
  return (!ready && _props[children]) || null;
35
40
  };
36
41
  that[componentDidMount] = that[componentDidUpdate] = () => {
37
- orNoop(props(that).onChange)(state(that).r);
42
+ // console.log('NotReadyIndicator.update.mounted', state(that).r, count)
43
+ orNoop(props(that).onChange)(state(that).r && count === 0);
38
44
  }
39
45
  }
40
46
  }
41
47
 
42
- class NotReady extends PureComponent {
43
- constructor(props) {
48
+ class NotReady extends PureComponent<NotReadyProps> {
49
+ constructor(props: NotReadyProps) {
44
50
  super(props);
45
51
  const that = this;
52
+ count++;
53
+ // console.log('NotReady created')
46
54
  that[componentDidMount] = () => {
47
- count++;
55
+ notReadyElements.push(that.props.name || 'unknown')
48
56
  setState(indicator, {r: false});
49
57
  };
50
58
  that[componentWillUnmount] = () => {
59
+ let index = notReadyElements.indexOf(that.props.name || 'unknown')
60
+ notReadyElements.splice(index, 1)
51
61
  setState(indicator, {r: --count === 0});
52
62
  };
53
63
  that[render] = () => null;