diff --git a/frontend/resources/images/icons/full-screen.svg b/frontend/resources/images/icons/full-screen.svg
new file mode 100644
index 000000000..47e7db42c
--- /dev/null
+++ b/frontend/resources/images/icons/full-screen.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/frontend/resources/styles/main.scss b/frontend/resources/styles/main.scss
index cb43312a5..545e75779 100644
--- a/frontend/resources/styles/main.scss
+++ b/frontend/resources/styles/main.scss
@@ -30,6 +30,8 @@
@import 'main/layouts/projects-page';
@import 'main/layouts/recent-files-page';
@import 'main/layouts/library-page';
+@import "main/layouts/not-found";
+@import "main/layouts/viewer";
//#################################################
// Commons
@@ -69,6 +71,9 @@
@import 'main/partials/debug-icons-preview';
@import 'main/partials/editable-label';
@import 'main/partials/tab-container';
+@import "main/partials/viewer-header";
+@import "main/partials/viewer-thumbnails";
+@import "main/partials/viewer";
//#################################################
// Resources
diff --git a/frontend/resources/styles/main/layouts/not-found.scss b/frontend/resources/styles/main/layouts/not-found.scss
new file mode 100644
index 000000000..359d7ab53
--- /dev/null
+++ b/frontend/resources/styles/main/layouts/not-found.scss
@@ -0,0 +1,43 @@
+.not-found-layout {
+ display: grid;
+
+ grid-template-rows: 120px auto;
+ grid-template-columns: 1fr;
+}
+
+.not-found-header {
+ grid-column: 1 / span 1;
+ grid-row: 1 / span 1;
+
+ display: flex;
+ align-items: center;
+ padding: 32px;
+
+ svg {
+ height: 55px;
+ width: 170px;
+ }
+
+}
+
+.not-found-content {
+ grid-column: 1 / span 1;
+ grid-row: 1 / span 2;
+ height: 100vh;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ .main-message {
+ font-size: 18rem;
+ color: $color-black;
+ line-height: 226px;
+ }
+
+ .desc-message {
+ font-size: 3rem;
+ color: $color-black;
+ }
+}
+
diff --git a/frontend/resources/styles/main/layouts/viewer.scss b/frontend/resources/styles/main/layouts/viewer.scss
new file mode 100644
index 000000000..eafd9911f
--- /dev/null
+++ b/frontend/resources/styles/main/layouts/viewer.scss
@@ -0,0 +1,25 @@
+.viewer-layout {
+ display: grid;
+ grid-template-rows: 40px auto;
+ grid-template-columns: 1fr;
+
+ &.fullscreen {
+ .viewer-header {
+ display: none;
+ }
+
+ .viewer-content {
+ grid-row: 1 / span 2;
+ }
+ }
+
+ .viewer-header {
+ grid-column: 1 / span 1;
+ grid-row: 1 / span 1;
+ }
+
+ .viewer-content {
+ grid-column: 1 / span 1;
+ grid-row: 2 / span 1;
+ }
+}
diff --git a/frontend/resources/styles/main/partials/viewer-header.scss b/frontend/resources/styles/main/partials/viewer-header.scss
new file mode 100644
index 000000000..210d244d7
--- /dev/null
+++ b/frontend/resources/styles/main/partials/viewer-header.scss
@@ -0,0 +1,224 @@
+.viewer-header {
+ align-items: center;
+ background-color: $color-gray-50;
+ border-bottom: 1px solid $color-gray-60;
+ display: flex;
+ height: 40px;
+ padding: $x-small $medium $x-small 55px;
+ position: relative;
+ z-index: 12;
+ justify-content: space-between;
+
+ .main-icon {
+ align-items: center;
+ background-color: $color-gray-60;
+ cursor: pointer;
+ display: flex;
+ height: 100%;
+ justify-content: center;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 40px;
+
+ a {
+ height: 30px;
+
+ svg {
+ fill: $color-gray-30;
+ height: 30px;
+ width: 28px;
+ }
+
+ &:hover {
+ svg {
+ fill: $color-primary;
+ }
+ }
+ }
+ }
+
+ .sitemap-zone {
+ align-items: center;
+ cursor: pointer;
+ display: flex;
+ padding: $x-small;
+
+ svg {
+ fill: $color-gray-20;
+ height: 20px;
+ margin-right: $small;
+ width: 20px;
+ }
+
+ span {
+ color: $color-gray-20;
+ margin-right: $x-small;
+ font-size: $fs14;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+
+ &.frame-name {
+ color: $color-white;
+ }
+ }
+
+ .dropdown-button {
+ svg {
+ fill: $color-white;
+ height: 10px;
+ width: 10px;
+ }
+ }
+
+ .page-name {
+ color: $color-white;
+ }
+
+ .counters {
+ margin-left: $size-3;
+ }
+ }
+
+ .options-zone {
+ align-items: center;
+ display: flex;
+ width: 250px;
+ justify-content: space-between;
+
+ .btn-primary {
+ padding: 0.4rem 1rem;
+ }
+
+ .btn-fullscreen {
+ align-items: center;
+ background-color: $color-gray-60;
+ border-radius: $br-small;
+ cursor: pointer;
+ display: flex;
+ height: 25px;
+ justify-content: center;
+ width: 25px;
+
+ svg {
+ fill: $color-gray-20;
+ width: 15px;
+ height: 15px;
+ }
+
+ &:hover {
+ background-color: $color-primary;
+
+ svg {
+ fill: $color-gray-60;
+ }
+ }
+ }
+ }
+
+ .zoom-widget {
+ cursor: pointer;
+
+ align-items: center;
+ display: flex;
+ position: relative;
+
+ .input-container {
+ display: flex;
+ }
+
+ span {
+ color: $color-gray-10;
+ font-size: $fs15;
+ margin-left: $x-small;
+ }
+
+ .dropdown-button svg {
+ fill: $color-gray-10;
+ height: 10px;
+ width: 10px;
+ }
+
+ .zoom-dropdown {
+ position: absolute;
+ right: -25px;
+ top: 45px;
+ z-index: 12;
+ width: 150px;
+
+ background-color: $color-white;
+ border-radius: $br-small;
+ box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.25);
+
+ li {
+ color: $color-gray-60;
+ cursor: pointer;
+ font-size: $fs12;
+ display: flex;
+ padding: $small;
+
+ span {
+ color: $color-gray-40;
+ font-size: $fs12;
+ margin-left: auto;
+ }
+
+ &:hover {
+ background-color: $color-primary-lighter;
+ }
+
+ }
+ }
+
+ .add-zoom,
+ .remove-zoom {
+ align-items: center;
+ background-color: $color-gray-60;
+ border-radius: $br-small;
+ cursor: pointer;
+ color: $color-gray-20;
+ display: flex;
+ opacity: 0;
+ flex-shrink: 0;
+ font-size: $fs20;
+ font-weight: bold;
+ height: 20px;
+ justify-content: center;
+ width: 20px;
+
+ &:hover {
+ color: $color-primary;
+ }
+
+ }
+
+ &:hover {
+ .add-zoom,
+ .remove-zoom {
+ opacity: 100%;
+ }
+ }
+
+ }
+
+ .users-zone {
+ align-items: center;
+ cursor: pointer;
+ display: flex;
+ margin: 0;
+
+ li {
+ margin-left: $small;
+ position: relative;
+
+ img {
+ border: 3px solid #f3dd14;
+ border-radius: 50%;
+ flex-shrink: 0;
+ height: 25px;
+ width: 25px;
+ }
+ }
+ }
+}
diff --git a/frontend/resources/styles/main/partials/viewer-thumbnails.scss b/frontend/resources/styles/main/partials/viewer-thumbnails.scss
new file mode 100644
index 000000000..bd92f3de9
--- /dev/null
+++ b/frontend/resources/styles/main/partials/viewer-thumbnails.scss
@@ -0,0 +1,173 @@
+
+.viewer-thumbnails {
+ grid-row: 1 / span 1;
+ grid-column: 1 / span 1;
+
+ background-color: $color-gray-50;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ z-index: 12;
+
+ &.expanded {
+ grid-row: 1 / span 2;
+
+ .btn-expand svg {
+ transform: rotate(180deg);
+ }
+ }
+
+ .thumbnails-summary {
+ padding: 0.5rem 1rem;
+ display: flex;
+ justify-content: space-between;
+
+ .buttons {
+ display: flex;
+ justify-content: space-between;
+ width: 50px;
+
+ span {
+ cursor: pointer;
+ }
+
+ svg {
+ fill: $color-gray-30;
+ height: 20px;
+ width: 20px;
+
+ &:hover {
+ fill: $color-white;
+ }
+ }
+
+ .btn-close {
+ transform: rotate(45deg);
+ }
+ }
+
+ .counter {
+ color: $color-gray-10;
+ }
+ }
+
+ .thumbnails-content {
+ display: grid;
+ grid-template-columns: 40px auto 40px;
+ grid-template-rows: auto;
+ }
+
+ .left-scroll-handler {
+ grid-column: 1 / span 1;
+ grid-row: 1 / span 1;
+
+ background-color: $color-gray-50;
+ opacity: 0;
+ display: flex;
+ z-index: 12;
+ cursor: pointer;
+
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ &:hover {
+ opacity: 0.5;
+ }
+
+ svg {
+ transform: rotate(180deg);
+ width: 30px;
+ height: 30px;
+ }
+ }
+
+ .right-scroll-handler {
+ grid-column: 3 / span 1;
+ grid-row: 1 / span 1;
+
+ background-color: $color-gray-50;
+ opacity: 0;
+ display: flex;
+ z-index: 12;
+ cursor: pointer;
+
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ &:hover {
+ opacity: 0.5;
+ }
+
+ svg {
+ width: 30px;
+ height: 30px;
+ }
+ }
+
+ .thumbnails-list {
+ grid-column: 1 / span 3;
+ grid-row: 1 / span 1;
+
+ display: flex;
+ flex-wrap: nowrap;
+ overflow: hidden;
+
+ .thumbnails-list-inside {
+ display: flex;
+ position: relative;
+ }
+ }
+
+ .thumbnails-list-expanded {
+ grid-column: 1 / span 3;
+ grid-row: 1 / span 1;
+
+ display: flex;
+ flex-wrap: wrap;
+ overflow: hidden;
+ }
+
+ .thumbnail-item {
+ display: flex;
+ flex-direction: column;
+ padding: 1rem;
+ cursor: pointer;
+ }
+
+ .thumbnail-preview {
+ background-color: $color-gray-40;
+ width: 120px;
+ min-height: 120px;
+ height: 120px;
+ border: 1px solid $color-gray-20;
+ border-radius: 2px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ svg {
+ width: 100%;
+ height: 100%;
+ }
+
+ &.selected {
+ border-color: $color-primary;
+ }
+
+ &:hover {
+ border-color: $color-primary;
+ border-width: 2px;
+ }
+ }
+
+ .thumbnail-info {
+ padding: 0.5rem 0;
+
+ span {
+ font-size: $fs13;
+ }
+ }
+}
diff --git a/frontend/resources/styles/main/partials/viewer.scss b/frontend/resources/styles/main/partials/viewer.scss
new file mode 100644
index 000000000..15f3fd48d
--- /dev/null
+++ b/frontend/resources/styles/main/partials/viewer.scss
@@ -0,0 +1,20 @@
+.viewer-content {
+ background-color: black;
+
+ display: grid;
+ grid-template-rows: 232px auto;
+ grid-template-columns: 1fr;
+}
+
+.viewer-preview {
+ height: 100vh;
+
+ grid-row: 1 / span 2;
+ grid-column: 1 / span 1;
+
+ overflow: scroll;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
diff --git a/frontend/resources/styles/main/partials/workspace-bar.scss b/frontend/resources/styles/main/partials/workspace-bar.scss
index 6a075a47f..52c129cd5 100644
--- a/frontend/resources/styles/main/partials/workspace-bar.scss
+++ b/frontend/resources/styles/main/partials/workspace-bar.scss
@@ -15,6 +15,31 @@
position: relative;
z-index: 12;
+ .preview {
+ align-items: center;
+ background-color: $color-gray-60;
+ border-radius: $br-small;
+ cursor: pointer;
+ display: flex;
+ height: 25px;
+ justify-content: center;
+ width: 25px;
+
+ svg {
+ fill: $color-gray-20;
+ width: 15px;
+ height: 15px;
+ }
+
+ &:hover {
+ background-color: $color-primary;
+
+ svg {
+ fill: $color-gray-60;
+ }
+ }
+ }
+
.workspace-menu {
position: absolute;
top: 40px;
diff --git a/frontend/resources/templates/index.mustache b/frontend/resources/templates/index.mustache
index cbb80b00f..8fabc07c4 100644
--- a/frontend/resources/templates/index.mustache
+++ b/frontend/resources/templates/index.mustache
@@ -17,7 +17,6 @@
window.uxboxConfig = JSON.parse({{& config }});
window.uxboxTranslations = JSON.parse({{& translations }});
-