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.
- package/.eslintrc.json +7 -0
- package/.github/auto-merge.yml +7 -0
- package/.nvmrc +1 -0
- package/.transifexrc.tpl +4 -0
- package/.travis.yml +28 -0
- package/.tx/config +8 -0
- package/CHANGELOG.md +493 -0
- package/CODEOWNERS +2 -0
- package/CONTRIBUTING.md +135 -0
- package/LICENSE +21 -0
- package/README.md +172 -0
- package/babel.config.js +3 -0
- package/config/aliases/globalReact.js +1 -0
- package/config/aliases/globalReactDOM.js +1 -0
- package/config/webpack.config.analyzer.js +10 -0
- package/config/webpack.config.base.js +61 -0
- package/config/webpack.config.dev.js +16 -0
- package/config/webpack.config.extract.js +84 -0
- package/config/webpack.config.inline-styles.js +82 -0
- package/config/webpack.config.jsx.js +14 -0
- package/config/webpack.config.prod.js +18 -0
- package/config/webpack.js +31 -0
- package/config/webpack.vars.js +11 -0
- package/dist/cozy-bar.css +9445 -0
- package/dist/cozy-bar.css.map +1 -0
- package/dist/cozy-bar.js +122668 -0
- package/dist/cozy-bar.js.map +1 -0
- package/dist/cozy-bar.min.css +9 -0
- package/dist/cozy-bar.min.css.map +1 -0
- package/dist/cozy-bar.min.js +57 -0
- package/dist/cozy-bar.min.js.map +1 -0
- package/dist/cozy-bar.mobile.js +123719 -0
- package/dist/cozy-bar.mobile.js.map +1 -0
- package/dist/cozy-bar.mobile.min.js +57 -0
- package/dist/cozy-bar.mobile.min.js.map +1 -0
- package/docs/dev.md +20 -0
- package/examples/Procfile +3 -0
- package/examples/icon.png +0 -0
- package/examples/index.html +7 -0
- package/examples/index.jsx +122 -0
- package/examples/logs.js +3 -0
- package/package.json +163 -0
- package/postcss.config.js +23 -0
- package/public/fonts/Lato-Bold.woff2 +0 -0
- package/public/fonts/Lato-Regular.woff2 +0 -0
- package/public/fonts.css +13 -0
- package/public/icon-type-folder-32.png +0 -0
- package/public/index.html +63 -0
- package/renovate.json +5 -0
- package/src/assets/icons/16/icon-claudy.svg +5 -0
- package/src/assets/icons/16/icon-cozy-16.svg +1 -0
- package/src/assets/icons/16/icon-cube-16.svg +6 -0
- package/src/assets/icons/16/icon-logout-16.svg +3 -0
- package/src/assets/icons/16/icon-magnifier-16.svg +6 -0
- package/src/assets/icons/16/icon-people-16.svg +3 -0
- package/src/assets/icons/16/icon-phone-16.svg +3 -0
- package/src/assets/icons/16/icon-question-mark-16.svg +3 -0
- package/src/assets/icons/16/icon-storage-16.svg +3 -0
- package/src/assets/icons/24/icon-arrow-left.svg +3 -0
- package/src/assets/icons/32/icon-claudy.svg +1 -0
- package/src/assets/icons/apps/icon-collect.svg +25 -0
- package/src/assets/icons/apps/icon-drive.svg +17 -0
- package/src/assets/icons/apps/icon-market-soon.svg +25 -0
- package/src/assets/icons/apps/icon-photos.svg +19 -0
- package/src/assets/icons/apps/icon-soon.svg +21 -0
- package/src/assets/icons/apps/icon-store.svg +19 -0
- package/src/assets/icons/claudyActions/icon-bills.svg +6 -0
- package/src/assets/icons/claudyActions/icon-laptop.svg +7 -0
- package/src/assets/icons/claudyActions/icon-phone.svg +8 -0
- package/src/assets/icons/claudyActions/icon-question-mark.svg +6 -0
- package/src/assets/icons/comingsoon/icon-bank.svg +12 -0
- package/src/assets/icons/comingsoon/icon-sante.svg +12 -0
- package/src/assets/icons/comingsoon/icon-store.svg +6 -0
- package/src/assets/icons/icon-cozy.svg +3 -0
- package/src/assets/icons/icon-shield.svg +3 -0
- package/src/assets/icons/spinner.svg +4 -0
- package/src/assets/sprites/icon-apps.svg +1 -0
- package/src/assets/sprites/icon-cozy-home.svg +16 -0
- package/src/components/Apps/AppItem.jsx +117 -0
- package/src/components/Apps/AppItemPlaceholder.jsx +12 -0
- package/src/components/Apps/AppNavButtons.jsx +88 -0
- package/src/components/Apps/AppsContent.jsx +89 -0
- package/src/components/Apps/ButtonCozyHome.jsx +30 -0
- package/src/components/Apps/ButtonCozyHome.spec.jsx +53 -0
- package/src/components/Apps/IconCozyHome.jsx +24 -0
- package/src/components/Apps/index.jsx +81 -0
- package/src/components/Banner.jsx +41 -0
- package/src/components/Bar.jsx +293 -0
- package/src/components/Bar.spec.jsx +133 -0
- package/src/components/Claudy.jsx +81 -0
- package/src/components/Drawer.jsx +227 -0
- package/src/components/Drawer.spec.jsx +98 -0
- package/src/components/SearchBar.jsx +358 -0
- package/src/components/Settings/SettingsContent.jsx +145 -0
- package/src/components/Settings/StorageData.jsx +29 -0
- package/src/components/Settings/helper.js +8 -0
- package/src/components/Settings/index.jsx +218 -0
- package/src/components/SupportModal.jsx +59 -0
- package/src/components/__snapshots__/Bar.spec.jsx.snap +302 -0
- package/src/config/claudyActions.yaml +14 -0
- package/src/config/persistWhitelist.yaml +2 -0
- package/src/dom.js +80 -0
- package/src/index.jsx +235 -0
- package/src/index.spec.jsx +34 -0
- package/src/lib/api/helpers.js +13 -0
- package/src/lib/api/index.jsx +145 -0
- package/src/lib/exceptions.js +89 -0
- package/src/lib/expiringMemoize.js +13 -0
- package/src/lib/icon.js +77 -0
- package/src/lib/importIcons.js +14 -0
- package/src/lib/intents.js +16 -0
- package/src/lib/logger.js +6 -0
- package/src/lib/middlewares/appsI18n.js +57 -0
- package/src/lib/realtime.js +43 -0
- package/src/lib/reducers/apps.js +175 -0
- package/src/lib/reducers/apps.spec.js +59 -0
- package/src/lib/reducers/content.js +50 -0
- package/src/lib/reducers/context.js +83 -0
- package/src/lib/reducers/index.js +73 -0
- package/src/lib/reducers/locale.js +22 -0
- package/src/lib/reducers/settings.js +111 -0
- package/src/lib/reducers/theme.js +48 -0
- package/src/lib/reducers/unserializable.js +26 -0
- package/src/lib/stack-client.js +401 -0
- package/src/lib/stack.js +79 -0
- package/src/lib/store/index.js +54 -0
- package/src/locales/de.json +57 -0
- package/src/locales/en.json +57 -0
- package/src/locales/es.json +57 -0
- package/src/locales/fr.json +57 -0
- package/src/locales/it.json +57 -0
- package/src/locales/ja.json +57 -0
- package/src/locales/nl_NL.json +57 -0
- package/src/locales/pl.json +57 -0
- package/src/locales/ru.json +57 -0
- package/src/locales/sq.json +57 -0
- package/src/locales/zh_CN.json +57 -0
- package/src/proptypes/index.js +10 -0
- package/src/queries/index.js +16 -0
- package/src/styles/apps.css +248 -0
- package/src/styles/banner.css +64 -0
- package/src/styles/bar.css +106 -0
- package/src/styles/base.css +41 -0
- package/src/styles/claudy.css +99 -0
- package/src/styles/drawer.css +126 -0
- package/src/styles/index.styl +33 -0
- package/src/styles/indicators.css +58 -0
- package/src/styles/nav.css +81 -0
- package/src/styles/navigation_item.css +39 -0
- package/src/styles/searchbar.css +158 -0
- package/src/styles/settings.css +44 -0
- package/src/styles/storage.css +22 -0
- package/src/styles/supportModal.css +20 -0
- package/src/styles/theme.styl +25 -0
- package/test/__mocks__/fileMock.js +3 -0
- package/test/__snapshots__/index.spec.js.snap +41 -0
- package/test/components/AppItem.spec.jsx +113 -0
- package/test/components/AppsContent.spec.jsx +116 -0
- package/test/components/Settings/helper.spec.js +23 -0
- package/test/components/__snapshots__/AppsContent.spec.jsx.snap +90 -0
- package/test/index.spec.js +24 -0
- package/test/jestLib/I18n.js +15 -0
- package/test/jestLib/setup.js +14 -0
- package/test/lib/__snapshots__/api.spec.jsx.snap +67 -0
- package/test/lib/__snapshots__/stack.spec.js.snap +3 -0
- package/test/lib/api.spec.jsx +142 -0
- package/test/lib/mockStackClient.js +7 -0
- package/test/lib/stack-client/stack-client.appiconprops.spec.js +65 -0
- package/test/lib/stack-client/stack-client.compare.spec.js +20 -0
- package/test/lib/stack-client/stack-client.cozyfetchjson.spec.js +46 -0
- package/test/lib/stack-client/stack-client.cozyurl.spec.js +29 -0
- package/test/lib/stack-client/stack-client.getapp.spec.js +72 -0
- package/test/lib/stack-client/stack-client.getapps.spec.js +72 -0
- package/test/lib/stack-client/stack-client.getcontext.spec.js +96 -0
- package/test/lib/stack-client/stack-client.getstoragedata.spec.js +85 -0
- package/test/lib/stack-client/stack-client.init.spec.js +56 -0
- package/test/lib/stack-client/stack-client.intents.spec.js +27 -0
- package/test/lib/stack-client/stack-client.logout.spec.js +40 -0
- package/test/lib/stack.spec.js +60 -0
- package/test/store/__snapshots__/index.spec.js.snap +14 -0
- 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,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
|
+
})
|