cozy-bar 1.17.1

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 (181) hide show
  1. package/.eslintrc.json +7 -0
  2. package/.github/auto-merge.yml +7 -0
  3. package/.nvmrc +1 -0
  4. package/.transifexrc.tpl +4 -0
  5. package/.travis.yml +28 -0
  6. package/.tx/config +8 -0
  7. package/CHANGELOG.md +493 -0
  8. package/CODEOWNERS +2 -0
  9. package/CONTRIBUTING.md +135 -0
  10. package/LICENSE +21 -0
  11. package/README.md +172 -0
  12. package/babel.config.js +3 -0
  13. package/config/aliases/globalReact.js +1 -0
  14. package/config/aliases/globalReactDOM.js +1 -0
  15. package/config/webpack.config.analyzer.js +10 -0
  16. package/config/webpack.config.base.js +61 -0
  17. package/config/webpack.config.dev.js +16 -0
  18. package/config/webpack.config.extract.js +84 -0
  19. package/config/webpack.config.inline-styles.js +82 -0
  20. package/config/webpack.config.jsx.js +14 -0
  21. package/config/webpack.config.prod.js +18 -0
  22. package/config/webpack.js +31 -0
  23. package/config/webpack.vars.js +11 -0
  24. package/dist/cozy-bar.css +9445 -0
  25. package/dist/cozy-bar.css.map +1 -0
  26. package/dist/cozy-bar.js +122668 -0
  27. package/dist/cozy-bar.js.map +1 -0
  28. package/dist/cozy-bar.min.css +9 -0
  29. package/dist/cozy-bar.min.css.map +1 -0
  30. package/dist/cozy-bar.min.js +57 -0
  31. package/dist/cozy-bar.min.js.map +1 -0
  32. package/dist/cozy-bar.mobile.js +123719 -0
  33. package/dist/cozy-bar.mobile.js.map +1 -0
  34. package/dist/cozy-bar.mobile.min.js +57 -0
  35. package/dist/cozy-bar.mobile.min.js.map +1 -0
  36. package/docs/dev.md +20 -0
  37. package/examples/Procfile +3 -0
  38. package/examples/icon.png +0 -0
  39. package/examples/index.html +7 -0
  40. package/examples/index.jsx +122 -0
  41. package/examples/logs.js +3 -0
  42. package/package.json +163 -0
  43. package/postcss.config.js +23 -0
  44. package/public/fonts/Lato-Bold.woff2 +0 -0
  45. package/public/fonts/Lato-Regular.woff2 +0 -0
  46. package/public/fonts.css +13 -0
  47. package/public/icon-type-folder-32.png +0 -0
  48. package/public/index.html +63 -0
  49. package/renovate.json +5 -0
  50. package/src/assets/icons/16/icon-claudy.svg +5 -0
  51. package/src/assets/icons/16/icon-cozy-16.svg +1 -0
  52. package/src/assets/icons/16/icon-cube-16.svg +6 -0
  53. package/src/assets/icons/16/icon-logout-16.svg +3 -0
  54. package/src/assets/icons/16/icon-magnifier-16.svg +6 -0
  55. package/src/assets/icons/16/icon-people-16.svg +3 -0
  56. package/src/assets/icons/16/icon-phone-16.svg +3 -0
  57. package/src/assets/icons/16/icon-question-mark-16.svg +3 -0
  58. package/src/assets/icons/16/icon-storage-16.svg +3 -0
  59. package/src/assets/icons/24/icon-arrow-left.svg +3 -0
  60. package/src/assets/icons/32/icon-claudy.svg +1 -0
  61. package/src/assets/icons/apps/icon-collect.svg +25 -0
  62. package/src/assets/icons/apps/icon-drive.svg +17 -0
  63. package/src/assets/icons/apps/icon-market-soon.svg +25 -0
  64. package/src/assets/icons/apps/icon-photos.svg +19 -0
  65. package/src/assets/icons/apps/icon-soon.svg +21 -0
  66. package/src/assets/icons/apps/icon-store.svg +19 -0
  67. package/src/assets/icons/claudyActions/icon-bills.svg +6 -0
  68. package/src/assets/icons/claudyActions/icon-laptop.svg +7 -0
  69. package/src/assets/icons/claudyActions/icon-phone.svg +8 -0
  70. package/src/assets/icons/claudyActions/icon-question-mark.svg +6 -0
  71. package/src/assets/icons/comingsoon/icon-bank.svg +12 -0
  72. package/src/assets/icons/comingsoon/icon-sante.svg +12 -0
  73. package/src/assets/icons/comingsoon/icon-store.svg +6 -0
  74. package/src/assets/icons/icon-cozy.svg +3 -0
  75. package/src/assets/icons/icon-shield.svg +3 -0
  76. package/src/assets/icons/spinner.svg +4 -0
  77. package/src/assets/sprites/icon-apps.svg +1 -0
  78. package/src/assets/sprites/icon-cozy-home.svg +16 -0
  79. package/src/components/Apps/AppItem.jsx +117 -0
  80. package/src/components/Apps/AppItemPlaceholder.jsx +12 -0
  81. package/src/components/Apps/AppNavButtons.jsx +88 -0
  82. package/src/components/Apps/AppsContent.jsx +89 -0
  83. package/src/components/Apps/ButtonCozyHome.jsx +30 -0
  84. package/src/components/Apps/ButtonCozyHome.spec.jsx +53 -0
  85. package/src/components/Apps/IconCozyHome.jsx +24 -0
  86. package/src/components/Apps/index.jsx +81 -0
  87. package/src/components/Banner.jsx +41 -0
  88. package/src/components/Bar.jsx +293 -0
  89. package/src/components/Bar.spec.jsx +133 -0
  90. package/src/components/Claudy.jsx +81 -0
  91. package/src/components/Drawer.jsx +227 -0
  92. package/src/components/Drawer.spec.jsx +98 -0
  93. package/src/components/SearchBar.jsx +358 -0
  94. package/src/components/Settings/SettingsContent.jsx +145 -0
  95. package/src/components/Settings/StorageData.jsx +29 -0
  96. package/src/components/Settings/helper.js +8 -0
  97. package/src/components/Settings/index.jsx +218 -0
  98. package/src/components/SupportModal.jsx +59 -0
  99. package/src/components/__snapshots__/Bar.spec.jsx.snap +302 -0
  100. package/src/config/claudyActions.yaml +14 -0
  101. package/src/config/persistWhitelist.yaml +2 -0
  102. package/src/dom.js +80 -0
  103. package/src/index.jsx +235 -0
  104. package/src/index.spec.jsx +34 -0
  105. package/src/lib/api/helpers.js +13 -0
  106. package/src/lib/api/index.jsx +145 -0
  107. package/src/lib/exceptions.js +89 -0
  108. package/src/lib/expiringMemoize.js +13 -0
  109. package/src/lib/icon.js +77 -0
  110. package/src/lib/importIcons.js +14 -0
  111. package/src/lib/intents.js +16 -0
  112. package/src/lib/logger.js +6 -0
  113. package/src/lib/middlewares/appsI18n.js +57 -0
  114. package/src/lib/realtime.js +43 -0
  115. package/src/lib/reducers/apps.js +175 -0
  116. package/src/lib/reducers/apps.spec.js +59 -0
  117. package/src/lib/reducers/content.js +50 -0
  118. package/src/lib/reducers/context.js +83 -0
  119. package/src/lib/reducers/index.js +73 -0
  120. package/src/lib/reducers/locale.js +22 -0
  121. package/src/lib/reducers/settings.js +111 -0
  122. package/src/lib/reducers/theme.js +48 -0
  123. package/src/lib/reducers/unserializable.js +26 -0
  124. package/src/lib/stack-client.js +401 -0
  125. package/src/lib/stack.js +79 -0
  126. package/src/lib/store/index.js +54 -0
  127. package/src/locales/de.json +57 -0
  128. package/src/locales/en.json +57 -0
  129. package/src/locales/es.json +57 -0
  130. package/src/locales/fr.json +57 -0
  131. package/src/locales/it.json +57 -0
  132. package/src/locales/ja.json +57 -0
  133. package/src/locales/nl_NL.json +57 -0
  134. package/src/locales/pl.json +57 -0
  135. package/src/locales/ru.json +57 -0
  136. package/src/locales/sq.json +57 -0
  137. package/src/locales/zh_CN.json +57 -0
  138. package/src/proptypes/index.js +10 -0
  139. package/src/queries/index.js +16 -0
  140. package/src/styles/apps.css +248 -0
  141. package/src/styles/banner.css +64 -0
  142. package/src/styles/bar.css +106 -0
  143. package/src/styles/base.css +41 -0
  144. package/src/styles/claudy.css +99 -0
  145. package/src/styles/drawer.css +126 -0
  146. package/src/styles/index.styl +33 -0
  147. package/src/styles/indicators.css +58 -0
  148. package/src/styles/nav.css +81 -0
  149. package/src/styles/navigation_item.css +39 -0
  150. package/src/styles/searchbar.css +158 -0
  151. package/src/styles/settings.css +44 -0
  152. package/src/styles/storage.css +22 -0
  153. package/src/styles/supportModal.css +20 -0
  154. package/src/styles/theme.styl +25 -0
  155. package/test/__mocks__/fileMock.js +3 -0
  156. package/test/__snapshots__/index.spec.js.snap +41 -0
  157. package/test/components/AppItem.spec.jsx +113 -0
  158. package/test/components/AppsContent.spec.jsx +116 -0
  159. package/test/components/Settings/helper.spec.js +23 -0
  160. package/test/components/__snapshots__/AppsContent.spec.jsx.snap +90 -0
  161. package/test/index.spec.js +24 -0
  162. package/test/jestLib/I18n.js +15 -0
  163. package/test/jestLib/setup.js +14 -0
  164. package/test/lib/__snapshots__/api.spec.jsx.snap +67 -0
  165. package/test/lib/__snapshots__/stack.spec.js.snap +3 -0
  166. package/test/lib/api.spec.jsx +142 -0
  167. package/test/lib/mockStackClient.js +7 -0
  168. package/test/lib/stack-client/stack-client.appiconprops.spec.js +65 -0
  169. package/test/lib/stack-client/stack-client.compare.spec.js +20 -0
  170. package/test/lib/stack-client/stack-client.cozyfetchjson.spec.js +46 -0
  171. package/test/lib/stack-client/stack-client.cozyurl.spec.js +29 -0
  172. package/test/lib/stack-client/stack-client.getapp.spec.js +72 -0
  173. package/test/lib/stack-client/stack-client.getapps.spec.js +72 -0
  174. package/test/lib/stack-client/stack-client.getcontext.spec.js +96 -0
  175. package/test/lib/stack-client/stack-client.getstoragedata.spec.js +85 -0
  176. package/test/lib/stack-client/stack-client.init.spec.js +56 -0
  177. package/test/lib/stack-client/stack-client.intents.spec.js +27 -0
  178. package/test/lib/stack-client/stack-client.logout.spec.js +40 -0
  179. package/test/lib/stack.spec.js +60 -0
  180. package/test/store/__snapshots__/index.spec.js.snap +14 -0
  181. package/test/store/index.spec.js +41 -0
@@ -0,0 +1,58 @@
1
+ /* Spinner */
2
+ @keyframes spin {
3
+ from {
4
+ transform: rotate(0deg);
5
+ }
6
+ to {
7
+ transform: rotate(359deg);
8
+ }
9
+ }
10
+
11
+ /* Progress bar */
12
+ [role=banner] progress[value] {
13
+ /* Reset the default appearance */
14
+ appearance: none;
15
+ background-color: var(--paleGrey);
16
+ border: solid 1px var(--silver);
17
+ border-radius: 2px;
18
+ color: var(--dodgerBlue);
19
+ }
20
+
21
+ [role=banner] progress[value]::-webkit-progress-bar {
22
+ background: var(--paleGrey);
23
+ border-radius: 2px;
24
+ }
25
+
26
+ [role=banner] progress[value]::-webkit-progress-value {
27
+ background: var(--dodgerBlue);
28
+ border-radius: 1px;
29
+ }
30
+
31
+ [role=banner] progress[value]::-moz-progress-bar {
32
+ background: var(--dodgerBlue);
33
+ border-radius: 1px;
34
+ }
35
+
36
+ /* Errors */
37
+ [role=banner] .coz-nav--error {
38
+ margin: 0 0 .1em 0;
39
+ font-weight: normal;
40
+ font-size: .875em;
41
+ color: var(--pomegranate);
42
+ }
43
+
44
+ /* Claudy loading */
45
+ [role=banner] .coz-claudy [data-claudy-loading=true]::before {
46
+ position: absolute;
47
+ content: '';
48
+ width: 100%;
49
+ height: 100%;
50
+ bottom: 0;
51
+ right: 0;
52
+ background: none;
53
+ border-radius: 100%;
54
+ border: .2em solid var(--scienceBlue);
55
+ border-right: .2em solid white;
56
+ box-sizing: border-box;
57
+ animation: 1s linear infinite spin;
58
+ }
@@ -0,0 +1,81 @@
1
+ [role=banner] .coz-nav {
2
+ display: flex;
3
+ margin: 0;
4
+ padding: 0;
5
+ list-style-type: none;
6
+ position: relative;
7
+ }
8
+
9
+ @media (max-width: 48em) {
10
+ [role=banner] .coz-nav {
11
+ display: none;
12
+ }
13
+ }
14
+
15
+ [role=banner] [aria-controls][aria-busy]::after {
16
+ position: relative;
17
+ top: .12em;
18
+ margin: 0 .355em;
19
+ font-size: .875em;
20
+ }
21
+
22
+ [role=banner] [aria-controls][aria-busy=true] {
23
+ padding-right: 0;
24
+ }
25
+
26
+ [role=banner] .coz-nav [aria-controls][data-icon] {
27
+ padding-left: calc(1.25em + 16px + .5em);
28
+ background-position: 1em calc(50% - 1px);
29
+ }
30
+
31
+ /* POP */
32
+ [role=banner] .coz-nav-pop[aria-hidden=true] {
33
+ display: flex;
34
+ transform: scale(0);
35
+ opacity: 0;
36
+ transition: .2s transform ease-in, .1s opacity ease-in;
37
+ }
38
+
39
+ [role=banner] .coz-nav-pop {
40
+ position: absolute;
41
+ top: calc(100% - .25em);
42
+ box-sizing: border-box;
43
+ min-width: 100%;
44
+ max-height: calc(100vh - 4rem);
45
+ overflow-y: auto;
46
+ background-color: #fff;
47
+ border-radius: 8px;
48
+ border: solid 1px rgba(50, 54, 63, 0.12);
49
+ box-shadow: 0 1px 3px 0 rgba(50, 54, 63, 0.19), 0 6px 18px 0 rgba(50, 54, 63, 0.19);
50
+ opacity: 1;
51
+ transform: scale(1);
52
+ transform-origin: 80% 0%;
53
+ transition: .2s transform cubic-bezier(0.2, 0.75, 0.3, 1.15);
54
+ /* hide scrollbars */
55
+ -ms-overflow-style: none; /* IE 10+ */
56
+ }
57
+
58
+ [role=banner] .coz-nav-pop::-webkit-scrollbar {
59
+ display: none; /* Safari and Chrome */
60
+ }
61
+
62
+ [role=banner] .coz-nav-pop-content .coz-nav-group {
63
+ padding: 0;
64
+ margin: 0;
65
+ }
66
+
67
+ [role=banner] .coz-nav-pop-content .coz-nav-group:last-of-type {
68
+ border-radius: 0 0 8px 8px;
69
+ }
70
+
71
+ [role=banner] .coz-nav-pop-content .coz-nav-group:first-of-type {
72
+ border-radius: 8px 8px 0 0;
73
+ }
74
+
75
+ [role=banner] .coz-nav-pop .coz-nav-group {
76
+ border-bottom: solid 1px var(--silver);
77
+ }
78
+
79
+ [role=banner] .coz-nav-pop .coz-nav-group:last-child {
80
+ border: 0;
81
+ }
@@ -0,0 +1,39 @@
1
+ /* Force pointer on clickable elements*/
2
+ [role=banner] a[role=menuitem],
3
+ [role=banner] button[role=menuitem] {
4
+ cursor: pointer;
5
+ border-left: 4px solid transparent;
6
+ }
7
+
8
+ [role=banner] a[role=menuitem]:hover,
9
+ [role=banner] a[role=menuitem]:focus,
10
+ [role=banner] button[role=menuitem]:hover,
11
+ [role=banner] button[role=menuitem]:focus {
12
+ background-color: var(--paleGrey);
13
+ }
14
+
15
+ [role=banner] [role=menuitem][aria-busy=true]::after {
16
+ right: 1.5em;
17
+ top: .5em;
18
+ }
19
+
20
+ [role=banner] .coz-drawer-wrapper [role=menuitem][aria-busy=true]::after {
21
+ top: .8em;
22
+ }
23
+
24
+ /* nav group */
25
+
26
+ [role=banner] .coz-nav-group.coz-nav--error {
27
+ padding: 0.75em;
28
+ min-width: 20em;
29
+ }
30
+
31
+ /* Remove default margin for p elements */
32
+ [role=banner] a[role=menuitem] p.coz-label {
33
+ margin: 0;
34
+ }
35
+
36
+ [role=banner] div[role=menuitem]:not([data-icon]) {
37
+ margin: 0;
38
+ padding-left: 1.5em;
39
+ }
@@ -0,0 +1,158 @@
1
+ [role=banner] .coz-searchbar{
2
+ height: 100%;
3
+ display: flex;
4
+ justify-content: flex-start;
5
+ align-items: center;
6
+ flex-grow: 1;
7
+ padding: .3em .8em .3em .7em;
8
+ box-sizing: border-box;
9
+ position: relative;
10
+ }
11
+
12
+ [role=banner] .coz-searchbar-autosuggest-container{
13
+ position: relative;
14
+ width: 100%;
15
+ opacity: .4;
16
+ transition: all .2s ease-out;
17
+ }
18
+ [role=banner] .coz-searchbar-autosuggest-container.--focused{
19
+ opacity: 1;
20
+ }
21
+ [role=banner] .coz-searchbar-autosuggest-container:before{
22
+ content: '';
23
+ display: inline-block;
24
+ width: 1.6em;
25
+ height: 100%;
26
+ position: absolute;
27
+ left: 0;
28
+ top: 0;
29
+ background: url('~assets/icons/16/icon-magnifier-16.svg') .6em center no-repeat;
30
+ }
31
+ [role=banner] .coz-searchbar-autosuggest-container.--searching:before{
32
+ padding-left: .5em;
33
+ background: url('~assets/icons/spinner.svg') center no-repeat;
34
+ background-size: 1em;
35
+ animation: spin 1s linear infinite;
36
+ }
37
+
38
+ [role=banner] .coz-searchbar-autosuggest-input{
39
+ box-sizing: border-box;
40
+ width: 100%;
41
+ padding: .5em;
42
+ padding-left: 2em;
43
+ border-width: 1px;
44
+ border-style: solid;
45
+ border-color: transparent;
46
+ border-radius: 4px;
47
+ transition: all .2s ease-out;
48
+ }
49
+ [role=banner] .coz-searchbar-autosuggest-input:hover{
50
+ border-color: var(--silver);
51
+ }
52
+ [role=banner] .coz-searchbar-autosuggest-input:focus,
53
+ [role=banner] .coz-searchbar-autosuggest-input-focused{
54
+ outline: none;
55
+ border-color: var(--dodgerBlue);
56
+ }
57
+
58
+ [role=banner] .coz-searchbar-autosuggest-suggestions-container {
59
+ position: absolute;
60
+ top: 100%;
61
+ margin-top: 3px;
62
+ width: 100%;
63
+ max-height: em(170px);
64
+ overflow: auto;
65
+ border-width: 1px;
66
+ border-style: solid;
67
+ border-color: var(--silver);
68
+ border-radius: 4px;
69
+ background: white;
70
+ box-shadow: 0 1px 3px 0 rgba(50, 54, 63, 0.19), 0 6px 18px 0 rgba(50, 54, 63, 0.19);
71
+ display: none;
72
+ }
73
+
74
+ [role=banner] .coz-searchbar-autosuggest-suggestions-container--open {
75
+ display: block;
76
+ }
77
+
78
+ [role=banner] .coz-searchbar-autosuggest-status-container {
79
+ position: absolute;
80
+ top: 100%;
81
+ left: 0;
82
+ right: 0;
83
+ margin: -0.3em .8em .3em;
84
+ padding: .8em .5em;
85
+ max-height: em(170px);
86
+ overflow: auto;
87
+ border-width: 1px;
88
+ border-style: solid;
89
+ border-color: var(--silver);
90
+ border-radius: 4px;
91
+ background: white;
92
+ box-shadow: 0 1px 3px 0 rgba(50, 54, 63, 0.19), 0 6px 18px 0 rgba(50, 54, 63, 0.19);
93
+ }
94
+
95
+ [role=banner] .coz-searchbar-autosuggest-suggestions-list {
96
+ margin: 0;
97
+ padding: 0;
98
+ list-style: none;
99
+ }
100
+
101
+ [role=banner] .coz-searchbar-autosuggest-suggestions-list b {
102
+ font-weight: bolder;
103
+ color: var(--scienceBlue)
104
+ }
105
+
106
+ [role=banner] .coz-searchbar-autosuggest-suggestion {
107
+ padding: .8em .5em;
108
+ border-width: 0;
109
+ border-bottom-width: 1px;
110
+ border-style: solid;
111
+ border-color: var(--silver);
112
+ cursor: pointer;
113
+ }
114
+ [role=banner] .coz-searchbar-autosuggest-suggestion:last-child {
115
+ border-bottom-width: 0;
116
+ }
117
+
118
+ [role=banner] .coz-searchbar-autosuggest-suggestion-item {
119
+ display: flex;
120
+ flex-direction: row;
121
+ justify-content: flex-start;
122
+ align-items: center;
123
+ }
124
+
125
+ [role=banner] .coz-searchbar-autosuggest-suggestion-icon {
126
+ max-height: 2rem;
127
+ min-height: 2rem;
128
+ margin-right: 1rem;
129
+ }
130
+
131
+ [role=banner] .coz-searchbar-autosuggest-suggestion-content {
132
+ flex-grow: 1;
133
+ white-space: nowrap;
134
+ overflow: hidden;
135
+ text-overflow: ellipsis;
136
+ display: flex;
137
+ flex-direction: column;
138
+ }
139
+
140
+ [role=banner] .coz-searchbar-autosuggest-suggestion-subtitle {
141
+ color: var(--coolGrey);
142
+ }
143
+
144
+ [role=banner] .coz-searchbar-autosuggest-suggestion-highlighted {
145
+ background: var(--paleGrey);
146
+ box-shadow: inset 4px 0 0 0 var(--dodgerBlue);
147
+ }
148
+
149
+ [role=banner] .coz-searchbar-autosuggest-section-title {
150
+ padding: .5em;
151
+ font-size: .8em;
152
+ }
153
+
154
+ @media (max-width: 48em) {
155
+ [role=banner] .coz-searchbar{
156
+ display: none;
157
+ }
158
+ }
@@ -0,0 +1,44 @@
1
+ [role=banner] .coz-nav-settings-btn {
2
+ color: var(--slateGrey);
3
+ }
4
+ [role=banner] .coz-nav-settings-btn svg {
5
+ fill: var(--coolGrey);
6
+ }
7
+ [role=banner] .coz-nav-settings-btn:hover,
8
+ [role=banner] .coz-nav-settings-btn:focus {
9
+ background-color: var(--paleGrey);
10
+ box-shadow: inset 0 -1px 0 0 var(--silver);
11
+ color: var(--charcoalGrey);
12
+ }
13
+
14
+ [role=banner] .coz-nav-pop--settings {
15
+ right: 0;
16
+ }
17
+
18
+ [role=banner] .coz-nav-settings-item [role=menuitem] {
19
+ position: relative;
20
+ z-index: 0;
21
+ display: block;
22
+ box-sizing: border-box;
23
+ margin: 0;
24
+ width: 100%;
25
+ padding: .8em 1.5em .8em calc(1.5em + 16px + .5em);
26
+ border: none;
27
+ align-items: center;
28
+ background-position: 1.5em 50%;
29
+ background-color: transparent;
30
+ text-align: left;
31
+ font-size: 1rem;
32
+ font-weight: normal;
33
+ white-space: nowrap;
34
+ color: var(--charcoalGrey);
35
+ text-transform: none;
36
+ text-decoration: none;
37
+ outline: none;
38
+ }
39
+ [role=banner] .coz-nav-settings-item .coz-nav-settings-item-btn[role=menuitem] {
40
+ padding-left: 1.5rem;
41
+ }
42
+ [role=banner] .coz-nav-settings-item .coz-nav-settings-item-btn[role=menuitem] > span > span {
43
+ margin-right: auto;
44
+ }
@@ -0,0 +1,22 @@
1
+ [role=banner] [role=menuitem][data-icon=icon-storage] {
2
+ background-position: 1.5em calc(.8em + 1px);
3
+ }
4
+
5
+ [role=banner] .coz-nav-storage {
6
+ display: flex;
7
+ flex-direction: column;
8
+ align-items: left;
9
+ padding-top: .5em;
10
+ color: var(--coolGrey);
11
+ }
12
+
13
+ [role=banner] .coz-nav-storage-text {
14
+ margin: 0 0 .1em 0;
15
+ font-weight: normal;
16
+ font-size: .875em;
17
+ }
18
+
19
+ [role=banner] .cozy-nav-storage-bar {
20
+ height: .5em;
21
+ margin: .2em 0 .1em 0;
22
+ }
@@ -0,0 +1,20 @@
1
+ [role=banner] .coz-support-modal .coz-support-modal-content {
2
+ min-height: 8em;
3
+ }
4
+
5
+ [role=banner] .coz-support-modal .coz-support-intent-wrapper .coz-intent {
6
+ width: 100%;
7
+ height: 24em;
8
+ border: none;
9
+ }
10
+
11
+ [role=banner] .coz-support-modal .coz-support-modal-close {
12
+ margin-top: .7rem;
13
+ margin-right: 1rem;
14
+ }
15
+
16
+ @media (max-width: 48em) {
17
+ [role=banner] .coz-support-modal .coz-support-intent-wrapper .coz-intent {
18
+ height: 27em;
19
+ }
20
+ }
@@ -0,0 +1,25 @@
1
+
2
+ [role=banner] .coz-bar-wrapper
3
+ box-shadow inset 0 -1px 0 0 var(--silver)
4
+ --cozBarThemePrimaryColor var(--primaryColor)
5
+ --cozBarThemePrimaryContrastTextColor var(--primaryContrastTextColor)
6
+
7
+ .coz-nav-apps-btns
8
+ color var(--slateGrey)
9
+
10
+ .coz-bar-burger
11
+ color var(--coolGrey)
12
+
13
+ @media (max-width: 64em)
14
+ [role=banner] .coz-bar-wrapper
15
+ background-color var(--white)
16
+
17
+ @media (max-width: 48em)
18
+ [role=banner] .coz-bar-wrapper
19
+ &.coz-theme-primary
20
+ box-shadow inherit
21
+ background-color var(--cozBarThemePrimaryColor)
22
+
23
+ .coz-nav-apps-btns,
24
+ .coz-bar-burger
25
+ color var(--cozBarThemePrimaryContrastTextColor)
@@ -0,0 +1,3 @@
1
+ 'use strict'
2
+
3
+ module.exports = 'test-file-stub'
@@ -0,0 +1,41 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`The bar library should render correctly the cozy-bar 1`] = `
4
+ <Provider
5
+ store={
6
+ BarStore {
7
+ "claudyActions": null,
8
+ "helpLink": "",
9
+ "settingsAppURL": "",
10
+ "settingsData": null,
11
+ }
12
+ }
13
+ >
14
+ <Provider
15
+ store={
16
+ Object {
17
+ "dispatch": [Function],
18
+ "getState": [Function],
19
+ "replaceReducer": [Function],
20
+ "subscribe": [Function],
21
+ Symbol(Symbol.observable): [Function],
22
+ }
23
+ }
24
+ >
25
+ <Connect(I18n)
26
+ dictRequire={[Function]}
27
+ >
28
+ <Wrapper
29
+ appName="test-app"
30
+ appNamePrefix="cozy"
31
+ iconPath=""
32
+ isPublic={false}
33
+ onDrawer={[Function]}
34
+ onLogOut={undefined}
35
+ replaceTitleOnMobile={false}
36
+ userActionRequired={undefined}
37
+ />
38
+ </Connect(I18n)>
39
+ </Provider>
40
+ </Provider>
41
+ `;
@@ -0,0 +1,113 @@
1
+ import React from 'react'
2
+ import { AppItem } from 'components/Apps/AppItem'
3
+ import { mount, shallow } from 'enzyme'
4
+ import { tMock } from '../jestLib/I18n'
5
+ import { isMobileApp, isMobile } from 'cozy-device-helper'
6
+
7
+ jest.useFakeTimers()
8
+
9
+ jest.mock('cozy-device-helper', () => ({
10
+ ...require.requireActual('cozy-device-helper'),
11
+ isMobileApp: jest.fn(),
12
+ isMobile: jest.fn(),
13
+ openDeeplinkOrRedirect: jest.fn()
14
+ }))
15
+
16
+ jest.mock('lib/stack', () => ({
17
+ get: {
18
+ iconProps: () => {
19
+ const { isMobileApp } = require('cozy-device-helper')
20
+ return isMobileApp()
21
+ ? {
22
+ fetchIcon: jest.fn().mockResolvedValue('http://urlOfIcon')
23
+ }
24
+ : {
25
+ // we mustn't give the protocol here
26
+ domain: 'cozy.tools',
27
+ secure: true
28
+ }
29
+ }
30
+ }
31
+ }))
32
+ const defaultApp = {
33
+ slug: 'cozy-drive',
34
+ name: 'Drive',
35
+ href: 'http://fake.fr'
36
+ }
37
+
38
+ describe('AppItem', () => {
39
+ const setup = ({ app } = {}) => {
40
+ const wrapper = shallow(<AppItem app={app || defaultApp} t={tMock} />)
41
+ return { wrapper }
42
+ }
43
+
44
+ afterEach(() => {
45
+ jest.restoreAllMocks()
46
+ })
47
+
48
+ describe('buildAppUrl', () => {
49
+ it('should return untouched href', () => {
50
+ const { wrapper } = setup()
51
+ const url = wrapper.instance().buildAppUrl('http://fake.fr')
52
+ expect(url).toBe('http://fake.fr/')
53
+ })
54
+
55
+ it('should update query string', () => {
56
+ jest.spyOn(AppItem, 'buildQueryParams').mockReturnValue({
57
+ foo: 'bar',
58
+ bar: 'buz'
59
+ })
60
+
61
+ const { wrapper } = setup()
62
+ const url = wrapper.instance().buildAppUrl('http://fake.fr')
63
+ expect(url).toBe('http://fake.fr/?foo=bar&bar=buz')
64
+ })
65
+
66
+ it('should return null for invalid url', () => {
67
+ jest.spyOn(console, 'error').mockImplementation(() => {})
68
+
69
+ const invalidApp = {
70
+ name: 'Invalid app',
71
+ url: 'Clearly not an url',
72
+ slug: 'invalid-app'
73
+ }
74
+ const { wrapper } = setup({ app: invalidApp })
75
+ const appLinkerWrapper = wrapper.find('AppLinker')
76
+ expect(appLinkerWrapper.props().href).toEqual('')
77
+ })
78
+ })
79
+ })
80
+
81
+ describe('app icon', () => {
82
+ let spyConsoleError
83
+
84
+ beforeEach(() => {
85
+ spyConsoleError = jest.spyOn(console, 'error')
86
+
87
+ isMobileApp.mockReturnValue(false)
88
+ isMobile.mockReturnValue(false)
89
+ })
90
+
91
+ afterEach(() => {
92
+ spyConsoleError.mockRestore()
93
+ })
94
+
95
+ const setup = () => {
96
+ const root = mount(<AppItem t={tMock} app={defaultApp} />)
97
+ return { root }
98
+ }
99
+
100
+ it('should render correctly', () => {
101
+ const { root } = setup()
102
+ const appIcon = root.find('AppIcon')
103
+ expect(appIcon.props().className).toContain('coz-nav-apps-item-icon')
104
+ })
105
+
106
+ it('should render correctly with target mobile and providing fetchIcon to AppIcon', () => {
107
+ isMobileApp.mockReturnValue(true)
108
+ const { root } = setup()
109
+ const appIcon = root.find('AppIcon')
110
+ expect(appIcon.props().className).toContain('coz-nav-apps-item-icon')
111
+ expect(appIcon.props().fetchIcon).not.toBe(undefined)
112
+ })
113
+ })