From ae721d117ff56f0e6f039683520d7c45dc669731 Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Mon, 7 Nov 2022 09:40:47 -0300 Subject: [PATCH 01/27] test another pipeline --- .github/workflows/build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 23cde1b..8db8bbe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,7 +44,8 @@ jobs: tags: | type=raw,value=latest,enable={{is_default_branch}} type=raw,value={{branch}}-{{sha}}-{{date 'X'}},enable=${{ startsWith(github.ref, 'refs/heads') }} - type=semver,prefix=v + type=semver,pattern={{version}},prefix=v + type=semver,pattern=v{{major}}.{{minor}},prefix=v - name: Build and push image uses: docker/build-push-action@v3 From 9c23a8ade84307e22c572a58822449070f512653 Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Mon, 7 Nov 2022 09:43:27 -0300 Subject: [PATCH 02/27] change default favicon --- public/favicon.png | Bin 2892 -> 1172 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.png b/public/favicon.png index 6aafb3dd061e06ff9e45fa8fc7106836d3125f37..8a718130d8986bb31bbc784752f6a2d779a008a7 100644 GIT binary patch literal 1172 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 Date: Sat, 12 Nov 2022 18:20:01 -0300 Subject: [PATCH 03/27] remove unnecessary file --- .env.sample | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .env.sample diff --git a/.env.sample b/.env.sample deleted file mode 100644 index 02d34b5..0000000 --- a/.env.sample +++ /dev/null @@ -1,8 +0,0 @@ -# codex-docs password. -PASSWORD= - -# Backend errors tracking Integraton Token -HAWK_TOKEN_BACKEND= - -# Client errors tracking Integraton Token -HAWK_TOKEN_CLIENT= From 6b12bf163d53023c4f70dbfa646fffc64541d905 Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Sat, 12 Nov 2022 20:32:57 -0300 Subject: [PATCH 04/27] some fixes for docs and configs --- README.md | 2 +- docker-compose.yml | 2 +- docs-config.yaml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c233a9d..37e8573 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Here is our [Demo Application](https://docs-demo.codex.so/) where you can try Co 1. [Getting Started](https://docs.codex.so/getting-started) 2. [Configuration](https://docs.codex.so/configuration) -3. [Deployment](https://docs.codex.so/deployment) +3. [Kubernetes deployment](https://docs.codex.so/k8s-deployment) 4. [Authentication](https://docs.codex.so/authentication) 5. [Writing](https://docs.codex.so/writing) 6. [How to enable analytics](https://docs.codex.so/yandex-metrica) diff --git a/docker-compose.yml b/docker-compose.yml index e5e0a8b..a97671e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "3.2" services: docs: - image: ghcr.io/codex-team/codex.docs:stage-17857c8-1667816216 # need to be changed after release + image: ghcr.io/codex-team/codex.docs:v2.0.0-rc.8 ports: - "3000:3000" volumes: diff --git a/docs-config.yaml b/docs-config.yaml index 26de628..abfaff0 100644 --- a/docs-config.yaml +++ b/docs-config.yaml @@ -11,10 +11,9 @@ uploads: keyPrefix: "/" accessKeyId: "my-access-key" secretAccessKey: "my-secret-key" -password: secretpassword frontend: title: "CodeX Docs" - description: "A block-styled editor with clean JSON output" + description: "Free Docs app powered by Editor.js ecosystemt" startPage: "" misprintsChatId: "12344564" yandexMetrikaId: "" @@ -27,6 +26,7 @@ frontend: uri: "https://codex.so" auth: + password: secretpassword secret: supersecret hawk: From 339993ef8e26a9a7d781d8bf43ad10071547c9ef Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Mon, 14 Nov 2022 09:29:08 -0300 Subject: [PATCH 05/27] fix delete button --- src/backend/views/pages/form.twig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/views/pages/form.twig b/src/backend/views/pages/form.twig index ca21995..643f953 100644 --- a/src/backend/views/pages/form.twig +++ b/src/backend/views/pages/form.twig @@ -64,7 +64,7 @@
{% include 'components/button.twig' with {label: 'Save changes', name: 'js-submit-save', icon: 'check'} %} - {% if page._id is not empty %} + {% if toString(page._id) is not empty %} {% include 'components/button.twig' with {label: 'Delete doc', name: 'js-submit-remove', icon: 'trash', style: 'warning'} %} {% endif %}
From 912a8cdf312e1f28d270b4abff915255464cc777 Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Tue, 15 Nov 2022 09:04:44 -0300 Subject: [PATCH 06/27] fix doc --- DEVELOPMENT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 4535546..f47cf25 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -36,7 +36,7 @@ In order to use MongoDB, follow these steps: ### 1. Run MongoDB instance with docker-compose ```shell -docker-compose up mongodb +docker-compose -f docker-compose.dev.yml up mongodb ``` ### 2. Setup MongoDB driver in docs-config.local.yaml From b6dfd14c8b2e2a4367b655219a6af930ba3b8486 Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Tue, 15 Nov 2022 09:08:34 -0300 Subject: [PATCH 07/27] add config override to docker-compose.dev.yml --- docker-compose.dev.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index c10c27c..3c86549 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -6,6 +6,13 @@ services: context: . ports: - "3000:3000" + command: + - node + - dist/backend/app.js + - -c + - docs-config.yaml + - -c + - docs-config.local.yaml volumes: - ./uploads:/usr/src/app/uploads - ./db:/usr/src/app/db From f372a574f0260ea4bccfccbec1dcdfa9908974d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 10:02:42 +0000 Subject: [PATCH 08/27] Bump loader-utils from 2.0.2 to 2.0.4 Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.2 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.2...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7ec5712..6a717a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2887,6 +2887,7 @@ basic-auth@~2.0.1: big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^2.0.0: version "2.2.0" @@ -3733,6 +3734,7 @@ emoji-regex@^8.0.0: emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== encodeurl@~1.0.2: version "1.0.2" @@ -5062,8 +5064,9 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" From b83d468ba0c838f10783903bfb78ff3fb4b7512c Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Wed, 16 Nov 2022 07:11:21 -0300 Subject: [PATCH 09/27] remove unnecessary v from release pipeline --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8db8bbe..7ef3e1f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -45,7 +45,7 @@ jobs: type=raw,value=latest,enable={{is_default_branch}} type=raw,value={{branch}}-{{sha}}-{{date 'X'}},enable=${{ startsWith(github.ref, 'refs/heads') }} type=semver,pattern={{version}},prefix=v - type=semver,pattern=v{{major}}.{{minor}},prefix=v + type=semver,pattern={{major}}.{{minor}},prefix=v - name: Build and push image uses: docker/build-push-action@v3 From 91ba44a169b65354b3a82ee5c1ca8e23639766c9 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 14:02:31 +0300 Subject: [PATCH 10/27] refactor: delete copy link button from header --- src/backend/views/pages/blocks/header.twig | 8 +- src/frontend/js/modules/page.js | 39 +------- src/frontend/styles/components/page.pcss | 103 --------------------- 3 files changed, 5 insertions(+), 145 deletions(-) diff --git a/src/backend/views/pages/blocks/header.twig b/src/backend/views/pages/blocks/header.twig index f069652..476d646 100644 --- a/src/backend/views/pages/blocks/header.twig +++ b/src/backend/views/pages/blocks/header.twig @@ -1,11 +1,5 @@ - - - + {{ text }} - diff --git a/src/frontend/js/modules/page.js b/src/frontend/js/modules/page.js index 00bbaf9..148b3e6 100644 --- a/src/frontend/js/modules/page.js +++ b/src/frontend/js/modules/page.js @@ -20,10 +20,7 @@ export default class Page { */ static get CSS() { return { - page: 'page', - copyLinkBtn: 'block-header__copy-link', - header: 'block-header--anchor', - headerLinkCopied: 'block-header--link-copied', + page: 'page' }; } @@ -35,11 +32,11 @@ export default class Page { this.tableOfContent = this.createTableOfContent(); /** - * Add click event listener to capture copy link button clicks + * Add click event listener */ const page = document.querySelector(`.${Page.CSS.page}`); - page.addEventListener('click', this.copyAnchorLinkIfNeeded); + page.addEventListener('click', (event) => { }); } /** @@ -69,39 +66,11 @@ export default class Page { try { // eslint-disable-next-line no-new new TableOfContent({ - tagSelector: - 'h2.block-header--anchor,' + - 'h3.block-header--anchor,' + - 'h4.block-header--anchor', + tagSelector: '.block-header', appendTo: document.getElementById('layout-sidebar-right'), }); } catch (error) { console.error(error); // @todo send to Hawk } } - - /** - * Checks if 'copy link' button was clicked and copies the link to clipboard - * - * @param e - click event - */ - copyAnchorLinkIfNeeded = async (e) => { - const copyLinkButtonClicked = e.target.closest(`.${Page.CSS.copyLinkBtn}`); - - if (!copyLinkButtonClicked) { - return; - } - - const header = e.target.closest(`.${Page.CSS.header}`); - const link = header.querySelector('a').href; - - await copyToClipboard(link); - header.classList.add(Page.CSS.headerLinkCopied); - - header.addEventListener('mouseleave', () => { - setTimeout(() => { - header.classList.remove(Page.CSS.headerLinkCopied); - }, 500); - }, { once: true }); - } } diff --git a/src/frontend/styles/components/page.pcss b/src/frontend/styles/components/page.pcss index 7109556..c359a4c 100644 --- a/src/frontend/styles/components/page.pcss +++ b/src/frontend/styles/components/page.pcss @@ -125,111 +125,9 @@ pointer-events: none; } - &--link-copied { - .block-header__copy-link, - .block-header__copy-link:hover { - background: var(--color-success); - opacity: 1; - animation: check-square-in 250ms ease-in; - pointer-events: none; - } - - .block-header__copy-link-icon--initial { - display: none; - } - - .block-header__copy-link-icon--success { - display: flex; - animation: check-sign-in 350ms ease-in forwards; - } - - .block-header__copy-link-splash { - opacity: 0; - visibility: visible; - transform: scale(3.5); - } - } - - &__copy-link-splash { - position: absolute; - left: 0; - width: 28px; - height: 28px; - background-color: var(--color-success); - transform: scale(1); - border-radius: 100%; - transition: transform 400ms ease-out, opacity 400ms; - visibility: hidden; - } - - &__copy-link-icon--success { - width: 24px; - height: 24px; - display: none; - color: white; - } - - &__copy-link-icon--initial { - display: flex; - justify-content: center; - align-items: center; - } - - &__copy-link { - width: 28px; - height: 28px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - border-radius: 8px; - @apply --squircle; - color: var(--color-text-second); - opacity: 0; - margin-right: 8px; - - @media (--can-hover) { - &:hover { - background: var(--color-link-hover); - } - } - } - - @media (--can-hover) { - &:hover { - .block-header__copy-link { - opacity: 1; - } - } - } - .inline-code { line-height: inherit; } - - @keyframes check-sign-in { - from { - transform: scale(.7); - } - 80% { - transform: scale(1.1); - } - to { - transform: none; - } - } - - @keyframes check-square-in { - from { - transform: scale(1.05); - } - 80% { - transform: scale(.96); - } - to { - transform: none; - } - } } /** @@ -580,4 +478,3 @@ } } } - From 285b94779f25370a2ff02d9854aefbaaf1110029 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 14:07:20 +0300 Subject: [PATCH 11/27] feat: add reusable copy button component --- src/backend/views/components/copy-button.twig | 25 +++++ src/frontend/js/modules/page.js | 39 ++++++- .../styles/components/copy-button.pcss | 103 ++++++++++++++++++ src/frontend/styles/main.pcss | 1 + 4 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 src/backend/views/components/copy-button.twig create mode 100644 src/frontend/styles/components/copy-button.pcss diff --git a/src/backend/views/components/copy-button.twig b/src/backend/views/components/copy-button.twig new file mode 100644 index 0000000..2db7ee1 --- /dev/null +++ b/src/backend/views/components/copy-button.twig @@ -0,0 +1,25 @@ +{# + Reusable copy button component. + Available props: + - ariaLabel: label for better accessibility + - class: additional class for the button + - textToCopy: text to be copied to the clipboard (use '#' for anchor links) + + Usage examples: + {% include 'components/copy-button.twig' with { textToCopy: 'Lorem ipsum dolor' } %} + {% include 'components/copy-button.twig' with { textToCopy: '#anchor-link-dolor' } %} +#} + +{% set attrNameForTextToCopy = 'data-text-to-copy' %} + +{% set ariaLabel = ariaLabel ?? 'Copy to the Clipboard' %} + +{% set mainTag = 'button' %} +{% set mainClass = 'copy-button' %} + +<{{ mainTag }} class="{{ mainClass }} {{ class ?? '' }}" aria-label="{{ ariaLabel }}" {{ attrNameForTextToCopy }}="{{ textToCopy }}"> +
+
{{ svg('copy') }}
+
{{ svg('check') }}
+
+ diff --git a/src/frontend/js/modules/page.js b/src/frontend/js/modules/page.js index 148b3e6..126b5fd 100644 --- a/src/frontend/js/modules/page.js +++ b/src/frontend/js/modules/page.js @@ -20,7 +20,9 @@ export default class Page { */ static get CSS() { return { - page: 'page' + copyButton: 'copy-button', + copyButtonCopied: 'copy-button__copied', + page: 'page', }; } @@ -36,7 +38,11 @@ export default class Page { */ const page = document.querySelector(`.${Page.CSS.page}`); - page.addEventListener('click', (event) => { }); + page.addEventListener('click', (event) => { + if (event.target.classList.contains(Page.CSS.copyButton)) { + this.handleCopyButtonClickEvent(event); + } + }); } /** @@ -73,4 +79,33 @@ export default class Page { console.error(error); // @todo send to Hawk } } + + /** + * Handles copy button click events + * + * @param {Event} e - Event Object. + * @returns {Promise} + */ + async handleCopyButtonClickEvent({ target }) { + if (target.classList.contains(Page.CSS.copyButtonCopied)) return; + + let textToCopy = target.getAttribute('data-text-to-copy'); + if (!textToCopy) return; + + // Check if text to copy is an anchor link + if (/^#\S*$/.test(textToCopy)) + textToCopy = window.location.origin + window.location.pathname + textToCopy; + + try { + await copyToClipboard(textToCopy); + + target.classList.add(Page.CSS.copyButtonCopied); + target.addEventListener('mouseleave', () => { + setTimeout(() => target.classList.remove(Page.CSS.copyButtonCopied), 5e2); + }, { once: true }); + + } catch (error) { + console.error(error); // @todo send to Hawk + } + } } diff --git a/src/frontend/styles/components/copy-button.pcss b/src/frontend/styles/components/copy-button.pcss new file mode 100644 index 0000000..2ec2e42 --- /dev/null +++ b/src/frontend/styles/components/copy-button.pcss @@ -0,0 +1,103 @@ +.copy-button { + position: relative; + width: 28px; + height: 28px; + padding: 0; + border: none; + background: none; + cursor: pointer; + transition: opacity 200ms; + + @media (--can-hover) { + &:hover .copy-button__inner { + background: var(--color-link-hover); + } + } + + &::before { + content: ''; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: 100%; + background-color: var(--color-success); + visibility: hidden; + pointer-events: none; + transform: scale(1); + transition: transform 400ms ease-out, opacity 400ms; + } + + &__inner { + @apply --squircle; + + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + background: white; + pointer-events: none; + } + + &__icon--initial { + display: flex; + transform: translateZ(0); + } + + &__icon--success { + display: none; + width: 24px; + height: 24px; + color: white; + } + + &__copied { + + &::before { + opacity: 0; + visibility: visible; + transform: scale(3.5); + } + + .copy-button__inner, + .copy-button__inner:hover { + background: var(--color-success) !important; + animation: check-square-in 250ms ease-in; + } + + .copy-button__icon--initial { + display: none; + } + + .copy-button__icon--success { + display: flex; + animation: check-sign-in 350ms ease-in forwards; + } + } + + @keyframes check-sign-in { + from { + transform: scale(.7); + } + 80% { + transform: scale(1.1); + } + to { + transform: none; + } + } + + @keyframes check-square-in { + from { + transform: scale(1.05); + } + 80% { + transform: scale(.96); + } + to { + transform: none; + } + } +} diff --git a/src/frontend/styles/main.pcss b/src/frontend/styles/main.pcss index c436ade..d6edcbf 100644 --- a/src/frontend/styles/main.pcss +++ b/src/frontend/styles/main.pcss @@ -5,6 +5,7 @@ @import './carbon.pcss'; @import './components/header.pcss'; @import './components/writing.pcss'; +@import './components/copy-button.pcss'; @import './components/page.pcss'; @import './components/greeting.pcss'; @import './components/auth.pcss'; From dc0c32a93f97b35cf0e8e9bc8a927a4bf7ab8b68 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 14:08:37 +0300 Subject: [PATCH 12/27] feat: add copy button to header --- src/backend/views/pages/blocks/header.twig | 7 +++++++ src/frontend/styles/components/page.pcss | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/backend/views/pages/blocks/header.twig b/src/backend/views/pages/blocks/header.twig index 476d646..e2e0403 100644 --- a/src/backend/views/pages/blocks/header.twig +++ b/src/backend/views/pages/blocks/header.twig @@ -1,4 +1,11 @@ + {% + include 'components/copy-button.twig' with { + ariaLabel: 'Copy Link to the ' ~ text, + class: 'block-header__copy-button', + textToCopy: '#' ~ text | urlify, + } + %} {{ text }} diff --git a/src/frontend/styles/components/page.pcss b/src/frontend/styles/components/page.pcss index c359a4c..c3846a1 100644 --- a/src/frontend/styles/components/page.pcss +++ b/src/frontend/styles/components/page.pcss @@ -125,6 +125,20 @@ pointer-events: none; } + &__copy-button { + margin-right: 8px; + color: var(--color-text-second); + opacity: 0; + } + + @media (--can-hover) { + &:hover { + .block-header__copy-button { + opacity: 1; + } + } + } + .inline-code { line-height: inherit; } From 1c3ada993e77353295716acc5b9d30c559dd9fc2 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 14:09:55 +0300 Subject: [PATCH 13/27] feat: add copy button to code block --- src/backend/views/pages/blocks/code.twig | 12 ++++++++++-- src/frontend/styles/components/page.pcss | 21 +++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/backend/views/pages/blocks/code.twig b/src/backend/views/pages/blocks/code.twig index 663ff49..2402cb5 100644 --- a/src/backend/views/pages/blocks/code.twig +++ b/src/backend/views/pages/blocks/code.twig @@ -1,4 +1,12 @@
-
{{ code|escape }}
+
+
{{ code | escape }}
+
+ {% + include 'components/copy-button.twig' with { + ariaLabel: 'Copy Code to Clipboard', + class: 'block-code__copy-button', + textToCopy: code | escape, + } + %}
- diff --git a/src/frontend/styles/components/page.pcss b/src/frontend/styles/components/page.pcss index c3846a1..20a408d 100644 --- a/src/frontend/styles/components/page.pcss +++ b/src/frontend/styles/components/page.pcss @@ -149,8 +149,18 @@ * ================== */ .block-code { - @apply --text-code-block; - @apply --squircle; + position: relative; + + &:hover { + .block-code__copy-button { + opacity: 1; + } + } + + &__wrapper { + @apply --text-code-block; + @apply --squircle; + } &__content { display: inline-block !important; @@ -169,6 +179,13 @@ } } + &__copy-button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + } + .hljs-params { color: var(--color-code-params); } From 3ca4a175e9ee06196a9d35d43b91dfffb757dd67 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 14:54:11 +0300 Subject: [PATCH 14/27] fix: trim content of TOC elements This is necessary in order to avoid creating
elements in the table of contens elements. --- src/frontend/js/classes/table-of-content.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/js/classes/table-of-content.js b/src/frontend/js/classes/table-of-content.js index b4900fb..9e46e94 100644 --- a/src/frontend/js/classes/table-of-content.js +++ b/src/frontend/js/classes/table-of-content.js @@ -193,7 +193,7 @@ export default class TableOfContent { const linkWrapper = $.make('li', this.CSS.tocElementItem); const linkBlock = $.make('a', null, { - innerText: tag.innerText, + innerText: tag.innerText.trim(), href: `${linkTarget}`, }); From 3d172d30214e2812d7e6b91effecc656fef52e60 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 20:52:13 +0300 Subject: [PATCH 15/27] fix: delete sidebar width on mobile devices --- src/frontend/styles/components/sidebar.pcss | 1 - 1 file changed, 1 deletion(-) diff --git a/src/frontend/styles/components/sidebar.pcss b/src/frontend/styles/components/sidebar.pcss index 23c2493..7ce04ca 100644 --- a/src/frontend/styles/components/sidebar.pcss +++ b/src/frontend/styles/components/sidebar.pcss @@ -1,5 +1,4 @@ .docs-sidebar { - width: 100vw; /* Bottom and Left coord of the "Hide Sidebar" toggler */ --hide-sidebar-toggler-offset: 11px; From 185550dd08da6882ff24bbe7a1b14ed290d34ff6 Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 21:42:19 +0300 Subject: [PATCH 16/27] fix: change units of max content width from vw to % This is necessary to correctly calculate the width of the content container. --- src/frontend/styles/layout.pcss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/styles/layout.pcss b/src/frontend/styles/layout.pcss index 8f6e899..1c5e56c 100644 --- a/src/frontend/styles/layout.pcss +++ b/src/frontend/styles/layout.pcss @@ -30,7 +30,7 @@ @media (--desktop) { max-width: min( calc(var(--layout-width-main-col) + var(--max-space-between-cols) + var(--layout-sidebar-width)), - calc(100vw - var(--layout-sidebar-width)) + calc(100% - var(--layout-sidebar-width)) ); margin-left: max(var(--main-col-min-margin-left), calc(50vw - var(--layout-sidebar-width) - var(--layout-width-main-col) / 2) - var(--layout-padding-horizontal)); margin-right: auto; From 36ba3a3cd8628ee9213eb00006ea0d26b795a98d Mon Sep 17 00:00:00 2001 From: Aleksey Solovyev Date: Tue, 29 Nov 2022 22:01:50 +0300 Subject: [PATCH 17/27] fix: prevent scrollbar-x from appearing on small screens --- src/frontend/styles/layout.pcss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/frontend/styles/layout.pcss b/src/frontend/styles/layout.pcss index 8f6e899..0680987 100644 --- a/src/frontend/styles/layout.pcss +++ b/src/frontend/styles/layout.pcss @@ -8,6 +8,7 @@ .docs { min-height: calc(100vh - var(--layout-height-header)); + overflow-x: hidden; @media (--desktop) { display: flex; From 9218843636127e49fbcfbc0d244b46c7fc934372 Mon Sep 17 00:00:00 2001 From: Tanya Fomina Date: Thu, 1 Dec 2022 22:47:45 +0400 Subject: [PATCH 18/27] Remove overflow --- src/frontend/styles/layout.pcss | 1 - 1 file changed, 1 deletion(-) diff --git a/src/frontend/styles/layout.pcss b/src/frontend/styles/layout.pcss index 97392f9..1c5e56c 100644 --- a/src/frontend/styles/layout.pcss +++ b/src/frontend/styles/layout.pcss @@ -8,7 +8,6 @@ .docs { min-height: calc(100vh - var(--layout-height-header)); - overflow-x: hidden; @media (--desktop) { display: flex; From d3e0cb176c3ff1fca7eb25c81580bd44b039b2e9 Mon Sep 17 00:00:00 2001 From: Vyacheslav Chernyshev <81693471+slaveeks@users.noreply.github.com> Date: Tue, 13 Dec 2022 15:19:50 +0300 Subject: [PATCH 19/27] Added enable parameter for rendering index page (#289) --- package.json | 2 +- src/backend/build-static.ts | 5 ++++- src/backend/utils/appConfig.ts | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index c9ff0c8..fd53502 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codex.docs", "license": "Apache-2.0", - "version": "v2.0.0-rc.4", + "version": "v2.2.0-rc.1", "type": "module", "bin": { "codex.docs": "dist/backend/app.js" diff --git a/src/backend/build-static.ts b/src/backend/build-static.ts index d0691e0..d8d4538 100644 --- a/src/backend/build-static.ts +++ b/src/backend/build-static.ts @@ -111,7 +111,10 @@ export default async function buildStatic(): Promise { await renderPage(page); } - await renderIndexPage(config.indexPageUri); + // Check if index page is enabled + if (config.indexPage.enabled) { + await renderIndexPage(config.indexPage.uri); + } console.log('Static files built'); console.log('Copy public directory'); diff --git a/src/backend/utils/appConfig.ts b/src/backend/utils/appConfig.ts index c824d49..8f853c6 100644 --- a/src/backend/utils/appConfig.ts +++ b/src/backend/utils/appConfig.ts @@ -90,7 +90,10 @@ const FrontendConfig = z.object({ */ const StaticBuildConfig = z.object({ outputDir: z.string(), // Output directory for static build - indexPageUri: z.string(), // URI for index page to render + indexPage: z.object({ + enabled: z.boolean(), // Is index page enabled + uri: z.string(), // Index page uri + }), }); export type StaticBuildConfig = z.infer; From f78b9ecff5f24fb871d01052ac563df50b837b70 Mon Sep 17 00:00:00 2001 From: Vyacheslav Chernyshev <81693471+slaveeks@users.noreply.github.com> Date: Tue, 27 Dec 2022 16:10:18 +0300 Subject: [PATCH 20/27] Fixed copy button path in header.twig, code.twig (#290) * Fixed copy button path in header.twig * Fixed path of copy button in code.twig, updated version * add more logs * Added overwrite property * update version Co-authored-by: Nikita Melnikov --- package.json | 2 +- src/backend/build-static.ts | 19 ++++++++++++++++--- src/backend/utils/appConfig.ts | 1 + src/backend/views/pages/blocks/code.twig | 2 +- src/backend/views/pages/blocks/header.twig | 2 +- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index fd53502..490b138 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codex.docs", "license": "Apache-2.0", - "version": "v2.2.0-rc.1", + "version": "v2.2.0-rc.11", "type": "module", "bin": { "codex.docs": "dist/backend/app.js" diff --git a/src/backend/build-static.ts b/src/backend/build-static.ts index d8d4538..2b17fa4 100644 --- a/src/backend/build-static.ts +++ b/src/backend/build-static.ts @@ -45,8 +45,10 @@ export default async function buildStatic(): Promise { }); } - console.log('Removing old static files'); - await fse.remove(distPath); + if (config.overwrite) { + console.log('Removing old static files'); + await fse.remove(distPath); + } console.log('Building static files'); const pagesOrder = await PagesOrder.getAll(); @@ -118,11 +120,22 @@ export default async function buildStatic(): Promise { console.log('Static files built'); console.log('Copy public directory'); - await fse.copy(path.resolve(dirname, '../../public'), distPath); + const publicDir = path.resolve(dirname, '../../public'); + + console.log(`Copy from ${publicDir} to ${distPath}`); + + try { + await fse.copy(publicDir, distPath); + console.log('Public directory copied'); + } catch (e) { + console.log('Error while copying public directory'); + console.error(e); + } if (appConfig.uploads.driver === 'local') { console.log('Copy uploads directory'); await fse.copy(path.resolve(cwd, appConfig.uploads.local.path), path.resolve(distPath, 'uploads')); + console.log('Uploads directory copied'); } } diff --git a/src/backend/utils/appConfig.ts b/src/backend/utils/appConfig.ts index 8f853c6..8d3e60e 100644 --- a/src/backend/utils/appConfig.ts +++ b/src/backend/utils/appConfig.ts @@ -90,6 +90,7 @@ const FrontendConfig = z.object({ */ const StaticBuildConfig = z.object({ outputDir: z.string(), // Output directory for static build + overwrite: z.boolean().optional().default(true), indexPage: z.object({ enabled: z.boolean(), // Is index page enabled uri: z.string(), // Index page uri diff --git a/src/backend/views/pages/blocks/code.twig b/src/backend/views/pages/blocks/code.twig index 2402cb5..9ed997e 100644 --- a/src/backend/views/pages/blocks/code.twig +++ b/src/backend/views/pages/blocks/code.twig @@ -3,7 +3,7 @@
{{ code | escape }}
{% - include 'components/copy-button.twig' with { + include '../../components/copy-button.twig' with { ariaLabel: 'Copy Code to Clipboard', class: 'block-code__copy-button', textToCopy: code | escape, diff --git a/src/backend/views/pages/blocks/header.twig b/src/backend/views/pages/blocks/header.twig index e2e0403..d854dd9 100644 --- a/src/backend/views/pages/blocks/header.twig +++ b/src/backend/views/pages/blocks/header.twig @@ -1,6 +1,6 @@ {% - include 'components/copy-button.twig' with { + include '../../components/copy-button.twig' with { ariaLabel: 'Copy Link to the ' ~ text, class: 'block-header__copy-button', textToCopy: '#' ~ text | urlify, From 7f51a72bcbccdc1f2ddb5f0818604f247f6c338a Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Fri, 26 Apr 2024 13:47:43 +0300 Subject: [PATCH 21/27] fix(ui): broken sidebar, table of content and header on linux (#315) * move squircle to only to active and hover states * fix hover * fix squircle in header * fix toc * rm redundant line --- src/frontend/styles/components/header.pcss | 5 ++++- src/frontend/styles/components/sidebar.pcss | 7 +++++-- src/frontend/styles/components/table-of-content.pcss | 5 ++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/frontend/styles/components/header.pcss b/src/frontend/styles/components/header.pcss index 0b43e9e..3c62720 100644 --- a/src/frontend/styles/components/header.pcss +++ b/src/frontend/styles/components/header.pcss @@ -40,7 +40,10 @@ html { @media (--not-mobile) { padding: 4px 10px; - @apply --squircle; + + &:hover { + @apply --squircle; + } } &:hover { diff --git a/src/frontend/styles/components/sidebar.pcss b/src/frontend/styles/components/sidebar.pcss index 7ce04ca..04f6f83 100644 --- a/src/frontend/styles/components/sidebar.pcss +++ b/src/frontend/styles/components/sidebar.pcss @@ -182,13 +182,16 @@ transition-property: background-color; transition-duration: 0.1s; - @apply --squircle; - &--selected { border-radius: 8px; /* border using box-shadow which doesn't increase the height */ box-shadow: 0 0 0 2px rgba(147, 166, 233, 0.5) inset; } + + &--active, + &:hover { + @apply --squircle; + } } &__section-title > span, diff --git a/src/frontend/styles/components/table-of-content.pcss b/src/frontend/styles/components/table-of-content.pcss index ab3c921..a3f5674 100644 --- a/src/frontend/styles/components/table-of-content.pcss +++ b/src/frontend/styles/components/table-of-content.pcss @@ -31,7 +31,10 @@ gap: 2px; &-item { - @apply --squircle; + &:hover, + &--active { + @apply --squircle; + } &:hover { background-color: var(--color-link-hover); From a6391a3da0b092db371dcd91d2bd1f647117fc9a Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Fri, 26 Apr 2024 17:31:40 +0300 Subject: [PATCH 22/27] Update version to v2.2.1 in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 490b138..2ef08eb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codex.docs", "license": "Apache-2.0", - "version": "v2.2.0-rc.11", + "version": "v2.2.1", "type": "module", "bin": { "codex.docs": "dist/backend/app.js" From f8ba8abf19129104dec5827f66813e06190fe82e Mon Sep 17 00:00:00 2001 From: Nikita Melnikov Date: Fri, 26 Apr 2024 22:57:49 +0100 Subject: [PATCH 23/27] Static generation fixes (#292) * add error handler for creating dist folder * fix favicon in generated files * add option for generating pages inside separate folders * fix favicon problem --------- Co-authored-by: Peter Savchenko --- src/backend/build-static.ts | 63 +++++++++++++++++++++------- src/backend/utils/appConfig.ts | 5 ++- src/backend/utils/downloadFavicon.ts | 17 ++++---- 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/backend/build-static.ts b/src/backend/build-static.ts index 2b17fa4..ca0894a 100644 --- a/src/backend/build-static.ts +++ b/src/backend/build-static.ts @@ -13,6 +13,7 @@ import fse from 'fs-extra'; import appConfig from './utils/appConfig.js'; import Aliases from './controllers/aliases.js'; import Pages from './controllers/pages.js'; +import { downloadFavicon } from './utils/downloadFavicon.js'; /** * Build static pages from database @@ -54,7 +55,33 @@ export default async function buildStatic(): Promise { const pagesOrder = await PagesOrder.getAll(); const allPages = await Page.getAll(); - await mkdirp(distPath); + try { + console.log('Create dist folder'); + await mkdirp(distPath); + } catch (e) { + console.log('Error while creating dist folder', e); + + return; + } + + console.log('Copy public directory'); + const publicDir = path.resolve(dirname, '../../public'); + + console.log(`Copy from ${publicDir} to ${distPath}`); + + try { + await fse.copy(publicDir, distPath); + console.log('Public directory copied'); + } catch (e) { + console.log('Error while copying public directory'); + console.error(e); + } + + const favicon = appConfig.favicon ? await downloadFavicon(appConfig.favicon, distPath, '') : { + destination: '/favicon.png', + type: 'image/png', + }; + /** * Renders single page @@ -64,6 +91,11 @@ export default async function buildStatic(): Promise { */ async function renderPage(page: Page, isIndex?: boolean): Promise { console.log(`Rendering page ${page.uri}`); + const pageUri = page.uri; + + if (!pageUri) { + throw new Error('Page uri is not defined'); + } const pageParent = await page.getParent(); const pageId = page._id; @@ -74,16 +106,30 @@ export default async function buildStatic(): Promise { const previousPage = await PagesFlatArray.getPageBefore(pageId); const nextPage = await PagesFlatArray.getPageAfter(pageId); const menu = createMenuTree(parentIdOfRootPages, allPages, pagesOrder, 2); + const result = await renderTemplate('./views/pages/page.twig', { page, pageParent, previousPage, nextPage, menu, + favicon, config: appConfig.frontend, }); - const filename = (isIndex || page.uri === '') ? 'index.html' : `${page.uri}.html`; + let filename: string; + + if (isIndex) { + filename = 'index.html'; + } else if (config?.pagesInsideFolders) { // create folder for each page if pagesInsideFolders is true + const pagePath = path.resolve(distPath, pageUri); + + await mkdirp(pagePath); + + filename = path.resolve(pagePath, 'index.html'); + } else { + filename = `${page.uri}.html`; + } await fs.writeFile(path.resolve(distPath, filename), result); console.log(`Page ${page.uri} rendered`); @@ -119,19 +165,6 @@ export default async function buildStatic(): Promise { } console.log('Static files built'); - console.log('Copy public directory'); - const publicDir = path.resolve(dirname, '../../public'); - - console.log(`Copy from ${publicDir} to ${distPath}`); - - try { - await fse.copy(publicDir, distPath); - console.log('Public directory copied'); - } catch (e) { - console.log('Error while copying public directory'); - console.error(e); - } - if (appConfig.uploads.driver === 'local') { console.log('Copy uploads directory'); await fse.copy(path.resolve(cwd, appConfig.uploads.local.path), path.resolve(distPath, 'uploads')); diff --git a/src/backend/utils/appConfig.ts b/src/backend/utils/appConfig.ts index 8d3e60e..34a5e61 100644 --- a/src/backend/utils/appConfig.ts +++ b/src/backend/utils/appConfig.ts @@ -90,7 +90,10 @@ const FrontendConfig = z.object({ */ const StaticBuildConfig = z.object({ outputDir: z.string(), // Output directory for static build - overwrite: z.boolean().optional().default(true), + overwrite: z.boolean().optional() // Overwrite output directory + .default(true), + pagesInsideFolders: z.boolean().optional() // Create separate folder for each page + .default(true), indexPage: z.object({ enabled: z.boolean(), // Is index page enabled uri: z.string(), // Index page uri diff --git a/src/backend/utils/downloadFavicon.ts b/src/backend/utils/downloadFavicon.ts index 73aa2c0..ed10cdb 100644 --- a/src/backend/utils/downloadFavicon.ts +++ b/src/backend/utils/downloadFavicon.ts @@ -1,5 +1,5 @@ import path from 'path'; -import fs from 'fs'; +import fs from 'fs/promises'; import fetch, { RequestInit } from 'node-fetch'; /** @@ -32,9 +32,10 @@ function checkIsUrl(str: string): boolean { * * @param destination - url or path of favicon * @param faviconFolder - folder to save favicon + * @param subRoute - subroute from which the favicon will be served * @returns { Promise } - Promise with data about favicon */ -export async function downloadFavicon(destination: string, faviconFolder: string): Promise { +export async function downloadFavicon(destination: string, faviconFolder: string, subRoute = '/favicon'): Promise { // Check of destination is empty if (!destination) { throw Error('Favicon destination is empty'); @@ -48,8 +49,10 @@ export async function downloadFavicon(destination: string, faviconFolder: string // Check if string is url if (!checkIsUrl(destination)) { + await fs.copyFile(destination, path.join(faviconFolder, filename)); + return { - destination: `/${filename}`, + destination: `${subRoute}/${filename}`, type: `image/${format}`, } as FaviconData; } @@ -72,14 +75,10 @@ export async function downloadFavicon(destination: string, faviconFolder: string const filePath = path.join(faviconFolder, `favicon.${format}`); // Save file - await fs.writeFile(filePath, fileData, (err) => { - if (err) { - console.log(err); - } - }); + await fs.writeFile(filePath, fileData); return { - destination: `/favicon/favicon.${format}`, + destination: `${subRoute}/favicon.${format}`, type: `image/${format}`, } as FaviconData; } From 481461de4fdc66fb3f6460faee7720db4a5574df Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sat, 27 Apr 2024 22:37:59 +0300 Subject: [PATCH 24/27] Update version to 2.2.2 in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2ef08eb..269a543 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codex.docs", "license": "Apache-2.0", - "version": "v2.2.1", + "version": "2.2.2", "type": "module", "bin": { "codex.docs": "dist/backend/app.js" From bb9d537fb9a18576c5bb1e1d7c8e7900f7f54e9e Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sat, 27 Apr 2024 22:47:02 +0300 Subject: [PATCH 25/27] Add static rendering feature (#316) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 37e8573..9981afb 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ It's super easy to install and use. - 🤩 [Editor.js](https://editorjs.io/) ecosystem powered - 📂 Docs nesting — create any structure you need +— 💎 Static rendering - 📱 Nice look on Desktop and Mobile - 🔥 Beautiful page URLs. Human-readable and SEO-friendly. - 🦅 [Hawk](https://hawk.so/?from=docs-demo) is hunting. Errors tracking integrated From 453f7060508d4f106abe18d57d17adac646ebaf3 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sat, 27 Apr 2024 22:51:53 +0300 Subject: [PATCH 26/27] fix linebreak in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9981afb..83a8f83 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ It's super easy to install and use. - 🤩 [Editor.js](https://editorjs.io/) ecosystem powered - 📂 Docs nesting — create any structure you need -— 💎 Static rendering +- 💎 Static rendering - 📱 Nice look on Desktop and Mobile - 🔥 Beautiful page URLs. Human-readable and SEO-friendly. - 🦅 [Hawk](https://hawk.so/?from=docs-demo) is hunting. Errors tracking integrated From 6c4d4310a9e1397ced462fe83dd2f68fd6b33c9e Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Fri, 3 May 2024 13:30:53 +0300 Subject: [PATCH 27/27] 2.2.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 269a543..4e6ae91 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "codex.docs", "license": "Apache-2.0", - "version": "2.2.2", + "version": "2.2.3", "type": "module", "bin": { "codex.docs": "dist/backend/app.js"