From 0d463df073f79e2380e804c0c5ed00d6c8f9b32c Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Wed, 25 Jun 2025 17:38:41 +0300 Subject: [PATCH 1/7] Create docker-image.yml --- .github/workflows/docker-image.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/docker-image.yml diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 0000000..3f53646 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,18 @@ +name: Docker Image CI + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Build the Docker image + run: docker build . --file Dockerfile --tag my-image-name:$(date +%s) From b919116720b620d7f27e65e5fada0a27283b9d91 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Wed, 25 Jun 2025 17:44:03 +0300 Subject: [PATCH 2/7] Create gradle.yml --- .github/workflows/gradle.yml | 67 ++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..5ef5ef3 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,67 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle + +name: Java CI with Gradle + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 24 + uses: actions/setup-java@v4 + with: + java-version: '24' + distribution: 'temurin' + + # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies. + # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md + - name: Setup Gradle + uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 + + - name: Build with Gradle Wrapper + run: ./gradlew build + + # NOTE: The Gradle Wrapper is the default and recommended way to run Gradle (https://docs.gradle.org/current/userguide/gradle_wrapper.html). + # If your project does not have the Gradle Wrapper configured, you can use the following configuration to run Gradle with a specified version. + # + # - name: Setup Gradle + # uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 + # with: + # gradle-version: '8.9' + # + # - name: Build with Gradle 8.9 + # run: gradle build + + dependency-submission: + + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 24 + uses: actions/setup-java@v4 + with: + java-version: '24' + distribution: 'temurin' + + # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. + # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md + - name: Generate and submit dependency graph + uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 From 3c5f9ee945777b2383906f22408c3c2682b4b381 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Wed, 25 Jun 2025 17:57:39 +0300 Subject: [PATCH 3/7] Update docker-image.yml --- .github/workflows/docker-image.yml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 3f53646..d9b8545 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,18 +1,23 @@ -name: Docker Image CI +name: Docker Compose Build on: push: - branches: [ "main" ] + branches: + - main pull_request: - branches: [ "main" ] jobs: - build: - runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Build the Docker image - run: docker build . --file Dockerfile --tag my-image-name:$(date +%s) + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker images + run: | + cd src/Docker + docker-compose build From 430b61ceec3385f38514112378a2491e4e96ade1 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Wed, 25 Jun 2025 18:03:24 +0300 Subject: [PATCH 4/7] Update docker-image.yml --- .github/workflows/docker-image.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index d9b8545..b5e505f 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -17,6 +17,9 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 + - name: Install docker-compose (if needed) + run: sudo apt-get install docker-compose + - name: Build and push Docker images run: | cd src/Docker From 2500a357993a4b6ea1be713eb939f220bbb1b561 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Wed, 25 Jun 2025 18:06:07 +0300 Subject: [PATCH 5/7] Update docker-compose.yml --- src/Docker/docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Docker/docker-compose.yml b/src/Docker/docker-compose.yml index bf8728d..67e3f55 100644 --- a/src/Docker/docker-compose.yml +++ b/src/Docker/docker-compose.yml @@ -13,8 +13,8 @@ services: SPRING_DATASOURCE_URL: jdbc:postgresql://postgres_jambotron:5432/jambotronDB SPRING_DATASOURCE_USERNAME: admin SPRING_DATASOURCE_PASSWORD: postgrespw - SPRING_FLYWAY_BASELINE-ON-MIGRATE: true - SPRING_FLYWAY_VALIDATE-ON-MIGRATE: true + SPRING_FLYWAY_BASELINE-ON-MIGRATE: "true" + SPRING_FLYWAY_VALIDATE-ON-MIGRATE: "true" SPRING_FLYWAY_USER: admin SPRING_FLYWAY_PASSWORD: postgrespw @@ -40,4 +40,4 @@ services: # #secrets: # db_password: -# file: db_password.txt \ No newline at end of file +# file: db_password.txt From a4a4c93f319395f15efd9602dba2575a4a78213b Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Wed, 25 Jun 2025 23:04:28 +0300 Subject: [PATCH 6/7] Create Dockerfile --- Dockerfile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fb86206 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +#FROM openjdk:24 AS BUILD_IMAGE +#ENV APP_HOME=/jambotron +#RUN mkdir -p $APP_HOME/src/main/java +#WORKDIR $APP_HOME +#COPY ./build.gradle ./gradlew ./gradlew.bat $APP_HOME/ +#COPY gradle $APP_HOME/gradle +#COPY ./src/ $APP_HOME/src/ +#RUN ./gradlew clean build + +FROM openjdk:24 +WORKDIR /jambotron/ +COPY '/build/libs/jambotron-0.0.1-SNAPSHOT.jar' '/app/jambotron.jar' +#COPY --from=BUILD_IMAGE '/jambotron/build/libs/jambotron-0.0.1-SNAPSHOT.jar' '/app/jambotron.jar' +EXPOSE 8080 +CMD ["java","-jar","/app/jambotron.jar"] From fa27aca2985c339b904c7c06fa05bd5e3978db83 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Sat, 5 Jul 2025 14:26:02 +0300 Subject: [PATCH 7/7] Add user module routing, integrate markdown support, and enhance dialog functionality --- jambotron-ui/package-lock.json | 1512 ++++++++++++++++- jambotron-ui/package.json | 2 + jambotron-ui/src/app/app.config.ts | 8 +- jambotron-ui/src/app/app.module.ts | 4 +- .../add-tutorial/add-tutorial.component.html | 18 +- .../add-tutorial/add-tutorial.component.scss | 31 + .../add-tutorial/add-tutorial.component.ts | 30 +- .../dialog-signup.component.html | 78 + .../dialog-signup.component.scss | 7 + .../dialog-signup.component.spec.ts | 23 + .../dialog-signup.component.ts | 141 ++ .../components/dialog/dialog.component.html | 4 +- .../components/dialog/dialog.component.scss | 3 + .../app/components/dialog/dialog.component.ts | 36 +- .../side-bar.component.html | 120 ++ .../side-bar.component.scss | 21 + .../side-bar.component.spec.ts | 23 + .../side-bar.component/side-bar.component.ts | 79 + .../tutorials.component.html | 3 +- .../tutorials.component.ts | 4 +- .../main.component/main.component.html | 81 +- .../main.component/main.component.scss | 9 + .../main.component/main.component.ts | 171 +- .../src/app/main-module/main.routing.ts | 5 + .../ai-models.component.html | 1 + .../ai-models.component.scss | 0 .../ai-models.component.spec.ts | 23 + .../ai-models.component.ts | 11 + .../tutorials-list.component.html | 6 + .../tutorials-list.component.scss | 0 .../tutorials-list.component.spec.ts | 23 + .../tutorials-list.component.ts | 15 + .../user-welcome.component.html | 1 + .../user-welcome.component.scss | 0 .../user-welcome.component.spec.ts | 23 + .../user-welcome.component.ts | 11 + .../user.component/user.component.html | 34 + .../user.component/user.component.scss | 50 + .../user.component/user.component.spec.ts | 23 + .../user.component/user.component.ts | 55 + .../src/app/user-module/user.module.ts | 16 + .../src/app/user-module/user.routing.spec.ts | 7 + .../src/app/user-module/user.routing.ts | 27 + jambotron-ui/src/styles.scss | 12 + 44 files changed, 2616 insertions(+), 135 deletions(-) create mode 100644 jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.html create mode 100644 jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.scss create mode 100644 jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.spec.ts create mode 100644 jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.ts create mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.html create mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss create mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts create mode 100644 jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts create mode 100644 jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.html create mode 100644 jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.scss create mode 100644 jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.spec.ts create mode 100644 jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.ts create mode 100644 jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html create mode 100644 jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss create mode 100644 jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.spec.ts create mode 100644 jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts create mode 100644 jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.html create mode 100644 jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.scss create mode 100644 jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.spec.ts create mode 100644 jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.ts create mode 100644 jambotron-ui/src/app/user-module/user.component/user.component.html create mode 100644 jambotron-ui/src/app/user-module/user.component/user.component.scss create mode 100644 jambotron-ui/src/app/user-module/user.component/user.component.spec.ts create mode 100644 jambotron-ui/src/app/user-module/user.component/user.component.ts create mode 100644 jambotron-ui/src/app/user-module/user.module.ts create mode 100644 jambotron-ui/src/app/user-module/user.routing.spec.ts create mode 100644 jambotron-ui/src/app/user-module/user.routing.ts diff --git a/jambotron-ui/package-lock.json b/jambotron-ui/package-lock.json index 9ea6324..2224499 100644 --- a/jambotron-ui/package-lock.json +++ b/jambotron-ui/package-lock.json @@ -26,8 +26,10 @@ "@primeng/themes": "^19.1.3", "bootstrap": "5.3.6", "express": "^5.1.0", + "ngx-markdown": "^20.0.0", "ngx-scrollbar": "18.0.0", "primeng": "^19.1.3", + "prismjs": "^1.30.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "viewerjs": "^1.11.7", @@ -977,6 +979,30 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "license": "MIT", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -2596,6 +2622,57 @@ "node": ">=6.9.0" } }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT", + "optional": true + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0", + "optional": true + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -3114,6 +3191,30 @@ "license": "MIT", "optional": true }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT", + "optional": true + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, "node_modules/@inquirer/checkbox": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz", @@ -3767,6 +3868,16 @@ "win32" ] }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.0.tgz", + "integrity": "sha512-7DNESgpyZ5WG1SIkrYafVBhWmImtmQuoxOO1lawI3gQYWxBX3v1FW3IyuuRfKJAO06XrZR71W0Kif5VEGGd4VA==", + "license": "MIT", + "optional": true, + "dependencies": { + "langium": "3.3.1" + } + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -5373,6 +5484,290 @@ "@types/node": "*" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -5427,6 +5822,13 @@ "@types/send": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT", + "optional": true + }, "node_modules/@types/http-errors": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", @@ -5549,6 +5951,13 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -5781,7 +6190,7 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, + "devOptional": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6515,6 +6924,34 @@ "dev": true, "license": "MIT" }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -6607,6 +7044,18 @@ "node": ">= 12" } }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "license": "MIT", + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -6839,6 +7288,13 @@ "dev": true, "license": "MIT" }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT", + "optional": true + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -7065,6 +7521,16 @@ "node": ">= 0.10" } }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "optional": true, + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -7209,6 +7675,557 @@ "dev": true, "license": "MIT" }, + "node_modules/cytoscape": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.32.0.tgz", + "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "optional": true, + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT", + "optional": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "optional": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "optional": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "optional": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC", + "optional": true + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "optional": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", + "optional": true, + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -7219,6 +8236,13 @@ "node": ">=4.0" } }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT", + "optional": true + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -7279,6 +8303,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "optional": true, + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "license": "MIT", + "optional": true + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7394,6 +8435,16 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optional": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/domutils": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", @@ -7450,6 +8501,13 @@ "dev": true, "license": "MIT" }, + "node_modules/emoji-toolkit": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-9.0.1.tgz", + "integrity": "sha512-sMMNqKNLVHXJfIKoPbrRJwtYuysVNC9GlKetr72zE3SSVbHqoeDLWVrxP0uM0AE0qvdl3hbUk+tJhhwXZrDHaw==", + "license": "MIT", + "optional": true + }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -7912,6 +8970,13 @@ "url": "https://opencollective.com/express" } }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "license": "MIT", + "optional": true + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -8331,6 +9396,29 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "license": "MIT", + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -8350,6 +9438,13 @@ "dev": true, "license": "ISC" }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT", + "optional": true + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -8770,6 +9865,16 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "optional": true, + "engines": { + "node": ">=12" + } + }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -9773,6 +10878,39 @@ "node": ">=10" } }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", + "optional": true + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9783,6 +10921,30 @@ "node": ">=0.10.0" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT", + "optional": true + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "optional": true, + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/launch-editor": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", @@ -9794,6 +10956,13 @@ "shell-quote": "^1.8.1" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT", + "optional": true + }, "node_modules/less": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/less/-/less-4.3.0.tgz", @@ -10015,6 +11184,24 @@ "node": ">= 12.13.0" } }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10038,6 +11225,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT", + "optional": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -10238,6 +11432,19 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "license": "MIT", + "optional": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10305,6 +11512,49 @@ "node": ">= 8" } }, + "node_modules/mermaid": { + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.8.0.tgz", + "integrity": "sha512-uAZUwnBiqREZcUrFw3G5iQ5Pj3hTYUP95EZc3ec/nGBzHddJZydzYGE09tGZDBS1VoSoDn0symZ85FmypSTo5g==", + "license": "MIT", + "optional": true, + "dependencies": { + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.6.0", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.5", + "katex": "^0.16.9", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.7", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -10606,6 +11856,38 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "license": "MIT", + "optional": true, + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT", + "optional": true + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -10733,6 +12015,30 @@ "dev": true, "license": "MIT" }, + "node_modules/ngx-markdown": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-20.0.0.tgz", + "integrity": "sha512-AtB0EhYlfZbNBFzzhOkqxw5tIX+Z1rLqkRP207ee8c3QHQTn/uRmVVTMwE7LenF2ZOW11Brq/O8h6VfLy9FG+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "clipboard": "^2.0.11", + "emoji-toolkit": ">= 8.0.0 < 10.0.0", + "katex": "^0.16.0", + "mermaid": ">= 10.6.0 < 12.0.0", + "prismjs": "^1.30.0" + }, + "peerDependencies": { + "@angular/common": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "marked": "^15.0.0", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + } + }, "node_modules/ngx-scrollbar": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/ngx-scrollbar/-/ngx-scrollbar-18.0.0.tgz", @@ -11261,6 +12567,13 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "license": "MIT", + "optional": true + }, "node_modules/pacote": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz", @@ -11416,6 +12729,13 @@ "node": ">= 0.8" } }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT", + "optional": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -11486,6 +12806,13 @@ "node": ">=16" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT", + "optional": true + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11530,6 +12857,36 @@ "@napi-rs/nice": "^1.0.1" } }, + "node_modules/pkg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz", + "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT", + "optional": true + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "optional": true, + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -11703,6 +13060,15 @@ "rxjs": "^6.0.0 || ^7.8.1" } }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/proc-log": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", @@ -11787,6 +13153,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "optional": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12118,6 +13501,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense", + "optional": true + }, "node_modules/rollup": { "version": "4.40.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", @@ -12158,6 +13548,19 @@ "fsevents": "~2.3.2" } }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -12211,6 +13614,13 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -12372,6 +13782,13 @@ } } }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "license": "MIT", + "optional": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -13270,6 +14687,13 @@ "node": ">=8" } }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT", + "optional": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13481,6 +14905,20 @@ "dev": true, "license": "MIT" }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT", + "optional": true + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT", + "optional": true + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -13560,6 +14998,16 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6.10" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -13656,6 +15104,13 @@ "node": "*" } }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT", + "optional": true + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -13931,6 +15386,61 @@ "node": ">=0.10.0" } }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "optional": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "optional": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT", + "optional": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT", + "optional": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT", + "optional": true + }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", diff --git a/jambotron-ui/package.json b/jambotron-ui/package.json index 389e2e8..27d5ca8 100644 --- a/jambotron-ui/package.json +++ b/jambotron-ui/package.json @@ -29,8 +29,10 @@ "@primeng/themes": "^19.1.3", "bootstrap": "5.3.6", "express": "^5.1.0", + "ngx-markdown": "^20.0.0", "ngx-scrollbar": "18.0.0", "primeng": "^19.1.3", + "prismjs": "^1.30.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "viewerjs": "^1.11.7", diff --git a/jambotron-ui/src/app/app.config.ts b/jambotron-ui/src/app/app.config.ts index 8d20721..6373f43 100644 --- a/jambotron-ui/src/app/app.config.ts +++ b/jambotron-ui/src/app/app.config.ts @@ -12,6 +12,12 @@ import {AppModule} from './app.module'; import {providePrimeNG} from 'primeng/config'; import Aura from '@primeng/themes/aura'; import {provideAnimations} from '@angular/platform-browser/animations'; +import {provideMarkdown} from 'ngx-markdown'; + +import 'prismjs'; +import 'prismjs/components/prism-typescript.min.js'; +import 'prismjs/plugins/line-numbers/prism-line-numbers.js'; +import 'prismjs/plugins/line-highlight/prism-line-highlight.js'; export const appConfig: ApplicationConfig = { providers: [ @@ -19,7 +25,7 @@ export const appConfig: ApplicationConfig = { provideAnimations(), provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideClientHydration(withEventReplay()), - + provideMarkdown(), importProvidersFrom(AppModule), providePrimeNG({ theme: { diff --git a/jambotron-ui/src/app/app.module.ts b/jambotron-ui/src/app/app.module.ts index 191e85c..08f57c9 100644 --- a/jambotron-ui/src/app/app.module.ts +++ b/jambotron-ui/src/app/app.module.ts @@ -16,9 +16,7 @@ import {SystemComponent} from './admin-module/system.component/system.component' import {AppRoutingModule} from './app.routes'; import {App} from './app'; import {CustomHttpInterceptor} from './helpers/custom-http-interceptor'; -import {AngularImageViewerModule} from '@hreimer/angular-image-viewer'; -import {MainModule} from './main-module/main.module'; -import {CommonModule} from '@angular/common'; + @NgModule({ declarations: [ diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html index 1080dfd..2942a01 100644 --- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.html @@ -38,14 +38,26 @@ Add tutorial - + Title - - + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss index d3a379b..2c829bf 100644 --- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.scss @@ -19,3 +19,34 @@ mat-card-title{ .example-full-width { width: 100%; } + + +.variable-binding, +.variable-textarea { + width: 49%; +} + +.variable-textarea { + border-radius: 5px; + box-shadow: 0 1px 2px rgba(0,0,0,.07); + min-height: 420px; + padding: 8px; + transition: all 300ms ease-out; +} + +.variable-textarea:hover { + box-shadow: 0 6px 12px 3px rgba(0,0,0,.09), + 0 2px 3px 1px rgba(0,0,0,.06); +} + +.variable-binding { + display: block; + float: right; +} + +.preview { +/* display: block; + float: right;*/ +} + + diff --git a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts index 31f2132..3fe0470 100644 --- a/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts +++ b/jambotron-ui/src/app/components/add-tutorial/add-tutorial.component.ts @@ -6,6 +6,8 @@ import {FormsModule} from '@angular/forms'; import {MatButton} from '@angular/material/button'; import {MatFormField, MatInput, MatLabel} from '@angular/material/input'; import {NgIf} from '@angular/common'; +import {MatTab, MatTabGroup} from '@angular/material/tabs'; +import {MarkdownComponent} from 'ngx-markdown'; @Component({ selector: 'app-add-tutorial', @@ -24,6 +26,9 @@ import {NgIf} from '@angular/common'; MatInput, NgIf, MatLabel, + MatTabGroup, + MatTab, + MarkdownComponent, ], schemas: [CUSTOM_ELEMENTS_SCHEMA] @@ -35,9 +40,30 @@ export class AddTutorialComponent implements OnInit { description: '', published: false }; - submitted = false; + submitted = false - constructor(private tutorialService: TutorialService) { } + markdown = `## Markdown __rulez__! +--- + +### Syntax highlight +\`\`\`typescript +const language = 'typescript'; +\`\`\` + +### Lists +1. Ordered list +2. Another bullet point + - Unordered list + - Another unordered bullet + +### Blockquote +> Blockquote to the max`; + + + + constructor(private tutorialService: TutorialService) { + this.tutorial.description = this.markdown; + } ngOnInit(): void { } diff --git a/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.html b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.html new file mode 100644 index 0000000..c2408ce --- /dev/null +++ b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.html @@ -0,0 +1,78 @@ +

Hi

+
+
+

User name

+ + + +

Email

+ + Email + + @if (emailFormControl.invalid) { + {{errorMessage()}} + } + +

Password

+ + Enter your password + + + +

Confirm password

+ + Confirm your password + + @if (signUpForm.get("confirmPassword")?.value !== signUpForm.get("password")?.value) { + Passwords do not match + } + + +
+ +
+ + + + +
+
diff --git a/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.scss b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.scss new file mode 100644 index 0000000..3c72c51 --- /dev/null +++ b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.scss @@ -0,0 +1,7 @@ +.menu-spacer { + flex: 1 1 auto; +} + +.fillField{ + width: 100%; +}; diff --git a/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.spec.ts b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.spec.ts new file mode 100644 index 0000000..6140c87 --- /dev/null +++ b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DialogSignupComponent } from './dialog-signup.component'; + +describe('DialogSignupComponent', () => { + let component: DialogSignupComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DialogSignupComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DialogSignupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.ts b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.ts new file mode 100644 index 0000000..2d052e9 --- /dev/null +++ b/jambotron-ui/src/app/components/dialog-signup.component/dialog-signup.component.ts @@ -0,0 +1,141 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, Inject, inject, OnInit, Output, signal} from '@angular/core'; +import { + AbstractControl, + FormBuilder, + FormControl, + FormGroup, + FormGroupDirective, + FormsModule, + NgForm, + ReactiveFormsModule, ValidationErrors, ValidatorFn, + Validators +} from '@angular/forms'; +import {MatButtonModule} from '@angular/material/button'; +import { + MAT_DIALOG_DATA, + MatDialogActions, + MatDialogClose, + MatDialogContent, + MatDialogRef, + MatDialogTitle +} from '@angular/material/dialog'; +import {MatFormField, MatInput, MatLabel, MatSuffix} from '@angular/material/input'; +import {MatIcon} from '@angular/material/icon'; +import {MatSnackBar} from '@angular/material/snack-bar'; +import {DialogSignupData} from '../../main-module/main.component/main.component'; +import {ErrorStateMatcher} from '@angular/material/core'; + +@Component({ + selector: 'app-dialog-signup.component', + imports: [ + FormsModule, + MatButtonModule, + MatDialogActions, + MatDialogClose, + MatDialogContent, + MatDialogTitle, + MatFormField, + MatIcon, + MatInput, + MatLabel, + MatSuffix, + MatFormField, + ReactiveFormsModule, + + ], + templateUrl: './dialog-signup.component.html', + styleUrl: './dialog-signup.component.scss', + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class DialogSignupComponent implements OnInit { + readonly dialogRef = inject(MatDialogRef); + hide = signal(true); + + @Output() signupClicked = new EventEmitter(); + @Output() loginClicked = new EventEmitter(); + + private _snackBar = inject(MatSnackBar); + + durationInSeconds = 5; + + emailFormControl = new FormControl('', [Validators.required, Validators.email]); + + matcher = new MyErrorStateMatcher(); + + errorMessage = signal(''); + + signUpForm = new FormGroup({ + username: new FormControl('', [Validators.required]), + email: new FormControl('', [Validators.required, Validators.email]), + password: new FormControl('', [Validators.required]), + confirmPassword: new FormControl('', [Validators.required, this.validateSamePassword]), + }); + minPw = 8; + + constructor( + @Inject(MAT_DIALOG_DATA) public data:DialogSignupData, + private formBuilder: FormBuilder) { + + } + + ngOnInit(): void { + + } + + updateErrorMessage() { + if (this.emailFormControl.hasError('required')) { + this.errorMessage.set('You must enter a value'); + } else if (this.emailFormControl.hasError('email')) { + this.errorMessage.set('Not a valid email'); + } else { + this.errorMessage.set(''); + } + } + + clickEvent(event: MouseEvent) { + this.hide.set(!this.hide()); + event.stopPropagation(); + } + + onNoClick() { + this.dialogRef.close(); + } + + openSignupFailedSnackBar(errorMessage : string = "Sign up failed.") { + this._snackBar.open(errorMessage , "", { + duration: this.durationInSeconds * 1000, + }); + } + + openSignupSuccessSnackBar(message : string = "User registered successfully!") { + this._snackBar.open(message, "", { + duration: this.durationInSeconds * 1000, + }); + } + + signup() { + if (!this.signUpForm.invalid) { + this.signupClicked.emit(this.data); + } + } + + login() { + this.loginClicked.emit(); + } + + private validateSamePassword(control: AbstractControl): ValidationErrors | null { + const password = control.parent?.get('password'); + const confirmPassword = control.parent?.get('confirmPassword'); + return password?.value == confirmPassword?.value ? null : { 'notSame': true }; + } +} + + + +/** Error when invalid control is dirty, touched, or submitted. */ +export class MyErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isSubmitted = form && form.submitted; + return !!(control && control.invalid && (control.dirty || control.touched || isSubmitted)); + } +} diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.html b/jambotron-ui/src/app/components/dialog/dialog.component.html index 9464edd..a17f453 100644 --- a/jambotron-ui/src/app/components/dialog/dialog.component.html +++ b/jambotron-ui/src/app/components/dialog/dialog.component.html @@ -24,6 +24,8 @@
+ + - +
diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.scss b/jambotron-ui/src/app/components/dialog/dialog.component.scss index 292c1b2..3c72c51 100644 --- a/jambotron-ui/src/app/components/dialog/dialog.component.scss +++ b/jambotron-ui/src/app/components/dialog/dialog.component.scss @@ -1,3 +1,6 @@ +.menu-spacer { + flex: 1 1 auto; +} .fillField{ width: 100%; diff --git a/jambotron-ui/src/app/components/dialog/dialog.component.ts b/jambotron-ui/src/app/components/dialog/dialog.component.ts index c2c14e5..c9f8128 100644 --- a/jambotron-ui/src/app/components/dialog/dialog.component.ts +++ b/jambotron-ui/src/app/components/dialog/dialog.component.ts @@ -1,4 +1,4 @@ -import {ChangeDetectionStrategy, Component, Inject, inject, signal} from '@angular/core'; +import {ChangeDetectionStrategy, Component, EventEmitter, Inject, inject, Output, signal} from '@angular/core'; import {MatButtonModule} from "@angular/material/button"; import { MAT_DIALOG_DATA, @@ -14,7 +14,8 @@ import {MatFormField, MatLabel, MatSuffix} from "@angular/material/form-field"; import {MatInput} from "@angular/material/input"; import {FormsModule} from "@angular/forms"; import {MatIcon} from "@angular/material/icon"; -import {DialogData} from '../../main-module/main.component/main.component'; +import {DialogLoginData} from '../../main-module/main.component/main.component'; +import {MatSnackBar} from '@angular/material/snack-bar'; @@ -22,16 +23,32 @@ import {DialogData} from '../../main-module/main.component/main.component'; @Component({ selector: 'app-dialog', imports: [MatButtonModule, MatLabel, MatDialogActions, MatDialogClose, MatDialogTitle, MatDialogContent, MatFormField, MatInput, FormsModule, MatIcon, MatSuffix], - changeDetection: ChangeDetectionStrategy.OnPush, + templateUrl: './dialog.component.html', - styleUrl: './dialog.component.scss' + styleUrl: './dialog.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush }) export class DialogComponent { readonly dialogRef = inject(MatDialogRef); hide = signal(true); + @Output() loginClicked = new EventEmitter(); + @Output() signupClicked = new EventEmitter(); + + private _snackBar = inject(MatSnackBar); + durationInSeconds = 5; + + constructor( - @Inject(MAT_DIALOG_DATA) public data:DialogData) {} + @Inject(MAT_DIALOG_DATA) public data:DialogLoginData) { + + } + + openLoginFailedSnackBar(errorMessage : string = "Login failed.") { + this._snackBar.open(errorMessage , "", { + duration: this.durationInSeconds * 1000, + }); + } onNoClick() { this.dialogRef.close(); @@ -42,6 +59,15 @@ export class DialogComponent { this.hide.set(!this.hide()); event.stopPropagation(); } + + login() { + this.loginClicked.emit(this.data); + + } + + signup() { + this.signupClicked.emit(); + } } diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.html b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.html new file mode 100644 index 0000000..00d2c21 --- /dev/null +++ b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.html @@ -0,0 +1,120 @@ + + + diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss new file mode 100644 index 0000000..52e31bf --- /dev/null +++ b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.scss @@ -0,0 +1,21 @@ +.entry{ + display: flex; + align-items: center; + gap: 1rem; + padding:0.75rem; +} + + + +.example-action-buttons { + padding-bottom: 20px; +} + +.example-headers-align .mat-expansion-panel-header-description { + justify-content: space-between; + align-items: center; +} + +.example-headers-align .mat-mdc-form-field + .mat-mdc-form-field { + margin-left: 8px; +} diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts new file mode 100644 index 0000000..b2bc9bf --- /dev/null +++ b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SideBarComponent } from './side-bar.component'; + +describe('SideBarComponent', () => { + let component: SideBarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SideBarComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SideBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts new file mode 100644 index 0000000..ec8cf0b --- /dev/null +++ b/jambotron-ui/src/app/components/side-bar.component/side-bar.component.ts @@ -0,0 +1,79 @@ +import {ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, viewChild} from '@angular/core'; +import {MatTree, MatTreeNode} from '@angular/material/tree'; +import {MatFormField, MatInput, MatLabel} from '@angular/material/input'; +import {MatDivider, MatListItem, MatNavList} from '@angular/material/list'; +import {MatIcon} from '@angular/material/icon'; +import {RouterLink} from '@angular/router'; +import { + MatAccordion, MatExpansionModule, + MatExpansionPanel, + MatExpansionPanelDescription, + MatExpansionPanelTitle +} from '@angular/material/expansion'; +import {MatDatepicker, MatDatepickerInput} from '@angular/material/datepicker'; +import {provideNativeDateAdapter} from '@angular/material/core'; +import {MatButton} from '@angular/material/button'; + +@Component({ + selector: 'app-side-bar', + imports: [ + MatTree, + MatTreeNode, + MatLabel, + MatNavList, + MatListItem, + MatIcon, + RouterLink, + MatExpansionPanel, + MatExpansionPanelTitle, + MatExpansionPanelDescription, + MatFormField, + MatInput, + MatDatepickerInput, + MatDatepicker, + MatDivider, + MatAccordion, + MatButton, + MatExpansionModule + ], + templateUrl: './side-bar.component.html', + styleUrl: './side-bar.component.scss', + schemas:[CUSTOM_ELEMENTS_SCHEMA], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [provideNativeDateAdapter()], +}) + + + +export class SideBarComponent { + isCollapsed = false; + + accordion = viewChild.required(MatAccordion); +} + +const TREE_DATA: TreeNode[] = [ + { + name: 'Fruit', + children: [{name: 'Apple'}, {name: 'Banana'}, {name: 'Fruit loops'}], + }, + { + name: 'Vegetables', + children: [ + { + name: 'Green', + children: [{name: 'Broccoli'}, {name: 'Brussels sprouts'}], + }, + { + name: 'Orange', + children: [{name: 'Pumpkins'}, {name: 'Carrots'}], + }, + ], + }, +]; + +interface TreeNode { + name: string; + children?: TreeNode[]; +} + + diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html index 1c6abe5..0b90782 100644 --- a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html +++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.html @@ -3,7 +3,8 @@ {{tutorial.title}} - + + } diff --git a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts index c97aa15..11913d6 100644 --- a/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts +++ b/jambotron-ui/src/app/components/tutorials.component/tutorials.component.ts @@ -2,13 +2,15 @@ import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {Tutorial} from '../../models/tutorial.model'; import {TutorialService} from '../../services/tutorial.service'; import {MatCard, MatCardContent, MatCardHeader} from '@angular/material/card'; +import {MarkdownComponent} from 'ngx-markdown'; @Component({ selector: 'app-tutorials.component', imports: [ MatCard, MatCardContent, - MatCardHeader + MatCardHeader, + MarkdownComponent ], templateUrl: './tutorials.component.html', styleUrl: './tutorials.component.scss', diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.html b/jambotron-ui/src/app/main-module/main.component/main.component.html index 7b740b7..19894b2 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.html +++ b/jambotron-ui/src/app/main-module/main.component/main.component.html @@ -1,11 +1,4 @@ - - - - @@ -17,54 +10,46 @@ Add tutorial } - - @if (showAdminBoard) { - - } - - @if (showAdminBoard) { - - } - @if (isLoggedIn) { - - } + @if (!isLoggedIn) { - - } - @if (isLoggedIn) { - - + + }@else { + + + @if (showAdminBoard) { + + } + + + + + } - - - - - -
+
diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.scss b/jambotron-ui/src/app/main-module/main.component/main.component.scss index 91d9aa8..fe0674f 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.scss +++ b/jambotron-ui/src/app/main-module/main.component/main.component.scss @@ -12,9 +12,18 @@ mat-toolbar{ right: 0; left: 0; z-index: 1000; // Ensure toolbar stays above other content + height: 65px; } .mat-mdc-raised-button:not(:disabled){ color: rgba(24, 255, 255, 0.96); background-color: rgba(24,255,255,0.04); } +.mat-mdc-mini-fab{ + margin: 5px; +} + +.router_outlet{ + margin-top: 65px; + height: 100%; +} diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.ts b/jambotron-ui/src/app/main-module/main.component/main.component.ts index 1608610..4ea4697 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.ts +++ b/jambotron-ui/src/app/main-module/main.component/main.component.ts @@ -3,7 +3,7 @@ import {Component, CUSTOM_ELEMENTS_SCHEMA, inject, OnInit} from '@angular/core'; import {Router, RouterLink, RouterOutlet} from '@angular/router'; import {MatToolbar} from '@angular/material/toolbar'; -import {MatButton} from '@angular/material/button'; +import {MatButton, MatFabButton, MatMiniFabButton} from '@angular/material/button'; import {IconDirective, IconService} from '@ant-design/icons-angular'; import {MatDialog} from '@angular/material/dialog'; import {Subscription} from 'rxjs'; @@ -11,16 +11,13 @@ import {TokenStorageService} from '../../services/token-storage.service'; import {AuthService} from '../../services/auth.service'; import {EventBusService} from '../../_shared/event-bus.service'; import {DialogComponent} from '../../components/dialog/dialog.component'; -import { - ArrowRightOutline, BellOutline, - CheckCircleOutline, CommentOutline, EditOutline, - GiftOutline, GithubOutline, LockOutline, LogoutOutline, - MessageOutline, - PhoneOutline, ProfileOutline, QuestionCircleOutline, - SettingOutline, UnorderedListOutline, UserOutline, WalletOutline -} from '@ant-design/icons-angular/icons'; -import {BrowserModule} from '@angular/platform-browser'; + import {CommonModule} from '@angular/common'; +import {MatIcon} from '@angular/material/icon'; +import {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu'; +import {MatTooltip} from '@angular/material/tooltip'; +import {DialogSignupComponent} from '../../components/dialog-signup.component/dialog-signup.component'; +import {MatLabel} from '@angular/material/input'; @Component({ selector: 'app-main.component', @@ -31,7 +28,15 @@ import {CommonModule} from '@angular/common'; RouterLink, IconDirective, RouterOutlet, - CommonModule + CommonModule, + MatIcon, + MatMiniFabButton, + MatMenuTrigger, + MatMenu, + MatMenuItem, + MatTooltip, + MatLabel, + MatFabButton ], schemas: [ CUSTOM_ELEMENTS_SCHEMA ], @@ -45,7 +50,9 @@ export class MainComponent implements OnInit{ readonly dialog = inject(MatDialog); //private authService = new AuthService(provideHttpClient()) - public dialogData : DialogData = {password: "", username: ""}; + public dialogLoginData : DialogLoginData = {password: "", username: ""}; + public dialogSignupData : DialogSignupData = {password: "", username: "", email: "", confirmPassword: ""}; + private roles: string[] = []; isLoggedIn = false; @@ -54,38 +61,14 @@ export class MainComponent implements OnInit{ username?: string; eventBusSub?: Subscription; - private errorMessage: any; - private isLoginFailed: boolean = false; + private storageService: TokenStorageService = inject(TokenStorageService); private authService: AuthService = inject(AuthService); private eventBusService: EventBusService = inject(EventBusService); - private iconService = inject(IconService); - - constructor(private router: Router) { - this.iconService.addIcon( - ...[ - CheckCircleOutline, - GiftOutline, - MessageOutline, - SettingOutline, - PhoneOutline, - LogoutOutline, - UserOutline, - EditOutline, - ProfileOutline, - QuestionCircleOutline, - LockOutline, - CommentOutline, - UnorderedListOutline, - ArrowRightOutline, - BellOutline, - GithubOutline, - WalletOutline - ] - ); + } goToHome() { this.router.navigate(['main/home']); @@ -161,49 +144,99 @@ export class MainComponent implements OnInit{ }); } - openDialog(enterAnimationDuration: string, exitAnimationDuration: string) { + openLoginDialog(enterAnimationDuration: string, exitAnimationDuration: string) { - let dialogRef = this.dialog.open(DialogComponent, { + let dialogLoginRef = this.dialog.open(DialogComponent, { width: '350px', enterAnimationDuration, exitAnimationDuration, - data: {username: this.dialogData.username, password: this.dialogData.password} + data: {username: this.dialogLoginData.username, password: this.dialogLoginData.password} }); + dialogLoginRef.componentInstance.signupClicked.subscribe(result => { + dialogLoginRef.close(); + this.openSignupDialog(enterAnimationDuration, exitAnimationDuration); + }) - dialogRef.afterClosed().subscribe(result => { - console.log('The dialog was closed'); - if(result== null){ - return; - } - this.dialogData = result; + const dialogSubmitSubscription = dialogLoginRef.componentInstance.loginClicked + .subscribe(result => { + console.log('Got the data!', result); - this.authService.login(this.dialogData.username, this.dialogData.password).subscribe( - data => { - this.storageService.saveToken(data.accessToken); - this.storageService.saveUser(data); - - this.isLoginFailed = false; - this.isLoggedIn = true; - let user = this.storageService.getUser(); - this.roles = user.roles; - //this.username = user.username; - //this.reloadPage(); - this.refreshToolbar(); - }, - err => { - this.errorMessage = err.error.message; - this.isLoginFailed = true; + if(result== null){ + return; } - ); + this.dialogLoginData = result; + + this.authService.login(this.dialogLoginData.username, this.dialogLoginData.password).subscribe( + data => { + this.storageService.saveToken(data.accessToken); + this.storageService.saveUser(data); + + this.isLoggedIn = true; + let user = this.storageService.getUser(); + this.roles = user.roles; + + this.refreshToolbar(); + dialogLoginRef.close() + this.router.navigate(['main/user/user-welcome']); + }, + err => { + dialogLoginRef.componentInstance.openLoginFailedSnackBar(err.error.message); + } + ); + + // do something here with the data + dialogSubmitSubscription.unsubscribe(); + }); + } + + openSignupDialog(enterAnimationDuration: string, exitAnimationDuration: string) { + + let dialogSignupRef = this.dialog.open(DialogSignupComponent, { + width: '350px', + enterAnimationDuration, + exitAnimationDuration, + data: {username: this.dialogLoginData.username, password: this.dialogLoginData.password} }); - } - reloadPage(): void { - window.location.reload(); - } + const dialogloginSubscription = dialogSignupRef.componentInstance.loginClicked.subscribe(result => { + dialogSignupRef.close(); + this.openLoginDialog(enterAnimationDuration, exitAnimationDuration); + }) + const dialogSubmitSubscription = dialogSignupRef.componentInstance.signupClicked + .subscribe(result => { + console.log('Got the data!', result); + + if (result == null) { + return; + } + this.dialogSignupData = result; + + this.authService.register(this.dialogSignupData.username, this.dialogSignupData.email, this.dialogSignupData.password).subscribe( + data => { + console.log(data); + dialogSignupRef.componentInstance.openSignupSuccessSnackBar(data.message) + dialogSignupRef.close(); + }, + err => { + dialogSignupRef.componentInstance.openSignupFailedSnackBar(err.error.message); + } + ); + + // do something here with the data + dialogloginSubscription.unsubscribe(); + dialogSubmitSubscription.unsubscribe(); + }); + } } -export interface DialogData { +export interface DialogLoginData { username: string; password: string; } + +export interface DialogSignupData { + email: string; + username: string; + password: string; + confirmPassword: string; +} diff --git a/jambotron-ui/src/app/main-module/main.routing.ts b/jambotron-ui/src/app/main-module/main.routing.ts index 205d592..9059cc4 100644 --- a/jambotron-ui/src/app/main-module/main.routing.ts +++ b/jambotron-ui/src/app/main-module/main.routing.ts @@ -18,6 +18,11 @@ const MAIN_ROUTES: Routes =[ loadChildren: () => import('../admin-module/admin.module').then((m) => m.AdminModule), }, + { + path: 'user', + loadChildren: () => + import('../user-module/user.module').then((m) => m.UserModule), + }, { path: 'home', component: HomeComponent diff --git a/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.html b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.html new file mode 100644 index 0000000..d8e693e --- /dev/null +++ b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.html @@ -0,0 +1 @@ +

ai-models.component works!

diff --git a/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.scss b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.spec.ts b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.spec.ts new file mode 100644 index 0000000..86b422c --- /dev/null +++ b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AiModelsComponent } from './ai-models.component'; + +describe('AiModelsComponent', () => { + let component: AiModelsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AiModelsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(AiModelsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.ts b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.ts new file mode 100644 index 0000000..31bd190 --- /dev/null +++ b/jambotron-ui/src/app/user-module/ai-models.component/ai-models.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-ai-models.component', + imports: [], + templateUrl: './ai-models.component.html', + styleUrl: './ai-models.component.scss' +}) +export class AiModelsComponent { + +} diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html new file mode 100644 index 0000000..088d130 --- /dev/null +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.html @@ -0,0 +1,6 @@ +

tutorials-list.component works!

+ + Item 1 + Item 2 + Item 3 + diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.spec.ts b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.spec.ts new file mode 100644 index 0000000..c8453de --- /dev/null +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TutorialsListComponent } from './tutorials-list.component'; + +describe('TutorialsListComponent', () => { + let component: TutorialsListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TutorialsListComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TutorialsListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts new file mode 100644 index 0000000..6b34a98 --- /dev/null +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import {MatList, MatListItem} from '@angular/material/list'; + +@Component({ + selector: 'app-tutorials-list.component', + imports: [ + MatList, + MatListItem + ], + templateUrl: './tutorials-list.component.html', + styleUrl: './tutorials-list.component.scss' +}) +export class TutorialsListComponent { + +} diff --git a/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.html b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.html new file mode 100644 index 0000000..1148657 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.html @@ -0,0 +1 @@ +

user-welcome.component works!

diff --git a/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.scss b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.spec.ts b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.spec.ts new file mode 100644 index 0000000..5843210 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UserWelcomeComponent } from './user-welcome.component'; + +describe('UserWelcomeComponent', () => { + let component: UserWelcomeComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserWelcomeComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UserWelcomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.ts b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.ts new file mode 100644 index 0000000..a80cd89 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user-welcome.component/user-welcome.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-user-welcome.component', + imports: [], + templateUrl: './user-welcome.component.html', + styleUrl: './user-welcome.component.scss' +}) +export class UserWelcomeComponent { + +} diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.html b/jambotron-ui/src/app/user-module/user.component/user.component.html new file mode 100644 index 0000000..9467823 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.component/user.component.html @@ -0,0 +1,34 @@ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.scss b/jambotron-ui/src/app/user-module/user.component/user.component.scss new file mode 100644 index 0000000..070126d --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.component/user.component.scss @@ -0,0 +1,50 @@ + +mat-toolbar{ + position:fixed; + top:0; + z-index: 2; +} + +mat-sidenav-container { + height:100%; +} + +// Move the content down so that it won't be hidden by the toolbar +mat-sidenav { + padding-top: 3.5rem; + transition: width 0.3s ease; + @media screen and (min-width: 600px) { + padding-top: 4rem; + } + + .entry{ + display: flex; + align-items: center; + gap: 1rem; + padding:0.75rem; + } + +} + +// Move the content down so that it won't be hidden by the toolbar +mat-sidenav-content{ + padding-top: 3.5rem; + @media screen and (min-width: 600px) { + padding-top: 4rem; + } +} + + + +.expanded { + width: 250px; +} + +//--------------- +.pc-sidebar{ + top: 65px; + overflow-y: auto; +} +.pc-container{ + top: 0px; +} diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.spec.ts b/jambotron-ui/src/app/user-module/user.component/user.component.spec.ts new file mode 100644 index 0000000..31806fe --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.component/user.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UserComponent } from './user.component'; + +describe('UserComponent', () => { + let component: UserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.ts b/jambotron-ui/src/app/user-module/user.component/user.component.ts new file mode 100644 index 0000000..b45bdb2 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.component/user.component.ts @@ -0,0 +1,55 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA, OnInit, ViewChild} from '@angular/core'; +import {RouterOutlet} from '@angular/router'; +import {SideBarComponent} from '../../components/side-bar.component/side-bar.component'; +import {MatSidenav, MatSidenavContainer} from '@angular/material/sidenav'; +import {NgClass} from '@angular/common'; +import {MatListItem, MatNavList} from '@angular/material/list'; +import {MatIcon} from '@angular/material/icon'; +import {BreakpointObserver} from '@angular/cdk/layout'; +import {MatToolbar} from '@angular/material/toolbar'; +import {MatIconButton} from '@angular/material/button'; + +@Component({ + selector: 'app-user.component', + imports: [ + RouterOutlet, + SideBarComponent, + MatSidenavContainer, + NgClass, + MatNavList, + MatSidenav, + MatListItem, + MatIcon, + MatToolbar, + MatIconButton + ], + templateUrl: './user.component.html', + styleUrl: './user.component.scss', + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class UserComponent implements OnInit { + @ViewChild(MatSidenav) + sidenav!: MatSidenav; + isMobile= true; + isCollapsed = true; + + + constructor(private observer: BreakpointObserver) { + + } + + ngOnInit(): void { + this.observer.observe(['(max-width: 800px)']).subscribe((screenSize) => { + this.isMobile = screenSize.matches; + }); + } + toggleMenu() { + if(this.isMobile){ + this.sidenav.toggle(); + this.isCollapsed = false; + } else { + this.sidenav.open(); + this.isCollapsed = !this.isCollapsed; + } + } +} diff --git a/jambotron-ui/src/app/user-module/user.module.ts b/jambotron-ui/src/app/user-module/user.module.ts new file mode 100644 index 0000000..7255d3c --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import {userRouting} from './user.routing'; +import {UserComponent} from './user.component/user.component'; + + + +@NgModule({ + declarations: [], + imports: [ + userRouting, + UserComponent, + CommonModule + ] +}) +export class UserModule { } diff --git a/jambotron-ui/src/app/user-module/user.routing.spec.ts b/jambotron-ui/src/app/user-module/user.routing.spec.ts new file mode 100644 index 0000000..a1455bd --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.routing.spec.ts @@ -0,0 +1,7 @@ +import { UserRouting } from './user.routing'; + +describe('UserRouting', () => { + it('should create an instance', () => { + expect(new UserRouting()).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/user.routing.ts b/jambotron-ui/src/app/user-module/user.routing.ts new file mode 100644 index 0000000..c9f7228 --- /dev/null +++ b/jambotron-ui/src/app/user-module/user.routing.ts @@ -0,0 +1,27 @@ +import {RouterModule, Routes} from '@angular/router'; + +import {UserComponent} from './user.component/user.component'; + +const USER_ROUTES: Routes = [ + { + path: '', + component: UserComponent, + + children: [ + { + path: 'user-welcome', + loadComponent: () => import('../user-module/user-welcome.component/user-welcome.component').then((c) => c.UserWelcomeComponent), + }, + { + path: 'tutorials-list', + loadComponent: () => import('../user-module/tutorials-list.component/tutorials-list.component').then((c) => c.TutorialsListComponent) + }, + { + path: 'ai-models', + loadComponent: () => import('../user-module/ai-models.component/ai-models.component').then((c) => c.AiModelsComponent) + } + ] + } +]; + +export const userRouting = RouterModule.forChild(USER_ROUTES); diff --git a/jambotron-ui/src/styles.scss b/jambotron-ui/src/styles.scss index 7a0592a..0421915 100644 --- a/jambotron-ui/src/styles.scss +++ b/jambotron-ui/src/styles.scss @@ -38,6 +38,18 @@ File: style.css @import 'scss/themes/preset-style.scss'; +//markdown styles +@import 'bootstrap/dist/css/bootstrap.min.css'; +@import 'prismjs/themes/prism-okaidia.css'; +@import 'prismjs/plugins/line-numbers/prism-line-numbers.css'; +@import 'prismjs/plugins/line-highlight/prism-line-highlight.css'; +blockquote { + border-left: 3px solid rgba(0,0,0,0.21); + padding-left: 12px; + color: rgba(0,0,0,0.54); +} +//-------------------------- +// html, body { height: 100%; } body { background-image: url('../public/Firefly_jambo tron 118290.jpg');