Compare commits
734 commits
production
...
main
Author | SHA1 | Date | |
---|---|---|---|
![]() |
aca51cc11c | ||
![]() |
b684ce7016 | ||
![]() |
115d411218 | ||
![]() |
aec2aa5fb0 | ||
![]() |
69ee83bbf6 | ||
![]() |
9434147b48 | ||
![]() |
d82341ce4a | ||
![]() |
60a6666222 | ||
![]() |
f1a24ed6fb | ||
![]() |
0372abdc33 | ||
![]() |
366a50c8b6 | ||
![]() |
e96b275e02 | ||
![]() |
65243e2c06 | ||
![]() |
ab3e1ce4d8 | ||
![]() |
5194fcad0e | ||
![]() |
b6a1bff9e8 | ||
![]() |
5ae2047b2c | ||
![]() |
a60f5bb1be | ||
![]() |
c8c4e0f0c5 | ||
![]() |
037a804725 | ||
![]() |
6fcb828e1d | ||
![]() |
aa9bb41305 | ||
![]() |
546ee7a098 | ||
![]() |
d8cff7ca41 | ||
![]() |
e6e7d5178e | ||
![]() |
7767bb0c58 | ||
![]() |
580fb5234b | ||
![]() |
8edcb1587d | ||
![]() |
97891f61b0 | ||
![]() |
51ead29d2b | ||
![]() |
a53eb64c03 | ||
![]() |
c644a60e46 | ||
![]() |
2cd38299e2 | ||
![]() |
077c7e08c8 | ||
![]() |
6bde0a78d7 | ||
![]() |
3debe8a36f | ||
![]() |
606e08d2b7 | ||
![]() |
f9f5daf8f4 | ||
![]() |
ffbb740445 | ||
![]() |
cd343ab8c3 | ||
![]() |
1537e9f6f2 | ||
![]() |
f94c00b68a | ||
![]() |
0acc48af48 | ||
![]() |
cb96bf385b | ||
![]() |
6fd2b70032 | ||
![]() |
f5aec9cb5a | ||
![]() |
9469ed424e | ||
![]() |
7305b54635 | ||
![]() |
018b458ef6 | ||
![]() |
6573123af5 | ||
![]() |
4a9bc37a46 | ||
![]() |
59e951e5d2 | ||
![]() |
4d4851d058 | ||
![]() |
dd574bbe99 | ||
![]() |
6374a28932 | ||
![]() |
6a9afcf266 | ||
![]() |
bea1cdcf87 | ||
![]() |
3779f86088 | ||
![]() |
bb24647ff3 | ||
![]() |
60466258b8 | ||
![]() |
dd4020069c | ||
![]() |
60b40a2d9f | ||
![]() |
1142c73812 | ||
![]() |
f20688c453 | ||
![]() |
f85d75188a | ||
![]() |
dae7d92595 | ||
![]() |
ef10307898 | ||
![]() |
b29ba2094e | ||
![]() |
f7e9deebda | ||
![]() |
473495ec0c | ||
![]() |
38cdf0a98c | ||
![]() |
69bfac12de | ||
![]() |
2dfd1ee4bb | ||
![]() |
37e0caec25 | ||
![]() |
2894de1127 | ||
![]() |
e71cd19883 | ||
![]() |
caa52cebf4 | ||
![]() |
0bcac2a741 | ||
![]() |
1445c9c3db | ||
![]() |
e2628a20ac | ||
![]() |
a30499ecfd | ||
![]() |
c948a9501d | ||
![]() |
a91c6b09a9 | ||
![]() |
0b2347834c | ||
![]() |
d5e14aa628 | ||
![]() |
95f598c25c | ||
![]() |
16a6e21bc5 | ||
![]() |
781b1caeb5 | ||
![]() |
c9786f28da | ||
![]() |
2196098512 | ||
![]() |
31e1f4478d | ||
![]() |
12fab97d62 | ||
![]() |
e45883d6bc | ||
![]() |
6594a061d6 | ||
![]() |
65a36ee5be | ||
![]() |
00fd9b7aab | ||
![]() |
4d1acc1d8e | ||
![]() |
2f99ec4613 | ||
![]() |
0070f9c942 | ||
![]() |
00beddc4cd | ||
![]() |
8e7d9f7574 | ||
![]() |
06c897583b | ||
![]() |
f41139402e | ||
![]() |
c4b0823526 | ||
![]() |
5ccf55cbd1 | ||
![]() |
7256456463 | ||
![]() |
035450ae96 | ||
![]() |
a7aaacd82c | ||
![]() |
638524ad67 | ||
![]() |
4e91a86072 | ||
![]() |
9597c1bdab | ||
![]() |
441f6c6c34 | ||
![]() |
80970dbe02 | ||
![]() |
e8baa00935 | ||
![]() |
d642f132fc | ||
![]() |
233c2a5498 | ||
![]() |
54a2254763 | ||
![]() |
3d5785df4b | ||
![]() |
4508c940ae | ||
![]() |
222d4e7d37 | ||
![]() |
b69b839fa4 | ||
![]() |
47062d2bea | ||
![]() |
12dd2ee05c | ||
![]() |
8dcb561468 | ||
![]() |
2f32c915a9 | ||
![]() |
7dee05ec1f | ||
![]() |
e5fa98d69e | ||
![]() |
ee3ead965f | ||
![]() |
b66e0fa6a3 | ||
![]() |
78423a17af | ||
![]() |
6b02da4dc1 | ||
![]() |
ecaee4bcf9 | ||
![]() |
a399f8452b | ||
![]() |
76d5b36563 | ||
![]() |
bf31fa9196 | ||
![]() |
66b90006bd | ||
![]() |
c64df9f260 | ||
![]() |
af73c1a401 | ||
![]() |
a55f7411f8 | ||
![]() |
27401a5678 | ||
![]() |
73e690a559 | ||
![]() |
cdc014e3ee | ||
![]() |
352131a8f9 | ||
![]() |
da942a8def | ||
![]() |
ce63dc2f6b | ||
![]() |
adeab46229 | ||
![]() |
e47b26698f | ||
![]() |
aaef0fd4a6 | ||
![]() |
931e0a4c13 | ||
![]() |
873ba0ab09 | ||
![]() |
beb6a40231 | ||
![]() |
a8f22944b9 | ||
![]() |
d6c6ce6e67 | ||
![]() |
ba5c58ccbb | ||
![]() |
fd1200fcfe | ||
![]() |
847fba26a9 | ||
![]() |
d4e9502e94 | ||
![]() |
5d7b970f1c | ||
![]() |
0b869a139a | ||
![]() |
0ef50dd2f0 | ||
![]() |
26457f4c3f | ||
![]() |
d4291c5e0d | ||
![]() |
e6a2e34740 | ||
![]() |
7af82ad54d | ||
![]() |
338bd1e6ac | ||
![]() |
a9e3014652 | ||
![]() |
cdd8ebc66a | ||
![]() |
916151482c | ||
![]() |
e013fae815 | ||
![]() |
a3e978338a | ||
![]() |
81258abfa8 | ||
![]() |
e4a7658a33 | ||
![]() |
8e68707706 | ||
![]() |
83b7f5819b | ||
![]() |
e8ca2065b1 | ||
![]() |
1fe887bab3 | ||
![]() |
6ba77014bc | ||
![]() |
6a1723b415 | ||
![]() |
cb31410dd9 | ||
![]() |
53e9d24d40 | ||
![]() |
3df8750c6c | ||
![]() |
3b00ade521 | ||
![]() |
19600a6f2d | ||
![]() |
f4df97f9b0 | ||
![]() |
4651126fc1 | ||
![]() |
f544f41145 | ||
![]() |
478a6dbdc5 | ||
![]() |
e87be3df2a | ||
![]() |
cbcae353a3 | ||
![]() |
29d586353c | ||
![]() |
c91409646a | ||
![]() |
2361fc7899 | ||
![]() |
dc7b5ca396 | ||
![]() |
1f5245b0bc | ||
![]() |
8e51ea0134 | ||
![]() |
567a284196 | ||
![]() |
2fbb3e0087 | ||
![]() |
396411f8b3 | ||
![]() |
3c3b5ae705 | ||
![]() |
07d7b0cad4 | ||
![]() |
ca861e2727 | ||
![]() |
c146a0bd11 | ||
![]() |
1b165aebb5 | ||
![]() |
ed63f18cf1 | ||
![]() |
5a2e631ed3 | ||
![]() |
ef662cdc72 | ||
![]() |
66359941bf | ||
![]() |
09d9b05a93 | ||
![]() |
e3772b28b9 | ||
![]() |
9aeb80e6ab | ||
![]() |
aae1fc0016 | ||
![]() |
64cf810c30 | ||
![]() |
8bde28a4ac | ||
![]() |
ac98046a65 | ||
![]() |
cd8e1ea0f7 | ||
![]() |
80393ceb04 | ||
![]() |
31d48bf6dc | ||
![]() |
e6b93e216b | ||
![]() |
fbba53a8cb | ||
![]() |
9c2e5f8c7d | ||
![]() |
8933edb93a | ||
![]() |
ea569184e1 | ||
![]() |
a3766ffcc3 | ||
![]() |
0343c8cc00 | ||
![]() |
b50f3d3d9e | ||
![]() |
cffad0c8ad | ||
![]() |
b8025f7666 | ||
![]() |
78cbe72bbc | ||
![]() |
06dbe62c82 | ||
![]() |
d51e4cf165 | ||
![]() |
cb30ac0bbc | ||
![]() |
4c898f7d91 | ||
![]() |
b9f69e2b99 | ||
![]() |
bfde6d73e9 | ||
![]() |
8c444713df | ||
![]() |
7aeffa2ea9 | ||
![]() |
f723089308 | ||
![]() |
fca6e9d97e | ||
![]() |
7be7bb2b22 | ||
![]() |
d1b24d25ce | ||
![]() |
b930b4cf46 | ||
![]() |
fb4f11d8b0 | ||
![]() |
e5cb1858a1 | ||
![]() |
d361ca9266 | ||
![]() |
f69b5597a8 | ||
![]() |
6cc85beaa6 | ||
![]() |
d305add826 | ||
![]() |
d7250fcb1f | ||
![]() |
0009a9e964 | ||
![]() |
6bc671d645 | ||
![]() |
65cbdfac1b | ||
![]() |
83687f6324 | ||
![]() |
ccf0a0ba9f | ||
![]() |
5c12e58cd7 | ||
![]() |
8c97ea2fa2 | ||
![]() |
d697b42a28 | ||
![]() |
82e8643a4f | ||
![]() |
b75c055e9e | ||
![]() |
b9d14baa16 | ||
![]() |
9de8cbfbb9 | ||
![]() |
1d608f599b | ||
![]() |
f7202d699f | ||
![]() |
33d31ad8c3 | ||
![]() |
06b6832cbb | ||
![]() |
6d7b30d73d | ||
![]() |
e830a5bcd8 | ||
![]() |
1b3f9f2e48 | ||
![]() |
d65ccc21f5 | ||
![]() |
21622c9490 | ||
![]() |
399bed93bd | ||
![]() |
a5d29b9992 | ||
![]() |
f9ddd0f0a4 | ||
![]() |
b552d41772 | ||
![]() |
96bd0f4b4e | ||
![]() |
3572bebbd9 | ||
![]() |
37ed2455eb | ||
![]() |
ec933cf730 | ||
![]() |
9cf2d765aa | ||
![]() |
2f6e49bec0 | ||
![]() |
0a772c8f04 | ||
![]() |
91b0b4519e | ||
![]() |
1c0f2d8c5c | ||
![]() |
de80fe9050 | ||
![]() |
5e84b79a43 | ||
![]() |
a2b8edaba5 | ||
![]() |
83b2606e58 | ||
![]() |
1be28e4e0f | ||
![]() |
98e3412d68 | ||
![]() |
34be1a19be | ||
![]() |
6168275e17 | ||
![]() |
8a8f5572fc | ||
![]() |
10b2662480 | ||
![]() |
eaa753c944 | ||
![]() |
9c7f2cdfba | ||
![]() |
b0811049b1 | ||
![]() |
f87dc359f5 | ||
![]() |
97d69e263d | ||
![]() |
05dc48eac2 | ||
![]() |
50f5ebfcff | ||
![]() |
0b760ce465 | ||
![]() |
bedebb7c0e | ||
![]() |
9447792e53 | ||
![]() |
8512794b43 | ||
![]() |
081ea0bedb | ||
![]() |
d2c00a10cf | ||
![]() |
56b85a8cdd | ||
![]() |
4e4ed390e0 | ||
![]() |
86edd8c8a2 | ||
![]() |
4b56a2f0bb | ||
![]() |
ff3c31637c | ||
![]() |
9c80f19f2f | ||
![]() |
66be5e288d | ||
![]() |
7ebed4521d | ||
![]() |
68b1b2fe37 | ||
![]() |
89719f7243 | ||
![]() |
4d76c937fe | ||
![]() |
649110ed45 | ||
![]() |
f4bcd30434 | ||
![]() |
c2ff3f00f2 | ||
![]() |
6494b98157 | ||
![]() |
c371cd11d0 | ||
![]() |
1b22753811 | ||
![]() |
e7af96b625 | ||
![]() |
0c04b83207 | ||
![]() |
6b73cee79e | ||
![]() |
d7688cb1f5 | ||
![]() |
c03df9d246 | ||
![]() |
a1d01f8ff2 | ||
![]() |
a457c60f32 | ||
![]() |
63996ce416 | ||
![]() |
3247f3dc7d | ||
![]() |
f0afc0da36 | ||
![]() |
fc070b2d0d | ||
![]() |
899476e81a | ||
![]() |
518f1cca89 | ||
![]() |
997fe4db12 | ||
![]() |
a5f6f8381a | ||
![]() |
46d76dfaa3 | ||
![]() |
00a1ce9dca | ||
![]() |
b6f3c15999 | ||
![]() |
024fb03c33 | ||
![]() |
de8d0b28ea | ||
![]() |
8cffccccce | ||
![]() |
7f31a92ede | ||
![]() |
b47291ae87 | ||
![]() |
8de231f5e9 | ||
![]() |
a10d222ce7 | ||
![]() |
487befda65 | ||
![]() |
28222e510f | ||
![]() |
a2a11d053b | ||
![]() |
5e99af0993 | ||
![]() |
94885de85b | ||
![]() |
bcd3aaeb92 | ||
![]() |
d0f7fc35a4 | ||
![]() |
682d877960 | ||
![]() |
d901ba9067 | ||
![]() |
b47844b43a | ||
![]() |
765a0eb727 | ||
![]() |
3b97e2722f | ||
![]() |
f4a087d0ed | ||
![]() |
52749ee1f0 | ||
![]() |
642553a341 | ||
![]() |
9c80781e3f | ||
![]() |
8ef0a6f9f1 | ||
![]() |
412aba0c8b | ||
![]() |
532abbf032 | ||
![]() |
d8f99ada77 | ||
![]() |
35cf2c95d4 | ||
![]() |
19e694d8eb | ||
![]() |
2ed9eaee8a | ||
![]() |
c03c3c118c | ||
![]() |
8654aefd85 | ||
![]() |
7f91096311 | ||
![]() |
ef66bee929 | ||
![]() |
707cec56c5 | ||
![]() |
8ef5cbd81b | ||
![]() |
0290eb1d56 | ||
![]() |
50f5d92d41 | ||
![]() |
807435ca4b | ||
![]() |
2679c4e15f | ||
![]() |
6bb3acbe5a | ||
![]() |
694b0f7b47 | ||
![]() |
db46e71516 | ||
![]() |
486072bef8 | ||
![]() |
a33e358de8 | ||
![]() |
a7f62b13fa | ||
![]() |
4f1e49bf69 | ||
![]() |
55f940d372 | ||
![]() |
8d8d7f2a8e | ||
![]() |
9d151f0033 | ||
![]() |
fe62ee3abb | ||
![]() |
18ed7237f0 | ||
![]() |
b9084a9990 | ||
![]() |
6abeb976c6 | ||
![]() |
33b40ce938 | ||
![]() |
d050701343 | ||
![]() |
1870ce08bc | ||
![]() |
fbba6beee2 | ||
![]() |
97d4c46a4e | ||
![]() |
0cbc9879bb | ||
![]() |
ae1f80b8b5 | ||
![]() |
358551feda | ||
![]() |
ca98b56ad7 | ||
![]() |
5bbf902b47 | ||
![]() |
d654810d41 | ||
![]() |
8172f291dd | ||
![]() |
9e12014c07 | ||
![]() |
da79841201 | ||
![]() |
00ace352e8 | ||
![]() |
8cdfe0191f | ||
![]() |
f56f9b0ea8 | ||
![]() |
4bc6fad83a | ||
![]() |
beb027f1a1 | ||
![]() |
06b43c47c0 | ||
![]() |
7ed5085f10 | ||
![]() |
c300751958 | ||
![]() |
e6f5bf76c2 | ||
![]() |
88d8edce7e | ||
![]() |
419be23c9c | ||
![]() |
405e605ba3 | ||
![]() |
d7b1e7274f | ||
![]() |
53baee1d5c | ||
![]() |
0447e54b1c | ||
![]() |
5b8cfa14ae | ||
![]() |
d35712e9f9 | ||
![]() |
f981200921 | ||
![]() |
85c403bef5 | ||
![]() |
4bd412aa9b | ||
![]() |
268c638508 | ||
![]() |
61b5c2e4b2 | ||
![]() |
3aa2902cde | ||
![]() |
d7b66eca52 | ||
![]() |
361e49d553 | ||
![]() |
60bfdffdd6 | ||
![]() |
d7c0a3d9e1 | ||
![]() |
a7d3d6d848 | ||
![]() |
26028cac20 | ||
![]() |
33909d147a | ||
![]() |
10d08f2ac9 | ||
![]() |
5ae7a395a1 | ||
![]() |
9de6df6157 | ||
![]() |
6184dbb656 | ||
![]() |
34180aa2d5 | ||
![]() |
3a7744b41b | ||
![]() |
53f7dc4915 | ||
![]() |
53a901d023 | ||
![]() |
c522d36a66 | ||
![]() |
f7b20f97b8 | ||
![]() |
d033292784 | ||
![]() |
26cd3c3cc8 | ||
![]() |
be3904cee8 | ||
![]() |
0252f9d1c3 | ||
![]() |
19dce3ba45 | ||
![]() |
0bdf8558f6 | ||
![]() |
0e45f06338 | ||
![]() |
063b7509bd | ||
![]() |
136aa3ce0e | ||
![]() |
a7f6659204 | ||
![]() |
f4024bba66 | ||
![]() |
e65c88cde2 | ||
![]() |
27225df281 | ||
![]() |
88e32fc72f | ||
![]() |
d61ea16db1 | ||
![]() |
adc1f5ffe6 | ||
![]() |
e8f8123c4c | ||
![]() |
9788e159ae | ||
![]() |
d98d0f1697 | ||
![]() |
efb83255fd | ||
![]() |
f5993add6f | ||
![]() |
24c960bed0 | ||
![]() |
dc9e8f6399 | ||
![]() |
e37440720f | ||
![]() |
703a7cd3c2 | ||
![]() |
5eb79949e9 | ||
![]() |
77fd843b3d | ||
![]() |
96ab4685e9 | ||
![]() |
426e81b88b | ||
![]() |
3c2dda5100 | ||
![]() |
fca5caaa00 | ||
![]() |
b0661f79aa | ||
![]() |
e44fcdf606 | ||
![]() |
645fb6832c | ||
![]() |
f653b5420f | ||
![]() |
f159e42029 | ||
![]() |
a8aafc7064 | ||
![]() |
3284bfd7f3 | ||
![]() |
da24febe6e | ||
![]() |
3e5334e9b0 | ||
![]() |
8dd9927539 | ||
![]() |
c3da573722 | ||
![]() |
f40fd82518 | ||
![]() |
ef894d847e | ||
![]() |
7c08cf3190 | ||
![]() |
6f94ae1500 | ||
![]() |
bd579fe907 | ||
![]() |
87a2aa5f1e | ||
![]() |
1133d48103 | ||
![]() |
dda5c9eeff | ||
![]() |
e7824f367b | ||
![]() |
29a0277398 | ||
![]() |
510a188dee | ||
![]() |
7fa2d494c4 | ||
![]() |
7e4950b184 | ||
![]() |
c832cf73aa | ||
![]() |
9ff1a14e0e | ||
![]() |
384ac486d9 | ||
![]() |
2cddbefb63 | ||
![]() |
dae376500b | ||
![]() |
c4650d12bd | ||
![]() |
18bc8eb5aa | ||
![]() |
8eceb0d298 | ||
![]() |
27d51f89c7 | ||
![]() |
d04252a5ad | ||
![]() |
6b02258295 | ||
![]() |
97169d6f17 | ||
![]() |
a874c9c628 | ||
![]() |
c28d77e7cd | ||
![]() |
397a3e4970 | ||
![]() |
a4c578adde | ||
![]() |
db8b7ea05f | ||
![]() |
f33b3b39c0 | ||
![]() |
1a825ac507 | ||
![]() |
9e4d215191 | ||
![]() |
1ae63bc489 | ||
![]() |
15d8f31b26 | ||
![]() |
ca47c103f1 | ||
![]() |
66cde07135 | ||
![]() |
f47b4c8f6c | ||
![]() |
8ee45a38f0 | ||
![]() |
fc2c7ff4be | ||
![]() |
b6f4ac9b5f | ||
![]() |
f211872796 | ||
![]() |
0e8653129a | ||
![]() |
196079700a | ||
![]() |
ef036c107a | ||
![]() |
bcc8747305 | ||
![]() |
3a0af38900 | ||
![]() |
70511e2722 | ||
![]() |
7f252c75b8 | ||
![]() |
2a78aceac6 | ||
![]() |
34bde83067 | ||
![]() |
0a864f0cf3 | ||
![]() |
768ae66a64 | ||
![]() |
e3531fb7b5 | ||
![]() |
790a9273f9 | ||
![]() |
78330a4d20 | ||
![]() |
067843c4b9 | ||
![]() |
a688fde769 | ||
![]() |
8ae039b77e | ||
![]() |
a328e5bf91 | ||
![]() |
46a55da277 | ||
![]() |
1746d8379b | ||
![]() |
f57cf92f41 | ||
![]() |
54659f5c77 | ||
![]() |
2badd22f41 | ||
![]() |
21b7386a94 | ||
![]() |
529b9bb482 | ||
![]() |
3adb333022 | ||
![]() |
cc988a303e | ||
![]() |
46349e1a70 | ||
![]() |
acff80a234 | ||
![]() |
bbe655d879 | ||
![]() |
7cbace9cc9 | ||
![]() |
9372899bfa | ||
![]() |
4d42a74e66 | ||
![]() |
76f7a64cb8 | ||
![]() |
1af8cf8222 | ||
![]() |
11a3b2facd | ||
![]() |
bd993d2f84 | ||
![]() |
cf9683174d | ||
![]() |
f617ca26bb | ||
![]() |
41686fdf6c | ||
![]() |
c67a985847 | ||
![]() |
639399925c | ||
![]() |
2ded900188 | ||
![]() |
3ae1803420 | ||
![]() |
17b2d8c773 | ||
![]() |
7025c98e7b | ||
![]() |
6f4d3c4327 | ||
![]() |
7833a6a79f | ||
![]() |
c2f2d69ba1 | ||
![]() |
42b0312790 | ||
![]() |
cc42beeb5a | ||
![]() |
ea5669911b | ||
![]() |
b4c2da5474 | ||
![]() |
6d7086d541 | ||
![]() |
db0dba66b2 | ||
![]() |
5b58168999 | ||
![]() |
4ed453d58e | ||
![]() |
66a9116524 | ||
![]() |
cb7ac6ca5e | ||
![]() |
a2995b6c66 | ||
![]() |
ed383c8dfc | ||
![]() |
df9b900db6 | ||
![]() |
8e611de605 | ||
![]() |
8af4c36fd0 | ||
![]() |
abc4e0cdcf | ||
![]() |
b6dd32f683 | ||
![]() |
0a437ff303 | ||
![]() |
f7f4c320a6 | ||
![]() |
5813621fb9 | ||
![]() |
56fc7407da | ||
![]() |
220b902144 | ||
![]() |
c15eee22c6 | ||
![]() |
dcc3b76cda | ||
![]() |
752d18ffca | ||
![]() |
97559dd08a | ||
![]() |
0e7363a87f | ||
![]() |
6c62c2f599 | ||
![]() |
884e419a7c | ||
![]() |
d7586dd4c2 | ||
![]() |
aada0419eb | ||
![]() |
1ea04587d9 | ||
![]() |
3d1dcd33d1 | ||
![]() |
bfdbd8199f | ||
![]() |
fe0810b048 | ||
![]() |
e1c1ac4bd9 | ||
![]() |
7f7f221a79 | ||
![]() |
e57c556427 | ||
![]() |
dd57158ab5 | ||
![]() |
99db192792 | ||
![]() |
fcbee854d0 | ||
![]() |
fae1336467 | ||
![]() |
655d8f3791 | ||
![]() |
dcc852bf17 | ||
![]() |
dab3005c6f | ||
![]() |
ee6a54ffa2 | ||
![]() |
601056406a | ||
![]() |
fd72ce12b4 | ||
![]() |
6e45532f58 | ||
![]() |
61da6b5e99 | ||
![]() |
e0156388e8 | ||
![]() |
16f1d47bf2 | ||
![]() |
ee647344a1 | ||
![]() |
40426ca936 | ||
![]() |
d1e9c2d1e3 | ||
![]() |
3bd33cda99 | ||
![]() |
609f62ac7a | ||
![]() |
ce84665e3a | ||
![]() |
7dceaf6679 | ||
![]() |
b6bcd99dc8 | ||
![]() |
9bc9509316 | ||
![]() |
22ec01d565 | ||
![]() |
a16cae0342 | ||
![]() |
f17ff7168f | ||
![]() |
d3b22faf65 | ||
![]() |
30e5a27eb4 | ||
![]() |
0f720ec11d | ||
![]() |
0ddee7f9d0 | ||
![]() |
1e16e203dc | ||
![]() |
af986e8880 | ||
![]() |
7e04c46070 | ||
![]() |
166420dd86 | ||
![]() |
d7a2b43b07 | ||
![]() |
bea201a389 | ||
![]() |
d944116e3e | ||
![]() |
4a1597c87f | ||
![]() |
f87bf2a861 | ||
![]() |
ef45cde290 | ||
![]() |
752b1c3b27 | ||
![]() |
cf26d8547a | ||
![]() |
1d78febafc | ||
![]() |
f483119a40 | ||
![]() |
abd2b73fca | ||
![]() |
31ac365e6d | ||
![]() |
df8471a4dd | ||
![]() |
18539f2540 | ||
![]() |
7c1105a2b7 | ||
![]() |
31298146f3 | ||
![]() |
4e6eee220c | ||
![]() |
a7be3c9935 | ||
![]() |
f512473986 | ||
![]() |
8166a37722 | ||
![]() |
adadb98482 | ||
![]() |
25e760cd64 | ||
![]() |
0ff8e17005 | ||
![]() |
c433c6b39e | ||
![]() |
1c09c29104 | ||
![]() |
c1e9cc3c56 | ||
![]() |
27296d24c5 | ||
![]() |
030e635417 | ||
![]() |
07711aaecc | ||
![]() |
16ed8992e2 | ||
![]() |
88e6dc7a05 | ||
![]() |
28e8d46743 | ||
![]() |
77ba1b723f | ||
![]() |
b0cc6e7c2f | ||
![]() |
e84e482130 | ||
![]() |
b5ae20b874 | ||
![]() |
3ec81e3d1f | ||
![]() |
fb5436c287 | ||
![]() |
01a628822b | ||
![]() |
66e2c8e297 | ||
![]() |
80661d68f2 | ||
![]() |
ef8aa3be75 | ||
![]() |
6bc056e019 | ||
![]() |
75deab139b | ||
![]() |
ae79f0a303 | ||
![]() |
9b83068234 | ||
![]() |
fec2be9429 | ||
![]() |
9f1b06ddd3 | ||
![]() |
ad2198e8b5 | ||
![]() |
1791fdf0ef | ||
![]() |
4ab705081e | ||
![]() |
15b9dce1a9 | ||
![]() |
da3fc2ede2 | ||
![]() |
385c585888 | ||
![]() |
734b97beb0 | ||
![]() |
3aa311a3c1 | ||
![]() |
df7d7f9c38 | ||
![]() |
65be77665a | ||
![]() |
44548659db | ||
![]() |
10c4395efd | ||
![]() |
27b2a4b5f2 | ||
![]() |
6f54e7ff7f | ||
![]() |
cb6726b667 | ||
![]() |
0964311fa1 | ||
![]() |
2831d019f5 | ||
![]() |
1cc58cad9b | ||
![]() |
bc9660f76e | ||
![]() |
f526caca50 | ||
![]() |
b6a98fb83e | ||
![]() |
af2b4b79a9 | ||
![]() |
a762b5eca2 | ||
![]() |
3cc40344af | ||
![]() |
278cdb7f69 | ||
![]() |
0be03ebeb7 | ||
![]() |
c69f37a2de | ||
![]() |
b20ac8169a | ||
![]() |
9e98d35b45 | ||
![]() |
17f2781e07 | ||
![]() |
0acf9cc0e6 | ||
![]() |
70573d0559 | ||
![]() |
da239237f7 |
|
@ -1 +1,2 @@
|
|||
lib/testpilot/*.js
|
||||
coverage
|
10
.eslintrc.js
|
@ -1,6 +1,6 @@
|
|||
module.exports = {
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 8
|
||||
"ecmaVersion": 2021
|
||||
},
|
||||
"env": {
|
||||
"browser": true,
|
||||
|
@ -18,7 +18,11 @@ module.exports = {
|
|||
"XPCOMUtils": true,
|
||||
"OS": true,
|
||||
"ADDON_UNINSTALL": true,
|
||||
"ADDON_DISABLE": true
|
||||
"ADDON_DISABLE": true,
|
||||
"CONTAINER_ORDER_STORAGE_KEY": true,
|
||||
"proxifiedContainers": true,
|
||||
"MozillaVPN": true,
|
||||
"MozillaVPN_Background": true
|
||||
},
|
||||
"plugins": [
|
||||
"promise",
|
||||
|
@ -46,7 +50,7 @@ module.exports = {
|
|||
"error",
|
||||
{
|
||||
"escape": {
|
||||
"taggedTemplates": ["escaped"]
|
||||
"taggedTemplates": ["Utils.escaped"]
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
53
.github/ISSUE_TEMPLATE/bug.yml
vendored
Normal file
|
@ -0,0 +1,53 @@
|
|||
name: Bug Report
|
||||
description: Report a problem in Multi-Account Containers
|
||||
labels: [bug]
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: before-bug-report
|
||||
attributes:
|
||||
label: Before submitting a bug report
|
||||
options:
|
||||
- label: "I updated to the latest version of Multi-Account Container and tested if I can reproduce the issue"
|
||||
required: true
|
||||
- label: "I searched for existing reports to see if it hasn't already been reported"
|
||||
required: true
|
||||
- type: textarea
|
||||
id: step_to_reproduce
|
||||
attributes:
|
||||
label: "Step to reproduce"
|
||||
description: "Provide a list of steps you did to trigger this bug"
|
||||
placeholder: |
|
||||
1. I opened ...
|
||||
2. I clicked on ...
|
||||
3. ...
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: actual_behavior
|
||||
attributes:
|
||||
label: "Actual behavior"
|
||||
description: "Provide a description of what is currently happening"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected_behavior
|
||||
attributes:
|
||||
label: "Expected behavior"
|
||||
description: "Provide a description of what should happen"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: additional_informations
|
||||
attributes:
|
||||
label: "Additional informations"
|
||||
description: "Provide any other information revelant to this issue"
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: about_support
|
||||
attributes:
|
||||
label: "Provide a copy of Troubleshooting Information page (optional)"
|
||||
description: "To get a copy of the Troubleshooting Information page, type *about:support* in the address bar and click on the *Copy text to clipboard* button."
|
||||
render: "plain text"
|
||||
validations:
|
||||
required: false
|
17
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
@ -0,0 +1,17 @@
|
|||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: "Explore our help articles"
|
||||
url: "https://support.mozilla.org/kb/containers"
|
||||
about: "Dig into the knowledge base, tips and tricks, troubleshooting, and so much more."
|
||||
- name: "Ask a support question"
|
||||
url: "https://support.mozilla.org/questions/new/desktop/form"
|
||||
about: "Get support from our contributors or staff members."
|
||||
- name: "Submit new ideas"
|
||||
url: "https://connect.mozilla.org/t5/discussions/how-to-submit-a-great-idea-in-five-easy-steps/td-p/24"
|
||||
about: "Have an idea for a new product feature? Share it with our community and staff members!"
|
||||
- name: "Discussions"
|
||||
url: "https://connect.mozilla.org/t5/discussions/bd-p/discussions"
|
||||
about: "Give feedback and participate in meaningful conversations with the community and Mozilla employees"
|
||||
- name: "Discover more awesome tools"
|
||||
url: "https://www.mozilla.org/firefox/products/"
|
||||
about: "Learn more about other products from Mozilla"
|
24
.github/pull_request_template.md
vendored
Normal file
|
@ -0,0 +1,24 @@
|
|||
**Before submitting your pull request**
|
||||
|
||||
- [ ] I agree to license my code under the [MPL 2.0 license](https://www.mozilla.org/en-US/MPL/2.0/).
|
||||
- [ ] I rebased my work on top of the main branch.
|
||||
- [ ] I ran `npm test` and all tests passed.
|
||||
- [ ] I added test coverages if relevant.
|
||||
|
||||
# Description
|
||||
|
||||
*Please include a summary of the changes including relevant motivation and context.*
|
||||
|
||||
## Type of change
|
||||
|
||||
*Select all that apply.*
|
||||
|
||||
- [ ] Bug fix
|
||||
- [ ] New feature
|
||||
- [ ] Major change (fix or feature that would cause existing functionality to work differently than in the current version)
|
||||
|
||||
Tag issues related to this pull request:
|
||||
|
||||
*
|
||||
*
|
||||
*
|
32
.github/workflows/builds.yaml
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
name: Builds
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- production
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- production
|
||||
schedule:
|
||||
- cron: '0 2 * * *' # Daily at 2AM UTC
|
||||
|
||||
jobs:
|
||||
builds:
|
||||
name: Builds
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Clone repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Create the package
|
||||
shell: bash
|
||||
run: |
|
||||
./bin/build-addon.sh nightly.xpi
|
||||
|
||||
- name: Uploading
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{matrix.config.name}} Build
|
||||
path: src/web-ext-artifacts
|
28
.github/workflows/test.yaml
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
name: Test
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- production
|
||||
pull_request:
|
||||
branches:
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Run tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Clone repository
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Set up node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: lts/*
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install --legacy-peer-deps
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test
|
14
.gitignore
vendored
|
@ -1,10 +1,18 @@
|
|||
.DS_Store
|
||||
package-lock.json
|
||||
node_modules
|
||||
README.html
|
||||
*.xpi
|
||||
*.swp
|
||||
*.swo
|
||||
*.sw*
|
||||
.vimrc
|
||||
.env
|
||||
addon.env
|
||||
|
||||
src/web-ext-artifacts/*
|
||||
web-ext-artifacts
|
||||
|
||||
# JetBrains IDE files
|
||||
.idea
|
||||
|
||||
# IstanbulJS
|
||||
.nyc_output
|
||||
coverage
|
5
.gitmodules
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
[submodule "src/_locales"]
|
||||
branch = main
|
||||
path = src/_locales
|
||||
url = https://github.com/mozilla-l10n/multi-account-containers-l10n.git
|
||||
ignore=all
|
|
@ -3,6 +3,7 @@ docs/
|
|||
test/
|
||||
.npm/
|
||||
node_modules/
|
||||
bin/
|
||||
|
||||
.env
|
||||
.eslintrc.js
|
||||
|
@ -14,6 +15,8 @@ node_modules/
|
|||
.stylelintrc
|
||||
.travis.yml
|
||||
*.xpi
|
||||
*.md
|
||||
.vimrc
|
||||
.DS_Store
|
||||
.gdb_history
|
||||
*.sw*
|
||||
|
|
10
.stylelintrc
|
@ -5,12 +5,16 @@
|
|||
|
||||
"extends": "stylelint-config-standard",
|
||||
|
||||
"ignoreFiles": ["webextension/css/*.min.css"],
|
||||
"ignoreFiles": ["src/css/*.min.css"],
|
||||
|
||||
"rules": {
|
||||
"declaration-block-no-duplicate-properties": true,
|
||||
"order/declaration-block-properties-alphabetical-order": true,
|
||||
"property-blacklist": [
|
||||
"property-no-unknown": [
|
||||
true, {
|
||||
ignoreProperties:
|
||||
["inset-block-end", "inset-block-start"]
|
||||
}],
|
||||
"property-disallowed-list": [
|
||||
"/(min[-]|max[-])height/",
|
||||
"/width/",
|
||||
"/top/",
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- "6.1"
|
||||
|
||||
notifications:
|
||||
irc:
|
||||
- "ircs://irc.mozilla.org:6697/#testpilot-containers-bots"
|
|
@ -1,3 +1,15 @@
|
|||
# Code Of Conduct
|
||||
# Community Participation Guidelines
|
||||
|
||||
This add-on follows the [Mozilla Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) for our code of conduct.
|
||||
This repository is governed by Mozilla's code of conduct and etiquette guidelines.
|
||||
For more details, please read the
|
||||
[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/).
|
||||
|
||||
## How to Report
|
||||
For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.
|
||||
|
||||
<!--
|
||||
## Project Specific Etiquette
|
||||
|
||||
In some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).
|
||||
Please update for your project.
|
||||
-->
|
||||
|
|
|
@ -1,35 +1,54 @@
|
|||
# Contributing
|
||||
|
||||
Everyone is welcome to contribute to containers. Reach out to team members if you have questions:
|
||||
## Requirements
|
||||
|
||||
- IRC: #containers on irc.mozilla.org
|
||||
- Email: containers@mozilla.com
|
||||
* Firefox 91.1.0+
|
||||
* Git 2.13+
|
||||
* Node 7+
|
||||
|
||||
## Filing bugs
|
||||
## Getting Started
|
||||
|
||||
If you find a bug with containers, please file a issue.
|
||||
1. Follow the instructions on [How to fork a repository][fork]
|
||||
2. Fetch the locales:
|
||||
|
||||
Check first if the bug might already exist: https://github.com/mozilla/testpilot-containers/issues
|
||||
```
|
||||
cd multi-account-containers
|
||||
git submodule update --init
|
||||
```
|
||||
3. Install the project dependencies
|
||||
```
|
||||
npm install --legacy-peer-deps
|
||||
```
|
||||
4. Run `npm run dev`.
|
||||
|
||||
[Open an issue](https://github.com/mozilla/testpilot-containers/issues/new)
|
||||
## Translations
|
||||
|
||||
1. Visit about:support
|
||||
2. Click "Copy raw data to clipboard" and paste into the bug. Alternatively copy the following sections into the issue:
|
||||
- Application Basics
|
||||
- Nightly Features (if you are in nightly)
|
||||
- Extensions
|
||||
- Experimental Features
|
||||
3. Include clear steps to reproduce the issue you have experienced.
|
||||
4. Include screenshots if possible.
|
||||
The translations are located in `src/_locales`. This directory is a git
|
||||
repository like any other. Before editing files in this folder, you need to:
|
||||
|
||||
## Sending Pull Requests
|
||||
1. `cd src/_locales/`
|
||||
2. `git checkout -b message-updates-yyyymmdd`
|
||||
3. `git push -u origin message-updates-yyyymmdd`
|
||||
|
||||
Patches should be submitted as pull requests. When submitting patches as PRs:
|
||||
You can then [open a pull request][pr] on [the l10n repository][l10n].
|
||||
|
||||
- You agree to license your code under the project's open source license (MPL 2.0).
|
||||
- Base your branch off the current master (see below for an example workflow).
|
||||
- Add both your code and new tests if relevant.
|
||||
- Run npm test to make sure all tests still pass.
|
||||
- Please do not include merge commits in pull requests; include only commits with the new relevant code.
|
||||
## Tips for contributing
|
||||
|
||||
See the main [README](./README.md) for information on prerequisites, installing, running and testing.
|
||||
1. Choose [an issue][issues] that you would like to work on.
|
||||
2. Fork the repository and follow the instructions for setting it up locally.
|
||||
3. Run the add-on locally and try reproducing the issue.
|
||||
4. Debug add-ons by clicking the “Settings” icon in about:addons, and then clicking “Debug Add-ons”
|
||||
5. Click “Inspect” on the MAC add-on to open developer tools for the popup extension (see [this documentation][extension-doc] for more information)
|
||||
6. Once you have a fix ready, commit your changes with the following commit message template: “Fix #<insert issue id #>: <short description>”
|
||||
7. Push your changes and open a pull request for review.
|
||||
|
||||
If you run into an issue, you can always ask the other community members in the [discussions board][discussions].
|
||||
|
||||
<!-- Please keep the list in alphabetical order -->
|
||||
[discussions]: https://github.com/mozilla/multi-account-containers/discussions
|
||||
[extension-doc]: https://extensionworkshop.com/documentation/develop/debugging/
|
||||
[fork]: https://docs.github.com/en/get-started/quickstart/fork-a-repo
|
||||
[issues]: https://github.com/mozilla/multi-account-containers/issues
|
||||
[l10n]: https://github.com/mozilla-l10n/multi-account-containers-l10n/
|
||||
[pr]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests
|
||||
[web-ext]: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_started_with_web-ext
|
101
README.md
|
@ -1,88 +1,33 @@
|
|||
# Containers Add-on
|
||||
# Multi-Account Containers
|
||||
|
||||
[](https://testpilot.firefox.com/experiments/containers)
|
||||
[](https://github.com/mozilla/multi-account-containers/actions/workflows/test.yaml)
|
||||
|
||||
[Embedded Web Extension](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Embedded_WebExtensions) to build [Containers](https://blog.mozilla.org/tanvi/2016/06/16/contextual-identities-on-the-web/) as a Firefox [Test Pilot](https://testpilot.firefox.com/) Experiment and [Shield Study](https://wiki.mozilla.org/Firefox/Shield/Shield_Studies) to learn:
|
||||
The Firefox Multi-Account Containers extension lets you carve out a separate box for each of your online lives – no more opening a different browser just to check your work email!
|
||||
|
||||
* Will a general Firefox audience understand the Containers feature?
|
||||
* Is the UI as currently implemented in Nightly clear or discoverable?
|
||||
Learn more about Multi-Account Containers in
|
||||
[our end-user documentation][enduser].
|
||||
|
||||
For more info, see:
|
||||
## Contributing
|
||||
|
||||
* [Test Pilot Product Hypothesis Document](https://docs.google.com/document/d/1WQdHTVXROk7dYkSFluc6_hS44tqZjIrG9I-uPyzevE8/edit#)
|
||||
* [Shield Product Hypothesis Document](https://docs.google.com/document/d/1vMD-fH_5hGDDqNvpRZk12_RhCN2WAe4_yaBamaNdtik/edit#)
|
||||
Everyone is welcome to contribute to Multi-Account Containers. To learn how
|
||||
to contribute a patch to Multi-Account Container, please
|
||||
[read our contributing guide][contributing].
|
||||
|
||||
You can also chat with us on [our Matrix room][matrix] or ask in [our discussions board][discussions].
|
||||
|
||||
## Requirements
|
||||
This repository is governed by Mozilla's code of conduct and etiquette
|
||||
guidelines. For more details, [please read the Mozilla Community Participation Guidelines][cpg].
|
||||
|
||||
* node 7+ (for jpm)
|
||||
* Firefox 53+
|
||||
### License
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
|
||||
## Development
|
||||
### Development Environment
|
||||
|
||||
Add-on development is better with [a particular environment](https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment). One simple way to get that environment set up is to install the [DevPrefs add-on](https://addons.mozilla.org/en-US/firefox/addon/devprefs/). You can make a custom Firefox profile that includes the DevPrefs add-on, and use that profile when you run the code in this repository.
|
||||
|
||||
1. Make a new profile by running `/path/to/firefox -P`, which launches the profile editor. "Create Profile" -- name it whatever you wish (e.g. 'addon_dev') and store it in the default location. It's probably best to deselect the option to "Use without asking," since you probably don't want to use this as your default profile.
|
||||
|
||||
2. Once you've created your profile, click "Start Firefox". A new instance of Firefox should launch. Go to Tools->Add-ons and search for "DevPrefs". Install it. Quit Firefox.
|
||||
|
||||
3. Now you have a new, vanilla Firefox profile with the DevPrefs add-on installed. You can use your new profile with the code in _this_ repository like so:
|
||||
|
||||
#### Run the `.xpi` file in an unbranded build
|
||||
Release & Beta channels do not allow un-signed add-ons, even with the DevPrefs. So, you must run the add-on in an [unbranded build](https://wiki.mozilla.org/Add-ons/Extension_Signing#Unbranded_Builds):
|
||||
|
||||
1. Download and install an un-branded build of Firefox
|
||||
2. Download the latest `.xpi` from this repository's releases
|
||||
3. Run the un-branded build of Firefox with your DevPrefs profile
|
||||
4. Go to `about:addons`
|
||||
5. Click the gear, and select "Install Add-on From File..."
|
||||
6. Select the `.xpi` file
|
||||
|
||||
#### Correct prefs
|
||||
|
||||
Whilst this is still using legacy code to test you will need the following in your profile:
|
||||
|
||||
|
||||
Change the following prefs in about:config:
|
||||
|
||||
- extensions.legacy.enabled = true
|
||||
- xpinstall.signatures.required = false
|
||||
|
||||
|
||||
#### Run the TxP experiment with `jpm`
|
||||
|
||||
1. `git clone git@github.com:mozilla/testpilot-containers.git`
|
||||
2. `cd testpilot-containers`
|
||||
3. `npm install`
|
||||
4. `./node_modules/.bin/jpm run -p /Path/To/Firefox/Profiles/{junk}.addon_dev -b FirefoxBeta` (where FirefoxBeta might be: ~/<reponame>/obj-x86_64-pc-linux-gnu/dist/bin/firefox or ~/<downloadedFirefoxBeta>/firefox)
|
||||
|
||||
Check out the [Browser Toolbox](https://developer.mozilla.org/en-US/docs/Tools/Browser_Toolbox) for more information about debugging add-on code.
|
||||
|
||||
### Building .xpi
|
||||
|
||||
To build a local testpilot-containers.xpi, use the plain [`jpm
|
||||
xpi`](https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm#jpm_xpi) command,
|
||||
or run `npm run build`.
|
||||
|
||||
### Signing an .xpi
|
||||
|
||||
To sign an .xpi, use [`jpm
|
||||
sign`](https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm#jpm_sign)
|
||||
command.
|
||||
|
||||
Note: You will need to be [an author on the AMO
|
||||
add-on](https://addons.mozilla.org/en-US/developers/addon/containers-experiment/ownership).
|
||||
|
||||
### Testing
|
||||
TBD
|
||||
|
||||
### Distributing
|
||||
TBD
|
||||
|
||||
### Links
|
||||
|
||||
- [Licence](./LICENSE.txt)
|
||||
- [Contributing](./CONTRIBUTING.md)
|
||||
- [Code Of Conduct](./CODE_OF_CONDUCT.md)
|
||||
<!-- Please keep the list in alphabetical order -->
|
||||
[contributing]: CONTRIBUTING.md
|
||||
[cpg]: https://www.mozilla.org/about/governance/policies/participation/
|
||||
[enduser]: https://support.mozilla.org/en-US/kb/containers
|
||||
[forum]: https://discourse.mozilla.org/c/containers/223
|
||||
[discussions]: https://github.com/mozilla/multi-account-containers/discussions
|
||||
[matrix]: https://matrix.to/#/#containers:mozilla.org
|
||||
|
|
35
bin/addons-linter.sh
Executable file
|
@ -0,0 +1,35 @@
|
|||
#!/bin/env bash
|
||||
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
# addons-linter is not happy to see a `.github` folder in src/_locales.
|
||||
# We need to do an horrible hack to run the test.
|
||||
|
||||
. $(dirname $0)/commons.sh
|
||||
|
||||
TMPDIR=/tmp/MAC_addonsLinter
|
||||
|
||||
print Y "Update the submodules..."
|
||||
git submodule init || die
|
||||
git submodule update --remote --depth 1 src/_locales || die
|
||||
|
||||
printn Y "Removing previous execution data... "
|
||||
rm -rf $TMPDIR || die
|
||||
print G "done."
|
||||
|
||||
printn Y "Creating a tmp folder ($TMPDIR)... "
|
||||
mkdir $TMPDIR || die
|
||||
print G "done."
|
||||
|
||||
printn Y "Copying data... "
|
||||
cp -r src $TMPDIR || die
|
||||
print G "done."
|
||||
|
||||
printn Y "Removing the github folder... "
|
||||
rm -rf $TMPDIR/src/_locales/.github || die
|
||||
print G "done."
|
||||
|
||||
print Y "Running the test..."
|
||||
npx addons-linter $TMPDIR/src || die
|
|
@ -1 +1,26 @@
|
|||
npm install && npm run deploy
|
||||
#!/bin/env bash
|
||||
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
. $(dirname $0)/commons.sh
|
||||
|
||||
print Y "Update the submodules..."
|
||||
git submodule init || die
|
||||
git submodule update --remote --depth 1 src/_locales || die
|
||||
|
||||
print Y "Installing dependencies..."
|
||||
npm install --legacy-peer-deps || die
|
||||
|
||||
print Y "Running tests..."
|
||||
npm test
|
||||
|
||||
print Y "Creating the final package..."
|
||||
cd src || die
|
||||
|
||||
if [[ $# -gt 0 ]]; then
|
||||
EXTRA_PARAMS="--filename $1"
|
||||
fi
|
||||
|
||||
npx web-ext build --overwrite-dest $EXTRA_PARAMS || die
|
||||
|
|
54
bin/commons.sh
Normal file
|
@ -0,0 +1,54 @@
|
|||
#!/bin/env bash
|
||||
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
printv() {
|
||||
if [ -t 1 ]; then
|
||||
NCOLORS=$(tput colors)
|
||||
|
||||
if test -n "$NCOLORS" && test "$NCOLORS" -ge 8; then
|
||||
NORMAL="$(tput sgr0)"
|
||||
RED="$(tput setaf 1)"
|
||||
GREEN="$(tput setaf 2)"
|
||||
YELLOW="$(tput setaf 3)"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $2 = 'G' ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
echo $1 -e "${GREEN}$3${NORMAL}"
|
||||
elif [[ $2 = 'Y' ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
echo $1 -e "${YELLOW}$3${NORMAL}"
|
||||
elif [[ $2 = 'N' ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
echo $1 -e "$3"
|
||||
else
|
||||
# shellcheck disable=SC2086
|
||||
echo $1 -e "${RED}$3${NORMAL}"
|
||||
fi
|
||||
}
|
||||
|
||||
print() {
|
||||
printv '' "$1" "$2"
|
||||
}
|
||||
|
||||
printn() {
|
||||
printv "-n" "$1" "$2"
|
||||
}
|
||||
|
||||
error() {
|
||||
printv '' R "$1"
|
||||
}
|
||||
|
||||
die() {
|
||||
if [[ "$1" ]]; then
|
||||
error "$1"
|
||||
else
|
||||
error Failed
|
||||
fi
|
||||
|
||||
exit 1
|
||||
}
|
120
bootstrap.js
vendored
|
@ -1,120 +0,0 @@
|
|||
"use strict";
|
||||
|
||||
const PREFS = [
|
||||
{
|
||||
name: "privacy.userContext.enabled",
|
||||
value: true,
|
||||
type: "bool"
|
||||
},
|
||||
{
|
||||
name: "privacy.userContext.longPressBehavior",
|
||||
value: 2,
|
||||
type: "int"
|
||||
},
|
||||
{
|
||||
name: "privacy.userContext.ui.enabled",
|
||||
value: true, // Post web ext we will be setting this true
|
||||
type: "bool"
|
||||
},
|
||||
{
|
||||
name: "privacy.usercontext.about_newtab_segregation.enabled",
|
||||
value: true,
|
||||
type: "bool"
|
||||
},
|
||||
];
|
||||
const Ci = Components.interfaces;
|
||||
const Cu = Components.utils;
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
const { TextDecoder, TextEncoder } = Cu.import("resource://gre/modules/commonjs/toolkit/loader.js", {});
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "OS",
|
||||
"resource://gre/modules/osfile.jsm");
|
||||
|
||||
const JETPACK_DIR_BASENAME = "jetpack";
|
||||
const EXTENSION_ID = "@testpilot-containers";
|
||||
|
||||
function filename() {
|
||||
const storeFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
|
||||
storeFile.append(JETPACK_DIR_BASENAME);
|
||||
storeFile.append(EXTENSION_ID);
|
||||
storeFile.append("simple-storage");
|
||||
storeFile.append("store.json");
|
||||
return storeFile.path;
|
||||
}
|
||||
|
||||
async function getConfig() {
|
||||
const bytes = await OS.File.read(filename());
|
||||
const raw = new TextDecoder().decode(bytes) || "";
|
||||
let savedConfig = {savedConfiguration: {}};
|
||||
if (raw) {
|
||||
savedConfig = JSON.parse(raw);
|
||||
}
|
||||
|
||||
return savedConfig;
|
||||
}
|
||||
|
||||
async function initConfig() {
|
||||
const savedConfig = await getConfig();
|
||||
savedConfig.savedConfiguration.version = 2;
|
||||
if (!("prefs" in savedConfig.savedConfiguration)) {
|
||||
savedConfig.savedConfiguration.prefs = {};
|
||||
PREFS.forEach((pref) => {
|
||||
if ("int" === pref.type) {
|
||||
savedConfig.savedConfiguration.prefs[pref.name] = Services.prefs.getIntPref(pref.name, pref.name);
|
||||
} else {
|
||||
savedConfig.savedConfiguration.prefs[pref.name] = Services.prefs.getBoolPref(pref.name, pref.value);
|
||||
}
|
||||
});
|
||||
}
|
||||
const serialized = JSON.stringify(savedConfig);
|
||||
const bytes = new TextEncoder().encode(serialized) || "";
|
||||
await OS.File.writeAtomic(filename(), bytes, { });
|
||||
}
|
||||
|
||||
function setPrefs() {
|
||||
PREFS.forEach((pref) => {
|
||||
if ("int" === pref.type) {
|
||||
Services.prefs.setIntPref(pref.name, pref.value);
|
||||
} else {
|
||||
Services.prefs.setBoolPref(pref.name, pref.value);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
async function install() {
|
||||
await initConfig();
|
||||
setPrefs();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
async function uninstall(aData, aReason) {
|
||||
if (aReason === ADDON_UNINSTALL
|
||||
|| aReason === ADDON_DISABLE) {
|
||||
const config = await getConfig();
|
||||
const storedPrefs = config.savedConfiguration.prefs;
|
||||
PREFS.forEach((pref) => {
|
||||
if (pref.name in storedPrefs) {
|
||||
if ("int" === pref.type) {
|
||||
Services.prefs.setIntPref(pref.name, storedPrefs[pref.name]);
|
||||
} else {
|
||||
Services.prefs.setBoolPref(pref.name, storedPrefs[pref.name]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function startup({webExtension}) {
|
||||
// Reset prefs that may have changed, or are legacy
|
||||
setPrefs();
|
||||
// Start the embedded webextension.
|
||||
webExtension.startup();
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
function shutdown() {
|
||||
}
|
||||
|
|
@ -1,261 +0,0 @@
|
|||
/* HACK: Custom Container vars do not propigate correctly
|
||||
until the container tab is blurred and refocused,
|
||||
adding the data-identity-color with the default hex
|
||||
value, or chrome url path as an alternate selector mitiages this bug.*/
|
||||
[data-identity-color="blue"],
|
||||
[data-identity-color="#00a7e0"] {
|
||||
--identity-tab-color: #37adff;
|
||||
--identity-icon-color: #37adff;
|
||||
}
|
||||
|
||||
[data-identity-color="turquoise"],
|
||||
[data-identity-color="#01bdad"] {
|
||||
--identity-tab-color: #00c79a;
|
||||
--identity-icon-color: #00c79a;
|
||||
}
|
||||
|
||||
[data-identity-color="green"],
|
||||
[data-identity-color="#7dc14c"] {
|
||||
--identity-tab-color: #51cd00;
|
||||
--identity-icon-color: #51cd00;
|
||||
}
|
||||
|
||||
[data-identity-color="yellow"],
|
||||
[data-identity-color="#ffcb00"] {
|
||||
--identity-tab-color: #ffcb00;
|
||||
--identity-icon-color: #ffcb00;
|
||||
}
|
||||
|
||||
[data-identity-color="orange"],
|
||||
[data-identity-color="#f89c24"] {
|
||||
--identity-tab-color: #ff9f00;
|
||||
--identity-icon-color: #ff9f00;
|
||||
}
|
||||
|
||||
[data-identity-color="red"],
|
||||
[data-identity-color="#d92215"] {
|
||||
--identity-tab-color: #ff613d;
|
||||
--identity-icon-color: #ff613d;
|
||||
}
|
||||
|
||||
[data-identity-color="pink"],
|
||||
[data-identity-color="#ee5195"] {
|
||||
--identity-tab-color: #ff4bda;
|
||||
--identity-icon-color: #ff4bda;
|
||||
}
|
||||
|
||||
[data-identity-color="purple"],
|
||||
[data-identity-color="#7a2f7a"] {
|
||||
--identity-tab-color: #af51f5;
|
||||
--identity-icon-color: #af51f5;
|
||||
}
|
||||
|
||||
[data-identity-icon="fingerprint"],
|
||||
[data-identity-icon="chrome://browser/skin/usercontext/personal.svg"] {
|
||||
--identity-icon: url("/data/usercontext.svg#fingerprint");
|
||||
}
|
||||
|
||||
[data-identity-icon="briefcase"],
|
||||
[data-identity-icon="chrome://browser/skin/usercontext/work.svg"] {
|
||||
--identity-icon: url("/data/usercontext.svg#briefcase");
|
||||
}
|
||||
|
||||
[data-identity-icon="dollar"],
|
||||
[data-identity-icon="chrome://browser/skin/usercontext/banking.svg"] {
|
||||
--identity-icon: url("/data/usercontext.svg#dollar");
|
||||
}
|
||||
|
||||
[data-identity-icon="cart"],
|
||||
[data-identity-icon="chrome://browser/skin/usercontext/cart.svg"],
|
||||
[data-identity-icon="chrome://browser/skin/usercontext/shopping.svg"] {
|
||||
--identity-icon: url("/data/usercontext.svg#cart");
|
||||
}
|
||||
|
||||
[data-identity-icon="circle"] {
|
||||
--identity-icon: url("/data/usercontext.svg#circle");
|
||||
}
|
||||
|
||||
[data-identity-icon="gift"] {
|
||||
--identity-icon: url("/data/usercontext.svg#gift");
|
||||
}
|
||||
|
||||
[data-identity-icon="vacation"] {
|
||||
--identity-icon: url("/data/usercontext.svg#vacation");
|
||||
}
|
||||
|
||||
[data-identity-icon="food"] {
|
||||
--identity-icon: url("/data/usercontext.svg#food");
|
||||
}
|
||||
|
||||
[data-identity-icon="fruit"] {
|
||||
--identity-icon: url("/data/usercontext.svg#fruit");
|
||||
}
|
||||
|
||||
[data-identity-icon="pet"] {
|
||||
--identity-icon: url("/data/usercontext.svg#pet");
|
||||
}
|
||||
|
||||
[data-identity-icon="tree"] {
|
||||
--identity-icon: url("/data/usercontext.svg#tree");
|
||||
}
|
||||
|
||||
[data-identity-icon="chill"] {
|
||||
--identity-icon: url("/data/usercontext.svg#chill");
|
||||
}
|
||||
|
||||
#userContext-indicator {
|
||||
height: 16px;
|
||||
list-style-image: none !important;
|
||||
vertical-align: middle;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
#userContext-label {
|
||||
color: var(--identity-tab-color) !important;
|
||||
margin-inline-end: 5px;
|
||||
max-inline-size: 75px;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#userContext-icons {
|
||||
-moz-box-align: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
max-inline-size: 120px;
|
||||
}
|
||||
|
||||
#userContext-icons[data-identity-color=""] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.userContext-icon,
|
||||
.menuitem-iconic[data-usercontextid] > .menu-iconic-left > .menu-iconic-icon,
|
||||
.subviewbutton[usercontextid] > .toolbarbutton-icon,
|
||||
#userContext-indicator {
|
||||
background-image: var(--identity-icon) !important;
|
||||
background-position: center center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
fill: var(--identity-icon-color) !important;
|
||||
filter: url(/img/filters.svg#fill);
|
||||
filter: url(/data/filters.svg#fill);
|
||||
}
|
||||
|
||||
/* containers experiment */
|
||||
|
||||
/* reset nightly containers */
|
||||
.tabbrowser-tab[usercontextid] {
|
||||
background-image: none !important;
|
||||
background-repeat: no-repeat;
|
||||
background-size: 0;
|
||||
}
|
||||
|
||||
/* special styles run through a psuedo-class off of
|
||||
these elements so they need to be relatively positioned.
|
||||
these styles address both regular and compact themes,
|
||||
special cases are addressed below */
|
||||
.tabbrowser-tab[usercontextid] .tab-background-middle,
|
||||
#main-window[style*='compact'] .tabbrowser-tab[usercontextid] .tab-content,
|
||||
#verticaltabs-box .tabbrowser-tab[usercontextid] .tab-content {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.tabbrowser-tab[usercontextid] .tab-background-middle::after,
|
||||
#main-window[style*='compact'] .tabbrowser-tab[usercontextid] .tab-content::after {
|
||||
background-color: var(--identity-tab-color);
|
||||
bottom: 0;
|
||||
content: '';
|
||||
height: 2px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.tabbrowser-tab[usercontextid] .tab-background-middle::after {
|
||||
background-color: var(--identity-tab-color);
|
||||
border-radius: 2px 2px 0 0;
|
||||
bottom: 1px;
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
.tabbrowser-tab[usercontextid]:not([visuallyselected="true"]) .tab-background-middle::after {
|
||||
bottom: 2px;
|
||||
height: 2px !important;
|
||||
}
|
||||
|
||||
.tabbrowser-tab[usercontextid][pinned="true"] .tab-background-middle::after {
|
||||
left: -150%;
|
||||
width: 400%;
|
||||
}
|
||||
|
||||
.tabs-newtab-button .toolbarbutton-icon[type="menu"] {
|
||||
margin-inline-end: 0;
|
||||
}
|
||||
|
||||
.tabs-newtab-button .toolbarbutton-menu-dropmarker {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#new-tab-overlay {
|
||||
--icon-size: 16px;
|
||||
-moz-appearance: none;
|
||||
background: transparent;
|
||||
font-style: -moz-use-system-font;
|
||||
inline-size: 180px;
|
||||
margin-inline-start: -50px !important;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
#new-tab-overlay .panel-arrowcontent {
|
||||
-moz-appearance: none !important;
|
||||
background: none;
|
||||
border: 0;
|
||||
box-shadow: none;
|
||||
display: block;
|
||||
margin-block-end: 0;
|
||||
margin-block-start: 2px;
|
||||
padding-block-start: 0 !important;
|
||||
}
|
||||
|
||||
#new-tab-overlay .panel-arrowcontent,
|
||||
#new-tab-overlay menuitem {
|
||||
inline-size: 100%;
|
||||
}
|
||||
|
||||
#new-tab-overlay .panel-arrowbox {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#new-tab-overlay[hidden=true] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#new-tab-overlay menuitem {
|
||||
-moz-appearance: none;
|
||||
background: white;
|
||||
border-radius: 20px;
|
||||
border: 0;
|
||||
box-shadow: 0 0 7px #0004;
|
||||
color: #4b4b4b;
|
||||
margin-block-end: 5px;
|
||||
padding-block-end: 10px;
|
||||
padding-block-start: 10px;
|
||||
padding-inline-end: 10px;
|
||||
padding-inline-start: 10px;
|
||||
}
|
||||
|
||||
#new-tab-overlay menuitem:hover {
|
||||
background: #f2f2f2;
|
||||
}
|
||||
|
||||
#new-tab-overlay .menuitem-iconic[data-usercontextid] > .menu-iconic-left > .menu-iconic-icon {
|
||||
block-size: var(--icon-size);
|
||||
inline-size: var(--icon-size);
|
||||
}
|
||||
|
||||
.menuitem-iconic[data-usercontextid] > .menu-iconic-left {
|
||||
visibility: visible;
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
# Acceptance Criteria
|
||||
|
||||
## User Experience
|
||||
- [ ] It should place a containers button on the user’s browser toolbar
|
||||
- [ ] It should include all containers management UI inside a door hanger from this toolbar button
|
||||
- [ ] It should provide a set of default container choices for users to pick from (work, home, travel etc.)
|
||||
- [ ] Each container type should have a color, icon and name
|
||||
- [ ] It should allow users to create new containers
|
||||
- [ ] It should allow users to delete containers
|
||||
- [ ] It should allow users to open container tabs
|
||||
- [ ] each container tab should be clearly demarcated by color/icon etc.
|
||||
- [ ] It should provide a control to show/hide all open tabs of one container type
|
||||
- [ ] It should provide a control to sort tabs by container type
|
||||
- [ ] It should provide a control to allow users to open containers in new tab or new window by default
|
||||
|
||||
## User Experience Non-Requirements (out of scope)
|
||||
- [ ] It should not show any UI in browser settings
|
||||
- [ ] It should not effect the awesome bar
|
||||
- [ ] It should not effect the Firefox Library
|
||||
- [ ] It should not make any changes to sync functionality
|
||||
|
||||
## Measurements
|
||||
- [ ] It should measure container tab creations per session
|
||||
- [ ] It should measure the type of container tab created
|
||||
- [ ] It should measure container tab creations
|
||||
- [ ] It should measure new container creations
|
||||
- [ ] It should measure container deletes
|
||||
- [ ] It should measure container sorts
|
||||
- [ ] It should measure container hides
|
||||
- [ ] It should report URIs accessed across multiple containers
|
||||
- [ ] It should measure the % of tab-based vs windows-based containers
|
BIN
docs/kpi-1.png
Before Width: | Height: | Size: 95 KiB |
285
docs/metrics.md
|
@ -1,285 +0,0 @@
|
|||
# METRICS
|
||||
|
||||
## Data Analysis
|
||||
The collected data will primarily be used to answer the following questions.
|
||||
Images are used for visualization and are not composed of actual data.
|
||||
|
||||
### Do users install and run this?
|
||||
|
||||
What is the overall engagement of the Containers experiment?
|
||||
**This is the standard Daily Active User (DAU) and Monthly Active User (MAU) analysis.**
|
||||
|
||||
This captures data from the users who have the add-on installed, regardless of
|
||||
whether they are actively interacting with it.
|
||||
|
||||

|
||||
|
||||
### Immediate Questions
|
||||
|
||||
* Do people use the containers feature & how do people create new container tabs?
|
||||
* Click to create new container tab
|
||||
* \+ `entry-point` value: "tab-bar" or "pop-up"
|
||||
* Do people who use the containers feature continue to use it?
|
||||
* Retention: opening a second container tab (second tab in the same container, or a tab in a second container?)
|
||||
* What containers do people use?
|
||||
* userContextId
|
||||
* \+ Number of tabs in the container (when should we measure this? on every tab open?)
|
||||
* Do people edit their containers?
|
||||
* Click on "Edit Containers"
|
||||
* Click to edit a single container
|
||||
* Click "OK"
|
||||
* Click to delete a single container
|
||||
* Click "OK"
|
||||
* Click to add a container
|
||||
* Click "OK"
|
||||
* Do people sort the tabs?
|
||||
* Click sort
|
||||
* \+ Number of tabs when clicked
|
||||
* Average number of container tabs when sort was clicked
|
||||
* Do users show and hide container tabs?
|
||||
* Click hide
|
||||
* \+ Number of tabs when clicked
|
||||
* \+ Number of hidden containers when clicked
|
||||
* Click show
|
||||
* \+ Number of tabs when clicked
|
||||
* \+ Number of shown containers when clicked
|
||||
* Do users move container tabs to new windows?
|
||||
* Click move
|
||||
* \+ Number of tabs when clicked
|
||||
* Average number of container tabs when new window was clicked
|
||||
* How many containers do users have hidden at the same time? (when should we measure this? each time a container is hidden?)
|
||||
* Do users pin container tabs? (do we have existing Telemetry for pinning?)
|
||||
* Do users visit more pages in container tabs than non-container tabs?
|
||||
|
||||
### Follow-up Questions
|
||||
|
||||
What are some follow-up questions we anticipate we will ask based on any of the
|
||||
above answers/data?
|
||||
|
||||
* What is the average lifespan of a container tab? Is that longer or shorter than a regular tab? (if we don't have data on the latter, the former probably isn't worth gathering data on since we will have nothing to compare it to).
|
||||
|
||||
## Data Collection
|
||||
|
||||
### Server Side
|
||||
There is currently no server side component to Containers.
|
||||
|
||||
### Client Side
|
||||
Containers will use Test Pilot Telemetry with no batching of data. Details
|
||||
of when pings are sent are below, along with examples of the `payload` portion
|
||||
of a `testpilottest` telemetry ping for each scenario.
|
||||
|
||||
* The user shows the new tab menu
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "show-plus-button-menu",
|
||||
"eventSource": ["plus-button"]
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks on a container name to open a tab in that container
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"clickedContainerTabCount": <number-of-tabs-in-the-container>,
|
||||
"event": "open-tab",
|
||||
"eventSource": ["tab-bar"|"pop-up"|"file-menu"|"alltabs-menu"|"plus-button"]
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks "Edit Containers" in the pop-up
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "edit-containers"
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks OK after clicking on a container edit icon in the pop-up
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "edit-container"
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks OK after clicking on a container delete icon in the pop-up
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "delete-container"
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks OK after clicking to add a container in the pop-up
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "add-container"
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks the sort button/icon in the pop-up
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "sort-tabs",
|
||||
"shownContainersCount": <number-of-containers-with-tabs-shown>,
|
||||
"totalContainerTabsCount": <number-of-all-container-tabs>,
|
||||
"totalNonContainerTabsCount": <number-of-all-non-container-tabs>
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks "Hide these container tabs" in the popup
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"clickedContainerTabCount": <number-of-tabs-in-the-container>,
|
||||
"event": "hide-tabs",
|
||||
"hiddenContainersCount": <number-of-containers-with-tabs-hidden>,
|
||||
"shownContainersCount": <number-of-containers-with-tabs-shown>,
|
||||
"totalContainersCount": <number-of-containers-with-tabs-hidden-or-shown>
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks "Show these container tabs" in the popup
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"clickedContainerTabCount": <number-of-tabs-in-the-container>,
|
||||
"event": "show-tabs",
|
||||
"hiddenContainersCount": <number-of-containers-with-tabs-hidden>,
|
||||
"shownContainersCount": <number-of-containers-with-tabs-shown>,
|
||||
"totalContainersCount": <number-of-containers-with-tabs-hidden-or-shown>
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks "Move tabs to a new window" in the popup
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"clickedContainerTabCount": <number-of-tabs-in-the-container>,
|
||||
"event": "move-tabs-to-window"
|
||||
}
|
||||
```
|
||||
|
||||
* When a user encounters the disabled "move" feature because of incompatible add-ons
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "incompatible-addons-detected"
|
||||
}
|
||||
```
|
||||
|
||||
* The user closes a tab
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "page-requests-completed-per-tab",
|
||||
"pageRequestCount": <pageRequestCount>
|
||||
}
|
||||
```
|
||||
|
||||
* The user goes idle
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "page-requests-completed-per-activity",
|
||||
"pageRequestCount": <pageRequestCount>
|
||||
}
|
||||
```
|
||||
|
||||
* The user chooses "Always Open in this Container" context menu option. (Note: We send two separate event names: one for assigning a site to a container, one for removing a site from a container.)
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "[added|removed]-container-assignment"
|
||||
}
|
||||
```
|
||||
|
||||
* Firefox prompts the user to reload a site into a container after the user picked "Always Open in this Container".
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "prompt-reload-page-in-container"
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks "Open in *assigned* container" to reload a site into a container after the user picked "Always Open in this Container".
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "click-to-reload-page-in-container"
|
||||
}
|
||||
```
|
||||
|
||||
* The user clicks "Open in *Current* container" to reload a site into a container after the user picked "Always Open in this Container".
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"event": "click-to-reload-page-in-same-container"
|
||||
}
|
||||
```
|
||||
|
||||
* Firefox automatically reloads a site into a container after the user picked "Always Open in this Container".
|
||||
|
||||
```js
|
||||
{
|
||||
"uuid": <uuid>,
|
||||
"userContextId": <userContextId>,
|
||||
"event": "auto-reload-page-in-container"
|
||||
}
|
||||
```
|
||||
|
||||
### A Redshift schema for the payload:
|
||||
|
||||
```lua
|
||||
local schema = {
|
||||
-- column name field type length attributes field name
|
||||
{"uuid", "VARCHAR", 255, nil, "Fields[payload.uuid]"},
|
||||
{"userContextId", "INTEGER", 255, nil, "Fields[payload.userContextId]"},
|
||||
{"clickedContainerTabCount", "INTEGER", 255, nil, "Fields[payload.clickedContainerTabCount]"},
|
||||
{"eventSource", "VARCHAR", 255, nil, "Fields[payload.eventSource]"},
|
||||
{"event", "VARCHAR", 255, nil, "Fields[payload.event]"},
|
||||
{"pageRequestCount", "INTEGER", 255, nil, "Fields[payload.pageRequestCount]"}
|
||||
{"hiddenContainersCount", "INTEGER", 255, nil, "Fields[payload.hiddenContainersCount]"},
|
||||
{"shownContainersCount", "INTEGER", 255, nil, "Fields[payload.shownContainersCount]"},
|
||||
{"totalContainersCount", "INTEGER", 255, nil, "Fields[payload.totalContainersCount]"},
|
||||
{"totalContainerTabsCount", "INTEGER", 255, nil, "Fields[payload.totalContainerTabsCount]"},
|
||||
{"totalNonContainerTabsCount", "INTEGER", 255, nil, "Fields[payload.totalNonContainerTabsCount]"}
|
||||
}
|
||||
```
|
||||
|
||||
### Valid data should be enforced on the server side:
|
||||
|
||||
* `eventSource` should be one of `tab-bar`, `pop-up`, `file-menu`, "alltabs-nmenu" or "plus-button".
|
||||
|
||||
All Mozilla data is kept by default for 180 days and in accordance with our
|
||||
privacy policies.
|
31
docs/release.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Release a new version
|
||||
|
||||
## Make the new version
|
||||
|
||||
1. Bump the version number in `package.json` and `manifest.json`
|
||||
2. Commit the version number bump
|
||||
3. Create a git tag for the version: `git tag <version>`
|
||||
4. Push the tag up to GitHub: `git push --tags`
|
||||
|
||||
## Publish to AMO
|
||||
|
||||
1. Run `./bin/build-addon.sh`
|
||||
2. [Upload the zip file to AMO][amo-upload]
|
||||
|
||||
## Publish to GitHub
|
||||
|
||||
Finally, we also publish the release to GitHub.
|
||||
|
||||
1. Download the signed `.xpi` from [the addon versions page][addon-page]
|
||||
2. [Create a new release on GitHub][gh-release]
|
||||
* For *Tag version* and *Release title*, use the version number
|
||||
* For *Release notes*, copy the output of:
|
||||
```
|
||||
git log --no-merges \
|
||||
--pretty=format:"%h %s" <previous-version>..<new-version>
|
||||
```
|
||||
* For the *Attach binaries*, select the signed `.xpi` file
|
||||
|
||||
[addon-page]: https://addons.mozilla.org/developers/addon/multi-account-containers/versions
|
||||
[amo-upload]: https://addons.mozilla.org/developers/addon/multi-account-containers/versions/submit/
|
||||
[gh-release]: https://github.com/mozilla/multi-account-containers/releases/new
|
22
install.rdf
|
@ -1,22 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
|
||||
<Description about="urn:mozilla:install-manifest">
|
||||
<em:id>@testpilot-containers</em:id>
|
||||
<em:type>2</em:type>
|
||||
<em:bootstrap>true</em:bootstrap>
|
||||
<em:multiprocessCompatible>true</em:multiprocessCompatible>
|
||||
<em:hasEmbeddedWebExtension>true</em:hasEmbeddedWebExtension>
|
||||
<em:name>Testpilot containers</em:name>
|
||||
<em:targetApplication>
|
||||
<Description>
|
||||
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!--Firefox-->
|
||||
<em:minVersion>51.0a1</em:minVersion>
|
||||
<em:maxVersion>*</em:maxVersion>
|
||||
</Description>
|
||||
</em:targetApplication>
|
||||
<em:version>3.1.1</em:version>
|
||||
<em:unpack>false</em:unpack>
|
||||
</Description>
|
||||
</RDF>
|
||||
|
25098
package-lock.json
generated
Normal file
61
package.json
|
@ -1,43 +1,54 @@
|
|||
{
|
||||
"name": "testpilot-containers",
|
||||
"title": "Containers Experiment",
|
||||
"description": "Containers works by isolating cookie jars using separate origin-attributes defined visually by colored ‘Container Tabs’. This add-on is a modified version of the containers feature for Firefox Test Pilot.",
|
||||
"version": "3.1.1",
|
||||
"author": "Andrea Marchesini, Luke Crouch and Jonathan Kingston",
|
||||
"title": "Multi-Account Containers",
|
||||
"description": "Containers helps you keep all the parts of your online life contained in different tabs. Custom labels and color-coded tabs help keep different activities — like online shopping, travel planning, or checking work email — separate.",
|
||||
"version": "8.3.0",
|
||||
"author": "Andrea Marchesini, Luke Crouch, Lesley Norton, Kendall Werts, Maxx Crawford, Jonathan Kingston",
|
||||
"bugs": {
|
||||
"url": "https://github.com/mozilla/testpilot-containers/issues"
|
||||
"url": "https://github.com/mozilla/multi-account-containers/issues"
|
||||
},
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"addons-linter": "^0.15.14",
|
||||
"deploy-txp": "^1.0.7",
|
||||
"eslint": "^3.17.1",
|
||||
"eslint-plugin-no-unsanitized": "^2.0.0",
|
||||
"eslint-plugin-promise": "^3.4.0",
|
||||
"htmllint-cli": "^0.0.5",
|
||||
"jpm": "^1.2.2",
|
||||
"json": "^9.0.6",
|
||||
"addons-linter": "^5.28.0",
|
||||
"ajv": "^6.6.3",
|
||||
"chai": "^4.2.0",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-plugin-no-unsanitized": "^4.0.0",
|
||||
"eslint-plugin-promise": "^5.2.0",
|
||||
"htmllint-cli": "0.0.7",
|
||||
"json": ">=10.0.0",
|
||||
"mocha": "^10.1.0",
|
||||
"npm-run-all": "^4.0.0",
|
||||
"stylelint": "^7.9.0",
|
||||
"stylelint-config-standard": "^16.0.0",
|
||||
"stylelint-order": "^0.3.0"
|
||||
"nyc": "^15.0.0",
|
||||
"sinon": "^7.5.0",
|
||||
"sinon-chai": "^3.3.0",
|
||||
"stylelint": "^13.5.0",
|
||||
"stylelint-config-standard": "^20.0.0",
|
||||
"stylelint-order": "^4.0.0",
|
||||
"web-ext": "^7.5.0",
|
||||
"webextensions-jsdom": "^1.2.1"
|
||||
},
|
||||
"homepage": "https://github.com/mozilla/testpilot-containers#readme",
|
||||
"homepage": "https://github.com/mozilla/multi-account-containers#readme",
|
||||
"license": "MPL-2.0",
|
||||
"main": "index.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/mozilla/testpilot-containers.git"
|
||||
"url": "git+https://github.com/mozilla/multi-account-containers.git"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "npm test && jpm xpi",
|
||||
"deploy": "deploy-txp",
|
||||
"build": "web-ext build -s src/",
|
||||
"dev": "npm run remove-locales-github && web-ext run -s src/",
|
||||
"lint": "npm-run-all lint:*",
|
||||
"lint:addon": "addons-linter webextension --self-hosted",
|
||||
"lint:css": "stylelint webextension/css/*.css",
|
||||
"lint:html": "htmllint webextension/*.html",
|
||||
"lint:addon": "./bin/addons-linter.sh",
|
||||
"lint:css": "stylelint src/css/*.css",
|
||||
"lint:html": "htmllint *.html",
|
||||
"lint:js": "eslint .",
|
||||
"package": "npm run build && mv testpilot-containers.xpi addon.xpi",
|
||||
"test": "npm run lint"
|
||||
"package": "rm -rf src/web-ext-artifacts && npm run build && mv src/web-ext-artifacts/firefox_multi-account_containers-*.zip addon.xpi",
|
||||
"restore-locales-github": "cd src/_locales && git restore .github/",
|
||||
"remove-locales-github": "rm -rf src/_locales/.github",
|
||||
"test": "npm run lint && npm run coverage",
|
||||
"test:once": "mocha test/**/*.test.js",
|
||||
"test:watch": "npm run test:once -- --watch",
|
||||
"coverage": "nyc --reporter=html --reporter=text mocha test/**/*.test.js --timeout 60000"
|
||||
}
|
||||
}
|
||||
|
|
1
src/_locales
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit bdaa01291b7367a5e815470fd263ea36c862fe32
|
49
src/confirm-page.html
Normal file
|
@ -0,0 +1,49 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title data-i18n-message-id="confirmNavigationTitle"></title>
|
||||
<link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="chrome://browser/skin/aboutNetError.css" type="text/css" media="all" />
|
||||
<link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" href="chrome://global/skin/aboutNetError.css" type="text/css" media="all" />
|
||||
<script type="text/javascript" src="./js/i18n.js"></script>
|
||||
<link rel="stylesheet" href="/css/confirm-page.css" />
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<div class="title">
|
||||
<h1 class="title-text" data-i18n-message-id="openThisSiteConfirmation"></h1>
|
||||
</div>
|
||||
<form id="redirect-form">
|
||||
<p data-message-id="youAskedFireFox" data-message-arg="container-name"></p>
|
||||
<div id="redirect-url"></div>
|
||||
<p data-i18n-message-id="wouldYouStillLikeToOpenConfirmation"></p>
|
||||
<br />
|
||||
<br />
|
||||
<label for="never-ask" class="check-label">
|
||||
<input id="never-ask" type="checkbox" />
|
||||
<span data-i18n-message-id="rememberMyDecision"></span>
|
||||
</label>
|
||||
<br />
|
||||
<div class="button-container">
|
||||
<button id="deny"
|
||||
class="button"
|
||||
data-message-id="openInContainer"
|
||||
data-message-arg="current-container-name">
|
||||
</button>
|
||||
<button id="deny-no-container"
|
||||
class="button"
|
||||
data-message-id="openInNoContainer">
|
||||
</button>
|
||||
<button id="confirm"
|
||||
class="button primary"
|
||||
autofocus
|
||||
data-message-id="openInContainer"
|
||||
data-message-arg="container-name">
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</main>
|
||||
|
||||
<script src="js/utils.js"></script>
|
||||
<script src="js/confirm-page.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -5,8 +5,8 @@
|
|||
|
||||
main {
|
||||
background: url(/img/onboarding-4.png) no-repeat;
|
||||
background-position: -10px -15px;
|
||||
background-size: 300px;
|
||||
background-position: 200px 0;
|
||||
background-size: 120px;
|
||||
margin-inline-start: -350px;
|
||||
padding-inline-start: 350px;
|
||||
}
|
||||
|
@ -18,17 +18,16 @@ main {
|
|||
button .container-name,
|
||||
#current-container-name {
|
||||
font-weight: bold;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1300px) {
|
||||
@media only screen and (max-width: 900px) {
|
||||
main {
|
||||
background: none;
|
||||
}
|
||||
|
||||
/* for a mid sized window we have enough for this but not our image */
|
||||
.title {
|
||||
background-image: url("chrome://global/skin/icons/info.svg");
|
||||
background-image: url('chrome://global/skin/icons/info.svg');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,7 +46,7 @@ html {
|
|||
}
|
||||
|
||||
#redirect-url {
|
||||
background: #efefef;
|
||||
background: #efedf0; /* Grey 20 */
|
||||
border-radius: 2px;
|
||||
line-height: 1.5;
|
||||
padding-block-end: 0.5rem;
|
||||
|
@ -56,6 +55,15 @@ html {
|
|||
padding-inline-start: 0.5rem;
|
||||
}
|
||||
|
||||
/* stylelint-disable media-feature-name-no-unknown */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
#redirect-url {
|
||||
background: #38383d; /* Grey 70 */
|
||||
color: #eee; /* White 20 */
|
||||
}
|
||||
}
|
||||
/* stylelint-enable */
|
||||
|
||||
#redirect-url img {
|
||||
block-size: 16px;
|
||||
inline-size: 16px;
|
||||
|
@ -68,6 +76,11 @@ dfn {
|
|||
font-style: normal;
|
||||
}
|
||||
|
||||
#deny,
|
||||
#confirm {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.button-container > button {
|
||||
min-inline-size: 240px;
|
||||
}
|
122
src/css/options.css
Normal file
|
@ -0,0 +1,122 @@
|
|||
body {
|
||||
--grey10: #e7e7e7;
|
||||
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||
background: #fff;
|
||||
color: rgb(74, 74, 79);
|
||||
font-size: 13px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
h3:first-of-type {
|
||||
margin-block-start: 2.5rem;
|
||||
}
|
||||
|
||||
label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
label > span {
|
||||
padding-inline-end: 4px;
|
||||
}
|
||||
|
||||
.settings-group {
|
||||
margin-block-end: 16px;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-block-end: 1rem;
|
||||
}
|
||||
|
||||
.settings-group p {
|
||||
margin-inline-start: 24px;
|
||||
margin-block: 4px 8px;
|
||||
}
|
||||
|
||||
input[type="checkbox"] {
|
||||
margin-inline: 0 8px;
|
||||
margin-block: 1px auto;
|
||||
inline-size: 16px;
|
||||
block-size: 16px;
|
||||
}
|
||||
|
||||
button {
|
||||
margin-inline: 0 auto;
|
||||
}
|
||||
|
||||
.keyboard-shortcut {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
max-inline-size: 70%;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.moz-vpn-proxy-permissions {
|
||||
margin-block: 0 2rem;
|
||||
padding-block-end: 1rem;
|
||||
border-block-end: 1px solid var(--grey10);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
h3.moz-vpn-proxy-permissions-title {
|
||||
margin-block-start: 0;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.warning-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.warning-icon.show-warning::before {
|
||||
background-image: url("/img/warning.svg");
|
||||
background-size: 24px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
content: "";
|
||||
display: block;
|
||||
block-size: 24px;
|
||||
inline-size: 24px;
|
||||
margin-inline-end: 0.5rem;
|
||||
}
|
||||
|
||||
.moz-vpn-proxy-permissions-title::before,
|
||||
.moz-vpn-proxy-permissions-title::after {
|
||||
background-color: var(--grey10);
|
||||
content: "";
|
||||
height: 1px;
|
||||
flex: 1 1 0%;
|
||||
}
|
||||
|
||||
h3.moz-vpn-proxy-permissions-title::before {
|
||||
margin-inline-end: 2rem;
|
||||
margin-inline-start: -50%;
|
||||
}
|
||||
|
||||
h3.moz-vpn-proxy-permissions-title::after {
|
||||
margin-inline-start: 2rem;
|
||||
margin-inline-end: -50%;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
background: #23212a;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
p {
|
||||
color: rgb(177, 177, 179);
|
||||
}
|
||||
}
|
2411
src/css/popup.css
Normal file
BIN
src/fonts/Inter-Medium.woff2
Normal file
BIN
src/fonts/Inter-Regular.woff2
Normal file
BIN
src/fonts/Metropolis-Light.woff2
Executable file
BIN
src/fonts/Metropolis-Medium.woff2
Executable file
3
src/img/Account.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 160"><defs><style>.cls-1{fill:#6a57a5;}.cls-2{fill:#5a4a9e;}.cls-3{fill:#e7dfff;}</style></defs><title>account</title><path class="cls-1" d="M110,138.89A58.89,58.89,0,1,1,168.89,80,59,59,0,0,1,110,138.89Z"/><path class="cls-2" d="M110,130.27A50.27,50.27,0,1,1,160.27,80,50.33,50.33,0,0,1,110,130.27Z"/><circle class="cls-3" cx="110.39" cy="65.12" r="23.27" transform="translate(-12.01 27.1) rotate(-13.28)"/><path class="cls-3" d="M141.78,92.87c-8.2-9.46-19.58,3.28-31.39,3.28S87.2,83.41,79,92.87a7.83,7.83,0,0,0-.53,9.53,38.43,38.43,0,0,0,63.83,0A7.83,7.83,0,0,0,141.78,92.87Z"/></svg>
|
After Width: | Height: | Size: 887 B |
3
src/img/Sync.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 160"><defs><style>.cls-1{fill:#9f9fad;}.cls-2{fill:#5a4a9e;}.cls-3{fill:#6a57a5;}.cls-4{fill:#8f8f9d;}.cls-5{fill:none;stroke:#80808e;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.6px;}.cls-6{fill:#231f20;opacity:0.4;}.cls-7{fill:#ee3389;}.cls-8{fill:#7661aa;}</style></defs><title>Sync</title><path class="cls-1" d="M119.16,122.69v4.81H19.76v-4.81l12.83-3.21h72.15Z"/><rect class="cls-1" x="24.57" y="55.35" width="89.79" height="67.34" rx="3"/><path class="cls-2" d="M79.08,65l-49.7,49.7a1.61,1.61,0,0,0,1.6,1.61h77a1.62,1.62,0,0,0,1.61-1.61V65Z"/><polygon class="cls-3" points="29.38 64.97 29.38 114.67 79.08 64.97 29.38 64.97"/><path class="cls-2" d="M107.94,60.16H31a1.6,1.6,0,0,0-1.6,1.6V65h80.17V61.76A1.61,1.61,0,0,0,107.94,60.16Z"/><path class="cls-4" d="M108.74,121.09H30.18a.81.81,0,0,1,0-1.61h78.56a.81.81,0,1,1,0,1.61Z"/><line class="cls-5" x1="63.61" y1="124.18" x2="74.83" y2="124.18"/><path class="cls-6" d="M114.35,127.35H102.2V71.64a5.53,5.53,0,0,1,5.52-5.53h6.63Z"/><path class="cls-1" d="M200.24,134.72v4.81h-99.4v-4.81l12.82-3.21h72.15Z"/><rect class="cls-1" x="105.65" y="67.38" width="89.79" height="67.34" rx="3"/><path class="cls-2" d="M160.16,77l-49.71,49.7a1.61,1.61,0,0,0,1.61,1.6h77a1.6,1.6,0,0,0,1.6-1.6V77Z"/><polygon class="cls-3" points="110.45 77 110.45 126.7 160.16 77 110.45 77"/><path class="cls-2" d="M189,72.19h-77a1.61,1.61,0,0,0-1.61,1.6V77h80.17V73.79A1.6,1.6,0,0,0,189,72.19Z"/><path class="cls-4" d="M189.82,133.11H111.26a.8.8,0,1,1,0-1.6h78.56a.8.8,0,0,1,0,1.6Z"/><line class="cls-5" x1="144.69" y1="136.2" x2="155.91" y2="136.2"/><path class="cls-7" d="M136.85,50l-3-.55a3,3,0,0,0-3.51,2.37l-.27,1.45c-1.59,8.36-9.86,14.42-19.66,14.42a21,21,0,0,1-15.93-6.89H103a3,3,0,0,0,3-3v-3a3,3,0,0,0-3-3H84.86a3,3,0,0,0-3,3V73.64a3,3,0,0,0,3,3h3a3,3,0,0,0,3-3V69.72a30.8,30.8,0,0,0,19.57,6.87c14.15,0,26.15-9.11,28.54-21.66l.27-1.45A2.94,2.94,0,0,0,136.85,50Z"/><path class="cls-8" d="M84.06,47l3,.54a3.41,3.41,0,0,0,.55,0,3,3,0,0,0,3-2.41l.27-1.45h0c1.59-8.36,9.86-14.42,19.65-14.42a21,21,0,0,1,15.94,6.89H117.9a3,3,0,0,0-3,3v3a3,3,0,0,0,3,3h18.15a3,3,0,0,0,3-3V23.43a3,3,0,0,0-3-3h-3a3,3,0,0,0-3,3v3.92a30.82,30.82,0,0,0-19.58-6.88c-14.14,0-26.14,9.11-28.53,21.67l-.27,1.45A3,3,0,0,0,84.06,47Z"/></svg>
|
After Width: | Height: | Size: 2.5 KiB |
3
src/img/amo-icon.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg width="32px" height="33px" viewBox="0 0 32 33" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch --> <desc>Created with Sketch.</desc> <defs> <linearGradient x1="74.0423237%" y1="18.5882821%" x2="0%" y2="100%" id="linearGradient-1"> <stop stop-color="#00FEFF" offset="0%"/> <stop stop-color="#3D85FF" offset="100%"/> </linearGradient> </defs> <g id="Specs" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="Header-Copy" transform="translate(-182.000000, -152.000000)" fill="url(#linearGradient-1)"> <path d="M205.58574,176.859518 L205.58574,169.287998 C205.58574,169.287998 205.800116,167.315137 207.086372,167.315137 C208.372629,167.315137 208.265441,169.394639 210.677171,169.394639 C211.909834,169.394639 214,168.754792 214,165.022352 C214,161.289912 211.909834,160.810027 210.677171,160.810027 C208.265441,160.810027 208.372629,162.782888 207.086372,162.782888 C205.800116,162.782888 205.58574,160.756707 205.58574,160.756707 L205.58574,157.664114 C205.58574,156.491061 204.621048,155.531291 203.44198,155.531291 L197.814608,155.531291 C197.814608,155.531291 195.992412,155.211368 195.992412,153.931674 C195.992412,152.65198 198.028985,152.545339 198.028985,150.145914 C198.028985,148.91954 197.332262,147 193.580682,147 C189.829101,147 189.293161,148.91954 189.293161,150.145914 C189.293161,152.545339 191.115357,152.65198 191.115357,153.931674 C191.115357,155.211368 189.293161,155.531291 189.293161,155.531291 L184.148135,155.531291 C182.969067,155.531291 182.004375,156.491061 182.004375,157.664114 L182.004375,161.823118 C182.004375,161.823118 181.789999,165.022352 184.362512,165.022352 C186.023926,165.022352 186.07752,162.836209 188.274874,162.836209 C189.346755,162.836209 190.418635,163.8493 190.418635,166.035443 C190.418635,168.274907 189.346755,169.394639 188.274874,169.394639 C186.131114,169.394639 186.023926,167.208496 184.362512,167.208496 C181.789999,167.208496 182.004375,170.301089 182.004375,170.301089 L182.004375,176.859518 C182.004375,178.032571 182.969067,178.992341 184.148135,178.992341 L191.115357,178.992341 C191.115357,178.992341 194.49178,179.205623 194.49178,176.646236 C194.49178,174.993299 192.348019,174.726696 192.348019,172.540552 C192.348019,171.474141 193.527088,170.141127 195.778036,170.141127 C198.028985,170.141127 199.315241,171.474141 199.315241,172.540552 C199.315241,174.673375 197.225074,174.993299 197.225074,176.646236 C197.225074,179.258944 200.601497,178.992341 200.601497,178.992341 L203.44198,178.992341 C204.621048,178.992341 205.58574,178.032571 205.58574,176.859518 Z" id="Shape-Copy-23" transform="translate(198.000000, 163.000000) rotate(-42.000000) translate(-198.000000, -163.000000) "/> </g> </g> </svg>
|
After Width: | Height: | Size: 3 KiB |
3
src/img/arrow-icon-left-light.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#ffffff" d="M6.414 8l4.293-4.293a1 1 0 0 0-1.414-1.414l-5 5a1 1 0 0 0 0 1.414l5 5a1 1 0 0 0 1.414-1.414z"></path></svg>
|
After Width: | Height: | Size: 426 B |
3
src/img/arrow-icon-left.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="context-fill" d="M6.414 8l4.293-4.293a1 1 0 0 0-1.414-1.414l-5 5a1 1 0 0 0 0 1.414l5 5a1 1 0 0 0 1.414-1.414z"></path></svg>
|
After Width: | Height: | Size: 431 B |
24
src/img/arrow-icon-right-light.svg
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg width="5px" height="8px" viewBox="0 0 5 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
|
||||
<title>Arrow</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<path d="M5.00090934,9.5006316 C4.79840046,9.50099392 4.61567086,9.37916873 4.53812503,9.19209489 C4.4605792,9.00502105 4.5035325,8.78964579 4.64690934,8.6466316 L7.29490934,6.0006316 L4.64690934,3.3546316 C4.45140054,3.1591228 4.45140054,2.8421404 4.64690934,2.6466316 C4.84241814,2.4511228 5.15940054,2.4511228 5.35490934,2.6466316 L8.35490934,5.6466316 C8.44895104,5.74043586 8.50180313,5.86780434 8.50180313,6.0006316 C8.50180313,6.13345886 8.44895104,6.26082734 8.35490934,6.3546316 L5.35490934,9.3546316 C5.26095861,9.44834555 5.13360821,9.5008686 5.00090934,9.5006316 Z" id="path-1"></path>
|
||||
</defs>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.6">
|
||||
<g id="Icons-/-12-/-Arrowhead-Right-12---Thin" transform="translate(-4.000000, -2.000000)">
|
||||
<rect id="bouding-box" x="0" y="0" width="12" height="12"></rect>
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<g id="Shape" fill-rule="nonzero"></g>
|
||||
<g id="Color-/-Photon-/-Primary---Grey-90-80%" mask="url(#mask-2)" fill="#ffffff" fill-opacity="0.8" fill-rule="evenodd">
|
||||
<rect id="Rectangle" x="0" y="0" width="12" height="12"></rect>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
24
src/img/arrow-icon-right.svg
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg width="5px" height="8px" viewBox="0 0 5 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
|
||||
<title>Arrow</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<path d="M5.00090934,9.5006316 C4.79840046,9.50099392 4.61567086,9.37916873 4.53812503,9.19209489 C4.4605792,9.00502105 4.5035325,8.78964579 4.64690934,8.6466316 L7.29490934,6.0006316 L4.64690934,3.3546316 C4.45140054,3.1591228 4.45140054,2.8421404 4.64690934,2.6466316 C4.84241814,2.4511228 5.15940054,2.4511228 5.35490934,2.6466316 L8.35490934,5.6466316 C8.44895104,5.74043586 8.50180313,5.86780434 8.50180313,6.0006316 C8.50180313,6.13345886 8.44895104,6.26082734 8.35490934,6.3546316 L5.35490934,9.3546316 C5.26095861,9.44834555 5.13360821,9.5008686 5.00090934,9.5006316 Z" id="path-1"></path>
|
||||
</defs>
|
||||
<g id="Symbols" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.6">
|
||||
<g id="Icons-/-12-/-Arrowhead-Right-12---Thin" transform="translate(-4.000000, -2.000000)">
|
||||
<rect id="bouding-box" x="0" y="0" width="12" height="12"></rect>
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<g id="Shape" fill-rule="nonzero"></g>
|
||||
<g id="Color-/-Photon-/-Primary---Grey-90-80%" mask="url(#mask-2)" fill="#000000" fill-rule="evenodd">
|
||||
<rect id="Rectangle" x="0" y="0" width="12" height="12"></rect>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
3
src/img/arrow-toggle.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.71054 11.1175L11.3005 13.7075C11.6905 14.0975 12.3205 14.0975 12.7105 13.7075L15.3005 11.1175C15.9305 10.4875 15.4805 9.4075 14.5905 9.4075H9.41054C8.52054 9.4075 8.08054 10.4875 8.71054 11.1175Z" fill="#6D6D6E"/>
|
||||
</svg>
|
After Width: | Height: | Size: 329 B |
8
src/img/blank-favicon.svg
Normal file
After Width: | Height: | Size: 61 KiB |
5
src/img/blank-tab.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18">
|
||||
<path d="M17,12v2a1,1,0,0,1-1,1H2a1,1,0,0,1-1-1V12a1,1,0,0,1,1-1H1.142c2.3,0,2.536-1.773,2.874-4,0.351-2.316.083-4,3.13-4h3.707C13.917,3,13.647,4.684,14,7c0.34,2.228.582,4,2.89,4H16A1,1,0,0,1,17,12Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 518 B |
3
src/img/close-light.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.2225 11.9895L17.7594 7.45261C17.9155 7.29095 18.0019 7.07443 18 6.84969C17.998 6.62495 17.9079 6.40997 17.7489 6.25105C17.59 6.09213 17.375 6.00199 17.1503 6.00003C16.9256 5.99808 16.709 6.08447 16.5474 6.24061L12.0105 10.7775L7.47368 6.24061C7.31202 6.08447 7.0955 5.99808 6.87076 6.00003C6.64602 6.00199 6.43104 6.09213 6.27212 6.25105C6.1132 6.40997 6.02305 6.62495 6.0211 6.84969C6.01914 7.07443 6.10554 7.29095 6.26168 7.45261L10.7985 11.9895L6.26168 16.5263C6.17981 16.6054 6.11451 16.7 6.06959 16.8045C6.02467 16.9091 6.00102 17.0216 6.00003 17.1354C5.99904 17.2492 6.02073 17.3621 6.06383 17.4674C6.10693 17.5728 6.17057 17.6685 6.25105 17.7489C6.33153 17.8294 6.42723 17.8931 6.53257 17.9362C6.63791 17.9793 6.75078 18.001 6.86459 18C6.9784 17.999 7.09088 17.9753 7.19545 17.9304C7.30003 17.8855 7.39461 17.8202 7.47368 17.7383L12.0105 13.2015L16.5474 17.7383C16.709 17.8945 16.9256 17.9809 17.1503 17.9789C17.375 17.9769 17.59 17.8868 17.7489 17.7279C17.9079 17.569 17.998 17.354 18 17.1292C18.0019 16.9045 17.9155 16.688 17.7594 16.5263L13.2225 11.9895Z" fill="#ffffff"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
3
src/img/close.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.2225 11.9895L17.7594 7.45261C17.9155 7.29095 18.0019 7.07443 18 6.84969C17.998 6.62495 17.9079 6.40997 17.7489 6.25105C17.59 6.09213 17.375 6.00199 17.1503 6.00003C16.9256 5.99808 16.709 6.08447 16.5474 6.24061L12.0105 10.7775L7.47368 6.24061C7.31202 6.08447 7.0955 5.99808 6.87076 6.00003C6.64602 6.00199 6.43104 6.09213 6.27212 6.25105C6.1132 6.40997 6.02305 6.62495 6.0211 6.84969C6.01914 7.07443 6.10554 7.29095 6.26168 7.45261L10.7985 11.9895L6.26168 16.5263C6.17981 16.6054 6.11451 16.7 6.06959 16.8045C6.02467 16.9091 6.00102 17.0216 6.00003 17.1354C5.99904 17.2492 6.02073 17.3621 6.06383 17.4674C6.10693 17.5728 6.17057 17.6685 6.25105 17.7489C6.33153 17.8294 6.42723 17.8931 6.53257 17.9362C6.63791 17.9793 6.75078 18.001 6.86459 18C6.9784 17.999 7.09088 17.9753 7.19545 17.9304C7.30003 17.8855 7.39461 17.8202 7.47368 17.7383L12.0105 13.2015L16.5474 17.7383C16.709 17.8945 16.9256 17.9809 17.1503 17.9789C17.375 17.9769 17.59 17.8868 17.7489 17.7279C17.9079 17.569 17.998 17.354 18 17.1292C18.0019 16.9045 17.9155 16.688 17.7594 16.5263L13.2225 11.9895Z" fill="black"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
5
src/img/container-close-tab.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. --><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 7 7">
|
||||
<polygon fill="#FFFFFF" points="5.8,0 3.5,2.4 1.2,0 0,1.2 2.4,3.5 0.1,5.8 1.2,7 3.5,4.7 5.8,7 7,5.8 4.7,3.5 7,1.2"/>
|
||||
</svg>
|
After Width: | Height: | Size: 394 B |
7
src/img/container-delete.svg
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 12 12" style="enable-background:new 0 0 12 12;" xml:space="preserve">
|
||||
<path fill="#FFFFFF" d="M4.6,0.3h2.7c0.1,0,0.2,0.1,0.2,0.2v1H4.4v-1C4.4,0.4,4.5,0.3,4.6,0.3z M1.7,1.5h8.6c0.1,0,0.2,0.1,0.2,0.2
|
||||
l0.2,1.4H1.3l0.2-1.4C1.5,1.6,1.6,1.5,1.7,1.5z M6,11.7H3.2L2.1,3.9H6h3.9l-1.1,7.8H6L6,11.7z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 779 B |
13
src/img/container-move.svg
Normal file
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><script xmlns=""/>
|
||||
<defs/>
|
||||
<g id="All" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="hamburger-menu" fill="#858585">
|
||||
<g id="Group" transform="translate(2.000000, 6.000000)">
|
||||
<rect id="Rectangle-path" x="0" y="0" width="26" height="2"/>
|
||||
<rect id="Rectangle-path" x="0" y="8" width="26" height="2"/>
|
||||
<rect id="Rectangle-path" x="0" y="16" width="26" height="2"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 706 B |
|
@ -1,4 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 20 20" style="enable-background:new 0 0 20 20;" xml:space="preserve">
|
Before Width: | Height: | Size: 883 B After Width: | Height: | Size: 1.1 KiB |
9
src/img/container-openin-16.svg
Normal file
|
@ -0,0 +1,9 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg data-name="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
|
||||
<rect x="1" y="1" width="6" height="6" rx="1"/>
|
||||
<rect x="1" y="9" width="6" height="6" rx="1"/>
|
||||
<rect x="9" y="9" width="6" height="6" rx="1"/>
|
||||
<path fill="context-fill" fill-opacity="context-fill-opacity" d="M14.92 1.62a1 1 0 0 0-0.54-0.54A1 1 0 0 0 14 1h-4a1 1 0 0 0 0 2h1.59l-2.3 2.29a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0L13 4.41V6a1 1 0 0 0 2 0V2a1 1 0 0 0-0.08-0.38z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 677 B |
Before Width: | Height: | Size: 399 B After Width: | Height: | Size: 399 B |
BIN
src/img/flags/AC.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
src/img/flags/AD.png
Normal file
After Width: | Height: | Size: 697 B |
BIN
src/img/flags/AE.png
Normal file
After Width: | Height: | Size: 287 B |
BIN
src/img/flags/AF.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/img/flags/AG.png
Normal file
After Width: | Height: | Size: 849 B |
BIN
src/img/flags/AI.png
Normal file
After Width: | Height: | Size: 989 B |
BIN
src/img/flags/AL.png
Normal file
After Width: | Height: | Size: 662 B |
BIN
src/img/flags/AM.png
Normal file
After Width: | Height: | Size: 245 B |
BIN
src/img/flags/AO.png
Normal file
After Width: | Height: | Size: 723 B |
BIN
src/img/flags/AQ.png
Normal file
After Width: | Height: | Size: 481 B |
BIN
src/img/flags/AR.png
Normal file
After Width: | Height: | Size: 453 B |
BIN
src/img/flags/AS.png
Normal file
After Width: | Height: | Size: 847 B |
BIN
src/img/flags/AT.png
Normal file
After Width: | Height: | Size: 205 B |
BIN
src/img/flags/AU.png
Normal file
After Width: | Height: | Size: 835 B |
BIN
src/img/flags/AW.png
Normal file
After Width: | Height: | Size: 387 B |
BIN
src/img/flags/AX.png
Normal file
After Width: | Height: | Size: 230 B |
BIN
src/img/flags/AZ.png
Normal file
After Width: | Height: | Size: 402 B |
BIN
src/img/flags/BA.png
Normal file
After Width: | Height: | Size: 652 B |
BIN
src/img/flags/BB.png
Normal file
After Width: | Height: | Size: 406 B |
BIN
src/img/flags/BD.png
Normal file
After Width: | Height: | Size: 336 B |
BIN
src/img/flags/BE.png
Normal file
After Width: | Height: | Size: 233 B |
BIN
src/img/flags/BF.png
Normal file
After Width: | Height: | Size: 390 B |
BIN
src/img/flags/BG.png
Normal file
After Width: | Height: | Size: 244 B |
BIN
src/img/flags/BH.png
Normal file
After Width: | Height: | Size: 411 B |
BIN
src/img/flags/BI.png
Normal file
After Width: | Height: | Size: 940 B |
BIN
src/img/flags/BJ.png
Normal file
After Width: | Height: | Size: 279 B |
BIN
src/img/flags/BL.png
Normal file
After Width: | Height: | Size: 978 B |
BIN
src/img/flags/BM.png
Normal file
After Width: | Height: | Size: 919 B |
BIN
src/img/flags/BN.png
Normal file
After Width: | Height: | Size: 884 B |
BIN
src/img/flags/BO.png
Normal file
After Width: | Height: | Size: 666 B |
BIN
src/img/flags/BQ.png
Normal file
After Width: | Height: | Size: 871 B |
BIN
src/img/flags/BR.png
Normal file
After Width: | Height: | Size: 805 B |
BIN
src/img/flags/BS.png
Normal file
After Width: | Height: | Size: 419 B |
BIN
src/img/flags/BT.png
Normal file
After Width: | Height: | Size: 1,000 B |
BIN
src/img/flags/BV.png
Normal file
After Width: | Height: | Size: 270 B |
BIN
src/img/flags/BW.png
Normal file
After Width: | Height: | Size: 214 B |
BIN
src/img/flags/BY.png
Normal file
After Width: | Height: | Size: 669 B |
BIN
src/img/flags/BZ.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
src/img/flags/CA.png
Normal file
After Width: | Height: | Size: 445 B |
BIN
src/img/flags/CC.png
Normal file
After Width: | Height: | Size: 706 B |
BIN
src/img/flags/CD.png
Normal file
After Width: | Height: | Size: 602 B |
BIN
src/img/flags/CF.png
Normal file
After Width: | Height: | Size: 389 B |
BIN
src/img/flags/CG.png
Normal file
After Width: | Height: | Size: 356 B |
BIN
src/img/flags/CH.png
Normal file
After Width: | Height: | Size: 220 B |