diff --git a/common/src/styles/_typography.scss b/common/src/styles/_typography.scss index a09a9dd9d..c411a1f97 100644 --- a/common/src/styles/_typography.scss +++ b/common/src/styles/_typography.scss @@ -41,14 +41,14 @@ $p1-mobile: 16px; $height-p1-mobile: calc(24px / $p1-mobile); $p2: 16px; -$height-p2: calc(26px / $p2); +$height-p2: calc(24px / $p2); $p2-mobile: 14px; $height-p2-mobile: calc(24px / $p2-mobile); -$blog: 18px; -$height-blog: calc(28px / $blog); -$blog-mobile: 16px; -$height-blog-mobile: calc(26px / $blog-mobile); +$blog: 16px; +$height-blog: calc(26px / $blog); +$blog-mobile: 14px; +$height-blog-mobile: calc(24px / $blog-mobile); $aside: 14px; $height-aside: calc(22px / $aside); diff --git a/common/src/styles/vars.scss b/common/src/styles/vars.scss index a242fe28e..c3ebe523a 100644 --- a/common/src/styles/vars.scss +++ b/common/src/styles/vars.scss @@ -43,7 +43,7 @@ --section-page-margin: #{$section-page-margin}; --section-width: #{$section-width}; - --section-max-width: calc(100vw - 24px); + --section-max-width: calc(100vw - 40px); --blog-post-width: #{$blog-post-width}; --blog-post-max-width: calc(var(--section-max-width) - #{$blog-post-gap} - #{$blog-post-sidebar-width}); diff --git a/main/package.json b/main/package.json index 78667d9a2..b372545ab 100644 --- a/main/package.json +++ b/main/package.json @@ -36,6 +36,7 @@ "fontfaceobserver": "2.3.0", "interactjs": "1.10.18", "ngx-cookieconsent": "4.0.2", + "pixi.js-legacy": "7.4.3", "posthog-js": "1.268.8", "prismjs": "1.29.0", "rxjs": "7.8.1", diff --git a/main/src/framework/feature-grid/feature-grid.component.html b/main/src/framework/feature-grid/feature-grid.component.html index ed4920d47..c496d16d7 100644 --- a/main/src/framework/feature-grid/feature-grid.component.html +++ b/main/src/framework/feature-grid/feature-grid.component.html @@ -1,57 +1,68 @@ -@for (feature of featureRows.flat(); track feature) { -
-
- @if (feature.title) { -
- @if (feature.iconURL) { - +@if (data.title) { + +} + +@for (row of data.rows; track row) { +
+ @for (feature of row.cells; track feature) { +
+
+ @if (feature.title) { +
+ @if (feature.iconURL) { + + } +

{{ feature.title }}

+
+ +
} -

{{ feature.title }}

-
- -
- } - @if (feature.body) { - - } - @if (feature.links?.length) { - - } -
- @if (hasMediaIllustration(feature)) { - - - - } - @if (hasShortCodeSnippet(feature)) { -
-
{{ $any(feature.illustration).code }}
- @if (!feature.isIllustrationBlurred) { - + @if (hasMediaIllustration(feature)) { + + + + } + @if (hasShortCodeSnippet(feature)) { +
+
+ @if (!feature.isIllustrationBlurred) { + + } +
+ } + @if (hasCodeSnippetIllustration(feature)) { + }
} - @if (hasCodeSnippetIllustration(feature)) { - - }
} diff --git a/main/src/framework/feature-grid/feature-grid.component.scss b/main/src/framework/feature-grid/feature-grid.component.scss index f355f318b..1f485ac08 100644 --- a/main/src/framework/feature-grid/feature-grid.component.scss +++ b/main/src/framework/feature-grid/feature-grid.component.scss @@ -5,22 +5,64 @@ display: flex; flex-flow: row wrap; overflow: hidden; - margin-top: 0; + margin-top: 28px; padding: 0; } -.fg-grid-item, -.fg-illustration-row { - border: shapes.$border; - border-width: 1px 0 0 1px; - margin: -1px 0 0 -1px; +td-heading-with-highlights { + margin-bottom: 28px; +} + +.fg-grid-row { + display: flex; + flex-direction: row; + width: 100%; + + // Add bottom border to all rows except the last one + &:not(:last-child) { + border-bottom: shapes.$border; + } + + &.grid-row-size-1 .fg-grid-item { + flex-direction: row; + + > * { + flex: 1; + } + } +} + +.fg-grid-item, .fg-illustration-row { + flex: 1; + min-width: 0; +} + +.fg-grid-item { + // Add right border to all cells except the last one in each row + &:not(:last-child) { + border-right: shapes.$border; + } +} + +.fg-grid-item { + display: flex; + flex-direction: column; + gap: 24px; + + @media (max-width: media.$max-width-tablet) { + gap: 16px; + } + + @media (max-width: media.$max-width-mobile) { + gap: 12px; + } } -.fg-grid-item, .fg-grid-item-text { display: flex; flex-direction: column; gap: 24px; + flex: 1; // Allow text section to grow and push illustrations down @media (max-width: media.$max-width-tablet) { gap: 16px; diff --git a/main/src/framework/feature-grid/feature-grid.component.ts b/main/src/framework/feature-grid/feature-grid.component.ts index d6419d146..2d8dd256d 100644 --- a/main/src/framework/feature-grid/feature-grid.component.ts +++ b/main/src/framework/feature-grid/feature-grid.component.ts @@ -1,53 +1,38 @@ -import { isPlatformBrowser } from "@angular/common"; -import { AfterViewInit, ChangeDetectionStrategy, Component, HostBinding, Input, OnInit, inject, PLATFORM_ID } from "@angular/core"; +import { ChangeDetectionStrategy, Component, HostBinding, Input } from "@angular/core"; import { sanitiseHtmlID } from "typedb-web-common/lib"; import { - CodeSnippet, CodeSnippetShort, FeatureGridCell, FeatureGridLayout, GraphVisualisation, Illustration, + CodeSnippet, CodeSnippetShort, FeatureGrid, FeatureGridCell, FeatureGridRow, GraphVisualisation, Illustration, ImageIllustration, PolyglotSnippet, SplitPaneIllustration, TextLink, VideoEmbed, } from "typedb-web-schema"; import { AspectRatioComponent } from "../aspect-ratio/aspect-ratio.component"; +import { SyntaxHighlightDirective } from "../code/syntax-highlight.directive"; import { IllustrationComponent } from "../illustration/illustration.component"; import { LinkDirective } from "../link/link.directive"; import { RichTextComponent } from "../text/rich-text.component"; import { TagChipsComponent } from "./tag-chips.component"; +import { HeadingWithHighlightsComponent } from "../text/text-with-highlights.component"; @Component({ selector: "td-feature-grid", templateUrl: "./feature-grid.component.html", styleUrls: ["./feature-grid.component.scss"], changeDetection: ChangeDetectionStrategy.OnPush, - imports: [TagChipsComponent, RichTextComponent, LinkDirective, AspectRatioComponent, IllustrationComponent] + imports: [TagChipsComponent, RichTextComponent, LinkDirective, AspectRatioComponent, IllustrationComponent, HeadingWithHighlightsComponent, SyntaxHighlightDirective] }) -export class FeatureGridComponent implements OnInit, AfterViewInit { - private readonly platformId = inject(PLATFORM_ID); - @Input() layout!: FeatureGridLayout; - @Input() featureRows!: FeatureGridCell[][]; +export class FeatureGridComponent { + @Input() data!: FeatureGrid; @Input() illustration?: Illustration; @Input() disableCardAppearance = false; @Input({ required: true }) sectionId!: string; - @HostBinding("class") get classes() { - return { - section: !this.disableCardAppearance, - "narrow-section": !this.disableCardAppearance, - ["fg-row-size-" + this.columnIndexes.length]: true, - }; - } - - columnIndexes!: number[]; - - ngOnInit() { - this.columnIndexes = [...Array(this.featureRows[0].length).keys()]; - } - - ngAfterViewInit() { - if (isPlatformBrowser(this.platformId)) { - (window as any)["Prism"].highlightAll(); - } - } + // @HostBinding("class") get classes() { + // return { + // section: !this.disableCardAppearance, + // }; + // } hasMediaIllustration(feature: FeatureGridCell) { return ( diff --git a/main/src/framework/graph-visualisation/graph-visualisation.component.ts b/main/src/framework/graph-visualisation/graph-visualisation.component.ts index 8a61d1f4f..1138d1156 100644 --- a/main/src/framework/graph-visualisation/graph-visualisation.component.ts +++ b/main/src/framework/graph-visualisation/graph-visualisation.component.ts @@ -15,7 +15,7 @@ import * as d3 from "d3-force"; import FontFaceObserver from "fontfaceobserver"; // pixi.js-legacy 7.x causes an issue where dragging stops at the edge of the visualisation, which is not a nice UX // pixi.js (non-legacy) causes an issue where all text is blurred -// import * as PIXI from "pixi.js-legacy"; +import * as PIXI from "pixi.js-legacy"; import { Subscription } from "rxjs"; import { GraphVisualisation } from "typedb-web-schema"; @@ -435,7 +435,7 @@ export function renderGraph( .on("mouseupoutside", () => boundDragEnd(vertex.gfx)) .on("mousemove", () => boundDragMove(vertex.gfx)); vertex.gfx!.interactive = true; - vertex.gfx!.buttonMode = true; + // vertex.gfx!.buttonMode = true; app.stage.addChild(vertex.gfx! as any); }); diff --git a/main/src/framework/illustration/illustration.component.html b/main/src/framework/illustration/illustration.component.html index b4f4601e6..9aeaddb56 100644 --- a/main/src/framework/illustration/illustration.component.html +++ b/main/src/framework/illustration/illustration.component.html @@ -10,9 +10,9 @@ @if (polyglotSnippet) { } - - - +@if (graphVisualisation && visible) { + +} @if (splitPaneIllustration) { } diff --git a/main/src/framework/illustration/illustration.component.ts b/main/src/framework/illustration/illustration.component.ts index 617660494..65f2a36ca 100644 --- a/main/src/framework/illustration/illustration.component.ts +++ b/main/src/framework/illustration/illustration.component.ts @@ -12,7 +12,7 @@ import { MediaQueryService } from "../../service/media-query.service"; import { AspectRatioComponent } from "../aspect-ratio/aspect-ratio.component"; import { CodeSnippetComponent } from "../code/code-snippet.component"; import { PolyglotSnippetComponent } from "../polyglot-snippet/polyglot-snippet.component"; -// import { GraphVisualisationComponent } from "../graph-visualisation/graph-visualisation.component"; +import { GraphVisualisationComponent } from "../graph-visualisation/graph-visualisation.component"; import { RichTextComponent } from "../text/rich-text.component"; @Component({ @@ -21,14 +21,14 @@ import { RichTextComponent } from "../text/rich-text.component"; styleUrls: ["illustration.component.scss"], changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - CodeSnippetComponent, PolyglotSnippetComponent, /*GraphVisualisationComponent,*/ + CodeSnippetComponent, PolyglotSnippetComponent, GraphVisualisationComponent, forwardRef(() => SplitPaneIllustrationComponent) ] }) export class IllustrationComponent { @Input() illustration!: Illustration; // TODO: requiring the caller to set visible explicitly is counter-intuitive - @Input() visible = false; + @Input() visible = true; @Input() @HostBinding("class.il-blur") isBlurred = false; @HostBinding("class.is-code-snippet") diff --git a/main/src/framework/publication-panel/publication-panel.component.html b/main/src/framework/publication-panel/publication-panel.component.html index fb0e7c42f..7775300b7 100644 --- a/main/src/framework/publication-panel/publication-panel.component.html +++ b/main/src/framework/publication-panel/publication-panel.component.html @@ -16,7 +16,7 @@

{{ item.title }}

} @if (isFeatureGrid(item)) { } diff --git a/main/src/framework/text/rich-text.component.scss b/main/src/framework/text/rich-text.component.scss index c32471a3d..7dfaa6f14 100644 --- a/main/src/framework/text/rich-text.component.scss +++ b/main/src/framework/text/rich-text.component.scss @@ -41,22 +41,11 @@ margin-top: -0.1em; } - h3 { - font-size: var(--font-size-h4); - line-height: var(--line-height-h4); - } - - h4 { - font-size: var(--font-size-h5); - line-height: var(--line-height-h5); - } - p, ul, ol { margin: 1em 0 0; } - ul, - ol { + ul, ol { padding-inline-start: 2em; } diff --git a/main/src/page/features/features-page.component.html b/main/src/page/features/features-page.component.html index bd9257134..871d44bda 100644 --- a/main/src/page/features/features-page.component.html +++ b/main/src/page/features/features-page.component.html @@ -1,19 +1,36 @@ -
- @if (page$ | async; as page) { - - - @for (section of page.featureSections; track section; let idx = $index) { - - @for (featureGrid of section.featureGrids; let idx = $index; track idx) { - - } - } +@if (page$ | async; as page) { + + +
+
+ + +
+ @for (section of page.featureSections; track section; let idx = $index) { + + @for (featureGrid of section.featureGrids; let idx = $index; track idx) { + + } + } +
+
+ - } -
- - +
+ +} diff --git a/main/src/page/features/features-page.component.scss b/main/src/page/features/features-page.component.scss index e69de29bb..a0772888e 100644 --- a/main/src/page/features/features-page.component.scss +++ b/main/src/page/features/features-page.component.scss @@ -0,0 +1,96 @@ +@use "media"; +@use "shapes"; + +.features-content-wrapper { + display: grid; + grid-template-columns: 200px 1fr; + gap: 48px; + width: var(--section-width); + max-width: var(--section-max-width); + margin: 0 auto; + padding: 0 var(--body-padding); + margin-top: var(--subsection-margin); + align-items: start; + + @media (max-width: media.$max-width-tablet) { + grid-template-columns: 1fr; + gap: 24px; + } +} + +.features-sidebar { + @media (max-width: media.$max-width-tablet) { + // No special styles needed + } +} + +.features-toc { + position: sticky; + top: 100px; + padding: 0; + align-self: start; + + @media (max-width: media.$max-width-tablet) { + position: static; + } + + .toc-back-to-top { + margin: 0 0 16px 0; + + a { + display: block; + padding: 8px 0; + padding-left: 12px; + color: var(--body-text-color); + text-decoration: none; + transition: color 0.2s ease; + border-left: 2px solid transparent; + + &:hover { + color: var(--color-green); + } + } + } + + ul { + list-style: none; + margin: 0; + padding: 0; + } + + li { + margin: 0; + } + + a { + display: block; + padding: 8px 0; + padding-left: 12px; + color: var(--body-text-color); + text-decoration: none; + transition: color 0.2s ease; + border-left: 2px solid transparent; + + @media (max-width: media.$max-width-mobile) { + padding: 6px 0 6px 12px; + } + + &:hover { + color: var(--color-green); + } + + &.td-active { + color: var(--color-green); + border-left-color: var(--color-green); + } + } +} + +.features-main-content { + flex: 1; + min-width: 0; +} + +td-feature-grid + td-section-core { + margin-top: var(--section-margin); +} diff --git a/main/src/page/features/features-page.component.ts b/main/src/page/features/features-page.component.ts index b28728768..206a45f57 100644 --- a/main/src/page/features/features-page.component.ts +++ b/main/src/page/features/features-page.component.ts @@ -2,13 +2,13 @@ import { AsyncPipe, Location } from "@angular/common"; import { ChangeDetectionStrategy, Component, inject } from "@angular/core"; import { of, tap } from "rxjs"; import { FeaturesPage, featuresPageSchemaName, Link, SanityDataset, SanityFeaturesPage } from "typedb-web-schema"; -import { BackToTopButtonComponent } from "../../framework/back-to-top/back-to-top-button.component"; import { ConclusionPanelComponent } from "../../framework/conclusion-panel/conclusion-panel.component"; import { FeatureGridComponent } from "../../framework/feature-grid/feature-grid.component"; import { IllustrationSectionComponent } from "../../framework/section/illustration/illustration-section.component"; import { SectionCoreComponent } from "../../framework/section/section-core.component"; +import { SmoothScrollDirective } from "../../framework/smooth-scroll/smooth-scroll.directive"; import { PageComponentBase } from "../page-component-base"; -import { FeaturesNavbarComponent, FeaturesNavbarItem } from "./features-navbar.component"; +import { FeaturesNavbarItem } from "./features-navbar.component"; @Component({ selector: "td-features-page", @@ -17,7 +17,7 @@ import { FeaturesNavbarComponent, FeaturesNavbarItem } from "./features-navbar.c changeDetection: ChangeDetectionStrategy.OnPush, imports: [ FeatureGridComponent, ConclusionPanelComponent, AsyncPipe, SectionCoreComponent, IllustrationSectionComponent, - FeaturesNavbarComponent, BackToTopButtonComponent, + SmoothScrollDirective, ], }) export class FeaturesPageComponent extends PageComponentBase { diff --git a/main/src/styles/styles.scss b/main/src/styles/styles.scss index 0a9d47ed2..ab8b457e1 100644 --- a/main/src/styles/styles.scss +++ b/main/src/styles/styles.scss @@ -348,11 +348,6 @@ table { } } -td-feature-grid + td-feature-grid { - display: block; - border-top: 1px solid var(--content-border-color); -} - mat-dialog-container { h1 { font-size: var(--font-size-h3); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9eb9091d8..dafef456b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,6 +117,9 @@ importers: ngx-cookieconsent: specifier: 4.0.2 version: 4.0.2(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.1)(zone.js@0.15.1))(rxjs@7.8.1))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.1)(zone.js@0.15.1))(cookieconsent@3.1.1)(rxjs@7.8.1) + pixi.js-legacy: + specifier: 7.4.3 + version: 7.4.3(d1d99e8ae917814d844dec1222a79cec) posthog-js: specifier: 1.268.8 version: 1.268.8 @@ -2542,6 +2545,276 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} + '@pixi/accessibility@7.4.3': + resolution: {integrity: sha512-tCr0yeWpMe0yucFvEPidy5a7gVJGpTjqGrDpSEBYT/kbScfUwcoX49RrckCCCiXDlyO4WRh9lVVuHXTvqRLIMg==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/events': 7.4.3 + + '@pixi/app@7.4.3': + resolution: {integrity: sha512-opyWMuO0Ir8pf1DYUR++wAA6ZfNU+nIX2z95R2OD172HbcdhB4/HD7leLIIAny/LciEdMqlWEBhXK7N93YWbdg==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/assets@7.4.3': + resolution: {integrity: sha512-StvjiJBSp/j9hHkGu8AFHNvwYUazXq64WhyhytztyDMRkg/l/cL7EcttY5T0qZNWlIpccdr60LUKrWDOuMpkiw==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/canvas-display@7.4.3': + resolution: {integrity: sha512-Y33a6DL2s6RFIPKfC1tCw8eimVnaQVrzhOUgSZ03jE5B2pC7FwcOIZ64sDi2VpVToXMl2f5EgkgtEXYkWjTYHg==} + peerDependencies: + '@pixi/display': 7.4.3 + + '@pixi/canvas-extract@7.4.3': + resolution: {integrity: sha512-sSpIf1C7nlEO22sW/bcVPZzUJyyh+4QcekhwzyYVbr1LVz0zk1WPOXu82MgiRxaHkyCfWdxes7drKQ2XHYk3eA==} + peerDependencies: + '@pixi/canvas-renderer': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/extract': 7.4.3 + + '@pixi/canvas-graphics@7.4.3': + resolution: {integrity: sha512-E3kizZDI6m8WZg1AeHryanEhVGqMVsu75NZIwWu6mWkjHqGqvj/vG17Ua0jl9ThSFfPc4Y/xI9eAewni12IG8A==} + peerDependencies: + '@pixi/canvas-display': 7.4.3 + '@pixi/canvas-renderer': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/graphics': 7.4.3 + + '@pixi/canvas-mesh@7.4.3': + resolution: {integrity: sha512-0yBalm1bRIfozdbuOqRcCWYN4XxxsDLcBA0NjpPFQn8LKImUpYxPayGbraxfIu8kF+z5rFubk5JiAGZc5UHorw==} + peerDependencies: + '@pixi/canvas-display': 7.4.3 + '@pixi/canvas-renderer': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/mesh': 7.4.3 + '@pixi/mesh-extras': 7.4.3 + + '@pixi/canvas-particle-container@7.4.3': + resolution: {integrity: sha512-0gBIt2q8NtX9ZrHiY371AVM2Vmip1azQEy1ruOXq3b2PZgIaegZT7eAQ0997ljynheXWf3DBY/9Z6m3ejoV3jw==} + peerDependencies: + '@pixi/particle-container': 7.4.3 + + '@pixi/canvas-prepare@7.4.3': + resolution: {integrity: sha512-ATCvDO9sMpteZl4LvZkFlOjCAAwa2i756oXQBDWiAEF/WkkyZ4y2O3CX4w5oYg+9G+S8b1iEDfKLcWr4HHk9yA==} + peerDependencies: + '@pixi/canvas-renderer': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/prepare': 7.4.3 + + '@pixi/canvas-renderer@7.4.3': + resolution: {integrity: sha512-mZnx/tUaNlREh6Yn/z54g0NRvLEdlWIgA5qioeZbJA2HeG+zKEio7hUEOsNIu2o6xzliUoFGzFr7jaS+m7onfg==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/canvas-sprite-tiling@7.4.3': + resolution: {integrity: sha512-o8PVghNynaFr2bVcxFj1TB6BrnK27yHDLyHaBhw67cijl0Fjf1uSy5ywVTDCP9ihcK3vadY65tKhQNytuu7uFA==} + peerDependencies: + '@pixi/canvas-renderer': 7.4.3 + '@pixi/canvas-sprite': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/sprite-tiling': 7.4.3 + + '@pixi/canvas-sprite@7.4.3': + resolution: {integrity: sha512-Qr17o6AgDihXJGg+lZr8HV5mhvWW46v/+15AY7TFQhJytPv32Y6tJMfojVWquOpzREczMqryun1K5vJpAuinQA==} + peerDependencies: + '@pixi/canvas-display': 7.4.3 + '@pixi/canvas-renderer': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/canvas-text@7.4.3': + resolution: {integrity: sha512-tbh4+k3Q0rEAhK42KvDhrEA6qSU1rFT4Y/Nj3kvK2QOqO6m+LwkbFPFnoSVRvN6jGJ+wA3RZG1LKS0kxAxoxTA==} + peerDependencies: + '@pixi/canvas-sprite': 7.4.3 + '@pixi/sprite': 7.4.3 + '@pixi/text': 7.4.3 + + '@pixi/color@7.4.3': + resolution: {integrity: sha512-a6R+bXKeXMDcRmjYQoBIK+v2EYqxSX49wcjAY579EYM/WrFKS98nSees6lqVUcLKrcQh2DT9srJHX7XMny3voQ==} + + '@pixi/colord@2.9.6': + resolution: {integrity: sha512-nezytU2pw587fQstUu1AsJZDVEynjskwOL+kibwcdxsMBFqPsFFNA7xl0ii/gXuDi6M0xj3mfRJj8pBSc2jCfA==} + + '@pixi/compressed-textures@7.4.3': + resolution: {integrity: sha512-uJ3CC+lNX4HIxs6IxEESO50/0A1KxSVm6CO9UlkXzTsNj9ynmdy5BkJ1dzii7LCdqGcHIXHO01yvKuUbJBBQtw==} + peerDependencies: + '@pixi/assets': 7.4.3 + '@pixi/core': 7.4.3 + + '@pixi/constants@7.4.3': + resolution: {integrity: sha512-QGmwJUNQy/vVEHzL6VGQvnwawLZ1wceZMI8HwJAT4/I2uAzbBeFDdmCS8WsTpSWLZjF/DszDc1D8BFp4pVJ5UQ==} + + '@pixi/core@7.4.3': + resolution: {integrity: sha512-5YDs11faWgVVTL8VZtLU05/Fl47vaP5Tnsbf+y/WRR0VSW3KhRRGTBU1J3Gdc2xEWbJhUK07KGP7eSZpvtPVgA==} + + '@pixi/display@7.4.3': + resolution: {integrity: sha512-b5m2dAaoNAVdxz1oDaxl3XZ059NEOcNtGkxTOZ4EYCw/jcp9sZXkgSROHRzsGn4k+NugH7+9MP4Id2Z0kkdUhw==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/events@7.4.3': + resolution: {integrity: sha512-o3j/5Dxq6WDVS6eHfURB/cf/MP+NcsF/eC5PnbSHjXxJmDE7PoTVwLvxexm5uuvNRpFh/6/Fn0V8Vl4gV8sc8w==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/extensions@7.4.3': + resolution: {integrity: sha512-FhoiYkHQEDYHUE7wXhqfsTRz6KxLXjuMbSiAwnLb9uG1vAgp6q6qd6HEsf4X30YaZbLFY8a4KY6hFZWjF+4Fdw==} + + '@pixi/extract@7.4.3': + resolution: {integrity: sha512-HNvGNrEVaeVsbcnIO1MsHpjZbTwo9nIlaOEBzDGcL6JWwzuB1RnzUke7WUCndCUt91sGUdvPnvgCvy9/NNFg3w==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-alpha@7.4.3': + resolution: {integrity: sha512-YFdUB1I53USQb+9TEhS849dV2KZhbnNGIoBbOSThUJfXQc4pDguIFWMagVToAQYgmZ4C4AtYfVjaSEELrMcCdA==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-blur@7.4.3': + resolution: {integrity: sha512-ZFzS9L/whdRbs5A/EUgF3yQaBcxNarmbuwaMgrfnpQ84mRczkGByqDLGToadiufyals07ufTrXBGRle9lbtEDA==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-color-matrix@7.4.3': + resolution: {integrity: sha512-TNu0h20SrzjUWIb5v19dAp1vPpqtG0w2XF9kIHN91bMNaf3R1jzhpWG6TtaVO9eo1IolWcEJLw38jIohyC+KNw==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-displacement@7.4.3': + resolution: {integrity: sha512-ax+cFA2mEnKgqf9F8qInpv09GNWzjwnASLETpwPXzWBtlAlNCeHV2tCv3+SlMdEKUkwG9sA7AmjjjC2JBUyt+Q==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-fxaa@7.4.3': + resolution: {integrity: sha512-y9jhho5cCflhEsPtNqqsd+XJHsb+/ysht4rG/VHQ8Z6pScHYpbgiEpowryGq8uSMQQwx6zKNS2DPiXdiOHPZsg==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-noise@7.4.3': + resolution: {integrity: sha512-rwgSO3BKe1jW/P5CaOcfLKjfpl674aBEo/igi/3QLxA3ORhILNqWRsKkOwP8xF/ejI5NE4rMEkdv0LScbdGFhA==} + peerDependencies: + '@pixi/core': 7.4.3 + + '@pixi/graphics@7.4.3': + resolution: {integrity: sha512-wWLivD8/URb8A7X4TqCZGG39C91IE+aOuWY/z9NCz5Z6WvA/VWnsc5fLTlO+ggjGHgKF0cSucCXZfUe1wm0AOQ==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/math@7.4.3': + resolution: {integrity: sha512-/uJOVhR2DOZ+zgdI6Bs/CwcXT4bNRKsS+TqX3ekRIxPCwaLra+Qdm7aDxT5cTToDzdxbKL5+rwiLu3Y1egILDw==} + + '@pixi/mesh-extras@7.4.3': + resolution: {integrity: sha512-EqpxpVZoTObyupxMSzuUsCGmWPQioW84n9EO9Ajawkk/HYA+qKFZ5viKiEThIUBYgv4Apn/7c0U3Feg7Ez4uQQ==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/mesh': 7.4.3 + + '@pixi/mesh@7.4.3': + resolution: {integrity: sha512-CikqFPtKvU3Zj986/MSoC8X39CWv5CEpiEW/tYp47p4tgQNDSkNWYnDiNYgb+4VX6pNsBrgX4DALLdTR17SlSA==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/mixin-cache-as-bitmap@7.4.3': + resolution: {integrity: sha512-NgvDdgSgd2tfcTSc+SWF12JJjVVz5ZrkSlhX0idSp/LSako82AiFJlD2xqH9GUsEcA6sqBBlnu7nrGkPTHQdhA==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/mixin-get-child-by-name@7.4.3': + resolution: {integrity: sha512-HLhDxHwafQT+CxbqQx9w9ivJIyAOg9JJ/6m4fNymVuDWeuMGcxDxBD7DukdUYIieT+RD/RlxdPEmq8YoromlFA==} + peerDependencies: + '@pixi/display': 7.4.3 + + '@pixi/mixin-get-global-position@7.4.3': + resolution: {integrity: sha512-k09kvkS379EypCIWgXMY7uiXtWk1BsaJyTYlV16Co0AsmNPdFd+wUozMx1xV6rxcGiWXsxr/1k9fbETuYkcXCQ==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/particle-container@7.4.3': + resolution: {integrity: sha512-0DfJF5C0XTfuI2FsLYvMKCOtqWjXWGOWfA6m4l0W/Ke/qw5zKIOEhgjPLw4qNRtOhmEfkVKJUGp66Ap/ya2YzA==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/prepare@7.4.3': + resolution: {integrity: sha512-OjJHGKXPzwP5OLKxBnTBnKMOktHynLvO0TQPqTYgNtmGQzY109mypCqM4M+s/V+uYmBo/T+sXvBahj98q/f1tA==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/graphics': 7.4.3 + '@pixi/text': 7.4.3 + + '@pixi/runner@7.4.3': + resolution: {integrity: sha512-TJyfp7y23u5vvRAyYhVSa7ytq0PdKSvPLXu4G3meoFh1oxTLHH6g/RIzLuxUAThPG2z7ftthuW3qWq6dRV+dhw==} + + '@pixi/settings@7.4.3': + resolution: {integrity: sha512-SmGK8smc0PxRB9nr0UJioEtE9hl4gvj9OedCvZx3bxBwA3omA5BmP3CyhQfN8XJ29+o2OUL01r3zAPVol4l4lA==} + + '@pixi/sprite-animated@7.4.3': + resolution: {integrity: sha512-mw5YIec8KfO1Jv9qrDNvGoD7Dlmcgww5YlMtd+ARi7Zzo+6ziNw899LXtoaKX1+3BXdZbYNyJAx3C5r30NtwXA==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/sprite-tiling@7.4.3': + resolution: {integrity: sha512-kUa9cEcMsGXSIZoXA7LhW4oo0eWa30w0KYd7mZ0bqalBMfOcvsGZMN701Lc5lpE8URw+8yu5bnyGLbrxhWBTuw==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/sprite@7.4.3': + resolution: {integrity: sha512-iNBrpOFF9nXDT6m2jcyYy6l/sRzklLDDck1eFHprHZwvNquY2nzRfh+RGBCecxhBcijiLJ3fsZN33fP0LDXkvw==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + + '@pixi/spritesheet@7.4.3': + resolution: {integrity: sha512-Ce4xZzUxUSKfiROUjjVCBYNLuCcDEWKJ822bSV9rkgVHItu3q04VnEww0DXO+9K0hKv4Ukjjk8aP6Pz0LgPm7A==} + peerDependencies: + '@pixi/assets': 7.4.3 + '@pixi/core': 7.4.3 + + '@pixi/text-bitmap@7.4.3': + resolution: {integrity: sha512-TnBocJm7f5nMAYwYcsojc62uCrOYauAGH26o3pNrlqmHDRDQ7FzPOGvkYZGYFREbUycloLSRlYpSy0FB9ZdV4Q==} + peerDependencies: + '@pixi/assets': 7.4.3 + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/mesh': 7.4.3 + '@pixi/text': 7.4.3 + + '@pixi/text-html@7.4.3': + resolution: {integrity: sha512-nm9K9gjSZAU8ETwQZBE3kMGNdO1IzyghxoRTcJCWKhekiGDpUQhopfNhqieNZ7reVJpvhpFQWjbyaHDehndUaQ==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3 + '@pixi/sprite': 7.4.3 + '@pixi/text': 7.4.3 + + '@pixi/text@7.4.3': + resolution: {integrity: sha512-IAF0iu04rPg3oiL0HZsEZI44fpJxq3UZ4xTmx8l1RyhhSXiElLvvSlSH57vt/BKMQZtCs+AqEit7yn8heK2+nQ==} + peerDependencies: + '@pixi/core': 7.4.3 + '@pixi/sprite': 7.4.3 + + '@pixi/ticker@7.4.3': + resolution: {integrity: sha512-tHsAD0iOUb6QSGGw+c8cyRBvxsq/NlfzIFBZLEHhWZ+Bx4a0MmXup6I/yJDGmyPCYE+ctCcAfY13wKAzdiVFgQ==} + + '@pixi/utils@7.4.3': + resolution: {integrity: sha512-NO3Y9HAn2UKS1YdxffqsPp+kDpVm8XWvkZcS/E+rBzY9VTLnNOI7cawSRm+dacdET3a8Jad3aDKEDZ0HmAqAFA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -3781,9 +4054,15 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/css-font-loading-module@0.0.12': + resolution: {integrity: sha512-x2tZZYkSxXqWvTDgveSynfjq/T2HyiZHXb00j/+gy19yp70PHCizM48XFdjBCWH7eHBD0R5i/pw9yMBP/BH5uA==} + '@types/d3-force@3.0.4': resolution: {integrity: sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==} + '@types/earcut@2.1.4': + resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} @@ -4663,6 +4942,9 @@ packages: duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -4801,6 +5083,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -5396,6 +5681,9 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} + ismobilejs@1.1.1: + resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} + isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -6190,6 +6478,12 @@ packages: resolution: {integrity: sha512-9rPDIPsCwOivatEZGM8+apgM7AiTDLSnpwMmLaSmdm2PeND8bFJzZLZZxyrJjLH8Xx/MpKoVaKf+vZOWALNHbw==} engines: {node: '>=20.x'} + pixi.js-legacy@7.4.3: + resolution: {integrity: sha512-vFw/CSk05C4eSOtELeXY8cizjoEx444MW4o7xdwcu6Rxw3UJioJXccp6Vkchvb46xVd+v51pVL6KDpcMAsGa+g==} + + pixi.js@7.4.3: + resolution: {integrity: sha512-uIWdH0EI2dVgNoqN9aFaHCmR0V65OEhMkXs2sek3c/QP2ItV6UoM+ouX9esSv3ibo20F+J5D1XwnQhUZI6wqeQ==} + pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} @@ -6314,6 +6608,9 @@ packages: pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -7233,6 +7530,10 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + urlpattern-polyfill@10.1.0: resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} @@ -10110,6 +10411,256 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.1 optional: true + '@pixi/accessibility@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/events@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/events': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/app@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/assets@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + '@types/css-font-loading-module': 0.0.12 + + '@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/canvas-extract@7.4.3(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/extract@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/extract': 7.4.3(@pixi/core@7.4.3) + + '@pixi/canvas-graphics@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/canvas-display': 7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/graphics': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/canvas-mesh@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/mesh-extras@7.4.3(@pixi/core@7.4.3)(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/canvas-display': 7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/mesh': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/mesh-extras': 7.4.3(@pixi/core@7.4.3)(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/canvas-particle-container@7.4.3(@pixi/particle-container@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/particle-container': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/canvas-prepare@7.4.3(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/prepare@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))))': + dependencies: + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/prepare': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + + '@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/canvas-sprite-tiling@7.4.3(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/canvas-sprite@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/core@7.4.3)(@pixi/sprite-tiling@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/canvas-sprite': 7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/core': 7.4.3 + '@pixi/sprite-tiling': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/canvas-sprite@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/canvas-display': 7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/canvas-text@7.4.3(@pixi/canvas-sprite@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/canvas-sprite': 7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/text': 7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/color@7.4.3': + dependencies: + '@pixi/colord': 2.9.6 + + '@pixi/colord@2.9.6': {} + + '@pixi/compressed-textures@7.4.3(@pixi/assets@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)': + dependencies: + '@pixi/assets': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + + '@pixi/constants@7.4.3': {} + + '@pixi/core@7.4.3': + dependencies: + '@pixi/color': 7.4.3 + '@pixi/constants': 7.4.3 + '@pixi/extensions': 7.4.3 + '@pixi/math': 7.4.3 + '@pixi/runner': 7.4.3 + '@pixi/settings': 7.4.3 + '@pixi/ticker': 7.4.3 + '@pixi/utils': 7.4.3 + + '@pixi/display@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/events@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/extensions@7.4.3': {} + + '@pixi/extract@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-alpha@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-blur@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-color-matrix@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-displacement@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-fxaa@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/filter-noise@7.4.3(@pixi/core@7.4.3)': + dependencies: + '@pixi/core': 7.4.3 + + '@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/math@7.4.3': {} + + '@pixi/mesh-extras@7.4.3(@pixi/core@7.4.3)(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/mesh': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/mixin-cache-as-bitmap@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/mixin-get-child-by-name@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/mixin-get-global-position@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/particle-container@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/prepare@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/graphics': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/text': 7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/runner@7.4.3': {} + + '@pixi/settings@7.4.3': + dependencies: + '@pixi/constants': 7.4.3 + '@types/css-font-loading-module': 0.0.12 + ismobilejs: 1.1.1 + + '@pixi/sprite-animated@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/sprite-tiling@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + + '@pixi/spritesheet@7.4.3(@pixi/assets@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)': + dependencies: + '@pixi/assets': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + + '@pixi/text-bitmap@7.4.3(@pixi/assets@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/assets': 7.4.3(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/mesh': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/text': 7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/text-html@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/text': 7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + + '@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))': + dependencies: + '@pixi/core': 7.4.3 + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + + '@pixi/ticker@7.4.3': + dependencies: + '@pixi/extensions': 7.4.3 + '@pixi/settings': 7.4.3 + '@pixi/utils': 7.4.3 + + '@pixi/utils@7.4.3': + dependencies: + '@pixi/color': 7.4.3 + '@pixi/constants': 7.4.3 + '@pixi/settings': 7.4.3 + '@types/earcut': 2.1.4 + earcut: 2.2.4 + eventemitter3: 4.0.7 + url: 0.11.4 + '@pkgjs/parseargs@0.11.0': optional: true @@ -11715,8 +12266,12 @@ snapshots: dependencies: '@types/node': 18.19.123 + '@types/css-font-loading-module@0.0.12': {} + '@types/d3-force@3.0.4': {} + '@types/earcut@2.1.4': {} + '@types/estree@1.0.7': {} '@types/estree@1.0.8': {} @@ -12643,6 +13198,8 @@ snapshots: readable-stream: 3.6.2 stream-shift: 1.0.3 + earcut@2.2.4: {} + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -12818,6 +13375,8 @@ snapshots: event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} events@3.3.0: {} @@ -13421,6 +13980,8 @@ snapshots: isexe@3.1.1: {} + ismobilejs@1.1.1: {} + isobject@3.0.1: {} isomorphic-dompurify@2.26.0: @@ -14287,6 +14848,65 @@ snapshots: optionalDependencies: '@napi-rs/nice': 1.1.1 + pixi.js-legacy@7.4.3(d1d99e8ae917814d844dec1222a79cec): + dependencies: + '@pixi/canvas-display': 7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/canvas-extract': 7.4.3(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/extract@7.4.3(@pixi/core@7.4.3)) + '@pixi/canvas-graphics': 7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + '@pixi/canvas-mesh': 7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/mesh-extras@7.4.3(@pixi/core@7.4.3)(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/canvas-particle-container': 7.4.3(@pixi/particle-container@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + '@pixi/canvas-prepare': 7.4.3(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/prepare@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))) + '@pixi/canvas-renderer': 7.4.3(@pixi/core@7.4.3) + '@pixi/canvas-sprite': 7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/canvas-sprite-tiling': 7.4.3(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/canvas-sprite@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/core@7.4.3)(@pixi/sprite-tiling@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + '@pixi/canvas-text': 7.4.3(@pixi/canvas-sprite@7.4.3(@pixi/canvas-display@7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/canvas-renderer@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + pixi.js: 7.4.3 + transitivePeerDependencies: + - '@pixi/core' + - '@pixi/display' + - '@pixi/extract' + - '@pixi/graphics' + - '@pixi/mesh' + - '@pixi/mesh-extras' + - '@pixi/particle-container' + - '@pixi/prepare' + - '@pixi/sprite' + - '@pixi/sprite-tiling' + - '@pixi/text' + + pixi.js@7.4.3: + dependencies: + '@pixi/accessibility': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/events@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/app': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/assets': 7.4.3(@pixi/core@7.4.3) + '@pixi/compressed-textures': 7.4.3(@pixi/assets@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3) + '@pixi/core': 7.4.3 + '@pixi/display': 7.4.3(@pixi/core@7.4.3) + '@pixi/events': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/extensions': 7.4.3 + '@pixi/extract': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-alpha': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-blur': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-color-matrix': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-displacement': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-fxaa': 7.4.3(@pixi/core@7.4.3) + '@pixi/filter-noise': 7.4.3(@pixi/core@7.4.3) + '@pixi/graphics': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/mesh': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/mesh-extras': 7.4.3(@pixi/core@7.4.3)(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/mixin-cache-as-bitmap': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/mixin-get-child-by-name': 7.4.3(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/mixin-get-global-position': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/particle-container': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/prepare': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/graphics@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + '@pixi/sprite': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)) + '@pixi/sprite-animated': 7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/sprite-tiling': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/spritesheet': 7.4.3(@pixi/assets@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3) + '@pixi/text': 7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))) + '@pixi/text-bitmap': 7.4.3(@pixi/assets@7.4.3(@pixi/core@7.4.3))(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/mesh@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + '@pixi/text-html': 7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3))(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))(@pixi/text@7.4.3(@pixi/core@7.4.3)(@pixi/sprite@7.4.3(@pixi/core@7.4.3)(@pixi/display@7.4.3(@pixi/core@7.4.3)))) + pkg-dir@3.0.0: dependencies: find-up: 3.0.0 @@ -14422,6 +15042,8 @@ snapshots: inherits: 2.0.4 pump: 2.0.1 + punycode@1.4.1: {} + punycode@2.3.1: {} qs@6.13.0: @@ -15615,6 +16237,11 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + url@0.11.4: + dependencies: + punycode: 1.4.1 + qs: 6.13.0 + urlpattern-polyfill@10.1.0: {} use-callback-ref@1.3.3(@types/react@18.3.23)(react@18.3.1): diff --git a/sanity/sanity.config.ts b/sanity/sanity.config.ts index 65add901d..72fb0f513 100644 --- a/sanity/sanity.config.ts +++ b/sanity/sanity.config.ts @@ -81,7 +81,7 @@ export default defineConfig({ s.documentTypeListItem(cloudProviderSchemaName).title("Provider & Region Info"), singletonListItem(s, cloudAnnouncementSchemaName, { title: "Announcement", icon: ConfettiIcon }), ])), - s.listItem().title("Learning Resources & Events").icon(BookIcon).child(s.list().title("Learning Resources & Events").items([ + s.listItem().title("Blogs, Resources & Events").icon(BookIcon).child(s.list().title("Blogs, Resources & Events").items([ s.documentTypeListItem(fundamentalArticleSchemaName).title("Fundamentals"), s.documentTypeListItem(applicationArticleSchemaName).title("Applications"), s.documentTypeListItem(blogPostSchemaName).title("Blog Posts"), @@ -90,9 +90,6 @@ export default defineConfig({ s.documentTypeListItem(liveEventSchemaName).title("Live Events"), s.documentTypeListItem(genericResourceSchemaName).title("Generic Resources"), ])), - s.listItem().title("Structure").icon(ComponentIcon).child(s.list().title("Structure").items([ - s.documentTypeListItem(featureGridSchemaName).title("Feature Grids"), - ])), s.listItem().title("Code Snippets").icon(CodeIcon).child(s.list().title("Code Snippets").items([ s.documentTypeListItem(codeSnippetSchemaName).title("Single Snippets"), s.documentTypeListItem(polyglotSnippetSchemaName).title("Polyglot Snippets"), @@ -105,6 +102,7 @@ export default defineConfig({ ])), s.documentTypeListItem(linkSchemaName).title("Links"), s.listItem().title("Objects").icon(CubeIcon).child(s.list().title("Objects").items([ + s.documentTypeListItem(featureGridSchemaName).title("Feature Grids"), s.documentTypeListItem(personSchemaName).title("People"), s.documentTypeListItem(organisationSchemaName).title("Organisations"), s.documentTypeListItem(testimonialSchemaName).title("Testimonials"), diff --git a/schema/AGENTS.md b/schema/AGENTS.md new file mode 100644 index 000000000..b57c2c9de --- /dev/null +++ b/schema/AGENTS.md @@ -0,0 +1,236 @@ +## Your role + +You are a principal-level TypeScript and React engineer who writes best-practice, high performance code. You are also an expert on structured content modelling. + +## Sanity Studio Schema Types + +### Content modelling + +Unless explicitly modelling web pages or app views, model content that describes what things are, not what they look like: + +- Good examples describe what things are: `status`, `tone`, `visibility`, `role` +- Bad examples describe what things look like: `color`, `font-size`, `border-radius` + +### Basic schema types + +- ALWAYS use the `defineType`, `defineField`, and `defineArrayMember` helper functions +- ALWAYS write schema types to their own files and export a named `const` that matches the filename +- ONLY use a `name` attribute in fields unless the `title` needs to be something other than a title-case version of the `name` +- ANY `string` field type with an `options.list` array with fewer than 5 options must use `options.layout: "radio"` +- ANY `image` field must include `options.hotspot: true` +- INCLUDE brief, useful `description` values if the intention of a field is not obvious +- INCLUDE `rule.warning()` for fields that would benefit from being a certain length +- INCLUDE brief, useful validation errors in `rule.required().error('')` that signal why the field must be correct before publishing is allowed +- AVOID `boolean` fields, write a `string` field with an `options.list` configuration +- ONLY use a single reference when there is no possibility that more than one value will be required: examples include `city`, `country` +- ALWAYS use an array of references when there is any possibility more than one value will be required: examples include `authors`, `categories` +- CONSIDER the order of fields, from most important and relevant first, to least often used last + +```ts +// ./src/schemaTypes/lessonType.ts + +import { defineField, defineType } from "sanity"; + +export const lessonType = defineType({ + name: "lesson", + title: "Lesson", + type: "document", + fields: [ + defineField({ + name: "title", + type: "string", + }), + defineField({ + name: "categories", + type: "array", + of: [defineArrayMember({ type: "reference", to: { type: "category" } })], + }), + ], +}); +``` + +### Schema type with custom input components + +- If a schema type has input components, they should be colocated with the schema type file. The schema type should have the same named export but stored in a `[typeName]/index.ts` file: + +```ts +// ./src/schemaTypes/seoType/index.ts + +import { defineField, defineType } from "sanity"; + +import seoInput from "./seoInput"; + +export const seoType = defineType({ + name: "seo", + title: "SEO", + type: "object", + components: { input: seoInput }, + // ... +}); +``` + +### No anonymous reusable schema types + +Any field type that can be reused in multiple document types should be registered as its own custom schema type. + +```ts +// ./src/schemaTypes/blockContentType.ts + +import { defineField, defineType } from "sanity"; + +export const blockContentType = defineType({ + name: "blockContent", + title: "Block content", + type: "array", + of: [defineField({ name: "block", type: "block" })], +}); +``` + +### Decorating schema types + +Every `document` and `object` schema type should: + +- Have an `icon` property from `@sanity/icons` +- Have a customized `preview` property that shows rich contextual details about the document +- Use `groups` when the schema type has more than a few fields to collate related fields and only show the most important group by default. These `groups` should use the icon property as well. +- Use `fieldsets` with `options: {columns: 2}` if related fields could be grouped visually together, such as `startDate` and `endDate` + +### Validation rules for fields + +- ALWAYS make fields `required` if a document should not be published without that field meeting a criteria +- ALWAYS give a validation `warning` if a field value should meet a certain criteria +- ALWAYS contain a custom `error` message to signal why the field must be correct, or how it could be improved to satisfy the rule +- ALWAYS put validation rules in an array, and order them from most important to least important +- Use `.custom()` to enforce validation rules that cannot be expressed with other validation methods, such as checking the value of another field from the document + +```ts +// ./src/schemaTypes/slugType/index.ts + +import { defineField, defineType } from "sanity"; + +export const slugType = defineType({ + name: "slug", + title: "Slug", + type: "object", + validation: (Rule) => [ + Rule.custom((value, context) => + value?.current && value?.current.length > 100 + ? "Slug cannot be longer than 100 characters" + : true + ), + Rule.required().error("Required to generate a URL"), + ], + // ... +}); +``` + +### Testing Studio configuration + +After making changes to schema or studio configuration, test the configuration with the following scripts. Always run all three scripts after making changes. + +Add these scripts to `package.json` to test the Studio configuration: + +```json +// package.json +{ + // existing configuration... + "scripts": { + // existing scripts... + "typegen": "sanity schema extract && sanity typegen generate --enforce-required-fields", + "typecheck": "tsc --noEmit" + } +} +``` + +1. Ensure TypeScript can compile with `npm run typecheck` +2. Ensure schema types are valid for export with `npm run typegen` +3. Ensure the Studio can be built with `npm run build` + +## Writing Sanity content + +### Write using Sanity MCP Server + +- ALWAYS use the [Sanity MCP Server](https://mcp.sanity.io) if available use to query and create content + +### Write and import using Sanity CLI + +If you do not have the Sanity MCP server installed: + +- ONLY use the existing schema types registered in the Studio configuration +- ALWAYS write content as an `.ndjson` file at the root of the project, where each line is a single JSON object representing a document +- NEVER write scripts to write content, just write the `.ndjson` file +- IMPORT `.ndjson` files using the CLI command `npx sanity dataset import ` +- NEVER include a `.` in the `_id` field of a document unless you need the document to be private +- NEVER include image references if you do not know which image documents exist +- ALWAYS if the full URL of an image or file is known, use it in the `_sanityAsset` field, for example: + +```JSON +{"_type":"image","_sanityAsset":"image@https://{url-to-image}"} +{"_type":"file","_sanityAsset":"file@https://{url-to-file}"} +``` + +## Writing GROQ queries + +- ALWAYS use `SCREAMING_SNAKE_CASE` for variable names, for example `POSTS_QUERY` +- ALWAYS import the `defineQuery` function to wrap query strings from the `groq` or `next-sanity` package +- ALWAYS write every required attribute in a projection when writing a query + -- DO NOT use the `...` operator to project all attributes +- ALWAYS put each segment in a filter, and each attribute in a projection its own line +- ALWAYS use parameters for variables in a query + -- DO NOT insert dynamic values using string interpolation + +```ts +// ✅ Good GROQ query example +import { defineQuery } from "groq"; + +export const POST_QUERY = defineQuery(`*[ + _type == "post" + && slug.current == $slug +][0]{ + _id, + title, + image, + author->{ + _id, + name + } +}`); +``` + +## TypeScript generation + +### For monorepos with a studio and a front-end + +- ALWAYS use a simple pnpm workspace configuration to place the studio in `apps/studio` + +``` +your-project/ +└── apps/ + ├── studio/ -> Sanity Studio + └── web/ -> Front-end +``` + +- ALWAYS extract the schema to the web folder with `npx sanity@latest schema extract --path=..//sanity/extract.json` +- ALWAYS generate types with `npx sanity@latest typegen generate` after every GROQ query change +- ALWAYS create a TypeGen configuration file: + +```json +// apps/studio/sanity-typegen.json +{ + "path": "./**/*.{ts,tsx,js,jsx}", + "schema": ".//sanity/extract.json", + "generates": ".//sanity/types.ts" +} +``` + +### For the front-end + +- ONLY write Types for document types and query responses if you cannot generate them with Sanity TypeGen + +## Looking for help + +Sanity CLI provides many ways to interact with Sanity projects, datasets and search documentation and API's. + +- To understand Sanity product features search the documentation with `npx sanity docs search ""` +- To see available OpenAPI endpoints for a project, run `npx sanity openapi list` +- To see available CLI commands, run `npx sanity --help` diff --git a/schema/CLAUDE.md b/schema/CLAUDE.md new file mode 100644 index 000000000..43c994c2d --- /dev/null +++ b/schema/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/schema/component/feature-grid.ts b/schema/component/feature-grid.ts index 7336c70c8..073837cb4 100644 --- a/schema/component/feature-grid.ts +++ b/schema/component/feature-grid.ts @@ -6,7 +6,7 @@ import { Illustration, illustrationFieldOptional, illustrationFieldTargetTypes, import { SanityImageRef } from "../image"; import { SanityTextLink, TextLink, textLinkSchemaName } from "../link"; import { SanityDataset, SanityReference } from "../sanity-core"; -import { BodyTextField, PortableText } from "../text"; +import { BodyTextField, ParagraphWithHighlights, PortableText, SanityTitleField } from "../text"; import { PropsOf } from "../util"; import { SanitySectionCore, SectionCore } from "./section"; @@ -14,14 +14,15 @@ export interface SanityFeatureGridSection extends SanitySectionCore { featureGrids: SanityReference[]; } -export type FeatureGridLayout = "textCodeBlocks" | "textBlocks" | "tabs"; +export interface SanityFeatureGridRow { + cells: SanityFeatureGridCell[]; +} export interface SanityFeatureGrid extends SanityDocument { name: string; - featureGridLayout: FeatureGridLayout; - features: SanityFeatureGridCell[]; + title?: PortableText; + rows: SanityFeatureGridRow[]; illustration?: SanityReference; - columnCount: number; } export interface SanityFeatureGridCell extends SanityVisibleToggle { @@ -71,30 +72,40 @@ export class FeatureGridCell implements Partial { } } +export class FeatureGridRow { + readonly cells: FeatureGridCell[]; + + constructor(props: PropsOf) { + this.cells = props.cells; + } + + static fromSanity(data: SanityFeatureGridRow, db: SanityDataset) { + const visibleCells = data.cells.filter(cell => cell.isVisible); + return new FeatureGridRow({ + cells: visibleCells.map(cell => FeatureGridCell.fromSanity(cell, db)), + }); + } +} + export class FeatureGrid { // not used in FeatureGridSection to flatten the structure, but used elsewhere readonly name: string; - readonly featureGridLayout: FeatureGridLayout; - readonly features: FeatureGridCell[][]; + readonly title?: ParagraphWithHighlights; + readonly rows: FeatureGridRow[]; readonly illustration?: Illustration; constructor(props: PropsOf) { this.name = props.name; - this.featureGridLayout = props.featureGridLayout; - this.features = props.features; + this.title = props.title; + this.rows = props.rows; this.illustration = props.illustration; } static fromSanity(featureGrid: SanityFeatureGrid, db: SanityDataset) { - const visibleFeatures = featureGrid.features.filter((x) => x.isVisible); - const featureCells = []; - for (let i = 0; i < visibleFeatures.length; i += featureGrid.columnCount) { - const chunk = visibleFeatures.slice(i, i + featureGrid.columnCount).map((x) => FeatureGridCell.fromSanity(x, db)); - featureCells.push(chunk); - } + const rows = featureGrid.rows.map(row => FeatureGridRow.fromSanity(row, db)); return new FeatureGrid({ name: featureGrid.name, - featureGridLayout: featureGrid.featureGridLayout, - features: featureCells, + title: featureGrid.title ? ParagraphWithHighlights.fromSanity(featureGrid.title) : undefined, + rows: rows, illustration: featureGrid.illustration ? featureGridIllustrationFromSanity(db.resolveRef(featureGrid.illustration), db) : undefined, @@ -155,6 +166,34 @@ const featureGridCellSchema = defineType({ ], }); +export const featureGridRowSchemaName = `featureGridRow`; + +const featureGridRowSchema = defineType({ + name: featureGridRowSchemaName, + title: "Feature Grid Row", + type: "object", + fields: [ + defineField({ + name: "cells", + title: "Cells", + type: "array", + of: [{ type: featureGridCellSchemaName }], + validation: (rule: ArrayRule) => rule.required().min(1), + }), + ], + preview: { + select: { + cells: "cells", + }, + prepare({ cells }) { + const titles = cells?.map((cell: any) => cell.title || "Untitled").join(", ") || "No cells"; + return { + title: titles, + }; + }, + }, +}); + export const featureGridSchemaName = `featureGrid`; const featureGridSchema = defineType({ @@ -164,35 +203,28 @@ const featureGridSchema = defineType({ icon: DashboardIcon, fields: [ nameField, - defineField({ - name: "layout", - title: "Layout", - type: "string", - options: { - layout: "dropdown", - list: [ - { title: "Text Blocks", value: "textBlocks" }, - { title: "Text + Illustration Blocks", value: "textIllustrationBlocks" }, - ], - }, - initialValue: "textBlocks", - validation: requiredRule, + Object.assign({}, titleFieldWithHighlights, { + description: "Optional title for the feature grid. Text marked as 'bold' will be rendered in the highlight color", }), defineField({ - name: "columnCount", - title: "Column Count", - type: "number", - initialValue: 3, - }), - defineField({ - name: "features", - title: "Features", + name: "rows", + title: "Rows", type: "array", - of: [{ type: featureGridCellSchemaName }], - validation: (rule: ArrayRule) => rule.required(), + of: [{ type: featureGridRowSchemaName }], + validation: (rule: ArrayRule) => rule.required().min(1), }), illustrationFieldOptional, ], + preview: { + select: { + name: "name", + }, + prepare({ name }) { + return { + title: name || "Untitled Feature Grid", + }; + }, + }, }); export const featureGridSectionSchemaName = `featureGridSection`; @@ -214,4 +246,4 @@ const featureGridSectionSchema = defineType({ ], }); -export const featureGridSchemas = [featureGridSchema, featureGridSectionSchema, featureGridCellSchema]; +export const featureGridSchemas = [featureGridSchema, featureGridSectionSchema, featureGridRowSchema, featureGridCellSchema]; diff --git a/schema/index.ts b/schema/index.ts index b773ee1d3..e13e81f0c 100644 --- a/schema/index.ts +++ b/schema/index.ts @@ -41,7 +41,7 @@ export { codeSnippetSchemaName, polyglotSnippetSchemaName } from "./common-field export { type SanityConclusionPanel, ConclusionPanel, ConclusionSection } from "./component/conclusion-panel"; export { ContentTextPanel, ContentTextTab } from "./component/content-text-panel"; export { - FeatureGrid, type FeatureGridLayout, FeatureGridSection, FeatureGridCell, featureGridSchemaName, + FeatureGrid, FeatureGridSection, FeatureGridRow, FeatureGridCell, featureGridSchemaName, } from "./component/feature-grid"; export { FeatureTable, featureTableSchemaName, type FeatureTableCell } from "./component/feature-table"; export { Integration, IntegrationsGridSection } from "./component/integrations-grid";