From 977d5fa3fbc6f8c18c07482c1d9a3be66adf147d Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Fri, 14 Jun 2024 13:34:21 -0700 Subject: [PATCH 01/70] Initial migration --- packages/html-program-viewer/package.json | 26 +-- packages/html-program-viewer/src/emitter.ts | 6 +- packages/html-program-viewer/src/index.ts | 2 - .../src/{ => react}/color-provider.tsx | 4 +- .../src/{ => react}/common.tsx | 4 +- .../html-program-viewer/src/react/index.ts | 2 + .../src/{ => react}/type-ui-base.tsx | 9 +- .../src/{ => react}/ui.tsx | 16 +- .../html-program-viewer/src/testing/index.ts | 2 +- packages/html-program-viewer/src/utils.ts | 2 +- .../test/smoke-test.test.ts | 24 +-- packages/html-program-viewer/tsconfig.json | 14 +- packages/html-program-viewer/vite.config.ts | 52 +++++ pnpm-lock.yaml | 198 +++--------------- 14 files changed, 142 insertions(+), 219 deletions(-) rename packages/html-program-viewer/src/{ => react}/color-provider.tsx (76%) rename packages/html-program-viewer/src/{ => react}/common.tsx (82%) create mode 100644 packages/html-program-viewer/src/react/index.ts rename packages/html-program-viewer/src/{ => react}/type-ui-base.tsx (84%) rename packages/html-program-viewer/src/{ => react}/ui.tsx (96%) create mode 100644 packages/html-program-viewer/vite.config.ts diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 6d17c44920..1ca0ffc4af 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -21,21 +21,20 @@ "exports": { ".": { "types": "./dist/src/index.d.ts", - "default": "./dist/src/index.js" + "default": "./dist/index.js" }, - "./testing": { - "types": "./dist/src/testing/index.d.ts", - "default": "./dist/src/testing/index.js" + "./react": { + "types": "./dist/src/react/index.d.ts", + "default": "./dist/react/index.js" } }, - "tspMain": "dist/src/index.js", "engines": { "node": ">=14.0.0" }, "scripts": { "clean": "rimraf ./dist ./temp", - "build": "tsc -p .", - "watch": "tsc -p . --watch", + "build": "vite build", + "watch": "vite build --watch", "test": "vitest run", "test:ui": "vitest --ui", "test:ci": "vitest run --coverage --reporter=junit --reporter=default", @@ -51,23 +50,26 @@ "@typespec/compiler": "workspace:~" }, "dependencies": { - "@emotion/react": "^11.11.4", - "prettier": "~3.2.5", + "@fluentui/react-components": "~9.52.0", + "@fluentui/react-icons": "^2.0.240", "react": "~18.3.1", - "react-dom": "~18.3.1", - "react-is": "~18.3.1" + "react-dom": "~18.3.1" }, "devDependencies": { "@babel/core": "^7.24.5", "@types/node": "~18.11.19", - "@types/react": "~18.3.2", "@types/react-dom": "~18.3.0", + "@types/react": "~18.3.2", "@typespec/compiler": "workspace:~", + "@vitejs/plugin-react": "~4.2.1", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", "c8": "^9.1.0", "rimraf": "~5.0.7", "typescript": "~5.4.5", + "vite-plugin-checker": "^0.6.4", + "vite-plugin-dts": "^3.9.1", + "vite": "^5.2.11", "vitest": "^1.6.0" } } diff --git a/packages/html-program-viewer/src/emitter.ts b/packages/html-program-viewer/src/emitter.ts index 371a28724b..022f8a7adc 100644 --- a/packages/html-program-viewer/src/emitter.ts +++ b/packages/html-program-viewer/src/emitter.ts @@ -1,7 +1,7 @@ -import { EmitContext, emitFile, resolvePath } from "@typespec/compiler"; -import { renderProgram } from "./ui.js"; +import { emitFile, resolvePath, type EmitContext } from "@typespec/compiler"; +import { renderProgram } from "./react/ui.js"; -import { createTypeSpecLibrary, JSONSchemaType } from "@typespec/compiler"; +import { createTypeSpecLibrary, type JSONSchemaType } from "@typespec/compiler"; export interface HtmlProgramViewerOptions { /** diff --git a/packages/html-program-viewer/src/index.ts b/packages/html-program-viewer/src/index.ts index dd9bb34234..e75c2da87f 100644 --- a/packages/html-program-viewer/src/index.ts +++ b/packages/html-program-viewer/src/index.ts @@ -1,4 +1,2 @@ -export { ColorProvider, ColorProviderProps } from "./color-provider.js"; export type { ColorPalette } from "./constants.js"; export * from "./emitter.js"; -export { TypeSpecProgramViewer } from "./ui.js"; diff --git a/packages/html-program-viewer/src/color-provider.tsx b/packages/html-program-viewer/src/react/color-provider.tsx similarity index 76% rename from packages/html-program-viewer/src/color-provider.tsx rename to packages/html-program-viewer/src/react/color-provider.tsx index 8cc881cd8f..aecaa44197 100644 --- a/packages/html-program-viewer/src/color-provider.tsx +++ b/packages/html-program-viewer/src/react/color-provider.tsx @@ -1,5 +1,5 @@ -import { FunctionComponent, ReactNode, useMemo } from "react"; -import { ColorPalette, ColorVariable, ColorsVariables } from "./constants.js"; +import { useMemo, type FunctionComponent, type ReactNode } from "react"; +import { ColorsVariables, type ColorPalette, type ColorVariable } from "../constants.js"; export interface ColorProviderProps { colors: Partial; diff --git a/packages/html-program-viewer/src/common.tsx b/packages/html-program-viewer/src/react/common.tsx similarity index 82% rename from packages/html-program-viewer/src/common.tsx rename to packages/html-program-viewer/src/react/common.tsx index b0c5cc8f6d..c5bca04034 100644 --- a/packages/html-program-viewer/src/common.tsx +++ b/packages/html-program-viewer/src/react/common.tsx @@ -1,5 +1,5 @@ -import { FunctionComponent, ReactElement } from "react"; -import { Colors } from "./constants.js"; +import type { FunctionComponent, ReactElement } from "react"; +import { Colors } from "../constants.js"; export const Literal: FunctionComponent<{ children: any }> = ({ children }) => (
{children}
diff --git a/packages/html-program-viewer/src/react/index.ts b/packages/html-program-viewer/src/react/index.ts new file mode 100644 index 0000000000..892e674d07 --- /dev/null +++ b/packages/html-program-viewer/src/react/index.ts @@ -0,0 +1,2 @@ +export { ColorProvider, type ColorProviderProps } from "./color-provider.js"; +export { TypeSpecProgramViewer } from "./ui.js"; diff --git a/packages/html-program-viewer/src/type-ui-base.tsx b/packages/html-program-viewer/src/react/type-ui-base.tsx similarity index 84% rename from packages/html-program-viewer/src/type-ui-base.tsx rename to packages/html-program-viewer/src/react/type-ui-base.tsx index 7b54fed8f6..32fe4eb53f 100644 --- a/packages/html-program-viewer/src/type-ui-base.tsx +++ b/packages/html-program-viewer/src/react/type-ui-base.tsx @@ -1,9 +1,8 @@ -import { css } from "@emotion/react"; -import { Type } from "@typespec/compiler"; -import { FunctionComponent } from "react"; +import type { Type } from "@typespec/compiler"; +import type { FunctionComponent } from "react"; +import { Colors } from "../constants.js"; +import { getIdForType } from "../utils.js"; import { KeyValueSection } from "./common.js"; -import { Colors } from "./constants.js"; -import { getIdForType } from "./utils.js"; export interface TypeUIBaseProperty { name: string; diff --git a/packages/html-program-viewer/src/ui.tsx b/packages/html-program-viewer/src/react/ui.tsx similarity index 96% rename from packages/html-program-viewer/src/ui.tsx rename to packages/html-program-viewer/src/react/ui.tsx index de69875c8d..c4b862b293 100644 --- a/packages/html-program-viewer/src/ui.tsx +++ b/packages/html-program-viewer/src/react/ui.tsx @@ -1,10 +1,7 @@ -import { css } from "@emotion/react"; -import { +import type { Entity, Enum, EnumMember, - getNamespaceFullName, - getTypeName, Interface, Model, ModelProperty, @@ -16,13 +13,14 @@ import { Union, UnionVariant, } from "@typespec/compiler"; -import React, { FunctionComponent, ReactElement, useContext } from "react"; +import { getNamespaceFullName, getTypeName } from "@typespec/compiler"; +import React, { useContext, type FunctionComponent, type ReactElement } from "react"; import ReactDOMServer from "react-dom/server"; +import { Colors } from "../constants.js"; +import { inspect } from "../inspect.js"; +import { getIdForType, isNamedUnion } from "../utils.js"; import { KeyValueSection, Literal } from "./common.js"; -import { Colors } from "./constants.js"; -import { inspect } from "./inspect.js"; -import { TypeUIBase, TypeUIBaseProperty } from "./type-ui-base.js"; -import { getIdForType, isNamedUnion } from "./utils.js"; +import { TypeUIBase, type TypeUIBaseProperty } from "./type-ui-base.js"; function expandNamespaces(namespace: Namespace): Namespace[] { return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; diff --git a/packages/html-program-viewer/src/testing/index.ts b/packages/html-program-viewer/src/testing/index.ts index 53f0280ba7..31abb11407 100644 --- a/packages/html-program-viewer/src/testing/index.ts +++ b/packages/html-program-viewer/src/testing/index.ts @@ -1,7 +1,7 @@ import { createTestLibrary, findTestPackageRoot, - TypeSpecTestLibrary, + type TypeSpecTestLibrary, } from "@typespec/compiler/testing"; export const ProgramViewerTestLibrary: TypeSpecTestLibrary = createTestLibrary({ diff --git a/packages/html-program-viewer/src/utils.ts b/packages/html-program-viewer/src/utils.ts index 369480a174..ccd79a8052 100644 --- a/packages/html-program-viewer/src/utils.ts +++ b/packages/html-program-viewer/src/utils.ts @@ -1,4 +1,4 @@ -import { getNamespaceFullName, Type, Union } from "@typespec/compiler"; +import { getNamespaceFullName, type Type, type Union } from "@typespec/compiler"; export function getIdForType(type: Type): string | undefined { if (type.kind === "Namespace") { diff --git a/packages/html-program-viewer/test/smoke-test.test.ts b/packages/html-program-viewer/test/smoke-test.test.ts index d533b53020..4252c7f40e 100644 --- a/packages/html-program-viewer/test/smoke-test.test.ts +++ b/packages/html-program-viewer/test/smoke-test.test.ts @@ -1,19 +1,17 @@ -import { BasicTestRunner } from "@typespec/compiler/testing"; -import { beforeEach, describe, it } from "vitest"; +import type { BasicTestRunner } from "@typespec/compiler/testing"; +import { beforeEach, it } from "vitest"; import { createViewerTestRunner } from "./test-host.js"; -describe("html-program-viewer: smoke tests", () => { - let runner: BasicTestRunner; +let runner: BasicTestRunner; - beforeEach(async () => { - runner = await createViewerTestRunner(); - }); +beforeEach(async () => { + runner = await createViewerTestRunner(); +}); - it("create html view", async () => { - await runner.compile(`op foo(): string;`); - }); +it("create html view", async () => { + await runner.compile(`op foo(): string;`); +}); - it("compile unnamed union variant without error", async () => { - await runner.compile(`union Foo { "a", "b" }`); - }); +it("compile unnamed union variant without error", async () => { + await runner.compile(`union Foo { "a", "b" }`); }); diff --git a/packages/html-program-viewer/tsconfig.json b/packages/html-program-viewer/tsconfig.json index 433aea64c1..ff2111ba51 100644 --- a/packages/html-program-viewer/tsconfig.json +++ b/packages/html-program-viewer/tsconfig.json @@ -6,14 +6,18 @@ { "path": "../openapi/tsconfig.json" } ], "compilerOptions": { + "incremental": false, + "composite": false, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "sourceMap": false, + "resolveJsonModule": true, "outDir": "dist", "rootDir": ".", - "tsBuildInfoFile": "temp/tsconfig.tsbuildinfo", "skipLibCheck": true, + "verbatimModuleSyntax": true, "jsx": "react-jsx", - "jsxImportSource": "@emotion/react", - "lib": ["DOM", "ES2022"], - "types": ["@emotion/react"] + "lib": ["DOM"] }, - "include": ["src/**/*.ts", "src/**/*.tsx", "test/**/*.ts"] + "include": ["src", "test/**/*.ts"] } diff --git a/packages/html-program-viewer/vite.config.ts b/packages/html-program-viewer/vite.config.ts new file mode 100644 index 0000000000..bacff859c2 --- /dev/null +++ b/packages/html-program-viewer/vite.config.ts @@ -0,0 +1,52 @@ +import react from "@vitejs/plugin-react"; +import { readFileSync } from "fs"; +import { dirname, resolve } from "path"; +import { fileURLToPath } from "url"; +import { defineConfig } from "vite"; +import checker from "vite-plugin-checker"; +import dts from "vite-plugin-dts"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const packageJson = JSON.parse(readFileSync(resolve(__dirname, "package.json")).toString()); +const dependencies = Object.keys(packageJson.dependencies); +const externals = [...dependencies]; + +export default defineConfig({ + build: { + target: "esnext", + minify: false, + chunkSizeWarningLimit: 3000, + lib: { + entry: { + index: "src/index.ts", + "react/index": "src/react/index.ts", + }, + formats: ["es"], + }, + + rollupOptions: { + external: externals, + }, + }, + esbuild: { + logOverride: { "this-is-undefined-in-esm": "silent" }, + }, + assetsInclude: [/\.tsp$/], + optimizeDeps: {}, + plugins: [ + react({}), + dts({ + logLevel: "silent", // checker reports the errors + }), + checker({ + // e.g. use TypeScript check + typescript: true, + }), + ], + server: { + fs: { + strict: false, + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c50746a7c8..0d360d6295 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -377,21 +377,18 @@ importers: packages/html-program-viewer: dependencies: - '@emotion/react': - specifier: ^11.11.4 - version: 11.11.4(@types/react@18.3.2)(react@18.3.1) - prettier: - specifier: ~3.2.5 - version: 3.2.5 + '@fluentui/react-components': + specifier: ~9.52.0 + version: 9.52.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': + specifier: ^2.0.240 + version: 2.0.240(react@18.3.1) react: specifier: ~18.3.1 version: 18.3.1 react-dom: specifier: ~18.3.1 version: 18.3.1(react@18.3.1) - react-is: - specifier: ~18.3.1 - version: 18.3.1 devDependencies: '@babel/core': specifier: ^7.24.5 @@ -408,6 +405,9 @@ importers: '@typespec/compiler': specifier: workspace:~ version: link:../compiler + '@vitejs/plugin-react': + specifier: ~4.2.1 + version: 4.2.1(vite@5.2.11) '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0) @@ -423,6 +423,15 @@ importers: typescript: specifier: ~5.4.5 version: 5.4.5 + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@18.11.19) + vite-plugin-checker: + specifier: ^0.6.4 + version: 0.6.4(eslint@8.57.0)(typescript@5.4.5)(vite@5.2.11) + vite-plugin-dts: + specifier: ^3.9.1 + version: 3.9.1(@types/node@18.11.19)(typescript@5.4.5)(vite@5.2.11) vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) @@ -2364,7 +2373,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.5): @@ -2385,7 +2394,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 /@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} @@ -2395,7 +2404,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.5) dev: false @@ -2422,7 +2431,7 @@ packages: '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) '@babel/helper-split-export-declaration': 7.24.5 globals: 11.12.0 @@ -2462,7 +2471,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.5): @@ -2684,7 +2693,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.24.5) dev: false @@ -2729,7 +2738,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) dev: false @@ -2752,7 +2761,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-parameters@7.24.5(@babel/core@7.24.5): @@ -2784,7 +2793,7 @@ packages: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.5) dev: false @@ -2817,7 +2826,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.5): @@ -2847,7 +2856,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5): @@ -2857,7 +2866,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: true /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5): @@ -2965,7 +2974,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.5): @@ -4518,93 +4527,17 @@ packages: fast-check: 3.17.2 dev: true - /@emotion/babel-plugin@11.11.0: - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} - dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/runtime': 7.24.1 - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/serialize': 1.1.4 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - dev: false - - /@emotion/cache@11.11.0: - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} - dependencies: - '@emotion/memoize': 0.8.1 - '@emotion/sheet': 1.2.2 - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - stylis: 4.2.0 - dev: false - /@emotion/hash@0.9.1: resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} dev: false - /@emotion/memoize@0.8.1: - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: false - - /@emotion/react@11.11.4(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@babel/runtime': 7.24.1 - '@emotion/babel-plugin': 11.11.0 - '@emotion/cache': 11.11.0 - '@emotion/serialize': 1.1.4 - '@emotion/use-insertion-effect-with-fallbacks': 1.0.1(react@18.3.1) - '@emotion/utils': 1.2.1 - '@emotion/weak-memoize': 0.3.1 - '@types/react': 18.3.2 - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - dev: false - - /@emotion/serialize@1.1.4: - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} - dependencies: - '@emotion/hash': 0.9.1 - '@emotion/memoize': 0.8.1 - '@emotion/unitless': 0.8.1 - '@emotion/utils': 1.2.1 - csstype: 3.1.3 - dev: false - - /@emotion/sheet@1.2.2: - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} - dev: false - - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: false - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.3.1): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: react: '>=16.8.0' dependencies: react: 18.3.1 - - /@emotion/utils@1.2.1: - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} - dev: false - - /@emotion/weak-memoize@0.3.1: - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} - dev: false + dev: true /@esbuild/aix-ppc64@0.20.2: resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} @@ -5388,7 +5321,7 @@ packages: peerDependencies: react: '>=16.8.0 <19.0.0' dependencies: - '@griffel/react': 1.5.21(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) react: 18.3.1 tslib: 2.6.2 dev: false @@ -6382,17 +6315,6 @@ packages: '@swc/helpers': 0.5.8 dev: false - /@griffel/core@1.15.3: - resolution: {integrity: sha512-5ksBpOjFJ75HijGehQ06Ri9cQjhd/rqQ0N/jJzXDDXQFYdOOzib/QL7BXNwhkLtTyHvN391cD4/BqcTdynfLUg==} - dependencies: - '@emotion/hash': 0.9.1 - '@griffel/style-types': 1.0.4 - csstype: 3.1.3 - rtl-css-js: 1.16.1 - stylis: 4.3.1 - tslib: 2.6.2 - dev: false - /@griffel/core@1.16.0: resolution: {integrity: sha512-7xy9sWxmyFok0chZXJ91z4VH0HdwhAPUln5Ctpg6S/WRKoPhpIg9EieiL5CRFhIp1krPIncJSes4WqaB9OKiow==} dependencies: @@ -6404,16 +6326,6 @@ packages: tslib: 2.6.2 dev: false - /@griffel/react@1.5.21(react@18.3.1): - resolution: {integrity: sha512-7wuY9uFSt/0E7kLAKX//ue8NILx0IGoOtIx6WVuavEUFJXPCrvFn4uCDgnJC0211LZtJ+XH7zZGPNUtSb7nijw==} - peerDependencies: - react: '>=16.8.0 <19.0.0' - dependencies: - '@griffel/core': 1.15.3 - react: 18.3.1 - tslib: 2.6.2 - dev: false - /@griffel/react@1.5.22(react@18.3.1): resolution: {integrity: sha512-QZWo73e+7oh+aTxCJzCe9SNUszM0+lHG9p1LoEQ5MZdvtT8sur1M4cz+TVTTgUXqUBnHBf1TIYXvVoRxiZhy8Q==} peerDependencies: @@ -6424,12 +6336,6 @@ packages: tslib: 2.6.2 dev: false - /@griffel/style-types@1.0.4: - resolution: {integrity: sha512-geZomjQTIHXoQZFFB811PUMXYAr8LuBNOMPcR2YJAl1pslbHYYiZKCa2FgZCw00hnQFP4uB4JIJ2CiPJqKZYmw==} - dependencies: - csstype: 3.1.3 - dev: false - /@griffel/style-types@1.1.0: resolution: {integrity: sha512-cINLeC14/YUHlrtL96vzCrsFr19WUO0i9DuljBtX5S7B8pMyiNf6Pw0htjroLojvfD2okhdsr9CHwpUxz1u4kw==} dependencies: @@ -10259,15 +10165,6 @@ packages: object.assign: 4.1.5 dev: false - /babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - dependencies: - '@babel/runtime': 7.24.1 - cosmiconfig: 7.1.0 - resolve: 1.22.8 - dev: false - /babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.24.5): resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} peerDependencies: @@ -11081,10 +10978,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false - /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -11149,17 +11042,6 @@ packages: yaml: 1.10.2 dev: false - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: false - /cosmiconfig@8.3.6(typescript@5.4.5): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -13187,10 +13069,6 @@ packages: array-back: 3.1.0 dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false - /find-up-simple@1.0.0: resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} engines: {node: '>=18'} @@ -18219,6 +18097,7 @@ packages: /react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: true /react-json-view-lite@1.3.0(react@18.3.1): resolution: {integrity: sha512-aN1biKC5v4DQkmQBlZjuMFR09MKZGMPtIg+cut8zEeg2HXd6gl2gRy0n4HMacHf0dznQgo0SVXN7eT8zV3hEuQ==} @@ -19236,11 +19115,6 @@ packages: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -19552,10 +19426,6 @@ packages: postcss-selector-parser: 6.0.16 dev: false - /stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - dev: false - /stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} From d86f9684bd0d838f23a6697b41fc3e5eba76a184 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Fri, 14 Jun 2024 14:46:11 -0700 Subject: [PATCH 02/70] Initial tree view --- packages/html-program-viewer/package.json | 3 +- packages/html-program-viewer/src/emitter.ts | 2 +- .../html-program-viewer/src/react/common.tsx | 16 +- .../html-program-viewer/src/react/index.ts | 2 +- .../src/react/program-context.ts | 14 ++ .../src/react/tree-navigation.module.css | 2 + .../src/react/type-graph.tsx | 185 ++++++++++++++++++ .../src/react/type-ui-base.tsx | 23 +-- .../src/react/ui.module.css | 0 packages/html-program-viewer/src/react/ui.tsx | 79 ++------ packages/html-program-viewer/tsconfig.json | 3 +- .../react/output-view/type-graph-viewer.tsx | 23 +-- 12 files changed, 233 insertions(+), 119 deletions(-) create mode 100644 packages/html-program-viewer/src/react/program-context.ts create mode 100644 packages/html-program-viewer/src/react/tree-navigation.module.css create mode 100644 packages/html-program-viewer/src/react/type-graph.tsx create mode 100644 packages/html-program-viewer/src/react/ui.module.css diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 1ca0ffc4af..c090931a9e 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -26,7 +26,8 @@ "./react": { "types": "./dist/src/react/index.d.ts", "default": "./dist/react/index.js" - } + }, + "./style.css": "./dist/style.css" }, "engines": { "node": ">=14.0.0" diff --git a/packages/html-program-viewer/src/emitter.ts b/packages/html-program-viewer/src/emitter.ts index 022f8a7adc..3a717ad70f 100644 --- a/packages/html-program-viewer/src/emitter.ts +++ b/packages/html-program-viewer/src/emitter.ts @@ -1,5 +1,5 @@ import { emitFile, resolvePath, type EmitContext } from "@typespec/compiler"; -import { renderProgram } from "./react/ui.js"; +import { renderProgram } from "./react/type-graph.js"; import { createTypeSpecLibrary, type JSONSchemaType } from "@typespec/compiler"; diff --git a/packages/html-program-viewer/src/react/common.tsx b/packages/html-program-viewer/src/react/common.tsx index c5bca04034..278ee0135c 100644 --- a/packages/html-program-viewer/src/react/common.tsx +++ b/packages/html-program-viewer/src/react/common.tsx @@ -1,23 +1,11 @@ import type { FunctionComponent, ReactElement } from "react"; -import { Colors } from "../constants.js"; export const Literal: FunctionComponent<{ children: any }> = ({ children }) => ( -
{children}
+
{children}
); export const KeyValueSection: FunctionComponent<{ children: ReactElement | ReactElement[] }> = ({ children, }) => { - return ( -
    - {children} -
- ); + return
    {children}
; }; diff --git a/packages/html-program-viewer/src/react/index.ts b/packages/html-program-viewer/src/react/index.ts index 892e674d07..460751e144 100644 --- a/packages/html-program-viewer/src/react/index.ts +++ b/packages/html-program-viewer/src/react/index.ts @@ -1,2 +1,2 @@ export { ColorProvider, type ColorProviderProps } from "./color-provider.js"; -export { TypeSpecProgramViewer } from "./ui.js"; +export { TypeGraph } from "./type-graph.js"; diff --git a/packages/html-program-viewer/src/react/program-context.ts b/packages/html-program-viewer/src/react/program-context.ts new file mode 100644 index 0000000000..e1e6216504 --- /dev/null +++ b/packages/html-program-viewer/src/react/program-context.ts @@ -0,0 +1,14 @@ +import type { Program } from "@typespec/compiler"; +import { createContext, useContext } from "react"; + +const ProgramContext = createContext(undefined); + +export const ProgramProvider = ProgramContext.Provider; + +export function useProgram() { + const program = useContext(ProgramContext); + if (program === undefined) { + throw new Error(`Expect to be used inside a ProgramProvider`); + } + return program; +} diff --git a/packages/html-program-viewer/src/react/tree-navigation.module.css b/packages/html-program-viewer/src/react/tree-navigation.module.css new file mode 100644 index 0000000000..567379da6c --- /dev/null +++ b/packages/html-program-viewer/src/react/tree-navigation.module.css @@ -0,0 +1,2 @@ +.tree-navigation { +} diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx new file mode 100644 index 0000000000..6d8fbb62d7 --- /dev/null +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -0,0 +1,185 @@ +import { + FluentProvider, + Tree, + TreeItem, + TreeItemLayout, + webLightTheme, +} from "@fluentui/react-components"; +import type { Namespace, Program, Type } from "@typespec/compiler"; +import { getNamespaceFullName } from "@typespec/compiler"; +import { type FunctionComponent } from "react"; +import ReactDOMServer from "react-dom/server"; +import { ProgramProvider, useProgram } from "./program-context.js"; +import style from "./tree-navigation.module.css"; + +function expandNamespaces(namespace: Namespace): Namespace[] { + return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; +} + +export function renderProgram(program: Program) { + const html = ReactDOMServer.renderToString( + + + + ); + return html; +} + +export interface TypeGraphProps { + readonly program: Program; +} + +export const TypeGraph: FunctionComponent = ({ program }) => { + return ( + + + + ); +}; + +const TreeNavigation = () => { + const program = useProgram(); + const root = program.checker!.getGlobalNamespaceType(); + const namespaces = expandNamespaces(root); + + return ( + + {namespaces.map((namespace) => ( + + ))} + + ); +}; + +const NamespaceTreeNode = ({ namespace }: { namespace: Namespace }) => { + const id = getNamespaceFullName(namespace); + return ; +}; + +type NamedType = Type & { name: string }; +type EntityTreeNodeProps = { + readonly path: string; + readonly type: T; + readonly name?: string; +}; + +const omittedProps = [ + "entityKind", + "kind", + "name", + "node", + "symbol", + "namespace", + "templateNode", + "templateArguments", + "templateMapper", + "instantiationParameters", + "decorators", + "projectionBase", + "projectionsByName", + "projectionSource", + "projector", + "projections", + "isFinished", +] as const; +const omittedPropsSet = new Set(omittedProps); + +interface Prop { + name: string; + value: Map; + description?: string; +} + +const EntityTreeNode = ({ path, type, name }: EntityTreeNodeProps) => { + name ??= type.name; + const typeRendering = (TypeRendering as any)[type.kind]; + const props: Prop[] = Object.entries(type) + .map(([key, value]) => { + if (omittedPropsSet.has(key as any)) { + return undefined; + } + const action: PropertyAction | undefined = typeRendering?.[key] as PropertyAction; + if (action !== "nested") { + return undefined; + } + + return { + name: key, + value: value, + } satisfies Prop; + }) + .filter((x): x is Prop => Boolean(x)); + return ( + + {name} + {props.length > 0 && ( + path + "." + x.name)}> + {props.map((x) => { + const propPath = path + "." + x.name; + return ; + })} + + )} + + ); +}; + +interface EntityPropTreeNode { + path: string; + prop: Prop; +} +const EntityPropTreeNode = ({ path, prop }: EntityPropTreeNode) => { + const empty = prop.value.size === 0; + return ( + + + {prop.name} {empty ? "(0)" : ""} + + + + ); +}; + +const ItemListTree = ({ path, items }: { path: string; items: Map }) => { + return ( + + {Array.from(items.entries()).map(([key, value]) => { + return ; + })} + + ); +}; + +type PropertyAction = "skip" | "ref" | "nested" | "value"; + +const TypeRendering = { + Namespace: { + namespaces: "skip", + models: "nested", + scalars: "nested", + interfaces: "nested", + operations: "nested", + unions: "nested", + enums: "nested", + decoratorDeclarations: "nested", + functionDeclarations: "nested", + }, + Interace: { + operations: "nested", + sourceInterfaces: "ref", + }, + Operation: { + interface: "skip", + parameters: "nested", + returnType: "ref", + sourceOperation: "ref", + }, + Model: { + indexer: "skip", + baseModel: "ref", + derivedModels: "ref", + properties: "nested", + sourceModel: "ref", + sourceModels: "value", + }, +}; diff --git a/packages/html-program-viewer/src/react/type-ui-base.tsx b/packages/html-program-viewer/src/react/type-ui-base.tsx index 32fe4eb53f..cc46bc000b 100644 --- a/packages/html-program-viewer/src/react/type-ui-base.tsx +++ b/packages/html-program-viewer/src/react/type-ui-base.tsx @@ -1,6 +1,5 @@ import type { Type } from "@typespec/compiler"; import type { FunctionComponent } from "react"; -import { Colors } from "../constants.js"; import { getIdForType } from "../utils.js"; import { KeyValueSection } from "./common.js"; @@ -21,36 +20,20 @@ export interface TypeUIBaseProps { properties: TypeUIBaseProperty[]; } -const TypeNameStyles = css({ - display: "inline", - color: Colors.typeName, -}); - export const TypeUIBase: FunctionComponent = (props) => { const id = props.id ?? getIdForType(props.type); const properties = props.properties.map((prop) => { return (
  • - - {prop.name} - - : {prop.value} + {prop.name}: {prop.value}
  • ); }); return (
    - - {props.type.kind} - - {props.name} + {props.type.kind} + {props.name}
    {properties}
    diff --git a/packages/html-program-viewer/src/react/ui.module.css b/packages/html-program-viewer/src/react/ui.module.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/html-program-viewer/src/react/ui.tsx b/packages/html-program-viewer/src/react/ui.tsx index c4b862b293..98d0b3599f 100644 --- a/packages/html-program-viewer/src/react/ui.tsx +++ b/packages/html-program-viewer/src/react/ui.tsx @@ -7,66 +7,19 @@ import type { ModelProperty, Namespace, Operation, - Program, Scalar, Type, Union, UnionVariant, } from "@typespec/compiler"; import { getNamespaceFullName, getTypeName } from "@typespec/compiler"; -import React, { useContext, type FunctionComponent, type ReactElement } from "react"; -import ReactDOMServer from "react-dom/server"; -import { Colors } from "../constants.js"; +import { type FunctionComponent, type ReactElement } from "react"; import { inspect } from "../inspect.js"; import { getIdForType, isNamedUnion } from "../utils.js"; import { KeyValueSection, Literal } from "./common.js"; +import { useProgram } from "./program-context.js"; import { TypeUIBase, type TypeUIBaseProperty } from "./type-ui-base.js"; -function expandNamespaces(namespace: Namespace): Namespace[] { - return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; -} - -const ProgramContext = React.createContext({} as any); - -export function renderProgram(program: Program) { - const html = ReactDOMServer.renderToString(); - return html; -} - -export interface TypeSpecProgramViewerProps { - program: Program; -} - -const ProgramViewerStyles = css({ - fontFamily: "monospace", - backgroundColor: Colors.background, - li: { - margin: 0, - listStyle: "none", - position: "relative", - }, -}); - -export const TypeSpecProgramViewer: FunctionComponent = ({ - program, -}) => { - const root = program.checker!.getGlobalNamespaceType(); - const namespaces = expandNamespaces(root); - return ( - -
    -
      - {namespaces.map((namespace) => ( -
    • - -
    • - ))} -
    -
    -
    - ); -}; - export interface ItemListProps { items: Map | T[]; render: (t: T) => ReactElement | null; @@ -176,7 +129,12 @@ const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { case "Namespace": return ; case "Interface": - return ; + return ; case "Operation": return ; case "Model": @@ -359,14 +317,14 @@ const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { const href = `#${id}`; return ( @@ -424,7 +382,7 @@ const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { }; const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { - const program = useContext(ProgramContext); + const program = useProgram(); const entries = [...program.stateMaps.entries()] .map(([k, v]) => [k, v.get(undefined)?.get(type) as any]) .filter(([k, v]) => !!v); @@ -434,9 +392,8 @@ const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { return ( {entries.map(([k, v], i) => ( -
    -
    {k.toString()}:
    {" "} -
    {inspect(v)}
    +
    +
    {k.toString()}:
    {inspect(v)}
    ))} diff --git a/packages/html-program-viewer/tsconfig.json b/packages/html-program-viewer/tsconfig.json index ff2111ba51..5d21c19880 100644 --- a/packages/html-program-viewer/tsconfig.json +++ b/packages/html-program-viewer/tsconfig.json @@ -17,7 +17,8 @@ "skipLibCheck": true, "verbatimModuleSyntax": true, "jsx": "react-jsx", - "lib": ["DOM"] + "lib": ["DOM"], + "types": ["vite/client"] }, "include": ["src", "test/**/*.ts"] } diff --git a/packages/playground/src/react/output-view/type-graph-viewer.tsx b/packages/playground/src/react/output-view/type-graph-viewer.tsx index 56b34ca53b..6b2b69c00e 100644 --- a/packages/playground/src/react/output-view/type-graph-viewer.tsx +++ b/packages/playground/src/react/output-view/type-graph-viewer.tsx @@ -1,34 +1,17 @@ -import { tokens } from "@fluentui/react-components"; import { DataLineRegular } from "@fluentui/react-icons"; -import { - ColorProvider, - TypeSpecProgramViewer, - type ColorPalette, -} from "@typespec/html-program-viewer"; +import { TypeGraph } from "@typespec/html-program-viewer/react"; +import "@typespec/html-program-viewer/style.css"; import type { OutputViewerProps, ProgramViewer } from "../types.js"; import style from "./output-view.module.css"; const TypeGraphViewerComponent = ({ program }: OutputViewerProps) => { return (
    - - - +
    ); }; -const TypeGraphColors: ColorPalette = { - background: tokens.colorNeutralBackground1, - typeKind: tokens.colorPaletteBerryForeground2, - typeName: tokens.colorNeutralForeground2, - dataKey: tokens.colorNeutralForeground2, - ref: tokens.colorBrandForeground1, - literal: tokens.colorPaletteLightGreenForeground2, - indentationGuide: tokens.colorNeutralForeground4, - property: tokens.colorPaletteMarigoldForeground2, -}; - export const TypeGraphViewer: ProgramViewer = { key: "type-graph", label: "Type graph", From fae2b610d5a9cfbcea9f7d205099d5ae4d69b6ed Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Fri, 14 Jun 2024 15:06:35 -0700 Subject: [PATCH 03/70] Extra splitpane into separate package --- packages/html-program-viewer/package.json | 1 + packages/html-program-viewer/src/react/ui.tsx | 7 +- packages/html-program-viewer/tsconfig.json | 2 +- packages/html-program-viewer/vite.config.ts | 5 - packages/playground/package.json | 5 +- packages/playground/src/react/playground.tsx | 5 +- packages/react-components/LICENSE | 21 +++++ packages/react-components/README.md | 1 + packages/react-components/package.json | 67 ++++++++++++++ .../react => react-components/src}/hooks.ts | 0 packages/react-components/src/index.ts | 2 + .../src}/split-pane/index.ts | 1 + .../src}/split-pane/pane.tsx | 2 +- .../src}/split-pane/sash-content.tsx | 0 .../src}/split-pane/sash.tsx | 0 .../src}/split-pane/split-pane.module.css | 0 .../src}/split-pane/split-pane.tsx | 2 +- .../react-components/tsconfig.config.json | 4 + packages/react-components/tsconfig.json | 18 ++++ packages/react-components/vite.config.ts | 46 ++++++++++ packages/react-components/vitest.config.ts | 4 + pnpm-lock.yaml | 92 ++++++++++++++++--- 22 files changed, 251 insertions(+), 34 deletions(-) create mode 100644 packages/react-components/LICENSE create mode 100644 packages/react-components/README.md create mode 100644 packages/react-components/package.json rename packages/{playground/src/react => react-components/src}/hooks.ts (100%) create mode 100644 packages/react-components/src/index.ts rename packages/{playground/src/react => react-components/src}/split-pane/index.ts (56%) rename packages/{playground/src/react => react-components/src}/split-pane/pane.tsx (90%) rename packages/{playground/src/react => react-components/src}/split-pane/sash-content.tsx (100%) rename packages/{playground/src/react => react-components/src}/split-pane/sash.tsx (100%) rename packages/{playground/src/react => react-components/src}/split-pane/split-pane.module.css (100%) rename packages/{playground/src/react => react-components/src}/split-pane/split-pane.tsx (99%) create mode 100644 packages/react-components/tsconfig.config.json create mode 100644 packages/react-components/tsconfig.json create mode 100644 packages/react-components/vite.config.ts create mode 100644 packages/react-components/vitest.config.ts diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index c090931a9e..02beab2e83 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -62,6 +62,7 @@ "@types/react-dom": "~18.3.0", "@types/react": "~18.3.2", "@typespec/compiler": "workspace:~", + "@typespec/react-components": "workspace:~", "@vitejs/plugin-react": "~4.2.1", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", diff --git a/packages/html-program-viewer/src/react/ui.tsx b/packages/html-program-viewer/src/react/ui.tsx index 98d0b3599f..7e6b1b7b45 100644 --- a/packages/html-program-viewer/src/react/ui.tsx +++ b/packages/html-program-viewer/src/react/ui.tsx @@ -129,12 +129,7 @@ const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { case "Namespace": return ; case "Interface": - return ; + return ; case "Operation": return ; case "Model": diff --git a/packages/html-program-viewer/tsconfig.json b/packages/html-program-viewer/tsconfig.json index 5d21c19880..6377828a7e 100644 --- a/packages/html-program-viewer/tsconfig.json +++ b/packages/html-program-viewer/tsconfig.json @@ -17,7 +17,7 @@ "skipLibCheck": true, "verbatimModuleSyntax": true, "jsx": "react-jsx", - "lib": ["DOM"], + "lib": ["DOM", "ES2022"], "types": ["vite/client"] }, "include": ["src", "test/**/*.ts"] diff --git a/packages/html-program-viewer/vite.config.ts b/packages/html-program-viewer/vite.config.ts index bacff859c2..b6945b3890 100644 --- a/packages/html-program-viewer/vite.config.ts +++ b/packages/html-program-viewer/vite.config.ts @@ -29,11 +29,6 @@ export default defineConfig({ external: externals, }, }, - esbuild: { - logOverride: { "this-is-undefined-in-esm": "silent" }, - }, - assetsInclude: [/\.tsp$/], - optimizeDeps: {}, plugins: [ react({}), dts({ diff --git a/packages/playground/package.json b/packages/playground/package.json index ee4b3638a9..e2c4dd9622 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -95,16 +95,17 @@ "@playwright/test": "^1.44.0", "@storybook/addon-actions": "^8.1.2", "@storybook/cli": "^8.1.2", - "@storybook/react": "^8.1.2", "@storybook/react-vite": "^8.1.2", + "@storybook/react": "^8.1.2", "@storybook/test": "^8.1.2", "@storybook/types": "^8.1.2", "@types/debounce": "~1.2.4", "@types/node": "~18.11.19", - "@types/react": "~18.3.2", "@types/react-dom": "~18.3.0", + "@types/react": "~18.3.2", "@types/swagger-ui-dist": "~3.30.4", "@typespec/bundler": "workspace:~", + "@typespec/react-components": "workspace:~", "@vitejs/plugin-react": "~4.2.1", "c8": "^9.1.0", "cross-env": "~7.0.3", diff --git a/packages/playground/src/react/playground.tsx b/packages/playground/src/react/playground.tsx index 6a36f32fc1..550a178f28 100644 --- a/packages/playground/src/react/playground.tsx +++ b/packages/playground/src/react/playground.tsx @@ -1,4 +1,6 @@ import type { CompilerOptions, Diagnostic } from "@typespec/compiler"; +import { Pane, SplitPane, useControllableValue } from "@typespec/react-components"; +import "@typespec/react-components/style.css"; import debounce from "debounce"; import { KeyCode, KeyMod, MarkerSeverity, Uri, editor } from "monaco-editor"; import { @@ -17,12 +19,9 @@ import type { BrowserHost, PlaygroundSample } from "../types.js"; import { PlaygroundContextProvider } from "./context/playground-context.js"; import { DefaultFooter } from "./default-footer.js"; import { useMonacoModel, type OnMountData } from "./editor.js"; -import { useControllableValue } from "./hooks.js"; import { OutputView } from "./output-view/output-view.js"; import style from "./playground.module.css"; import { ProblemPane } from "./problem-pane/index.js"; -import Pane from "./split-pane/pane.js"; -import { SplitPane } from "./split-pane/split-pane.js"; import type { CompilationState, FileOutputViewer, ProgramViewer } from "./types.js"; import { TypeSpecEditor } from "./typespec-editor.js"; diff --git a/packages/react-components/LICENSE b/packages/react-components/LICENSE new file mode 100644 index 0000000000..21071075c2 --- /dev/null +++ b/packages/react-components/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/packages/react-components/README.md b/packages/react-components/README.md new file mode 100644 index 0000000000..7b20456b2b --- /dev/null +++ b/packages/react-components/README.md @@ -0,0 +1 @@ +# Set of components that are used in different UI packages of TypeSpec diff --git a/packages/react-components/package.json b/packages/react-components/package.json new file mode 100644 index 0000000000..f1d7fb2313 --- /dev/null +++ b/packages/react-components/package.json @@ -0,0 +1,67 @@ +{ + "name": "@typespec/react-components", + "version": "0.57.0", + "author": "Microsoft Corporation", + "description": "TypeSpec library for emitting an html view of the program.", + "homepage": "https://typespec.io", + "readme": "https://github.com/microsoft/typespec/blob/main/README.md", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/microsoft/typespec.git" + }, + "bugs": { + "url": "https://github.com/microsoft/typespec/issues" + }, + "keywords": [ + "typespec" + ], + "type": "module", + "main": "dist/src/index.js", + "exports": { + ".": { + "types": "./dist/src/index.d.ts", + "default": "./dist/index.js" + }, + "./style.css": "./dist/style.css" + }, + "engines": { + "node": ">=14.0.0" + }, + "scripts": { + "clean": "rimraf ./dist ./temp", + "build": "vite build", + "watch": "vite build --watch", + "test": "vitest run", + "test:ui": "vitest --ui", + "test:ci": "vitest run --coverage --reporter=junit --reporter=default", + "lint": "eslint . --max-warnings=0", + "lint:fix": "eslint . --fix" + }, + "files": [ + "dist/**", + "!dist/test/**" + ], + "dependencies": { + "@fluentui/react-components": "~9.52.0", + "@fluentui/react-icons": "^2.0.240", + "react": "~18.3.1", + "react-dom": "~18.3.1" + }, + "devDependencies": { + "@babel/core": "^7.24.5", + "@types/node": "~18.11.19", + "@types/react-dom": "~18.3.0", + "@types/react": "~18.3.2", + "@vitejs/plugin-react": "~4.2.1", + "@vitest/coverage-v8": "^1.6.0", + "@vitest/ui": "^1.6.0", + "c8": "^9.1.0", + "rimraf": "~5.0.7", + "typescript": "~5.4.5", + "vite-plugin-checker": "^0.6.4", + "vite-plugin-dts": "^3.9.1", + "vite": "^5.2.11", + "vitest": "^1.6.0" + } +} diff --git a/packages/playground/src/react/hooks.ts b/packages/react-components/src/hooks.ts similarity index 100% rename from packages/playground/src/react/hooks.ts rename to packages/react-components/src/hooks.ts diff --git a/packages/react-components/src/index.ts b/packages/react-components/src/index.ts new file mode 100644 index 0000000000..01ca24165a --- /dev/null +++ b/packages/react-components/src/index.ts @@ -0,0 +1,2 @@ +export { useControllableValue } from "./hooks.js"; +export { Pane, SplitPane, type PaneProps, type SplitPaneProps } from "./split-pane/index.js"; diff --git a/packages/playground/src/react/split-pane/index.ts b/packages/react-components/src/split-pane/index.ts similarity index 56% rename from packages/playground/src/react/split-pane/index.ts rename to packages/react-components/src/split-pane/index.ts index 56b7be02e8..86a234dc1b 100644 --- a/packages/playground/src/react/split-pane/index.ts +++ b/packages/react-components/src/split-pane/index.ts @@ -1 +1,2 @@ +export { Pane, type PaneProps } from "./pane.js"; export { SplitPane, type SplitPaneProps } from "./split-pane.js"; diff --git a/packages/playground/src/react/split-pane/pane.tsx b/packages/react-components/src/split-pane/pane.tsx similarity index 90% rename from packages/playground/src/react/split-pane/pane.tsx rename to packages/react-components/src/split-pane/pane.tsx index 31e480a637..e105372554 100644 --- a/packages/playground/src/react/split-pane/pane.tsx +++ b/packages/react-components/src/split-pane/pane.tsx @@ -5,7 +5,7 @@ export interface PaneProps { minSize?: number | string; } -export default function Pane({ +export function Pane({ children, ...props }: PropsWithChildren & PaneProps>) { diff --git a/packages/playground/src/react/split-pane/sash-content.tsx b/packages/react-components/src/split-pane/sash-content.tsx similarity index 100% rename from packages/playground/src/react/split-pane/sash-content.tsx rename to packages/react-components/src/split-pane/sash-content.tsx diff --git a/packages/playground/src/react/split-pane/sash.tsx b/packages/react-components/src/split-pane/sash.tsx similarity index 100% rename from packages/playground/src/react/split-pane/sash.tsx rename to packages/react-components/src/split-pane/sash.tsx diff --git a/packages/playground/src/react/split-pane/split-pane.module.css b/packages/react-components/src/split-pane/split-pane.module.css similarity index 100% rename from packages/playground/src/react/split-pane/split-pane.module.css rename to packages/react-components/src/split-pane/split-pane.module.css diff --git a/packages/playground/src/react/split-pane/split-pane.tsx b/packages/react-components/src/split-pane/split-pane.tsx similarity index 99% rename from packages/playground/src/react/split-pane/split-pane.tsx rename to packages/react-components/src/split-pane/split-pane.tsx index 7a07b2cacb..03176b48c7 100644 --- a/packages/playground/src/react/split-pane/split-pane.tsx +++ b/packages/react-components/src/split-pane/split-pane.tsx @@ -10,7 +10,7 @@ import { type MouseEvent, } from "react"; import { useControllableValue } from "../hooks.js"; -import Pane, { type PaneProps } from "./pane.js"; +import { Pane, type PaneProps } from "./pane.js"; import { SashContent } from "./sash-content.js"; import { Sash } from "./sash.js"; import style from "./split-pane.module.css"; diff --git a/packages/react-components/tsconfig.config.json b/packages/react-components/tsconfig.config.json new file mode 100644 index 0000000000..79fb341f39 --- /dev/null +++ b/packages/react-components/tsconfig.config.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": {} +} diff --git a/packages/react-components/tsconfig.json b/packages/react-components/tsconfig.json new file mode 100644 index 0000000000..062db7257f --- /dev/null +++ b/packages/react-components/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "incremental": false, + "composite": false, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "sourceMap": false, + "resolveJsonModule": true, + "noEmit": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "jsx": "react-jsx", + "lib": ["DOM", "ES2022"], + "types": ["vite/client"] + }, + "include": ["src"] +} diff --git a/packages/react-components/vite.config.ts b/packages/react-components/vite.config.ts new file mode 100644 index 0000000000..4c7ff253cc --- /dev/null +++ b/packages/react-components/vite.config.ts @@ -0,0 +1,46 @@ +import react from "@vitejs/plugin-react"; +import { readFileSync } from "fs"; +import { dirname, resolve } from "path"; +import { fileURLToPath } from "url"; +import { defineConfig } from "vite"; +import checker from "vite-plugin-checker"; +import dts from "vite-plugin-dts"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +const packageJson = JSON.parse(readFileSync(resolve(__dirname, "package.json")).toString()); +const dependencies = Object.keys(packageJson.dependencies); +const externals = [...dependencies]; + +export default defineConfig({ + build: { + target: "esnext", + minify: false, + chunkSizeWarningLimit: 3000, + lib: { + entry: { + index: "src/index.ts", + }, + formats: ["es"], + }, + + rollupOptions: { + external: externals, + }, + }, + plugins: [ + react({}), + dts({ + logLevel: "silent", // checker reports the errors + }), + checker({ + // e.g. use TypeScript check + typescript: true, + }), + ], + server: { + fs: { + strict: false, + }, + }, +}); diff --git a/packages/react-components/vitest.config.ts b/packages/react-components/vitest.config.ts new file mode 100644 index 0000000000..15eeaceb85 --- /dev/null +++ b/packages/react-components/vitest.config.ts @@ -0,0 +1,4 @@ +import { defineConfig, mergeConfig } from "vitest/config"; +import { defaultTypeSpecVitestConfig } from "../../vitest.workspace.js"; + +export default mergeConfig(defaultTypeSpecVitestConfig, defineConfig({})); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d360d6295..528bd89308 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -405,6 +405,9 @@ importers: '@typespec/compiler': specifier: workspace:~ version: link:../compiler + '@typespec/react-components': + specifier: workspace:~ + version: link:../react-components '@vitejs/plugin-react': specifier: ~4.2.1 version: 4.2.1(vite@5.2.11) @@ -815,6 +818,9 @@ importers: '@types/swagger-ui-dist': specifier: ~3.30.4 version: 3.30.4 + '@typespec/react-components': + specifier: workspace:~ + version: link:../react-components '@vitejs/plugin-react': specifier: ~4.2.1 version: 4.2.1(vite@5.2.11) @@ -1004,6 +1010,64 @@ importers: specifier: ^1.6.0 version: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) + packages/react-components: + dependencies: + '@fluentui/react-components': + specifier: ~9.52.0 + version: 9.52.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': + specifier: ^2.0.240 + version: 2.0.240(react@18.3.1) + react: + specifier: ~18.3.1 + version: 18.3.1 + react-dom: + specifier: ~18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@babel/core': + specifier: ^7.24.5 + version: 7.24.5 + '@types/node': + specifier: ~18.11.19 + version: 18.11.19 + '@types/react': + specifier: ~18.3.2 + version: 18.3.2 + '@types/react-dom': + specifier: ~18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ~4.2.1 + version: 4.2.1(vite@5.2.11) + '@vitest/coverage-v8': + specifier: ^1.6.0 + version: 1.6.0(vitest@1.6.0) + '@vitest/ui': + specifier: ^1.6.0 + version: 1.6.0(vitest@1.6.0) + c8: + specifier: ^9.1.0 + version: 9.1.0 + rimraf: + specifier: ~5.0.7 + version: 5.0.7 + typescript: + specifier: ~5.4.5 + version: 5.4.5 + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@18.11.19) + vite-plugin-checker: + specifier: ^0.6.4 + version: 0.6.4(eslint@8.57.0)(typescript@5.4.5)(vite@5.2.11) + vite-plugin-dts: + specifier: ^3.9.1 + version: 3.9.1(@types/node@18.11.19)(typescript@5.4.5)(vite@5.2.11) + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) + packages/rest: devDependencies: '@types/node': @@ -1817,10 +1881,6 @@ packages: '@babel/highlight': 7.24.2 picocolors: 1.0.1 - /@babel/compat-data@7.24.1: - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} - engines: {node: '>=6.9.0'} - /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} engines: {node: '>=6.9.0'} @@ -1882,7 +1942,7 @@ packages: resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.1 + '@babel/compat-data': 7.24.4 '@babel/helper-validator-option': 7.23.5 browserslist: 4.23.0 lru-cache: 5.1.1 @@ -2238,7 +2298,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -2313,7 +2373,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -2621,7 +2681,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/helper-simple-access': 7.24.5 /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.5): @@ -2672,7 +2732,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.5): @@ -2782,7 +2842,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 /@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.24.5): resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} @@ -2836,7 +2896,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.5): @@ -2878,7 +2938,7 @@ packages: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) '@babel/types': 7.24.5 dev: false @@ -2891,7 +2951,7 @@ packages: dependencies: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 dev: false /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.5): @@ -2996,7 +3056,7 @@ packages: '@babel/core': 7.24.5 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.24.5) - '@babel/helper-plugin-utils': 7.24.0 + '@babel/helper-plugin-utils': 7.24.5 '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.5): @@ -3044,7 +3104,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.24.1 + '@babel/compat-data': 7.24.4 '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.0 @@ -18581,6 +18641,7 @@ packages: /rimraf@2.6.3: resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -18588,6 +18649,7 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 From 009187ed0b45c1263b61b560529cdef532944161 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Fri, 14 Jun 2024 15:09:53 -0700 Subject: [PATCH 04/70] navigation with split pane --- .../src/react/tree-navigation.tsx | 156 ++++++++++++++++ .../src/react/type-graph.tsx | 176 ++---------------- 2 files changed, 169 insertions(+), 163 deletions(-) create mode 100644 packages/html-program-viewer/src/react/tree-navigation.tsx diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx new file mode 100644 index 0000000000..95910c2eb9 --- /dev/null +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -0,0 +1,156 @@ +import { Tree, TreeItem, TreeItemLayout } from "@fluentui/react-components"; +import type { Namespace, Type } from "@typespec/compiler"; +import { getNamespaceFullName } from "@typespec/compiler"; +import { useProgram } from "./program-context.js"; +import style from "./tree-navigation.module.css"; + +function expandNamespaces(namespace: Namespace): Namespace[] { + return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; +} + +export const TreeNavigation = () => { + const program = useProgram(); + const root = program.checker!.getGlobalNamespaceType(); + const namespaces = expandNamespaces(root); + + return ( + + {namespaces.map((namespace) => ( + + ))} + + ); +}; + +const NamespaceTreeNode = ({ namespace }: { namespace: Namespace }) => { + const id = getNamespaceFullName(namespace); + return ; +}; + +type NamedType = Type & { name: string }; +type EntityTreeNodeProps = { + readonly path: string; + readonly type: T; + readonly name?: string; +}; + +const omittedProps = [ + "entityKind", + "kind", + "name", + "node", + "symbol", + "namespace", + "templateNode", + "templateArguments", + "templateMapper", + "instantiationParameters", + "decorators", + "projectionBase", + "projectionsByName", + "projectionSource", + "projector", + "projections", + "isFinished", +] as const; +const omittedPropsSet = new Set(omittedProps); + +interface Prop { + name: string; + value: Map; + description?: string; +} + +const EntityTreeNode = ({ path, type, name }: EntityTreeNodeProps) => { + name ??= type.name; + const typeRendering = (TypeRendering as any)[type.kind]; + const props: Prop[] = Object.entries(type) + .map(([key, value]) => { + if (omittedPropsSet.has(key as any)) { + return undefined; + } + const action: PropertyAction | undefined = typeRendering?.[key] as PropertyAction; + if (action !== "nested") { + return undefined; + } + + return { + name: key, + value: value, + } satisfies Prop; + }) + .filter((x): x is Prop => Boolean(x)); + return ( + + {name} + {props.length > 0 && ( + path + "." + x.name)}> + {props.map((x) => { + const propPath = path + "." + x.name; + return ; + })} + + )} + + ); +}; + +interface EntityPropTreeNode { + path: string; + prop: Prop; +} +const EntityPropTreeNode = ({ path, prop }: EntityPropTreeNode) => { + const empty = prop.value.size === 0; + return ( + + + {prop.name} {empty ? "(0)" : ""} + + + + ); +}; + +const ItemListTree = ({ path, items }: { path: string; items: Map }) => { + return ( + + {Array.from(items.entries()).map(([key, value]) => { + return ; + })} + + ); +}; + +type PropertyAction = "skip" | "ref" | "nested" | "value"; + +const TypeRendering = { + Namespace: { + namespaces: "skip", + models: "nested", + scalars: "nested", + interfaces: "nested", + operations: "nested", + unions: "nested", + enums: "nested", + decoratorDeclarations: "nested", + functionDeclarations: "nested", + }, + Interace: { + operations: "nested", + sourceInterfaces: "ref", + }, + Operation: { + interface: "skip", + parameters: "nested", + returnType: "ref", + sourceOperation: "ref", + }, + Model: { + indexer: "skip", + baseModel: "ref", + derivedModels: "ref", + properties: "nested", + sourceModel: "ref", + sourceModels: "value", + }, +}; diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 6d8fbb62d7..0a345bfa01 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -1,20 +1,10 @@ -import { - FluentProvider, - Tree, - TreeItem, - TreeItemLayout, - webLightTheme, -} from "@fluentui/react-components"; -import type { Namespace, Program, Type } from "@typespec/compiler"; -import { getNamespaceFullName } from "@typespec/compiler"; +import { FluentProvider, webLightTheme } from "@fluentui/react-components"; +import type { Program } from "@typespec/compiler"; +import { Pane, SplitPane } from "@typespec/react-components"; import { type FunctionComponent } from "react"; import ReactDOMServer from "react-dom/server"; -import { ProgramProvider, useProgram } from "./program-context.js"; -import style from "./tree-navigation.module.css"; - -function expandNamespaces(namespace: Namespace): Namespace[] { - return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; -} +import { ProgramProvider } from "./program-context.js"; +import { TreeNavigation } from "./tree-navigation.js"; export function renderProgram(program: Program) { const html = ReactDOMServer.renderToString( @@ -32,154 +22,14 @@ export interface TypeGraphProps { export const TypeGraph: FunctionComponent = ({ program }) => { return ( - + + + + + +
    Content
    +
    +
    ); }; - -const TreeNavigation = () => { - const program = useProgram(); - const root = program.checker!.getGlobalNamespaceType(); - const namespaces = expandNamespaces(root); - - return ( - - {namespaces.map((namespace) => ( - - ))} - - ); -}; - -const NamespaceTreeNode = ({ namespace }: { namespace: Namespace }) => { - const id = getNamespaceFullName(namespace); - return ; -}; - -type NamedType = Type & { name: string }; -type EntityTreeNodeProps = { - readonly path: string; - readonly type: T; - readonly name?: string; -}; - -const omittedProps = [ - "entityKind", - "kind", - "name", - "node", - "symbol", - "namespace", - "templateNode", - "templateArguments", - "templateMapper", - "instantiationParameters", - "decorators", - "projectionBase", - "projectionsByName", - "projectionSource", - "projector", - "projections", - "isFinished", -] as const; -const omittedPropsSet = new Set(omittedProps); - -interface Prop { - name: string; - value: Map; - description?: string; -} - -const EntityTreeNode = ({ path, type, name }: EntityTreeNodeProps) => { - name ??= type.name; - const typeRendering = (TypeRendering as any)[type.kind]; - const props: Prop[] = Object.entries(type) - .map(([key, value]) => { - if (omittedPropsSet.has(key as any)) { - return undefined; - } - const action: PropertyAction | undefined = typeRendering?.[key] as PropertyAction; - if (action !== "nested") { - return undefined; - } - - return { - name: key, - value: value, - } satisfies Prop; - }) - .filter((x): x is Prop => Boolean(x)); - return ( - - {name} - {props.length > 0 && ( - path + "." + x.name)}> - {props.map((x) => { - const propPath = path + "." + x.name; - return ; - })} - - )} - - ); -}; - -interface EntityPropTreeNode { - path: string; - prop: Prop; -} -const EntityPropTreeNode = ({ path, prop }: EntityPropTreeNode) => { - const empty = prop.value.size === 0; - return ( - - - {prop.name} {empty ? "(0)" : ""} - - - - ); -}; - -const ItemListTree = ({ path, items }: { path: string; items: Map }) => { - return ( - - {Array.from(items.entries()).map(([key, value]) => { - return ; - })} - - ); -}; - -type PropertyAction = "skip" | "ref" | "nested" | "value"; - -const TypeRendering = { - Namespace: { - namespaces: "skip", - models: "nested", - scalars: "nested", - interfaces: "nested", - operations: "nested", - unions: "nested", - enums: "nested", - decoratorDeclarations: "nested", - functionDeclarations: "nested", - }, - Interace: { - operations: "nested", - sourceInterfaces: "ref", - }, - Operation: { - interface: "skip", - parameters: "nested", - returnType: "ref", - sourceOperation: "ref", - }, - Model: { - indexer: "skip", - baseModel: "ref", - derivedModels: "ref", - properties: "nested", - sourceModel: "ref", - sourceModels: "value", - }, -}; From a1b6fd4298718359b9ae01d92f92c44173db0041 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Fri, 14 Jun 2024 15:13:14 -0700 Subject: [PATCH 05/70] Fix console errors --- packages/html-program-viewer/src/react/tree-navigation.tsx | 2 +- packages/html-program-viewer/src/react/type-graph.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 95910c2eb9..8471fab9a8 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -115,7 +115,7 @@ const ItemListTree = ({ path, items }: { path: string; items: Map {Array.from(items.entries()).map(([key, value]) => { - return ; + return ; })} ); diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 0a345bfa01..cd8ff8306f 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -22,7 +22,7 @@ export interface TypeGraphProps { export const TypeGraph: FunctionComponent = ({ program }) => { return ( - + From 264ed2e8b9d850a55cdf440fa81a3d6badda8f22 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 13:57:56 -0700 Subject: [PATCH 06/70] Compute separately --- .../src/react/tree-navigation.tsx | 158 +++--------------- .../src/react/type-config.ts | 31 ++++ .../src/react/type-graph.module.css | 4 + .../src/react/type-graph.tsx | 3 +- .../src/react/use-tree-navigation.ts | 92 ++++++++++ 5 files changed, 150 insertions(+), 138 deletions(-) create mode 100644 packages/html-program-viewer/src/react/type-config.ts create mode 100644 packages/html-program-viewer/src/react/type-graph.module.css create mode 100644 packages/html-program-viewer/src/react/use-tree-navigation.ts diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 8471fab9a8..3c7bdb9ec1 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,156 +1,40 @@ import { Tree, TreeItem, TreeItemLayout } from "@fluentui/react-components"; -import type { Namespace, Type } from "@typespec/compiler"; -import { getNamespaceFullName } from "@typespec/compiler"; -import { useProgram } from "./program-context.js"; +import type { Type } from "@typespec/compiler"; import style from "./tree-navigation.module.css"; +import { useTreeNavigation, type TypeGraphNode } from "./use-tree-navigation.js"; -function expandNamespaces(namespace: Namespace): Namespace[] { - return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; +export interface TreeNavigationProps { + onSelectionChange?: (path: string, type: Type) => void; } -export const TreeNavigation = () => { - const program = useProgram(); - const root = program.checker!.getGlobalNamespaceType(); - const namespaces = expandNamespaces(root); +export const TreeNavigation = (props: TreeNavigationProps) => { + const program = useTreeNavigation(); return ( - {namespaces.map((namespace) => ( - - ))} + ); }; -const NamespaceTreeNode = ({ namespace }: { namespace: Namespace }) => { - const id = getNamespaceFullName(namespace); - return ; -}; - -type NamedType = Type & { name: string }; -type EntityTreeNodeProps = { - readonly path: string; - readonly type: T; - readonly name?: string; -}; - -const omittedProps = [ - "entityKind", - "kind", - "name", - "node", - "symbol", - "namespace", - "templateNode", - "templateArguments", - "templateMapper", - "instantiationParameters", - "decorators", - "projectionBase", - "projectionsByName", - "projectionSource", - "projector", - "projections", - "isFinished", -] as const; -const omittedPropsSet = new Set(omittedProps); - -interface Prop { - name: string; - value: Map; - description?: string; -} - -const EntityTreeNode = ({ path, type, name }: EntityTreeNodeProps) => { - name ??= type.name; - const typeRendering = (TypeRendering as any)[type.kind]; - const props: Prop[] = Object.entries(type) - .map(([key, value]) => { - if (omittedPropsSet.has(key as any)) { - return undefined; - } - const action: PropertyAction | undefined = typeRendering?.[key] as PropertyAction; - if (action !== "nested") { - return undefined; - } - - return { - name: key, - value: value, - } satisfies Prop; - }) - .filter((x): x is Prop => Boolean(x)); +const TreeNodeItemsUI = ({ nodes }: { nodes: TypeGraphNode[] }) => { return ( - - {name} - {props.length > 0 && ( - path + "." + x.name)}> - {props.map((x) => { - const propPath = path + "." + x.name; - return ; - })} - - )} - + <> + {nodes.map((node) => { + return ; + })} + ); }; - -interface EntityPropTreeNode { - path: string; - prop: Prop; -} -const EntityPropTreeNode = ({ path, prop }: EntityPropTreeNode) => { - const empty = prop.value.size === 0; +const TreeNodeUI = ({ node }: { node: TypeGraphNode }) => { return ( - - - {prop.name} {empty ? "(0)" : ""} - - + + {node.name} + {node.children.length > 0 && ( + + + + )} ); }; - -const ItemListTree = ({ path, items }: { path: string; items: Map }) => { - return ( - - {Array.from(items.entries()).map(([key, value]) => { - return ; - })} - - ); -}; - -type PropertyAction = "skip" | "ref" | "nested" | "value"; - -const TypeRendering = { - Namespace: { - namespaces: "skip", - models: "nested", - scalars: "nested", - interfaces: "nested", - operations: "nested", - unions: "nested", - enums: "nested", - decoratorDeclarations: "nested", - functionDeclarations: "nested", - }, - Interace: { - operations: "nested", - sourceInterfaces: "ref", - }, - Operation: { - interface: "skip", - parameters: "nested", - returnType: "ref", - sourceOperation: "ref", - }, - Model: { - indexer: "skip", - baseModel: "ref", - derivedModels: "ref", - properties: "nested", - sourceModel: "ref", - sourceModels: "value", - }, -}; diff --git a/packages/html-program-viewer/src/react/type-config.ts b/packages/html-program-viewer/src/react/type-config.ts new file mode 100644 index 0000000000..5a52aa6512 --- /dev/null +++ b/packages/html-program-viewer/src/react/type-config.ts @@ -0,0 +1,31 @@ +export const TypeConfig = { + Namespace: { + namespaces: "skip", + models: "nested", + scalars: "nested", + interfaces: "nested", + operations: "nested", + unions: "nested", + enums: "nested", + decoratorDeclarations: "nested", + functionDeclarations: "nested", + }, + Interace: { + operations: "nested", + sourceInterfaces: "ref", + }, + Operation: { + interface: "skip", + parameters: "nested", + returnType: "ref", + sourceOperation: "ref", + }, + Model: { + indexer: "skip", + baseModel: "ref", + derivedModels: "ref", + properties: "nested", + sourceModel: "ref", + sourceModels: "value", + }, +}; diff --git a/packages/html-program-viewer/src/react/type-graph.module.css b/packages/html-program-viewer/src/react/type-graph.module.css new file mode 100644 index 0000000000..0a05a61ec6 --- /dev/null +++ b/packages/html-program-viewer/src/react/type-graph.module.css @@ -0,0 +1,4 @@ +.tree-navigation-pane { + height: 100%; + overflow-y: auto; +} diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index cd8ff8306f..23002321ad 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -5,6 +5,7 @@ import { type FunctionComponent } from "react"; import ReactDOMServer from "react-dom/server"; import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; +import style from "./type-graph.module.css"; export function renderProgram(program: Program) { const html = ReactDOMServer.renderToString( @@ -23,7 +24,7 @@ export const TypeGraph: FunctionComponent = ({ program }) => { return ( - + diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.ts b/packages/html-program-viewer/src/react/use-tree-navigation.ts new file mode 100644 index 0000000000..984d313950 --- /dev/null +++ b/packages/html-program-viewer/src/react/use-tree-navigation.ts @@ -0,0 +1,92 @@ +import { getNamespaceFullName, type Namespace, type Program, type Type } from "@typespec/compiler"; +import { useMemo } from "react"; +import { useProgram } from "./program-context.js"; +import { TypeConfig } from "./type-config.js"; + +export interface TypeGraphNode { + readonly id: string; + readonly name: string; + readonly children: TypeGraphNode[]; +} +export interface TreeNavigation { + readonly tree: TypeGraphNode; + // select(path: string | Type); +} + +function expandNamespaces(namespace: Namespace): Namespace[] { + return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; +} + +export function useTreeNavigation(): TreeNavigation { + const program = useProgram(); + + const tree = useMemo(() => computeTree(program), [program]); + + return { tree }; +} + +function computeTree(program: Program): TypeGraphNode { + const root = program.checker!.getGlobalNamespaceType(); + + const namespaces = expandNamespaces(root); + + return { + id: "$", + name: "", + children: namespaces.map((ns) => { + return computeNode("$", ns, getNamespaceFullName(ns) || "(global)"); + }), + }; +} + +type NamedType = Type & { name: string }; + +function computeNode(parentPath: string, type: NamedType, name?: string) { + const path = parentPath + "." + type.name; + + const typeRendering = (TypeConfig as any)[type.kind]; + const children: TypeGraphNode[] = Object.entries(type) + .filter(([key]) => typeRendering?.[key] === "nested") + .map(([key, value]): TypeGraphNode => { + return computeItemList(path + "." + key, key, value); + }); + + return { + id: path, + name: name ?? type.name, + children, + }; +} + +function computeItemList(path: string, name: string, items: Map) { + return { + id: path, + name, + children: Array.from(items.entries()).map(([key, value]) => { + return computeNode(path, value, key); + }), + }; +} + +const omittedProps = [ + "entityKind", + "kind", + "name", + "node", + "symbol", + "namespace", + "templateNode", + "templateArguments", + "templateMapper", + "instantiationParameters", + "decorators", + "projectionBase", + "projectionsByName", + "projectionSource", + "projector", + "projections", + "isFinished", +] as const; +const omittedPropsSet = new Set(omittedProps); + +type PropertyAction = "skip" | "ref" | "nested" | "value"; From c259c7d3106dbb9c4761894062216840326b6527 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 14:12:01 -0700 Subject: [PATCH 07/70] Navigator --- .../src/react/tree-navigation.tsx | 32 ++++++++++++++----- .../src/react/type-graph.tsx | 11 +++++-- .../src/react/use-tree-navigation.ts | 16 ++++++---- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 3c7bdb9ec1..d4b43222c3 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,18 +1,34 @@ -import { Tree, TreeItem, TreeItemLayout } from "@fluentui/react-components"; -import type { Type } from "@typespec/compiler"; +import { + Tree, + TreeItem, + TreeItemLayout, + type TreeOpenChangeData, +} from "@fluentui/react-components"; +import { useCallback } from "react"; import style from "./tree-navigation.module.css"; -import { useTreeNavigation, type TypeGraphNode } from "./use-tree-navigation.js"; +import { type TreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; export interface TreeNavigationProps { - onSelectionChange?: (path: string, type: Type) => void; + readonly nav: TreeNavigator; } -export const TreeNavigation = (props: TreeNavigationProps) => { - const program = useTreeNavigation(); +export const TreeNavigation = ({ nav }: TreeNavigationProps) => { + const onOpenChange = useCallback( + (evt: any, data: TreeOpenChangeData) => { + console.log("onOpenChange", data.value); + nav.selectPath(data.value.toString()); + }, + [nav.selectPath] + ); return ( - - + + ); }; diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 23002321ad..934d371e68 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -6,6 +6,7 @@ import ReactDOMServer from "react-dom/server"; import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; import style from "./type-graph.module.css"; +import { useTreeNavigator, type TreeNavigator } from "./use-tree-navigation.js"; export function renderProgram(program: Program) { const html = ReactDOMServer.renderToString( @@ -21,16 +22,22 @@ export interface TypeGraphProps { } export const TypeGraph: FunctionComponent = ({ program }) => { + const nav = useTreeNavigator(program); + return ( - + -
    Content
    +
    ); }; + +const TypeGraphContent = ({ nav }: { nav: TreeNavigator }) => { + return
    Nav: {nav.selectedPath}
    ; +}; diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.ts b/packages/html-program-viewer/src/react/use-tree-navigation.ts index 984d313950..33b9bcdb58 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.ts +++ b/packages/html-program-viewer/src/react/use-tree-navigation.ts @@ -1,6 +1,5 @@ import { getNamespaceFullName, type Namespace, type Program, type Type } from "@typespec/compiler"; -import { useMemo } from "react"; -import { useProgram } from "./program-context.js"; +import { useMemo, useState } from "react"; import { TypeConfig } from "./type-config.js"; export interface TypeGraphNode { @@ -8,21 +7,24 @@ export interface TypeGraphNode { readonly name: string; readonly children: TypeGraphNode[]; } -export interface TreeNavigation { + +export interface TreeNavigator { + readonly selectedPath?: string; + readonly selectPath: (path: string) => void; readonly tree: TypeGraphNode; - // select(path: string | Type); } function expandNamespaces(namespace: Namespace): Namespace[] { return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; } -export function useTreeNavigation(): TreeNavigation { - const program = useProgram(); +export function useTreeNavigator(program: Program): TreeNavigator { + const [selectedPath, selectPath] = useState(""); const tree = useMemo(() => computeTree(program), [program]); - return { tree }; + console.log("Strate", selectedPath); + return { tree, selectedPath, selectPath }; } function computeTree(program: Program): TypeGraphNode { From f0b02d9ab314ab8405e8994d7babe43392546758 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 14:51:56 -0700 Subject: [PATCH 08/70] Basic list --- packages/html-program-viewer/package.json | 5 +- .../src/react/list-node-view.tsx | 40 ++++ .../src/react/type-graph.module.css | 8 + .../src/react/type-graph.tsx | 16 +- .../src/react/use-tree-navigation.ts | 50 +++-- pnpm-lock.yaml | 171 ++++++++++++++++++ 6 files changed, 274 insertions(+), 16 deletions(-) create mode 100644 packages/html-program-viewer/src/react/list-node-view.tsx diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 02beab2e83..526e11e51f 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -53,14 +53,15 @@ "dependencies": { "@fluentui/react-components": "~9.52.0", "@fluentui/react-icons": "^2.0.240", + "@fluentui/react-list-preview": "^0.2.8", "react": "~18.3.1", "react-dom": "~18.3.1" }, "devDependencies": { "@babel/core": "^7.24.5", "@types/node": "~18.11.19", - "@types/react-dom": "~18.3.0", "@types/react": "~18.3.2", + "@types/react-dom": "~18.3.0", "@typespec/compiler": "workspace:~", "@typespec/react-components": "workspace:~", "@vitejs/plugin-react": "~4.2.1", @@ -69,9 +70,9 @@ "c8": "^9.1.0", "rimraf": "~5.0.7", "typescript": "~5.4.5", + "vite": "^5.2.11", "vite-plugin-checker": "^0.6.4", "vite-plugin-dts": "^3.9.1", - "vite": "^5.2.11", "vitest": "^1.6.0" } } diff --git a/packages/html-program-viewer/src/react/list-node-view.tsx b/packages/html-program-viewer/src/react/list-node-view.tsx new file mode 100644 index 0000000000..381088d778 --- /dev/null +++ b/packages/html-program-viewer/src/react/list-node-view.tsx @@ -0,0 +1,40 @@ +import { Card, CardHeader, Text } from "@fluentui/react-components"; +import { List, ListItem } from "@fluentui/react-list-preview"; +import { useCallback } from "react"; +import type { TreeNavigator, TypeGraphListNode, TypeGraphNode } from "./use-tree-navigation.js"; + +export interface ListNodeViewProps { + readonly nav: TreeNavigator; + readonly node: TypeGraphListNode; +} +export const ListNodeView = ({ nav, node }: ListNodeViewProps) => { + return ( + + + {node.name} + + } + > + + {node.children.map((item) => ( + + ))} + + {node.children.length === 0 && No items} + + + ); +}; + +const Item = ({ item, nav }: { nav: TreeNavigator; item: TypeGraphNode }) => { + const select = useCallback(() => { + nav.selectPath(item.id); + }, [nav.selectPath]); + return ( + + {item.name} + + ); +}; diff --git a/packages/html-program-viewer/src/react/type-graph.module.css b/packages/html-program-viewer/src/react/type-graph.module.css index 0a05a61ec6..501c7460bd 100644 --- a/packages/html-program-viewer/src/react/type-graph.module.css +++ b/packages/html-program-viewer/src/react/type-graph.module.css @@ -1,4 +1,12 @@ +.type-graph * { + box-sizing: border-box; +} + .tree-navigation-pane { height: 100%; overflow-y: auto; } + +.view-pane { + padding: 10px; +} diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 934d371e68..3f0c4cc6ca 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -3,6 +3,7 @@ import type { Program } from "@typespec/compiler"; import { Pane, SplitPane } from "@typespec/react-components"; import { type FunctionComponent } from "react"; import ReactDOMServer from "react-dom/server"; +import { ListNodeView } from "./list-node-view.js"; import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; import style from "./type-graph.module.css"; @@ -26,11 +27,11 @@ export const TypeGraph: FunctionComponent = ({ program }) => { return ( - + - + @@ -39,5 +40,14 @@ export const TypeGraph: FunctionComponent = ({ program }) => { }; const TypeGraphContent = ({ nav }: { nav: TreeNavigator }) => { - return
    Nav: {nav.selectedPath}
    ; + const node = nav.selectedNode; + + switch (node?.kind) { + case "type": + return
    Type: {(node.type as any).name}
    ; + case "list": + return ; + default: + return ; + } }; diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.ts b/packages/html-program-viewer/src/react/use-tree-navigation.ts index 33b9bcdb58..94d1a054b2 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.ts +++ b/packages/html-program-viewer/src/react/use-tree-navigation.ts @@ -2,16 +2,28 @@ import { getNamespaceFullName, type Namespace, type Program, type Type } from "@ import { useMemo, useState } from "react"; import { TypeConfig } from "./type-config.js"; -export interface TypeGraphNode { +export interface TypeGraphNodeBase { readonly id: string; readonly name: string; readonly children: TypeGraphNode[]; } +export interface TypeGraphTypeNode extends TypeGraphNodeBase { + readonly kind: "type"; + readonly type: Type; +} + +export interface TypeGraphListNode extends TypeGraphNodeBase { + readonly kind: "list"; +} + +export type TypeGraphNode = TypeGraphTypeNode | TypeGraphListNode; + export interface TreeNavigator { - readonly selectedPath?: string; + readonly selectedNode?: TypeGraphNode; + readonly selectedPath: string; readonly selectPath: (path: string) => void; - readonly tree: TypeGraphNode; + readonly tree: TypeGraphListNode; } function expandNamespaces(namespace: Namespace): Namespace[] { @@ -22,28 +34,41 @@ export function useTreeNavigator(program: Program): TreeNavigator { const [selectedPath, selectPath] = useState(""); const tree = useMemo(() => computeTree(program), [program]); + const nodes = useMemo(() => computeFlatTree(tree), [tree]); + const selectedNode = useMemo(() => nodes.get(selectedPath), [nodes, selectedPath]); + + return { tree, selectedPath, selectedNode, selectPath }; +} - console.log("Strate", selectedPath); - return { tree, selectedPath, selectPath }; +function computeFlatTree(node: TypeGraphNode): Map { + const nodes = new Map(); + const stack = [node]; + while (stack.length > 0) { + const current = stack.pop()!; + nodes.set(current.id, current); + stack.push(...current.children); + } + return nodes; } -function computeTree(program: Program): TypeGraphNode { +function computeTree(program: Program): TypeGraphListNode { const root = program.checker!.getGlobalNamespaceType(); const namespaces = expandNamespaces(root); return { + kind: "list", id: "$", - name: "", + name: "Type Graph", children: namespaces.map((ns) => { - return computeNode("$", ns, getNamespaceFullName(ns) || "(global)"); + return computeTypeNode("$", ns, getNamespaceFullName(ns) || "(global)"); }), }; } type NamedType = Type & { name: string }; -function computeNode(parentPath: string, type: NamedType, name?: string) { +function computeTypeNode(parentPath: string, type: NamedType, name?: string): TypeGraphTypeNode { const path = parentPath + "." + type.name; const typeRendering = (TypeConfig as any)[type.kind]; @@ -54,18 +79,21 @@ function computeNode(parentPath: string, type: NamedType, name?: string) { }); return { + kind: "type", id: path, + type, name: name ?? type.name, children, }; } -function computeItemList(path: string, name: string, items: Map) { +function computeItemList(path: string, name: string, items: Map): TypeGraphNode { return { + kind: "list", id: path, name, children: Array.from(items.entries()).map(([key, value]) => { - return computeNode(path, value, key); + return computeTypeNode(path, value, key); }), }; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 528bd89308..dc0cf5d31b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -383,6 +383,9 @@ importers: '@fluentui/react-icons': specifier: ^2.0.240 version: 2.0.240(react@18.3.1) + '@fluentui/react-list-preview': + specifier: ^0.2.8 + version: 0.2.8(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) react: specifier: ~18.3.1 version: 18.3.1 @@ -5157,6 +5160,32 @@ packages: - scheduler dev: false + /@fluentui/react-checkbox@9.2.28(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-s/pG0usH2/bJqXFZMyi114gDBDVpl/ExUeU91cgZVK3oHjbYNA7O67JZkfnV/k2y0yGOF3HJ43FdSZ6nrs+BFQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-field': 9.1.67(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.240(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-label': 9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-tabster': 9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler + dev: false + /@fluentui/react-combobox@9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): resolution: {integrity: sha512-O8g2R4/MQJrx3Bk8vCfzcgKoIY1dL6X4CJgBO8xArZ6vAEDxSgXQoDgY1PwnutJEFBsbC3d0BsAfjhhateNItg==} peerDependencies: @@ -5278,6 +5307,24 @@ packages: scheduler: 0.23.0 dev: false + /@fluentui/react-context-selector@9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-9I3WMQU3CZODngO/lYdIbS8gA7c5lpvHtoPqSwINfdKDxF3XsnSCxhBBeQ7rurxPD23eqVK9wlZq2JD2DN9iLg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + scheduler: '>=0.19.0 <=0.23.0' + dependencies: + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + scheduler: 0.23.0 + dev: false + /@fluentui/react-dialog@9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): resolution: {integrity: sha512-E/vcXe7s+hUyz8pQsUMGwVJFA/B9U4L2yOestTIGshj9kY/ijJxbgagr7M8/58rGHeiPPqxhaIuQA8SMtwni8w==} peerDependencies: @@ -5376,6 +5423,30 @@ packages: - scheduler dev: false + /@fluentui/react-field@9.1.67(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-yLcsVeff7cg5o5zGYlaElj+OMfePaen3h7ndr+K6o5qSxvQvm7mWz79DoKsjIp03gMVF0HsBxpI7K69y+HGVjg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-context-selector': 9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.240(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-label': 9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler + dev: false + /@fluentui/react-icons@2.0.240(react@18.3.1): resolution: {integrity: sha512-vvYAA5bKImFedfRWnlady/Imdz45lGpKyPhNXZVpDoKX1yub/QNtSlH9XctynteQt8cEyvzPtHPXZBgxDTtDlw==} peerDependencies: @@ -5492,6 +5563,19 @@ packages: react-is: 17.0.2 dev: false + /@fluentui/react-jsx-runtime@9.0.39(@types/react@18.3.2)(react@18.3.1): + resolution: {integrity: sha512-mfK3L68Gfu9rMkfg1iVT06rOOPeOZasy+nKJID451YfKiAQYy1Zy9bhaTRDoNrOQcu2jDEOZAxAPURZw5oGLtw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + react: 18.3.1 + react-is: 17.0.2 + dev: false + /@fluentui/react-label@9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-dYsx4w9Hk8VAhyt7ZU88u1eIbpchtmr0sEVSgXEVevtUo4R4mT5UnOESsUwLT4wMY0sevBm5AoXbNsnoPutQQg==} peerDependencies: @@ -5512,6 +5596,26 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@fluentui/react-label@9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PkzRsl86+AkSn6p26C0Y2AV4IxYUhbBV+lFNSwN/hVgiXwMVdUjPOZx4Nm4Fnvv5ctt/BVuaE0dB/nSSDsrnQw==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /@fluentui/react-link@9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-77ef/PM1G+8dHq3LNFvjM5kWu8mS65eoxAtyfwbKAJRNfrtKFc1XrTBOcnqipXAqEPilQ+vgpgz/i0ziFVPvHQ==} peerDependencies: @@ -5534,6 +5638,32 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false + /@fluentui/react-list-preview@0.2.8(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-M2nc/XvdeI0X1SWEDmOfRlzWozkrR39NuVvMJIWhif3OyeGFYNVSSpy/XEynU7WwONJl+gw9e4ftkfsB9g/USg==} + peerDependencies: + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-checkbox': 9.2.28(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-context-selector': 9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-tabster': 9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler + dev: false + /@fluentui/react-menu@9.14.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): resolution: {integrity: sha512-JelsSR1s5hUKaTSd/TqkKtKaTpiJ+bKHmKefoQ+xBDslwBngMMMVRo7rAQmdoGQwVeky44f3YsoMgD+re/8QdA==} peerDependencies: @@ -6091,6 +6221,27 @@ packages: tabster: 7.1.3 dev: false + /@fluentui/react-tabster@9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-35k5mWN73m94EcRKZKAjSbQroA35C+RA+sbWVlg40mNm4d9UYKyre0mblvaL+EVogQeoLUUtPLVvNu/cYxNdNg==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + keyborg: 2.6.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabster: 7.3.0 + dev: false + /@fluentui/react-tag-picker@9.0.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): resolution: {integrity: sha512-Zjlk/FAr1wCeCJk8fIjXPK3eInimsB64PhgHTRfR2PfvgtDgly0K1cZBStsm2c6SdEkJDkNqChFyvvUiVyb8fw==} peerDependencies: @@ -6337,6 +6488,19 @@ packages: - scheduler dev: false + /@fluentui/react-utilities@9.18.10(@types/react@18.3.2)(react@18.3.1): + resolution: {integrity: sha512-1yUFZrJyBO1qizHa20S35JATQwr0QoTZ5vBmov0K49BWxDpJxpiAClMpFaMlw0hj9cI7HMLFF8Y87OhUYvaheQ==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.2 + react: 18.3.1 + dev: false + /@fluentui/react-utilities@9.18.9(@types/react@18.3.2)(react@18.3.1): resolution: {integrity: sha512-no2k8vxNiJt7SbSzB8H4aHNTcKK08Bzqu6kbwrUXMEklQxEoC+e2BJ+2nzHJUdFqR4WUq0380dDFjjrBimIiWw==} peerDependencies: @@ -19593,6 +19757,13 @@ packages: tslib: 2.6.2 dev: false + /tabster@7.3.0: + resolution: {integrity: sha512-32w8YrKruie/X26YRnXWgf/OwOu/VbtDt0UgQo6hnZkAnO6dhEbznusNvDtGcD9m5FiKKi+Y/laI7Iaphvpmqw==} + dependencies: + keyborg: 2.6.0 + tslib: 2.6.2 + dev: false + /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} From efdcc06387f328ee42c2857ed4bfdd60bbf5951c Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 15:17:25 -0700 Subject: [PATCH 09/70] Basics --- packages/html-program-viewer/src/constants.ts | 28 ---------------- packages/html-program-viewer/src/index.ts | 1 - .../src/react/color-provider.tsx | 19 ----------- .../src/react/common.module.css | 11 +++++++ .../html-program-viewer/src/react/common.tsx | 13 +++++++- .../html-program-viewer/src/react/index.ts | 1 - .../src/react/list-node-view.tsx | 10 ++---- .../src/react/type-graph.tsx | 3 +- .../src/react/type-view/type-view.module.css | 5 +++ .../src/react/type-view/type-view.tsx | 33 +++++++++++++++++++ 10 files changed, 66 insertions(+), 58 deletions(-) delete mode 100644 packages/html-program-viewer/src/constants.ts delete mode 100644 packages/html-program-viewer/src/react/color-provider.tsx create mode 100644 packages/html-program-viewer/src/react/common.module.css create mode 100644 packages/html-program-viewer/src/react/type-view/type-view.module.css create mode 100644 packages/html-program-viewer/src/react/type-view/type-view.tsx diff --git a/packages/html-program-viewer/src/constants.ts b/packages/html-program-viewer/src/constants.ts deleted file mode 100644 index d2c9d87f85..0000000000 --- a/packages/html-program-viewer/src/constants.ts +++ /dev/null @@ -1,28 +0,0 @@ -const variablePrefix = `--tsp-tgv`; -export const ColorsVariables = { - background: `${variablePrefix}-background`, - dataKey: `${variablePrefix}-data-key`, - indentationGuide: `${variablePrefix}-indentation-guide`, - literal: `${variablePrefix}-literal`, - property: `${variablePrefix}-property`, - ref: `${variablePrefix}-ref`, - typeKind: `${variablePrefix}-type-kind`, - typeName: `${variablePrefix}-type-name`, -} as const; - -export type ColorVariable = keyof typeof ColorsVariables; -export type ColorPalette = Record; -export const DefaultColors: ColorPalette = { - background: "#f3f3f3", - dataKey: "#333333", - indentationGuide: "#777", - literal: "#5da713", - property: "#9c5d27", - ref: "#268bd2", - typeKind: "#7a3e9d", - typeName: "#333333", -}; - -export const Colors: typeof ColorsVariables = Object.fromEntries( - Object.entries(ColorsVariables).map(([k, v]) => [k, `var(${v}, ${(DefaultColors as any)[k]})`]) -) as any; diff --git a/packages/html-program-viewer/src/index.ts b/packages/html-program-viewer/src/index.ts index e75c2da87f..cd5bcc0701 100644 --- a/packages/html-program-viewer/src/index.ts +++ b/packages/html-program-viewer/src/index.ts @@ -1,2 +1 @@ -export type { ColorPalette } from "./constants.js"; export * from "./emitter.js"; diff --git a/packages/html-program-viewer/src/react/color-provider.tsx b/packages/html-program-viewer/src/react/color-provider.tsx deleted file mode 100644 index aecaa44197..0000000000 --- a/packages/html-program-viewer/src/react/color-provider.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { useMemo, type FunctionComponent, type ReactNode } from "react"; -import { ColorsVariables, type ColorPalette, type ColorVariable } from "../constants.js"; - -export interface ColorProviderProps { - colors: Partial; - children?: ReactNode; -} - -export const ColorProvider: FunctionComponent = ({ children, colors }) => { - const cssVariables = useMemo(() => { - const colorArray: [ColorVariable, string][] = Object.entries(colors) as any; - return Object.fromEntries( - colorArray.map(([key, value]) => { - return [ColorsVariables[key], value]; - }) - ); - }, [colors]); - return
    {children}
    ; -}; diff --git a/packages/html-program-viewer/src/react/common.module.css b/packages/html-program-viewer/src/react/common.module.css new file mode 100644 index 0000000000..bdfa49f053 --- /dev/null +++ b/packages/html-program-viewer/src/react/common.module.css @@ -0,0 +1,11 @@ +.mono { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.literal { + color: var(--colorPaletteLightGreenForeground2); +} + +.type-kind { + color: var(--colorPaletteBerryForeground2); +} diff --git a/packages/html-program-viewer/src/react/common.tsx b/packages/html-program-viewer/src/react/common.tsx index 278ee0135c..846a67fb2b 100644 --- a/packages/html-program-viewer/src/react/common.tsx +++ b/packages/html-program-viewer/src/react/common.tsx @@ -1,9 +1,20 @@ +import { mergeClasses } from "@fluentui/react-components"; +import type { Type } from "@typespec/compiler"; import type { FunctionComponent, ReactElement } from "react"; +import style from "./common.module.css"; + +export const Mono = ({ children, className }: { children: any; className?: string }) => ( + {children} +); export const Literal: FunctionComponent<{ children: any }> = ({ children }) => ( -
    {children}
    + {children} ); +export const TypeKind = ({ type }: { type: Type }) => { + return {type.kind}; +}; + export const KeyValueSection: FunctionComponent<{ children: ReactElement | ReactElement[] }> = ({ children, }) => { diff --git a/packages/html-program-viewer/src/react/index.ts b/packages/html-program-viewer/src/react/index.ts index 460751e144..75daa9d34b 100644 --- a/packages/html-program-viewer/src/react/index.ts +++ b/packages/html-program-viewer/src/react/index.ts @@ -1,2 +1 @@ -export { ColorProvider, type ColorProviderProps } from "./color-provider.js"; export { TypeGraph } from "./type-graph.js"; diff --git a/packages/html-program-viewer/src/react/list-node-view.tsx b/packages/html-program-viewer/src/react/list-node-view.tsx index 381088d778..19f5169ef0 100644 --- a/packages/html-program-viewer/src/react/list-node-view.tsx +++ b/packages/html-program-viewer/src/react/list-node-view.tsx @@ -16,10 +16,10 @@ export const ListNodeView = ({ nav, node }: ListNodeViewProps) => { {node.name} } - > + /> {node.children.map((item) => ( - + ))} {node.children.length === 0 && No items} @@ -32,9 +32,5 @@ const Item = ({ item, nav }: { nav: TreeNavigator; item: TypeGraphNode }) => { const select = useCallback(() => { nav.selectPath(item.id); }, [nav.selectPath]); - return ( - - {item.name} - - ); + return {item.name}; }; diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 3f0c4cc6ca..1f93d74263 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -7,6 +7,7 @@ import { ListNodeView } from "./list-node-view.js"; import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; import style from "./type-graph.module.css"; +import { TypeNodeView } from "./type-view/type-view.js"; import { useTreeNavigator, type TreeNavigator } from "./use-tree-navigation.js"; export function renderProgram(program: Program) { @@ -44,7 +45,7 @@ const TypeGraphContent = ({ nav }: { nav: TreeNavigator }) => { switch (node?.kind) { case "type": - return
    Type: {(node.type as any).name}
    ; + return ; case "list": return ; default: diff --git a/packages/html-program-viewer/src/react/type-view/type-view.module.css b/packages/html-program-viewer/src/react/type-view/type-view.module.css new file mode 100644 index 0000000000..1e34a28e4f --- /dev/null +++ b/packages/html-program-viewer/src/react/type-view/type-view.module.css @@ -0,0 +1,5 @@ +.header { + display: flex; + align-items: center; + gap: 10px; +} diff --git a/packages/html-program-viewer/src/react/type-view/type-view.tsx b/packages/html-program-viewer/src/react/type-view/type-view.tsx new file mode 100644 index 0000000000..0989f442f2 --- /dev/null +++ b/packages/html-program-viewer/src/react/type-view/type-view.tsx @@ -0,0 +1,33 @@ +import { Caption1, Card, CardHeader, Text } from "@fluentui/react-components"; +import { getDoc } from "@typespec/compiler"; +import { Mono, TypeKind } from "../common.js"; +import { useProgram } from "../program-context.js"; +import type { TreeNavigator, TypeGraphTypeNode } from "../use-tree-navigation.js"; +import style from "./type-view.module.css"; + +export interface TypeNodeViewProps { + readonly nav: TreeNavigator; + readonly node: TypeGraphTypeNode; +} + +export const TypeNodeView = ({ node }: TypeNodeViewProps) => { + const program = useProgram(); + + return ( + <> + + + + + {node.name} + +
    + } + description={{getDoc(program, node.type)}} + /> + + + ); +}; From a9161ee4013f31c97389e9eb36481c32a2d9bedf Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 16:33:33 -0700 Subject: [PATCH 10/70] Progress --- .../src/react/inspect-type/ui.module.css | 33 ++ .../src/react/inspect-type/ui.tsx | 205 +++++++++ .../src/react/type-config.ts | 52 +++ .../src/react/type-graph.module.css | 1 + .../src/react/type-ui-base.tsx | 41 -- .../src/react/type-view/type-view.tsx | 2 + .../src/react/ui.module.css | 0 packages/html-program-viewer/src/react/ui.tsx | 396 ------------------ .../src/react/use-tree-navigation.ts | 23 - 9 files changed, 293 insertions(+), 460 deletions(-) create mode 100644 packages/html-program-viewer/src/react/inspect-type/ui.module.css create mode 100644 packages/html-program-viewer/src/react/inspect-type/ui.tsx delete mode 100644 packages/html-program-viewer/src/react/type-ui-base.tsx delete mode 100644 packages/html-program-viewer/src/react/ui.module.css delete mode 100644 packages/html-program-viewer/src/react/ui.tsx diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/ui.module.css new file mode 100644 index 0000000000..9625023288 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspect-type/ui.module.css @@ -0,0 +1,33 @@ +.inspect-type li { + margin: 0; + list-style: none; + position: relative; +} + +.inspect-type ul { + padding: 0 0 0 10px; + margin: 0; +} + +.inspect-type { + background-color: var(--colorNeutralBackground2); + padding: 10px; +} + +.type-name { + margin-left: 5px; + color: var(--colorNeutralForeground2); +} + +.property { + color: var(--colorPaletteMarigoldForeground2); +} + +.named-type-ref { + color: var(--colorBrandForeground1); + text-decoration: none; +} + +.named-type-ref:hover { + text-decoration: underline; +} diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx new file mode 100644 index 0000000000..4408aad646 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -0,0 +1,205 @@ +import type { Entity, Type } from "@typespec/compiler"; +import { getTypeName } from "@typespec/compiler"; +import { type FunctionComponent, type ReactElement } from "react"; +import { inspect } from "../../inspect.js"; +import { getIdForType, isNamedUnion } from "../../utils.js"; +import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; +import { useProgram } from "../program-context.js"; +import { HiddenPropsSet, TypeConfig } from "../type-config.js"; +import style from "./ui.module.css"; + +export interface ItemListProps { + items: Map | T[]; + render: (t: T) => ReactElement | null; +} + +export const ItemList = (props: ItemListProps) => { + if (Array.isArray(props.items)) { + if (props.items.length === 0) { + return <>{"[]"}; + } + } else { + if (props.items.size === 0) { + return <>{"{}"}; + } + } + return ( + + {[...props.items.entries()].map(([k, v], i) => ( +
  • {props.render(v)}
  • + ))} +
    + ); +}; + +type NamedType = Type & { name: string }; + +interface TypeUIProps { + readonly entity: Entity; +} + +export const InspectType: FunctionComponent = ({ entity }) => { + return ( + + + + ); +}; + +const EntityUI: FunctionComponent = ({ entity }) => { + switch (entity.entityKind) { + case "Type": + return ; + default: + return null; + } +}; + +const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { + return ( +
    +
    + + {"name" in type ? type.name?.toString() : ""} +
    + +
    + ); +}; + +// function getDataProperty(type: Type): TypeUIBaseProperty { +// return { +// name: "data", +// description: "in program.stateMap()", +// value: , +// }; +// } + +const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { + const id = getIdForType(type); + const href = `#${id}`; + return ( +
    + {getTypeName(type)} + + ); +}; +const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { + switch (type.kind) { + case "Namespace": + case "Operation": + case "Interface": + case "Enum": + case "ModelProperty": + case "Scalar": + return ; + case "Model": + if (type.name === "") { + return ( + + + + ); + } else { + return ; + } + case "Union": + if (isNamedUnion(type)) { + return ; + } else { + return ( + <> + {[...type.variants.values()].map((variant, i) => { + return ( + + + {i < type.variants.size - 1 ? " | " : ""} + + ); + })} + + ); + } + + case "TemplateParameter": + return Template Param: {type.node.id.sv}; + case "String": + return "{type.value}"; + case "Number": + case "Boolean": + return <>{type.value}; + default: + return null; + } +}; + +const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { + const program = useProgram(); + const entries = [...program.stateMaps.entries()] + .map(([k, v]) => [k, v.get(undefined)?.get(type) as any]) + .filter(([k, v]) => !!v); + if (entries.length === 0) { + return null; + } + return ( + + {entries.map(([k, v], i) => ( +
    +
    {k.toString()}:
    {inspect(v)}
    +
    + ))} +
    + ); +}; + +const EntityProperties = ({ entity: type }: { entity: Entity }) => { + console.log("Type", type); + const properties = (TypeConfig as any)[(type as any).kind as any]; + const props = Object.entries(type) + .map(([key, value]) => { + if (HiddenPropsSet.has(key as any)) { + return undefined; + } + const action = properties?.[key] as "skip" | "ref" | "nested"; + if (action === "skip" || action === undefined) { + return undefined; + } + + const render = (x: Entity) => + action === "ref" ? : ; + let valueUI; + if (value === undefined) { + valueUI = value; + } else if (value.entityKind) { + valueUI = render(value); + } else if ( + typeof value === "object" && + "entries" in value && + typeof value.entries === "function" + ) { + valueUI = ; + } else { + valueUI = value; + } + return { + name: key, + value: valueUI, + }; + }) + .filter((x): x is any => Boolean(x)); + + return ( + + {props.map((prop) => { + return ( +
  • + + {prop.name} + + : {prop.value} +
  • + ); + })} +
    + ); +}; diff --git a/packages/html-program-viewer/src/react/type-config.ts b/packages/html-program-viewer/src/react/type-config.ts index 5a52aa6512..31a94ee51b 100644 --- a/packages/html-program-viewer/src/react/type-config.ts +++ b/packages/html-program-viewer/src/react/type-config.ts @@ -28,4 +28,56 @@ export const TypeConfig = { sourceModel: "ref", sourceModels: "value", }, + Scalar: { + baseScalar: "ref", + derivedScalars: "ref", + constructors: "nested", + }, + ModelProperty: { + model: "skip", + type: "ref", + optional: "value", + sourceProperty: "ref", + default: "value", + defaultValue: "value", + }, + Enum: { + members: "nested", + }, + EnumMember: { + enum: "skip", + sourceMember: "ref", + value: "value", + }, + Union: { + expression: "skip", + options: "skip", + variants: "nested", + }, + UnionVariant: { + union: "skip", + type: "ref", + }, }; + +const HiddenProps = [ + "entityKind", + "kind", + "name", + "node", + "symbol", + "namespace", + "templateNode", + "templateArguments", + "templateMapper", + "instantiationParameters", + "decorators", + "projectionBase", + "projectionsByName", + "projectionSource", + "projector", + "projections", + "isFinished", +] as const; + +export const HiddenPropsSet = new Set(HiddenProps); diff --git a/packages/html-program-viewer/src/react/type-graph.module.css b/packages/html-program-viewer/src/react/type-graph.module.css index 501c7460bd..5f430f77de 100644 --- a/packages/html-program-viewer/src/react/type-graph.module.css +++ b/packages/html-program-viewer/src/react/type-graph.module.css @@ -9,4 +9,5 @@ .view-pane { padding: 10px; + overflow-y: auto; } diff --git a/packages/html-program-viewer/src/react/type-ui-base.tsx b/packages/html-program-viewer/src/react/type-ui-base.tsx deleted file mode 100644 index cc46bc000b..0000000000 --- a/packages/html-program-viewer/src/react/type-ui-base.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type { Type } from "@typespec/compiler"; -import type { FunctionComponent } from "react"; -import { getIdForType } from "../utils.js"; -import { KeyValueSection } from "./common.js"; - -export interface TypeUIBaseProperty { - name: string; - value: any; - description?: string; -} - -export interface TypeUIBaseProps { - type: Type; - name: string; - /** - * Alternate id - * @default getIdForType(type) - */ - id?: string; - properties: TypeUIBaseProperty[]; -} - -export const TypeUIBase: FunctionComponent = (props) => { - const id = props.id ?? getIdForType(props.type); - const properties = props.properties.map((prop) => { - return ( -
  • - {prop.name}: {prop.value} -
  • - ); - }); - return ( -
    -
    - {props.type.kind} - {props.name} -
    - {properties} -
    - ); -}; diff --git a/packages/html-program-viewer/src/react/type-view/type-view.tsx b/packages/html-program-viewer/src/react/type-view/type-view.tsx index 0989f442f2..e23f98f300 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.tsx +++ b/packages/html-program-viewer/src/react/type-view/type-view.tsx @@ -1,6 +1,7 @@ import { Caption1, Card, CardHeader, Text } from "@fluentui/react-components"; import { getDoc } from "@typespec/compiler"; import { Mono, TypeKind } from "../common.js"; +import { InspectType } from "../inspect-type/ui.js"; import { useProgram } from "../program-context.js"; import type { TreeNavigator, TypeGraphTypeNode } from "../use-tree-navigation.js"; import style from "./type-view.module.css"; @@ -27,6 +28,7 @@ export const TypeNodeView = ({ node }: TypeNodeViewProps) => { } description={{getDoc(program, node.type)}} /> + ); diff --git a/packages/html-program-viewer/src/react/ui.module.css b/packages/html-program-viewer/src/react/ui.module.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/html-program-viewer/src/react/ui.tsx b/packages/html-program-viewer/src/react/ui.tsx deleted file mode 100644 index 7e6b1b7b45..0000000000 --- a/packages/html-program-viewer/src/react/ui.tsx +++ /dev/null @@ -1,396 +0,0 @@ -import type { - Entity, - Enum, - EnumMember, - Interface, - Model, - ModelProperty, - Namespace, - Operation, - Scalar, - Type, - Union, - UnionVariant, -} from "@typespec/compiler"; -import { getNamespaceFullName, getTypeName } from "@typespec/compiler"; -import { type FunctionComponent, type ReactElement } from "react"; -import { inspect } from "../inspect.js"; -import { getIdForType, isNamedUnion } from "../utils.js"; -import { KeyValueSection, Literal } from "./common.js"; -import { useProgram } from "./program-context.js"; -import { TypeUIBase, type TypeUIBaseProperty } from "./type-ui-base.js"; - -export interface ItemListProps { - items: Map | T[]; - render: (t: T) => ReactElement | null; -} - -export const ItemList = (props: ItemListProps) => { - if (Array.isArray(props.items)) { - if (props.items.length === 0) { - return <>{"[]"}; - } - } else { - if (props.items.size === 0) { - return <>{"{}"}; - } - } - return ( - - {[...props.items.entries()].map(([k, v], i) => ( -
  • {props.render(v)}
  • - ))} -
    - ); -}; - -type NamedType = Type & { name: string }; -const omittedProps = [ - "entityKind", - "kind", - "name", - "node", - "symbol", - "namespace", - "templateNode", - "templateArguments", - "templateMapper", - "instantiationParameters", - "decorators", - "projectionBase", - "projectionsByName", - "projectionSource", - "projector", - "projections", - "isFinished", -] as const; -const omittedPropsSet = new Set(omittedProps); -type OmittedProps = (typeof omittedProps)[number]; -type NamedTypeUIProps = { - type: T; - properties: Record, "skip" | "ref" | "nested" | "value">; - name?: string; -}; - -const NamedTypeUI = ({ type, name, properties }: NamedTypeUIProps) => { - name ??= type.name; - const propsUI: TypeUIBaseProperty[] = Object.entries(type) - .map(([key, value]) => { - if (omittedPropsSet.has(key as any)) { - return undefined; - } - const action = (properties as any)[key] as "skip" | "ref" | "nested"; - if (action === "skip") { - return undefined; - } - - const render = (x: Entity) => - action === "ref" ? : ; - let valueUI; - if (value === undefined) { - valueUI = value; - } else if (value.entityKind) { - valueUI = render(value); - } else if ( - typeof value === "object" && - "entries" in value && - typeof value.entries === "function" - ) { - valueUI = ; - } else { - valueUI = value; - } - return { - name: key, - value: valueUI, - } satisfies TypeUIBaseProperty; - }) - .filter((x): x is TypeUIBaseProperty => Boolean(x)); - return ( - - ); -}; - -interface TypeUIProps { - readonly entity: Entity; -} - -const EntityUI: FunctionComponent = ({ entity }) => { - switch (entity.entityKind) { - case "Type": - return ; - default: - return null; - } -}; - -const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { - switch (type.kind) { - case "Namespace": - return ; - case "Interface": - return ; - case "Operation": - return ; - case "Model": - return ; - case "Scalar": - return ; - case "ModelProperty": - return ; - case "Union": - return ; - case "UnionVariant": - return ; - case "Enum": - return ; - case "EnumMember": - return ; - default: - return null; - } -}; - -const NamespaceUI: FunctionComponent<{ type: Namespace }> = ({ type }) => { - const name = getNamespaceFullName(type) || "(global)"; - - return ( - - ); -}; - -const InterfaceUI: FunctionComponent<{ type: Interface }> = ({ type }) => { - return ( - - ); -}; - -const OperationUI: FunctionComponent<{ type: Operation }> = ({ type }) => { - return ( - - ); -}; - -function getDataProperty(type: Type): TypeUIBaseProperty { - return { - name: "data", - description: "in program.stateMap()", - value: , - }; -} - -const ModelUI: FunctionComponent<{ type: Model }> = ({ type }) => { - return ( - - ); -}; - -const ScalarUI: FunctionComponent<{ type: Scalar }> = ({ type }) => { - return ( - - ); -}; - -const ModelPropertyUI: FunctionComponent<{ type: ModelProperty }> = ({ type }) => { - return ( - - ); -}; - -const EnumUI: FunctionComponent<{ type: Enum }> = ({ type }) => { - return ( - - ); -}; - -const EnumMemberUI: FunctionComponent<{ type: EnumMember }> = ({ type }) => { - return ( - - ); -}; - -const UnionUI: FunctionComponent<{ type: Union }> = ({ type }) => { - if (!isNamedUnion(type)) { - return <>; - } - return ( - - ); -}; - -const UnionVariantUI: FunctionComponent<{ type: UnionVariant }> = ({ type }) => { - if (typeof type.name === "symbol") { - return <>; - } - return ( - - ); -}; - -const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { - const id = getIdForType(type); - const href = `#${id}`; - return ( - - {getTypeName(type)} - - ); -}; -const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { - switch (type.kind) { - case "Namespace": - case "Operation": - case "Interface": - case "Enum": - case "ModelProperty": - case "Scalar": - return ; - case "Model": - if (type.name === "") { - return ( - - - - ); - } else { - return ; - } - case "Union": - if (isNamedUnion(type)) { - return ; - } else { - return ( - <> - {[...type.variants.values()].map((variant, i) => { - return ( - - - {i < type.variants.size - 1 ? " | " : ""} - - ); - })} - - ); - } - - case "TemplateParameter": - return Template Param: {type.node.id.sv}; - case "String": - return "{type.value}"; - case "Number": - case "Boolean": - return <>{type.value}; - default: - return null; - } -}; - -const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { - const program = useProgram(); - const entries = [...program.stateMaps.entries()] - .map(([k, v]) => [k, v.get(undefined)?.get(type) as any]) - .filter(([k, v]) => !!v); - if (entries.length === 0) { - return null; - } - return ( - - {entries.map(([k, v], i) => ( -
    -
    {k.toString()}:
    {inspect(v)}
    -
    - ))} -
    - ); -}; diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.ts b/packages/html-program-viewer/src/react/use-tree-navigation.ts index 94d1a054b2..2648056904 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.ts +++ b/packages/html-program-viewer/src/react/use-tree-navigation.ts @@ -97,26 +97,3 @@ function computeItemList(path: string, name: string, items: Map Date: Sat, 15 Jun 2024 16:37:27 -0700 Subject: [PATCH 11/70] ADd basic type data --- .../html-program-viewer/src/react/inspect-type/ui.tsx | 2 +- .../src/react/type-view/type-view.module.css | 6 ++++++ .../src/react/type-view/type-view.tsx | 11 ++++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index 4408aad646..8481fb4540 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -133,7 +133,7 @@ const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { } }; -const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { +export const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { const program = useProgram(); const entries = [...program.stateMaps.entries()] .map(([k, v]) => [k, v.get(undefined)?.get(type) as any]) diff --git a/packages/html-program-viewer/src/react/type-view/type-view.module.css b/packages/html-program-viewer/src/react/type-view/type-view.module.css index 1e34a28e4f..6ddee54f00 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.module.css +++ b/packages/html-program-viewer/src/react/type-view/type-view.module.css @@ -1,3 +1,9 @@ +.type-view { + display: flex; + flex-direction: column; + gap: 20px; +} + .header { display: flex; align-items: center; diff --git a/packages/html-program-viewer/src/react/type-view/type-view.tsx b/packages/html-program-viewer/src/react/type-view/type-view.tsx index e23f98f300..0d0fe14f74 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.tsx +++ b/packages/html-program-viewer/src/react/type-view/type-view.tsx @@ -1,7 +1,7 @@ import { Caption1, Card, CardHeader, Text } from "@fluentui/react-components"; import { getDoc } from "@typespec/compiler"; import { Mono, TypeKind } from "../common.js"; -import { InspectType } from "../inspect-type/ui.js"; +import { InspectType, TypeData } from "../inspect-type/ui.js"; import { useProgram } from "../program-context.js"; import type { TreeNavigator, TypeGraphTypeNode } from "../use-tree-navigation.js"; import style from "./type-view.module.css"; @@ -15,7 +15,7 @@ export const TypeNodeView = ({ node }: TypeNodeViewProps) => { const program = useProgram(); return ( - <> +
    { /> - + + + Type data} /> + + +
    ); }; From 5811cf15c7a3ac2f16b7cb9990628a1d930f21bc Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 16:52:37 -0700 Subject: [PATCH 12/70] progress --- .../src/react/inspect-type/ui.module.css | 6 +- .../src/react/inspect-type/ui.tsx | 57 +++++++++---------- .../src/react/tree-navigation.tsx | 1 - 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/ui.module.css index 9625023288..9afb646637 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/ui.module.css @@ -11,7 +11,7 @@ .inspect-type { background-color: var(--colorNeutralBackground2); - padding: 10px; + padding: 10px 10px 10px 0; } .type-name { @@ -31,3 +31,7 @@ .named-type-ref:hover { text-decoration: underline; } + +.js-value { + color: var(--colorPaletteDarkOrangeForeground1); +} diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index 8481fb4540..282e82c99a 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -1,6 +1,6 @@ import type { Entity, Type } from "@typespec/compiler"; import { getTypeName } from "@typespec/compiler"; -import { type FunctionComponent, type ReactElement } from "react"; +import { type FunctionComponent, type ReactElement, type ReactNode } from "react"; import { inspect } from "../../inspect.js"; import { getIdForType, isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; @@ -67,14 +67,6 @@ const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { ); }; -// function getDataProperty(type: Type): TypeUIBaseProperty { -// return { -// name: "data", -// description: "in program.stateMap()", -// value: , -// }; -// } - const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { const id = getIdForType(type); const href = `#${id}`; @@ -124,15 +116,31 @@ const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { case "TemplateParameter": return Template Param: {type.node.id.sv}; case "String": - return "{type.value}"; + return ( + + "{type.value}" + + ); case "Number": case "Boolean": - return <>{type.value}; + return {type.value.toString()}; default: return null; } }; +const SimpleType = ({ type, children }: { type: Type; children: ReactNode }) => { + return ( + <> + {children} + + ); +}; + +const JsValue = ({ value }: { value: any }) => { + return {value.toString()}; +}; + export const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { const program = useProgram(); const entries = [...program.stateMaps.entries()] @@ -153,7 +161,6 @@ export const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { }; const EntityProperties = ({ entity: type }: { entity: Entity }) => { - console.log("Type", type); const properties = (TypeConfig as any)[(type as any).kind as any]; const props = Object.entries(type) .map(([key, value]) => { @@ -179,27 +186,15 @@ const EntityProperties = ({ entity: type }: { entity: Entity }) => { ) { valueUI = ; } else { - valueUI = value; + valueUI = ; } - return { - name: key, - value: valueUI, - }; + return ( +
  • + {key}: {valueUI} +
  • + ); }) .filter((x): x is any => Boolean(x)); - return ( - - {props.map((prop) => { - return ( -
  • - - {prop.name} - - : {prop.value} -
  • - ); - })} -
    - ); + return {props}; }; diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index d4b43222c3..68ff44e406 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -15,7 +15,6 @@ export interface TreeNavigationProps { export const TreeNavigation = ({ nav }: TreeNavigationProps) => { const onOpenChange = useCallback( (evt: any, data: TreeOpenChangeData) => { - console.log("onOpenChange", data.value); nav.selectPath(data.value.toString()); }, [nav.selectPath] From 3ef59b187f7643ff5552e01e9e1cbd9fb85fc813 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 17:04:45 -0700 Subject: [PATCH 13/70] Config for all types --- .../src/react/type-config.ts | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/src/react/type-config.ts b/packages/html-program-viewer/src/react/type-config.ts index 31a94ee51b..e6c683bf49 100644 --- a/packages/html-program-viewer/src/react/type-config.ts +++ b/packages/html-program-viewer/src/react/type-config.ts @@ -1,4 +1,6 @@ -export const TypeConfig = { +import type { Type } from "@typespec/compiler"; + +export const TypeConfig: TypeGraphConfig = { Namespace: { namespaces: "skip", models: "nested", @@ -10,7 +12,7 @@ export const TypeConfig = { decoratorDeclarations: "nested", functionDeclarations: "nested", }, - Interace: { + Interface: { operations: "nested", sourceInterfaces: "ref", }, @@ -58,6 +60,55 @@ export const TypeConfig = { union: "skip", type: "ref", }, + Boolean: { + value: "value", + }, + Decorator: { + parameters: "nested", + implementation: "skip", + target: "ref", + }, + ScalarConstructor: { + parameters: "nested", + scalar: "skip", + }, + FunctionParameter: null, + Number: { + numericValue: "value", + value: "value", + valueAsString: "value", + }, + String: { + value: "value", + }, + Tuple: { + values: "nested", + }, + StringTemplate: { + spans: "nested", + stringValue: "value", + }, + StringTemplateSpan: { + isInterpolated: "value", + type: "skip", + }, + TemplateParameter: { + constraint: "value", + default: "value", + }, + + // Don't want to expose those for now + Function: null, + Object: null, + Intrinsic: null, + Projection: null, +}; + +type PropsToDefine = Exclude; +type TypePropertyConfig = "nested" | "ref" | "value" | "skip"; +type TypeConfig = Record, TypePropertyConfig> | null; +type TypeGraphConfig = { + [K in Type["kind"]]: TypeConfig>; }; const HiddenProps = [ @@ -79,5 +130,6 @@ const HiddenProps = [ "projections", "isFinished", ] as const; +type HiddenPropsType = (typeof HiddenProps)[number]; export const HiddenPropsSet = new Set(HiddenProps); From b6e1623e5a1dbd94e1d397698d826227d576bac0 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 19:32:20 -0700 Subject: [PATCH 14/70] . --- .../src/react/inspect-type/ui.tsx | 70 +++++++++++-------- .../src/react/type-config.ts | 34 ++++++--- 2 files changed, 66 insertions(+), 38 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index 282e82c99a..e813fa700d 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -5,7 +5,7 @@ import { inspect } from "../../inspect.js"; import { getIdForType, isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; import { useProgram } from "../program-context.js"; -import { HiddenPropsSet, TypeConfig } from "../type-config.js"; +import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; import style from "./ui.module.css"; export interface ItemListProps { @@ -161,40 +161,52 @@ export const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { }; const EntityProperties = ({ entity: type }: { entity: Entity }) => { - const properties = (TypeConfig as any)[(type as any).kind as any]; const props = Object.entries(type) .map(([key, value]) => { - if (HiddenPropsSet.has(key as any)) { + const action = getPropertyRendering(type as any, key); + if (action === undefined || action === "skip") { return undefined; } - const action = properties?.[key] as "skip" | "ref" | "nested"; - if (action === "skip" || action === undefined) { - return undefined; - } - - const render = (x: Entity) => - action === "ref" ? : ; - let valueUI; - if (value === undefined) { - valueUI = value; - } else if (value.entityKind) { - valueUI = render(value); - } else if ( - typeof value === "object" && - "entries" in value && - typeof value.entries === "function" - ) { - valueUI = ; - } else { - valueUI = ; - } - return ( -
  • - {key}: {valueUI} -
  • - ); + return ; }) .filter((x): x is any => Boolean(x)); return {props}; }; + +interface EntityPropertyProps { + name: string; + value: any; + action: EntityPropertyConfig; +} +const EntityProperty = (props: EntityPropertyProps) => { + return ( +
  • + {props.name}:{" "} + + + +
  • + ); +}; + +const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { + const render = (x: Entity) => { + const renderRef = action === "ref" || action === "parent"; + return renderRef ? : ; + }; + + if (value === undefined) { + return null; + } else if (value.entityKind) { + return render(value); + } else if ( + typeof value === "object" && + "entries" in value && + typeof value.entries === "function" + ) { + return ; + } else { + return ; + } +}; diff --git a/packages/html-program-viewer/src/react/type-config.ts b/packages/html-program-viewer/src/react/type-config.ts index e6c683bf49..ca3b467de2 100644 --- a/packages/html-program-viewer/src/react/type-config.ts +++ b/packages/html-program-viewer/src/react/type-config.ts @@ -1,5 +1,7 @@ import type { Type } from "@typespec/compiler"; +export type EntityPropertyConfig = "parent" | "nested" | "ref" | "value" | "skip"; + export const TypeConfig: TypeGraphConfig = { Namespace: { namespaces: "skip", @@ -17,7 +19,7 @@ export const TypeConfig: TypeGraphConfig = { sourceInterfaces: "ref", }, Operation: { - interface: "skip", + interface: "parent", parameters: "nested", returnType: "ref", sourceOperation: "ref", @@ -36,7 +38,7 @@ export const TypeConfig: TypeGraphConfig = { constructors: "nested", }, ModelProperty: { - model: "skip", + model: "parent", type: "ref", optional: "value", sourceProperty: "ref", @@ -47,7 +49,7 @@ export const TypeConfig: TypeGraphConfig = { members: "nested", }, EnumMember: { - enum: "skip", + enum: "parent", sourceMember: "ref", value: "value", }, @@ -57,7 +59,7 @@ export const TypeConfig: TypeGraphConfig = { variants: "nested", }, UnionVariant: { - union: "skip", + union: "parent", type: "ref", }, Boolean: { @@ -69,8 +71,8 @@ export const TypeConfig: TypeGraphConfig = { target: "ref", }, ScalarConstructor: { + scalar: "parent", parameters: "nested", - scalar: "skip", }, FunctionParameter: null, Number: { @@ -104,20 +106,25 @@ export const TypeConfig: TypeGraphConfig = { Projection: null, }; -type PropsToDefine = Exclude; -type TypePropertyConfig = "nested" | "ref" | "value" | "skip"; -type TypeConfig = Record, TypePropertyConfig> | null; +type PropsToDefine = Exclude< + keyof T, + HiddenPropsType | keyof typeof CommonPropsConfig +>; +type TypeConfig = Record, EntityPropertyConfig> | null; type TypeGraphConfig = { [K in Type["kind"]]: TypeConfig>; }; +export const CommonPropsConfig = { + namespace: "parent", +}; + const HiddenProps = [ "entityKind", "kind", "name", "node", "symbol", - "namespace", "templateNode", "templateArguments", "templateMapper", @@ -133,3 +140,12 @@ const HiddenProps = [ type HiddenPropsType = (typeof HiddenProps)[number]; export const HiddenPropsSet = new Set(HiddenProps); + +export function getPropertyRendering( + type: T, + key: K +): EntityPropertyConfig { + const properties = (TypeConfig as any)[type.kind]; + const action = properties?.[key] ?? (CommonPropsConfig as any)[key]; + return action; +} From 00ead6a253f4939553bd9a8268f06dacc4b588b0 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 19:42:34 -0700 Subject: [PATCH 15/70] navigator context --- .../src/react/tree-navigation.tsx | 9 +++--- .../src/react/type-graph.tsx | 29 ++++++++++--------- ...-navigation.ts => use-tree-navigation.tsx} | 25 ++++++++++++++-- 3 files changed, 42 insertions(+), 21 deletions(-) rename packages/html-program-viewer/src/react/{use-tree-navigation.ts => use-tree-navigation.tsx} (77%) diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 68ff44e406..2e6213ccc0 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -6,13 +6,12 @@ import { } from "@fluentui/react-components"; import { useCallback } from "react"; import style from "./tree-navigation.module.css"; -import { type TreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; +import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; -export interface TreeNavigationProps { - readonly nav: TreeNavigator; -} +export interface TreeNavigationProps {} -export const TreeNavigation = ({ nav }: TreeNavigationProps) => { +export const TreeNavigation = (_: TreeNavigationProps) => { + const nav = useTreeNavigator(); const onOpenChange = useCallback( (evt: any, data: TreeOpenChangeData) => { nav.selectPath(data.value.toString()); diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 1f93d74263..cfa08b763a 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -8,7 +8,7 @@ import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; import style from "./type-graph.module.css"; import { TypeNodeView } from "./type-view/type-view.js"; -import { useTreeNavigator, type TreeNavigator } from "./use-tree-navigation.js"; +import { TypeGraphNavigatorProvider, useTreeNavigator } from "./use-tree-navigation.js"; export function renderProgram(program: Program) { const html = ReactDOMServer.renderToString( @@ -24,23 +24,24 @@ export interface TypeGraphProps { } export const TypeGraph: FunctionComponent = ({ program }) => { - const nav = useTreeNavigator(program); - return ( - - - - - - - - - - + + + + + + + + + + + + ); }; -const TypeGraphContent = ({ nav }: { nav: TreeNavigator }) => { +const TypeGraphContent = () => { + const nav = useTreeNavigator(); const node = nav.selectedNode; switch (node?.kind) { diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.ts b/packages/html-program-viewer/src/react/use-tree-navigation.tsx similarity index 77% rename from packages/html-program-viewer/src/react/use-tree-navigation.ts rename to packages/html-program-viewer/src/react/use-tree-navigation.tsx index 2648056904..cc395628a3 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.ts +++ b/packages/html-program-viewer/src/react/use-tree-navigation.tsx @@ -1,5 +1,5 @@ import { getNamespaceFullName, type Namespace, type Program, type Type } from "@typespec/compiler"; -import { useMemo, useState } from "react"; +import { createContext, useContext, useMemo, useState, type ReactNode } from "react"; import { TypeConfig } from "./type-config.js"; export interface TypeGraphNodeBase { @@ -30,7 +30,28 @@ function expandNamespaces(namespace: Namespace): Namespace[] { return [namespace, ...[...namespace.namespaces.values()].flatMap(expandNamespaces)]; } -export function useTreeNavigator(program: Program): TreeNavigator { +const TreeNavigatorContext = createContext(undefined); + +export function useTreeNavigator() { + const nav = useContext(TreeNavigatorContext); + if (nav === undefined) { + throw new Error(`Expect to be used inside a TypeGraphNavigatorProvider`); + } + return nav; +} + +export interface TypeGraphNavigatorProvider { + program: Program; + children: ReactNode; +} +export const TypeGraphNavigatorProvider = ({ program, children }: TypeGraphNavigatorProvider) => { + const treeNavigator = useTreeNavigatorInternal(program); + return ( + {children} + ); +}; + +function useTreeNavigatorInternal(program: Program): TreeNavigator { const [selectedPath, selectPath] = useState(""); const tree = useMemo(() => computeTree(program), [program]); From aa2ab84c190c7ba7e4e503fbecf8c3c902f2e6f4 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 19:52:14 -0700 Subject: [PATCH 16/70] Navigate --- .../src/react/inspect-type/ui.module.css | 1 + .../src/react/inspect-type/ui.tsx | 14 +++++--- .../src/react/use-tree-navigation.tsx | 36 +++++++++++++------ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/ui.module.css index 9afb646637..4e0aef4be7 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/ui.module.css @@ -26,6 +26,7 @@ .named-type-ref { color: var(--colorBrandForeground1); text-decoration: none; + cursor: pointer; } .named-type-ref:hover { diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index e813fa700d..c209229ccf 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -1,11 +1,12 @@ import type { Entity, Type } from "@typespec/compiler"; import { getTypeName } from "@typespec/compiler"; -import { type FunctionComponent, type ReactElement, type ReactNode } from "react"; +import { useCallback, type FunctionComponent, type ReactElement, type ReactNode } from "react"; import { inspect } from "../../inspect.js"; -import { getIdForType, isNamedUnion } from "../../utils.js"; +import { isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; import { useProgram } from "../program-context.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; +import { useTreeNavigator } from "../use-tree-navigation.js"; import style from "./ui.module.css"; export interface ItemListProps { @@ -68,10 +69,13 @@ const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { }; const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { - const id = getIdForType(type); - const href = `#${id}`; + const nav = useTreeNavigator(); + + const navToType = useCallback(() => { + nav.navToType(type); + }, [nav.navToType, type]); return ( - + {getTypeName(type)} ); diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.tsx b/packages/html-program-viewer/src/react/use-tree-navigation.tsx index cc395628a3..44d4d84802 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/use-tree-navigation.tsx @@ -1,5 +1,5 @@ import { getNamespaceFullName, type Namespace, type Program, type Type } from "@typespec/compiler"; -import { createContext, useContext, useMemo, useState, type ReactNode } from "react"; +import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from "react"; import { TypeConfig } from "./type-config.js"; export interface TypeGraphNodeBase { @@ -23,6 +23,7 @@ export interface TreeNavigator { readonly selectedNode?: TypeGraphNode; readonly selectedPath: string; readonly selectPath: (path: string) => void; + readonly navToType: (type: Type) => void; readonly tree: TypeGraphListNode; } @@ -32,7 +33,7 @@ function expandNamespaces(namespace: Namespace): Namespace[] { const TreeNavigatorContext = createContext(undefined); -export function useTreeNavigator() { +export function useTreeNavigator(): TreeNavigator { const nav = useContext(TreeNavigatorContext); if (nav === undefined) { throw new Error(`Expect to be used inside a TypeGraphNavigatorProvider`); @@ -55,21 +56,36 @@ function useTreeNavigatorInternal(program: Program): TreeNavigator { const [selectedPath, selectPath] = useState(""); const tree = useMemo(() => computeTree(program), [program]); - const nodes = useMemo(() => computeFlatTree(tree), [tree]); - const selectedNode = useMemo(() => nodes.get(selectedPath), [nodes, selectedPath]); - - return { tree, selectedPath, selectedNode, selectPath }; + const { pathToNode, typeToPath } = useMemo(() => computeReferences(tree), [tree]); + const selectedNode = useMemo(() => pathToNode.get(selectedPath), [pathToNode, selectedPath]); + const navToType = useCallback( + (type: Type) => { + const path = typeToPath.get(type); + if (path) { + selectPath(path); + } + }, + [selectPath, typeToPath] + ); + return { tree, selectedPath, selectedNode, selectPath, navToType }; } -function computeFlatTree(node: TypeGraphNode): Map { - const nodes = new Map(); +function computeReferences(node: TypeGraphNode): { + pathToNode: Map; + typeToPath: Map; +} { + const pathToNode = new Map(); + const typeToPath = new Map(); const stack = [node]; while (stack.length > 0) { const current = stack.pop()!; - nodes.set(current.id, current); + pathToNode.set(current.id, current); + if (current.kind === "type") { + typeToPath.set(current.type, current.id); + } stack.push(...current.children); } - return nodes; + return { pathToNode, typeToPath }; } function computeTree(program: Program): TypeGraphListNode { From 442c3caf753228caaa752bf2103b83ded364c272 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 19:54:05 -0700 Subject: [PATCH 17/70] rename --- .../src/{inspect.ts => react/inspect-type/inspect-js.ts} | 0 packages/html-program-viewer/src/react/inspect-type/ui.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/html-program-viewer/src/{inspect.ts => react/inspect-type/inspect-js.ts} (100%) diff --git a/packages/html-program-viewer/src/inspect.ts b/packages/html-program-viewer/src/react/inspect-type/inspect-js.ts similarity index 100% rename from packages/html-program-viewer/src/inspect.ts rename to packages/html-program-viewer/src/react/inspect-type/inspect-js.ts diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index c209229ccf..4a1a59c6f7 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -1,12 +1,12 @@ import type { Entity, Type } from "@typespec/compiler"; import { getTypeName } from "@typespec/compiler"; import { useCallback, type FunctionComponent, type ReactElement, type ReactNode } from "react"; -import { inspect } from "../../inspect.js"; import { isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; import { useProgram } from "../program-context.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; import { useTreeNavigator } from "../use-tree-navigation.js"; +import { inspect } from "./inspect-js.js"; import style from "./ui.module.css"; export interface ItemListProps { From 0e5e77e82cc0858eabf3516f6155e8189d79b75c Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 20:04:27 -0700 Subject: [PATCH 18/70] Nav to other types --- .../src/react/inspect-type/ui.module.css | 8 +++ .../src/react/inspect-type/ui.tsx | 64 +++++++++++-------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/ui.module.css index 4e0aef4be7..d257c7147e 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/ui.module.css @@ -14,6 +14,14 @@ padding: 10px 10px 10px 0; } +.type-ui-header { + cursor: pointer; +} + +.type-ui-header:hover { + text-decoration: underline; +} + .type-name { margin-left: 5px; color: var(--colorNeutralForeground2); diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index 4a1a59c6f7..8d2668b2be 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -9,30 +9,6 @@ import { useTreeNavigator } from "../use-tree-navigation.js"; import { inspect } from "./inspect-js.js"; import style from "./ui.module.css"; -export interface ItemListProps { - items: Map | T[]; - render: (t: T) => ReactElement | null; -} - -export const ItemList = (props: ItemListProps) => { - if (Array.isArray(props.items)) { - if (props.items.length === 0) { - return <>{"[]"}; - } - } else { - if (props.items.size === 0) { - return <>{"{}"}; - } - } - return ( - - {[...props.items.entries()].map(([k, v], i) => ( -
  • {props.render(v)}
  • - ))} -
    - ); -}; - type NamedType = Type & { name: string }; interface TypeUIProps { @@ -57,9 +33,12 @@ const EntityUI: FunctionComponent = ({ entity }) => { }; const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { + const nav = useTreeNavigator(); + + const navToType = useCallback(() => nav.navToType(type), [nav.navToType, type]); return (
    -
    +
    {"name" in type ? type.name?.toString() : ""}
    @@ -80,6 +59,15 @@ const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { ); }; + +const EntityReference = ({ entity }: { entity: Entity }) => { + switch (entity.entityKind) { + case "Type": + return ; + default: + return null; + } +}; const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { switch (type.kind) { case "Namespace": @@ -197,7 +185,7 @@ const EntityProperty = (props: EntityPropertyProps) => { const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { const render = (x: Entity) => { const renderRef = action === "ref" || action === "parent"; - return renderRef ? : ; + return renderRef ? : ; }; if (value === undefined) { @@ -214,3 +202,27 @@ const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { return ; } }; + +interface ItemListProps { + items: Map | T[]; + render: (t: T) => ReactElement | null; +} + +const ItemList = (props: ItemListProps) => { + if (Array.isArray(props.items)) { + if (props.items.length === 0) { + return <>{"[]"}; + } + } else { + if (props.items.size === 0) { + return <>{"{}"}; + } + } + return ( + + {[...props.items.entries()].map(([k, v], i) => ( +
  • {props.render(v)}
  • + ))} +
    + ); +}; From 43ca99f72ded86b50bef7d7d8924dbf772e59e11 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 21:34:45 -0700 Subject: [PATCH 19/70] Tweaks --- .../src/react/inspect-type/ui.module.css | 2 +- .../src/react/inspect-type/ui.tsx | 35 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/ui.module.css index d257c7147e..34c4a88fca 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/ui.module.css @@ -5,7 +5,7 @@ } .inspect-type ul { - padding: 0 0 0 10px; + padding: 0 0 0 16px; margin: 0; } diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index 8d2668b2be..cce3b27bbc 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -11,36 +11,51 @@ import style from "./ui.module.css"; type NamedType = Type & { name: string }; -interface TypeUIProps { +interface InspectTypeProps { readonly entity: Entity; } -export const InspectType: FunctionComponent = ({ entity }) => { +export const InspectType: FunctionComponent = ({ entity }) => { return ( ); }; +interface EntityUIProps { + readonly entity: Entity; + readonly nameAsKey?: boolean; +} -const EntityUI: FunctionComponent = ({ entity }) => { +const EntityUI: FunctionComponent = ({ entity, nameAsKey }) => { switch (entity.entityKind) { case "Type": - return ; + return ; default: return null; } }; -const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { +const TypeUI: FunctionComponent<{ type: Type; nameAsKey?: boolean }> = ({ type, nameAsKey }) => { const nav = useTreeNavigator(); const navToType = useCallback(() => nav.navToType(type), [nav.navToType, type]); + const name = ( + {"name" in type ? type.name?.toString() : ""} + ); + const typeKind = ; return (
    - - {"name" in type ? type.name?.toString() : ""} + {nameAsKey ? ( + <> + {name}: {typeKind} + + ) : ( + <> + {typeKind} {name} + + )}
    @@ -187,6 +202,10 @@ const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { const renderRef = action === "ref" || action === "parent"; return renderRef ? : ; }; + const renderInList = (x: Entity) => { + const renderRef = action === "ref" || action === "parent"; + return renderRef ? : ; + }; if (value === undefined) { return null; @@ -197,7 +216,7 @@ const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { "entries" in value && typeof value.entries === "function" ) { - return ; + return ; } else { return ; } From 829ab493f5ff1c83d6625ef80b3f61bcc204ac60 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 21:43:33 -0700 Subject: [PATCH 20/70] Breadcrumbs --- .../src/react/type-graph.module.css | 4 ++ .../src/react/type-graph.tsx | 38 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/src/react/type-graph.module.css b/packages/html-program-viewer/src/react/type-graph.module.css index 5f430f77de..bdd2d3eeeb 100644 --- a/packages/html-program-viewer/src/react/type-graph.module.css +++ b/packages/html-program-viewer/src/react/type-graph.module.css @@ -11,3 +11,7 @@ padding: 10px; overflow-y: auto; } + +.breadcrumb { + margin-bottom: 10px; +} diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index cfa08b763a..7ce2becb76 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -1,7 +1,14 @@ -import { FluentProvider, webLightTheme } from "@fluentui/react-components"; +import { + Breadcrumb, + BreadcrumbButton, + BreadcrumbDivider, + BreadcrumbItem, + FluentProvider, + webLightTheme, +} from "@fluentui/react-components"; import type { Program } from "@typespec/compiler"; import { Pane, SplitPane } from "@typespec/react-components"; -import { type FunctionComponent } from "react"; +import { Fragment, type FunctionComponent } from "react"; import ReactDOMServer from "react-dom/server"; import { ListNodeView } from "./list-node-view.js"; import { ProgramProvider } from "./program-context.js"; @@ -32,6 +39,7 @@ export const TypeGraph: FunctionComponent = ({ program }) => { + @@ -53,3 +61,29 @@ const TypeGraphContent = () => { return ; } }; + +const TypeGraphBreadcrumb = () => { + const nav = useTreeNavigator(); + const segments = nav.selectedPath.split("."); + + return ( + + {segments.map((x, i) => { + const last = i === segments.length - 1; + return ( + + + nav.selectPath(segments.slice(0, i).join("."))} + > + {x} + + + {!last && } + + ); + })} + + ); +}; From d29958cb7ade8a2e0666ec958d83cfc772362c40 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sat, 15 Jun 2024 22:07:05 -0700 Subject: [PATCH 21/70] Tweaks --- .../src/react/common.module.css | 6 ++++ .../html-program-viewer/src/react/common.tsx | 5 +++- .../src/react/inspect-type/ui.module.css | 17 +++++------ .../src/react/inspect-type/ui.tsx | 28 ++++--------------- .../src/react/type-view/type-view.module.css | 19 +++++++++++++ .../src/react/type-view/type-view.tsx | 17 +++++++---- 6 files changed, 55 insertions(+), 37 deletions(-) diff --git a/packages/html-program-viewer/src/react/common.module.css b/packages/html-program-viewer/src/react/common.module.css index bdfa49f053..5ead6280f5 100644 --- a/packages/html-program-viewer/src/react/common.module.css +++ b/packages/html-program-viewer/src/react/common.module.css @@ -9,3 +9,9 @@ .type-kind { color: var(--colorPaletteBerryForeground2); } +.type-kind-tag { + color: white; + background-color: var(--colorPaletteBerryForeground2); + padding: 1px 5px; + border-radius: 2px; +} diff --git a/packages/html-program-viewer/src/react/common.tsx b/packages/html-program-viewer/src/react/common.tsx index 846a67fb2b..9681eb5751 100644 --- a/packages/html-program-viewer/src/react/common.tsx +++ b/packages/html-program-viewer/src/react/common.tsx @@ -12,9 +12,12 @@ export const Literal: FunctionComponent<{ children: any }> = ({ children }) => ( ); export const TypeKind = ({ type }: { type: Type }) => { - return {type.kind}; + return {type.kind}; }; +export const TypeKindTag = ({ type }: { type: Type }) => { + return {type.kind}; +}; export const KeyValueSection: FunctionComponent<{ children: ReactElement | ReactElement[] }> = ({ children, }) => { diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/ui.module.css index 34c4a88fca..a7b9695b6b 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/ui.module.css @@ -1,17 +1,18 @@ -.inspect-type li { - margin: 0; - list-style: none; - position: relative; +.inspect-type { } - .inspect-type ul { padding: 0 0 0 16px; margin: 0; } -.inspect-type { - background-color: var(--colorNeutralBackground2); - padding: 10px 10px 10px 0; +.inspect-type > ul { + padding: 0; +} + +.inspect-type li { + margin: 0; + list-style: none; + position: relative; } .type-ui-header { diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/ui.tsx index cce3b27bbc..0c7fbf6f32 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/ui.tsx @@ -24,38 +24,26 @@ export const InspectType: FunctionComponent = ({ entity }) => }; interface EntityUIProps { readonly entity: Entity; - readonly nameAsKey?: boolean; } -const EntityUI: FunctionComponent = ({ entity, nameAsKey }) => { +const EntityUI: FunctionComponent = ({ entity }) => { switch (entity.entityKind) { case "Type": - return ; + return ; default: return null; } }; -const TypeUI: FunctionComponent<{ type: Type; nameAsKey?: boolean }> = ({ type, nameAsKey }) => { +const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { const nav = useTreeNavigator(); const navToType = useCallback(() => nav.navToType(type), [nav.navToType, type]); - const name = ( - {"name" in type ? type.name?.toString() : ""} - ); - const typeKind = ; return (
    - {nameAsKey ? ( - <> - {name}: {typeKind} - - ) : ( - <> - {typeKind} {name} - - )} + {" "} + {"name" in type ? type.name?.toString() : ""}
    @@ -202,10 +190,6 @@ const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { const renderRef = action === "ref" || action === "parent"; return renderRef ? : ; }; - const renderInList = (x: Entity) => { - const renderRef = action === "ref" || action === "parent"; - return renderRef ? : ; - }; if (value === undefined) { return null; @@ -216,7 +200,7 @@ const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { "entries" in value && typeof value.entries === "function" ) { - return ; + return ; } else { return ; } diff --git a/packages/html-program-viewer/src/react/type-view/type-view.module.css b/packages/html-program-viewer/src/react/type-view/type-view.module.css index 6ddee54f00..8314cbcd17 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.module.css +++ b/packages/html-program-viewer/src/react/type-view/type-view.module.css @@ -4,8 +4,27 @@ gap: 20px; } +.main { + padding: var(--fui-Card--size) 0 !important; +} + +.header-section { + padding: 0 var(--fui-Card--size); +} + +.inspect-section { + padding: 0 var(--fui-Card--size); +} + .header { display: flex; align-items: center; gap: 10px; } + +.divider { + margin: 0 -10px; +} +.doc { + color: var(--colorNeutralForeground3); +} diff --git a/packages/html-program-viewer/src/react/type-view/type-view.tsx b/packages/html-program-viewer/src/react/type-view/type-view.tsx index 0d0fe14f74..fe1125fc2c 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.tsx +++ b/packages/html-program-viewer/src/react/type-view/type-view.tsx @@ -1,6 +1,6 @@ -import { Caption1, Card, CardHeader, Text } from "@fluentui/react-components"; +import { Caption1, Card, CardHeader, Divider, Text } from "@fluentui/react-components"; import { getDoc } from "@typespec/compiler"; -import { Mono, TypeKind } from "../common.js"; +import { Mono, TypeKindTag } from "../common.js"; import { InspectType, TypeData } from "../inspect-type/ui.js"; import { useProgram } from "../program-context.js"; import type { TreeNavigator, TypeGraphTypeNode } from "../use-tree-navigation.js"; @@ -16,19 +16,24 @@ export const TypeNodeView = ({ node }: TypeNodeViewProps) => { return (
    - + - + {node.name}
    } - description={{getDoc(program, node.type)}} + description={{getDoc(program, node.type)}} /> - + + +
    + +
    From a767dbb0ac66fb0c230065ec111858e83f6f0ff9 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 09:26:21 -0700 Subject: [PATCH 22/70] Progress --- packages/html-program-viewer/package.json | 4 +- .../src/react/inspect-type/inspect-js.ts | 57 ------------------- ...{ui.module.css => inspect-type.module.css} | 1 - .../inspect-type/{ui.tsx => inspect-type.tsx} | 23 +------- .../inspect-type/type-data-table.module.css | 19 +++++++ .../react/inspect-type/type-data-table.tsx | 35 ++++++++++++ .../src/react/type-view/type-view.tsx | 5 +- pnpm-lock.yaml | 11 ++++ 8 files changed, 71 insertions(+), 84 deletions(-) delete mode 100644 packages/html-program-viewer/src/react/inspect-type/inspect-js.ts rename packages/html-program-viewer/src/react/inspect-type/{ui.module.css => inspect-type.module.css} (96%) rename packages/html-program-viewer/src/react/inspect-type/{ui.tsx => inspect-type.tsx} (89%) create mode 100644 packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css create mode 100644 packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 526e11e51f..e9e00cbfbe 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -43,7 +43,6 @@ "lint:fix": "eslint . --fix" }, "files": [ - "lib/*.tsp", "dist/**", "!dist/test/**" ], @@ -55,7 +54,8 @@ "@fluentui/react-icons": "^2.0.240", "@fluentui/react-list-preview": "^0.2.8", "react": "~18.3.1", - "react-dom": "~18.3.1" + "react-dom": "~18.3.1", + "react-inspector": "^6.0.2" }, "devDependencies": { "@babel/core": "^7.24.5", diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-js.ts b/packages/html-program-viewer/src/react/inspect-type/inspect-js.ts deleted file mode 100644 index fa19309eb0..0000000000 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-js.ts +++ /dev/null @@ -1,57 +0,0 @@ -const MAX_DEPTH = 2; - -export function inspect(obj: unknown): string { - return formatValue({ depth: 0 }, obj); -} -interface InspectContext { - depth: number; -} - -function formatValue(ctx: InspectContext, obj: unknown) { - switch (typeof obj) { - case "undefined": - return "undefined"; - case "string": - return `"${obj}"`; - case "number": - case "bigint": - case "boolean": - case "symbol": - return obj.toString(); - case "object": - if (obj === null) { - return "null"; - } - return formatObject(ctx, obj); - default: - return "?"; - } -} - -function formatObject(ctx: InspectContext, obj: object): string { - if (ctx.depth > MAX_DEPTH) { - return obj.toString(); - } - - if (Array.isArray(obj)) { - return formatArray(ctx, obj); - } - - const props = Object.entries(obj).map(([k, v]) => { - return ` `.repeat(ctx.depth) + `${k}: ${formatValue({ ...ctx, depth: ctx.depth + 1 }, v)}`; - }); - - return ["{", ...props, "}"].join("\n"); -} - -function formatArray(ctx: InspectContext, obj: unknown[]): string { - if (ctx.depth > MAX_DEPTH) { - return obj.toString(); - } - - const items = obj.map((v) => { - return ` `.repeat(ctx.depth) + `${formatValue({ ...ctx, depth: ctx.depth + 1 }, v)}`; - }); - - return ["[", ...items, "]"].join("\n"); -} diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.module.css b/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css similarity index 96% rename from packages/html-program-viewer/src/react/inspect-type/ui.module.css rename to packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css index a7b9695b6b..0a44d75015 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css @@ -24,7 +24,6 @@ } .type-name { - margin-left: 5px; color: var(--colorNeutralForeground2); } diff --git a/packages/html-program-viewer/src/react/inspect-type/ui.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx similarity index 89% rename from packages/html-program-viewer/src/react/inspect-type/ui.tsx rename to packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index 0c7fbf6f32..32643e3287 100644 --- a/packages/html-program-viewer/src/react/inspect-type/ui.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -3,11 +3,9 @@ import { getTypeName } from "@typespec/compiler"; import { useCallback, type FunctionComponent, type ReactElement, type ReactNode } from "react"; import { isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; -import { useProgram } from "../program-context.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; import { useTreeNavigator } from "../use-tree-navigation.js"; -import { inspect } from "./inspect-js.js"; -import style from "./ui.module.css"; +import style from "./inspect-type.module.css"; type NamedType = Type & { name: string }; @@ -136,25 +134,6 @@ const JsValue = ({ value }: { value: any }) => { return {value.toString()}; }; -export const TypeData: FunctionComponent<{ type: Type }> = ({ type }) => { - const program = useProgram(); - const entries = [...program.stateMaps.entries()] - .map(([k, v]) => [k, v.get(undefined)?.get(type) as any]) - .filter(([k, v]) => !!v); - if (entries.length === 0) { - return null; - } - return ( - - {entries.map(([k, v], i) => ( -
    -
    {k.toString()}:
    {inspect(v)}
    -
    - ))} -
    - ); -}; - const EntityProperties = ({ entity: type }: { entity: Entity }) => { const props = Object.entries(type) .map(([key, value]) => { diff --git a/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css b/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css new file mode 100644 index 0000000000..4d0dcc1806 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css @@ -0,0 +1,19 @@ +.table { + border-collapse: collapse; +} + +.table th { + font-weight: bold; +} + +.table thead tr, +.table tbody tr:not(:last-child) { + border-bottom: 1px solid var(--colorNeutralStroke1); +} + +.key { + color: var(--colorNeutralForeground2); +} + +.data { +} diff --git a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx new file mode 100644 index 0000000000..2879db6608 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx @@ -0,0 +1,35 @@ +import type { Type } from "@typespec/compiler"; +import type { FC } from "react"; +import { ObjectInspector } from "react-inspector"; +import { useProgram } from "../program-context.js"; +import style from "./type-data-table.module.css"; + +export const TypeDataTable: FC<{ type: Type }> = ({ type }) => { + const program = useProgram(); + const entries = [...program.stateMaps.entries()] + .map(([k, v]) => [k, v.get(undefined)?.get(type) as any]) + .filter(([k, v]) => !!v); + if (entries.length === 0) { + return null; + } + return ( + + + + + + + + + {entries.map(([k, v], i) => ( + + + + + ))} + +
    State KeyData
    {k.toString()} + +
    + ); +}; diff --git a/packages/html-program-viewer/src/react/type-view/type-view.tsx b/packages/html-program-viewer/src/react/type-view/type-view.tsx index fe1125fc2c..7587b41cae 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.tsx +++ b/packages/html-program-viewer/src/react/type-view/type-view.tsx @@ -1,7 +1,8 @@ import { Caption1, Card, CardHeader, Divider, Text } from "@fluentui/react-components"; import { getDoc } from "@typespec/compiler"; import { Mono, TypeKindTag } from "../common.js"; -import { InspectType, TypeData } from "../inspect-type/ui.js"; +import { InspectType } from "../inspect-type/inspect-type.js"; +import { TypeDataTable } from "../inspect-type/type-data-table.js"; import { useProgram } from "../program-context.js"; import type { TreeNavigator, TypeGraphTypeNode } from "../use-tree-navigation.js"; import style from "./type-view.module.css"; @@ -38,7 +39,7 @@ export const TypeNodeView = ({ node }: TypeNodeViewProps) => { Type data} /> - +
    ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc0cf5d31b..f0a6dfad32 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -392,6 +392,9 @@ importers: react-dom: specifier: ~18.3.1 version: 18.3.1(react@18.3.1) + react-inspector: + specifier: ^6.0.2 + version: 6.0.2(react@18.3.1) devDependencies: '@babel/core': specifier: ^7.24.5 @@ -18309,6 +18312,14 @@ packages: react-fast-compare: 3.2.2 shallowequal: 1.1.0 + /react-inspector@6.0.2(react@18.3.1): + resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} + peerDependencies: + react: ^16.8.4 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.3.1 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} From b674fce55eff742e26502e2f9e16308007e80480 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 15:02:48 -0700 Subject: [PATCH 23/70] custom tree --- .../src/react/tree-navigation.module.css | 7 +- .../src/react/tree-navigation.tsx | 32 +++--- .../src/react/tree-view/index.ts | 0 .../src/react/tree-view/tree-view-row.tsx | 57 ++++++++++ .../src/react/tree-view/tree-view.module.css | 52 +++++++++ .../src/react/tree-view/tree-view.tsx | 103 ++++++++++++++++++ .../src/react/tree-view/types.ts | 24 ++++ 7 files changed, 260 insertions(+), 15 deletions(-) create mode 100644 packages/html-program-viewer/src/react/tree-view/index.ts create mode 100644 packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx create mode 100644 packages/html-program-viewer/src/react/tree-view/tree-view.module.css create mode 100644 packages/html-program-viewer/src/react/tree-view/tree-view.tsx create mode 100644 packages/html-program-viewer/src/react/tree-view/types.ts diff --git a/packages/html-program-viewer/src/react/tree-navigation.module.css b/packages/html-program-viewer/src/react/tree-navigation.module.css index 567379da6c..d4f9618af8 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.module.css +++ b/packages/html-program-viewer/src/react/tree-navigation.module.css @@ -1,2 +1,7 @@ -.tree-navigation { +.tree-navigation :global(.fui-Radio) { + display: none; +} + +.selected { + background-color: var(--colorNeutralBackground4); } diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 2e6213ccc0..8ec903fa0a 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -4,31 +4,30 @@ import { TreeItemLayout, type TreeOpenChangeData, } from "@fluentui/react-components"; -import { useCallback } from "react"; +import { useCallback, useMemo, useState } from "react"; import style from "./tree-navigation.module.css"; +import { TreeView } from "./tree-view/tree-view.js"; import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; export interface TreeNavigationProps {} export const TreeNavigation = (_: TreeNavigationProps) => { const nav = useTreeNavigator(); + const [openItems, setOpenItems] = useState>(new Set()); + const onOpenChange = useCallback( (evt: any, data: TreeOpenChangeData) => { - nav.selectPath(data.value.toString()); + setOpenItems(data.openItems); }, - [nav.selectPath] + [setOpenItems] ); - return ( - - - - ); + const resolvedOpenItems = useMemo(() => { + const path = nav.selectedPath.split("."); + return new Set([...openItems, ...path.map((_, i) => path.slice(0, i + 1).join("."))]); + }, [openItems, nav.selectedPath]); + + return ; }; const TreeNodeItemsUI = ({ nodes }: { nodes: TypeGraphNode[] }) => { @@ -40,10 +39,15 @@ const TreeNodeItemsUI = ({ nodes }: { nodes: TypeGraphNode[] }) => { ); }; + const TreeNodeUI = ({ node }: { node: TypeGraphNode }) => { + const nav = useTreeNavigator(); + const selected = nav.selectedPath === node.id; return ( - {node.name} + + {node.name} + {node.children.length > 0 && ( diff --git a/packages/html-program-viewer/src/react/tree-view/index.ts b/packages/html-program-viewer/src/react/tree-view/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx b/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx new file mode 100644 index 0000000000..710ce94f7f --- /dev/null +++ b/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx @@ -0,0 +1,57 @@ +import { ChevronDownRegular, ChevronRightRegular } from "@fluentui/react-icons"; +import type { TreeRow, TreeRowColumn } from "./types.js"; + +import { mergeClasses } from "@fluentui/react-components"; +import { useCallback, type SyntheticEvent } from "react"; +import style from "./tree-view.module.css"; + +const INDENT_SIZE = 8; + +export interface TreeViewRowProps { + readonly row: TreeRow; + readonly active: boolean; + readonly columns?: Array>; + readonly activate: (row: TreeRow) => void; +} + +export function TreeViewRow(props: TreeViewRowProps) { + const { row, active } = props; + + const paddingLeft = row.depth * INDENT_SIZE; + + const activate = useCallback(() => props.activate(props.row), [props.activate, props.row]); + return ( +
    + + + + + {row.item.name} + +
    + ); +} + +export const Caret = ({ row }: { row: TreeRow }) => { + const toggleExpand = useCallback( + (evt: SyntheticEvent) => { + evt.stopPropagation(); + row.toggleExpand(); + }, + [row.toggleExpand] + ); + if (row.hasChildren) { + return row.expanded ? ( + + ) : ( + + ); + } else { + return null; + } +}; diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view.module.css b/packages/html-program-viewer/src/react/tree-view/tree-view.module.css new file mode 100644 index 0000000000..699f4c8565 --- /dev/null +++ b/packages/html-program-viewer/src/react/tree-view/tree-view.module.css @@ -0,0 +1,52 @@ +.tree-view .ms-DetailsRow { + width: 100%; + cursor: pointer; +} + +.tree-view .ms-Button { + width: 24px; + padding: 0; +} +.tree-view .ms-Button-icon { + font-size: 12px; +} + +.tree-view .ms-DetailsRow-cell { + padding-left: 0; + padding-right: 0; +} + +.tree-view-row { + cursor: pointer; + display: block; + height: 22px; + line-height: 22px; + user-select: none; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + font-size: 12px; + display: flex; +} + +.tree-view-row:hover { + background: var(--colorNeutralBackground4); +} + +.tree-view-row.active { + background: var(--colorNeutralBackground2Selected); +} + +.tree-view-row .caret { + width: 16px; + font-size: 16px; + display: inline-block; + vertical-align: middle; +} +.tree-view-row .label { + flex: 1; +} + +.tree-view-row .column:last-child { + margin-right: 5px; +} diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view.tsx b/packages/html-program-viewer/src/react/tree-view/tree-view.tsx new file mode 100644 index 0000000000..ed34bc2c80 --- /dev/null +++ b/packages/html-program-viewer/src/react/tree-view/tree-view.tsx @@ -0,0 +1,103 @@ +import { useSelection, type OnSelectionChangeData } from "@fluentui/react-components"; +import { useCallback, useMemo, useRef, useState } from "react"; +import { TreeViewRow } from "./tree-view-row.js"; +import style from "./tree-view.module.css"; +import type { TreeNode, TreeRow } from "./types.js"; + +export interface TreeViewProps { + readonly tree: TreeNode; + readonly onSelect?: (id: string) => void; +} + +export function TreeView(props: TreeViewProps) { + const onSelectionChange = useCallback( + (_: any, data: OnSelectionChangeData) => { + if (data.selectedItems.size > 0 && props.onSelect) { + props.onSelect(data.selectedItems.keys().next().value); + } + }, + [props.onSelect] + ); + const [selected, methods] = useSelection({ + selectionMode: "single", + onSelectionChange, + }); + const [rerender, setRerender] = useState(false); + + const expanded = useRef(new Set()); + + const toggleExpand = useCallback( + (key: string) => { + console.log("Expand", key, expanded.current.has(key)); + if (expanded.current.has(key)) { + expanded.current.delete(key); + } else { + expanded.current.add(key); + } + setRerender(!rerender); + }, + [expanded, rerender] + ); + + const rows = useMemo( + () => getTreeRowsForNode(expanded.current, toggleExpand, props.tree), + [rerender, toggleExpand, props.tree] + ); + + const activateRow = useCallback( + (row: TreeRow) => { + toggleExpand(row.id); + methods.selectItem(null as any, row.id); + }, + [methods.selectItem, toggleExpand] + ); + return ( +
    + {rows.map((row) => { + return ( + + ); + })} +
    + ); +} + +function getTreeRowsForNode( + expandedItems: Set, + toggleExpand: (key: string) => void, + node: TreeNode, + depth = 0 +) { + const rows: TreeRow[] = []; + if (!node.children) { + return []; + } + for (const child of node.children) { + const hasChildren = Boolean(child.children && child.children.length > 0); + const id = child.id; + + const expanded = expandedItems.has(id); + rows.push({ + id, + item: child as any, + expanded, + depth, + hasChildren, + index: -1, + toggleExpand: () => { + toggleExpand(id); + }, + }); + if (hasChildren && expanded) { + for (const row of getTreeRowsForNode(expandedItems, toggleExpand, child, depth + 1)) { + rows.push(row as any); + } + } + } + return rows; +} diff --git a/packages/html-program-viewer/src/react/tree-view/types.ts b/packages/html-program-viewer/src/react/tree-view/types.ts new file mode 100644 index 0000000000..1d166e853a --- /dev/null +++ b/packages/html-program-viewer/src/react/tree-view/types.ts @@ -0,0 +1,24 @@ +import type { ReactNode } from "react"; + +export interface TreeItem { + readonly name: string; + readonly id: string; +} + +export interface TreeNode extends TreeItem { + readonly children?: Array; +} + +export interface TreeRow { + readonly id: string; + readonly index: number; + readonly item: T; + readonly depth: number; + readonly expanded: boolean; + readonly hasChildren: boolean; + readonly toggleExpand: () => void; +} + +export interface TreeRowColumn { + render: (row: TreeRow) => ReactNode; +} From 4b98678812fb8a2549bebc1e1e45f25968b3fe60 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 15:23:42 -0700 Subject: [PATCH 24/70] Basic --- .../src/react/tree-view/tree-view-row.tsx | 5 +++++ .../src/react/tree-view/tree-view.module.css | 5 ++--- .../src/react/tree-view/tree-view.tsx | 17 +++++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx b/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx index 710ce94f7f..85f5380637 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx +++ b/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx @@ -25,7 +25,12 @@ export function TreeViewRow(props: TreeViewRowProps) { role="treeitem" style={{ paddingLeft }} className={mergeClasses(style["tree-view-row"], active && style["active"])} + aria-selected={active} + aria-expanded={row.expanded} + aria-posinset={row.index} + aria-level={row.depth} onClick={activate} + tabIndex={0} > diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view.module.css b/packages/html-program-viewer/src/react/tree-view/tree-view.module.css index 699f4c8565..84cce88276 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree-view.module.css +++ b/packages/html-program-viewer/src/react/tree-view/tree-view.module.css @@ -39,9 +39,8 @@ .tree-view-row .caret { width: 16px; - font-size: 16px; - display: inline-block; - vertical-align: middle; + display: flex; + align-items: center; } .tree-view-row .label { flex: 1; diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view.tsx b/packages/html-program-viewer/src/react/tree-view/tree-view.tsx index ed34bc2c80..52ea22aa7b 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree-view.tsx +++ b/packages/html-program-viewer/src/react/tree-view/tree-view.tsx @@ -1,4 +1,8 @@ -import { useSelection, type OnSelectionChangeData } from "@fluentui/react-components"; +import { + useArrowNavigationGroup, + useSelection, + type OnSelectionChangeData, +} from "@fluentui/react-components"; import { useCallback, useMemo, useRef, useState } from "react"; import { TreeViewRow } from "./tree-view-row.js"; import style from "./tree-view.module.css"; @@ -51,8 +55,13 @@ export function TreeView(props: TreeViewProps) { }, [methods.selectItem, toggleExpand] ); + const arrowNavigationAttrs = useArrowNavigationGroup({ + axis: "both", + memorizeCurrent: true, + }); + return ( -
    +
    {rows.map((row) => { return ( ( if (!node.children) { return []; } - for (const child of node.children) { + for (const [index, child] of node.children.entries()) { const hasChildren = Boolean(child.children && child.children.length > 0); const id = child.id; @@ -88,7 +97,7 @@ function getTreeRowsForNode( expanded, depth, hasChildren, - index: -1, + index, toggleExpand: () => { toggleExpand(id); }, From 7c47948cf152e77e097b74acaf849da18a5fe775 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 16:07:57 -0700 Subject: [PATCH 25/70] Better keyboard nav --- .../src/react/tree-navigation.tsx | 3 +- .../{tree-view-row.tsx => tree-row.tsx} | 22 +++--- .../{tree-view.module.css => tree.module.css} | 25 +++--- .../tree-view/{tree-view.tsx => tree.tsx} | 76 ++++++++++++++----- .../src/react/tree-view/types.ts | 1 + 5 files changed, 88 insertions(+), 39 deletions(-) rename packages/html-program-viewer/src/react/tree-view/{tree-view-row.tsx => tree-row.tsx} (73%) rename packages/html-program-viewer/src/react/tree-view/{tree-view.module.css => tree.module.css} (67%) rename packages/html-program-viewer/src/react/tree-view/{tree-view.tsx => tree.tsx} (54%) diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 8ec903fa0a..f1b4f8fad1 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -6,7 +6,6 @@ import { } from "@fluentui/react-components"; import { useCallback, useMemo, useState } from "react"; import style from "./tree-navigation.module.css"; -import { TreeView } from "./tree-view/tree-view.js"; import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; export interface TreeNavigationProps {} @@ -27,7 +26,7 @@ export const TreeNavigation = (_: TreeNavigationProps) => { return new Set([...openItems, ...path.map((_, i) => path.slice(0, i + 1).join("."))]); }, [openItems, nav.selectedPath]); - return ; + return ; }; const TreeNodeItemsUI = ({ nodes }: { nodes: TypeGraphNode[] }) => { diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx b/packages/html-program-viewer/src/react/tree-view/tree-row.tsx similarity index 73% rename from packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx rename to packages/html-program-viewer/src/react/tree-view/tree-row.tsx index 85f5380637..726744b756 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree-view-row.tsx +++ b/packages/html-program-viewer/src/react/tree-view/tree-row.tsx @@ -3,34 +3,38 @@ import type { TreeRow, TreeRowColumn } from "./types.js"; import { mergeClasses } from "@fluentui/react-components"; import { useCallback, type SyntheticEvent } from "react"; -import style from "./tree-view.module.css"; +import style from "./tree.module.css"; const INDENT_SIZE = 8; export interface TreeViewRowProps { + readonly id: string; + readonly focussed: boolean; readonly row: TreeRow; readonly active: boolean; readonly columns?: Array>; readonly activate: (row: TreeRow) => void; } -export function TreeViewRow(props: TreeViewRowProps) { - const { row, active } = props; - +export function TreeViewRow({ id, row, active, focussed, activate }: TreeViewRowProps) { const paddingLeft = row.depth * INDENT_SIZE; - const activate = useCallback(() => props.activate(props.row), [props.activate, props.row]); + const onClick = useCallback(() => activate(row), [activate, row]); return (
    diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view.module.css b/packages/html-program-viewer/src/react/tree-view/tree.module.css similarity index 67% rename from packages/html-program-viewer/src/react/tree-view/tree-view.module.css rename to packages/html-program-viewer/src/react/tree-view/tree.module.css index 84cce88276..feadc0dee2 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree-view.module.css +++ b/packages/html-program-viewer/src/react/tree-view/tree.module.css @@ -1,22 +1,26 @@ -.tree-view .ms-DetailsRow { +.tree { + outline: none; +} + +.tree .ms-DetailsRow { width: 100%; cursor: pointer; } -.tree-view .ms-Button { +.tree .ms-Button { width: 24px; padding: 0; } -.tree-view .ms-Button-icon { +.tree .ms-Button-icon { font-size: 12px; } -.tree-view .ms-DetailsRow-cell { +.tree .ms-DetailsRow-cell { padding-left: 0; padding-right: 0; } -.tree-view-row { +.tree-row { cursor: pointer; display: block; height: 22px; @@ -29,23 +33,24 @@ display: flex; } -.tree-view-row:hover { +.tree-row:hover, +.tree-row.focus { background: var(--colorNeutralBackground4); } -.tree-view-row.active { +.tree-row.active { background: var(--colorNeutralBackground2Selected); } -.tree-view-row .caret { +.tree-row .caret { width: 16px; display: flex; align-items: center; } -.tree-view-row .label { +.tree-row .label { flex: 1; } -.tree-view-row .column:last-child { +.tree-row .column:last-child { margin-right: 5px; } diff --git a/packages/html-program-viewer/src/react/tree-view/tree-view.tsx b/packages/html-program-viewer/src/react/tree-view/tree.tsx similarity index 54% rename from packages/html-program-viewer/src/react/tree-view/tree-view.tsx rename to packages/html-program-viewer/src/react/tree-view/tree.tsx index 52ea22aa7b..35876eb37d 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree-view.tsx +++ b/packages/html-program-viewer/src/react/tree-view/tree.tsx @@ -1,19 +1,17 @@ -import { - useArrowNavigationGroup, - useSelection, - type OnSelectionChangeData, -} from "@fluentui/react-components"; -import { useCallback, useMemo, useRef, useState } from "react"; -import { TreeViewRow } from "./tree-view-row.js"; -import style from "./tree-view.module.css"; +import { useSelection, type OnSelectionChangeData } from "@fluentui/react-components"; +import { useCallback, useId, useMemo, useRef, useState, type KeyboardEvent } from "react"; +import { TreeViewRow } from "./tree-row.js"; +import style from "./tree.module.css"; import type { TreeNode, TreeRow } from "./types.js"; -export interface TreeViewProps { +export interface TreeViewProps { readonly tree: TreeNode; readonly onSelect?: (id: string) => void; } -export function TreeView(props: TreeViewProps) { +export function Tree(props: TreeViewProps) { + const id = useId(); + const [focusedIndex, setFocusedIndex] = useState(0); const onSelectionChange = useCallback( (_: any, data: OnSelectionChangeData) => { if (data.selectedItems.size > 0 && props.onSelect) { @@ -32,7 +30,6 @@ export function TreeView(props: TreeViewProps) { const toggleExpand = useCallback( (key: string) => { - console.log("Expand", key, expanded.current.has(key)); if (expanded.current.has(key)) { expanded.current.delete(key); } else { @@ -49,22 +46,60 @@ export function TreeView(props: TreeViewProps) { ); const activateRow = useCallback( - (row: TreeRow) => { + (row: TreeRow) => { + setFocusedIndex(row.index); toggleExpand(row.id); methods.selectItem(null as any, row.id); }, [methods.selectItem, toggleExpand] ); - const arrowNavigationAttrs = useArrowNavigationGroup({ - axis: "both", - memorizeCurrent: true, - }); + + const handleKeyDown = useCallback( + (event: KeyboardEvent) => { + const curTreeRow = rows[focusedIndex]; + switch (event.code) { + case "ArrowDown": // Move focus down + setFocusedIndex((focusedIndex + 1) % rows.length); + event.preventDefault(); + break; + case "ArrowUp": // Move focus up + setFocusedIndex((focusedIndex - 1) % rows.length); + + event.preventDefault(); + break; + case "ArrowRight": // Expand current row if applicable + curTreeRow.toggleExpand(); + event.preventDefault(); + break; + case "ArrowLeft": // Expand current row if applicable + curTreeRow.toggleExpand(); + event.preventDefault(); + break; + case "Space": + case "Enter": + activateRow(curTreeRow); + event.preventDefault(); + return; + default: + } + }, + [setFocusedIndex, focusedIndex, rows, activateRow] + ); return ( -
    +
    {rows.map((row) => { return ( ( const expanded = expandedItems.has(id); rows.push({ id, + index: -1, item: child as any, expanded, depth, hasChildren, - index, + localIndex: index, toggleExpand: () => { toggleExpand(id); }, @@ -107,6 +143,10 @@ function getTreeRowsForNode( rows.push(row as any); } } + + for (let i = 0; i < rows.length; i++) { + (rows[i] as any).index = i; + } } return rows; } diff --git a/packages/html-program-viewer/src/react/tree-view/types.ts b/packages/html-program-viewer/src/react/tree-view/types.ts index 1d166e853a..a695eec198 100644 --- a/packages/html-program-viewer/src/react/tree-view/types.ts +++ b/packages/html-program-viewer/src/react/tree-view/types.ts @@ -12,6 +12,7 @@ export interface TreeNode extends TreeItem { export interface TreeRow { readonly id: string; readonly index: number; + readonly localIndex: number; readonly item: T; readonly depth: number; readonly expanded: boolean; From deffd08b54f5308e4c7b69a97807bb5f7aafef22 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 16:10:00 -0700 Subject: [PATCH 26/70] Fix --- .../src/react/tree-navigation.tsx | 38 ++----------------- .../src/react/{tree-view => tree}/index.ts | 0 .../react/{tree-view => tree}/tree-row.tsx | 0 .../react/{tree-view => tree}/tree.module.css | 20 +--------- .../src/react/{tree-view => tree}/tree.tsx | 0 .../src/react/{tree-view => tree}/types.ts | 0 6 files changed, 4 insertions(+), 54 deletions(-) rename packages/html-program-viewer/src/react/{tree-view => tree}/index.ts (100%) rename packages/html-program-viewer/src/react/{tree-view => tree}/tree-row.tsx (100%) rename packages/html-program-viewer/src/react/{tree-view => tree}/tree.module.css (71%) rename packages/html-program-viewer/src/react/{tree-view => tree}/tree.tsx (100%) rename packages/html-program-viewer/src/react/{tree-view => tree}/types.ts (100%) diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index f1b4f8fad1..82c84510cf 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,12 +1,7 @@ -import { - Tree, - TreeItem, - TreeItemLayout, - type TreeOpenChangeData, -} from "@fluentui/react-components"; +import { type TreeOpenChangeData } from "@fluentui/react-components"; import { useCallback, useMemo, useState } from "react"; -import style from "./tree-navigation.module.css"; -import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; +import { Tree } from "./tree/tree.js"; +import { useTreeNavigator } from "./use-tree-navigation.js"; export interface TreeNavigationProps {} @@ -28,30 +23,3 @@ export const TreeNavigation = (_: TreeNavigationProps) => { return ; }; - -const TreeNodeItemsUI = ({ nodes }: { nodes: TypeGraphNode[] }) => { - return ( - <> - {nodes.map((node) => { - return ; - })} - - ); -}; - -const TreeNodeUI = ({ node }: { node: TypeGraphNode }) => { - const nav = useTreeNavigator(); - const selected = nav.selectedPath === node.id; - return ( - - - {node.name} - - {node.children.length > 0 && ( - - - - )} - - ); -}; diff --git a/packages/html-program-viewer/src/react/tree-view/index.ts b/packages/html-program-viewer/src/react/tree/index.ts similarity index 100% rename from packages/html-program-viewer/src/react/tree-view/index.ts rename to packages/html-program-viewer/src/react/tree/index.ts diff --git a/packages/html-program-viewer/src/react/tree-view/tree-row.tsx b/packages/html-program-viewer/src/react/tree/tree-row.tsx similarity index 100% rename from packages/html-program-viewer/src/react/tree-view/tree-row.tsx rename to packages/html-program-viewer/src/react/tree/tree-row.tsx diff --git a/packages/html-program-viewer/src/react/tree-view/tree.module.css b/packages/html-program-viewer/src/react/tree/tree.module.css similarity index 71% rename from packages/html-program-viewer/src/react/tree-view/tree.module.css rename to packages/html-program-viewer/src/react/tree/tree.module.css index feadc0dee2..8f0c614a40 100644 --- a/packages/html-program-viewer/src/react/tree-view/tree.module.css +++ b/packages/html-program-viewer/src/react/tree/tree.module.css @@ -1,25 +1,6 @@ .tree { outline: none; } - -.tree .ms-DetailsRow { - width: 100%; - cursor: pointer; -} - -.tree .ms-Button { - width: 24px; - padding: 0; -} -.tree .ms-Button-icon { - font-size: 12px; -} - -.tree .ms-DetailsRow-cell { - padding-left: 0; - padding-right: 0; -} - .tree-row { cursor: pointer; display: block; @@ -47,6 +28,7 @@ display: flex; align-items: center; } + .tree-row .label { flex: 1; } diff --git a/packages/html-program-viewer/src/react/tree-view/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx similarity index 100% rename from packages/html-program-viewer/src/react/tree-view/tree.tsx rename to packages/html-program-viewer/src/react/tree/tree.tsx diff --git a/packages/html-program-viewer/src/react/tree-view/types.ts b/packages/html-program-viewer/src/react/tree/types.ts similarity index 100% rename from packages/html-program-viewer/src/react/tree-view/types.ts rename to packages/html-program-viewer/src/react/tree/types.ts From 303bbb5d1b9403428b511367a84af6e81f2cd32c Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 17:14:05 -0700 Subject: [PATCH 27/70] Expand --- .../src/react/tree-navigation.tsx | 17 +--- .../src/react/tree/tree-control.ts | 46 +++++++++++ .../src/react/tree/tree.tsx | 80 ++++++++++--------- 3 files changed, 90 insertions(+), 53 deletions(-) create mode 100644 packages/html-program-viewer/src/react/tree/tree-control.ts diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 82c84510cf..7c21599ed0 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,5 +1,3 @@ -import { type TreeOpenChangeData } from "@fluentui/react-components"; -import { useCallback, useMemo, useState } from "react"; import { Tree } from "./tree/tree.js"; import { useTreeNavigator } from "./use-tree-navigation.js"; @@ -7,19 +5,6 @@ export interface TreeNavigationProps {} export const TreeNavigation = (_: TreeNavigationProps) => { const nav = useTreeNavigator(); - const [openItems, setOpenItems] = useState>(new Set()); - const onOpenChange = useCallback( - (evt: any, data: TreeOpenChangeData) => { - setOpenItems(data.openItems); - }, - [setOpenItems] - ); - - const resolvedOpenItems = useMemo(() => { - const path = nav.selectedPath.split("."); - return new Set([...openItems, ...path.map((_, i) => path.slice(0, i + 1).join("."))]); - }, [openItems, nav.selectedPath]); - - return ; + return ; }; diff --git a/packages/html-program-viewer/src/react/tree/tree-control.ts b/packages/html-program-viewer/src/react/tree/tree-control.ts new file mode 100644 index 0000000000..bba71a873e --- /dev/null +++ b/packages/html-program-viewer/src/react/tree/tree-control.ts @@ -0,0 +1,46 @@ +import { useCallback, useMemo, useRef, useState } from "react"; + +export interface TreeControls { + readonly renderSignal: number; + readonly expanded: Set; + expand(key: string): void; + collapse(key: string): void; + toggleExpand(key: string): void; +} + +export function useTreeControls(): TreeControls { + const expanded = useRef(new Set()).current; + const [rerender, setRerender] = useState(0); + + const toggleExpand = useCallback( + (key: string) => { + if (expanded.has(key)) { + expanded.delete(key); + } else { + expanded.add(key); + } + setRerender((x) => x + 1); + }, + [expanded] + ); + + const expand = useCallback( + (key: string) => { + expanded.add(key); + setRerender((x) => x + 1); + }, + [expanded] + ); + const collapse = useCallback( + (key: string) => { + expanded.delete(key); + setRerender((x) => x + 1); + }, + [expanded] + ); + + return useMemo( + () => ({ expanded, toggleExpand, expand, collapse, renderSignal: rerender }), + [expanded, toggleExpand, expand, collapse, expanded, rerender] + ); +} diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 35876eb37d..859754dfa8 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -1,57 +1,48 @@ -import { useSelection, type OnSelectionChangeData } from "@fluentui/react-components"; -import { useCallback, useId, useMemo, useRef, useState, type KeyboardEvent } from "react"; +import { useControllableValue } from "@typespec/react-components"; +import { useCallback, useEffect, useId, useMemo, useState, type KeyboardEvent } from "react"; +import { useTreeControls } from "./tree-control.js"; import { TreeViewRow } from "./tree-row.js"; -import style from "./tree.module.css"; import type { TreeNode, TreeRow } from "./types.js"; +import style from "./tree.module.css"; + export interface TreeViewProps { readonly tree: TreeNode; + readonly selected?: string; readonly onSelect?: (id: string) => void; } export function Tree(props: TreeViewProps) { const id = useId(); + const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls(); const [focusedIndex, setFocusedIndex] = useState(0); - const onSelectionChange = useCallback( - (_: any, data: OnSelectionChangeData) => { - if (data.selectedItems.size > 0 && props.onSelect) { - props.onSelect(data.selectedItems.keys().next().value); - } - }, - [props.onSelect] - ); - const [selected, methods] = useSelection({ - selectionMode: "single", - onSelectionChange, - }); - const [rerender, setRerender] = useState(false); - - const expanded = useRef(new Set()); - - const toggleExpand = useCallback( - (key: string) => { - if (expanded.current.has(key)) { - expanded.current.delete(key); - } else { - expanded.current.add(key); - } - setRerender(!rerender); - }, - [expanded, rerender] + const [selectedKey, setSelectedKey] = useControllableValue( + props.selected, + undefined, + props.onSelect ); const rows = useMemo( - () => getTreeRowsForNode(expanded.current, toggleExpand, props.tree), - [rerender, toggleExpand, props.tree] + () => getTreeRowsForNode(expanded, toggleExpand, props.tree), + [renderSignal, toggleExpand, props.tree] ); + const parentMap = useMemo(() => computeParent(props.tree), [props.tree]); + useEffect(() => { + expand(selectedKey); + let current = parentMap.get(selectedKey); + while (current) { + expand(current); + current = parentMap.get(current); + } + }, [expand, selectedKey]); const activateRow = useCallback( (row: TreeRow) => { setFocusedIndex(row.index); toggleExpand(row.id); - methods.selectItem(null as any, row.id); + setSelectedKey(row.id); }, - [methods.selectItem, toggleExpand] + [selectedKey, toggleExpand] ); const handleKeyDown = useCallback( @@ -68,11 +59,11 @@ export function Tree(props: TreeViewProps) { event.preventDefault(); break; case "ArrowRight": // Expand current row if applicable - curTreeRow.toggleExpand(); + expand(curTreeRow.id); event.preventDefault(); break; case "ArrowLeft": // Expand current row if applicable - curTreeRow.toggleExpand(); + collapse(curTreeRow.id); event.preventDefault(); break; case "Space": @@ -83,7 +74,7 @@ export function Tree(props: TreeViewProps) { default: } }, - [setFocusedIndex, focusedIndex, rows, activateRow] + [setFocusedIndex, focusedIndex, rows, activateRow, expand, collapse] ); return ( @@ -102,7 +93,7 @@ export function Tree(props: TreeViewProps) { focussed={focusedIndex === row.index} key={row.id} row={row} - active={selected.has(row.id)} + active={row.id === selectedKey} activate={activateRow} /> ); @@ -150,3 +141,18 @@ function getTreeRowsForNode( } return rows; } + +function computeParent(node: TreeNode) { + const map = new Map(); + const queue: TreeNode[] = [node]; + let current; + while ((current = queue.pop())) { + if (current.children) { + for (const child of current.children) { + map.set(child.id, current.id); + queue.push(child); + } + } + } + return map; +} From 1d7c549e5e416567800e5b87da32c123c3ccd8f9 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 17:33:57 -0700 Subject: [PATCH 28/70] Add icons --- .../src/react/tree-navigation.module.css | 12 +++++----- .../src/react/tree-navigation.tsx | 23 +++++++++++++++++-- .../src/react/tree/tree-row.tsx | 12 +++++++--- .../src/react/tree/tree.module.css | 6 +++++ .../src/react/tree/tree.tsx | 18 +++++++++++---- .../src/react/tree/types.ts | 3 ++- 6 files changed, 58 insertions(+), 16 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree-navigation.module.css b/packages/html-program-viewer/src/react/tree-navigation.module.css index d4f9618af8..f366fd92d6 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.module.css +++ b/packages/html-program-viewer/src/react/tree-navigation.module.css @@ -1,7 +1,7 @@ -.tree-navigation :global(.fui-Radio) { - display: none; -} - -.selected { - background-color: var(--colorNeutralBackground4); +.type-kind-icon { + color: var(--colorPaletteBerryForeground2); + font-weight: bold; + padding: 1px 1px; + border-radius: 2px; + line-height: 16px; } diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 7c21599ed0..cae4c47463 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,10 +1,29 @@ +import { AppsListRegular } from "@fluentui/react-icons"; import { Tree } from "./tree/tree.js"; -import { useTreeNavigator } from "./use-tree-navigation.js"; +import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; + +import style from "./tree-navigation.module.css"; export interface TreeNavigationProps {} export const TreeNavigation = (_: TreeNavigationProps) => { const nav = useTreeNavigator(); - return ; + return ( + + tree={nav.tree} + nodeIcon={NodeIcon} + selected={nav.selectedPath} + onSelect={nav.selectPath} + /> + ); +}; + +const NodeIcon = ({ node }: { node: TypeGraphNode }) => { + switch (node.kind) { + case "type": + return {node.type.kind[0]}; + case "list": + return ; + } }; diff --git a/packages/html-program-viewer/src/react/tree/tree-row.tsx b/packages/html-program-viewer/src/react/tree/tree-row.tsx index 726744b756..99adc030f9 100644 --- a/packages/html-program-viewer/src/react/tree/tree-row.tsx +++ b/packages/html-program-viewer/src/react/tree/tree-row.tsx @@ -1,8 +1,8 @@ import { ChevronDownRegular, ChevronRightRegular } from "@fluentui/react-icons"; -import type { TreeRow, TreeRowColumn } from "./types.js"; +import type { TreeNode, TreeRow, TreeRowColumn } from "./types.js"; import { mergeClasses } from "@fluentui/react-components"; -import { useCallback, type SyntheticEvent } from "react"; +import { useCallback, type FC, type SyntheticEvent } from "react"; import style from "./tree.module.css"; const INDENT_SIZE = 8; @@ -13,10 +13,11 @@ export interface TreeViewRowProps { readonly row: TreeRow; readonly active: boolean; readonly columns?: Array>; + readonly icon?: FC<{ node: TreeNode }>; readonly activate: (row: TreeRow) => void; } -export function TreeViewRow({ id, row, active, focussed, activate }: TreeViewRowProps) { +export function TreeViewRow({ id, row, active, focussed, activate, icon: Icon }: TreeViewRowProps) { const paddingLeft = row.depth * INDENT_SIZE; const onClick = useCallback(() => activate(row), [activate, row]); @@ -39,6 +40,11 @@ export function TreeViewRow({ id, row, active, focussed, activate }: TreeViewRow + {Icon && ( + + + + )} {row.item.name} diff --git a/packages/html-program-viewer/src/react/tree/tree.module.css b/packages/html-program-viewer/src/react/tree/tree.module.css index 8f0c614a40..5970f1a208 100644 --- a/packages/html-program-viewer/src/react/tree/tree.module.css +++ b/packages/html-program-viewer/src/react/tree/tree.module.css @@ -29,6 +29,12 @@ align-items: center; } +.tree-row .icon { + width: 16px; + display: flex; + align-items: center; +} + .tree-row .label { flex: 1; } diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 859754dfa8..84f2df3b0e 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -1,18 +1,27 @@ import { useControllableValue } from "@typespec/react-components"; -import { useCallback, useEffect, useId, useMemo, useState, type KeyboardEvent } from "react"; +import { + useCallback, + useEffect, + useId, + useMemo, + useState, + type FC, + type KeyboardEvent, +} from "react"; import { useTreeControls } from "./tree-control.js"; import { TreeViewRow } from "./tree-row.js"; import type { TreeNode, TreeRow } from "./types.js"; import style from "./tree.module.css"; -export interface TreeViewProps { - readonly tree: TreeNode; +export interface TreeViewProps { + readonly tree: T; + readonly nodeIcon?: FC<{ node: T }>; readonly selected?: string; readonly onSelect?: (id: string) => void; } -export function Tree(props: TreeViewProps) { +export function Tree(props: TreeViewProps) { const id = useId(); const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls(); const [focusedIndex, setFocusedIndex] = useState(0); @@ -90,6 +99,7 @@ export function Tree(props: TreeViewProps) { return ( ; + readonly children?: TreeNode[]; } export interface TreeRow { @@ -17,6 +17,7 @@ export interface TreeRow { readonly depth: number; readonly expanded: boolean; readonly hasChildren: boolean; + readonly icon?: ReactNode; readonly toggleExpand: () => void; } From 59b9066641c9af21b89a68253f3243f5cc639114 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 19:52:01 -0700 Subject: [PATCH 29/70] fix --- .../html-program-viewer/src/react/tree-navigation.tsx | 1 + .../src/react/use-tree-navigation.tsx | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index cae4c47463..7d55763487 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -20,6 +20,7 @@ export const TreeNavigation = (_: TreeNavigationProps) => { }; const NodeIcon = ({ node }: { node: TypeGraphNode }) => { + console.log("NOde", node); switch (node.kind) { case "type": return {node.type.kind[0]}; diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.tsx b/packages/html-program-viewer/src/react/use-tree-navigation.tsx index 44d4d84802..0be8912c69 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/use-tree-navigation.tsx @@ -105,6 +105,10 @@ function computeTree(program: Program): TypeGraphListNode { type NamedType = Type & { name: string }; +function isMapLike(value: any): value is Map { + return "entries" in value && typeof value.entries === "function"; +} + function computeTypeNode(parentPath: string, type: NamedType, name?: string): TypeGraphTypeNode { const path = parentPath + "." + type.name; @@ -112,7 +116,12 @@ function computeTypeNode(parentPath: string, type: NamedType, name?: string): Ty const children: TypeGraphNode[] = Object.entries(type) .filter(([key]) => typeRendering?.[key] === "nested") .map(([key, value]): TypeGraphNode => { - return computeItemList(path + "." + key, key, value); + const propPath = path + "." + key; + if (isMapLike(value)) { + return computeItemList(propPath, key, value); + } else { + return computeTypeNode(propPath, value, key); + } }); return { From 5f2c03cf0d384cebdb0619b038f6faa3a78ff50a Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 20:08:18 -0700 Subject: [PATCH 30/70] fix --- .../inspect-type/inspect-type.module.css | 4 +++ .../src/react/inspect-type/inspect-type.tsx | 28 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css b/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css index 0a44d75015..cbcb46ddcf 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css @@ -15,8 +15,12 @@ position: relative; } +.type-ui { + display: inline; +} .type-ui-header { cursor: pointer; + display: inline; } .type-ui-header:hover { diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index 32643e3287..128fa6e701 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -38,7 +38,7 @@ const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { const navToType = useCallback(() => nav.navToType(type), [nav.navToType, type]); return ( -
    +
    {" "} {"name" in type ? type.name?.toString() : ""} @@ -69,6 +69,27 @@ const EntityReference = ({ entity }: { entity: Entity }) => { return null; } }; + +const ParentReference = ({ type }: { type: Type }) => { + switch (type.kind) { + case "Namespace": + case "Operation": + case "Interface": + case "Enum": + case "ModelProperty": + case "Scalar": + case "Model": + case "Union": + if (type.name !== undefined) { + return ; + } else { + return null; + } + default: + return null; + } +}; + const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { switch (type.kind) { case "Namespace": @@ -166,7 +187,10 @@ const EntityProperty = (props: EntityPropertyProps) => { const EntityPropertyValue = ({ value, action }: EntityPropertyProps) => { const render = (x: Entity) => { - const renderRef = action === "ref" || action === "parent"; + if (action === "parent") { + return x.entityKind === "Type" ? : null; + } + const renderRef = action === "ref"; return renderRef ? : ; }; From 01a6567bf40c3e60958c127a0025e97d90360849 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 20:09:23 -0700 Subject: [PATCH 31/70] fix divider type --- .../src/react/type-view/type-view.module.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/html-program-viewer/src/react/type-view/type-view.module.css b/packages/html-program-viewer/src/react/type-view/type-view.module.css index 8314cbcd17..57c6a59981 100644 --- a/packages/html-program-viewer/src/react/type-view/type-view.module.css +++ b/packages/html-program-viewer/src/react/type-view/type-view.module.css @@ -22,9 +22,6 @@ gap: 10px; } -.divider { - margin: 0 -10px; -} .doc { color: var(--colorNeutralForeground3); } From 96f473939081fa4f1daa779463419bc1c9682f7e Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 20:46:09 -0700 Subject: [PATCH 32/70] Tweaks --- .../react/list-type-view/list-type-view.module.css | 8 ++++++++ .../list-type-view.tsx} | 13 +++++++++---- .../html-program-viewer/src/react/type-graph.tsx | 6 +++--- .../src/react/use-tree-navigation.tsx | 12 +++++------- packages/html-program-viewer/src/utils.ts | 5 +++++ 5 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 packages/html-program-viewer/src/react/list-type-view/list-type-view.module.css rename packages/html-program-viewer/src/react/{list-node-view.tsx => list-type-view/list-type-view.tsx} (75%) diff --git a/packages/html-program-viewer/src/react/list-type-view/list-type-view.module.css b/packages/html-program-viewer/src/react/list-type-view/list-type-view.module.css new file mode 100644 index 0000000000..54efa89671 --- /dev/null +++ b/packages/html-program-viewer/src/react/list-type-view/list-type-view.module.css @@ -0,0 +1,8 @@ +.item { + border-top: 1px solid var(--colorNeutralStroke1); + padding: 5px 0 !important; +} + +.item:hover { + background-color: var(--colorNeutralBackground1Hover); +} diff --git a/packages/html-program-viewer/src/react/list-node-view.tsx b/packages/html-program-viewer/src/react/list-type-view/list-type-view.tsx similarity index 75% rename from packages/html-program-viewer/src/react/list-node-view.tsx rename to packages/html-program-viewer/src/react/list-type-view/list-type-view.tsx index 19f5169ef0..6a22c1bfb0 100644 --- a/packages/html-program-viewer/src/react/list-node-view.tsx +++ b/packages/html-program-viewer/src/react/list-type-view/list-type-view.tsx @@ -1,13 +1,14 @@ import { Card, CardHeader, Text } from "@fluentui/react-components"; import { List, ListItem } from "@fluentui/react-list-preview"; import { useCallback } from "react"; -import type { TreeNavigator, TypeGraphListNode, TypeGraphNode } from "./use-tree-navigation.js"; +import type { TreeNavigator, TypeGraphListNode, TypeGraphNode } from "../use-tree-navigation.js"; +import style from "./list-type-view.module.css"; -export interface ListNodeViewProps { +export interface ListTypeViewProps { readonly nav: TreeNavigator; readonly node: TypeGraphListNode; } -export const ListNodeView = ({ nav, node }: ListNodeViewProps) => { +export const ListTypeView = ({ nav, node }: ListTypeViewProps) => { return ( { const select = useCallback(() => { nav.selectPath(item.id); }, [nav.selectPath]); - return {item.name}; + return ( + + {item.name} + + ); }; diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 7ce2becb76..8ceeeb034d 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -10,7 +10,7 @@ import type { Program } from "@typespec/compiler"; import { Pane, SplitPane } from "@typespec/react-components"; import { Fragment, type FunctionComponent } from "react"; import ReactDOMServer from "react-dom/server"; -import { ListNodeView } from "./list-node-view.js"; +import { ListTypeView } from "./list-type-view/list-type-view.js"; import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; import style from "./type-graph.module.css"; @@ -56,9 +56,9 @@ const TypeGraphContent = () => { case "type": return ; case "list": - return ; + return ; default: - return ; + return ; } }; diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.tsx b/packages/html-program-viewer/src/react/use-tree-navigation.tsx index 0be8912c69..f3f38e3f95 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/use-tree-navigation.tsx @@ -1,5 +1,6 @@ import { getNamespaceFullName, type Namespace, type Program, type Type } from "@typespec/compiler"; import { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from "react"; +import { isMapLike, type NamedType } from "../utils.js"; import { TypeConfig } from "./type-config.js"; export interface TypeGraphNodeBase { @@ -103,15 +104,12 @@ function computeTree(program: Program): TypeGraphListNode { }; } -type NamedType = Type & { name: string }; - -function isMapLike(value: any): value is Map { - return "entries" in value && typeof value.entries === "function"; -} - function computeTypeNode(parentPath: string, type: NamedType, name?: string): TypeGraphTypeNode { const path = parentPath + "." + type.name; + return computeTypeNodeProps(path, type, name); +} +function computeTypeNodeProps(path: string, type: NamedType, name?: string): TypeGraphTypeNode { const typeRendering = (TypeConfig as any)[type.kind]; const children: TypeGraphNode[] = Object.entries(type) .filter(([key]) => typeRendering?.[key] === "nested") @@ -120,7 +118,7 @@ function computeTypeNode(parentPath: string, type: NamedType, name?: string): Ty if (isMapLike(value)) { return computeItemList(propPath, key, value); } else { - return computeTypeNode(propPath, value, key); + return computeTypeNodeProps(propPath, value, key); } }); diff --git a/packages/html-program-viewer/src/utils.ts b/packages/html-program-viewer/src/utils.ts index ccd79a8052..4b15a8319b 100644 --- a/packages/html-program-viewer/src/utils.ts +++ b/packages/html-program-viewer/src/utils.ts @@ -17,7 +17,12 @@ export function getIdForType(type: Type): string | undefined { return undefined; } } +export type NamedType = Type & { name: string }; export function isNamedUnion(union: Union): union is Union & { name: string } { return union.name !== undefined; } + +export function isMapLike(value: any): value is Map { + return "entries" in value && typeof value.entries === "function"; +} From 42f22580bc1978f3242bb606df488318e8cdedea Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 21:26:45 -0700 Subject: [PATCH 33/70] Basic Search --- .../src/react/tree-navigation.module.css | 12 ++++ .../src/react/tree-navigation.tsx | 69 ++++++++++++++++--- .../src/react/tree/tree-control.ts | 12 +++- .../src/react/tree/tree.tsx | 28 ++++---- 4 files changed, 98 insertions(+), 23 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree-navigation.module.css b/packages/html-program-viewer/src/react/tree-navigation.module.css index f366fd92d6..0fcd43d39e 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.module.css +++ b/packages/html-program-viewer/src/react/tree-navigation.module.css @@ -5,3 +5,15 @@ border-radius: 2px; line-height: 16px; } + +.search { + width: 100%; + outline: none; + border: none; + border-bottom: 1px solid var(--colorNeutralStroke1); + height: 22px; + line-height: 22px; +} +.search:focus { + border-bottom: 1px solid var(--colorBrandForeground1); +} diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 7d55763487..0207eb17c6 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,26 +1,77 @@ import { AppsListRegular } from "@fluentui/react-icons"; +import { useState } from "react"; +import style from "./tree-navigation.module.css"; import { Tree } from "./tree/tree.js"; import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; -import style from "./tree-navigation.module.css"; - export interface TreeNavigationProps {} +function filterTree( + tree: TypeGraphNode, + search: string +): { tree: TypeGraphNode | undefined; expandPaths: string[] } { + const expandPaths: string[] = []; + if (search === "") { + return { tree, expandPaths }; + } + + const result = filterNode(tree, search, expandPaths); + + return { tree: result, expandPaths }; +} + +function filterNode( + node: TypeGraphNode, + search: string, + expandPaths: string[] +): TypeGraphNode | undefined { + if (typeof node.name === "string" && node.name.toLowerCase().includes(search.toLowerCase())) { + return node; + } + const children = node.children + .map((x) => filterNode(x, search, expandPaths)) + .filter((x): x is TypeGraphNode => x !== undefined); + + if (children.length === 0) { + return undefined; + } + + expandPaths.push(node.id); + return { + ...node, + children, + }; +} + export const TreeNavigation = (_: TreeNavigationProps) => { + const [search, updateSearch] = useState(""); const nav = useTreeNavigator(); + const filter = filterTree(nav.tree, search); return ( - - tree={nav.tree} - nodeIcon={NodeIcon} - selected={nav.selectedPath} - onSelect={nav.selectPath} - /> +
    + updateSearch(x.target.value)} + /> + {filter.tree === undefined ? ( + "No results" + ) : ( + + tree={filter.tree} + expandNodes={filter.expandPaths} + nodeIcon={NodeIcon} + selected={nav.selectedPath} + onSelect={nav.selectPath} + /> + )} +
    ); }; const NodeIcon = ({ node }: { node: TypeGraphNode }) => { - console.log("NOde", node); switch (node.kind) { case "type": return {node.type.kind[0]}; diff --git a/packages/html-program-viewer/src/react/tree/tree-control.ts b/packages/html-program-viewer/src/react/tree/tree-control.ts index bba71a873e..48daae73b3 100644 --- a/packages/html-program-viewer/src/react/tree/tree-control.ts +++ b/packages/html-program-viewer/src/react/tree/tree-control.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; export interface TreeControls { readonly renderSignal: number; @@ -8,10 +8,18 @@ export interface TreeControls { toggleExpand(key: string): void; } -export function useTreeControls(): TreeControls { +export function useTreeControls({ expandNodes }: { expandNodes?: string[] }): TreeControls { const expanded = useRef(new Set()).current; const [rerender, setRerender] = useState(0); + useEffect(() => { + if (expandNodes) { + for (const key of expandNodes) { + expanded.add(key); + } + setRerender((x) => x + 1); + } + }, [expandNodes]); const toggleExpand = useCallback( (key: string) => { if (expanded.has(key)) { diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 84f2df3b0e..18f39a1bd7 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -19,23 +19,28 @@ export interface TreeViewProps { readonly nodeIcon?: FC<{ node: T }>; readonly selected?: string; readonly onSelect?: (id: string) => void; + readonly expandNodes?: string[]; } -export function Tree(props: TreeViewProps) { +export function Tree({ + tree, + selected, + onSelect, + expandNodes, + nodeIcon, +}: TreeViewProps) { const id = useId(); - const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls(); + const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ + expandNodes, + }); const [focusedIndex, setFocusedIndex] = useState(0); - const [selectedKey, setSelectedKey] = useControllableValue( - props.selected, - undefined, - props.onSelect - ); + const [selectedKey, setSelectedKey] = useControllableValue(selected, undefined, onSelect); const rows = useMemo( - () => getTreeRowsForNode(expanded, toggleExpand, props.tree), - [renderSignal, toggleExpand, props.tree] + () => getTreeRowsForNode(expanded, toggleExpand, tree), + [renderSignal, toggleExpand, tree] ); - const parentMap = useMemo(() => computeParent(props.tree), [props.tree]); + const parentMap = useMemo(() => computeParent(tree), [tree]); useEffect(() => { expand(selectedKey); @@ -64,7 +69,6 @@ export function Tree(props: TreeViewProps) { break; case "ArrowUp": // Move focus up setFocusedIndex((focusedIndex - 1) % rows.length); - event.preventDefault(); break; case "ArrowRight": // Expand current row if applicable @@ -99,7 +103,7 @@ export function Tree(props: TreeViewProps) { return ( Date: Sun, 16 Jun 2024 21:31:01 -0700 Subject: [PATCH 34/70] . --- .../src/react/type-graph.module.css | 1 + .../src/react/type-graph.tsx | 38 ++++++++++--------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/html-program-viewer/src/react/type-graph.module.css b/packages/html-program-viewer/src/react/type-graph.module.css index bdd2d3eeeb..61ef5c54d9 100644 --- a/packages/html-program-viewer/src/react/type-graph.module.css +++ b/packages/html-program-viewer/src/react/type-graph.module.css @@ -14,4 +14,5 @@ .breadcrumb { margin-bottom: 10px; + overflow-y: auto; } diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 8ceeeb034d..8271f3ce27 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -67,23 +67,25 @@ const TypeGraphBreadcrumb = () => { const segments = nav.selectedPath.split("."); return ( - - {segments.map((x, i) => { - const last = i === segments.length - 1; - return ( - - - nav.selectPath(segments.slice(0, i).join("."))} - > - {x} - - - {!last && } - - ); - })} - +
    + + {segments.map((x, i) => { + const last = i === segments.length - 1; + return ( + + + nav.selectPath(segments.slice(0, i).join("."))} + > + {x} + + + {!last && } + + ); + })} + +
    ); }; From ddb88a9d294d78898e3e87b0cb266b0901f5c90c Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Sun, 16 Jun 2024 21:37:06 -0700 Subject: [PATCH 35/70] Focus fix --- packages/html-program-viewer/src/react/tree/tree.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 18f39a1bd7..5df715e6c9 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -53,8 +53,12 @@ export function Tree({ const activateRow = useCallback( (row: TreeRow) => { setFocusedIndex(row.index); - toggleExpand(row.id); - setSelectedKey(row.id); + if (selectedKey === row.id) { + collapse(row.id); + } else { + expand(row.id); + setSelectedKey(row.id); + } }, [selectedKey, toggleExpand] ); @@ -97,6 +101,8 @@ export function Tree({ tabIndex={0} role="tree" onKeyDown={handleKeyDown} + onFocus={() => setFocusedIndex(rows.findIndex((row) => row.id === selectedKey))} + onBlur={() => setFocusedIndex(-1)} aria-activedescendant={`${id}-${focusedIndex}`} > {rows.map((row) => { From 54d377de3d660048619438202b3a3c925629582b Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 17 Jun 2024 13:48:09 -0700 Subject: [PATCH 36/70] fix --- packages/html-program-viewer/src/react/tree/tree.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 5df715e6c9..13fc156cc7 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -54,7 +54,7 @@ export function Tree({ (row: TreeRow) => { setFocusedIndex(row.index); if (selectedKey === row.id) { - collapse(row.id); + toggleExpand(row.id); } else { expand(row.id); setSelectedKey(row.id); From 9925bb796b69e7a0997184be8acd413a490fc2f3 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 17 Jun 2024 13:51:46 -0700 Subject: [PATCH 37/70] tweak --- .../src/react/inspect-type/inspect-type.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css b/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css index cbcb46ddcf..4a7db69dd2 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.module.css @@ -1,4 +1,5 @@ .inspect-type { + font-size: 12px; } .inspect-type ul { padding: 0 0 0 16px; From 361b6183c4c47ea73b8ea9dd4a4d048f63954847 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 18 Jun 2024 12:46:25 -0700 Subject: [PATCH 38/70] Search in breadcrumb --- .../current-path/current-path.module.css | 32 ++++ .../src/react/current-path/current-path.tsx | 140 ++++++++++++++++++ .../src/react/tree-navigation.tsx | 2 +- .../src/react/type-graph.module.css | 3 +- .../src/react/type-graph.tsx | 44 +----- 5 files changed, 180 insertions(+), 41 deletions(-) create mode 100644 packages/html-program-viewer/src/react/current-path/current-path.module.css create mode 100644 packages/html-program-viewer/src/react/current-path/current-path.tsx diff --git a/packages/html-program-viewer/src/react/current-path/current-path.module.css b/packages/html-program-viewer/src/react/current-path/current-path.module.css new file mode 100644 index 0000000000..61ce2d4417 --- /dev/null +++ b/packages/html-program-viewer/src/react/current-path/current-path.module.css @@ -0,0 +1,32 @@ +.current-path { + overflow-y: auto; + border: 1px solid var(--colorNeutralStroke1); +} + +.current-path.focus { + border-bottom: 1px solid var(--colorBrandForeground1); +} +.breadcrumb-search { + width: 100%; + border-radius: 0 !important; + border: none !important; +} + +.breadcrumb-search::after { + border: none !important; +} + +.option { + height: 24px !important; +} + +.search-placeholder-gap { + flex: 1; +} + +.search-placeholder { + color: var(--colorNeutralForeground4); + font-size: 12px; + margin: 5px; + text-wrap: nowrap; +} diff --git a/packages/html-program-viewer/src/react/current-path/current-path.tsx b/packages/html-program-viewer/src/react/current-path/current-path.tsx new file mode 100644 index 0000000000..14dd6d8d51 --- /dev/null +++ b/packages/html-program-viewer/src/react/current-path/current-path.tsx @@ -0,0 +1,140 @@ +import { + Breadcrumb, + BreadcrumbButton, + BreadcrumbDivider, + BreadcrumbItem, + Combobox, + Option, + mergeClasses, + type OptionOnSelectData, +} from "@fluentui/react-components"; +import { DatabaseRegular } from "@fluentui/react-icons"; +import { useCallback, useState } from "react"; +import { Fragment } from "react/jsx-runtime"; +import { NodeIcon } from "../tree-navigation.js"; +import { useTreeNavigator, type TypeGraphNode } from "../use-tree-navigation.js"; +import style from "./current-path.module.css"; + +const rootIcon = ; +export const CurrentPath = () => { + const nav = useTreeNavigator(); + const segments = nav.selectedPath.split("."); + + const [showInput, setShowInput] = useState(false); + + return ( +
    setShowInput(true)} + > + + + { + nav.selectPath(""); + evt.stopPropagation(); + }} + > + {rootIcon} + + + {segments.length > 1 && } + {showInput ? ( + setShowInput(false)} /> + ) : ( + <> + {segments.slice(1).map((x, i) => { + const last = i === segments.length - 2; + return ( + + + { + if (!last) { + const newPath = segments.slice(0, i + 2).join("."); + nav.selectPath(newPath); + evt.stopPropagation(); + } + }} + > + {x} + + + {!last && } + + ); + })} + + Search (⌘+⇧+F) + + )} + +
    + ); +}; + +interface SearchProps { + onBlur: () => void; +} +const Search = ({ onBlur }: SearchProps) => { + const nav = useTreeNavigator(); + + const [search, setSearch] = useState(nav.selectedPath.slice(2)); + const options = findNodes(nav.tree, search); + + const selectOption = useCallback( + (_: any, item: OptionOnSelectData) => { + if (item.optionValue) { + nav.selectPath(item.optionValue); + setSearch(item.optionValue.slice(2)); + } + }, + [nav.selectPath, setSearch] + ); + + return ( + event.target.select()} + onBlur={onBlur} + value={search} + expandIcon={null} + onChange={(evt) => setSearch(evt.target.value)} + onOptionSelect={selectOption} + open + > + {options.map((node) => ( + + ))} + + ); +}; + +function findNodes(node: TypeGraphNode, search: string): TypeGraphNode[] { + const searchSegments = search.toLowerCase().split("."); + const [first, ...remaining] = searchSegments; + const resultInChildren = node.children.flatMap((x) => findNodes(x, search)); + if (node.kind === "type" && node.name.toString().toLowerCase().includes(first)) { + let current: TypeGraphNode | undefined = node; + for (const segment of remaining) { + if (current === undefined) { + break; + } + current = current.children.find((x) => x.name.toString().toLowerCase().includes(segment)); + } + return [...(current ? [current] : []), ...resultInChildren]; + } + return resultInChildren; +} diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 0207eb17c6..0f00122f90 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -71,7 +71,7 @@ export const TreeNavigation = (_: TreeNavigationProps) => { ); }; -const NodeIcon = ({ node }: { node: TypeGraphNode }) => { +export const NodeIcon = ({ node }: { node: TypeGraphNode }) => { switch (node.kind) { case "type": return {node.type.kind[0]}; diff --git a/packages/html-program-viewer/src/react/type-graph.module.css b/packages/html-program-viewer/src/react/type-graph.module.css index 61ef5c54d9..ee0fc7d926 100644 --- a/packages/html-program-viewer/src/react/type-graph.module.css +++ b/packages/html-program-viewer/src/react/type-graph.module.css @@ -12,7 +12,6 @@ overflow-y: auto; } -.breadcrumb { +.current-path { margin-bottom: 10px; - overflow-y: auto; } diff --git a/packages/html-program-viewer/src/react/type-graph.tsx b/packages/html-program-viewer/src/react/type-graph.tsx index 8271f3ce27..1773f8803e 100644 --- a/packages/html-program-viewer/src/react/type-graph.tsx +++ b/packages/html-program-viewer/src/react/type-graph.tsx @@ -1,15 +1,9 @@ -import { - Breadcrumb, - BreadcrumbButton, - BreadcrumbDivider, - BreadcrumbItem, - FluentProvider, - webLightTheme, -} from "@fluentui/react-components"; +import { FluentProvider, webLightTheme } from "@fluentui/react-components"; import type { Program } from "@typespec/compiler"; import { Pane, SplitPane } from "@typespec/react-components"; -import { Fragment, type FunctionComponent } from "react"; +import { type FunctionComponent } from "react"; import ReactDOMServer from "react-dom/server"; +import { CurrentPath } from "./current-path/current-path.js"; import { ListTypeView } from "./list-type-view/list-type-view.js"; import { ProgramProvider } from "./program-context.js"; import { TreeNavigation } from "./tree-navigation.js"; @@ -39,7 +33,9 @@ export const TypeGraph: FunctionComponent = ({ program }) => { - +
    + +
    @@ -61,31 +57,3 @@ const TypeGraphContent = () => { return ; } }; - -const TypeGraphBreadcrumb = () => { - const nav = useTreeNavigator(); - const segments = nav.selectedPath.split("."); - - return ( -
    - - {segments.map((x, i) => { - const last = i === segments.length - 1; - return ( - - - nav.selectPath(segments.slice(0, i).join("."))} - > - {x} - - - {!last && } - - ); - })} - -
    - ); -}; From 9258af54f4276a25571f88ec74a32416f50a38f7 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 18 Jun 2024 12:47:52 -0700 Subject: [PATCH 39/70] Remove --- .../src/react/tree-navigation.module.css | 12 ---- .../src/react/tree-navigation.tsx | 65 ++----------------- .../src/react/tree/tree-control.ts | 12 +--- .../src/react/tree/tree.tsx | 13 +--- 4 files changed, 10 insertions(+), 92 deletions(-) diff --git a/packages/html-program-viewer/src/react/tree-navigation.module.css b/packages/html-program-viewer/src/react/tree-navigation.module.css index 0fcd43d39e..f366fd92d6 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.module.css +++ b/packages/html-program-viewer/src/react/tree-navigation.module.css @@ -5,15 +5,3 @@ border-radius: 2px; line-height: 16px; } - -.search { - width: 100%; - outline: none; - border: none; - border-bottom: 1px solid var(--colorNeutralStroke1); - height: 22px; - line-height: 22px; -} -.search:focus { - border-bottom: 1px solid var(--colorBrandForeground1); -} diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 0f00122f90..31f5d260d0 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,73 +1,20 @@ import { AppsListRegular } from "@fluentui/react-icons"; -import { useState } from "react"; import style from "./tree-navigation.module.css"; import { Tree } from "./tree/tree.js"; import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; export interface TreeNavigationProps {} -function filterTree( - tree: TypeGraphNode, - search: string -): { tree: TypeGraphNode | undefined; expandPaths: string[] } { - const expandPaths: string[] = []; - if (search === "") { - return { tree, expandPaths }; - } - - const result = filterNode(tree, search, expandPaths); - - return { tree: result, expandPaths }; -} - -function filterNode( - node: TypeGraphNode, - search: string, - expandPaths: string[] -): TypeGraphNode | undefined { - if (typeof node.name === "string" && node.name.toLowerCase().includes(search.toLowerCase())) { - return node; - } - const children = node.children - .map((x) => filterNode(x, search, expandPaths)) - .filter((x): x is TypeGraphNode => x !== undefined); - - if (children.length === 0) { - return undefined; - } - - expandPaths.push(node.id); - return { - ...node, - children, - }; -} - export const TreeNavigation = (_: TreeNavigationProps) => { - const [search, updateSearch] = useState(""); const nav = useTreeNavigator(); - const filter = filterTree(nav.tree, search); return ( -
    - updateSearch(x.target.value)} - /> - {filter.tree === undefined ? ( - "No results" - ) : ( - - tree={filter.tree} - expandNodes={filter.expandPaths} - nodeIcon={NodeIcon} - selected={nav.selectedPath} - onSelect={nav.selectPath} - /> - )} -
    + + tree={nav.tree} + nodeIcon={NodeIcon} + selected={nav.selectedPath} + onSelect={nav.selectPath} + /> ); }; diff --git a/packages/html-program-viewer/src/react/tree/tree-control.ts b/packages/html-program-viewer/src/react/tree/tree-control.ts index 48daae73b3..bba71a873e 100644 --- a/packages/html-program-viewer/src/react/tree/tree-control.ts +++ b/packages/html-program-viewer/src/react/tree/tree-control.ts @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useCallback, useMemo, useRef, useState } from "react"; export interface TreeControls { readonly renderSignal: number; @@ -8,18 +8,10 @@ export interface TreeControls { toggleExpand(key: string): void; } -export function useTreeControls({ expandNodes }: { expandNodes?: string[] }): TreeControls { +export function useTreeControls(): TreeControls { const expanded = useRef(new Set()).current; const [rerender, setRerender] = useState(0); - useEffect(() => { - if (expandNodes) { - for (const key of expandNodes) { - expanded.add(key); - } - setRerender((x) => x + 1); - } - }, [expandNodes]); const toggleExpand = useCallback( (key: string) => { if (expanded.has(key)) { diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 13fc156cc7..7b2f66283f 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -19,20 +19,11 @@ export interface TreeViewProps { readonly nodeIcon?: FC<{ node: T }>; readonly selected?: string; readonly onSelect?: (id: string) => void; - readonly expandNodes?: string[]; } -export function Tree({ - tree, - selected, - onSelect, - expandNodes, - nodeIcon, -}: TreeViewProps) { +export function Tree({ tree, selected, onSelect, nodeIcon }: TreeViewProps) { const id = useId(); - const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ - expandNodes, - }); + const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls(); const [focusedIndex, setFocusedIndex] = useState(0); const [selectedKey, setSelectedKey] = useControllableValue(selected, undefined, onSelect); From bf33149ee9da2b9a9691aa556655c736941b3c33 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 18 Jun 2024 15:18:21 -0700 Subject: [PATCH 40/70] organize --- .../current-path/current-path.module.css | 13 +++++- .../src/react/current-path/current-path.tsx | 40 +++++++++++++------ 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/packages/html-program-viewer/src/react/current-path/current-path.module.css b/packages/html-program-viewer/src/react/current-path/current-path.module.css index 61ce2d4417..24260e6e5f 100644 --- a/packages/html-program-viewer/src/react/current-path/current-path.module.css +++ b/packages/html-program-viewer/src/react/current-path/current-path.module.css @@ -17,10 +17,19 @@ } .option { - height: 24px !important; + padding: 2px 4px !important; } -.search-placeholder-gap { +.option .doc { + color: var(--colorNeutralForeground4); + text-overflow: ellipsis; + text-wrap: nowrap; + min-width: 0; + flex: 0 1 auto; + overflow: hidden; +} + +.flex-gap { flex: 1; } diff --git a/packages/html-program-viewer/src/react/current-path/current-path.tsx b/packages/html-program-viewer/src/react/current-path/current-path.tsx index 14dd6d8d51..375bb924ce 100644 --- a/packages/html-program-viewer/src/react/current-path/current-path.tsx +++ b/packages/html-program-viewer/src/react/current-path/current-path.tsx @@ -3,14 +3,17 @@ import { BreadcrumbButton, BreadcrumbDivider, BreadcrumbItem, + Caption1, Combobox, Option, mergeClasses, type OptionOnSelectData, } from "@fluentui/react-components"; import { DatabaseRegular } from "@fluentui/react-icons"; +import { getDoc } from "@typespec/compiler"; import { useCallback, useState } from "react"; import { Fragment } from "react/jsx-runtime"; +import { useProgram } from "../program-context.js"; import { NodeIcon } from "../tree-navigation.js"; import { useTreeNavigator, type TypeGraphNode } from "../use-tree-navigation.js"; import style from "./current-path.module.css"; @@ -65,7 +68,7 @@ export const CurrentPath = () => { ); })} - + Search (⌘+⇧+F) )} @@ -99,7 +102,7 @@ const Search = ({ onBlur }: SearchProps) => { size="small" className={style["breadcrumb-search"]} onFocus={(event) => event.target.select()} - onBlur={onBlur} + // onBlur={onBlur} value={search} expandIcon={null} onChange={(evt) => setSearch(evt.target.value)} @@ -107,21 +110,34 @@ const Search = ({ onBlur }: SearchProps) => { open > {options.map((node) => ( - + ))} ); }; +const SearchOption = ({ node }: { node: TypeGraphNode }) => { + const program = useProgram(); + + return ( + + ); +}; function findNodes(node: TypeGraphNode, search: string): TypeGraphNode[] { const searchSegments = search.toLowerCase().split("."); const [first, ...remaining] = searchSegments; From 3d3d0680e0c42c1875132e953ddcd60cf4f4041b Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 18 Jun 2024 15:25:15 -0700 Subject: [PATCH 41/70] . --- .../html-program-viewer/src/react/current-path/current-path.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/html-program-viewer/src/react/current-path/current-path.tsx b/packages/html-program-viewer/src/react/current-path/current-path.tsx index 375bb924ce..3bc3f018d3 100644 --- a/packages/html-program-viewer/src/react/current-path/current-path.tsx +++ b/packages/html-program-viewer/src/react/current-path/current-path.tsx @@ -102,7 +102,7 @@ const Search = ({ onBlur }: SearchProps) => { size="small" className={style["breadcrumb-search"]} onFocus={(event) => event.target.select()} - // onBlur={onBlur} + onBlur={onBlur} value={search} expandIcon={null} onChange={(evt) => setSearch(evt.target.value)} From 50fdb5d7ad88b803b124b5fe5bd30d0b17805b7b Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 12:56:08 -0700 Subject: [PATCH 42/70] Fork react-inspector --- packages/html-program-viewer/package.json | 3 +- .../react/inspect-type/type-data-table.tsx | 2 +- .../src/react/inspector/index.tsx | 9 + .../object-inspector/object-inspector.tsx | 132 ++++++++ .../object-inspector/object-label.tsx | 28 ++ .../object-inspector/object-preview.tsx | 94 ++++++ .../object-inspector/object-root-label.tsx | 17 ++ .../react/inspector/object/object-name.tsx | 29 ++ .../react/inspector/object/object-value.tsx | 67 ++++ .../src/react/inspector/styles/base.tsx | 289 ++++++++++++++++++ .../src/react/inspector/styles/index.tsx | 1 + .../src/react/inspector/styles/styles.tsx | 52 ++++ .../inspector/styles/themes/chromeDark.tsx | 46 +++ .../inspector/styles/themes/chromeLight.tsx | 46 +++ .../react/inspector/styles/themes/index.tsx | 2 + .../react/inspector/styles/unselectable.tsx | 9 + .../tree-view/expanded-paths-context.tsx | 4 + .../inspector/tree-view/path-utils.test.ts | 21 ++ .../react/inspector/tree-view/path-utils.ts | 69 +++++ .../react/inspector/tree-view/tree-node.tsx | 63 ++++ .../react/inspector/tree-view/tree-view.tsx | 104 +++++++ .../inspector/utils/object-prototype.tsx | 2 + .../react/inspector/utils/property-utils.tsx | 12 + pnpm-lock.yaml | 11 - 24 files changed, 1098 insertions(+), 14 deletions(-) create mode 100644 packages/html-program-viewer/src/react/inspector/index.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/object/object-name.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/object/object-value.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/base.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/index.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/styles.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts create mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts create mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/utils/object-prototype.tsx create mode 100644 packages/html-program-viewer/src/react/inspector/utils/property-utils.tsx diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index e9e00cbfbe..b733602724 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -54,8 +54,7 @@ "@fluentui/react-icons": "^2.0.240", "@fluentui/react-list-preview": "^0.2.8", "react": "~18.3.1", - "react-dom": "~18.3.1", - "react-inspector": "^6.0.2" + "react-dom": "~18.3.1" }, "devDependencies": { "@babel/core": "^7.24.5", diff --git a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx index 2879db6608..c17cdeae63 100644 --- a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx @@ -1,6 +1,6 @@ import type { Type } from "@typespec/compiler"; import type { FC } from "react"; -import { ObjectInspector } from "react-inspector"; +import { ObjectInspector } from "../inspector/index.js"; import { useProgram } from "../program-context.js"; import style from "./type-data-table.module.css"; diff --git a/packages/html-program-viewer/src/react/inspector/index.tsx b/packages/html-program-viewer/src/react/inspector/index.tsx new file mode 100644 index 0000000000..7a830c92ba --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/index.tsx @@ -0,0 +1,9 @@ +// Fork from https://www.npmjs.com/package/react-inspector and modified to integrate with TypeSpec types +export { chromeDark, chromeLight } from "./styles/themes/index.js"; + +export { ObjectInspector } from "./object-inspector/object-inspector.js"; + +export { ObjectLabel } from "./object-inspector/object-label.js"; +export { ObjectPreview } from "./object-inspector/object-preview.js"; +export { ObjectRootLabel } from "./object-inspector/object-root-label.js"; +export { ObjectValue } from "./object/object-value.js"; diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx new file mode 100644 index 0000000000..6d0007eefa --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx @@ -0,0 +1,132 @@ +import type { FC } from "react"; +import { TreeView } from "../tree-view/tree-view.js"; + +import { ObjectLabel } from "./object-label.js"; +import { ObjectRootLabel } from "./object-root-label.js"; + +import { propertyIsEnumerable } from "../utils/object-prototype.js"; +import { getPropertyValue } from "../utils/property-utils.js"; + +import { themeAcceptor } from "../styles/index.js"; + +const createIterator = (showNonenumerable: any, sortObjectKeys: any) => { + const objectIterator = function* (data: any) { + const shouldIterate = (typeof data === "object" && data !== null) || typeof data === "function"; + if (!shouldIterate) return; + + const dataIsArray = Array.isArray(data); + + // iterable objects (except arrays) + if (!dataIsArray && data[Symbol.iterator]) { + let i = 0; + for (const entry of data) { + if (Array.isArray(entry) && entry.length === 2) { + const [k, v] = entry; + yield { + name: k, + data: v, + }; + } else { + yield { + name: i.toString(), + data: entry, + }; + } + i++; + } + } else { + const keys = Object.getOwnPropertyNames(data); + if (sortObjectKeys === true && !dataIsArray) { + // Array keys should not be sorted in alphabetical order + keys.sort(); + } else if (typeof sortObjectKeys === "function") { + keys.sort(sortObjectKeys); + } + + for (const propertyName of keys) { + if (propertyIsEnumerable.call(data, propertyName)) { + const propertyValue = getPropertyValue(data, propertyName); + yield { + name: propertyName || `""`, + data: propertyValue, + }; + } else if (showNonenumerable) { + // To work around the error (happens some time when propertyName === 'caller' || propertyName === 'arguments') + // 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context + // http://stackoverflow.com/questions/31921189/caller-and-arguments-are-restricted-function-properties-and-cannot-be-access + let propertyValue; + try { + propertyValue = getPropertyValue(data, propertyName); + } catch (e) { + // console.warn(e) + } + + if (propertyValue !== undefined) { + yield { + name: propertyName, + data: propertyValue, + isNonenumerable: true, + }; + } + } + } + + // [[Prototype]] of the object: `Object.getPrototypeOf(data)` + // the property name is shown as "__proto__" + if (showNonenumerable && data !== Object.prototype /* already added */) { + yield { + name: "__proto__", + data: Object.getPrototypeOf(data), + isNonenumerable: true, + }; + } + } + }; + + return objectIterator; +}; + +const defaultNodeRenderer = ({ depth, name, data, isNonenumerable }: any) => + depth === 0 ? ( + + ) : ( + + ); + +/** + * Tree-view for objects + */ +const ObjectInspector: FC = ({ + showNonenumerable = false, + sortObjectKeys, + nodeRenderer, + ...treeViewProps +}) => { + const dataIterator = createIterator(showNonenumerable, sortObjectKeys); + const renderer = nodeRenderer ? nodeRenderer : defaultNodeRenderer; + + return ; +}; + +// ObjectInspector.propTypes = { +// /** An integer specifying to which level the tree should be initially expanded. */ +// expandLevel: PropTypes.number, +// /** An array containing all the paths that should be expanded when the component is initialized, or a string of just one path */ +// expandPaths: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), + +// name: PropTypes.string, +// /** Not required prop because we also allow undefined value */ +// data: PropTypes.any, + +// /** Show non-enumerable properties */ +// showNonenumerable: PropTypes.bool, +// /** Sort object keys with optional compare function. */ +// sortObjectKeys: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]), + +// /** Provide a custom nodeRenderer */ +// nodeRenderer: PropTypes.func, +// }; + +const themedObjectInspector = themeAcceptor(ObjectInspector); + +export { themedObjectInspector as ObjectInspector }; diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx b/packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx new file mode 100644 index 0000000000..da2bb1631f --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx @@ -0,0 +1,28 @@ +import type { FC } from "react"; +import { ObjectName } from "../object/object-name.js"; +import { ObjectValue } from "../object/object-value.js"; +import { ObjectPreview } from "./object-preview.js"; + +/** + * if isNonenumerable is specified, render the name dimmed + */ +export const ObjectLabel: FC = ({ name, data, isNonenumerable = false }) => { + const object = data; + + return ( + + {typeof name === "string" ? ( + + ) : ( + + )} + : + + + ); +}; + +// ObjectLabel.propTypes = { +// /** Non enumerable object property will be dimmed */ +// isNonenumerable: PropTypes.bool, +// }; diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx b/packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx new file mode 100644 index 0000000000..7d64523361 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx @@ -0,0 +1,94 @@ +import React, { type FC, type ReactChild } from "react"; + +import { ObjectName } from "../object/object-name.js"; +import { ObjectValue } from "../object/object-value.js"; + +import { useStyles } from "../styles/index.js"; + +import { hasOwnProperty } from "../utils/object-prototype.js"; +import { getPropertyValue } from "../utils/property-utils.js"; + +/* intersperse arr with separator */ +function intersperse(arr: any[], sep: string) { + if (arr.length === 0) { + return []; + } + + return arr.slice(1).reduce((xs, x) => xs.concat([sep, x]), [arr[0]]); +} + +/** + * A preview of the object + */ +export const ObjectPreview: FC = ({ data }) => { + const styles = useStyles("ObjectPreview"); + const object = data; + + if ( + typeof object !== "object" || + object === null || + object instanceof Date || + object instanceof RegExp + ) { + return ; + } + + if (Array.isArray(object)) { + const maxProperties = styles.arrayMaxProperties; + const previewArray = object + .slice(0, maxProperties) + .map((element, index) => ); + if (object.length > maxProperties) { + previewArray.push(…); + } + const arrayLength = object.length; + return ( + + + {arrayLength === 0 ? `` : `(${arrayLength})\xa0`} + + [{intersperse(previewArray, ", ")}] + + ); + } else { + const maxProperties = styles.objectMaxProperties; + const propertyNodes: ReactChild[] = []; + for (const propertyName in object) { + if (hasOwnProperty.call(object, propertyName)) { + let ellipsis; + if ( + propertyNodes.length === maxProperties - 1 && + Object.keys(object).length > maxProperties + ) { + ellipsis = …; + } + + const propertyValue = getPropertyValue(object, propertyName); + propertyNodes.push( + + + :  + + {ellipsis} + + ); + if (ellipsis) break; + } + } + + const objectConstructorName = object.constructor ? object.constructor.name : "Object"; + + return ( + + + {objectConstructorName === "Object" ? "" : `${objectConstructorName} `} + + + {"{"} + {intersperse(propertyNodes, ", ")} + {"}"} + + + ); + } +}; diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx b/packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx new file mode 100644 index 0000000000..82a19daf88 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx @@ -0,0 +1,17 @@ +import type { FC } from "react"; +import { ObjectName } from "../object/object-name.js"; +import { ObjectPreview } from "./object-preview.js"; + +export const ObjectRootLabel: FC = ({ name, data }) => { + if (typeof name === "string") { + return ( + + + : + + + ); + } else { + return ; + } +}; diff --git a/packages/html-program-viewer/src/react/inspector/object/object-name.tsx b/packages/html-program-viewer/src/react/inspector/object/object-name.tsx new file mode 100644 index 0000000000..390910bcd7 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object/object-name.tsx @@ -0,0 +1,29 @@ +import type { FC } from "react"; +import { useStyles } from "../styles/index.js"; + +/** + * A view for object property names. + * + * If the property name is enumerable (in Object.keys(object)), + * the property name will be rendered normally. + * + * If the property name is not enumerable (`Object.prototype.propertyIsEnumerable()`), + * the property name will be dimmed to show the difference. + */ +export const ObjectName: FC = ({ name, dimmed = false, styles = {} }) => { + const themeStyles = useStyles("ObjectName"); + const appliedStyles = { + ...themeStyles.base, + ...(dimmed ? themeStyles["dimmed"] : {}), + ...styles, + }; + + return {name}; +}; + +// ObjectName.propTypes = { +// /** Property name */ +// name: PropTypes.string, +// /** Should property name be dimmed */ +// dimmed: PropTypes.bool, +// }; diff --git a/packages/html-program-viewer/src/react/inspector/object/object-value.tsx b/packages/html-program-viewer/src/react/inspector/object/object-value.tsx new file mode 100644 index 0000000000..f123217d3c --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object/object-value.tsx @@ -0,0 +1,67 @@ +import type { FC } from "react"; + +import { useStyles } from "../styles/index.js"; + +/** + * A short description of the object values. + * Can be used to render tree node in ObjectInspector + * or render objects in TableInspector. + */ +export const ObjectValue: FC = ({ object, styles }) => { + const themeStyles = useStyles("ObjectValue"); + + const mkStyle = (key: any) => ({ ...themeStyles[key], ...styles }); + + switch (typeof object) { + case "bigint": + return {String(object)}n; + case "number": + return {String(object)}; + case "string": + return "{object}"; + case "boolean": + return {String(object)}; + case "undefined": + return undefined; + case "object": + if (object === null) { + return null; + } + if (object instanceof Date) { + return {object.toString()}; + } + if (object instanceof RegExp) { + return {object.toString()}; + } + if (Array.isArray(object)) { + return {`Array(${object.length})`}; + } + if (!object.constructor) { + return Object; + } + if ( + typeof object.constructor.isBuffer === "function" && + object.constructor.isBuffer(object) + ) { + return {`Buffer[${object.length}]`}; + } + + return {object.constructor.name}; + case "function": + return ( + + Æ’  + {object.name}() + + ); + case "symbol": + return {object.toString()}; + default: + return ; + } +}; + +// ObjectValue.propTypes = { +// // the object to describe +// object: PropTypes.any, +// }; diff --git a/packages/html-program-viewer/src/react/inspector/styles/base.tsx b/packages/html-program-viewer/src/react/inspector/styles/base.tsx new file mode 100644 index 0000000000..dee3abbbb2 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/base.tsx @@ -0,0 +1,289 @@ +import { unselectable } from "./unselectable.js"; + +export const createTheme = (theme: any) => ({ + DOMNodePreview: { + htmlOpenTag: { + base: { + color: theme.HTML_TAG_COLOR, + }, + tagName: { + color: theme.HTML_TAGNAME_COLOR, + textTransform: theme.HTML_TAGNAME_TEXT_TRANSFORM, + }, + htmlAttributeName: { + color: theme.HTML_ATTRIBUTE_NAME_COLOR, + }, + htmlAttributeValue: { + color: theme.HTML_ATTRIBUTE_VALUE_COLOR, + }, + }, + htmlCloseTag: { + base: { + color: theme.HTML_TAG_COLOR, + }, + offsetLeft: { + /* hack: offset placeholder */ + marginLeft: -theme.TREENODE_PADDING_LEFT, + }, + tagName: { + color: theme.HTML_TAGNAME_COLOR, + textTransform: theme.HTML_TAGNAME_TEXT_TRANSFORM, + }, + }, + htmlComment: { + color: theme.HTML_COMMENT_COLOR, + }, + htmlDoctype: { + color: theme.HTML_DOCTYPE_COLOR, + }, + }, + + ObjectPreview: { + objectDescription: { + fontStyle: "italic", + }, + preview: { + fontStyle: "italic", + }, + arrayMaxProperties: theme.OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES, + objectMaxProperties: theme.OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES, + }, + + ObjectName: { + base: { + color: theme.OBJECT_NAME_COLOR, + }, + dimmed: { + opacity: 0.6, + }, + }, + + ObjectValue: { + objectValueNull: { + color: theme.OBJECT_VALUE_NULL_COLOR, + }, + objectValueUndefined: { + color: theme.OBJECT_VALUE_UNDEFINED_COLOR, + }, + objectValueRegExp: { + color: theme.OBJECT_VALUE_REGEXP_COLOR, + }, + objectValueString: { + color: theme.OBJECT_VALUE_STRING_COLOR, + }, + objectValueSymbol: { + color: theme.OBJECT_VALUE_SYMBOL_COLOR, + }, + objectValueNumber: { + color: theme.OBJECT_VALUE_NUMBER_COLOR, + }, + objectValueBoolean: { + color: theme.OBJECT_VALUE_BOOLEAN_COLOR, + }, + objectValueFunctionPrefix: { + color: theme.OBJECT_VALUE_FUNCTION_PREFIX_COLOR, + fontStyle: "italic", + }, + objectValueFunctionName: { + fontStyle: "italic", + }, + }, + + TreeView: { + treeViewOutline: { + padding: 0, + margin: 0, + listStyleType: "none", + }, + }, + + TreeNode: { + treeNodeBase: { + color: theme.BASE_COLOR, + backgroundColor: theme.BASE_BACKGROUND_COLOR, + + lineHeight: theme.TREENODE_LINE_HEIGHT, + cursor: "default", + + boxSizing: "border-box", + listStyle: "none", + + fontFamily: theme.TREENODE_FONT_FAMILY, + fontSize: theme.TREENODE_FONT_SIZE, + }, + treeNodePreviewContainer: {}, + treeNodePlaceholder: { + whiteSpace: "pre", + + fontSize: theme.ARROW_FONT_SIZE, + marginRight: theme.ARROW_MARGIN_RIGHT, + ...unselectable, + }, + treeNodeArrow: { + base: { + color: theme.ARROW_COLOR, + display: "inline-block", + // lineHeight: '14px', + fontSize: theme.ARROW_FONT_SIZE, + marginRight: theme.ARROW_MARGIN_RIGHT, + ...(parseFloat(theme.ARROW_ANIMATION_DURATION) > 0 + ? { + transition: `transform ${theme.ARROW_ANIMATION_DURATION} ease 0s`, + } + : {}), + ...unselectable, + }, + expanded: { + WebkitTransform: "rotateZ(90deg)", + MozTransform: "rotateZ(90deg)", + transform: "rotateZ(90deg)", + }, + collapsed: { + WebkitTransform: "rotateZ(0deg)", + MozTransform: "rotateZ(0deg)", + transform: "rotateZ(0deg)", + }, + }, + treeNodeChildNodesContainer: { + margin: 0, // reset user-agent style + paddingLeft: theme.TREENODE_PADDING_LEFT, + }, + }, + + TableInspector: { + base: { + color: theme.BASE_COLOR, + + position: "relative", + border: `1px solid ${theme.TABLE_BORDER_COLOR}`, + fontFamily: theme.BASE_FONT_FAMILY, + fontSize: theme.BASE_FONT_SIZE, + lineHeight: "120%", + boxSizing: "border-box", + cursor: "default", + }, + }, + + TableInspectorHeaderContainer: { + base: { + top: 0, + height: "17px", + left: 0, + right: 0, + overflowX: "hidden", + }, + table: { + tableLayout: "fixed", + borderSpacing: 0, + borderCollapse: "separate", + height: "100%", + width: "100%", + margin: 0, + }, + }, + + TableInspectorDataContainer: { + tr: { + display: "table-row", + }, + td: { + boxSizing: "border-box", + border: "none", // prevent overrides + height: "16px", // /* 0.5 * table.background-size height */ + verticalAlign: "top", + padding: "1px 4px", + WebkitUserSelect: "text", + + whiteSpace: "nowrap", + textOverflow: "ellipsis", + overflow: "hidden", + lineHeight: "14px", + }, + div: { + position: "static", + top: "17px", + bottom: 0, + overflowY: "overlay", + transform: "translateZ(0)", + + left: 0, + right: 0, + overflowX: "hidden", + }, + table: { + positon: "static", + left: 0, + top: 0, + right: 0, + bottom: 0, + borderTop: "0 none transparent", + margin: 0, // prevent user agent stylesheet overrides + + backgroundImage: theme.TABLE_DATA_BACKGROUND_IMAGE, + backgroundSize: theme.TABLE_DATA_BACKGROUND_SIZE, + tableLayout: "fixed", + + // table + borderSpacing: 0, + borderCollapse: "separate", + // height: '100%', + width: "100%", + + fontSize: theme.BASE_FONT_SIZE, + lineHeight: "120%", + }, + }, + + TableInspectorTH: { + base: { + position: "relative", // anchor for sort icon container + height: "auto", + textAlign: "left", + backgroundColor: theme.TABLE_TH_BACKGROUND_COLOR, + borderBottom: `1px solid ${theme.TABLE_BORDER_COLOR}`, + fontWeight: "normal", + verticalAlign: "middle", + padding: "0 4px", + + whiteSpace: "nowrap", + textOverflow: "ellipsis", + overflow: "hidden", + lineHeight: "14px", + + ":hover": { + backgroundColor: theme.TABLE_TH_HOVER_COLOR, + }, + }, + div: { + whiteSpace: "nowrap", + textOverflow: "ellipsis", + overflow: "hidden", + + // prevent user agent stylesheet overrides + fontSize: theme.BASE_FONT_SIZE, + lineHeight: "120%", + }, + }, + + TableInspectorLeftBorder: { + none: { + borderLeft: "none", + }, + solid: { + borderLeft: `1px solid ${theme.TABLE_BORDER_COLOR}`, + }, + }, + + TableInspectorSortIcon: { + display: "block", + marginRight: 3, // 4, + width: 8, + height: 7, + + marginTop: -7, + color: theme.TABLE_SORT_ICON_COLOR, + fontSize: 12, + // lineHeight: 14 + ...unselectable, + }, +}); diff --git a/packages/html-program-viewer/src/react/inspector/styles/index.tsx b/packages/html-program-viewer/src/react/inspector/styles/index.tsx new file mode 100644 index 0000000000..bd7755cd5f --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/index.tsx @@ -0,0 +1 @@ +export { themeAcceptor, useStyles } from "./styles.js"; diff --git a/packages/html-program-viewer/src/react/inspector/styles/styles.tsx b/packages/html-program-viewer/src/react/inspector/styles/styles.tsx new file mode 100644 index 0000000000..a4b3b27b00 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/styles.tsx @@ -0,0 +1,52 @@ +import { createContext, useContext, useMemo } from "react"; + +import { createTheme } from "./base.js"; +import * as themes from "./themes/index.js"; + +const DEFAULT_THEME_NAME = "chromeLight"; + +const ThemeContext = createContext(createTheme(themes[DEFAULT_THEME_NAME])); + +/** + * Hook to get the component styles for the current theme. + * @param {string} baseStylesKey - Name of the component to be styled + */ +export const useStyles = (baseStylesKey: any) => { + const themeStyles = useContext(ThemeContext); + //@ts-ignore + return themeStyles[baseStylesKey]; +}; + +/** + * HOC to create a component that accepts a "theme" prop and uses it to set + * the current theme. This is intended to be used by the top-level inspector + * components. + * @param {Object} WrappedComponent - React component to be wrapped + */ +export const themeAcceptor = (WrappedComponent: any) => { + const ThemeAcceptor = ({ theme = DEFAULT_THEME_NAME, ...restProps }) => { + const themeStyles = useMemo(() => { + switch (Object.prototype.toString.call(theme)) { + case "[object String]": + //@ts-ignore + return createTheme(themes[theme]); + case "[object Object]": + return createTheme(theme); + default: + return createTheme(themes[DEFAULT_THEME_NAME]); + } + }, [theme]); + + return ( + + + + ); + }; + + // ThemeAcceptor.propTypes = { + // theme: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), + // }; + + return ThemeAcceptor; +}; diff --git a/packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx b/packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx new file mode 100644 index 0000000000..8679dc5dff --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx @@ -0,0 +1,46 @@ +export const theme = { + BASE_FONT_FAMILY: 'Menlo, monospace', + BASE_FONT_SIZE: '11px', + BASE_LINE_HEIGHT: 1.2, + + BASE_BACKGROUND_COLOR: 'rgb(36, 36, 36)', + BASE_COLOR: 'rgb(213, 213, 213)', + + OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES: 10, + OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES: 5, + OBJECT_NAME_COLOR: 'rgb(227, 110, 236)', + OBJECT_VALUE_NULL_COLOR: 'rgb(127, 127, 127)', + OBJECT_VALUE_UNDEFINED_COLOR: 'rgb(127, 127, 127)', + OBJECT_VALUE_REGEXP_COLOR: 'rgb(233, 63, 59)', + OBJECT_VALUE_STRING_COLOR: 'rgb(233, 63, 59)', + OBJECT_VALUE_SYMBOL_COLOR: 'rgb(233, 63, 59)', + OBJECT_VALUE_NUMBER_COLOR: 'hsl(252, 100%, 75%)', + OBJECT_VALUE_BOOLEAN_COLOR: 'hsl(252, 100%, 75%)', + OBJECT_VALUE_FUNCTION_PREFIX_COLOR: 'rgb(85, 106, 242)', + + HTML_TAG_COLOR: 'rgb(93, 176, 215)', + HTML_TAGNAME_COLOR: 'rgb(93, 176, 215)', + HTML_TAGNAME_TEXT_TRANSFORM: 'lowercase', + HTML_ATTRIBUTE_NAME_COLOR: 'rgb(155, 187, 220)', + HTML_ATTRIBUTE_VALUE_COLOR: 'rgb(242, 151, 102)', + HTML_COMMENT_COLOR: 'rgb(137, 137, 137)', + HTML_DOCTYPE_COLOR: 'rgb(192, 192, 192)', + + ARROW_COLOR: 'rgb(145, 145, 145)', + ARROW_MARGIN_RIGHT: 3, + ARROW_FONT_SIZE: 12, + ARROW_ANIMATION_DURATION: '0', + + TREENODE_FONT_FAMILY: 'Menlo, monospace', + TREENODE_FONT_SIZE: '11px', + TREENODE_LINE_HEIGHT: 1.2, + TREENODE_PADDING_LEFT: 12, + + TABLE_BORDER_COLOR: 'rgb(85, 85, 85)', + TABLE_TH_BACKGROUND_COLOR: 'rgb(44, 44, 44)', + TABLE_TH_HOVER_COLOR: 'rgb(48, 48, 48)', + TABLE_SORT_ICON_COLOR: 'black', //'rgb(48, 57, 66)', + TABLE_DATA_BACKGROUND_IMAGE: + 'linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0) 50%, rgba(51, 139, 255, 0.0980392) 50%, rgba(51, 139, 255, 0.0980392))', + TABLE_DATA_BACKGROUND_SIZE: '128px 32px', +}; diff --git a/packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx b/packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx new file mode 100644 index 0000000000..b63e9c086c --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx @@ -0,0 +1,46 @@ +export const theme = { + BASE_FONT_FAMILY: 'Menlo, monospace', + BASE_FONT_SIZE: '11px', + BASE_LINE_HEIGHT: 1.2, + + BASE_BACKGROUND_COLOR: 'white', + BASE_COLOR: 'black', + + OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES: 10, + OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES: 5, + OBJECT_NAME_COLOR: 'rgb(136, 19, 145)', + OBJECT_VALUE_NULL_COLOR: 'rgb(128, 128, 128)', + OBJECT_VALUE_UNDEFINED_COLOR: 'rgb(128, 128, 128)', + OBJECT_VALUE_REGEXP_COLOR: 'rgb(196, 26, 22)', + OBJECT_VALUE_STRING_COLOR: 'rgb(196, 26, 22)', + OBJECT_VALUE_SYMBOL_COLOR: 'rgb(196, 26, 22)', + OBJECT_VALUE_NUMBER_COLOR: 'rgb(28, 0, 207)', + OBJECT_VALUE_BOOLEAN_COLOR: 'rgb(28, 0, 207)', + OBJECT_VALUE_FUNCTION_PREFIX_COLOR: 'rgb(13, 34, 170)', + + HTML_TAG_COLOR: 'rgb(168, 148, 166)', + HTML_TAGNAME_COLOR: 'rgb(136, 18, 128)', + HTML_TAGNAME_TEXT_TRANSFORM: 'lowercase', + HTML_ATTRIBUTE_NAME_COLOR: 'rgb(153, 69, 0)', + HTML_ATTRIBUTE_VALUE_COLOR: 'rgb(26, 26, 166)', + HTML_COMMENT_COLOR: 'rgb(35, 110, 37)', + HTML_DOCTYPE_COLOR: 'rgb(192, 192, 192)', + + ARROW_COLOR: '#6e6e6e', + ARROW_MARGIN_RIGHT: 3, + ARROW_FONT_SIZE: 12, + ARROW_ANIMATION_DURATION: '0', + + TREENODE_FONT_FAMILY: 'Menlo, monospace', + TREENODE_FONT_SIZE: '11px', + TREENODE_LINE_HEIGHT: 1.2, + TREENODE_PADDING_LEFT: 12, + + TABLE_BORDER_COLOR: '#aaa', + TABLE_TH_BACKGROUND_COLOR: '#eee', + TABLE_TH_HOVER_COLOR: 'hsla(0, 0%, 90%, 1)', + TABLE_SORT_ICON_COLOR: '#6e6e6e', + TABLE_DATA_BACKGROUND_IMAGE: + 'linear-gradient(to bottom, white, white 50%, rgb(234, 243, 255) 50%, rgb(234, 243, 255))', + TABLE_DATA_BACKGROUND_SIZE: '128px 32px', +}; diff --git a/packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx b/packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx new file mode 100644 index 0000000000..13fcf05cdd --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx @@ -0,0 +1,2 @@ +export { theme as chromeDark } from "./chromeDark.js"; +export { theme as chromeLight } from "./chromeLight.js"; diff --git a/packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx b/packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx new file mode 100644 index 0000000000..eb0ec0e5b7 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx @@ -0,0 +1,9 @@ +export const unselectable = { + WebkitTouchCallout: 'none', + WebkitUserSelect: 'none', + KhtmlUserSelect: 'none', + MozUserSelect: 'none', + msUserSelect: 'none', + OUserSelect: 'none', + userSelect: 'none', +}; diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx b/packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx new file mode 100644 index 0000000000..1bab81df48 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx @@ -0,0 +1,4 @@ +/* eslint-disable @typescript-eslint/no-empty-function */ +import { createContext } from 'react'; + +export const ExpandedPathsContext = createContext<[any, (...args: any[]) => any]>([{}, () => {}]); diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts b/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts new file mode 100644 index 0000000000..01bc1ce3a9 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest"; + +import { DEFAULT_ROOT_PATH, wildcardPathsFromLevel } from "./path-utils.js"; + +const root = DEFAULT_ROOT_PATH; + +describe("PathUtils", () => { + it("wildcardPathsFromLevel works", () => { + expect(wildcardPathsFromLevel(-1)).toEqual([]); + + expect(wildcardPathsFromLevel(0)).toEqual([]); + + expect(wildcardPathsFromLevel(1)).toEqual([root]); + + expect(wildcardPathsFromLevel(2)).toEqual([root, `${root}.*`]); + + expect(wildcardPathsFromLevel(3)).toEqual([root, `${root}.*`, `${root}.*.*`]); + + expect(wildcardPathsFromLevel(4)).toEqual([root, `${root}.*`, `${root}.*.*`, `${root}.*.*.*`]); + }); +}); diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts b/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts new file mode 100644 index 0000000000..d2b225e617 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts @@ -0,0 +1,69 @@ +export const DEFAULT_ROOT_PATH = "$"; + +const WILDCARD = "*"; + +export function hasChildNodes(data: any, dataIterator: any) { + return !dataIterator(data).next().done; +} + +export const wildcardPathsFromLevel = (level: number): string[] => { + // i is depth + return Array.from({ length: level }, (_, i) => + [DEFAULT_ROOT_PATH].concat(Array.from({ length: i }, () => "*")).join(".") + ); +}; + +export const getExpandedPaths = ( + data: any, + dataIterator: any, + expandPaths: string[], + expandLevel: number, + prevExpandedPaths: any +) => { + const wildcardPaths: string[] = [...wildcardPathsFromLevel(expandLevel)] + .concat(expandPaths) + .filter((path) => typeof path === "string"); // could be undefined + + const expandedPaths: string[] = []; + wildcardPaths.forEach((wildcardPath: string) => { + const keyPaths = wildcardPath.split("."); + const populatePaths = (curData: any, curPath: any, depth: any) => { + if (depth === keyPaths.length) { + expandedPaths.push(curPath); + return; + } + const key = keyPaths[depth]; + if (depth === 0) { + if ( + hasChildNodes(curData, dataIterator) && + (key === DEFAULT_ROOT_PATH || key === WILDCARD) + ) { + populatePaths(curData, DEFAULT_ROOT_PATH, depth + 1); + } + } else { + if (key === WILDCARD) { + for (const { name, data } of dataIterator(curData)) { + if (hasChildNodes(data, dataIterator)) { + populatePaths(data, `${curPath}.${name}`, depth + 1); + } + } + } else { + const value = curData[key]; + if (hasChildNodes(value, dataIterator)) { + populatePaths(value, `${curPath}.${key}`, depth + 1); + } + } + } + }; + + populatePaths(data, "", 0); + }); + + return expandedPaths.reduce( + (obj, path) => { + obj[path] = true; + return obj; + }, + { ...prevExpandedPaths } + ); +}; diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx b/packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx new file mode 100644 index 0000000000..648a98f7d6 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx @@ -0,0 +1,63 @@ +import { Children, memo, type FC } from "react"; +import { useStyles } from "../styles/index.js"; + +const Arrow: FC = ({ expanded, styles }) => ( + + â–¶ + +); + +export const TreeNode: FC = memo((props) => { + props = { + expanded: true, + nodeRenderer: ({ name }: any) => {name}, + onClick: () => {}, + shouldShowArrow: false, + shouldShowPlaceholder: true, + ...props, + }; + const { + expanded, + onClick, + children, + nodeRenderer, + title, + shouldShowArrow, + shouldShowPlaceholder, + } = props; + + const styles = useStyles("TreeNode"); + const NodeRenderer = nodeRenderer; + + return ( +
  • +
    + {shouldShowArrow || Children.count(children) > 0 ? ( + + ) : ( + shouldShowPlaceholder &&   + )} + +
    + +
      + {expanded ? children : undefined} +
    +
  • + ); +}); + +// TreeNode.propTypes = { +// name: PropTypes.string, +// data: PropTypes.any, +// expanded: PropTypes.bool, +// shouldShowArrow: PropTypes.bool, +// shouldShowPlaceholder: PropTypes.bool, +// nodeRenderer: PropTypes.func, +// onClick: PropTypes.func, +// }; diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx b/packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx new file mode 100644 index 0000000000..22e05e1d50 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx @@ -0,0 +1,104 @@ +import { memo, useCallback, useContext, useLayoutEffect, useState } from "react"; +import { ExpandedPathsContext } from "./expanded-paths-context.js"; +import { DEFAULT_ROOT_PATH, getExpandedPaths, hasChildNodes } from "./path-utils.js"; +import { TreeNode } from "./tree-node.js"; + +import { useStyles } from "../styles/index.js"; + +interface ConnectedTreeViewProps { + name: string; + data: any; + path: string; + dataIterator: (...args: any[]) => any; + depth: number; + expanded?: boolean; + nodeRenderer: (...args: any[]) => any; +} +const ConnectedTreeNode = memo((props: ConnectedTreeViewProps) => { + const { data, dataIterator, path, depth, nodeRenderer } = props; + const [expandedPaths, setExpandedPaths] = useContext(ExpandedPathsContext); + const nodeHasChildNodes = hasChildNodes(data, dataIterator); + const expanded = !!expandedPaths[path]; + + const handleClick = useCallback( + () => + nodeHasChildNodes && + setExpandedPaths((prevExpandedPaths: any) => ({ + ...prevExpandedPaths, + [path]: !expanded, + })), + [nodeHasChildNodes, setExpandedPaths, path, expanded] + ); + + return ( + 0} + // Render a node from name and data (or possibly other props like isNonenumerable) + {...props} + > + { + // only render if the node is expanded + expanded + ? [...dataIterator(data)].map(({ name, data, ...renderNodeProps }) => { + return ( + + ); + }) + : null + } + + ); +}); + +interface TreeViewProps { + name: string; + data: any; + dataIterator: (...args: any[]) => any; + nodeRenderer: (...args: any[]) => any; + expandPaths: string[]; + expandLevel: number; +} +export const TreeView = memo( + ({ name, data, dataIterator, nodeRenderer, expandPaths, expandLevel }: TreeViewProps) => { + const styles = useStyles("TreeView"); + const stateAndSetter = useState({}); + const [, setExpandedPaths] = stateAndSetter; + + useLayoutEffect( + () => + setExpandedPaths((prevExpandedPaths) => + getExpandedPaths(data, dataIterator, expandPaths, expandLevel, prevExpandedPaths) + ), + [data, dataIterator, expandPaths, expandLevel] + ); + + return ( + +
      + +
    +
    + ); + } +); diff --git a/packages/html-program-viewer/src/react/inspector/utils/object-prototype.tsx b/packages/html-program-viewer/src/react/inspector/utils/object-prototype.tsx new file mode 100644 index 0000000000..54b8adb56d --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/utils/object-prototype.tsx @@ -0,0 +1,2 @@ +export const hasOwnProperty = Object.prototype.hasOwnProperty; +export const propertyIsEnumerable = Object.prototype.propertyIsEnumerable; diff --git a/packages/html-program-viewer/src/react/inspector/utils/property-utils.tsx b/packages/html-program-viewer/src/react/inspector/utils/property-utils.tsx new file mode 100644 index 0000000000..614e3975b2 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/utils/property-utils.tsx @@ -0,0 +1,12 @@ +export function getPropertyValue(object: any, propertyName: string) { + const propertyDescriptor = Object.getOwnPropertyDescriptor(object, propertyName); + if (propertyDescriptor?.get) { + try { + return propertyDescriptor.get(); + } catch { + return propertyDescriptor.get; + } + } + + return object[propertyName]; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0a6dfad32..dc0cf5d31b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -392,9 +392,6 @@ importers: react-dom: specifier: ~18.3.1 version: 18.3.1(react@18.3.1) - react-inspector: - specifier: ^6.0.2 - version: 6.0.2(react@18.3.1) devDependencies: '@babel/core': specifier: ^7.24.5 @@ -18312,14 +18309,6 @@ packages: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - /react-inspector@6.0.2(react@18.3.1): - resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 - dependencies: - react: 18.3.1 - dev: false - /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} From 45e7b853912408095260e2d35955638575de3c0e Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 13:59:55 -0700 Subject: [PATCH 43/70] use existing tree component --- .../object-inspector/object-inspector.tsx | 135 +++++++++++++----- .../tree-view/expanded-paths-context.tsx | 4 - .../inspector/tree-view/path-utils.test.ts | 21 --- .../react/inspector/tree-view/path-utils.ts | 69 --------- .../react/inspector/tree-view/tree-node.tsx | 63 -------- .../react/inspector/tree-view/tree-view.tsx | 104 -------------- .../src/react/tree-navigation.tsx | 1 + .../src/react/tree/tree-control.ts | 8 +- .../src/react/tree/tree.tsx | 30 +++- .../src/react/tree/types.ts | 7 +- 10 files changed, 138 insertions(+), 304 deletions(-) delete mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts delete mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts delete mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx index 6d0007eefa..2ae498bf26 100644 --- a/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx @@ -1,13 +1,12 @@ import type { FC } from "react"; -import { TreeView } from "../tree-view/tree-view.js"; - -import { ObjectLabel } from "./object-label.js"; -import { ObjectRootLabel } from "./object-root-label.js"; - +import { memo, useState } from "react"; +import { Tree } from "../../tree/tree.js"; +import type { TreeNode } from "../../tree/types.js"; +import { themeAcceptor } from "../styles/index.js"; import { propertyIsEnumerable } from "../utils/object-prototype.js"; import { getPropertyValue } from "../utils/property-utils.js"; - -import { themeAcceptor } from "../styles/index.js"; +import { ObjectLabel } from "./object-label.js"; +import { ObjectRootLabel } from "./object-root-label.js"; const createIterator = (showNonenumerable: any, sortObjectKeys: any) => { const objectIterator = function* (data: any) { @@ -86,47 +85,113 @@ const createIterator = (showNonenumerable: any, sortObjectKeys: any) => { return objectIterator; }; -const defaultNodeRenderer = ({ depth, name, data, isNonenumerable }: any) => - depth === 0 ? ( +const defaultNodeRenderer = ({ path, name, data, isNonenumerable }: NodeRendererProps) => + path === "$" ? ( ) : ( ); -/** - * Tree-view for objects - */ -const ObjectInspector: FC = ({ +export interface ObjectInspectorProps { + readonly data: any; + readonly showNonenumerable?: boolean; + readonly sortObjectKeys?: boolean | ((a: string, b: string) => number); + readonly nodeRenderer?: (props: NodeRendererProps) => any; +} + +const ObjectInspector: FC = ({ + data, showNonenumerable = false, sortObjectKeys, nodeRenderer, - ...treeViewProps }) => { const dataIterator = createIterator(showNonenumerable, sortObjectKeys); - const renderer = nodeRenderer ? nodeRenderer : defaultNodeRenderer; + const renderer = nodeRenderer ?? defaultNodeRenderer; - return ; + return ; }; -// ObjectInspector.propTypes = { -// /** An integer specifying to which level the tree should be initially expanded. */ -// expandLevel: PropTypes.number, -// /** An array containing all the paths that should be expanded when the component is initialized, or a string of just one path */ -// expandPaths: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), - -// name: PropTypes.string, -// /** Not required prop because we also allow undefined value */ -// data: PropTypes.any, - -// /** Show non-enumerable properties */ -// showNonenumerable: PropTypes.bool, -// /** Sort object keys with optional compare function. */ -// sortObjectKeys: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]), - -// /** Provide a custom nodeRenderer */ -// nodeRenderer: PropTypes.func, -// }; - const themedObjectInspector = themeAcceptor(ObjectInspector); export { themedObjectInspector as ObjectInspector }; + +export const DEFAULT_ROOT_PATH = "$"; + +export function hasChildNodes(data: any, dataIterator: any) { + return !dataIterator(data).next().done; +} + +export interface NodeRendererProps { + readonly name: string | undefined; + readonly path: string; + readonly data: any; + readonly isNonenumerable?: boolean; +} + +interface TreeViewProps { + data: any; + dataIterator: (...args: any[]) => any; + nodeRenderer: (props: NodeRendererProps) => any; +} +const TreeView = memo(({ data, nodeRenderer, dataIterator }: TreeViewProps) => { + const [expandedPaths, setExpandedPaths] = useState(new Set()); + + const tree = computeNode({ + path: DEFAULT_ROOT_PATH, + name: "root", + data, + dataIterator, + nodeRenderer, + expandedPaths, + }); + return ( + setExpandedPaths(new Set(x))} + /> + ); +}); + +interface ComputeNodeOptions { + expandedPaths: Set; + name: string; + data: any; + path: string; + dataIterator: (...args: any[]) => any; + nodeRenderer: (props: NodeRendererProps) => any; +} + +function computeNode({ + expandedPaths, + path, + data, + dataIterator, + ...props +}: ComputeNodeOptions): TreeNode { + const expanded = expandedPaths.has(path); + const nodeHasChildNodes = hasChildNodes(data, dataIterator); + return { + id: path, + name: ( + + ), + hasMore: nodeHasChildNodes, + children: expanded + ? [...dataIterator(data)].map(({ name, data }) => { + return computeNode({ + path: `${path}.${name}`, + name, + data, + nodeRenderer: props.nodeRenderer, + dataIterator, + expandedPaths, + }); + }) + : [], + }; +} diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx b/packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx deleted file mode 100644 index 1bab81df48..0000000000 --- a/packages/html-program-viewer/src/react/inspector/tree-view/expanded-paths-context.tsx +++ /dev/null @@ -1,4 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -import { createContext } from 'react'; - -export const ExpandedPathsContext = createContext<[any, (...args: any[]) => any]>([{}, () => {}]); diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts b/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts deleted file mode 100644 index 01bc1ce3a9..0000000000 --- a/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { describe, expect, it } from "vitest"; - -import { DEFAULT_ROOT_PATH, wildcardPathsFromLevel } from "./path-utils.js"; - -const root = DEFAULT_ROOT_PATH; - -describe("PathUtils", () => { - it("wildcardPathsFromLevel works", () => { - expect(wildcardPathsFromLevel(-1)).toEqual([]); - - expect(wildcardPathsFromLevel(0)).toEqual([]); - - expect(wildcardPathsFromLevel(1)).toEqual([root]); - - expect(wildcardPathsFromLevel(2)).toEqual([root, `${root}.*`]); - - expect(wildcardPathsFromLevel(3)).toEqual([root, `${root}.*`, `${root}.*.*`]); - - expect(wildcardPathsFromLevel(4)).toEqual([root, `${root}.*`, `${root}.*.*`, `${root}.*.*.*`]); - }); -}); diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts b/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts deleted file mode 100644 index d2b225e617..0000000000 --- a/packages/html-program-viewer/src/react/inspector/tree-view/path-utils.ts +++ /dev/null @@ -1,69 +0,0 @@ -export const DEFAULT_ROOT_PATH = "$"; - -const WILDCARD = "*"; - -export function hasChildNodes(data: any, dataIterator: any) { - return !dataIterator(data).next().done; -} - -export const wildcardPathsFromLevel = (level: number): string[] => { - // i is depth - return Array.from({ length: level }, (_, i) => - [DEFAULT_ROOT_PATH].concat(Array.from({ length: i }, () => "*")).join(".") - ); -}; - -export const getExpandedPaths = ( - data: any, - dataIterator: any, - expandPaths: string[], - expandLevel: number, - prevExpandedPaths: any -) => { - const wildcardPaths: string[] = [...wildcardPathsFromLevel(expandLevel)] - .concat(expandPaths) - .filter((path) => typeof path === "string"); // could be undefined - - const expandedPaths: string[] = []; - wildcardPaths.forEach((wildcardPath: string) => { - const keyPaths = wildcardPath.split("."); - const populatePaths = (curData: any, curPath: any, depth: any) => { - if (depth === keyPaths.length) { - expandedPaths.push(curPath); - return; - } - const key = keyPaths[depth]; - if (depth === 0) { - if ( - hasChildNodes(curData, dataIterator) && - (key === DEFAULT_ROOT_PATH || key === WILDCARD) - ) { - populatePaths(curData, DEFAULT_ROOT_PATH, depth + 1); - } - } else { - if (key === WILDCARD) { - for (const { name, data } of dataIterator(curData)) { - if (hasChildNodes(data, dataIterator)) { - populatePaths(data, `${curPath}.${name}`, depth + 1); - } - } - } else { - const value = curData[key]; - if (hasChildNodes(value, dataIterator)) { - populatePaths(value, `${curPath}.${key}`, depth + 1); - } - } - } - }; - - populatePaths(data, "", 0); - }); - - return expandedPaths.reduce( - (obj, path) => { - obj[path] = true; - return obj; - }, - { ...prevExpandedPaths } - ); -}; diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx b/packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx deleted file mode 100644 index 648a98f7d6..0000000000 --- a/packages/html-program-viewer/src/react/inspector/tree-view/tree-node.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Children, memo, type FC } from "react"; -import { useStyles } from "../styles/index.js"; - -const Arrow: FC = ({ expanded, styles }) => ( - - â–¶ - -); - -export const TreeNode: FC = memo((props) => { - props = { - expanded: true, - nodeRenderer: ({ name }: any) => {name}, - onClick: () => {}, - shouldShowArrow: false, - shouldShowPlaceholder: true, - ...props, - }; - const { - expanded, - onClick, - children, - nodeRenderer, - title, - shouldShowArrow, - shouldShowPlaceholder, - } = props; - - const styles = useStyles("TreeNode"); - const NodeRenderer = nodeRenderer; - - return ( -
  • -
    - {shouldShowArrow || Children.count(children) > 0 ? ( - - ) : ( - shouldShowPlaceholder &&   - )} - -
    - -
      - {expanded ? children : undefined} -
    -
  • - ); -}); - -// TreeNode.propTypes = { -// name: PropTypes.string, -// data: PropTypes.any, -// expanded: PropTypes.bool, -// shouldShowArrow: PropTypes.bool, -// shouldShowPlaceholder: PropTypes.bool, -// nodeRenderer: PropTypes.func, -// onClick: PropTypes.func, -// }; diff --git a/packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx b/packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx deleted file mode 100644 index 22e05e1d50..0000000000 --- a/packages/html-program-viewer/src/react/inspector/tree-view/tree-view.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { memo, useCallback, useContext, useLayoutEffect, useState } from "react"; -import { ExpandedPathsContext } from "./expanded-paths-context.js"; -import { DEFAULT_ROOT_PATH, getExpandedPaths, hasChildNodes } from "./path-utils.js"; -import { TreeNode } from "./tree-node.js"; - -import { useStyles } from "../styles/index.js"; - -interface ConnectedTreeViewProps { - name: string; - data: any; - path: string; - dataIterator: (...args: any[]) => any; - depth: number; - expanded?: boolean; - nodeRenderer: (...args: any[]) => any; -} -const ConnectedTreeNode = memo((props: ConnectedTreeViewProps) => { - const { data, dataIterator, path, depth, nodeRenderer } = props; - const [expandedPaths, setExpandedPaths] = useContext(ExpandedPathsContext); - const nodeHasChildNodes = hasChildNodes(data, dataIterator); - const expanded = !!expandedPaths[path]; - - const handleClick = useCallback( - () => - nodeHasChildNodes && - setExpandedPaths((prevExpandedPaths: any) => ({ - ...prevExpandedPaths, - [path]: !expanded, - })), - [nodeHasChildNodes, setExpandedPaths, path, expanded] - ); - - return ( - 0} - // Render a node from name and data (or possibly other props like isNonenumerable) - {...props} - > - { - // only render if the node is expanded - expanded - ? [...dataIterator(data)].map(({ name, data, ...renderNodeProps }) => { - return ( - - ); - }) - : null - } - - ); -}); - -interface TreeViewProps { - name: string; - data: any; - dataIterator: (...args: any[]) => any; - nodeRenderer: (...args: any[]) => any; - expandPaths: string[]; - expandLevel: number; -} -export const TreeView = memo( - ({ name, data, dataIterator, nodeRenderer, expandPaths, expandLevel }: TreeViewProps) => { - const styles = useStyles("TreeView"); - const stateAndSetter = useState({}); - const [, setExpandedPaths] = stateAndSetter; - - useLayoutEffect( - () => - setExpandedPaths((prevExpandedPaths) => - getExpandedPaths(data, dataIterator, expandPaths, expandLevel, prevExpandedPaths) - ), - [data, dataIterator, expandPaths, expandLevel] - ); - - return ( - -
      - -
    -
    - ); - } -); diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index 31f5d260d0..ec07a98ccb 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -10,6 +10,7 @@ export const TreeNavigation = (_: TreeNavigationProps) => { return ( + selectionMode="single" tree={nav.tree} nodeIcon={NodeIcon} selected={nav.selectedPath} diff --git a/packages/html-program-viewer/src/react/tree/tree-control.ts b/packages/html-program-viewer/src/react/tree/tree-control.ts index bba71a873e..9552e30eb4 100644 --- a/packages/html-program-viewer/src/react/tree/tree-control.ts +++ b/packages/html-program-viewer/src/react/tree/tree-control.ts @@ -7,8 +7,11 @@ export interface TreeControls { collapse(key: string): void; toggleExpand(key: string): void; } +export interface TreeControlsOptions { + readonly onSetExpanded?: (expanded: Set) => void; +} -export function useTreeControls(): TreeControls { +export function useTreeControls({ onSetExpanded }: TreeControlsOptions): TreeControls { const expanded = useRef(new Set()).current; const [rerender, setRerender] = useState(0); @@ -19,6 +22,7 @@ export function useTreeControls(): TreeControls { } else { expanded.add(key); } + onSetExpanded?.(expanded); setRerender((x) => x + 1); }, [expanded] @@ -27,6 +31,7 @@ export function useTreeControls(): TreeControls { const expand = useCallback( (key: string) => { expanded.add(key); + onSetExpanded?.(expanded); setRerender((x) => x + 1); }, [expanded] @@ -34,6 +39,7 @@ export function useTreeControls(): TreeControls { const collapse = useCallback( (key: string) => { expanded.delete(key); + onSetExpanded?.(expanded); setRerender((x) => x + 1); }, [expanded] diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 7b2f66283f..6f2a0f9564 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -15,15 +15,31 @@ import type { TreeNode, TreeRow } from "./types.js"; import style from "./tree.module.css"; export interface TreeViewProps { + /** + * If tree allows keeping a current selection. + * @default no selection. + */ + readonly selectionMode?: "none" | "single"; readonly tree: T; readonly nodeIcon?: FC<{ node: T }>; readonly selected?: string; readonly onSelect?: (id: string) => void; + readonly expanded?: Set; + readonly onSetExpanded?: (id: Set) => void; } -export function Tree({ tree, selected, onSelect, nodeIcon }: TreeViewProps) { +export function Tree({ + tree, + selected, + onSelect, + onSetExpanded, + nodeIcon, + selectionMode, +}: TreeViewProps) { const id = useId(); - const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls(); + const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ + onSetExpanded, + }); const [focusedIndex, setFocusedIndex] = useState(0); const [selectedKey, setSelectedKey] = useControllableValue(selected, undefined, onSelect); @@ -48,10 +64,12 @@ export function Tree({ tree, selected, onSelect, nodeIcon }: toggleExpand(row.id); } else { expand(row.id); - setSelectedKey(row.id); + if (selectionMode === "single") { + setSelectedKey(row.id); + } } }, - [selectedKey, toggleExpand] + [selectedKey, toggleExpand, selectionMode] ); const handleKeyDown = useCallback( @@ -104,7 +122,7 @@ export function Tree({ tree, selected, onSelect, nodeIcon }: focussed={focusedIndex === row.index} key={row.id} row={row} - active={row.id === selectedKey} + active={selectionMode === "single" && row.id === selectedKey} activate={activateRow} /> ); @@ -124,7 +142,7 @@ function getTreeRowsForNode( return []; } for (const [index, child] of node.children.entries()) { - const hasChildren = Boolean(child.children && child.children.length > 0); + const hasChildren = child.hasMore || Boolean(child.children && child.children.length > 0); const id = child.id; const expanded = expandedItems.has(id); diff --git a/packages/html-program-viewer/src/react/tree/types.ts b/packages/html-program-viewer/src/react/tree/types.ts index 693fd77092..4effdcddde 100644 --- a/packages/html-program-viewer/src/react/tree/types.ts +++ b/packages/html-program-viewer/src/react/tree/types.ts @@ -1,12 +1,17 @@ import type { ReactNode } from "react"; export interface TreeItem { - readonly name: string; + readonly name: string | ReactNode; readonly id: string; } export interface TreeNode extends TreeItem { readonly children?: TreeNode[]; + /** + * If the node has more children that are not currently included. + * This will render the chevron icon even though children is empty. + */ + readonly hasMore?: boolean; } export interface TreeRow { From 271092b9eaeace218a2952b0317190a0b064cce3 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 14:20:37 -0700 Subject: [PATCH 44/70] use existing styles --- .../src/react/inspector/index.tsx | 13 +- .../inspector/object-inspector.module.css | 15 + .../object-inspector.tsx | 15 +- .../{object-inspector => }/object-label.tsx | 16 +- .../src/react/inspector/object-name.tsx | 22 ++ .../{object-inspector => }/object-preview.tsx | 31 +- .../object-root-label.tsx | 2 +- .../src/react/inspector/object-value.tsx | 60 ++++ .../react/inspector/object/object-name.tsx | 29 -- .../react/inspector/object/object-value.tsx | 67 ---- .../src/react/inspector/styles/base.tsx | 289 ------------------ .../src/react/inspector/styles/index.tsx | 1 - .../src/react/inspector/styles/styles.tsx | 52 ---- .../inspector/styles/themes/chromeDark.tsx | 46 --- .../inspector/styles/themes/chromeLight.tsx | 46 --- .../react/inspector/styles/themes/index.tsx | 2 - .../react/inspector/styles/unselectable.tsx | 9 - 17 files changed, 132 insertions(+), 583 deletions(-) create mode 100644 packages/html-program-viewer/src/react/inspector/object-inspector.module.css rename packages/html-program-viewer/src/react/inspector/{object-inspector => }/object-inspector.tsx (92%) rename packages/html-program-viewer/src/react/inspector/{object-inspector => }/object-label.tsx (57%) create mode 100644 packages/html-program-viewer/src/react/inspector/object-name.tsx rename packages/html-program-viewer/src/react/inspector/{object-inspector => }/object-preview.tsx (72%) rename packages/html-program-viewer/src/react/inspector/{object-inspector => }/object-root-label.tsx (87%) create mode 100644 packages/html-program-viewer/src/react/inspector/object-value.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/object/object-name.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/object/object-value.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/base.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/index.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/styles.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx diff --git a/packages/html-program-viewer/src/react/inspector/index.tsx b/packages/html-program-viewer/src/react/inspector/index.tsx index 7a830c92ba..5b45c3d5d0 100644 --- a/packages/html-program-viewer/src/react/inspector/index.tsx +++ b/packages/html-program-viewer/src/react/inspector/index.tsx @@ -1,9 +1,6 @@ // Fork from https://www.npmjs.com/package/react-inspector and modified to integrate with TypeSpec types -export { chromeDark, chromeLight } from "./styles/themes/index.js"; - -export { ObjectInspector } from "./object-inspector/object-inspector.js"; - -export { ObjectLabel } from "./object-inspector/object-label.js"; -export { ObjectPreview } from "./object-inspector/object-preview.js"; -export { ObjectRootLabel } from "./object-inspector/object-root-label.js"; -export { ObjectValue } from "./object/object-value.js"; +export { ObjectInspector } from "./object-inspector.js"; +export { ObjectLabel } from "./object-label.js"; +export { ObjectPreview } from "./object-preview.js"; +export { ObjectRootLabel } from "./object-root-label.js"; +export { ObjectValue } from "./object-value.js"; diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector.module.css b/packages/html-program-viewer/src/react/inspector/object-inspector.module.css new file mode 100644 index 0000000000..4c769870b3 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-inspector.module.css @@ -0,0 +1,15 @@ +.object-description { + font-style: italic; +} + +.preview { + font-style: italic; +} + +.object-name { + color: var(--colorPaletteMarigoldForeground2); +} + +.dimmed { + opacity: 0.6; +} diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/inspector/object-inspector.tsx similarity index 92% rename from packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx rename to packages/html-program-viewer/src/react/inspector/object-inspector.tsx index 2ae498bf26..e8d46dc507 100644 --- a/packages/html-program-viewer/src/react/inspector/object-inspector/object-inspector.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-inspector.tsx @@ -1,12 +1,11 @@ import type { FC } from "react"; import { memo, useState } from "react"; -import { Tree } from "../../tree/tree.js"; -import type { TreeNode } from "../../tree/types.js"; -import { themeAcceptor } from "../styles/index.js"; -import { propertyIsEnumerable } from "../utils/object-prototype.js"; -import { getPropertyValue } from "../utils/property-utils.js"; +import { Tree } from "../tree/tree.js"; +import type { TreeNode } from "../tree/types.js"; import { ObjectLabel } from "./object-label.js"; import { ObjectRootLabel } from "./object-root-label.js"; +import { propertyIsEnumerable } from "./utils/object-prototype.js"; +import { getPropertyValue } from "./utils/property-utils.js"; const createIterator = (showNonenumerable: any, sortObjectKeys: any) => { const objectIterator = function* (data: any) { @@ -99,7 +98,7 @@ export interface ObjectInspectorProps { readonly nodeRenderer?: (props: NodeRendererProps) => any; } -const ObjectInspector: FC = ({ +export const ObjectInspector: FC = ({ data, showNonenumerable = false, sortObjectKeys, @@ -111,10 +110,6 @@ const ObjectInspector: FC = ({ return ; }; -const themedObjectInspector = themeAcceptor(ObjectInspector); - -export { themedObjectInspector as ObjectInspector }; - export const DEFAULT_ROOT_PATH = "$"; export function hasChildNodes(data: any, dataIterator: any) { diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx b/packages/html-program-viewer/src/react/inspector/object-label.tsx similarity index 57% rename from packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx rename to packages/html-program-viewer/src/react/inspector/object-label.tsx index da2bb1631f..9da31e0259 100644 --- a/packages/html-program-viewer/src/react/inspector/object-inspector/object-label.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-label.tsx @@ -1,12 +1,17 @@ import type { FC } from "react"; -import { ObjectName } from "../object/object-name.js"; -import { ObjectValue } from "../object/object-value.js"; +import { ObjectName } from "./object-name.js"; import { ObjectPreview } from "./object-preview.js"; +import { ObjectValue } from "./object-value.js"; +export interface ObjectLabelProps { + readonly name: any; + readonly data: any; + readonly isNonenumerable?: boolean; +} /** * if isNonenumerable is specified, render the name dimmed */ -export const ObjectLabel: FC = ({ name, data, isNonenumerable = false }) => { +export const ObjectLabel: FC = ({ name, data, isNonenumerable = false }) => { const object = data; return ( @@ -21,8 +26,3 @@ export const ObjectLabel: FC = ({ name, data, isNonenumerable = false }) =>
    ); }; - -// ObjectLabel.propTypes = { -// /** Non enumerable object property will be dimmed */ -// isNonenumerable: PropTypes.bool, -// }; diff --git a/packages/html-program-viewer/src/react/inspector/object-name.tsx b/packages/html-program-viewer/src/react/inspector/object-name.tsx new file mode 100644 index 0000000000..7c46d13f5f --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-name.tsx @@ -0,0 +1,22 @@ +import { mergeClasses } from "@fluentui/react-components"; +import type { FC } from "react"; +import style from "./object-inspector.module.css"; + +export interface ObjectNameProps { + readonly name: any; + readonly dimmed?: boolean; +} +/** + * A view for object property names. + * + * If the property name is enumerable (in Object.keys(object)), + * the property name will be rendered normally. + * + * If the property name is not enumerable (`Object.prototype.propertyIsEnumerable()`), + * the property name will be dimmed to show the difference. + */ +export const ObjectName: FC = ({ name, dimmed }) => { + return ( + {name} + ); +}; diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx b/packages/html-program-viewer/src/react/inspector/object-preview.tsx similarity index 72% rename from packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx rename to packages/html-program-viewer/src/react/inspector/object-preview.tsx index 7d64523361..cf0fe10423 100644 --- a/packages/html-program-viewer/src/react/inspector/object-inspector/object-preview.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-preview.tsx @@ -1,12 +1,11 @@ -import React, { type FC, type ReactChild } from "react"; +import React, { type FC, type ReactNode } from "react"; -import { ObjectName } from "../object/object-name.js"; -import { ObjectValue } from "../object/object-value.js"; +import { ObjectName } from "./object-name.js"; +import { ObjectValue } from "./object-value.js"; -import { useStyles } from "../styles/index.js"; - -import { hasOwnProperty } from "../utils/object-prototype.js"; -import { getPropertyValue } from "../utils/property-utils.js"; +import style from "./object-inspector.module.css"; +import { hasOwnProperty } from "./utils/object-prototype.js"; +import { getPropertyValue } from "./utils/property-utils.js"; /* intersperse arr with separator */ function intersperse(arr: any[], sep: string) { @@ -17,11 +16,13 @@ function intersperse(arr: any[], sep: string) { return arr.slice(1).reduce((xs, x) => xs.concat([sep, x]), [arr[0]]); } +const ARRAY_MAX_PROPERTIES = 10; +const OBJECT_MAX_PROPERTIES = 5; + /** * A preview of the object */ export const ObjectPreview: FC = ({ data }) => { - const styles = useStyles("ObjectPreview"); const object = data; if ( @@ -34,7 +35,7 @@ export const ObjectPreview: FC = ({ data }) => { } if (Array.isArray(object)) { - const maxProperties = styles.arrayMaxProperties; + const maxProperties = ARRAY_MAX_PROPERTIES; const previewArray = object .slice(0, maxProperties) .map((element, index) => ); @@ -44,15 +45,15 @@ export const ObjectPreview: FC = ({ data }) => { const arrayLength = object.length; return ( - + {arrayLength === 0 ? `` : `(${arrayLength})\xa0`} - [{intersperse(previewArray, ", ")}] + [{intersperse(previewArray, ", ")}] ); } else { - const maxProperties = styles.objectMaxProperties; - const propertyNodes: ReactChild[] = []; + const maxProperties = OBJECT_MAX_PROPERTIES; + const propertyNodes: ReactNode[] = []; for (const propertyName in object) { if (hasOwnProperty.call(object, propertyName)) { let ellipsis; @@ -80,10 +81,10 @@ export const ObjectPreview: FC = ({ data }) => { return ( - + {objectConstructorName === "Object" ? "" : `${objectConstructorName} `} - + {"{"} {intersperse(propertyNodes, ", ")} {"}"} diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx b/packages/html-program-viewer/src/react/inspector/object-root-label.tsx similarity index 87% rename from packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx rename to packages/html-program-viewer/src/react/inspector/object-root-label.tsx index 82a19daf88..0d33d6ca86 100644 --- a/packages/html-program-viewer/src/react/inspector/object-inspector/object-root-label.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-root-label.tsx @@ -1,5 +1,5 @@ import type { FC } from "react"; -import { ObjectName } from "../object/object-name.js"; +import { ObjectName } from "./object-name.js"; import { ObjectPreview } from "./object-preview.js"; export const ObjectRootLabel: FC = ({ name, data }) => { diff --git a/packages/html-program-viewer/src/react/inspector/object-value.tsx b/packages/html-program-viewer/src/react/inspector/object-value.tsx new file mode 100644 index 0000000000..b0f16fb405 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/object-value.tsx @@ -0,0 +1,60 @@ +import type { FC } from "react"; +import { Literal } from "../common.js"; + +export interface ObjectValueProps { + readonly object: any; +} +/** + * A short description of the object values. + * Can be used to render tree node in ObjectInspector + * or render objects in TableInspector. + */ +export const ObjectValue: FC = ({ object }) => { + switch (typeof object) { + case "bigint": + return {String(object)}n; + case "number": + return {String(object)}; + case "string": + return "{object}"; + case "boolean": + return {String(object)}; + case "undefined": + return undefined; + case "object": + if (object === null) { + return null; + } + if (object instanceof Date) { + return {object.toString()}; + } + if (object instanceof RegExp) { + return {object.toString()}; + } + if (Array.isArray(object)) { + return {`Array(${object.length})`}; + } + if (!object.constructor) { + return Object; + } + if ( + typeof object.constructor.isBuffer === "function" && + object.constructor.isBuffer(object) + ) { + return {`Buffer[${object.length}]`}; + } + + return {object.constructor.name}; + case "function": + return ( + + Æ’  + {object.name}() + + ); + case "symbol": + return {object.toString()}; + default: + return ; + } +}; diff --git a/packages/html-program-viewer/src/react/inspector/object/object-name.tsx b/packages/html-program-viewer/src/react/inspector/object/object-name.tsx deleted file mode 100644 index 390910bcd7..0000000000 --- a/packages/html-program-viewer/src/react/inspector/object/object-name.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import type { FC } from "react"; -import { useStyles } from "../styles/index.js"; - -/** - * A view for object property names. - * - * If the property name is enumerable (in Object.keys(object)), - * the property name will be rendered normally. - * - * If the property name is not enumerable (`Object.prototype.propertyIsEnumerable()`), - * the property name will be dimmed to show the difference. - */ -export const ObjectName: FC = ({ name, dimmed = false, styles = {} }) => { - const themeStyles = useStyles("ObjectName"); - const appliedStyles = { - ...themeStyles.base, - ...(dimmed ? themeStyles["dimmed"] : {}), - ...styles, - }; - - return {name}; -}; - -// ObjectName.propTypes = { -// /** Property name */ -// name: PropTypes.string, -// /** Should property name be dimmed */ -// dimmed: PropTypes.bool, -// }; diff --git a/packages/html-program-viewer/src/react/inspector/object/object-value.tsx b/packages/html-program-viewer/src/react/inspector/object/object-value.tsx deleted file mode 100644 index f123217d3c..0000000000 --- a/packages/html-program-viewer/src/react/inspector/object/object-value.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import type { FC } from "react"; - -import { useStyles } from "../styles/index.js"; - -/** - * A short description of the object values. - * Can be used to render tree node in ObjectInspector - * or render objects in TableInspector. - */ -export const ObjectValue: FC = ({ object, styles }) => { - const themeStyles = useStyles("ObjectValue"); - - const mkStyle = (key: any) => ({ ...themeStyles[key], ...styles }); - - switch (typeof object) { - case "bigint": - return {String(object)}n; - case "number": - return {String(object)}; - case "string": - return "{object}"; - case "boolean": - return {String(object)}; - case "undefined": - return undefined; - case "object": - if (object === null) { - return null; - } - if (object instanceof Date) { - return {object.toString()}; - } - if (object instanceof RegExp) { - return {object.toString()}; - } - if (Array.isArray(object)) { - return {`Array(${object.length})`}; - } - if (!object.constructor) { - return Object; - } - if ( - typeof object.constructor.isBuffer === "function" && - object.constructor.isBuffer(object) - ) { - return {`Buffer[${object.length}]`}; - } - - return {object.constructor.name}; - case "function": - return ( - - Æ’  - {object.name}() - - ); - case "symbol": - return {object.toString()}; - default: - return ; - } -}; - -// ObjectValue.propTypes = { -// // the object to describe -// object: PropTypes.any, -// }; diff --git a/packages/html-program-viewer/src/react/inspector/styles/base.tsx b/packages/html-program-viewer/src/react/inspector/styles/base.tsx deleted file mode 100644 index dee3abbbb2..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/base.tsx +++ /dev/null @@ -1,289 +0,0 @@ -import { unselectable } from "./unselectable.js"; - -export const createTheme = (theme: any) => ({ - DOMNodePreview: { - htmlOpenTag: { - base: { - color: theme.HTML_TAG_COLOR, - }, - tagName: { - color: theme.HTML_TAGNAME_COLOR, - textTransform: theme.HTML_TAGNAME_TEXT_TRANSFORM, - }, - htmlAttributeName: { - color: theme.HTML_ATTRIBUTE_NAME_COLOR, - }, - htmlAttributeValue: { - color: theme.HTML_ATTRIBUTE_VALUE_COLOR, - }, - }, - htmlCloseTag: { - base: { - color: theme.HTML_TAG_COLOR, - }, - offsetLeft: { - /* hack: offset placeholder */ - marginLeft: -theme.TREENODE_PADDING_LEFT, - }, - tagName: { - color: theme.HTML_TAGNAME_COLOR, - textTransform: theme.HTML_TAGNAME_TEXT_TRANSFORM, - }, - }, - htmlComment: { - color: theme.HTML_COMMENT_COLOR, - }, - htmlDoctype: { - color: theme.HTML_DOCTYPE_COLOR, - }, - }, - - ObjectPreview: { - objectDescription: { - fontStyle: "italic", - }, - preview: { - fontStyle: "italic", - }, - arrayMaxProperties: theme.OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES, - objectMaxProperties: theme.OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES, - }, - - ObjectName: { - base: { - color: theme.OBJECT_NAME_COLOR, - }, - dimmed: { - opacity: 0.6, - }, - }, - - ObjectValue: { - objectValueNull: { - color: theme.OBJECT_VALUE_NULL_COLOR, - }, - objectValueUndefined: { - color: theme.OBJECT_VALUE_UNDEFINED_COLOR, - }, - objectValueRegExp: { - color: theme.OBJECT_VALUE_REGEXP_COLOR, - }, - objectValueString: { - color: theme.OBJECT_VALUE_STRING_COLOR, - }, - objectValueSymbol: { - color: theme.OBJECT_VALUE_SYMBOL_COLOR, - }, - objectValueNumber: { - color: theme.OBJECT_VALUE_NUMBER_COLOR, - }, - objectValueBoolean: { - color: theme.OBJECT_VALUE_BOOLEAN_COLOR, - }, - objectValueFunctionPrefix: { - color: theme.OBJECT_VALUE_FUNCTION_PREFIX_COLOR, - fontStyle: "italic", - }, - objectValueFunctionName: { - fontStyle: "italic", - }, - }, - - TreeView: { - treeViewOutline: { - padding: 0, - margin: 0, - listStyleType: "none", - }, - }, - - TreeNode: { - treeNodeBase: { - color: theme.BASE_COLOR, - backgroundColor: theme.BASE_BACKGROUND_COLOR, - - lineHeight: theme.TREENODE_LINE_HEIGHT, - cursor: "default", - - boxSizing: "border-box", - listStyle: "none", - - fontFamily: theme.TREENODE_FONT_FAMILY, - fontSize: theme.TREENODE_FONT_SIZE, - }, - treeNodePreviewContainer: {}, - treeNodePlaceholder: { - whiteSpace: "pre", - - fontSize: theme.ARROW_FONT_SIZE, - marginRight: theme.ARROW_MARGIN_RIGHT, - ...unselectable, - }, - treeNodeArrow: { - base: { - color: theme.ARROW_COLOR, - display: "inline-block", - // lineHeight: '14px', - fontSize: theme.ARROW_FONT_SIZE, - marginRight: theme.ARROW_MARGIN_RIGHT, - ...(parseFloat(theme.ARROW_ANIMATION_DURATION) > 0 - ? { - transition: `transform ${theme.ARROW_ANIMATION_DURATION} ease 0s`, - } - : {}), - ...unselectable, - }, - expanded: { - WebkitTransform: "rotateZ(90deg)", - MozTransform: "rotateZ(90deg)", - transform: "rotateZ(90deg)", - }, - collapsed: { - WebkitTransform: "rotateZ(0deg)", - MozTransform: "rotateZ(0deg)", - transform: "rotateZ(0deg)", - }, - }, - treeNodeChildNodesContainer: { - margin: 0, // reset user-agent style - paddingLeft: theme.TREENODE_PADDING_LEFT, - }, - }, - - TableInspector: { - base: { - color: theme.BASE_COLOR, - - position: "relative", - border: `1px solid ${theme.TABLE_BORDER_COLOR}`, - fontFamily: theme.BASE_FONT_FAMILY, - fontSize: theme.BASE_FONT_SIZE, - lineHeight: "120%", - boxSizing: "border-box", - cursor: "default", - }, - }, - - TableInspectorHeaderContainer: { - base: { - top: 0, - height: "17px", - left: 0, - right: 0, - overflowX: "hidden", - }, - table: { - tableLayout: "fixed", - borderSpacing: 0, - borderCollapse: "separate", - height: "100%", - width: "100%", - margin: 0, - }, - }, - - TableInspectorDataContainer: { - tr: { - display: "table-row", - }, - td: { - boxSizing: "border-box", - border: "none", // prevent overrides - height: "16px", // /* 0.5 * table.background-size height */ - verticalAlign: "top", - padding: "1px 4px", - WebkitUserSelect: "text", - - whiteSpace: "nowrap", - textOverflow: "ellipsis", - overflow: "hidden", - lineHeight: "14px", - }, - div: { - position: "static", - top: "17px", - bottom: 0, - overflowY: "overlay", - transform: "translateZ(0)", - - left: 0, - right: 0, - overflowX: "hidden", - }, - table: { - positon: "static", - left: 0, - top: 0, - right: 0, - bottom: 0, - borderTop: "0 none transparent", - margin: 0, // prevent user agent stylesheet overrides - - backgroundImage: theme.TABLE_DATA_BACKGROUND_IMAGE, - backgroundSize: theme.TABLE_DATA_BACKGROUND_SIZE, - tableLayout: "fixed", - - // table - borderSpacing: 0, - borderCollapse: "separate", - // height: '100%', - width: "100%", - - fontSize: theme.BASE_FONT_SIZE, - lineHeight: "120%", - }, - }, - - TableInspectorTH: { - base: { - position: "relative", // anchor for sort icon container - height: "auto", - textAlign: "left", - backgroundColor: theme.TABLE_TH_BACKGROUND_COLOR, - borderBottom: `1px solid ${theme.TABLE_BORDER_COLOR}`, - fontWeight: "normal", - verticalAlign: "middle", - padding: "0 4px", - - whiteSpace: "nowrap", - textOverflow: "ellipsis", - overflow: "hidden", - lineHeight: "14px", - - ":hover": { - backgroundColor: theme.TABLE_TH_HOVER_COLOR, - }, - }, - div: { - whiteSpace: "nowrap", - textOverflow: "ellipsis", - overflow: "hidden", - - // prevent user agent stylesheet overrides - fontSize: theme.BASE_FONT_SIZE, - lineHeight: "120%", - }, - }, - - TableInspectorLeftBorder: { - none: { - borderLeft: "none", - }, - solid: { - borderLeft: `1px solid ${theme.TABLE_BORDER_COLOR}`, - }, - }, - - TableInspectorSortIcon: { - display: "block", - marginRight: 3, // 4, - width: 8, - height: 7, - - marginTop: -7, - color: theme.TABLE_SORT_ICON_COLOR, - fontSize: 12, - // lineHeight: 14 - ...unselectable, - }, -}); diff --git a/packages/html-program-viewer/src/react/inspector/styles/index.tsx b/packages/html-program-viewer/src/react/inspector/styles/index.tsx deleted file mode 100644 index bd7755cd5f..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { themeAcceptor, useStyles } from "./styles.js"; diff --git a/packages/html-program-viewer/src/react/inspector/styles/styles.tsx b/packages/html-program-viewer/src/react/inspector/styles/styles.tsx deleted file mode 100644 index a4b3b27b00..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/styles.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { createContext, useContext, useMemo } from "react"; - -import { createTheme } from "./base.js"; -import * as themes from "./themes/index.js"; - -const DEFAULT_THEME_NAME = "chromeLight"; - -const ThemeContext = createContext(createTheme(themes[DEFAULT_THEME_NAME])); - -/** - * Hook to get the component styles for the current theme. - * @param {string} baseStylesKey - Name of the component to be styled - */ -export const useStyles = (baseStylesKey: any) => { - const themeStyles = useContext(ThemeContext); - //@ts-ignore - return themeStyles[baseStylesKey]; -}; - -/** - * HOC to create a component that accepts a "theme" prop and uses it to set - * the current theme. This is intended to be used by the top-level inspector - * components. - * @param {Object} WrappedComponent - React component to be wrapped - */ -export const themeAcceptor = (WrappedComponent: any) => { - const ThemeAcceptor = ({ theme = DEFAULT_THEME_NAME, ...restProps }) => { - const themeStyles = useMemo(() => { - switch (Object.prototype.toString.call(theme)) { - case "[object String]": - //@ts-ignore - return createTheme(themes[theme]); - case "[object Object]": - return createTheme(theme); - default: - return createTheme(themes[DEFAULT_THEME_NAME]); - } - }, [theme]); - - return ( - - - - ); - }; - - // ThemeAcceptor.propTypes = { - // theme: PropTypes.oneOfType([PropTypes.string, PropTypes.object]), - // }; - - return ThemeAcceptor; -}; diff --git a/packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx b/packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx deleted file mode 100644 index 8679dc5dff..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/themes/chromeDark.tsx +++ /dev/null @@ -1,46 +0,0 @@ -export const theme = { - BASE_FONT_FAMILY: 'Menlo, monospace', - BASE_FONT_SIZE: '11px', - BASE_LINE_HEIGHT: 1.2, - - BASE_BACKGROUND_COLOR: 'rgb(36, 36, 36)', - BASE_COLOR: 'rgb(213, 213, 213)', - - OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES: 10, - OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES: 5, - OBJECT_NAME_COLOR: 'rgb(227, 110, 236)', - OBJECT_VALUE_NULL_COLOR: 'rgb(127, 127, 127)', - OBJECT_VALUE_UNDEFINED_COLOR: 'rgb(127, 127, 127)', - OBJECT_VALUE_REGEXP_COLOR: 'rgb(233, 63, 59)', - OBJECT_VALUE_STRING_COLOR: 'rgb(233, 63, 59)', - OBJECT_VALUE_SYMBOL_COLOR: 'rgb(233, 63, 59)', - OBJECT_VALUE_NUMBER_COLOR: 'hsl(252, 100%, 75%)', - OBJECT_VALUE_BOOLEAN_COLOR: 'hsl(252, 100%, 75%)', - OBJECT_VALUE_FUNCTION_PREFIX_COLOR: 'rgb(85, 106, 242)', - - HTML_TAG_COLOR: 'rgb(93, 176, 215)', - HTML_TAGNAME_COLOR: 'rgb(93, 176, 215)', - HTML_TAGNAME_TEXT_TRANSFORM: 'lowercase', - HTML_ATTRIBUTE_NAME_COLOR: 'rgb(155, 187, 220)', - HTML_ATTRIBUTE_VALUE_COLOR: 'rgb(242, 151, 102)', - HTML_COMMENT_COLOR: 'rgb(137, 137, 137)', - HTML_DOCTYPE_COLOR: 'rgb(192, 192, 192)', - - ARROW_COLOR: 'rgb(145, 145, 145)', - ARROW_MARGIN_RIGHT: 3, - ARROW_FONT_SIZE: 12, - ARROW_ANIMATION_DURATION: '0', - - TREENODE_FONT_FAMILY: 'Menlo, monospace', - TREENODE_FONT_SIZE: '11px', - TREENODE_LINE_HEIGHT: 1.2, - TREENODE_PADDING_LEFT: 12, - - TABLE_BORDER_COLOR: 'rgb(85, 85, 85)', - TABLE_TH_BACKGROUND_COLOR: 'rgb(44, 44, 44)', - TABLE_TH_HOVER_COLOR: 'rgb(48, 48, 48)', - TABLE_SORT_ICON_COLOR: 'black', //'rgb(48, 57, 66)', - TABLE_DATA_BACKGROUND_IMAGE: - 'linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0) 50%, rgba(51, 139, 255, 0.0980392) 50%, rgba(51, 139, 255, 0.0980392))', - TABLE_DATA_BACKGROUND_SIZE: '128px 32px', -}; diff --git a/packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx b/packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx deleted file mode 100644 index b63e9c086c..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/themes/chromeLight.tsx +++ /dev/null @@ -1,46 +0,0 @@ -export const theme = { - BASE_FONT_FAMILY: 'Menlo, monospace', - BASE_FONT_SIZE: '11px', - BASE_LINE_HEIGHT: 1.2, - - BASE_BACKGROUND_COLOR: 'white', - BASE_COLOR: 'black', - - OBJECT_PREVIEW_ARRAY_MAX_PROPERTIES: 10, - OBJECT_PREVIEW_OBJECT_MAX_PROPERTIES: 5, - OBJECT_NAME_COLOR: 'rgb(136, 19, 145)', - OBJECT_VALUE_NULL_COLOR: 'rgb(128, 128, 128)', - OBJECT_VALUE_UNDEFINED_COLOR: 'rgb(128, 128, 128)', - OBJECT_VALUE_REGEXP_COLOR: 'rgb(196, 26, 22)', - OBJECT_VALUE_STRING_COLOR: 'rgb(196, 26, 22)', - OBJECT_VALUE_SYMBOL_COLOR: 'rgb(196, 26, 22)', - OBJECT_VALUE_NUMBER_COLOR: 'rgb(28, 0, 207)', - OBJECT_VALUE_BOOLEAN_COLOR: 'rgb(28, 0, 207)', - OBJECT_VALUE_FUNCTION_PREFIX_COLOR: 'rgb(13, 34, 170)', - - HTML_TAG_COLOR: 'rgb(168, 148, 166)', - HTML_TAGNAME_COLOR: 'rgb(136, 18, 128)', - HTML_TAGNAME_TEXT_TRANSFORM: 'lowercase', - HTML_ATTRIBUTE_NAME_COLOR: 'rgb(153, 69, 0)', - HTML_ATTRIBUTE_VALUE_COLOR: 'rgb(26, 26, 166)', - HTML_COMMENT_COLOR: 'rgb(35, 110, 37)', - HTML_DOCTYPE_COLOR: 'rgb(192, 192, 192)', - - ARROW_COLOR: '#6e6e6e', - ARROW_MARGIN_RIGHT: 3, - ARROW_FONT_SIZE: 12, - ARROW_ANIMATION_DURATION: '0', - - TREENODE_FONT_FAMILY: 'Menlo, monospace', - TREENODE_FONT_SIZE: '11px', - TREENODE_LINE_HEIGHT: 1.2, - TREENODE_PADDING_LEFT: 12, - - TABLE_BORDER_COLOR: '#aaa', - TABLE_TH_BACKGROUND_COLOR: '#eee', - TABLE_TH_HOVER_COLOR: 'hsla(0, 0%, 90%, 1)', - TABLE_SORT_ICON_COLOR: '#6e6e6e', - TABLE_DATA_BACKGROUND_IMAGE: - 'linear-gradient(to bottom, white, white 50%, rgb(234, 243, 255) 50%, rgb(234, 243, 255))', - TABLE_DATA_BACKGROUND_SIZE: '128px 32px', -}; diff --git a/packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx b/packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx deleted file mode 100644 index 13fcf05cdd..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/themes/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -export { theme as chromeDark } from "./chromeDark.js"; -export { theme as chromeLight } from "./chromeLight.js"; diff --git a/packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx b/packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx deleted file mode 100644 index eb0ec0e5b7..0000000000 --- a/packages/html-program-viewer/src/react/inspector/styles/unselectable.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export const unselectable = { - WebkitTouchCallout: 'none', - WebkitUserSelect: 'none', - KhtmlUserSelect: 'none', - MozUserSelect: 'none', - msUserSelect: 'none', - OUserSelect: 'none', - userSelect: 'none', -}; From d4d375460cad30dbe03126769382226d68fb8f1f Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 14:38:25 -0700 Subject: [PATCH 45/70] tweaks --- .../src/react/inspect-type/inspect-type.tsx | 5 +- .../src/react/inspector/index.tsx | 2 +- .../inspector/js-value/js-value.module.css | 15 +++++ .../src/react/inspector/js-value/js-value.tsx | 58 ++++++++++++++++++ .../src/react/inspector/object-label.tsx | 4 +- .../src/react/inspector/object-preview.tsx | 8 +-- .../src/react/inspector/object-value.tsx | 60 ------------------- .../src/react/tree/tree.tsx | 2 +- 8 files changed, 82 insertions(+), 72 deletions(-) create mode 100644 packages/html-program-viewer/src/react/inspector/js-value/js-value.module.css create mode 100644 packages/html-program-viewer/src/react/inspector/js-value/js-value.tsx delete mode 100644 packages/html-program-viewer/src/react/inspector/object-value.tsx diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index 128fa6e701..c5dfeb60c7 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -3,6 +3,7 @@ import { getTypeName } from "@typespec/compiler"; import { useCallback, type FunctionComponent, type ReactElement, type ReactNode } from "react"; import { isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; +import { JsValue } from "../inspector/js-value/js-value.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; import { useTreeNavigator } from "../use-tree-navigation.js"; import style from "./inspect-type.module.css"; @@ -151,10 +152,6 @@ const SimpleType = ({ type, children }: { type: Type; children: ReactNode }) => ); }; -const JsValue = ({ value }: { value: any }) => { - return {value.toString()}; -}; - const EntityProperties = ({ entity: type }: { entity: Entity }) => { const props = Object.entries(type) .map(([key, value]) => { diff --git a/packages/html-program-viewer/src/react/inspector/index.tsx b/packages/html-program-viewer/src/react/inspector/index.tsx index 5b45c3d5d0..a8d178eb82 100644 --- a/packages/html-program-viewer/src/react/inspector/index.tsx +++ b/packages/html-program-viewer/src/react/inspector/index.tsx @@ -1,6 +1,6 @@ // Fork from https://www.npmjs.com/package/react-inspector and modified to integrate with TypeSpec types +export { JsValue as JSValue } from "./js-value/js-value.js"; export { ObjectInspector } from "./object-inspector.js"; export { ObjectLabel } from "./object-label.js"; export { ObjectPreview } from "./object-preview.js"; export { ObjectRootLabel } from "./object-root-label.js"; -export { ObjectValue } from "./object-value.js"; diff --git a/packages/html-program-viewer/src/react/inspector/js-value/js-value.module.css b/packages/html-program-viewer/src/react/inspector/js-value/js-value.module.css new file mode 100644 index 0000000000..8f45ffe836 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/js-value/js-value.module.css @@ -0,0 +1,15 @@ +.string { + color: var(--colorPaletteLightGreenForeground2); +} + +.boolean { + color: var(--colorPaletteDarkOrangeForeground1); +} + +.number { + color: var(--colorPaletteDarkOrangeForeground1); +} + +.intrinsic { + color: var(--colorPaletteDarkOrangeForeground1); +} diff --git a/packages/html-program-viewer/src/react/inspector/js-value/js-value.tsx b/packages/html-program-viewer/src/react/inspector/js-value/js-value.tsx new file mode 100644 index 0000000000..172ff7d4e6 --- /dev/null +++ b/packages/html-program-viewer/src/react/inspector/js-value/js-value.tsx @@ -0,0 +1,58 @@ +import type { FC } from "react"; +import { Mono } from "../../common.js"; +import style from "./js-value.module.css"; + +export interface JsValueProps { + readonly value: any; +} +/** + * A short description of the object values. + * Can be used to render tree node in ObjectInspector + * or render objects in TableInspector. + */ +export const JsValue: FC = ({ value }) => { + switch (typeof value) { + case "bigint": + return {String(value)}n; + case "number": + return {String(value)}; + case "string": + return "{value}"; + case "boolean": + return {String(value)}; + case "undefined": + return undefined; + case "object": + if (value === null) { + return null; + } + if (value instanceof Date) { + return {value.toString()}; + } + if (value instanceof RegExp) { + return {value.toString()}; + } + if (Array.isArray(value)) { + return {`Array(${value.length})`}; + } + if (!value.constructor) { + return Object; + } + if (typeof value.constructor.isBuffer === "function" && value.constructor.isBuffer(value)) { + return {`Buffer[${value.length}]`}; + } + + return {value.constructor.name}; + case "function": + return ( + + Æ’  + {value.name}() + + ); + case "symbol": + return {value.toString()}; + default: + return ; + } +}; diff --git a/packages/html-program-viewer/src/react/inspector/object-label.tsx b/packages/html-program-viewer/src/react/inspector/object-label.tsx index 9da31e0259..a65d235ff1 100644 --- a/packages/html-program-viewer/src/react/inspector/object-label.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-label.tsx @@ -1,7 +1,7 @@ import type { FC } from "react"; +import { JsValue } from "./js-value/js-value.js"; import { ObjectName } from "./object-name.js"; import { ObjectPreview } from "./object-preview.js"; -import { ObjectValue } from "./object-value.js"; export interface ObjectLabelProps { readonly name: any; @@ -22,7 +22,7 @@ export const ObjectLabel: FC = ({ name, data, isNonenumerable )} : - + ); }; diff --git a/packages/html-program-viewer/src/react/inspector/object-preview.tsx b/packages/html-program-viewer/src/react/inspector/object-preview.tsx index cf0fe10423..2620c8fc81 100644 --- a/packages/html-program-viewer/src/react/inspector/object-preview.tsx +++ b/packages/html-program-viewer/src/react/inspector/object-preview.tsx @@ -1,7 +1,7 @@ import React, { type FC, type ReactNode } from "react"; +import { JsValue } from "./js-value/js-value.js"; import { ObjectName } from "./object-name.js"; -import { ObjectValue } from "./object-value.js"; import style from "./object-inspector.module.css"; import { hasOwnProperty } from "./utils/object-prototype.js"; @@ -31,14 +31,14 @@ export const ObjectPreview: FC = ({ data }) => { object instanceof Date || object instanceof RegExp ) { - return ; + return ; } if (Array.isArray(object)) { const maxProperties = ARRAY_MAX_PROPERTIES; const previewArray = object .slice(0, maxProperties) - .map((element, index) => ); + .map((element, index) => ); if (object.length > maxProperties) { previewArray.push(…); } @@ -69,7 +69,7 @@ export const ObjectPreview: FC = ({ data }) => { :  - + {ellipsis} ); diff --git a/packages/html-program-viewer/src/react/inspector/object-value.tsx b/packages/html-program-viewer/src/react/inspector/object-value.tsx deleted file mode 100644 index b0f16fb405..0000000000 --- a/packages/html-program-viewer/src/react/inspector/object-value.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import type { FC } from "react"; -import { Literal } from "../common.js"; - -export interface ObjectValueProps { - readonly object: any; -} -/** - * A short description of the object values. - * Can be used to render tree node in ObjectInspector - * or render objects in TableInspector. - */ -export const ObjectValue: FC = ({ object }) => { - switch (typeof object) { - case "bigint": - return {String(object)}n; - case "number": - return {String(object)}; - case "string": - return "{object}"; - case "boolean": - return {String(object)}; - case "undefined": - return undefined; - case "object": - if (object === null) { - return null; - } - if (object instanceof Date) { - return {object.toString()}; - } - if (object instanceof RegExp) { - return {object.toString()}; - } - if (Array.isArray(object)) { - return {`Array(${object.length})`}; - } - if (!object.constructor) { - return Object; - } - if ( - typeof object.constructor.isBuffer === "function" && - object.constructor.isBuffer(object) - ) { - return {`Buffer[${object.length}]`}; - } - - return {object.constructor.name}; - case "function": - return ( - - Æ’  - {object.name}() - - ); - case "symbol": - return {object.toString()}; - default: - return ; - } -}; diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index 6f2a0f9564..df6b3b3ea7 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -40,7 +40,7 @@ export function Tree({ const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ onSetExpanded, }); - const [focusedIndex, setFocusedIndex] = useState(0); + const [focusedIndex, setFocusedIndex] = useState(-1); const [selectedKey, setSelectedKey] = useControllableValue(selected, undefined, onSelect); const rows = useMemo( From 76d3f788de24e6c254b53b4576ff8019b34376b9 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 14:44:22 -0700 Subject: [PATCH 46/70] Rename --- .../src/react/inspect-type/inspect-type.tsx | 2 +- .../src/react/inspect-type/type-data-table.tsx | 2 +- .../src/react/{inspector => js-inspector}/index.tsx | 0 .../{inspector => js-inspector}/js-value/js-value.module.css | 0 .../react/{inspector => js-inspector}/js-value/js-value.tsx | 0 .../{inspector => js-inspector}/object-inspector.module.css | 0 .../react/{inspector => js-inspector}/object-inspector.tsx | 0 .../src/react/{inspector => js-inspector}/object-label.tsx | 0 .../src/react/{inspector => js-inspector}/object-name.tsx | 0 .../src/react/{inspector => js-inspector}/object-preview.tsx | 0 .../react/{inspector => js-inspector}/object-root-label.tsx | 0 .../{inspector => js-inspector}/utils/object-prototype.tsx | 0 .../{inspector => js-inspector}/utils/property-utils.tsx | 0 packages/html-program-viewer/src/react/tree/tree.tsx | 4 ++-- 14 files changed, 4 insertions(+), 4 deletions(-) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/index.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/js-value/js-value.module.css (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/js-value/js-value.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/object-inspector.module.css (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/object-inspector.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/object-label.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/object-name.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/object-preview.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/object-root-label.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/utils/object-prototype.tsx (100%) rename packages/html-program-viewer/src/react/{inspector => js-inspector}/utils/property-utils.tsx (100%) diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index c5dfeb60c7..21da5b8490 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -3,7 +3,7 @@ import { getTypeName } from "@typespec/compiler"; import { useCallback, type FunctionComponent, type ReactElement, type ReactNode } from "react"; import { isNamedUnion } from "../../utils.js"; import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; -import { JsValue } from "../inspector/js-value/js-value.js"; +import { JsValue } from "../js-inspector/js-value/js-value.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; import { useTreeNavigator } from "../use-tree-navigation.js"; import style from "./inspect-type.module.css"; diff --git a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx index c17cdeae63..a0cd6ad111 100644 --- a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx @@ -1,6 +1,6 @@ import type { Type } from "@typespec/compiler"; import type { FC } from "react"; -import { ObjectInspector } from "../inspector/index.js"; +import { ObjectInspector } from "../js-inspector/index.js"; import { useProgram } from "../program-context.js"; import style from "./type-data-table.module.css"; diff --git a/packages/html-program-viewer/src/react/inspector/index.tsx b/packages/html-program-viewer/src/react/js-inspector/index.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/index.tsx rename to packages/html-program-viewer/src/react/js-inspector/index.tsx diff --git a/packages/html-program-viewer/src/react/inspector/js-value/js-value.module.css b/packages/html-program-viewer/src/react/js-inspector/js-value/js-value.module.css similarity index 100% rename from packages/html-program-viewer/src/react/inspector/js-value/js-value.module.css rename to packages/html-program-viewer/src/react/js-inspector/js-value/js-value.module.css diff --git a/packages/html-program-viewer/src/react/inspector/js-value/js-value.tsx b/packages/html-program-viewer/src/react/js-inspector/js-value/js-value.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/js-value/js-value.tsx rename to packages/html-program-viewer/src/react/js-inspector/js-value/js-value.tsx diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector.module.css b/packages/html-program-viewer/src/react/js-inspector/object-inspector.module.css similarity index 100% rename from packages/html-program-viewer/src/react/inspector/object-inspector.module.css rename to packages/html-program-viewer/src/react/js-inspector/object-inspector.module.css diff --git a/packages/html-program-viewer/src/react/inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/object-inspector.tsx rename to packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx diff --git a/packages/html-program-viewer/src/react/inspector/object-label.tsx b/packages/html-program-viewer/src/react/js-inspector/object-label.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/object-label.tsx rename to packages/html-program-viewer/src/react/js-inspector/object-label.tsx diff --git a/packages/html-program-viewer/src/react/inspector/object-name.tsx b/packages/html-program-viewer/src/react/js-inspector/object-name.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/object-name.tsx rename to packages/html-program-viewer/src/react/js-inspector/object-name.tsx diff --git a/packages/html-program-viewer/src/react/inspector/object-preview.tsx b/packages/html-program-viewer/src/react/js-inspector/object-preview.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/object-preview.tsx rename to packages/html-program-viewer/src/react/js-inspector/object-preview.tsx diff --git a/packages/html-program-viewer/src/react/inspector/object-root-label.tsx b/packages/html-program-viewer/src/react/js-inspector/object-root-label.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/object-root-label.tsx rename to packages/html-program-viewer/src/react/js-inspector/object-root-label.tsx diff --git a/packages/html-program-viewer/src/react/inspector/utils/object-prototype.tsx b/packages/html-program-viewer/src/react/js-inspector/utils/object-prototype.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/utils/object-prototype.tsx rename to packages/html-program-viewer/src/react/js-inspector/utils/object-prototype.tsx diff --git a/packages/html-program-viewer/src/react/inspector/utils/property-utils.tsx b/packages/html-program-viewer/src/react/js-inspector/utils/property-utils.tsx similarity index 100% rename from packages/html-program-viewer/src/react/inspector/utils/property-utils.tsx rename to packages/html-program-viewer/src/react/js-inspector/utils/property-utils.tsx diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/html-program-viewer/src/react/tree/tree.tsx index df6b3b3ea7..5d1c3c8055 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/html-program-viewer/src/react/tree/tree.tsx @@ -34,7 +34,7 @@ export function Tree({ onSelect, onSetExpanded, nodeIcon, - selectionMode, + selectionMode = "none", }: TreeViewProps) { const id = useId(); const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ @@ -60,7 +60,7 @@ export function Tree({ const activateRow = useCallback( (row: TreeRow) => { setFocusedIndex(row.index); - if (selectedKey === row.id) { + if (selectionMode === "none" || selectedKey === row.id) { toggleExpand(row.id); } else { expand(row.id); From 3d27b74e8af379d1c114370d4bf8d4830588d853 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 15:13:39 -0700 Subject: [PATCH 47/70] tweaks --- .../src/react/js-inspector/index.tsx | 2 +- .../react/js-inspector/object-inspector.tsx | 55 ++++++++----------- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/packages/html-program-viewer/src/react/js-inspector/index.tsx b/packages/html-program-viewer/src/react/js-inspector/index.tsx index a8d178eb82..991f3ee973 100644 --- a/packages/html-program-viewer/src/react/js-inspector/index.tsx +++ b/packages/html-program-viewer/src/react/js-inspector/index.tsx @@ -1,6 +1,6 @@ // Fork from https://www.npmjs.com/package/react-inspector and modified to integrate with TypeSpec types export { JsValue as JSValue } from "./js-value/js-value.js"; -export { ObjectInspector } from "./object-inspector.js"; +export { DefaultNodeRenderer, ObjectInspector } from "./object-inspector.js"; export { ObjectLabel } from "./object-label.js"; export { ObjectPreview } from "./object-preview.js"; export { ObjectRootLabel } from "./object-root-label.js"; diff --git a/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx index e8d46dc507..068e077ea4 100644 --- a/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx +++ b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx @@ -1,5 +1,5 @@ import type { FC } from "react"; -import { memo, useState } from "react"; +import { useState } from "react"; import { Tree } from "../tree/tree.js"; import type { TreeNode } from "../tree/types.js"; import { ObjectLabel } from "./object-label.js"; @@ -7,7 +7,7 @@ import { ObjectRootLabel } from "./object-root-label.js"; import { propertyIsEnumerable } from "./utils/object-prototype.js"; import { getPropertyValue } from "./utils/property-utils.js"; -const createIterator = (showNonenumerable: any, sortObjectKeys: any) => { +const createIterator = (showNonenumerable?: boolean, sortObjectKeys?: boolean) => { const objectIterator = function* (data: any) { const shouldIterate = (typeof data === "object" && data !== null) || typeof data === "function"; if (!shouldIterate) return; @@ -84,8 +84,8 @@ const createIterator = (showNonenumerable: any, sortObjectKeys: any) => { return objectIterator; }; -const defaultNodeRenderer = ({ path, name, data, isNonenumerable }: NodeRendererProps) => - path === "$" ? ( +export const DefaultNodeRenderer = ({ path, name, data, isNonenumerable }: NodeRendererProps) => + path === DEFAULT_ROOT_PATH ? ( ) : ( @@ -94,7 +94,7 @@ const defaultNodeRenderer = ({ path, name, data, isNonenumerable }: NodeRenderer export interface ObjectInspectorProps { readonly data: any; readonly showNonenumerable?: boolean; - readonly sortObjectKeys?: boolean | ((a: string, b: string) => number); + readonly sortObjectKeys?: boolean; readonly nodeRenderer?: (props: NodeRendererProps) => any; } @@ -104,48 +104,39 @@ export const ObjectInspector: FC = ({ sortObjectKeys, nodeRenderer, }) => { - const dataIterator = createIterator(showNonenumerable, sortObjectKeys); - const renderer = nodeRenderer ?? defaultNodeRenderer; - - return ; -}; - -export const DEFAULT_ROOT_PATH = "$"; - -export function hasChildNodes(data: any, dataIterator: any) { - return !dataIterator(data).next().done; -} - -export interface NodeRendererProps { - readonly name: string | undefined; - readonly path: string; - readonly data: any; - readonly isNonenumerable?: boolean; -} - -interface TreeViewProps { - data: any; - dataIterator: (...args: any[]) => any; - nodeRenderer: (props: NodeRendererProps) => any; -} -const TreeView = memo(({ data, nodeRenderer, dataIterator }: TreeViewProps) => { const [expandedPaths, setExpandedPaths] = useState(new Set()); + const dataIterator = createIterator(showNonenumerable, sortObjectKeys); + const renderer = nodeRenderer ?? DefaultNodeRenderer; const tree = computeNode({ path: DEFAULT_ROOT_PATH, name: "root", data, dataIterator, - nodeRenderer, + nodeRenderer: renderer, expandedPaths, }); + return ( setExpandedPaths(new Set(x))} /> ); -}); +}; + +export const DEFAULT_ROOT_PATH = "$"; + +function hasChildNodes(data: any, dataIterator: any) { + return !dataIterator(data).next().done; +} + +export interface NodeRendererProps { + readonly name: string | undefined; + readonly path: string; + readonly data: any; + readonly isNonenumerable?: boolean; +} interface ComputeNodeOptions { expandedPaths: Set; From 0144590e697c70347313fd2951b6e89e4e472250 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 24 Jun 2024 18:30:28 -0700 Subject: [PATCH 48/70] tweaks --- .../src/react/common.module.css | 11 ++++- .../html-program-viewer/src/react/common.tsx | 8 +++- .../src/react/inspect-type/inspect-type.tsx | 2 +- .../inspect-type/type-data-table.module.css | 16 +++++++ .../react/inspect-type/type-data-table.tsx | 45 +++++++++++++++++-- .../react/js-inspector/object-inspector.tsx | 5 ++- .../src/react/js-inspector/object-label.tsx | 11 ++--- 7 files changed, 83 insertions(+), 15 deletions(-) diff --git a/packages/html-program-viewer/src/react/common.module.css b/packages/html-program-viewer/src/react/common.module.css index 5ead6280f5..9389c30d56 100644 --- a/packages/html-program-viewer/src/react/common.module.css +++ b/packages/html-program-viewer/src/react/common.module.css @@ -12,6 +12,15 @@ .type-kind-tag { color: white; background-color: var(--colorPaletteBerryForeground2); - padding: 1px 5px; border-radius: 2px; } +.type-kind-tag-small { + height: 16px; + line-height: 16px; + font-size: 10px; + padding: 0 3px; +} + +.type-kind-tag-auto { + padding: 1px 5px; +} diff --git a/packages/html-program-viewer/src/react/common.tsx b/packages/html-program-viewer/src/react/common.tsx index 9681eb5751..f57dddcc13 100644 --- a/packages/html-program-viewer/src/react/common.tsx +++ b/packages/html-program-viewer/src/react/common.tsx @@ -15,8 +15,12 @@ export const TypeKind = ({ type }: { type: Type }) => { return {type.kind}; }; -export const TypeKindTag = ({ type }: { type: Type }) => { - return {type.kind}; +export const TypeKindTag = ({ type, size = "auto" }: { type: Type; size?: "small" | "auto" }) => { + return ( + + {type.kind} + + ); }; export const KeyValueSection: FunctionComponent<{ children: ReactElement | ReactElement[] }> = ({ children, diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index 21da5b8490..7221076172 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -91,7 +91,7 @@ const ParentReference = ({ type }: { type: Type }) => { } }; -const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { +export const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { switch (type.kind) { case "Namespace": case "Operation": diff --git a/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css b/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css index 4d0dcc1806..b66a4a5b74 100644 --- a/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css +++ b/packages/html-program-viewer/src/react/inspect-type/type-data-table.module.css @@ -17,3 +17,19 @@ .data { } + +.tsp-type-ref { + display: inline-flex; + align-items: center; + gap: 3px; +} + +.tsp-type-logo { + display: inline-block; + font-size: 7px; + width: 12px; + height: 12px; + line-height: 12px; + background-color: var(--colorPaletteBerryForeground2); + color: white; +} diff --git a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx index a0cd6ad111..f2abf9d585 100644 --- a/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/type-data-table.tsx @@ -1,7 +1,14 @@ -import type { Type } from "@typespec/compiler"; +import { type Type } from "@typespec/compiler"; import type { FC } from "react"; -import { ObjectInspector } from "../js-inspector/index.js"; +import { TypeKindTag } from "../common.js"; +import { ObjectLabel } from "../js-inspector/index.js"; +import { + DefaultNodeRenderer, + ObjectInspector, + type NodeRendererProps, +} from "../js-inspector/object-inspector.js"; import { useProgram } from "../program-context.js"; +import { TypeReference } from "./inspect-type.js"; import style from "./type-data-table.module.css"; export const TypeDataTable: FC<{ type: Type }> = ({ type }) => { @@ -25,7 +32,7 @@ export const TypeDataTable: FC<{ type: Type }> = ({ type }) => { {k.toString()} - + ))} @@ -33,3 +40,35 @@ export const TypeDataTable: FC<{ type: Type }> = ({ type }) => { ); }; + +export interface ObjectInspectorProps { + readonly data: any; +} +const ObjectInspectorWithTspTypes = (props: ObjectInspectorProps) => { + return ; +}; + +const NodeWithTspType = (props: NodeRendererProps) => { + const { data } = props; + if (isTypeSpecType(data)) { + return ( + + + + + + + ); + } + return ; +}; + +function isTypeSpecType(data: unknown): data is Type { + return ( + typeof data === "object" && + data !== null && + "entityKind" in data && + data.entityKind === "Type" && + "kind" in data + ); +} diff --git a/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx index 068e077ea4..196590538e 100644 --- a/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx +++ b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx @@ -2,6 +2,7 @@ import type { FC } from "react"; import { useState } from "react"; import { Tree } from "../tree/tree.js"; import type { TreeNode } from "../tree/types.js"; +import { JsValue } from "./js-value/js-value.js"; import { ObjectLabel } from "./object-label.js"; import { ObjectRootLabel } from "./object-root-label.js"; import { propertyIsEnumerable } from "./utils/object-prototype.js"; @@ -88,7 +89,9 @@ export const DefaultNodeRenderer = ({ path, name, data, isNonenumerable }: NodeR path === DEFAULT_ROOT_PATH ? ( ) : ( - + + + ); export interface ObjectInspectorProps { diff --git a/packages/html-program-viewer/src/react/js-inspector/object-label.tsx b/packages/html-program-viewer/src/react/js-inspector/object-label.tsx index a65d235ff1..7efc641b98 100644 --- a/packages/html-program-viewer/src/react/js-inspector/object-label.tsx +++ b/packages/html-program-viewer/src/react/js-inspector/object-label.tsx @@ -1,19 +1,16 @@ -import type { FC } from "react"; -import { JsValue } from "./js-value/js-value.js"; +import type { FC, ReactNode } from "react"; import { ObjectName } from "./object-name.js"; import { ObjectPreview } from "./object-preview.js"; export interface ObjectLabelProps { readonly name: any; - readonly data: any; readonly isNonenumerable?: boolean; + readonly children: ReactNode; } /** * if isNonenumerable is specified, render the name dimmed */ -export const ObjectLabel: FC = ({ name, data, isNonenumerable = false }) => { - const object = data; - +export const ObjectLabel: FC = ({ name, children, isNonenumerable = false }) => { return ( {typeof name === "string" ? ( @@ -22,7 +19,7 @@ export const ObjectLabel: FC = ({ name, data, isNonenumerable )} : - + {children} ); }; From c7b03f5e0fee36fb3a684d1d4abe2cdce9fbc2f3 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 25 Jun 2024 09:08:12 -0700 Subject: [PATCH 49/70] hotkeys --- packages/html-program-viewer/package.json | 3 ++- .../src/react/current-path/current-path.tsx | 6 +++++- .../react/inspect-type/type-data-table.module.css | 2 ++ pnpm-lock.yaml | 13 +++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index b733602724..03cb4fb80f 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -54,7 +54,8 @@ "@fluentui/react-icons": "^2.0.240", "@fluentui/react-list-preview": "^0.2.8", "react": "~18.3.1", - "react-dom": "~18.3.1" + "react-dom": "~18.3.1", + "react-hotkeys-hook": "^4.5.0" }, "devDependencies": { "@babel/core": "^7.24.5", diff --git a/packages/html-program-viewer/src/react/current-path/current-path.tsx b/packages/html-program-viewer/src/react/current-path/current-path.tsx index 3bc3f018d3..d8af80d89d 100644 --- a/packages/html-program-viewer/src/react/current-path/current-path.tsx +++ b/packages/html-program-viewer/src/react/current-path/current-path.tsx @@ -12,6 +12,7 @@ import { import { DatabaseRegular } from "@fluentui/react-icons"; import { getDoc } from "@typespec/compiler"; import { useCallback, useState } from "react"; +import { useHotkeys } from "react-hotkeys-hook"; import { Fragment } from "react/jsx-runtime"; import { useProgram } from "../program-context.js"; import { NodeIcon } from "../tree-navigation.js"; @@ -22,9 +23,12 @@ const rootIcon = ; export const CurrentPath = () => { const nav = useTreeNavigator(); const segments = nav.selectedPath.split("."); - const [showInput, setShowInput] = useState(false); + useHotkeys("ctrl+shift+f, meta+shift+f", () => { + setShowInput(true); + }); + return (
    =16.8.1' + react-dom: '>=16.8.1' + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} From c8bf0659f9a31ca24e0ab078056e9b539cebca81 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 25 Jun 2024 09:14:19 -0700 Subject: [PATCH 50/70] tweaks --- packages/html-program-viewer/package.json | 2 + .../html-program-viewer/src/react/common.tsx | 7 +-- .../src/react/inspect-type/inspect-type.tsx | 12 +++--- pnpm-lock.yaml | 43 +++++++++++++++++++ 4 files changed, 52 insertions(+), 12 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 03cb4fb80f..3292c66cca 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -59,6 +59,8 @@ }, "devDependencies": { "@babel/core": "^7.24.5", + "@testing-library/dom": "^10.2.0", + "@testing-library/react": "^16.0.0", "@types/node": "~18.11.19", "@types/react": "~18.3.2", "@types/react-dom": "~18.3.0", diff --git a/packages/html-program-viewer/src/react/common.tsx b/packages/html-program-viewer/src/react/common.tsx index f57dddcc13..664190d2c7 100644 --- a/packages/html-program-viewer/src/react/common.tsx +++ b/packages/html-program-viewer/src/react/common.tsx @@ -1,6 +1,6 @@ import { mergeClasses } from "@fluentui/react-components"; import type { Type } from "@typespec/compiler"; -import type { FunctionComponent, ReactElement } from "react"; +import type { FunctionComponent } from "react"; import style from "./common.module.css"; export const Mono = ({ children, className }: { children: any; className?: string }) => ( @@ -22,8 +22,3 @@ export const TypeKindTag = ({ type, size = "auto" }: { type: Type; size?: "small ); }; -export const KeyValueSection: FunctionComponent<{ children: ReactElement | ReactElement[] }> = ({ - children, -}) => { - return
      {children}
    ; -}; diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index 7221076172..7c910ea0e9 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -2,7 +2,7 @@ import type { Entity, Type } from "@typespec/compiler"; import { getTypeName } from "@typespec/compiler"; import { useCallback, type FunctionComponent, type ReactElement, type ReactNode } from "react"; import { isNamedUnion } from "../../utils.js"; -import { KeyValueSection, Literal, Mono, TypeKind } from "../common.js"; +import { Literal, Mono, TypeKind } from "../common.js"; import { JsValue } from "../js-inspector/js-value/js-value.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; import { useTreeNavigator } from "../use-tree-navigation.js"; @@ -103,9 +103,9 @@ export const TypeReference: FunctionComponent<{ type: Type }> = ({ type }) => { case "Model": if (type.name === "") { return ( - +
      - +
    ); } else { return ; @@ -163,7 +163,7 @@ const EntityProperties = ({ entity: type }: { entity: Entity }) => { }) .filter((x): x is any => Boolean(x)); - return {props}; + return
      {props}
    ; }; interface EntityPropertyProps { @@ -222,10 +222,10 @@ const ItemList = (props: ItemListProps) => { } } return ( - +
      {[...props.items.entries()].map(([k, v], i) => (
    • {props.render(v)}
    • ))} - +
    ); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5a567c08e..f2f60cb600 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -399,6 +399,12 @@ importers: '@babel/core': specifier: ^7.24.5 version: 7.24.5 + '@testing-library/dom': + specifier: ^10.2.0 + version: 10.2.0 + '@testing-library/react': + specifier: ^16.0.0 + version: 16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) '@types/node': specifier: ~18.11.19 version: 18.11.19 @@ -8802,6 +8808,20 @@ packages: defer-to-connect: 2.0.1 dev: false + /@testing-library/dom@10.2.0: + resolution: {integrity: sha512-CytIvb6tVOADRngTHGWNxH8LPgO/3hi/BdCEHOf7Qd2GvZVClhVP0Wo/QHzWhpki49Bk0b4VT6xpt3fx8HTSIw==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.1 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/dom@9.3.4: resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} engines: {node: '>=14'} @@ -8848,6 +8868,29 @@ packages: vitest: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) dev: true + /@testing-library/react@16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} + engines: {node: '>=18'} + peerDependencies: + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 + '@types/react-dom': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.24.1 + '@testing-library/dom': 10.2.0 + '@types/react': 18.3.2 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + dev: true + /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} From 7387279e658807674926d997177d0665ef08c118 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 25 Jun 2024 14:21:43 -0700 Subject: [PATCH 51/70] basic tests --- packages/html-program-viewer/package.json | 1 + .../js-inspector/js-value/js-value.test.tsx | 28 +++++++++++++ .../html-program-viewer/test/global.setup.ts | 3 ++ packages/html-program-viewer/test/setup.ts | 8 ++++ .../test/smoke-test.test.ts | 15 ++++--- packages/html-program-viewer/tsconfig.json | 2 +- packages/html-program-viewer/vitest.config.ts | 11 +++++- pnpm-lock.yaml | 39 +++++++++++++++++++ 8 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 packages/html-program-viewer/src/react/js-inspector/js-value/js-value.test.tsx create mode 100644 packages/html-program-viewer/test/global.setup.ts create mode 100644 packages/html-program-viewer/test/setup.ts diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 3292c66cca..d7ef5304fc 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -60,6 +60,7 @@ "devDependencies": { "@babel/core": "^7.24.5", "@testing-library/dom": "^10.2.0", + "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", "@types/node": "~18.11.19", "@types/react": "~18.3.2", diff --git a/packages/html-program-viewer/src/react/js-inspector/js-value/js-value.test.tsx b/packages/html-program-viewer/src/react/js-inspector/js-value/js-value.test.tsx new file mode 100644 index 0000000000..578ecbb710 --- /dev/null +++ b/packages/html-program-viewer/src/react/js-inspector/js-value/js-value.test.tsx @@ -0,0 +1,28 @@ +import { render } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; +import { JsValue } from "./js-value.js"; + +describe("render values", () => { + it.each([ + [undefined, "undefined"], + [null, "null"], + [123, "123"], + [123.456, "123.456"], + [123n, "123n"], + ["abc", `"abc"`], + [true, "true"], + + [/[a-z]+/, "/[a-z]+/"], + [ + new Date("2022-04-01T01:02:32Z"), + "Fri Apr 01 2022 01:02:32 GMT+0000 (Coordinated Universal Time)", + ], + [{}, "Object"], + [{ name: "abc" }, "Object"], + [[1, 2], "Array(2)"], + [Symbol("abc"), "Symbol(abc)"], + ])("render %s as '%s'", (value, expected) => { + const { container } = render(); + expect(container).toHaveTextContent(expected); + }); +}); diff --git a/packages/html-program-viewer/test/global.setup.ts b/packages/html-program-viewer/test/global.setup.ts new file mode 100644 index 0000000000..89d5cfe50b --- /dev/null +++ b/packages/html-program-viewer/test/global.setup.ts @@ -0,0 +1,3 @@ +export const setup = () => { + process.env.TZ = "UTC"; +}; diff --git a/packages/html-program-viewer/test/setup.ts b/packages/html-program-viewer/test/setup.ts new file mode 100644 index 0000000000..097fba43ed --- /dev/null +++ b/packages/html-program-viewer/test/setup.ts @@ -0,0 +1,8 @@ +import "@testing-library/jest-dom/vitest"; +import { cleanup } from "@testing-library/react"; +import { afterEach } from "vitest"; + +// runs a clean after each test case (e.g. clearing jsdom) +afterEach(() => { + cleanup(); +}); diff --git a/packages/html-program-viewer/test/smoke-test.test.ts b/packages/html-program-viewer/test/smoke-test.test.ts index 4252c7f40e..1d1705e4fd 100644 --- a/packages/html-program-viewer/test/smoke-test.test.ts +++ b/packages/html-program-viewer/test/smoke-test.test.ts @@ -1,4 +1,5 @@ import type { BasicTestRunner } from "@typespec/compiler/testing"; +import { ok } from "assert"; import { beforeEach, it } from "vitest"; import { createViewerTestRunner } from "./test-host.js"; @@ -8,10 +9,14 @@ beforeEach(async () => { runner = await createViewerTestRunner(); }); -it("create html view", async () => { - await runner.compile(`op foo(): string;`); -}); +// it("create html view", async () => { +// await runner.compile(`op foo(): string;`); +// }); + +// it("compile unnamed union variant without error", async () => { +// await runner.compile(`union Foo { "a", "b" }`); +// }); -it("compile unnamed union variant without error", async () => { - await runner.compile(`union Foo { "a", "b" }`); +it("works", () => { + ok(true); }); diff --git a/packages/html-program-viewer/tsconfig.json b/packages/html-program-viewer/tsconfig.json index 6377828a7e..5be16e9413 100644 --- a/packages/html-program-viewer/tsconfig.json +++ b/packages/html-program-viewer/tsconfig.json @@ -18,7 +18,7 @@ "verbatimModuleSyntax": true, "jsx": "react-jsx", "lib": ["DOM", "ES2022"], - "types": ["vite/client"] + "types": ["vite/client", "@testing-library/jest-dom"] }, "include": ["src", "test/**/*.ts"] } diff --git a/packages/html-program-viewer/vitest.config.ts b/packages/html-program-viewer/vitest.config.ts index 15eeaceb85..09c12f3447 100644 --- a/packages/html-program-viewer/vitest.config.ts +++ b/packages/html-program-viewer/vitest.config.ts @@ -1,4 +1,13 @@ import { defineConfig, mergeConfig } from "vitest/config"; import { defaultTypeSpecVitestConfig } from "../../vitest.workspace.js"; -export default mergeConfig(defaultTypeSpecVitestConfig, defineConfig({})); +export default mergeConfig( + defaultTypeSpecVitestConfig, + defineConfig({ + test: { + globalSetup: "./test/global.setup.ts", + environment: "happy-dom", + setupFiles: "./test/setup.ts", // assuming the test folder is in the root of our project + }, + }) +); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f2f60cb600..e47e230d87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -402,6 +402,9 @@ importers: '@testing-library/dom': specifier: ^10.2.0 version: 10.2.0 + '@testing-library/jest-dom': + specifier: ^6.4.6 + version: 6.4.6(vitest@1.6.0) '@testing-library/react': specifier: ^16.0.0 version: 16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) @@ -1538,6 +1541,10 @@ packages: resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} dev: true + /@adobe/css-tools@4.4.0: + resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + dev: true + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.23.2)(algoliasearch@4.23.2)(search-insights@2.13.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: @@ -8868,6 +8875,38 @@ packages: vitest: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) dev: true + /@testing-library/jest-dom@6.4.6(vitest@1.6.0): + resolution: {integrity: sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + peerDependencies: + '@jest/globals': '>= 28' + '@types/bun': latest + '@types/jest': '>= 28' + jest: '>= 28' + vitest: '>= 0.32' + peerDependenciesMeta: + '@jest/globals': + optional: true + '@types/bun': + optional: true + '@types/jest': + optional: true + jest: + optional: true + vitest: + optional: true + dependencies: + '@adobe/css-tools': 4.4.0 + '@babel/runtime': 7.24.1 + aria-query: 5.3.0 + chalk: 3.0.0 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + lodash: 4.17.21 + redent: 3.0.0 + vitest: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) + dev: true + /@testing-library/react@16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} engines: {node: '>=18'} From f569d07d73c94c0f6c22a7a4dfdec9f6a9b3b80a Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 25 Jun 2024 14:59:47 -0700 Subject: [PATCH 52/70] fixes --- packages/html-program-viewer/package.json | 2 +- .../src/react/use-tree-navigation.tsx | 2 +- packages/html-program-viewer/src/testing/index.ts | 1 + .../html-program-viewer/test/smoke-test.test.ts | 15 +++++---------- packages/html-program-viewer/test/test-host.ts | 5 +++-- packages/html-program-viewer/vite.config.ts | 10 ++-------- 6 files changed, 13 insertions(+), 22 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index d7ef5304fc..cc52cc2843 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -17,7 +17,7 @@ "typespec" ], "type": "module", - "main": "dist/src/index.js", + "main": "dist/index.js", "exports": { ".": { "types": "./dist/src/index.d.ts", diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.tsx b/packages/html-program-viewer/src/react/use-tree-navigation.tsx index f3f38e3f95..7e68044a75 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/use-tree-navigation.tsx @@ -105,7 +105,7 @@ function computeTree(program: Program): TypeGraphListNode { } function computeTypeNode(parentPath: string, type: NamedType, name?: string): TypeGraphTypeNode { - const path = parentPath + "." + type.name; + const path = parentPath + "." + type.name.toString(); return computeTypeNodeProps(path, type, name); } diff --git a/packages/html-program-viewer/src/testing/index.ts b/packages/html-program-viewer/src/testing/index.ts index 31abb11407..9091a56cdf 100644 --- a/packages/html-program-viewer/src/testing/index.ts +++ b/packages/html-program-viewer/src/testing/index.ts @@ -6,5 +6,6 @@ import { export const ProgramViewerTestLibrary: TypeSpecTestLibrary = createTestLibrary({ name: "@typespec/html-program-viewer", + jsFileFolder: "dist", packageRoot: await findTestPackageRoot(import.meta.url), }); diff --git a/packages/html-program-viewer/test/smoke-test.test.ts b/packages/html-program-viewer/test/smoke-test.test.ts index 1d1705e4fd..4252c7f40e 100644 --- a/packages/html-program-viewer/test/smoke-test.test.ts +++ b/packages/html-program-viewer/test/smoke-test.test.ts @@ -1,5 +1,4 @@ import type { BasicTestRunner } from "@typespec/compiler/testing"; -import { ok } from "assert"; import { beforeEach, it } from "vitest"; import { createViewerTestRunner } from "./test-host.js"; @@ -9,14 +8,10 @@ beforeEach(async () => { runner = await createViewerTestRunner(); }); -// it("create html view", async () => { -// await runner.compile(`op foo(): string;`); -// }); - -// it("compile unnamed union variant without error", async () => { -// await runner.compile(`union Foo { "a", "b" }`); -// }); +it("create html view", async () => { + await runner.compile(`op foo(): string;`); +}); -it("works", () => { - ok(true); +it("compile unnamed union variant without error", async () => { + await runner.compile(`union Foo { "a", "b" }`); }); diff --git a/packages/html-program-viewer/test/test-host.ts b/packages/html-program-viewer/test/test-host.ts index 81618c78ef..223d620f1d 100644 --- a/packages/html-program-viewer/test/test-host.ts +++ b/packages/html-program-viewer/test/test-host.ts @@ -1,15 +1,16 @@ import { createTestHost, createTestWrapper } from "@typespec/compiler/testing"; import { ProgramViewerTestLibrary } from "../src/testing/index.js"; -export async function createOpenAPITestHost() { +export async function createViewerTestHost() { return createTestHost({ libraries: [ProgramViewerTestLibrary], }); } export async function createViewerTestRunner() { - const host = await createOpenAPITestHost(); + const host = await createViewerTestHost(); return createTestWrapper(host, { + autoImports: [], compilerOptions: { emitters: { "@typespec/html-program-viewer": {} }, }, diff --git a/packages/html-program-viewer/vite.config.ts b/packages/html-program-viewer/vite.config.ts index b6945b3890..4ab8dbfc47 100644 --- a/packages/html-program-viewer/vite.config.ts +++ b/packages/html-program-viewer/vite.config.ts @@ -10,7 +10,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const packageJson = JSON.parse(readFileSync(resolve(__dirname, "package.json")).toString()); const dependencies = Object.keys(packageJson.dependencies); -const externals = [...dependencies]; +const externals = [...dependencies.filter((x) => !x.startsWith("@fluentui/"))]; export default defineConfig({ build: { @@ -30,18 +30,12 @@ export default defineConfig({ }, }, plugins: [ - react({}), + react(), dts({ logLevel: "silent", // checker reports the errors }), checker({ - // e.g. use TypeScript check typescript: true, }), ], - server: { - fs: { - strict: false, - }, - }, }); From ca677ca782d3d65bad9516d0003a81fe8eb76c7d Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Tue, 25 Jun 2024 15:35:58 -0700 Subject: [PATCH 53/70] revert --- packages/html-program-viewer/src/emitter.ts | 19 ++++++++++++++++--- packages/html-program-viewer/vite.config.ts | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/html-program-viewer/src/emitter.ts b/packages/html-program-viewer/src/emitter.ts index 3a717ad70f..1192eaccc8 100644 --- a/packages/html-program-viewer/src/emitter.ts +++ b/packages/html-program-viewer/src/emitter.ts @@ -1,8 +1,14 @@ -import { emitFile, resolvePath, type EmitContext } from "@typespec/compiler"; +import { + createTypeSpecLibrary, + emitFile, + getDirectoryPath, + resolvePath, + type EmitContext, + type JSONSchemaType, +} from "@typespec/compiler"; +import { fileURLToPath } from "url"; import { renderProgram } from "./react/type-graph.js"; -import { createTypeSpecLibrary, type JSONSchemaType } from "@typespec/compiler"; - export interface HtmlProgramViewerOptions { /** * Override compiler output-dir @@ -37,4 +43,11 @@ export async function $onEmit(context: EmitContext) { path: htmlPath, content: `${html}`, }); + const css = await context.program.host.readFile( + resolvePath(getDirectoryPath(fileURLToPath(import.meta.url)), "style.css") + ); + await emitFile(context.program, { + path: resolvePath(outputDir, "style.css"), + content: css.text, + }); } diff --git a/packages/html-program-viewer/vite.config.ts b/packages/html-program-viewer/vite.config.ts index 4ab8dbfc47..fd19b45bed 100644 --- a/packages/html-program-viewer/vite.config.ts +++ b/packages/html-program-viewer/vite.config.ts @@ -10,7 +10,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const packageJson = JSON.parse(readFileSync(resolve(__dirname, "package.json")).toString()); const dependencies = Object.keys(packageJson.dependencies); -const externals = [...dependencies.filter((x) => !x.startsWith("@fluentui/"))]; +const externals = ["url", ...dependencies]; export default defineConfig({ build: { From d926e1fba5a45b4c8fa2c5615e334fb2b45af310 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 26 Jun 2024 10:41:06 -0700 Subject: [PATCH 54/70] Move tree to react components lib --- .../src/react/js-inspector/object-inspector.tsx | 3 +-- .../html-program-viewer/src/react/tree-navigation.tsx | 2 +- packages/html-program-viewer/src/react/tree/index.ts | 0 packages/react-components/src/index.ts | 1 + packages/react-components/src/tree/index.ts | 2 ++ .../react => react-components/src}/tree/tree-control.ts | 0 .../src/react => react-components/src}/tree/tree-row.tsx | 0 .../react => react-components/src}/tree/tree.module.css | 0 .../src/react => react-components/src}/tree/tree.tsx | 9 ++++----- .../src/react => react-components/src}/tree/types.ts | 0 10 files changed, 9 insertions(+), 8 deletions(-) delete mode 100644 packages/html-program-viewer/src/react/tree/index.ts create mode 100644 packages/react-components/src/tree/index.ts rename packages/{html-program-viewer/src/react => react-components/src}/tree/tree-control.ts (100%) rename packages/{html-program-viewer/src/react => react-components/src}/tree/tree-row.tsx (100%) rename packages/{html-program-viewer/src/react => react-components/src}/tree/tree.module.css (100%) rename packages/{html-program-viewer/src/react => react-components/src}/tree/tree.tsx (97%) rename packages/{html-program-viewer/src/react => react-components/src}/tree/types.ts (100%) diff --git a/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx index 196590538e..b5bf0f4af5 100644 --- a/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx +++ b/packages/html-program-viewer/src/react/js-inspector/object-inspector.tsx @@ -1,7 +1,6 @@ +import { Tree, type TreeNode } from "@typespec/react-components"; import type { FC } from "react"; import { useState } from "react"; -import { Tree } from "../tree/tree.js"; -import type { TreeNode } from "../tree/types.js"; import { JsValue } from "./js-value/js-value.js"; import { ObjectLabel } from "./object-label.js"; import { ObjectRootLabel } from "./object-root-label.js"; diff --git a/packages/html-program-viewer/src/react/tree-navigation.tsx b/packages/html-program-viewer/src/react/tree-navigation.tsx index ec07a98ccb..e0c0eefa9f 100644 --- a/packages/html-program-viewer/src/react/tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/tree-navigation.tsx @@ -1,6 +1,6 @@ import { AppsListRegular } from "@fluentui/react-icons"; +import { Tree } from "@typespec/react-components"; import style from "./tree-navigation.module.css"; -import { Tree } from "./tree/tree.js"; import { useTreeNavigator, type TypeGraphNode } from "./use-tree-navigation.js"; export interface TreeNavigationProps {} diff --git a/packages/html-program-viewer/src/react/tree/index.ts b/packages/html-program-viewer/src/react/tree/index.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/react-components/src/index.ts b/packages/react-components/src/index.ts index 01ca24165a..0b86256fc7 100644 --- a/packages/react-components/src/index.ts +++ b/packages/react-components/src/index.ts @@ -1,2 +1,3 @@ export { useControllableValue } from "./hooks.js"; export { Pane, SplitPane, type PaneProps, type SplitPaneProps } from "./split-pane/index.js"; +export { Tree, type TreeNode, type TreeProps } from "./tree/index.js"; diff --git a/packages/react-components/src/tree/index.ts b/packages/react-components/src/tree/index.ts new file mode 100644 index 0000000000..e55f9913af --- /dev/null +++ b/packages/react-components/src/tree/index.ts @@ -0,0 +1,2 @@ +export { Tree, type TreeProps } from "./tree.js"; +export type { TreeNode } from "./types.js"; diff --git a/packages/html-program-viewer/src/react/tree/tree-control.ts b/packages/react-components/src/tree/tree-control.ts similarity index 100% rename from packages/html-program-viewer/src/react/tree/tree-control.ts rename to packages/react-components/src/tree/tree-control.ts diff --git a/packages/html-program-viewer/src/react/tree/tree-row.tsx b/packages/react-components/src/tree/tree-row.tsx similarity index 100% rename from packages/html-program-viewer/src/react/tree/tree-row.tsx rename to packages/react-components/src/tree/tree-row.tsx diff --git a/packages/html-program-viewer/src/react/tree/tree.module.css b/packages/react-components/src/tree/tree.module.css similarity index 100% rename from packages/html-program-viewer/src/react/tree/tree.module.css rename to packages/react-components/src/tree/tree.module.css diff --git a/packages/html-program-viewer/src/react/tree/tree.tsx b/packages/react-components/src/tree/tree.tsx similarity index 97% rename from packages/html-program-viewer/src/react/tree/tree.tsx rename to packages/react-components/src/tree/tree.tsx index 5d1c3c8055..db707a7eee 100644 --- a/packages/html-program-viewer/src/react/tree/tree.tsx +++ b/packages/react-components/src/tree/tree.tsx @@ -1,4 +1,3 @@ -import { useControllableValue } from "@typespec/react-components"; import { useCallback, useEffect, @@ -8,13 +7,13 @@ import { type FC, type KeyboardEvent, } from "react"; +import { useControllableValue } from "../hooks.js"; import { useTreeControls } from "./tree-control.js"; import { TreeViewRow } from "./tree-row.js"; -import type { TreeNode, TreeRow } from "./types.js"; - import style from "./tree.module.css"; +import type { TreeNode, TreeRow } from "./types.js"; -export interface TreeViewProps { +export interface TreeProps { /** * If tree allows keeping a current selection. * @default no selection. @@ -35,7 +34,7 @@ export function Tree({ onSetExpanded, nodeIcon, selectionMode = "none", -}: TreeViewProps) { +}: TreeProps) { const id = useId(); const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ onSetExpanded, diff --git a/packages/html-program-viewer/src/react/tree/types.ts b/packages/react-components/src/tree/types.ts similarity index 100% rename from packages/html-program-viewer/src/react/tree/types.ts rename to packages/react-components/src/tree/types.ts From 15efc045cbf949316af62571fb72c288ca1d0d71 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 26 Jun 2024 11:36:45 -0700 Subject: [PATCH 55/70] split pane basic tests --- packages/react-components/package.json | 7 +- .../react-components/src/split-pane/sash.tsx | 1 + .../src/split-pane/split-pane.test.tsx | 65 +++++++++++++++++++ .../src/split-pane/split-pane.tsx | 15 +---- .../src/split-pane/use-el-dimensions.ts | 23 +++++++ .../react-components/test/global.setup.ts | 1 + packages/react-components/test/setup.ts | 8 +++ packages/react-components/tsconfig.json | 2 +- packages/react-components/vitest.config.ts | 11 +++- pnpm-lock.yaml | 47 +++----------- 10 files changed, 127 insertions(+), 53 deletions(-) create mode 100644 packages/react-components/src/split-pane/split-pane.test.tsx create mode 100644 packages/react-components/src/split-pane/use-el-dimensions.ts create mode 100644 packages/react-components/test/global.setup.ts create mode 100644 packages/react-components/test/setup.ts diff --git a/packages/react-components/package.json b/packages/react-components/package.json index f1d7fb2313..7af20a7eaf 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -50,18 +50,21 @@ }, "devDependencies": { "@babel/core": "^7.24.5", + "@testing-library/dom": "^10.2.0", + "@testing-library/jest-dom": "^6.4.6", + "@testing-library/react": "^16.0.0", "@types/node": "~18.11.19", - "@types/react-dom": "~18.3.0", "@types/react": "~18.3.2", + "@types/react-dom": "~18.3.0", "@vitejs/plugin-react": "~4.2.1", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", "c8": "^9.1.0", "rimraf": "~5.0.7", "typescript": "~5.4.5", + "vite": "^5.2.11", "vite-plugin-checker": "^0.6.4", "vite-plugin-dts": "^3.9.1", - "vite": "^5.2.11", "vitest": "^1.6.0" } } diff --git a/packages/react-components/src/split-pane/sash.tsx b/packages/react-components/src/split-pane/sash.tsx index 9e3a9e032a..7592abb74d 100644 --- a/packages/react-components/src/split-pane/sash.tsx +++ b/packages/react-components/src/split-pane/sash.tsx @@ -36,6 +36,7 @@ export const Sash = ({ return (
    { setDrag(true); diff --git a/packages/react-components/src/split-pane/split-pane.test.tsx b/packages/react-components/src/split-pane/split-pane.test.tsx new file mode 100644 index 0000000000..8ea4db7fae --- /dev/null +++ b/packages/react-components/src/split-pane/split-pane.test.tsx @@ -0,0 +1,65 @@ +import { render, screen } from "@testing-library/react"; +import { describe } from "node:test"; +import { expect, it, vi } from "vitest"; +import { Pane } from "./pane.js"; +import { SplitPane } from "./split-pane.js"; + +vi.mock("./use-el-dimensions.js", () => ({ + useElDimensions: () => ({ width: 1000, height: 1000 }), +})); + +it("render 2 panes", async () => { + const { container } = render( + + Pane 1 + Pane 2 + + ); + expect(await screen.findAllByRole("separator")).toHaveLength(1); + expect(container).toHaveTextContent("Pane 1"); + expect(container).toHaveTextContent("Pane 2"); +}); + +it("render 3 panes with 2 separators", async () => { + const { container } = render( + + Pane 1 + Pane 2 + Pane 3 + + ); + expect(await screen.findAllByRole("separator")).toHaveLength(2); + expect(container).toHaveTextContent("Pane 1"); + expect(container).toHaveTextContent("Pane 2"); + expect(container).toHaveTextContent("Pane 3"); +}); + +describe("sizes", () => { + it("split equally when initial sizes are undefined", async () => { + render( + + Pane 1 + Pane 2 + + ); + screen.debug(); + + expect(await screen.findByText("Pane 1")).toHaveStyle({ width: "500px" }); + expect(await screen.findByText("Pane 2")).toHaveStyle({ width: "500px" }); + }); + + it("undefined pane sizes take the remaining width", async () => { + render( + + Pane 1 + Pane 2 + Pane 3 + + ); + screen.debug(); + + expect(await screen.findByText("Pane 1")).toHaveStyle({ width: "200px" }); + expect(await screen.findByText("Pane 2")).toHaveStyle({ width: "100px" }); + expect(await screen.findByText("Pane 3")).toHaveStyle({ width: "700px" }); + }); +}); diff --git a/packages/react-components/src/split-pane/split-pane.tsx b/packages/react-components/src/split-pane/split-pane.tsx index 03176b48c7..e323842097 100644 --- a/packages/react-components/src/split-pane/split-pane.tsx +++ b/packages/react-components/src/split-pane/split-pane.tsx @@ -1,7 +1,6 @@ import { mergeClasses } from "@fluentui/react-components"; import { useCallback, - useEffect, useMemo, useRef, useState, @@ -14,12 +13,13 @@ import { Pane, type PaneProps } from "./pane.js"; import { SashContent } from "./sash-content.js"; import { Sash } from "./sash.js"; import style from "./split-pane.module.css"; +import { useElDimensions } from "./use-el-dimensions.js"; export interface SplitPaneProps { children: JSX.Element[]; allowResize?: boolean; split?: "vertical" | "horizontal"; - initialSizes?: (string | number)[]; + initialSizes?: (string | number | undefined)[]; sizes?: (string | number | undefined)[]; sashRender?: (index: number, active: boolean) => React.ReactNode; onChange?: (sizes: number[]) => void; @@ -64,18 +64,9 @@ export const SplitPane: FunctionComponent = ({ const axis = useRef({ x: 0, y: 0 }); const wrapper = useRef(null); const cacheSizes = useRef({ sizes: [], sashPosSizes: [] }); - const [wrapperRect, setWrapperRect] = useState>({}); const [isDragging, setDragging] = useState(false); - useEffect(() => { - const resizeObserver = new ResizeObserver(() => { - setWrapperRect(wrapper?.current?.getBoundingClientRect() ?? ({} as any)); - }); - resizeObserver.observe(wrapper.current!); - return () => { - resizeObserver.disconnect(); - }; - }, []); + const wrapperRect = useElDimensions(wrapper); const { sizeName, splitPos, splitAxis } = useMemo( () => diff --git a/packages/react-components/src/split-pane/use-el-dimensions.ts b/packages/react-components/src/split-pane/use-el-dimensions.ts new file mode 100644 index 0000000000..63d1f385fd --- /dev/null +++ b/packages/react-components/src/split-pane/use-el-dimensions.ts @@ -0,0 +1,23 @@ +import { useEffect, useState, type RefObject } from "react"; + +export interface ElDimensions { + readonly width: number; + readonly height: number; +} + +const defaultDimensions: ElDimensions = { width: 0, height: 0 }; + +export function useElDimensions(ref: RefObject) { + const [dimensions, setDimensions] = useState(defaultDimensions); + useEffect(() => { + const resizeObserver = new ResizeObserver(() => { + setDimensions(ref.current?.getBoundingClientRect() ?? defaultDimensions); + }); + resizeObserver.observe(ref.current!); + return () => { + resizeObserver.disconnect(); + }; + }, []); + + return dimensions; +} diff --git a/packages/react-components/test/global.setup.ts b/packages/react-components/test/global.setup.ts new file mode 100644 index 0000000000..4ef7f0b426 --- /dev/null +++ b/packages/react-components/test/global.setup.ts @@ -0,0 +1 @@ +export const setup = () => {}; diff --git a/packages/react-components/test/setup.ts b/packages/react-components/test/setup.ts new file mode 100644 index 0000000000..097fba43ed --- /dev/null +++ b/packages/react-components/test/setup.ts @@ -0,0 +1,8 @@ +import "@testing-library/jest-dom/vitest"; +import { cleanup } from "@testing-library/react"; +import { afterEach } from "vitest"; + +// runs a clean after each test case (e.g. clearing jsdom) +afterEach(() => { + cleanup(); +}); diff --git a/packages/react-components/tsconfig.json b/packages/react-components/tsconfig.json index 062db7257f..45e8f4a153 100644 --- a/packages/react-components/tsconfig.json +++ b/packages/react-components/tsconfig.json @@ -12,7 +12,7 @@ "verbatimModuleSyntax": true, "jsx": "react-jsx", "lib": ["DOM", "ES2022"], - "types": ["vite/client"] + "types": ["vite/client", "@testing-library/jest-dom"] }, "include": ["src"] } diff --git a/packages/react-components/vitest.config.ts b/packages/react-components/vitest.config.ts index 15eeaceb85..09c12f3447 100644 --- a/packages/react-components/vitest.config.ts +++ b/packages/react-components/vitest.config.ts @@ -1,4 +1,13 @@ import { defineConfig, mergeConfig } from "vitest/config"; import { defaultTypeSpecVitestConfig } from "../../vitest.workspace.js"; -export default mergeConfig(defaultTypeSpecVitestConfig, defineConfig({})); +export default mergeConfig( + defaultTypeSpecVitestConfig, + defineConfig({ + test: { + globalSetup: "./test/global.setup.ts", + environment: "happy-dom", + setupFiles: "./test/setup.ts", // assuming the test folder is in the root of our project + }, + }) +); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e47e230d87..4ba1b446d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1043,6 +1043,15 @@ importers: '@babel/core': specifier: ^7.24.5 version: 7.24.5 + '@testing-library/dom': + specifier: ^10.2.0 + version: 10.2.0 + '@testing-library/jest-dom': + specifier: ^6.4.6 + version: 6.4.6(vitest@1.6.0) + '@testing-library/react': + specifier: ^16.0.0 + version: 16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) '@types/node': specifier: ~18.11.19 version: 18.11.19 @@ -1537,10 +1546,6 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - /@adobe/css-tools@4.3.3: - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - dev: true - /@adobe/css-tools@4.4.0: resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} dev: true @@ -8493,7 +8498,7 @@ packages: '@storybook/instrumenter': 8.1.2 '@storybook/preview-api': 8.1.2 '@testing-library/dom': 9.3.4 - '@testing-library/jest-dom': 6.4.5(vitest@1.6.0) + '@testing-library/jest-dom': 6.4.6(vitest@1.6.0) '@testing-library/user-event': 14.5.2(@testing-library/dom@9.3.4) '@vitest/expect': 1.3.1 '@vitest/spy': 1.6.0 @@ -8843,38 +8848,6 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@6.4.5(vitest@1.6.0): - resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - peerDependencies: - '@jest/globals': '>= 28' - '@types/bun': latest - '@types/jest': '>= 28' - jest: '>= 28' - vitest: '>= 0.32' - peerDependenciesMeta: - '@jest/globals': - optional: true - '@types/bun': - optional: true - '@types/jest': - optional: true - jest: - optional: true - vitest: - optional: true - dependencies: - '@adobe/css-tools': 4.3.3 - '@babel/runtime': 7.24.1 - aria-query: 5.3.0 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - vitest: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0)(happy-dom@14.11.0) - dev: true - /@testing-library/jest-dom@6.4.6(vitest@1.6.0): resolution: {integrity: sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} From 4ae39b8f2f18ea81ef6c2ef48b064fb28232a975 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 26 Jun 2024 12:36:34 -0700 Subject: [PATCH 56/70] resize tests --- .../react-components/src/split-pane/sash.tsx | 1 + .../src/split-pane/split-pane.test.tsx | 46 +++++++++++++++++-- .../src/split-pane/split-pane.tsx | 3 +- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/packages/react-components/src/split-pane/sash.tsx b/packages/react-components/src/split-pane/sash.tsx index 7592abb74d..dfcf97c292 100644 --- a/packages/react-components/src/split-pane/sash.tsx +++ b/packages/react-components/src/split-pane/sash.tsx @@ -39,6 +39,7 @@ export const Sash = ({ role="separator" className={mergeClasses(style["sash"], className)} onMouseDown={(e) => { + console.log("Mouse down", e.pageX); setDrag(true); onDragStart(e); diff --git a/packages/react-components/src/split-pane/split-pane.test.tsx b/packages/react-components/src/split-pane/split-pane.test.tsx index 8ea4db7fae..0ffd7066cb 100644 --- a/packages/react-components/src/split-pane/split-pane.test.tsx +++ b/packages/react-components/src/split-pane/split-pane.test.tsx @@ -1,6 +1,5 @@ -import { render, screen } from "@testing-library/react"; -import { describe } from "node:test"; -import { expect, it, vi } from "vitest"; +import { createEvent, fireEvent, render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; import { Pane } from "./pane.js"; import { SplitPane } from "./split-pane.js"; @@ -42,7 +41,6 @@ describe("sizes", () => { Pane 2 ); - screen.debug(); expect(await screen.findByText("Pane 1")).toHaveStyle({ width: "500px" }); expect(await screen.findByText("Pane 2")).toHaveStyle({ width: "500px" }); @@ -56,10 +54,48 @@ describe("sizes", () => { Pane 3 ); - screen.debug(); expect(await screen.findByText("Pane 1")).toHaveStyle({ width: "200px" }); expect(await screen.findByText("Pane 2")).toHaveStyle({ width: "100px" }); expect(await screen.findByText("Pane 3")).toHaveStyle({ width: "700px" }); }); + + function mockMouseEvent( + target: HTMLElement, + type: keyof typeof createEvent, + { pageX, pageY }: { pageX?: number; pageY?: number } = {} + ) { + const evt = createEvent[type](target); + if (pageX !== undefined) (evt as any).pageX = pageX; + if (pageY !== undefined) (evt as any).pageY = pageY; + return evt; + } + + it("resize", async () => { + render( + + Pane 1 + Pane 2 + + ); + const separator = await screen.getByRole("separator"); + const pane1 = await screen.findByText("Pane 1"); + const pane2 = await screen.findByText("Pane 2"); + + expect(pane1).toHaveStyle({ width: "500px" }); + expect(pane2).toHaveStyle({ width: "500px" }); + + fireEvent(separator, mockMouseEvent(separator, "mouseDown", { pageX: 500, pageY: 0 })); + fireEvent(separator, mockMouseEvent(separator, "mouseMove", { pageX: 600, pageY: 0 })); + + expect(pane1).toHaveStyle({ width: "600px" }); + expect(pane2).toHaveStyle({ width: "400px" }); + + fireEvent(separator, mockMouseEvent(separator, "mouseUp")); + fireEvent(separator, mockMouseEvent(separator, "mouseMove", { pageX: 700, pageY: 0 })); + + // Should not update after we mouse up + expect(pane1).toHaveStyle({ width: "600px" }); + expect(pane2).toHaveStyle({ width: "400px" }); + }); }); diff --git a/packages/react-components/src/split-pane/split-pane.tsx b/packages/react-components/src/split-pane/split-pane.tsx index e323842097..2df961e9ad 100644 --- a/packages/react-components/src/split-pane/split-pane.tsx +++ b/packages/react-components/src/split-pane/split-pane.tsx @@ -159,8 +159,9 @@ export const SplitPane: FunctionComponent = ({ ); const onDragging = useCallback( - function (e: MouseEvent, i: number) { + (e: MouseEvent, i: number) => { const curAxis = { x: e.pageX, y: e.pageY }; + console.log("On dragging", curAxis); let distanceX = curAxis[splitAxis] - axis.current[splitAxis]; const leftBorder = -Math.min( From 8ab87709e1e142478473d238ec57d4aa28cad12d Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 26 Jun 2024 12:49:29 -0700 Subject: [PATCH 57/70] . --- packages/react-components/src/split-pane/sash.tsx | 1 - packages/react-components/src/split-pane/split-pane.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/react-components/src/split-pane/sash.tsx b/packages/react-components/src/split-pane/sash.tsx index dfcf97c292..7592abb74d 100644 --- a/packages/react-components/src/split-pane/sash.tsx +++ b/packages/react-components/src/split-pane/sash.tsx @@ -39,7 +39,6 @@ export const Sash = ({ role="separator" className={mergeClasses(style["sash"], className)} onMouseDown={(e) => { - console.log("Mouse down", e.pageX); setDrag(true); onDragStart(e); diff --git a/packages/react-components/src/split-pane/split-pane.tsx b/packages/react-components/src/split-pane/split-pane.tsx index 2df961e9ad..fdbd08dbdb 100644 --- a/packages/react-components/src/split-pane/split-pane.tsx +++ b/packages/react-components/src/split-pane/split-pane.tsx @@ -161,7 +161,6 @@ export const SplitPane: FunctionComponent = ({ const onDragging = useCallback( (e: MouseEvent, i: number) => { const curAxis = { x: e.pageX, y: e.pageY }; - console.log("On dragging", curAxis); let distanceX = curAxis[splitAxis] - axis.current[splitAxis]; const leftBorder = -Math.min( From ed6a2925b403fd33c8fc317117325f42fc738f38 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 26 Jun 2024 13:27:37 -0700 Subject: [PATCH 58/70] tree tests --- .../react-components/src/tree/tree.test.tsx | 112 ++++++++++++++++++ packages/react-components/src/tree/tree.tsx | 5 +- 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 packages/react-components/src/tree/tree.test.tsx diff --git a/packages/react-components/src/tree/tree.test.tsx b/packages/react-components/src/tree/tree.test.tsx new file mode 100644 index 0000000000..e4b6d5c0ee --- /dev/null +++ b/packages/react-components/src/tree/tree.test.tsx @@ -0,0 +1,112 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { expect, it } from "vitest"; +import { Tree } from "./tree.js"; +import type { TreeNode } from "./types.js"; + +const simpleTree: TreeNode = { + id: "$", + name: "root", + children: [ + { + id: "$.child1", + name: "Child 1", + children: [ + { + id: "$.child1.1", + name: "Sub child 1.1", + }, + { + id: "$.child1.2", + name: "Sub child 1.2", + }, + { + id: "$.child1.3", + name: "Sub child 1.3", + }, + ], + }, + { + id: "$.child2", + name: "Child 2", + children: [ + { + id: "$.child2.1", + name: "Sub child 2.1", + }, + ], + }, + ], +}; + +it("tree is collapsed by default", async () => { + render(); + const nodes = await screen.findAllByRole("treeitem"); + expect(nodes).toHaveLength(2); + expect(nodes[0]).toHaveTextContent("Child 1"); + expect(nodes[0]).toHaveAttribute("aria-expanded", "false"); + expect(nodes[1]).toHaveTextContent("Child 2"); + expect(nodes[1]).toHaveAttribute("aria-expanded", "false"); +}); + +it("expand nodes by clicking on it", async () => { + render(); + const child1 = await screen.findByText("Child 1"); + fireEvent.click(child1); + const nodes = await screen.findAllByRole("treeitem"); + expect(nodes).toHaveLength(5); + expect(nodes[0]).toHaveTextContent("Child 1"); + expect(nodes[0]).toHaveAttribute("aria-expanded", "true"); + + expect(nodes[1]).toHaveTextContent("Sub child 1.1"); + expect(nodes[2]).toHaveTextContent("Sub child 1.2"); + expect(nodes[3]).toHaveTextContent("Sub child 1.3"); + + expect(nodes[4]).toHaveTextContent("Child 2"); + expect(nodes[4]).toHaveAttribute("aria-expanded", "false"); +}); + +it.only("expand nodes by pressing enter on it", async () => { + render(); + const treeNode = await screen.findByRole("tree"); + fireEvent.focus(treeNode); + fireEvent.keyDown(treeNode, { key: "Enter", code: "Enter" }); + expect(await screen.findAllByRole("treeitem")).toHaveLength(5); +}); + +it.only("expand nodes by pressing space on it", async () => { + render(); + const treeNode = await screen.findByRole("tree"); + fireEvent.focus(treeNode); + fireEvent.keyDown(treeNode, { key: "Space", code: "Space" }); + expect(await screen.findAllByRole("treeitem")).toHaveLength(5); +}); + +it.only("use left right arrow to expand and collapse", async () => { + render(); + const treeNode = await screen.findByRole("tree"); + fireEvent.focus(treeNode); + fireEvent.keyDown(treeNode, { key: "ArrowRight", code: "ArrowRight" }); + expect(await screen.findAllByRole("treeitem")).toHaveLength(5); + fireEvent.keyDown(treeNode, { key: "ArrowLeft", code: "ArrowLeft" }); + expect(await screen.findAllByRole("treeitem")).toHaveLength(2); +}); + +it("use up down arrow to navigate", async () => { + render(); + const treeNode = await screen.findByRole("tree"); + fireEvent.focus(treeNode); + let nodes = await screen.findAllByRole("treeitem"); + + expect(treeNode).toHaveAttribute("aria-activedescendant", nodes[0].id); + fireEvent.keyDown(treeNode, { key: "ArrowDown", code: "ArrowDown" }); + expect(treeNode).toHaveAttribute("aria-activedescendant", nodes[1].id); + fireEvent.keyDown(treeNode, { key: "Space", code: "Space" }); + nodes = await screen.findAllByRole("treeitem"); + fireEvent.keyDown(treeNode, { key: "ArrowDown", code: "ArrowDown" }); + expect(treeNode).toHaveAttribute("aria-activedescendant", nodes[2].id); + fireEvent.keyDown(treeNode, { key: "ArrowUp", code: "ArrowUp" }); + expect(treeNode).toHaveAttribute("aria-activedescendant", nodes[1].id); + fireEvent.keyDown(treeNode, { key: "ArrowDown", code: "ArrowDown" }); + fireEvent.keyDown(treeNode, { key: "ArrowDown", code: "ArrowDown" }); + expect(treeNode).toHaveAttribute("aria-activedescendant", nodes[0].id); +}); diff --git a/packages/react-components/src/tree/tree.tsx b/packages/react-components/src/tree/tree.tsx index db707a7eee..85ee8f80b4 100644 --- a/packages/react-components/src/tree/tree.tsx +++ b/packages/react-components/src/tree/tree.tsx @@ -109,7 +109,10 @@ export function Tree({ tabIndex={0} role="tree" onKeyDown={handleKeyDown} - onFocus={() => setFocusedIndex(rows.findIndex((row) => row.id === selectedKey))} + onFocus={() => { + const row = rows.findIndex((row) => row.id === selectedKey); + setFocusedIndex(row === -1 ? 0 : row); + }} onBlur={() => setFocusedIndex(-1)} aria-activedescendant={`${id}-${focusedIndex}`} > From b984ef7dabbaea949599b00bc0a6506abf3539f1 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 1 Jul 2024 10:11:39 -0700 Subject: [PATCH 59/70] html program viewer --- packages/html-program-viewer/package.json | 4 ++- packages/html-program-viewer/src/emitter.ts | 18 ++++++++-- .../src/react/inspect-type/inspect-type.tsx | 16 ++++----- .../src/react/use-tree-navigation.tsx | 4 +++ .../vite.emitter.config.ts | 36 +++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 packages/html-program-viewer/vite.emitter.config.ts diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index cc52cc2843..33987d3d12 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -34,7 +34,9 @@ }, "scripts": { "clean": "rimraf ./dist ./temp", - "build": "vite build", + "build": "pnpm build:react && pnpm build:emitter", + "build:react": "vite build", + "build:emitter": "vite build --config vite.emitter.config.ts", "watch": "vite build --watch", "test": "vitest run", "test:ui": "vitest --ui", diff --git a/packages/html-program-viewer/src/emitter.ts b/packages/html-program-viewer/src/emitter.ts index 1192eaccc8..057e05d872 100644 --- a/packages/html-program-viewer/src/emitter.ts +++ b/packages/html-program-viewer/src/emitter.ts @@ -1,3 +1,4 @@ +import { FluentProvider, webLightTheme } from "@fluentui/react-components"; import { createTypeSpecLibrary, emitFile, @@ -5,9 +6,12 @@ import { resolvePath, type EmitContext, type JSONSchemaType, + type Program, } from "@typespec/compiler"; +import { createElement } from "react"; +import ReactDOMServer from "react-dom/server"; import { fileURLToPath } from "url"; -import { renderProgram } from "./react/type-graph.js"; +import { InspectType } from "./react/inspect-type/inspect-type.js"; export interface HtmlProgramViewerOptions { /** @@ -25,8 +29,18 @@ const EmitterOptionsSchema: JSONSchemaType = { required: [], }; +export function renderProgram(program: Program) { + const html = ReactDOMServer.renderToString( + createElement(FluentProvider, { + theme: webLightTheme, + children: createElement(InspectType, { entity: program.getGlobalNamespaceType() }), + }) // [1 + ); + return html; +} + export const libDef = { - name: "@typespec/openapi3", + name: "@typespec/html-program-viewer", diagnostics: {}, emitter: { options: EmitterOptionsSchema as JSONSchemaType, diff --git a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx index 7c910ea0e9..a48b1b5e43 100644 --- a/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx +++ b/packages/html-program-viewer/src/react/inspect-type/inspect-type.tsx @@ -5,7 +5,7 @@ import { isNamedUnion } from "../../utils.js"; import { Literal, Mono, TypeKind } from "../common.js"; import { JsValue } from "../js-inspector/js-value/js-value.js"; import { getPropertyRendering, type EntityPropertyConfig } from "../type-config.js"; -import { useTreeNavigator } from "../use-tree-navigation.js"; +import { useTreeNavigatorOptional } from "../use-tree-navigation.js"; import style from "./inspect-type.module.css"; type NamedType = Type & { name: string }; @@ -35,12 +35,12 @@ const EntityUI: FunctionComponent = ({ entity }) => { }; const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { - const nav = useTreeNavigator(); + const nav = useTreeNavigatorOptional(); - const navToType = useCallback(() => nav.navToType(type), [nav.navToType, type]); + const navToType = useCallback(() => nav?.navToType(type), [nav?.navToType, type]); return (
    -
    +
    {" "} {"name" in type ? type.name?.toString() : ""}
    @@ -50,13 +50,13 @@ const TypeUI: FunctionComponent<{ type: Type }> = ({ type }) => { }; const NamedTypeRef: FunctionComponent<{ type: NamedType }> = ({ type }) => { - const nav = useTreeNavigator(); + const nav = useTreeNavigatorOptional(); const navToType = useCallback(() => { - nav.navToType(type); - }, [nav.navToType, type]); + nav?.navToType(type); + }, [nav?.navToType, type]); return ( - + {getTypeName(type)} ); diff --git a/packages/html-program-viewer/src/react/use-tree-navigation.tsx b/packages/html-program-viewer/src/react/use-tree-navigation.tsx index 7e68044a75..1e19c3b58b 100644 --- a/packages/html-program-viewer/src/react/use-tree-navigation.tsx +++ b/packages/html-program-viewer/src/react/use-tree-navigation.tsx @@ -34,6 +34,10 @@ function expandNamespaces(namespace: Namespace): Namespace[] { const TreeNavigatorContext = createContext(undefined); +export function useTreeNavigatorOptional(): TreeNavigator | undefined { + return useContext(TreeNavigatorContext); +} + export function useTreeNavigator(): TreeNavigator { const nav = useContext(TreeNavigatorContext); if (nav === undefined) { diff --git a/packages/html-program-viewer/vite.emitter.config.ts b/packages/html-program-viewer/vite.emitter.config.ts new file mode 100644 index 0000000000..77af0ce118 --- /dev/null +++ b/packages/html-program-viewer/vite.emitter.config.ts @@ -0,0 +1,36 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import checker from "vite-plugin-checker"; + +const externals = [ + "url", + "@typespec/compiler", + "react", + "react-dom", + "react-dom/server", + // "@fluentui/react-components", +]; + +export default defineConfig({ + build: { + target: "esnext", + minify: false, + chunkSizeWarningLimit: 3000, + lib: { + entry: { + index: "src/index.ts", + }, + formats: ["es"], + }, + + rollupOptions: { + external: externals, + }, + }, + plugins: [ + react(), + checker({ + typescript: true, + }), + ], +}); From 66c71938df114745cbc457fa2099f7a265c3b044 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 1 Jul 2024 10:15:20 -0700 Subject: [PATCH 60/70] FIx --- packages/html-program-viewer/package.json | 3 +-- packages/html-program-viewer/vite.emitter.config.ts | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 33987d3d12..347d6d9e3e 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -20,8 +20,7 @@ "main": "dist/index.js", "exports": { ".": { - "types": "./dist/src/index.d.ts", - "default": "./dist/index.js" + "default": "./dist/emitter/index.js" }, "./react": { "types": "./dist/src/react/index.d.ts", diff --git a/packages/html-program-viewer/vite.emitter.config.ts b/packages/html-program-viewer/vite.emitter.config.ts index 77af0ce118..3286578fe1 100644 --- a/packages/html-program-viewer/vite.emitter.config.ts +++ b/packages/html-program-viewer/vite.emitter.config.ts @@ -22,6 +22,7 @@ export default defineConfig({ }, formats: ["es"], }, + outDir: "dist/emitter", rollupOptions: { external: externals, From 0cfca1f07c5c9041d1ee6188493e753e6b45ea42 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 1 Jul 2024 10:16:36 -0700 Subject: [PATCH 61/70] Create typegraph-v2-2024-6-1-17-14-9.md --- .chronus/changes/typegraph-v2-2024-6-1-17-14-9.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .chronus/changes/typegraph-v2-2024-6-1-17-14-9.md diff --git a/.chronus/changes/typegraph-v2-2024-6-1-17-14-9.md b/.chronus/changes/typegraph-v2-2024-6-1-17-14-9.md new file mode 100644 index 0000000000..fa501754b3 --- /dev/null +++ b/.chronus/changes/typegraph-v2-2024-6-1-17-14-9.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: feature +packages: + - "@typespec/html-program-viewer" +--- + +Complete new dynamic UI to navigate the TypeSpec type graph From 2dbd08dfb452905f8f3c46e214c3f4f396d21d45 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 1 Jul 2024 10:18:16 -0700 Subject: [PATCH 62/70] more changelogs --- .chronus/changes/typegraph-v2-2024-6-1-10-17-30.md | 7 +++++++ .chronus/changes/typegraph-v2-2024-6-1-10-17-58.md | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 .chronus/changes/typegraph-v2-2024-6-1-10-17-30.md create mode 100644 .chronus/changes/typegraph-v2-2024-6-1-10-17-58.md diff --git a/.chronus/changes/typegraph-v2-2024-6-1-10-17-30.md b/.chronus/changes/typegraph-v2-2024-6-1-10-17-30.md new file mode 100644 index 0000000000..fb3ac48572 --- /dev/null +++ b/.chronus/changes/typegraph-v2-2024-6-1-10-17-30.md @@ -0,0 +1,7 @@ +--- +changeKind: internal +packages: + - "@typespec/react-components" +--- + +Initial \ No newline at end of file diff --git a/.chronus/changes/typegraph-v2-2024-6-1-10-17-58.md b/.chronus/changes/typegraph-v2-2024-6-1-10-17-58.md new file mode 100644 index 0000000000..2f0cbc64a6 --- /dev/null +++ b/.chronus/changes/typegraph-v2-2024-6-1-10-17-58.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/playground" +--- + +Extract splitpane into separate package From ac58a9e412e7c2f5f24c2b4f9bf305dc0bf5a475 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 1 Jul 2024 11:05:04 -0700 Subject: [PATCH 63/70] fix tests --- packages/html-program-viewer/package.json | 2 +- packages/html-program-viewer/src/emitter.ts | 6 ++++-- packages/html-program-viewer/vite.config.ts | 1 - packages/html-program-viewer/vite.emitter.config.ts | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index 347d6d9e3e..07909dc4c0 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -17,7 +17,7 @@ "typespec" ], "type": "module", - "main": "dist/index.js", + "main": "dist/emitter/index.js", "exports": { ".": { "default": "./dist/emitter/index.js" diff --git a/packages/html-program-viewer/src/emitter.ts b/packages/html-program-viewer/src/emitter.ts index 057e05d872..e19e2ae203 100644 --- a/packages/html-program-viewer/src/emitter.ts +++ b/packages/html-program-viewer/src/emitter.ts @@ -8,6 +8,7 @@ import { type JSONSchemaType, type Program, } from "@typespec/compiler"; +import { readFile } from "fs/promises"; import { createElement } from "react"; import ReactDOMServer from "react-dom/server"; import { fileURLToPath } from "url"; @@ -57,11 +58,12 @@ export async function $onEmit(context: EmitContext) { path: htmlPath, content: `${html}`, }); - const css = await context.program.host.readFile( + + const css = await readFile( resolvePath(getDirectoryPath(fileURLToPath(import.meta.url)), "style.css") ); await emitFile(context.program, { path: resolvePath(outputDir, "style.css"), - content: css.text, + content: css.toString(), }); } diff --git a/packages/html-program-viewer/vite.config.ts b/packages/html-program-viewer/vite.config.ts index fd19b45bed..cdd2ab11df 100644 --- a/packages/html-program-viewer/vite.config.ts +++ b/packages/html-program-viewer/vite.config.ts @@ -19,7 +19,6 @@ export default defineConfig({ chunkSizeWarningLimit: 3000, lib: { entry: { - index: "src/index.ts", "react/index": "src/react/index.ts", }, formats: ["es"], diff --git a/packages/html-program-viewer/vite.emitter.config.ts b/packages/html-program-viewer/vite.emitter.config.ts index 3286578fe1..a630eae982 100644 --- a/packages/html-program-viewer/vite.emitter.config.ts +++ b/packages/html-program-viewer/vite.emitter.config.ts @@ -4,11 +4,11 @@ import checker from "vite-plugin-checker"; const externals = [ "url", + "fs/promises", "@typespec/compiler", "react", "react-dom", "react-dom/server", - // "@fluentui/react-components", ]; export default defineConfig({ From ebb1303a6c39d66ae34b313bcd7c7ca13d1ab713 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 1 Jul 2024 12:25:33 -0700 Subject: [PATCH 64/70] remove only --- packages/react-components/src/tree/tree.test.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-components/src/tree/tree.test.tsx b/packages/react-components/src/tree/tree.test.tsx index e4b6d5c0ee..c7592b95ee 100644 --- a/packages/react-components/src/tree/tree.test.tsx +++ b/packages/react-components/src/tree/tree.test.tsx @@ -65,7 +65,7 @@ it("expand nodes by clicking on it", async () => { expect(nodes[4]).toHaveAttribute("aria-expanded", "false"); }); -it.only("expand nodes by pressing enter on it", async () => { +it("expand nodes by pressing enter on it", async () => { render(); const treeNode = await screen.findByRole("tree"); fireEvent.focus(treeNode); @@ -73,7 +73,7 @@ it.only("expand nodes by pressing enter on it", async () => { expect(await screen.findAllByRole("treeitem")).toHaveLength(5); }); -it.only("expand nodes by pressing space on it", async () => { +it("expand nodes by pressing space on it", async () => { render(); const treeNode = await screen.findByRole("tree"); fireEvent.focus(treeNode); @@ -81,7 +81,7 @@ it.only("expand nodes by pressing space on it", async () => { expect(await screen.findAllByRole("treeitem")).toHaveLength(5); }); -it.only("use left right arrow to expand and collapse", async () => { +it("use left right arrow to expand and collapse", async () => { render(); const treeNode = await screen.findByRole("tree"); fireEvent.focus(treeNode); From ece2c0bb46df4f84d121b4d4a425947e04587c4d Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 3 Jul 2024 12:22:29 -0700 Subject: [PATCH 65/70] FIx --- packages/react-components/package.json | 1 + packages/react-components/src/hooks.ts | 15 --------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/packages/react-components/package.json b/packages/react-components/package.json index 7af20a7eaf..f8c312bbbe 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -1,6 +1,7 @@ { "name": "@typespec/react-components", "version": "0.57.0", + "private": true, "author": "Microsoft Corporation", "description": "TypeSpec library for emitting an html view of the program.", "homepage": "https://typespec.io", diff --git a/packages/react-components/src/hooks.ts b/packages/react-components/src/hooks.ts index 67b663642f..1d9201f0bb 100644 --- a/packages/react-components/src/hooks.ts +++ b/packages/react-components/src/hooks.ts @@ -50,18 +50,3 @@ export function useControllableValue( return [currentValue, setValueOrCallOnChange] as any; } - -export function useAsyncMemo( - callback: () => Promise, - defaultValue: T, - deps?: React.DependencyList -): T { - const [value, setValue] = useState(defaultValue); - useEffect(() => { - callback() - .then(setValue) - // eslint-disable-next-line no-console - .catch(() => console.error("Failed to load async memo")); - }, deps); - return value; -} From 6a13631a290b3363686bc7a28369fdd5016359ba Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 3 Jul 2024 12:22:57 -0700 Subject: [PATCH 66/70] Fix src/ --- packages/react-components/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-components/package.json b/packages/react-components/package.json index f8c312bbbe..ba8edf23fb 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -18,7 +18,7 @@ "typespec" ], "type": "module", - "main": "dist/src/index.js", + "main": "dist/index.js", "exports": { ".": { "types": "./dist/src/index.d.ts", From 52060a0941e2512f0c2ad008332f20eb8509ab32 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 3 Jul 2024 12:25:38 -0700 Subject: [PATCH 67/70] Fix --- packages/react-components/src/tree/tree.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-components/src/tree/tree.tsx b/packages/react-components/src/tree/tree.tsx index 85ee8f80b4..6aec8a9479 100644 --- a/packages/react-components/src/tree/tree.tsx +++ b/packages/react-components/src/tree/tree.tsx @@ -55,7 +55,7 @@ export function Tree({ expand(current); current = parentMap.get(current); } - }, [expand, selectedKey]); + }, [expand, selectedKey, parentMap]); const activateRow = useCallback( (row: TreeRow) => { setFocusedIndex(row.index); From 44c95845613345d8808ef85b57808a7888b170f8 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 3 Jul 2024 12:41:18 -0700 Subject: [PATCH 68/70] Some organization --- packages/html-program-viewer/package.json | 2 +- packages/html-program-viewer/tsconfig.json | 2 +- packages/react-components/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index e855753f93..bc30c2e35a 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -23,7 +23,7 @@ "default": "./dist/emitter/index.js" }, "./react": { - "types": "./dist/src/react/index.d.ts", + "types": "./dist/react/index.d.ts", "default": "./dist/react/index.js" }, "./style.css": "./dist/style.css" diff --git a/packages/html-program-viewer/tsconfig.json b/packages/html-program-viewer/tsconfig.json index 5be16e9413..4fac8c7da6 100644 --- a/packages/html-program-viewer/tsconfig.json +++ b/packages/html-program-viewer/tsconfig.json @@ -20,5 +20,5 @@ "lib": ["DOM", "ES2022"], "types": ["vite/client", "@testing-library/jest-dom"] }, - "include": ["src", "test/**/*.ts"] + "include": ["src"] } diff --git a/packages/react-components/package.json b/packages/react-components/package.json index ba8edf23fb..855e05c049 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -21,7 +21,7 @@ "main": "dist/index.js", "exports": { ".": { - "types": "./dist/src/index.d.ts", + "types": "./dist/index.d.ts", "default": "./dist/index.js" }, "./style.css": "./dist/style.css" From 26f903647ce7cdce6380f9a6c964ef036eb38cb5 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 3 Jul 2024 12:42:34 -0700 Subject: [PATCH 69/70] Fix version mismatch --- packages/html-program-viewer/package.json | 10 +- packages/react-components/package.json | 18 +- pnpm-lock.yaml | 5287 +++++---------------- 3 files changed, 1167 insertions(+), 4148 deletions(-) diff --git a/packages/html-program-viewer/package.json b/packages/html-program-viewer/package.json index bc30c2e35a..b24d256a71 100644 --- a/packages/html-program-viewer/package.json +++ b/packages/html-program-viewer/package.json @@ -51,8 +51,8 @@ "@typespec/compiler": "workspace:~" }, "dependencies": { - "@fluentui/react-components": "~9.52.0", - "@fluentui/react-icons": "^2.0.240", + "@fluentui/react-components": "~9.54.2", + "@fluentui/react-icons": "^2.0.247", "@fluentui/react-list-preview": "^0.2.8", "react": "~18.3.1", "react-dom": "~18.3.1", @@ -68,14 +68,14 @@ "@types/react-dom": "~18.3.0", "@typespec/compiler": "workspace:~", "@typespec/react-components": "workspace:~", - "@vitejs/plugin-react": "~4.2.1", + "@vitejs/plugin-react": "~4.3.1", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", "c8": "^10.1.2", "rimraf": "~5.0.7", "typescript": "~5.5.3", - "vite": "^5.2.11", - "vite-plugin-checker": "^0.6.4", + "vite": "^5.3.2", + "vite-plugin-checker": "^0.7.0", "vite-plugin-dts": "^3.9.1", "vitest": "^1.6.0" } diff --git a/packages/react-components/package.json b/packages/react-components/package.json index 855e05c049..461e93d80a 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -44,27 +44,27 @@ "!dist/test/**" ], "dependencies": { - "@fluentui/react-components": "~9.52.0", - "@fluentui/react-icons": "^2.0.240", + "@fluentui/react-components": "~9.54.2", + "@fluentui/react-icons": "^2.0.247", "react": "~18.3.1", "react-dom": "~18.3.1" }, "devDependencies": { - "@babel/core": "^7.24.5", + "@babel/core": "^7.24.7", "@testing-library/dom": "^10.2.0", "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^16.0.0", "@types/node": "~18.11.19", - "@types/react": "~18.3.2", + "@types/react": "~18.3.3", "@types/react-dom": "~18.3.0", - "@vitejs/plugin-react": "~4.2.1", + "@vitejs/plugin-react": "~4.3.1", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", - "c8": "^9.1.0", + "c8": "^10.1.2", "rimraf": "~5.0.7", - "typescript": "~5.4.5", - "vite": "^5.2.11", - "vite-plugin-checker": "^0.6.4", + "typescript": "~5.5.3", + "vite": "^5.3.2", + "vite-plugin-checker": "^0.7.0", "vite-plugin-dts": "^3.9.1", "vitest": "^1.6.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46dcaee56f..1cc016b7db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -378,11 +378,11 @@ importers: packages/html-program-viewer: dependencies: '@fluentui/react-components': - specifier: ~9.52.0 - version: 9.52.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + specifier: ~9.54.2 + version: 9.54.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': - specifier: ^2.0.240 - version: 2.0.240(react@18.3.1) + specifier: ^2.0.247 + version: 2.0.247(react@18.3.1) '@fluentui/react-list-preview': specifier: ^0.2.8 version: 0.2.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) @@ -424,8 +424,8 @@ importers: specifier: workspace:~ version: link:../react-components '@vitejs/plugin-react': - specifier: ~4.2.1 - version: 4.2.1(vite@5.2.11) + specifier: ~4.3.1 + version: 4.3.1(vite@5.3.3) '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0) @@ -442,14 +442,14 @@ importers: specifier: ~5.5.3 version: 5.5.3 vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@18.11.19) + specifier: ^5.3.2 + version: 5.3.3(@types/node@18.11.19) vite-plugin-checker: - specifier: ^0.6.4 - version: 0.6.4(eslint@8.57.0)(typescript@5.5.3)(vite@5.2.11) + specifier: ^0.7.0 + version: 0.7.0(eslint@8.57.0)(typescript@5.5.3)(vite@5.3.3) vite-plugin-dts: specifier: ^3.9.1 - version: 3.9.1(@types/node@18.11.19)(typescript@5.5.3)(vite@5.2.11) + version: 3.9.1(@types/node@18.11.19)(typescript@5.5.3)(vite@5.3.3) vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0) @@ -1037,11 +1037,11 @@ importers: packages/react-components: dependencies: '@fluentui/react-components': - specifier: ~9.52.0 - version: 9.52.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + specifier: ~9.54.2 + version: 9.54.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': - specifier: ^2.0.240 - version: 2.0.240(react@18.3.1) + specifier: ^2.0.247 + version: 2.0.247(react@18.3.1) react: specifier: ~18.3.1 version: 18.3.1 @@ -1050,8 +1050,8 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@babel/core': - specifier: ^7.24.5 - version: 7.24.5 + specifier: ^7.24.7 + version: 7.24.7 '@testing-library/dom': specifier: ^10.2.0 version: 10.2.0 @@ -1060,19 +1060,19 @@ importers: version: 6.4.6(vitest@1.6.0) '@testing-library/react': specifier: ^16.0.0 - version: 16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + version: 16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@types/node': specifier: ~18.11.19 version: 18.11.19 '@types/react': - specifier: ~18.3.2 - version: 18.3.2 + specifier: ~18.3.3 + version: 18.3.3 '@types/react-dom': specifier: ~18.3.0 version: 18.3.0 '@vitejs/plugin-react': - specifier: ~4.2.1 - version: 4.2.1(vite@5.2.11) + specifier: ~4.3.1 + version: 4.3.1(vite@5.3.3) '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0) @@ -1080,23 +1080,23 @@ importers: specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0) c8: - specifier: ^9.1.0 - version: 9.1.0 + specifier: ^10.1.2 + version: 10.1.2 rimraf: specifier: ~5.0.7 version: 5.0.7 typescript: - specifier: ~5.4.5 - version: 5.4.5 + specifier: ~5.5.3 + version: 5.5.3 vite: - specifier: ^5.2.11 - version: 5.2.11(@types/node@18.11.19) + specifier: ^5.3.2 + version: 5.3.3(@types/node@18.11.19) vite-plugin-checker: - specifier: ^0.6.4 - version: 0.6.4(eslint@8.57.0)(typescript@5.4.5)(vite@5.2.11) + specifier: ^0.7.0 + version: 0.7.0(eslint@8.57.0)(typescript@5.5.3)(vite@5.3.3) vite-plugin-dts: specifier: ^3.9.1 - version: 3.9.1(@types/node@18.11.19)(typescript@5.4.5)(vite@5.2.11) + version: 3.9.1(@types/node@18.11.19)(typescript@5.5.3)(vite@5.3.3) vitest: specifier: ^1.6.0 version: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0) @@ -1935,29 +1935,6 @@ packages: resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - /@babel/core@7.24.5: - resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) - '@babel/helpers': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/core@7.24.7: resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} @@ -1984,7 +1961,7 @@ packages: resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -2002,23 +1979,13 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 - - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 - lru-cache: 5.1.1 - semver: 6.3.1 + '@babel/types': 7.24.7 /@babel/helper-compilation-targets@7.24.7: resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} @@ -2038,13 +2005,13 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.7) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.7 semver: 6.3.1 /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.24.7): @@ -2064,8 +2031,8 @@ packages: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -2086,8 +2053,8 @@ packages: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 /@babel/helper-function-name@7.24.7: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} @@ -2100,7 +2067,7 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 /@babel/helper-hoist-variables@7.24.7: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} @@ -2112,13 +2079,14 @@ packages: resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 /@babel/helper-module-imports@7.24.3: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 + dev: false /@babel/helper-module-imports@7.24.7: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} @@ -2129,33 +2097,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - dev: true - - /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.7): - resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.24.5 - '@babel/helper-split-export-declaration': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 - /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} @@ -2175,16 +2116,11 @@ packages: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 - - /@babel/helper-plugin-utils@7.24.5: - resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.24.7 /@babel/helper-plugin-utils@7.24.7: resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.24.7): resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} @@ -2194,7 +2130,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-wrap-function': 7.22.20 /@babel/helper-replace-supers@7.24.1(@babel/core@7.24.7): @@ -2204,16 +2140,10 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - /@babel/helper-simple-access@7.24.5: - resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.5 - /@babel/helper-simple-access@7.24.7: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} @@ -2227,13 +2157,13 @@ packages: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 /@babel/helper-split-export-declaration@7.24.5: resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 /@babel/helper-split-export-declaration@7.24.7: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} @@ -2244,6 +2174,7 @@ packages: /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-string-parser@7.24.7: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} @@ -2252,6 +2183,7 @@ packages: /@babel/helper-validator-identifier@7.24.5: resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} engines: {node: '>=6.9.0'} + dev: true /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} @@ -2269,20 +2201,9 @@ packages: resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.24.0 - '@babel/types': 7.24.5 - - /@babel/helpers@7.24.5: - resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.5 - '@babel/types': 7.24.5 - transitivePeerDependencies: - - supports-color - dev: true + '@babel/helper-function-name': 7.24.7 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 /@babel/helpers@7.24.7: resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} @@ -2295,7 +2216,7 @@ packages: resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 @@ -2315,7 +2236,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 + dev: true /@babel/parser@7.24.7: resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} @@ -2331,8 +2253,8 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} @@ -2341,7 +2263,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} @@ -2350,7 +2272,7 @@ packages: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.24.5(@babel/core@7.24.7) @@ -2361,8 +2283,8 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.7): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} @@ -2378,7 +2300,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -2386,7 +2308,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} @@ -2395,7 +2317,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -2403,7 +2325,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -2411,7 +2333,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-flow@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-sxi2kLTI5DeW5vDtMUsk4mTPwvlUDbjOnoWayhynCwrw4QXRld4QEYwqzY8JmQXaJUtgUuCIurtSRH5sn4c7mA==} @@ -2420,7 +2342,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.24.7): @@ -2430,7 +2352,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} @@ -2439,7 +2361,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -2447,7 +2369,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -2455,7 +2377,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} @@ -2464,7 +2386,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -2472,7 +2394,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} @@ -2480,7 +2402,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} @@ -2488,7 +2410,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -2496,7 +2418,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -2504,7 +2426,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} @@ -2512,7 +2434,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} @@ -2521,7 +2443,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -2530,7 +2452,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} @@ -2539,7 +2461,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} @@ -2549,7 +2471,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} @@ -2558,7 +2480,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.24.7): resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} @@ -2567,8 +2489,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.7) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) @@ -2579,9 +2501,11 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} @@ -2590,7 +2514,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.24.7): resolution: {integrity: sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==} @@ -2599,7 +2523,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} @@ -2609,7 +2533,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-class-static-block@7.24.4(@babel/core@7.24.7): resolution: {integrity: sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==} @@ -2619,7 +2543,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.7) /@babel/plugin-transform-classes@7.24.5(@babel/core@7.24.7): @@ -2630,12 +2554,12 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.7) - '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.7 globals: 11.12.0 /@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.24.7): @@ -2645,8 +2569,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/template': 7.24.0 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/template': 7.24.7 /@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.24.7): resolution: {integrity: sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==} @@ -2655,7 +2579,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} @@ -2665,7 +2589,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} @@ -2674,7 +2598,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} @@ -2683,7 +2607,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.7) /@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.24.7): @@ -2694,7 +2618,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} @@ -2703,7 +2627,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.7) /@babel/plugin-transform-flow-strip-types@7.24.1(@babel/core@7.24.7): @@ -2713,7 +2637,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-flow': 7.24.1(@babel/core@7.24.7) dev: true @@ -2724,7 +2648,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 /@babel/plugin-transform-function-name@7.24.1(@babel/core@7.24.7): @@ -2734,9 +2658,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} @@ -2745,7 +2669,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) /@babel/plugin-transform-literals@7.24.1(@babel/core@7.24.7): @@ -2755,7 +2679,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} @@ -2764,7 +2688,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) /@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.24.7): @@ -2774,7 +2698,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} @@ -2783,8 +2707,10 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} @@ -2793,9 +2719,11 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-simple-access': 7.24.5 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} @@ -2804,10 +2732,12 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-identifier': 7.24.5 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} @@ -2816,8 +2746,10 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.24.7): resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} @@ -2827,7 +2759,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-new-target@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} @@ -2836,7 +2768,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} @@ -2845,7 +2777,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) /@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.24.7): @@ -2855,7 +2787,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) /@babel/plugin-transform-object-rest-spread@7.24.5(@babel/core@7.24.7): @@ -2865,8 +2797,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.24.7) @@ -2877,7 +2809,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.7) /@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.24.7): @@ -2887,7 +2819,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) /@babel/plugin-transform-optional-chaining@7.24.5(@babel/core@7.24.7): @@ -2897,7 +2829,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) @@ -2908,7 +2840,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} @@ -2918,7 +2850,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-private-property-in-object@7.24.5(@babel/core@7.24.7): resolution: {integrity: sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==} @@ -2929,7 +2861,7 @@ packages: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.7) /@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.24.7): @@ -2939,7 +2871,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-react-constant-elements@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==} @@ -2948,7 +2880,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: false /@babel/plugin-transform-react-display-name@7.24.1(@babel/core@7.24.7): @@ -2958,7 +2890,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: false /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.7): @@ -2969,18 +2901,10 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color dev: false - /@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.7): - resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 - dev: true - /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} @@ -2998,7 +2922,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.7): @@ -3009,11 +2933,13 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.7) - '@babel/types': 7.24.5 - dev: false + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color + dev: false /@babel/plugin-transform-react-pure-annotations@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==} @@ -3023,7 +2949,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 dev: false /@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.24.7): @@ -3033,7 +2959,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 regenerator-transform: 0.15.2 /@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.24.7): @@ -3043,7 +2969,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-runtime@7.24.3(@babel/core@7.24.7): resolution: {integrity: sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==} @@ -3053,7 +2979,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.24.7) babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.24.7) babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.24.7) @@ -3069,7 +2995,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-spread@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} @@ -3078,7 +3004,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 /@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.24.7): @@ -3088,7 +3014,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} @@ -3097,7 +3023,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-typeof-symbol@7.24.5(@babel/core@7.24.7): resolution: {integrity: sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==} @@ -3106,7 +3032,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-typescript@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==} @@ -3117,7 +3043,7 @@ packages: '@babel/core': 7.24.7 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.7) /@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.24.7): @@ -3127,7 +3053,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} @@ -3137,7 +3063,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} @@ -3147,7 +3073,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.24.7): resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} @@ -3157,7 +3083,7 @@ packages: dependencies: '@babel/core': 7.24.7 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.24.7) - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 /@babel/preset-env@7.24.5(@babel/core@7.24.7): resolution: {integrity: sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==} @@ -3167,8 +3093,8 @@ packages: dependencies: '@babel/compat-data': 7.24.4 '@babel/core': 7.24.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-validator-option': 7.23.5 '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.24.5(@babel/core@7.24.7) '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.24.7) @@ -3257,8 +3183,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/helper-validator-option': 7.23.5 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 '@babel/plugin-transform-flow-strip-types': 7.24.1(@babel/core@7.24.7) dev: true @@ -3268,8 +3194,8 @@ packages: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 - '@babel/types': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/types': 7.24.7 esutils: 2.0.3 /@babel/preset-react@7.24.1(@babel/core@7.24.7): @@ -3279,12 +3205,14 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-validator-option': 7.23.5 '@babel/plugin-transform-react-display-name': 7.24.1(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.7) '@babel/plugin-transform-react-pure-annotations': 7.24.1(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color dev: false /@babel/preset-typescript@7.24.1(@babel/core@7.24.7): @@ -3294,11 +3222,13 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-plugin-utils': 7.24.7 '@babel/helper-validator-option': 7.23.5 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.7) '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.7) '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color /@babel/register@7.23.7(@babel/core@7.24.7): resolution: {integrity: sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==} @@ -3331,14 +3261,6 @@ packages: dependencies: regenerator-runtime: 0.14.1 - /@babel/template@7.24.0: - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 - /@babel/template@7.24.7: resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} @@ -3352,13 +3274,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.5 + '@babel/generator': 7.24.7 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.24.5 - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -3388,6 +3310,7 @@ packages: '@babel/helper-string-parser': 7.24.1 '@babel/helper-validator-identifier': 7.24.5 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.24.7: resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} @@ -3857,9 +3780,9 @@ packages: resolution: {integrity: sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==} engines: {node: '>=18.0'} dependencies: - cssnano-preset-advanced: 6.1.2(postcss@8.4.38) - postcss: 8.4.38 - postcss-sort-media-queries: 5.2.0(postcss@8.4.38) + cssnano-preset-advanced: 6.1.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-sort-media-queries: 5.2.0(postcss@8.4.39) tslib: 2.6.2 dev: false @@ -5120,37 +5043,31 @@ packages: '@swc/helpers': 0.5.8 dev: false - /@fluentui/priority-overflow@9.1.12: - resolution: {integrity: sha512-uUIrdQ96LvheAREwrhlwwBNDu/Q3eT+2Sy9vC8qm7g5BjCQOP/WdHQGPgk6ywns55j1aKNOgE2Uq0jf+hk/JnQ==} - dependencies: - '@swc/helpers': 0.5.8 - dev: false - /@fluentui/priority-overflow@9.1.13: resolution: {integrity: sha512-yDojVpkhBZTXOYExrCgW1GXbw3x9pYIS617xlNJIc2t06Cd3H32y2p51QXFt94sBmlVyAvPu7UKBHaq1Yw7u+w==} dependencies: '@swc/helpers': 0.5.8 dev: false - /@fluentui/react-accordion@9.3.55(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-k2D4TxsnVUpxoykPLP1jtFAGPrQDGYwbEeHaY3J09ntKRQBRBJNzUoOLGtlXjTE6+dybq2LlW7RqyUCZBXga4g==} + /@fluentui/react-accordion@9.4.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-E7kAxMyxv1r2e5wWiXLgzDSyGSNgED4WAIRxCCVBCeNKLlNXw4zrRKFc1RmYZrgEiKjAqut/izrH+FVnhfz2Mw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5158,22 +5075,21 @@ packages: - scheduler dev: false - /@fluentui/react-accordion@9.3.55(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-k2D4TxsnVUpxoykPLP1jtFAGPrQDGYwbEeHaY3J09ntKRQBRBJNzUoOLGtlXjTE6+dybq2LlW7RqyUCZBXga4g==} + /@fluentui/react-alert@9.0.0-beta.124(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -5184,50 +5100,47 @@ packages: - scheduler dev: false - /@fluentui/react-accordion@9.4.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-E7kAxMyxv1r2e5wWiXLgzDSyGSNgED4WAIRxCCVBCeNKLlNXw4zrRKFc1RmYZrgEiKjAqut/izrH+FVnhfz2Mw==} + /@fluentui/react-aria@9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-zn0AiOafvjbtoY5KbAxdi785LDo68ezR6p5zAnE9fk3v5tnbkJwMo8Nqp1E7bCXg4Y7h+JhsLtl7he9DkWdIPQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/keyboard-keys': 9.0.7 '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-alert@9.0.0-beta.122(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-TFnOdWlKDufHlprD4Ng2x0LZ37XWV5IjofkCVzgCkf/hOvVD1POZ61IL+22q56+ShAP/qYA9MoufjMbzhZKv9w==} + /@fluentui/react-avatar@9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-Wn1anJB9M7IqoGex1/v2q+tc4etuCXJVNltm1IvHUulj4n4q5LS5IdXX7Td7OXBA8SA2BsgL/N84WFNh36wb8g==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-badge': 9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-tooltip': 9.4.32(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5235,43 +5148,41 @@ packages: - scheduler dev: false - /@fluentui/react-alert@9.0.0-beta.122(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-TFnOdWlKDufHlprD4Ng2x0LZ37XWV5IjofkCVzgCkf/hOvVD1POZ61IL+22q56+ShAP/qYA9MoufjMbzhZKv9w==} + /@fluentui/react-badge@9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-TfcEqk+t0DwQFy6rl6Nnijpsu3EgjZGWcHYrQDeSfCBs6qQRTZFkU+OyZKBwVw9WcTyuO2Kx5oIPMG3bHDT6jw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-alert@9.0.0-beta.124(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-yFBo3B5H9hnoaXxlkuz8wRz04DEyQ+ElYA/p5p+Vojf19Zuta8DmFZZ6JtWdtxcdnnQ4LvAfC5OYYlzdReozPA==} + /@fluentui/react-breadcrumb@9.0.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-/OQtIVPpjkgBmmG/MM+aIr9i3a1jGsDVn5nkF9YeJrMyNBzVNHE7d5HhTJJfr900xnQNg+T6ofvhH0XxKkC3pw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-link': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) @@ -5281,32 +5192,10 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-aria@9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-DKZ4bY7aVwW2RKusGABNhbE6C56ttWGWs34gH82RuzUmqdKcYwp62DiCqz/gV42zAdzLb7PZUGnJEQctKxMbpA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-aria@9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-DKZ4bY7aVwW2RKusGABNhbE6C56ttWGWs34gH82RuzUmqdKcYwp62DiCqz/gV42zAdzLb7PZUGnJEQctKxMbpA==} + /@fluentui/react-button@9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-2ha0oPDTWsS8cEJ59hU9O7KlBT4ySlk/04B7j9gZJRNSqeLrzckxWMl/DiuA6xomHquniBcCpgOkOQFlFS0z8w==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -5314,10 +5203,14 @@ packages: react-dom: '>=16.14.0 <19.0.0' dependencies: '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 @@ -5325,8 +5218,8 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-aria@9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-zn0AiOafvjbtoY5KbAxdi785LDo68ezR6p5zAnE9fk3v5tnbkJwMo8Nqp1E7bCXg4Y7h+JhsLtl7he9DkWdIPQ==} + /@fluentui/react-card@9.0.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bhH1vHahdG8c0etwICTBXqkhfvW7GEv6NihPOIgPdBbJ1ivdKeNOhSC2S6QUcBxi3KHRQKRaMQWI4Ipko+Qg7A==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -5334,58 +5227,63 @@ packages: react-dom: '>=16.14.0 <19.0.0' dependencies: '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-aria@9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-zn0AiOafvjbtoY5KbAxdi785LDo68ezR6p5zAnE9fk3v5tnbkJwMo8Nqp1E7bCXg4Y7h+JhsLtl7he9DkWdIPQ==} + /@fluentui/react-checkbox@9.2.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-s/pG0usH2/bJqXFZMyi114gDBDVpl/ExUeU91cgZVK3oHjbYNA7O67JZkfnV/k2y0yGOF3HJ43FdSZ6nrs+BFQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-field': 9.1.67(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-theme': 9.1.17 + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) + '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-avatar@9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-l79O7bsE0yXSL/7EscDXEfpvX2jddx61xffFmtRUfjQftSoGg/zrzFynFDO/3ZsgYQzRWqvLsdrEskYKBeH/9A==} + /@fluentui/react-checkbox@9.2.30(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-WR4c0CEinWHMq/yWaLJXMAEyehIFZNtkUZi0l2QA/W6jIhjONE/bR/35yQRkDQXnUl7OTdkmh50cI+i8I9up1w==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-badge': 9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-tooltip': 9.4.28(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -5393,24 +5291,26 @@ packages: - scheduler dev: false - /@fluentui/react-avatar@9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-l79O7bsE0yXSL/7EscDXEfpvX2jddx61xffFmtRUfjQftSoGg/zrzFynFDO/3ZsgYQzRWqvLsdrEskYKBeH/9A==} + /@fluentui/react-combobox@9.12.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-NrE6wpzlz1d6JK2uEosrSVlZ+3b/yqHUsGe1fUTen8ballRFRv8zn7DVH/HYAKjW9CKuzQAls8dnTpAtpAkaFg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-badge': 9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-tooltip': 9.4.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -5421,24 +5321,70 @@ packages: - scheduler dev: false - /@fluentui/react-avatar@9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-Wn1anJB9M7IqoGex1/v2q+tc4etuCXJVNltm1IvHUulj4n4q5LS5IdXX7Td7OXBA8SA2BsgL/N84WFNh36wb8g==} + /@fluentui/react-components@9.54.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-MmaGDeEDVZ7mRxfmKRM8QCjius31qOhL8MtSWeats1EY9ilDi3hKidWpk3U4qCjXXjAXfZ1zc49TtV3k1l4rMg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: + '@fluentui/react-accordion': 9.4.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-alert': 9.0.0-beta.124(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-badge': 9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-breadcrumb': 9.0.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-card': 9.0.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-checkbox': 9.2.30(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-combobox': 9.12.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-dialog': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-divider': 9.2.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-drawer': 9.5.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-image': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-infolabel': 9.0.38(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-input': 9.4.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-link': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-menu': 9.14.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-message-bar': 9.2.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-motion': 9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-overflow': 9.1.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-persona': 9.2.90(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-progress': 9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-provider': 9.16.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-radio': 9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-rating': 9.0.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-search': 9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-select': 9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-skeleton': 9.1.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-slider': 9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-spinbutton': 9.2.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-spinner': 9.4.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-swatch-picker': 9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-switch': 9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-table': 9.15.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-tabs': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tag-picker': 9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-tags': 9.3.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-teaching-popover': 9.1.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-text': 9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-textarea': 9.3.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-theme': 9.1.17 + '@fluentui/react-toast': 9.3.48(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-toolbar': 9.1.88(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-tooltip': 9.4.32(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tree': 9.7.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-virtualizer': 9.0.0-alpha.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -5449,194 +5395,44 @@ packages: - scheduler dev: false - /@fluentui/react-badge@9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-JK3ClcnamUZgVF9qTIVcWl8lKxWTjfS8WWL9rlAU+8OzHq0VPBfKlY8lfPjJ2Bp7viLNIopob/hciXhL1PZ3yA==} + /@fluentui/react-context-selector@9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-9I3WMQU3CZODngO/lYdIbS8gA7c5lpvHtoPqSwINfdKDxF3XsnSCxhBBeQ7rurxPD23eqVK9wlZq2JD2DN9iLg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' + scheduler: '>=0.19.0 <=0.23.0' dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + scheduler: 0.23.0 dev: false - /@fluentui/react-badge@9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-JK3ClcnamUZgVF9qTIVcWl8lKxWTjfS8WWL9rlAU+8OzHq0VPBfKlY8lfPjJ2Bp7viLNIopob/hciXhL1PZ3yA==} + /@fluentui/react-context-selector@9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-XxyeRmRmhH2DQanXvVQZJqxauXp/wGS5Ve/6Y0Iey2S412myUYzxnGckUOUbVpaKh2sG0P2rXboUUQ6ey2C3eQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' + scheduler: '>=0.19.0 <=0.23.0' dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + scheduler: 0.23.0 dev: false - /@fluentui/react-badge@9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-TfcEqk+t0DwQFy6rl6Nnijpsu3EgjZGWcHYrQDeSfCBs6qQRTZFkU+OyZKBwVw9WcTyuO2Kx5oIPMG3bHDT6jw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-breadcrumb@9.0.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-7kyW1wUeUdz2k3ERfSvFe0eqXtGGNK5xkymgvfZyJ3cfs9WDac4HeeSdrisHEFSXpTqJxpmWn4dUQN9hCJqgHQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-link': 9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-breadcrumb@9.0.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-7kyW1wUeUdz2k3ERfSvFe0eqXtGGNK5xkymgvfZyJ3cfs9WDac4HeeSdrisHEFSXpTqJxpmWn4dUQN9hCJqgHQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-link': 9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-breadcrumb@9.0.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-/OQtIVPpjkgBmmG/MM+aIr9i3a1jGsDVn5nkF9YeJrMyNBzVNHE7d5HhTJJfr900xnQNg+T6ofvhH0XxKkC3pw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-link': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-button@9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-YC39VB6AiEJ0NAVVwxBtY70NJu4rWU7u5nHSkBwJ/XDZw9XP5P8hhQCWrEM/2+KG5YZ+Vp1CrASaUuFEAklkrA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-button@9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-YC39VB6AiEJ0NAVVwxBtY70NJu4rWU7u5nHSkBwJ/XDZw9XP5P8hhQCWrEM/2+KG5YZ+Vp1CrASaUuFEAklkrA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-button@9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-2ha0oPDTWsS8cEJ59hU9O7KlBT4ySlk/04B7j9gZJRNSqeLrzckxWMl/DiuA6xomHquniBcCpgOkOQFlFS0z8w==} + /@fluentui/react-dialog@9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-SdmKZMxPIoasZsIyFDVP1GT/7lNmDf+aW47e47XROgeYnJVUWjTdUpOdg9lmCWhKynUPoXpDj+lgHOZuXpjkog==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -5645,8 +5441,11 @@ packages: dependencies: '@fluentui/keyboard-keys': 9.0.7 '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-motion': 9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 @@ -5657,161 +5456,41 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-card@9.0.80(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-BHbHiQJrkSfGZMiTpIcFwJ08U0Pj6ryyroBwdNiQQ+K/T1OjPfhL038GxguJUYQCntyNVCzJbvzOnD8hHuI3ew==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-card@9.0.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-BHbHiQJrkSfGZMiTpIcFwJ08U0Pj6ryyroBwdNiQQ+K/T1OjPfhL038GxguJUYQCntyNVCzJbvzOnD8hHuI3ew==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-card@9.0.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-bhH1vHahdG8c0etwICTBXqkhfvW7GEv6NihPOIgPdBbJ1ivdKeNOhSC2S6QUcBxi3KHRQKRaMQWI4Ipko+Qg7A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-checkbox@9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-jTH0IckTgn64AOGip7CyavgNSFxNcAR2QgBXO32NNCDF7rpLAq5X2jd3VIG7AYi4uVfnFNxBLNwS7NBVfz22dw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-checkbox@9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-jTH0IckTgn64AOGip7CyavgNSFxNcAR2QgBXO32NNCDF7rpLAq5X2jd3VIG7AYi4uVfnFNxBLNwS7NBVfz22dw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler dev: false - /@fluentui/react-checkbox@9.2.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-s/pG0usH2/bJqXFZMyi114gDBDVpl/ExUeU91cgZVK3oHjbYNA7O67JZkfnV/k2y0yGOF3HJ43FdSZ6nrs+BFQ==} + /@fluentui/react-divider@9.2.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-v262PqaTEmR06oglIZj41a3+Onapw6U8Ke6iRQeDHks4+BDxk+epFcBRM5OA4XBTGrDAGGDL5+os+9sicHpkfg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.67(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-checkbox@9.2.30(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-WR4c0CEinWHMq/yWaLJXMAEyehIFZNtkUZi0l2QA/W6jIhjONE/bR/35yQRkDQXnUl7OTdkmh50cI+i8I9up1w==} + /@fluentui/react-drawer@9.5.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-jXbzM/pQyQnH7GrnuAxUpUE34eRtjSvBZE2sFDninYdsK4gcA4ulxZAa2YEh1uFL/KDt7TyHlaAU2QN8pFX0ww==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-dialog': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-motion-preview': 0.5.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 @@ -5826,2561 +5505,18 @@ packages: - scheduler dev: false - /@fluentui/react-combobox@9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-O8g2R4/MQJrx3Bk8vCfzcgKoIY1dL6X4CJgBO8xArZ6vAEDxSgXQoDgY1PwnutJEFBsbC3d0BsAfjhhateNItg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-combobox@9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-O8g2R4/MQJrx3Bk8vCfzcgKoIY1dL6X4CJgBO8xArZ6vAEDxSgXQoDgY1PwnutJEFBsbC3d0BsAfjhhateNItg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-combobox@9.12.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-NrE6wpzlz1d6JK2uEosrSVlZ+3b/yqHUsGe1fUTen8ballRFRv8zn7DVH/HYAKjW9CKuzQAls8dnTpAtpAkaFg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-components@9.52.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-x+ZcMxEbDDfnwJftSvNG2EKjZw6p+lVX3ItZ0ynGLNnbhIupV5dfCxoIk4mxHTGKG34SCNbuvZt9YO7O+VX/AQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-accordion': 9.3.55(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-alert': 9.0.0-beta.122(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-badge': 9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-breadcrumb': 9.0.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-card': 9.0.80(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-checkbox': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-combobox': 9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-dialog': 9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-divider': 9.2.69(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-drawer': 9.3.2(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-image': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-infolabel': 9.0.34(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-input': 9.4.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-link': 9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-menu': 9.14.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-message-bar': 9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-overflow': 9.1.20(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-persona': 9.2.86(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-progress': 9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-provider': 9.16.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-rating': 9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-search': 9.0.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-select': 9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-skeleton': 9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-slider': 9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-spinbutton': 9.2.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-spinner': 9.4.8(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-swatch-picker': 9.1.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-switch': 9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-table': 9.15.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabs': 9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tag-picker': 9.0.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tags': 9.3.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-teaching-popover': 9.1.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-text': 9.4.18(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-textarea': 9.3.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-toast': 9.3.43(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-toolbar': 9.1.84(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tooltip': 9.4.28(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tree': 9.5.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-virtualizer': 9.0.0-alpha.78(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-components@9.52.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-x+ZcMxEbDDfnwJftSvNG2EKjZw6p+lVX3ItZ0ynGLNnbhIupV5dfCxoIk4mxHTGKG34SCNbuvZt9YO7O+VX/AQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-accordion': 9.3.55(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-alert': 9.0.0-beta.122(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-badge': 9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-breadcrumb': 9.0.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-card': 9.0.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-checkbox': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-combobox': 9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-dialog': 9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-divider': 9.2.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-drawer': 9.3.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-image': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-infolabel': 9.0.34(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-input': 9.4.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-link': 9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-menu': 9.14.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-message-bar': 9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-overflow': 9.1.20(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-persona': 9.2.86(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-progress': 9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-provider': 9.16.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-rating': 9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-search': 9.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-select': 9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-skeleton': 9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-slider': 9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-spinbutton': 9.2.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-spinner': 9.4.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-swatch-picker': 9.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-switch': 9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-table': 9.15.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabs': 9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tag-picker': 9.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tags': 9.3.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-teaching-popover': 9.1.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-text': 9.4.18(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-textarea': 9.3.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-toast': 9.3.43(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-toolbar': 9.1.84(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tooltip': 9.4.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tree': 9.5.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-virtualizer': 9.0.0-alpha.78(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-components@9.54.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-MmaGDeEDVZ7mRxfmKRM8QCjius31qOhL8MtSWeats1EY9ilDi3hKidWpk3U4qCjXXjAXfZ1zc49TtV3k1l4rMg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-accordion': 9.4.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-alert': 9.0.0-beta.124(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-badge': 9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-breadcrumb': 9.0.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-card': 9.0.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-checkbox': 9.2.30(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-combobox': 9.12.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-dialog': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-divider': 9.2.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-drawer': 9.5.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-image': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-infobutton': 9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-infolabel': 9.0.38(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-input': 9.4.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-link': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-menu': 9.14.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-message-bar': 9.2.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-motion': 9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-overflow': 9.1.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-persona': 9.2.90(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-progress': 9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-provider': 9.16.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-radio': 9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-rating': 9.0.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-search': 9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-select': 9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-skeleton': 9.1.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-slider': 9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-spinbutton': 9.2.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-spinner': 9.4.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-swatch-picker': 9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-switch': 9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-table': 9.15.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabs': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tag-picker': 9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tags': 9.3.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-teaching-popover': 9.1.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-text': 9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-textarea': 9.3.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-toast': 9.3.48(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-toolbar': 9.1.88(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tooltip': 9.4.32(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tree': 9.7.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-virtualizer': 9.0.0-alpha.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-context-selector@9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-gm93NSABCVKw6pw9PGd4M5aJUIVrI6u/HlyqBKLB7HjBZwa1RwdNH9PghUJ2TSjfhS8V00Rkt28nCqEwz34Dlw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scheduler: 0.23.0 - dev: false - - /@fluentui/react-context-selector@9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-gm93NSABCVKw6pw9PGd4M5aJUIVrI6u/HlyqBKLB7HjBZwa1RwdNH9PghUJ2TSjfhS8V00Rkt28nCqEwz34Dlw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scheduler: 0.23.0 - dev: false - - /@fluentui/react-context-selector@9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-9I3WMQU3CZODngO/lYdIbS8gA7c5lpvHtoPqSwINfdKDxF3XsnSCxhBBeQ7rurxPD23eqVK9wlZq2JD2DN9iLg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scheduler: 0.23.0 - dev: false - - /@fluentui/react-context-selector@9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-XxyeRmRmhH2DQanXvVQZJqxauXp/wGS5Ve/6Y0Iey2S412myUYzxnGckUOUbVpaKh2sG0P2rXboUUQ6ey2C3eQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' - dependencies: - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scheduler: 0.23.0 - dev: false - - /@fluentui/react-context-selector@9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-XxyeRmRmhH2DQanXvVQZJqxauXp/wGS5Ve/6Y0Iey2S412myUYzxnGckUOUbVpaKh2sG0P2rXboUUQ6ey2C3eQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - scheduler: '>=0.19.0 <=0.23.0' - dependencies: - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - scheduler: 0.23.0 - dev: false - - /@fluentui/react-dialog@9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-E/vcXe7s+hUyz8pQsUMGwVJFA/B9U4L2yOestTIGshj9kY/ijJxbgagr7M8/58rGHeiPPqxhaIuQA8SMtwni8w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-dialog@9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-E/vcXe7s+hUyz8pQsUMGwVJFA/B9U4L2yOestTIGshj9kY/ijJxbgagr7M8/58rGHeiPPqxhaIuQA8SMtwni8w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-dialog@9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-SdmKZMxPIoasZsIyFDVP1GT/7lNmDf+aW47e47XROgeYnJVUWjTdUpOdg9lmCWhKynUPoXpDj+lgHOZuXpjkog==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-motion': 9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-divider@9.2.69(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-D1ajELLS8F7N7rWLRlNCtZa/JhfsTqKC5jYpWYbUZPkYS9VxetPaO3hjcmAOrK5ycqYkUv/zsU7wbnTSIkSEOA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-divider@9.2.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-D1ajELLS8F7N7rWLRlNCtZa/JhfsTqKC5jYpWYbUZPkYS9VxetPaO3hjcmAOrK5ycqYkUv/zsU7wbnTSIkSEOA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-divider@9.2.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-v262PqaTEmR06oglIZj41a3+Onapw6U8Ke6iRQeDHks4+BDxk+epFcBRM5OA4XBTGrDAGGDL5+os+9sicHpkfg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-drawer@9.3.2(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-Lrzg63l4pi44BxY+N3ivUCW5zSsorRHfCaP/T5L67p6STc4+QQjHeJGXo2X7cR8Xhu2CUUdmBkZ80a/9W9K0gg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-dialog': 9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-motion-preview': 0.5.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-drawer@9.3.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-Lrzg63l4pi44BxY+N3ivUCW5zSsorRHfCaP/T5L67p6STc4+QQjHeJGXo2X7cR8Xhu2CUUdmBkZ80a/9W9K0gg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-dialog': 9.10.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-motion-preview': 0.5.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-drawer@9.5.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-jXbzM/pQyQnH7GrnuAxUpUE34eRtjSvBZE2sFDninYdsK4gcA4ulxZAa2YEh1uFL/KDt7TyHlaAU2QN8pFX0ww==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-dialog': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-motion-preview': 0.5.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-field@9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-9dzn2GU/ttbK1QuS6VqbACFhFFs0IHRniCgqcufxIXLbcdze0NmyALJb6X6DRAlgunTlM4UDrD6CNB2cv0B08A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-field@9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-9dzn2GU/ttbK1QuS6VqbACFhFFs0IHRniCgqcufxIXLbcdze0NmyALJb6X6DRAlgunTlM4UDrD6CNB2cv0B08A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-field@9.1.67(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-yLcsVeff7cg5o5zGYlaElj+OMfePaen3h7ndr+K6o5qSxvQvm7mWz79DoKsjIp03gMVF0HsBxpI7K69y+HGVjg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-context-selector': 9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-field@9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-AwylrrZthfgMLDQcgwPWpq7buEeZJAsdnR2ovlhRXoC3md1zpBkAjt640Om0UXNJcSu7FWIlZVaOsgWIi+mU9A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-icons@2.0.240(react@18.3.1): - resolution: {integrity: sha512-vvYAA5bKImFedfRWnlady/Imdz45lGpKyPhNXZVpDoKX1yub/QNtSlH9XctynteQt8cEyvzPtHPXZBgxDTtDlw==} - peerDependencies: - react: '>=16.8.0 <19.0.0' - dependencies: - '@griffel/react': 1.5.22(react@18.3.1) - react: 18.3.1 - tslib: 2.6.2 - dev: false - - /@fluentui/react-icons@2.0.247(react@18.3.1): - resolution: {integrity: sha512-w5KQb0xBcqBwXB0jNCKQnMjllxlkLTpDICQYBqM0QXI7lEtEWQ/4IyPiocdJ+aBYVrSbI5d8rTqvHvYsFUYXmg==} - peerDependencies: - react: '>=16.8.0 <19.0.0' - dependencies: - '@griffel/react': 1.5.22(react@18.3.1) - react: 18.3.1 - tslib: 2.6.2 - dev: false - - /@fluentui/react-image@9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-5nd644/IIqq0ehXVyY2VGq9RGCMbB0YuxaW1EHqCfhEsDBxATjyQHuLRmP5RIZh0g0p7kHVQ2N0aVhH+WDSm/Q==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-image@9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-5nd644/IIqq0ehXVyY2VGq9RGCMbB0YuxaW1EHqCfhEsDBxATjyQHuLRmP5RIZh0g0p7kHVQ2N0aVhH+WDSm/Q==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-image@9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-bQ7suwNrGb+FSVaL44e7CgZmjeJ8ZI5KS5q8RyW21/oc+hKDxQrB52ahQdzfWsh07CGzZ8tCgfLu+sOaOKppGQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-infolabel@9.0.34(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-0tI9wDEHAe3V6lZC64h/6EW3IaLQg/uv2u0gUqSHHwOr7uC8+p08Iqm2xWhZWOL+u+1+hejBW0qqVYy3vur+Yg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-infolabel@9.0.34(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-0tI9wDEHAe3V6lZC64h/6EW3IaLQg/uv2u0gUqSHHwOr7uC8+p08Iqm2xWhZWOL+u+1+hejBW0qqVYy3vur+Yg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-infolabel@9.0.38(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-gFKYlzJ9BXQWtNjhIsfZSL+lB3yzwKE+OPjgDmoSaBP3ozW2PPDGY2dZG7BwJ0oWNoubqeKeNj/mC6d4zL4HWg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-input@9.4.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-6ZrnkDm/nwiQn61iuTHEs5+y7duek6eC/Rp5CzWa5alNCgoJ8O5AzZ1G8NWrhAcn8Qu4rh+IJHckS+p3ScjnUA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-input@9.4.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-6ZrnkDm/nwiQn61iuTHEs5+y7duek6eC/Rp5CzWa5alNCgoJ8O5AzZ1G8NWrhAcn8Qu4rh+IJHckS+p3ScjnUA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-input@9.4.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-++a84fgrwom6FLYALiwxBNiJMow9ZIQOzbrM+9RTGozfjj74lQ6bnBU9dmKKTalWZAuwSYHO6jaM+xlrrVjY8A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-jsx-runtime@9.0.38(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-4HGwWshavd9H+SyEkxPriPZLFz7QRa4YMzYi3ibBI0q2iiZZw8wQ3otuM/Pf8xxamJgYpnDl3mAesJU+3hFANw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - react-is: 17.0.2 - dev: false - - /@fluentui/react-jsx-runtime@9.0.38(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-4HGwWshavd9H+SyEkxPriPZLFz7QRa4YMzYi3ibBI0q2iiZZw8wQ3otuM/Pf8xxamJgYpnDl3mAesJU+3hFANw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - react: 18.3.1 - react-is: 17.0.2 - dev: false - - /@fluentui/react-jsx-runtime@9.0.39(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-mfK3L68Gfu9rMkfg1iVT06rOOPeOZasy+nKJID451YfKiAQYy1Zy9bhaTRDoNrOQcu2jDEOZAxAPURZw5oGLtw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - react-is: 17.0.2 - dev: false - - /@fluentui/react-jsx-runtime@9.0.39(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-mfK3L68Gfu9rMkfg1iVT06rOOPeOZasy+nKJID451YfKiAQYy1Zy9bhaTRDoNrOQcu2jDEOZAxAPURZw5oGLtw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - react: 18.3.1 - react-is: 17.0.2 - dev: false - - /@fluentui/react-jsx-runtime@9.0.40(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-3QF4f6LezBWGoRgeo287A8jey3aSW0Xxewxgzdh5si7KeJt7CO9Pz90QJhz+PRKC6Q6C+zSGyinTUCpQtYr70A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - react-is: 17.0.2 - dev: false - - /@fluentui/react-jsx-runtime@9.0.40(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-3QF4f6LezBWGoRgeo287A8jey3aSW0Xxewxgzdh5si7KeJt7CO9Pz90QJhz+PRKC6Q6C+zSGyinTUCpQtYr70A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - react: 18.3.1 - react-is: 17.0.2 - dev: false - - /@fluentui/react-label@9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-dYsx4w9Hk8VAhyt7ZU88u1eIbpchtmr0sEVSgXEVevtUo4R4mT5UnOESsUwLT4wMY0sevBm5AoXbNsnoPutQQg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-label@9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-dYsx4w9Hk8VAhyt7ZU88u1eIbpchtmr0sEVSgXEVevtUo4R4mT5UnOESsUwLT4wMY0sevBm5AoXbNsnoPutQQg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-label@9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-PkzRsl86+AkSn6p26C0Y2AV4IxYUhbBV+lFNSwN/hVgiXwMVdUjPOZx4Nm4Fnvv5ctt/BVuaE0dB/nSSDsrnQw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-label@9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-msEymXx2qpWutqYBKS8ZM2dRi59Fau3sz5nX2tUrqcrf3g1s8guhjGN4a54DgvhfkvIp3QWyXH3tUD8ddANnxg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-label@9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-msEymXx2qpWutqYBKS8ZM2dRi59Fau3sz5nX2tUrqcrf3g1s8guhjGN4a54DgvhfkvIp3QWyXH3tUD8ddANnxg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-link@9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-77ef/PM1G+8dHq3LNFvjM5kWu8mS65eoxAtyfwbKAJRNfrtKFc1XrTBOcnqipXAqEPilQ+vgpgz/i0ziFVPvHQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-link@9.2.22(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-77ef/PM1G+8dHq3LNFvjM5kWu8mS65eoxAtyfwbKAJRNfrtKFc1XrTBOcnqipXAqEPilQ+vgpgz/i0ziFVPvHQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-link@9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-CFv/KzRrqmQLKOSVj2cW2sL90eQvG5XRI8xhP8FIwxLoS0MwQiAFIUTaG1bkqXnZj2QmlT7zOyHFVRGeBLzRbw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-list-preview@0.2.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-M2nc/XvdeI0X1SWEDmOfRlzWozkrR39NuVvMJIWhif3OyeGFYNVSSpy/XEynU7WwONJl+gw9e4ftkfsB9g/USg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-checkbox': 9.2.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-menu@9.14.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-JelsSR1s5hUKaTSd/TqkKtKaTpiJ+bKHmKefoQ+xBDslwBngMMMVRo7rAQmdoGQwVeky44f3YsoMgD+re/8QdA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-menu@9.14.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-JelsSR1s5hUKaTSd/TqkKtKaTpiJ+bKHmKefoQ+xBDslwBngMMMVRo7rAQmdoGQwVeky44f3YsoMgD+re/8QdA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-menu@9.14.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-oa/7Fmsvs+G87HeURzC7PW7FbhOTMnkhYn3dp5Vcw+gxmuIfu+SGYTcdoYe6p67Ci4WlDguMBgzmXoNEG9d0sQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-message-bar@9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-47i2QIPpt8JlumnGO+rUYDVpeIjyQ96no4LSPhclrIltFO+znse6gkub2TMBVLc1E7lfWGnlEMVKOEMWD+u4kg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-message-bar@9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-47i2QIPpt8JlumnGO+rUYDVpeIjyQ96no4LSPhclrIltFO+znse6gkub2TMBVLc1E7lfWGnlEMVKOEMWD+u4kg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-message-bar@9.2.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Bo5xBpmZHzD/mtsIwY4cOCMmswu1jvhtZlW07SO4aV9hvADlmuv+h9zl5dVQmoV5lHJRvDAcIPLC0pw/X9vsKA==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-motion-preview@0.5.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-I2Lj1RFrq9yVKxYlKrbE7SeluZo08eJrs8S5pL6OVxXJND0avW7pFF2ZOs3EsABW1clcp1S55IgJ9D6nVlnbvw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-motion-preview@0.5.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-I2Lj1RFrq9yVKxYlKrbE7SeluZo08eJrs8S5pL6OVxXJND0avW7pFF2ZOs3EsABW1clcp1S55IgJ9D6nVlnbvw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-motion-preview@0.5.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-8JQPIWCB4u9DVXVtWpDbdEeEck2VgK2RgoYq8M1bF6rwOAAd1Vqkxlqlply3gryYYvnsy2cdTki8bntfiwhbzQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-motion@9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-A7WOoytc33TdvE1OarDsjQF/Sjr5sDRblTRZbJFgZ/vxOY/zucGb6iT+kjD0K14X6BuINTDF2ItvXEooih1xFA==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 17.0.2 - dev: false - - /@fluentui/react-overflow@9.1.20(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-dBIzGF+beNxNUlVFtYaTDFCOIERMrAlDmvvGf35pV+/rQTsgTYqqB9xEl9L8VNHbgb5bt7ApSMPEZBaA6Rna4A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/priority-overflow': 9.1.12 - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-overflow@9.1.20(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-dBIzGF+beNxNUlVFtYaTDFCOIERMrAlDmvvGf35pV+/rQTsgTYqqB9xEl9L8VNHbgb5bt7ApSMPEZBaA6Rna4A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/priority-overflow': 9.1.12 - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-overflow@9.1.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-zx2Nh5dOeg9rH1OEhinlkbNpxwvKsyHe7wAdnGy8T70+N0crL8znAUUrpngyB7jdb4H2xLm4xnYoUOzsKcZp/Q==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/priority-overflow': 9.1.13 - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-persona@9.2.86(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-mlVWKcy5puQH46bB7zpli8YcbeUvzuEbn3R9+A3uX8HIQbVXsMoObSmB5K7ct0Bsw9kytvxMI0xufMGB4anR9w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-badge': 9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-persona@9.2.86(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-mlVWKcy5puQH46bB7zpli8YcbeUvzuEbn3R9+A3uX8HIQbVXsMoObSmB5K7ct0Bsw9kytvxMI0xufMGB4anR9w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-badge': 9.2.36(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-persona@9.2.90(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-roQ92Fl2eW5XsUFhvo6fRPixYxyIPcbRm0wZyHnb6Tl5WcKZao/ayLKH414leDVtgjTbfpw0if+qx0ipLiBsvA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-badge': 9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-popover@9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-ktym1lY5Y0kgYuUYW0kvfnH3hlK4izJ4HM0kikO+hyIIys/iv41o+9lhj8sIbHCKPnkOL9fnTs98pgzffms04A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-popover@9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-ktym1lY5Y0kgYuUYW0kvfnH3hlK4izJ4HM0kikO+hyIIys/iv41o+9lhj8sIbHCKPnkOL9fnTs98pgzffms04A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-popover@9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-mDROFucfX/aNquI6kvO0mj2kkyJZvDtpim9cPvsDQqc0ZHRKvBycU3GXKf0owtpmQQzzrZmOSKCp2+8le2DW+w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-popover@9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-mDROFucfX/aNquI6kvO0mj2kkyJZvDtpim9cPvsDQqc0ZHRKvBycU3GXKf0owtpmQQzzrZmOSKCp2+8le2DW+w==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-portal@9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wPVfEWrPPtrkaGCl7ZV10FcXTaMkzVA8mw8ZkV94lpWKT6aBLIUYYB40lDG1FbCdSQsY2Nof/Mcvruu/vX51dw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-disposable: 1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-portal@9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wPVfEWrPPtrkaGCl7ZV10FcXTaMkzVA8mw8ZkV94lpWKT6aBLIUYYB40lDG1FbCdSQsY2Nof/Mcvruu/vX51dw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-disposable: 1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-portal@9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-1rhJ2u3PUCPpASSqrRCsLFZmkjxb3gEl8pNkKluudRwCu21rsG+HZUAjLTFZuE629shMWJ+7dsg0NkH14hX0zg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-disposable: 1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-portal@9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-1rhJ2u3PUCPpASSqrRCsLFZmkjxb3gEl8pNkKluudRwCu21rsG+HZUAjLTFZuE629shMWJ+7dsg0NkH14hX0zg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-disposable: 1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - dev: false - - /@fluentui/react-positioning@9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ZRaiEOELH20xdHiFdqyF7DLlHivOFNHsyguPi4BBtZbStJ9tF92GrYFf7EuYKxaaR0jeeLa4ZgZRSWRzAiMBpg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.3) - '@floating-ui/dom': 1.6.3 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-positioning@9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ZRaiEOELH20xdHiFdqyF7DLlHivOFNHsyguPi4BBtZbStJ9tF92GrYFf7EuYKxaaR0jeeLa4ZgZRSWRzAiMBpg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.3) - '@floating-ui/dom': 1.6.3 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-positioning@9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QHTG9YGRIeZ/bjooJPh2KvEMH98sCFITTQpeUf9O5qrB+wMHoBXz10E2OSW9qGYnpbRPfOldqB6aymVWMw3OJQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.3) - '@floating-ui/dom': 1.6.3 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-positioning@9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-QHTG9YGRIeZ/bjooJPh2KvEMH98sCFITTQpeUf9O5qrB+wMHoBXz10E2OSW9qGYnpbRPfOldqB6aymVWMw3OJQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.3) - '@floating-ui/dom': 1.6.3 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-progress@9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-EltkWoM/gL1e0MpYvuEFX+u2wjEol8EucG7kfMlqMy9qGHipxYejwZCmIq7GqmrfRF8lMdEboTGipf5FjUQUkQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-progress@9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-EltkWoM/gL1e0MpYvuEFX+u2wjEol8EucG7kfMlqMy9qGHipxYejwZCmIq7GqmrfRF8lMdEboTGipf5FjUQUkQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-progress@9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-kt++7lueMBwDtlRElpgYYIJa0dQPZaO1yWhqpi6pHR4Ukem4jCNFvaV1D6SJ50POlLxyh5SefcjnYxOOTIixqA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-provider@9.16.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-mYpJq7p3o7b7fAIZn6dvJtO23dioqIOV8HotTIetcsixk4AbtBMnfKme0i3kq+CM7xhUeBpdDB5mLs5aZTnYtQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/core': 1.16.0 - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-provider@9.16.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-mYpJq7p3o7b7fAIZn6dvJtO23dioqIOV8HotTIetcsixk4AbtBMnfKme0i3kq+CM7xhUeBpdDB5mLs5aZTnYtQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/core': 1.16.0 - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-provider@9.16.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-a8jNYiQ+Ftj7uo4VpRh3uhLXa3N9Yr0OcwwKBLsim6yxTNnonFqxeMiposF3TQtBtKLmy6ZqV62uI4lbbE9XwA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/core': 1.16.0 - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-radio@9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-ILdTh6o+JjmOQ/1UDj0W2iznDWucA65hZJZM9mEp0W/AM2OuNSXU9lJ/BG6z2aUpj5ec1jkIz+/GzQ7s7PJPxw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-radio@9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-ILdTh6o+JjmOQ/1UDj0W2iznDWucA65hZJZM9mEp0W/AM2OuNSXU9lJ/BG6z2aUpj5ec1jkIz+/GzQ7s7PJPxw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-radio@9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-rm9OGO63FjzxPtWipIDrP0Z7O9UuDXNIUvB0Rb3sizf+fw9nltw+cztQIFgFiknJ6CU5jf5pJdh/AiFka/Jsmg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-rating@9.0.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-6/TVG2dbk5J06NF8AxkhkuG0z7ZJ0e/e/CVVQ5N7jrQD3iyDKxwJKGTk3ToyLAkVBtfic10fk++DGA3aRnEM5A==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-rating@9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-OZ2bMg5GO32NZrQfX72jRKAzDxLm/nX0G1TCNV9Fx4VvwFquG/aRQr9KUh4BNbs2Fi2oPFFbpPi1FWVQnsM51w==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-rating@9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-OZ2bMg5GO32NZrQfX72jRKAzDxLm/nX0G1TCNV9Fx4VvwFquG/aRQr9KUh4BNbs2Fi2oPFFbpPi1FWVQnsM51w==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-search@9.0.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-TJm0dDbkpvbCdeK6W20iqY22R+3aAylBpOMCbtVcpKDWvwz8Q8hplJF1QzHG26PdO7sB6X4HjcFYgO9wDqHfEQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-input': 9.4.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-search@9.0.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-TJm0dDbkpvbCdeK6W20iqY22R+3aAylBpOMCbtVcpKDWvwz8Q8hplJF1QzHG26PdO7sB6X4HjcFYgO9wDqHfEQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-input': 9.4.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-search@9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-/r1fAkNjeLD8NsVDTtLsQrAVNQUg9MxFdE6mxVSwN1JKMkAdRTpgeJ+O7X80Umuawcl9UHmLOoxHmXHadBOvzQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-input': 9.4.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-select@9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-VOfKDFmHeqEAjSgxkTd2UiIEdiCD99uPsCbgRUeSGzD+9Rsbxs5aMnSWclH+XuTliLrTWSDHim8k4IGdg4lYbA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-select@9.1.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-VOfKDFmHeqEAjSgxkTd2UiIEdiCD99uPsCbgRUeSGzD+9Rsbxs5aMnSWclH+XuTliLrTWSDHim8k4IGdg4lYbA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-select@9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-g3pJOdrYhPDaUHqkJAi5CTrwitXFqwyZrGQ2An3XVMfRkB5KEg+Rd4gEcdOIFta95EkjtV3DanyVoIv18wCj4A==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-shared-contexts@9.19.0(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-KWHRVuKSvQpFdGGxj802AwoHlq7VyFKaj89cgX2pBu2ZqZrdpxkbkfFQIvxLoaZ/Bzm7fWXVQrDYpj+8JHAfCA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-theme': 9.1.17 - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - dev: false - - /@fluentui/react-shared-contexts@9.19.0(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-KWHRVuKSvQpFdGGxj802AwoHlq7VyFKaj89cgX2pBu2ZqZrdpxkbkfFQIvxLoaZ/Bzm7fWXVQrDYpj+8JHAfCA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-theme': 9.1.17 - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - react: 18.3.1 - dev: false - - /@fluentui/react-skeleton@9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-mFRld+IoXJLBKC+n/e/f2FCxoHbkubKmK3xHxHCXM9n8NHltKBOuJT7lh7IEpV1F/NAz8+y7ijHFIVKhoDCsuA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-skeleton@9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-mFRld+IoXJLBKC+n/e/f2FCxoHbkubKmK3xHxHCXM9n8NHltKBOuJT7lh7IEpV1F/NAz8+y7ijHFIVKhoDCsuA==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-skeleton@9.1.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-k2qlRlYByVPf1haf4+akLN2w2DidiDW7LBv/0Z0fWKpf7gnYfUjonmtrN2rlOTKGpKu1ZCtf7eupdM69Qd4sLg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-slider@9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-jOyReDWqDrHlBdb7pcbMLaxqmspMs7nOsgO8hQGZAtT7s0JLH3t7xkyOH+ggE8b9UwIEK0lxS7owSY5CcoU54Q==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-slider@9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-jOyReDWqDrHlBdb7pcbMLaxqmspMs7nOsgO8hQGZAtT7s0JLH3t7xkyOH+ggE8b9UwIEK0lxS7owSY5CcoU54Q==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-slider@9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-zI/r5uRLhKCwbLfMGs9gAraE81awXwuiKaWU6FjAflLwCt9tb9Fw/lk0Pj3GL3BH1nORDnPgN+f5ZXyc6vGPcg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-spinbutton@9.2.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-8NUsYOSLJRP1hxcK+y/9wwhB93ytXDAUYR8K7iPfsUMYh7wPWvs9Q/36JWGgIkBXJrWcxmU7QEt4NTkCchmweg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-spinbutton@9.2.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-8NUsYOSLJRP1hxcK+y/9wwhB93ytXDAUYR8K7iPfsUMYh7wPWvs9Q/36JWGgIkBXJrWcxmU7QEt4NTkCchmweg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler - dev: false - - /@fluentui/react-spinbutton@9.2.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-1Opw0/MFaYZKJVoY77MYkHx7+FCWEBc+nUl9nshcYCBwCcgY/YqBlJ5oVInvZ6Ym3cvYESqgOhmOqr3iJCC/CQ==} + /@fluentui/react-field@9.1.67(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-yLcsVeff7cg5o5zGYlaElj+OMfePaen3h7ndr+K6o5qSxvQvm7mWz79DoKsjIp03gMVF0HsBxpI7K69y+HGVjg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -8393,17 +5529,18 @@ packages: - scheduler dev: false - /@fluentui/react-spinner@9.4.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-xXIBV27vhu4m3sedRuhQyYef53NUX8LifVWoMkmBXbEtOjc9vEN15tkT3L7vdlenJDGYYVNJDp54qWUCUnZVYg==} + /@fluentui/react-field@9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-AwylrrZthfgMLDQcgwPWpq7buEeZJAsdnR2ovlhRXoC3md1zpBkAjt640Om0UXNJcSu7FWIlZVaOsgWIi+mU9A==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -8412,42 +5549,32 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-spinner@9.4.8(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-smd2VVxZrHj6w8nWFoqRZ21SDtKuYM3pInq2sY4BeyikmViTY5CNQ6BFDxk4+CY9AOuMMaGttjCW8J3uYGMxkA==} + /@fluentui/react-icons@2.0.247(react@18.3.1): + resolution: {integrity: sha512-w5KQb0xBcqBwXB0jNCKQnMjllxlkLTpDICQYBqM0QXI7lEtEWQ/4IyPiocdJ+aBYVrSbI5d8rTqvHvYsFUYXmg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + react: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + tslib: 2.6.2 dev: false - /@fluentui/react-spinner@9.4.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-smd2VVxZrHj6w8nWFoqRZ21SDtKuYM3pInq2sY4BeyikmViTY5CNQ6BFDxk4+CY9AOuMMaGttjCW8J3uYGMxkA==} + /@fluentui/react-image@9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-bQ7suwNrGb+FSVaL44e7CgZmjeJ8ZI5KS5q8RyW21/oc+hKDxQrB52ahQdzfWsh07CGzZ8tCgfLu+sOaOKppGQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -8456,24 +5583,24 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-swatch-picker@9.1.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-y00ukuMnf0YxWcQ7OYQfcEmz+YS2UxUQfvRoEqQQh10AENBvOMnP7bC89lSBnTBxlSWV1MnvDCqbTZ+YZlOBUA==} + /@fluentui/react-infobutton@9.0.0-beta.102(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-3kA4F0Vga8Ds6JGlBajLCCDOo/LmPuS786Wg7ui4ZTDYVIMzy1yp2XuVcZniifBFvEp0HQCUoDPWUV0VI3FfzQ==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8481,21 +5608,21 @@ packages: - scheduler dev: false - /@fluentui/react-swatch-picker@9.1.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-y00ukuMnf0YxWcQ7OYQfcEmz+YS2UxUQfvRoEqQQh10AENBvOMnP7bC89lSBnTBxlSWV1MnvDCqbTZ+YZlOBUA==} + /@fluentui/react-infolabel@9.0.38(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-gFKYlzJ9BXQWtNjhIsfZSL+lB3yzwKE+OPjgDmoSaBP3ozW2PPDGY2dZG7BwJ0oWNoubqeKeNj/mC6d4zL4HWg==} peerDependencies: '@types/react': '>=16.8.0 <19.0.0' '@types/react-dom': '>=16.8.0 <19.0.0' react: '>=16.8.0 <19.0.0' react-dom: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -8506,19 +5633,17 @@ packages: - scheduler dev: false - /@fluentui/react-swatch-picker@9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-H/jAB+0BI6YDe6x0nH9uI7PmHOUmXpkprlOC5uaJGLNhBQQrNcV9wrxImwWHfr7DKDZce8SVyGl0OXTT2I/RVw==} + /@fluentui/react-input@9.4.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-++a84fgrwom6FLYALiwxBNiJMow9ZIQOzbrM+9RTGozfjj74lQ6bnBU9dmKKTalWZAuwSYHO6jaM+xlrrVjY8A==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -8531,72 +5656,62 @@ packages: - scheduler dev: false - /@fluentui/react-switch@9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-UZfB3J3+sgyU9YKlzXDQBAzF5WXf8q754eTYdfbu1Irev+1WgXwugEM0QI5aJVPmefb9Umzwfsva3HI1UVOFbQ==} + /@fluentui/react-jsx-runtime@9.0.39(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-mfK3L68Gfu9rMkfg1iVT06rOOPeOZasy+nKJID451YfKiAQYy1Zy9bhaTRDoNrOQcu2jDEOZAxAPURZw5oGLtw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 + '@types/react': 18.3.3 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler + react-is: 17.0.2 + dev: false + + /@fluentui/react-jsx-runtime@9.0.40(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-3QF4f6LezBWGoRgeo287A8jey3aSW0Xxewxgzdh5si7KeJt7CO9Pz90QJhz+PRKC6Q6C+zSGyinTUCpQtYr70A==} + peerDependencies: + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + dependencies: + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) + '@swc/helpers': 0.5.8 + '@types/react': 18.3.3 + react: 18.3.1 + react-is: 17.0.2 dev: false - /@fluentui/react-switch@9.1.83(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-UZfB3J3+sgyU9YKlzXDQBAzF5WXf8q754eTYdfbu1Irev+1WgXwugEM0QI5aJVPmefb9Umzwfsva3HI1UVOFbQ==} + /@fluentui/react-label@9.1.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PkzRsl86+AkSn6p26C0Y2AV4IxYUhbBV+lFNSwN/hVgiXwMVdUjPOZx4Nm4Fnvv5ctt/BVuaE0dB/nSSDsrnQw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.70(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-switch@9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-zD6HivKQOF7POzFDJEyjXhB8gedYw1HS3OKKQGWMFzjJwiGJJAi6mABllh6hARuGES86otmqmq/N6WGPAusc+w==} + /@fluentui/react-label@9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-msEymXx2qpWutqYBKS8ZM2dRi59Fau3sz5nX2tUrqcrf3g1s8guhjGN4a54DgvhfkvIp3QWyXH3tUD8ddANnxg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -8605,12 +5720,10 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-table@9.15.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-tyBVYIYFYS2HD1pYwOIFyMDb9EdUkCG2kIolHjrSByNkDwYjaQSGabupn1EH9G/eCFkSTFqGwNnqDnjYzzDqOg==} + /@fluentui/react-link@9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-CFv/KzRrqmQLKOSVj2cW2sL90eQvG5XRI8xhP8FIwxLoS0MwQiAFIUTaG1bkqXnZj2QmlT7zOyHFVRGeBLzRbw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -8618,47 +5731,35 @@ packages: react-dom: '>=16.14.0 <19.0.0' dependencies: '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-checkbox': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-table@9.15.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-tyBVYIYFYS2HD1pYwOIFyMDb9EdUkCG2kIolHjrSByNkDwYjaQSGabupn1EH9G/eCFkSTFqGwNnqDnjYzzDqOg==} + /@fluentui/react-list-preview@0.2.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-M2nc/XvdeI0X1SWEDmOfRlzWozkrR39NuVvMJIWhif3OyeGFYNVSSpy/XEynU7WwONJl+gw9e4ftkfsB9g/USg==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' dependencies: '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-checkbox': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-checkbox': 9.2.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-context-selector': 9.1.61(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.39(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tabster': 9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -8669,8 +5770,8 @@ packages: - scheduler dev: false - /@fluentui/react-table@9.15.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-unTbm8rjEqOzH/xHmltBApgS9jUtnLJ1t/XnhF0ATKvHDjGE5tkDyLkBM9Z6HZlC0xOkd4nyTMlUaaSeNdvFXQ==} + /@fluentui/react-menu@9.14.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-oa/7Fmsvs+G87HeURzC7PW7FbhOTMnkhYn3dp5Vcw+gxmuIfu+SGYTcdoYe6p67Ci4WlDguMBgzmXoNEG9d0sQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -8679,12 +5780,11 @@ packages: dependencies: '@fluentui/keyboard-keys': 9.0.7 '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-checkbox': 9.2.30(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-radio': 9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 @@ -8699,170 +5799,171 @@ packages: - scheduler dev: false - /@fluentui/react-tabs@9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-MRBjWIh+qXXRmdYz+inUEb13kc77cl5Phm4gdBPRrXje/A78gOVb+/B2TqalPHH1GMPSpYd0BpGIvxuKJm2eYg==} + /@fluentui/react-message-bar@9.2.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Bo5xBpmZHzD/mtsIwY4cOCMmswu1jvhtZlW07SO4aV9hvADlmuv+h9zl5dVQmoV5lHJRvDAcIPLC0pw/X9vsKA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler + react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) dev: false - /@fluentui/react-tabs@9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-MRBjWIh+qXXRmdYz+inUEb13kc77cl5Phm4gdBPRrXje/A78gOVb+/B2TqalPHH1GMPSpYd0BpGIvxuKJm2eYg==} + /@fluentui/react-motion-preview@0.5.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-8JQPIWCB4u9DVXVtWpDbdEeEck2VgK2RgoYq8M1bF6rwOAAd1Vqkxlqlply3gryYYvnsy2cdTki8bntfiwhbzQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-tabs@9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-xc4uvoTzKDEKmx0AYYt2yDIi4MPfQ9SZtTa4F0tUmmAhM2LOa54E1cUNZSuzw69foxtYLAB9TouRSnAYHGIHoQ==} + /@fluentui/react-motion@9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-A7WOoytc33TdvE1OarDsjQF/Sjr5sDRblTRZbJFgZ/vxOY/zucGb6iT+kjD0K14X6BuINTDF2ItvXEooih1xFA==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler + react-is: 17.0.2 dev: false - /@fluentui/react-tabster@9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-WmPBeR2U3htAHKKmeL5+I8vIKyg5cRNCfrORpSpVlfZ0I/eTL+dRJJBRtTmOQ9VfPCNB7NF3VVpnR5EgcRbouw==} + /@fluentui/react-overflow@9.1.23(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-zx2Nh5dOeg9rH1OEhinlkbNpxwvKsyHe7wAdnGy8T70+N0crL8znAUUrpngyB7jdb4H2xLm4xnYoUOzsKcZp/Q==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/priority-overflow': 9.1.13 + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tabster: 7.1.3 + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-tabster@9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-WmPBeR2U3htAHKKmeL5+I8vIKyg5cRNCfrORpSpVlfZ0I/eTL+dRJJBRtTmOQ9VfPCNB7NF3VVpnR5EgcRbouw==} + /@fluentui/react-persona@9.2.90(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-roQ92Fl2eW5XsUFhvo6fRPixYxyIPcbRm0wZyHnb6Tl5WcKZao/ayLKH414leDVtgjTbfpw0if+qx0ipLiBsvA==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: + '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-badge': 9.2.39(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tabster: 7.1.3 + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-tabster@9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-35k5mWN73m94EcRKZKAjSbQroA35C+RA+sbWVlg40mNm4d9UYKyre0mblvaL+EVogQeoLUUtPLVvNu/cYxNdNg==} + /@fluentui/react-popover@9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-ktym1lY5Y0kgYuUYW0kvfnH3hlK4izJ4HM0kikO+hyIIys/iv41o+9lhj8sIbHCKPnkOL9fnTs98pgzffms04A==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tabster: 7.3.0 + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-tabster@9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-m8m7ISCDN8EHM430hAD9kO9KKz5T6PNJ42HdI0gYf+d8xQjyMKr3HBOHzVDmdfv/9QHfftWtwS9WpqqS7IOreA==} + /@fluentui/react-portal@9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-1rhJ2u3PUCPpASSqrRCsLFZmkjxb3gEl8pNkKluudRwCu21rsG+HZUAjLTFZuE629shMWJ+7dsg0NkH14hX0zg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.11(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tabster: 8.0.0 + use-disposable: 1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) dev: false - /@fluentui/react-tabster@9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-m8m7ISCDN8EHM430hAD9kO9KKz5T6PNJ42HdI0gYf+d8xQjyMKr3HBOHzVDmdfv/9QHfftWtwS9WpqqS7IOreA==} + /@fluentui/react-positioning@9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-QHTG9YGRIeZ/bjooJPh2KvEMH98sCFITTQpeUf9O5qrB+wMHoBXz10E2OSW9qGYnpbRPfOldqB6aymVWMw3OJQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: + '@floating-ui/devtools': 0.2.1(@floating-ui/dom@1.6.3) + '@floating-ui/dom': 1.6.3 '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) @@ -8870,37 +5971,26 @@ packages: '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 - keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - tabster: 8.0.0 dev: false - /@fluentui/react-tag-picker@9.0.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-Zjlk/FAr1wCeCJk8fIjXPK3eInimsB64PhgHTRfR2PfvgtDgly0K1cZBStsm2c6SdEkJDkNqChFyvvUiVyb8fw==} + /@fluentui/react-progress@9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-kt++7lueMBwDtlRElpgYYIJa0dQPZaO1yWhqpi6pHR4Ukem4jCNFvaV1D6SJ50POlLxyh5SefcjnYxOOTIixqA==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-combobox': 9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tags': 9.3.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -8908,58 +5998,42 @@ packages: - scheduler dev: false - /@fluentui/react-tag-picker@9.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-Zjlk/FAr1wCeCJk8fIjXPK3eInimsB64PhgHTRfR2PfvgtDgly0K1cZBStsm2c6SdEkJDkNqChFyvvUiVyb8fw==} + /@fluentui/react-provider@9.16.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-a8jNYiQ+Ftj7uo4VpRh3uhLXa3N9Yr0OcwwKBLsim6yxTNnonFqxeMiposF3TQtBtKLmy6ZqV62uI4lbbE9XwA==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-combobox': 9.11.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tags': 9.3.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) + '@griffel/core': 1.16.0 '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-tag-picker@9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-TY+XRlnPgRHZDIcyGphSscm8202admvbyhE1nKVQEUnnEIZjHw7wammfv2If0PjgViRyQ9/XlEj5AttQldKpWw==} + /@fluentui/react-radio@9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-rm9OGO63FjzxPtWipIDrP0Z7O9UuDXNIUvB0Rb3sizf+fw9nltw+cztQIFgFiknJ6CU5jf5pJdh/AiFka/Jsmg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-combobox': 9.12.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-tags': 9.3.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -8972,20 +6046,16 @@ packages: - scheduler dev: false - /@fluentui/react-tags@9.3.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-tVlyGTTVutFebA6nsIfu9V2aXj2jb/Hy+H0hCIgxZnfFeBnp5m5MxInvwhfiOpO8v+ENuEC53LjQcdCw7TmhuQ==} + /@fluentui/react-rating@9.0.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-6/TVG2dbk5J06NF8AxkhkuG0z7ZJ0e/e/CVVQ5N7jrQD3iyDKxwJKGTk3ToyLAkVBtfic10fk++DGA3aRnEM5A==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) @@ -8995,30 +6065,24 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-tags@9.3.6(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-oSkARy6deCv5oXCLlHM4Z/MaKN82jaPhUxXbgGsc//cu4JUQNc0VIXoSYf/Y9HEz9IeEV/Id2yXsBnbkl9KaJA==} + /@fluentui/react-search@9.0.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-/r1fAkNjeLD8NsVDTtLsQrAVNQUg9MxFdE6mxVSwN1JKMkAdRTpgeJ+O7X80Umuawcl9UHmLOoxHmXHadBOvzQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-input': 9.4.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -9026,23 +6090,20 @@ packages: - scheduler dev: false - /@fluentui/react-tags@9.3.6(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-oSkARy6deCv5oXCLlHM4Z/MaKN82jaPhUxXbgGsc//cu4JUQNc0VIXoSYf/Y9HEz9IeEV/Id2yXsBnbkl9KaJA==} + /@fluentui/react-select@9.1.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-g3pJOdrYhPDaUHqkJAi5CTrwitXFqwyZrGQ2An3XVMfRkB5KEg+Rd4gEcdOIFta95EkjtV3DanyVoIv18wCj4A==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -9053,78 +6114,51 @@ packages: - scheduler dev: false - /@fluentui/react-teaching-popover@9.1.5(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-IJuOaLzAAqxK15JpJrS7KZTSV40P4fW2friNLf0vgGbvn0n4SiFlnBEmec75Mk6NDOxWEGDGVgSywQw7HXgjpA==} + /@fluentui/react-shared-contexts@9.19.0(@types/react@18.3.3)(react@18.3.1): + resolution: {integrity: sha512-KWHRVuKSvQpFdGGxj802AwoHlq7VyFKaj89cgX2pBu2ZqZrdpxkbkfFQIvxLoaZ/Bzm7fWXVQrDYpj+8JHAfCA==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <19.0.0' + react: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 + '@types/react': 18.3.3 react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false - /@fluentui/react-teaching-popover@9.1.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-IJuOaLzAAqxK15JpJrS7KZTSV40P4fW2friNLf0vgGbvn0n4SiFlnBEmec75Mk6NDOxWEGDGVgSywQw7HXgjpA==} + /@fluentui/react-skeleton@9.1.8(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-k2qlRlYByVPf1haf4+akLN2w2DidiDW7LBv/0Z0fWKpf7gnYfUjonmtrN2rlOTKGpKu1ZCtf7eupdM69Qd4sLg==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-popover': 9.9.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) transitivePeerDependencies: - scheduler dev: false - /@fluentui/react-teaching-popover@9.1.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-+UuDAyTXrswKegEcED7hLPiZ6MCkMGKRkAxJpC/l4FRmaEGJ8y/j33F7HvfrACdFbIEbceuRS7Wx2GRWlotjRQ==} + /@fluentui/react-slider@9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-zI/r5uRLhKCwbLfMGs9gAraE81awXwuiKaWU6FjAflLwCt9tb9Fw/lk0Pj3GL3BH1nORDnPgN+f5ZXyc6vGPcg==} peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' + '@types/react': '>=16.14.0 <19.0.0' + '@types/react-dom': '>=16.9.0 <19.0.0' + react: '>=16.14.0 <19.0.0' + react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 @@ -9135,43 +6169,48 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - use-sync-external-store: 1.2.2(react@18.3.1) transitivePeerDependencies: - scheduler dev: false - /@fluentui/react-text@9.4.18(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ntKfnidKVFpqJsC/Xyn4dygAjx+/SjqJOp3UmKCZirAckCWWokwmO31v8eV8Mgf8f9tKpQu2GOvuEjI5eBBqrw==} + /@fluentui/react-spinbutton@9.2.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-1Opw0/MFaYZKJVoY77MYkHx7+FCWEBc+nUl9nshcYCBwCcgY/YqBlJ5oVInvZ6Ym3cvYESqgOhmOqr3iJCC/CQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-text@9.4.18(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-ntKfnidKVFpqJsC/Xyn4dygAjx+/SjqJOp3UmKCZirAckCWWokwmO31v8eV8Mgf8f9tKpQu2GOvuEjI5eBBqrw==} + /@fluentui/react-spinner@9.4.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-xXIBV27vhu4m3sedRuhQyYef53NUX8LifVWoMkmBXbEtOjc9vEN15tkT3L7vdlenJDGYYVNJDp54qWUCUnZVYg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -9180,16 +6219,19 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-text@9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-VP09hiPqrPsTNxmXsejyGP9xRqpRw2Mqim+M4hb6xoorcq1hjfInhr1W79jdDycStJ9MvTDOs6mBP+1wg8tJzA==} + /@fluentui/react-swatch-picker@9.1.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-H/jAB+0BI6YDe6x0nH9uI7PmHOUmXpkprlOC5uaJGLNhBQQrNcV9wrxImwWHfr7DKDZce8SVyGl0OXTT2I/RVw==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' dependencies: + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -9198,24 +6240,29 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-textarea@9.3.76(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-nSxR+LSM86HC2KlZwAimOA+2nAKziESCvs43hDw8lPdrBsMBFm97whHvU0RMozKA8nKFPInP36TR9QlQy9f52A==} + /@fluentui/react-switch@9.1.87(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-zD6HivKQOF7POzFDJEyjXhB8gedYw1HS3OKKQGWMFzjJwiGJJAi6mABllh6hARuGES86otmqmq/N6WGPAusc+w==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-label': 9.1.72(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -9223,19 +6270,26 @@ packages: - scheduler dev: false - /@fluentui/react-textarea@9.3.76(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-nSxR+LSM86HC2KlZwAimOA+2nAKziESCvs43hDw8lPdrBsMBFm97whHvU0RMozKA8nKFPInP36TR9QlQy9f52A==} + /@fluentui/react-table@9.15.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-unTbm8rjEqOzH/xHmltBApgS9jUtnLJ1t/XnhF0ATKvHDjGE5tkDyLkBM9Z6HZlC0xOkd4nyTMlUaaSeNdvFXQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.66(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-checkbox': 9.2.30(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-radio': 9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -9246,17 +6300,18 @@ packages: - scheduler dev: false - /@fluentui/react-textarea@9.3.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-n9wMXz9eO0kzguysFmP5Pi2R21m26eBpVHnkGyhYu7ESNh0Q4JdBoylpyCpncpi92OQjY4jj7n7QM01U6jNC/A==} + /@fluentui/react-tabs@9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-xc4uvoTzKDEKmx0AYYt2yDIi4MPfQ9SZtTa4F0tUmmAhM2LOa54E1cUNZSuzw69foxtYLAB9TouRSnAYHGIHoQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -9269,67 +6324,50 @@ packages: - scheduler dev: false - /@fluentui/react-theme@9.1.17: - resolution: {integrity: sha512-A4WmsEiefH8O6EJ+jyFq9KACrR5Aad1EbJiOzjQdos1WtXncZhkJUHpChfV6DDAPFUj0lEPPaJDoRze5xZzS4Q==} - dependencies: - '@fluentui/tokens': 1.0.0-alpha.14 - '@swc/helpers': 0.5.8 - dev: false - - /@fluentui/react-toast@9.3.43(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-CtPKu+Xaugon4WnztQDQALrO7rkcfWrWX0MElWz3/7YZ7vWiN9hVmrjy+QuIrgtYP8sb0HhYxgNPvLV/5VMa2A==} + /@fluentui/react-tabster@9.21.5(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-35k5mWN73m94EcRKZKAjSbQroA35C+RA+sbWVlg40mNm4d9UYKyre0mblvaL+EVogQeoLUUtPLVvNu/cYxNdNg==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.10(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + tabster: 7.3.0 dev: false - /@fluentui/react-toast@9.3.43(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-CtPKu+Xaugon4WnztQDQALrO7rkcfWrWX0MElWz3/7YZ7vWiN9hVmrjy+QuIrgtYP8sb0HhYxgNPvLV/5VMa2A==} + /@fluentui/react-tabster@9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-m8m7ISCDN8EHM430hAD9kO9KKz5T6PNJ42HdI0gYf+d8xQjyMKr3HBOHzVDmdfv/9QHfftWtwS9WpqqS7IOreA==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 + keyborg: 2.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1)(react@18.3.1) + tabster: 8.0.0 dev: false - /@fluentui/react-toast@9.3.48(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-iEP4ggFVgDtfR2hkXdOMBhy5eETLpXCfUcoDGTti3Z1xH5Y4b3dLByEpAXcP2M8zxJk81MZDCFcaY5gZTBhp4w==} + /@fluentui/react-tag-picker@9.2.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-TY+XRlnPgRHZDIcyGphSscm8202admvbyhE1nKVQEUnnEIZjHw7wammfv2If0PjgViRyQ9/XlEj5AttQldKpWw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -9338,12 +6376,16 @@ packages: dependencies: '@fluentui/keyboard-keys': 9.0.7 '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-combobox': 9.12.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-motion': 9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tags': 9.3.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-theme': 9.1.17 '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) @@ -9352,52 +6394,27 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-toolbar@9.1.84(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-9L0ZnusI+uDEYxZ8mNTR2br9odIgiU3gDGXmSTQTUjdcH0vJNbbVqew6G1Gm2KCwdXjIjwPSTDOPNMbuhFiHHQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-divider': 9.2.69(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: - scheduler dev: false - /@fluentui/react-toolbar@9.1.84(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-9L0ZnusI+uDEYxZ8mNTR2br9odIgiU3gDGXmSTQTUjdcH0vJNbbVqew6G1Gm2KCwdXjIjwPSTDOPNMbuhFiHHQ==} + /@fluentui/react-tags@9.3.10(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-tVlyGTTVutFebA6nsIfu9V2aXj2jb/Hy+H0hCIgxZnfFeBnp5m5MxInvwhfiOpO8v+ENuEC53LjQcdCw7TmhuQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-divider': 9.2.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-avatar': 9.6.31(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-icons': 2.0.247(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 @@ -9408,19 +6425,20 @@ packages: - scheduler dev: false - /@fluentui/react-toolbar@9.1.88(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-c4jfk1LbUjQ8zpoGsMv+PpcozjuUj9kBseslwRLKBwh0/rZdf5VbZPHtYozE9YiVrTfJpbNYGLSZRHbETMIxvw==} + /@fluentui/react-teaching-popover@9.1.9(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-+UuDAyTXrswKegEcED7hLPiZ6MCkMGKRkAxJpC/l4FRmaEGJ8y/j33F7HvfrACdFbIEbceuRS7Wx2GRWlotjRQ==} peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' + '@types/react': '>=16.8.0 <19.0.0' + '@types/react-dom': '>=16.8.0 <19.0.0' + react: '>=16.8.0 <19.0.0' + react-dom: '>=16.8.0 <19.0.0' dependencies: + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-divider': 9.2.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-radio': 9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-popover': 9.9.13(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 @@ -9431,60 +6449,63 @@ packages: '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.2.2(react@18.3.1) transitivePeerDependencies: - scheduler dev: false - /@fluentui/react-tooltip@9.4.28(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-zhiKRiKE2uh8wNPwJ0oTPo7lLt693wdKvFua9NryHmkNyyWleMFXa+gkF/dcXxyAh6zPuH8aNQT6rN/s738Vhw==} + /@fluentui/react-text@9.4.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-VP09hiPqrPsTNxmXsejyGP9xRqpRw2Mqim+M4hb6xoorcq1hjfInhr1W79jdDycStJ9MvTDOs6mBP+1wg8tJzA==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-tooltip@9.4.28(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-zhiKRiKE2uh8wNPwJ0oTPo7lLt693wdKvFua9NryHmkNyyWleMFXa+gkF/dcXxyAh6zPuH8aNQT6rN/s738Vhw==} + /@fluentui/react-textarea@9.3.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-n9wMXz9eO0kzguysFmP5Pi2R21m26eBpVHnkGyhYu7ESNh0Q4JdBoylpyCpncpi92OQjY4jj7n7QM01U6jNC/A==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-portal': 9.4.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-field': 9.1.69(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + transitivePeerDependencies: + - scheduler dev: false - /@fluentui/react-tooltip@9.4.32(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-wMBTc66KhHGEf92JHNuirSbo5fjzmVUrAiVFHiZ44HsxbkRuBbwzeKOxpS+jODHxUjd0wYjUt/muEdGwAMBHGQ==} + /@fluentui/react-theme@9.1.17: + resolution: {integrity: sha512-A4WmsEiefH8O6EJ+jyFq9KACrR5Aad1EbJiOzjQdos1WtXncZhkJUHpChfV6DDAPFUj0lEPPaJDoRze5xZzS4Q==} + dependencies: + '@fluentui/tokens': 1.0.0-alpha.14 + '@swc/helpers': 0.5.8 + dev: false + + /@fluentui/react-toast@9.3.48(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-iEP4ggFVgDtfR2hkXdOMBhy5eETLpXCfUcoDGTti3Z1xH5Y4b3dLByEpAXcP2M8zxJk81MZDCFcaY5gZTBhp4w==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -9492,9 +6513,11 @@ packages: react-dom: '>=16.14.0 <19.0.0' dependencies: '@fluentui/keyboard-keys': 9.0.7 + '@fluentui/react-aria': 9.13.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-icons': 2.0.247(react@18.3.1) '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-motion': 9.2.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 @@ -9507,30 +6530,26 @@ packages: react-dom: 18.3.1(react@18.3.1) dev: false - /@fluentui/react-tree@9.5.0(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-QOt37ZOpO+aZUnTjwZqqXNuDpyRodR7GEuI6Nf9fAZhw8679bDBrFdXGriawltVXXegtJ1QJFEJhbV858m0PKQ==} + /@fluentui/react-toolbar@9.1.88(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): + resolution: {integrity: sha512-c4jfk1LbUjQ8zpoGsMv+PpcozjuUj9kBseslwRLKBwh0/rZdf5VbZPHtYozE9YiVrTfJpbNYGLSZRHbETMIxvw==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' react: '>=16.14.0 <19.0.0' react-dom: '>=16.14.0 <19.0.0' dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-checkbox': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-button': 9.3.85(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-context-selector': 9.1.63(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-divider': 9.2.71(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-radio': 9.2.25(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 + '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -9538,8 +6557,8 @@ packages: - scheduler dev: false - /@fluentui/react-tree@9.5.0(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): - resolution: {integrity: sha512-QOt37ZOpO+aZUnTjwZqqXNuDpyRodR7GEuI6Nf9fAZhw8679bDBrFdXGriawltVXXegtJ1QJFEJhbV858m0PKQ==} + /@fluentui/react-tooltip@9.4.32(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-wMBTc66KhHGEf92JHNuirSbo5fjzmVUrAiVFHiZ44HsxbkRuBbwzeKOxpS+jODHxUjd0wYjUt/muEdGwAMBHGQ==} peerDependencies: '@types/react': '>=16.14.0 <19.0.0' '@types/react-dom': '>=16.9.0 <19.0.0' @@ -9547,26 +6566,19 @@ packages: react-dom: '>=16.14.0 <19.0.0' dependencies: '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-aria': 9.11.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-avatar': 9.6.27(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-button': 9.3.81(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) - '@fluentui/react-checkbox': 9.2.26(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-context-selector': 9.1.60(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) - '@fluentui/react-icons': 2.0.247(react@18.3.1) - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-radio': 9.2.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0) + '@fluentui/react-jsx-runtime': 9.0.40(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-portal': 9.4.29(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-positioning': 9.15.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-tabster': 9.21.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) + '@fluentui/react-tabster': 9.22.1(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@fluentui/react-theme': 9.1.17 - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) + '@fluentui/react-utilities': 9.18.11(@types/react@18.3.3)(react@18.3.1) '@griffel/react': 1.5.22(react@18.3.1) '@swc/helpers': 0.5.8 '@types/react': 18.3.3 '@types/react-dom': 18.3.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - transitivePeerDependencies: - - scheduler dev: false /@fluentui/react-tree@9.7.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1)(scheduler@0.23.0): @@ -9600,19 +6612,6 @@ packages: - scheduler dev: false - /@fluentui/react-utilities@9.18.10(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-1yUFZrJyBO1qizHa20S35JATQwr0QoTZ5vBmov0K49BWxDpJxpiAClMpFaMlw0hj9cI7HMLFF8Y87OhUYvaheQ==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - dev: false - /@fluentui/react-utilities@9.18.10(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-1yUFZrJyBO1qizHa20S35JATQwr0QoTZ5vBmov0K49BWxDpJxpiAClMpFaMlw0hj9cI7HMLFF8Y87OhUYvaheQ==} peerDependencies: @@ -9626,19 +6625,6 @@ packages: react: 18.3.1 dev: false - /@fluentui/react-utilities@9.18.11(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-VTOWnH6hug6WoNVWlQNRH20iu7088ckoQeRbppAZLMKNXKQtmbA6S1ZmU8kT/qYMWWK8OdjixcPA+h4AAZmQcg==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - dev: false - /@fluentui/react-utilities@9.18.11(@types/react@18.3.3)(react@18.3.1): resolution: {integrity: sha512-VTOWnH6hug6WoNVWlQNRH20iu7088ckoQeRbppAZLMKNXKQtmbA6S1ZmU8kT/qYMWWK8OdjixcPA+h4AAZmQcg==} peerDependencies: @@ -9652,70 +6638,6 @@ packages: react: 18.3.1 dev: false - /@fluentui/react-utilities@9.18.9(@types/react@18.3.2)(react@18.3.1): - resolution: {integrity: sha512-no2k8vxNiJt7SbSzB8H4aHNTcKK08Bzqu6kbwrUXMEklQxEoC+e2BJ+2nzHJUdFqR4WUq0380dDFjjrBimIiWw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - react: 18.3.1 - dev: false - - /@fluentui/react-utilities@9.18.9(@types/react@18.3.3)(react@18.3.1): - resolution: {integrity: sha512-no2k8vxNiJt7SbSzB8H4aHNTcKK08Bzqu6kbwrUXMEklQxEoC+e2BJ+2nzHJUdFqR4WUq0380dDFjjrBimIiWw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/keyboard-keys': 9.0.7 - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - react: 18.3.1 - dev: false - - /@fluentui/react-virtualizer@9.0.0-alpha.78(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UVMfuvuLxNa5W1kUHOdAfUoctxoURx9Zz+r0Hl2mVEE6sXwoCbuy2C9xzZjppzyEta40bTRhHbxpX63stbm8Iw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.2)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.2)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - - /@fluentui/react-virtualizer@9.0.0-alpha.78(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UVMfuvuLxNa5W1kUHOdAfUoctxoURx9Zz+r0Hl2mVEE6sXwoCbuy2C9xzZjppzyEta40bTRhHbxpX63stbm8Iw==} - peerDependencies: - '@types/react': '>=16.14.0 <19.0.0' - '@types/react-dom': '>=16.9.0 <19.0.0' - react: '>=16.14.0 <19.0.0' - react-dom: '>=16.14.0 <19.0.0' - dependencies: - '@fluentui/react-jsx-runtime': 9.0.38(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-shared-contexts': 9.19.0(@types/react@18.3.3)(react@18.3.1) - '@fluentui/react-utilities': 9.18.9(@types/react@18.3.3)(react@18.3.1) - '@griffel/react': 1.5.22(react@18.3.1) - '@swc/helpers': 0.5.8 - '@types/react': 18.3.3 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /@fluentui/react-virtualizer@9.0.0-alpha.80(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-1RzGHX4/4oYJOnnjD+5HM8iOMVOxG5435PFI8BOZCvCJ2jj/krMixv9jrL5RB2KiDt4Xm+gPUDw7trPcx+XCtA==} peerDependencies: @@ -10064,7 +6986,7 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@npmcli/git': 5.0.4 - glob: 10.3.12 + glob: 10.4.2 hosted-git-info: 7.0.1 json-parse-even-better-errors: 3.0.1 normalize-package-data: 6.0.0 @@ -11878,7 +8800,7 @@ packages: resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} engines: {node: '>=14'} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 entities: 4.5.0 dev: false @@ -12145,29 +9067,6 @@ packages: vitest: 1.6.0(@types/node@18.11.19)(@vitest/ui@1.6.0) dev: true - /@testing-library/react@16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 - '@types/react-dom': ^18.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - dependencies: - '@babel/runtime': 7.24.1 - '@testing-library/dom': 10.2.0 - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: true - /@testing-library/react@16.0.0(@testing-library/dom@10.2.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-guuxUKRWQ+FgNX0h0NS0FIq3Q3uLtWVpBzcLOggmfMoUpgBnzBzvLLd4fbm6yS8ydJd94cIfY4yP9qUQjM2KwQ==} engines: {node: '>=18'} @@ -12236,7 +9135,7 @@ packages: engines: {node: ^16.14.0 || >=18.0.0} dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.4 + minimatch: 9.0.5 dev: true /@types/acorn@4.0.6: @@ -12263,8 +9162,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 @@ -12273,20 +9172,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.5 - '@babel/types': 7.24.5 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.24.5 + '@babel/types': 7.24.7 dev: true /@types/body-parser@1.19.5: @@ -12586,12 +9485,6 @@ packages: '@types/history': 4.7.11 '@types/react': 18.3.3 - /@types/react@18.3.2: - resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - /@types/react@18.3.3: resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} dependencies: @@ -12826,22 +9719,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - /@vitejs/plugin-react@4.2.1(vite@5.2.11): - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 - dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.7) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.7) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.0 - vite: 5.2.11(@types/node@18.11.19) - transitivePeerDependencies: - - supports-color - dev: true - /@vitejs/plugin-react@4.3.1(vite@5.3.3): resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -13097,7 +9974,7 @@ packages: /@vue/compiler-core@3.4.27: resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} dependencies: - '@babel/parser': 7.24.5 + '@babel/parser': 7.24.7 '@vue/shared': 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 @@ -13111,26 +9988,6 @@ packages: '@vue/shared': 3.4.27 dev: true - /@vue/language-core@1.8.27(typescript@5.4.5): - resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@volar/language-core': 1.11.1 - '@volar/source-map': 1.11.1 - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 - computeds: 0.0.1 - minimatch: 9.0.4 - muggle-string: 0.3.1 - path-browserify: 1.0.1 - typescript: 5.4.5 - vue-template-compiler: 2.7.16 - dev: true - /@vue/language-core@1.8.27(typescript@5.5.3): resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} peerDependencies: @@ -13740,6 +10597,22 @@ packages: postcss-value-parser: 4.2.0 dev: false + /autoprefixer@10.4.19(postcss@8.4.39): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001600 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /autorest@3.7.1: resolution: {integrity: sha512-6q17NtosQZPqBkIOUnaOPedf3PDIBF7Ha1iEGRhTqZF6TG2Q/1E3ID/D+ePIIzZDKvW01p/2pENq/oiBWH9IGQ==} engines: {node: '>=12.0.0'} @@ -13793,7 +10666,7 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.24.4 + '@babel/compat-data': 7.24.7 '@babel/core': 7.24.7 '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.24.7) semver: 6.3.1 @@ -14076,24 +10949,6 @@ packages: yargs-parser: 21.1.1 dev: true - /c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 3.1.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 - test-exclude: 6.0.0 - v8-to-istanbul: 9.2.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -14105,9 +10960,9 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.3 - glob: 10.3.12 + glob: 10.4.2 lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 7.1.2 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -14890,6 +11745,15 @@ packages: postcss: 8.4.38 dev: false + /css-declaration-sorter@7.2.0(postcss@8.4.39): + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.39 + dev: false + /css-loader@6.10.0(webpack@5.91.0): resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} engines: {node: '>= 12.13.0'} @@ -14902,12 +11766,12 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) - postcss-modules-local-by-default: 4.0.4(postcss@8.4.38) - postcss-modules-scope: 3.1.1(postcss@8.4.38) - postcss-modules-values: 4.0.0(postcss@8.4.38) + icss-utils: 5.1.0(postcss@8.4.39) + postcss: 8.4.39 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.39) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.39) + postcss-modules-scope: 3.1.1(postcss@8.4.39) + postcss-modules-values: 4.0.0(postcss@8.4.39) postcss-value-parser: 4.2.0 semver: 7.6.2 webpack: 5.91.0(@swc/core@1.6.7) @@ -14940,9 +11804,9 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.25 clean-css: 5.3.3 - cssnano: 6.1.2(postcss@8.4.38) + cssnano: 6.1.2(postcss@8.4.39) jest-worker: 29.7.0 - postcss: 8.4.38 + postcss: 8.4.39 schema-utils: 4.2.0 serialize-javascript: 6.0.2 webpack: 5.91.0(@swc/core@1.6.7) @@ -14997,20 +11861,20 @@ packages: hasBin: true dev: false - /cssnano-preset-advanced@6.1.2(postcss@8.4.38): + /cssnano-preset-advanced@6.1.2(postcss@8.4.39): resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - autoprefixer: 10.4.19(postcss@8.4.38) + autoprefixer: 10.4.19(postcss@8.4.39) browserslist: 4.23.0 - cssnano-preset-default: 6.1.2(postcss@8.4.38) - postcss: 8.4.38 - postcss-discard-unused: 6.0.5(postcss@8.4.38) - postcss-merge-idents: 6.0.3(postcss@8.4.38) - postcss-reduce-idents: 6.0.3(postcss@8.4.38) - postcss-zindex: 6.0.2(postcss@8.4.38) + cssnano-preset-default: 6.1.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-discard-unused: 6.0.5(postcss@8.4.39) + postcss-merge-idents: 6.0.3(postcss@8.4.39) + postcss-reduce-idents: 6.0.3(postcss@8.4.39) + postcss-zindex: 6.0.2(postcss@8.4.39) dev: false /cssnano-preset-default@6.1.2(postcss@8.4.38): @@ -15052,13 +11916,61 @@ packages: postcss-unique-selectors: 6.0.4(postcss@8.4.38) dev: false + /cssnano-preset-default@6.1.2(postcss@8.4.39): + resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + css-declaration-sorter: 7.2.0(postcss@8.4.39) + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-calc: 9.0.1(postcss@8.4.39) + postcss-colormin: 6.1.0(postcss@8.4.39) + postcss-convert-values: 6.1.0(postcss@8.4.39) + postcss-discard-comments: 6.0.2(postcss@8.4.39) + postcss-discard-duplicates: 6.0.3(postcss@8.4.39) + postcss-discard-empty: 6.0.3(postcss@8.4.39) + postcss-discard-overridden: 6.0.2(postcss@8.4.39) + postcss-merge-longhand: 6.0.5(postcss@8.4.39) + postcss-merge-rules: 6.1.1(postcss@8.4.39) + postcss-minify-font-values: 6.1.0(postcss@8.4.39) + postcss-minify-gradients: 6.0.3(postcss@8.4.39) + postcss-minify-params: 6.1.0(postcss@8.4.39) + postcss-minify-selectors: 6.0.4(postcss@8.4.39) + postcss-normalize-charset: 6.0.2(postcss@8.4.39) + postcss-normalize-display-values: 6.0.2(postcss@8.4.39) + postcss-normalize-positions: 6.0.2(postcss@8.4.39) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.39) + postcss-normalize-string: 6.0.2(postcss@8.4.39) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.39) + postcss-normalize-unicode: 6.1.0(postcss@8.4.39) + postcss-normalize-url: 6.0.2(postcss@8.4.39) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.39) + postcss-ordered-values: 6.0.2(postcss@8.4.39) + postcss-reduce-initial: 6.1.0(postcss@8.4.39) + postcss-reduce-transforms: 6.0.2(postcss@8.4.39) + postcss-svgo: 6.0.3(postcss@8.4.39) + postcss-unique-selectors: 6.0.4(postcss@8.4.39) + dev: false + /cssnano-utils@4.0.2(postcss@8.4.38): resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.38 + postcss: 8.4.38 + dev: false + + /cssnano-utils@4.0.2(postcss@8.4.39): + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 dev: false /cssnano@6.1.2(postcss@8.4.38): @@ -15072,6 +11984,17 @@ packages: postcss: 8.4.38 dev: false + /cssnano@6.1.2(postcss@8.4.39): + resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + cssnano-preset-default: 6.1.2(postcss@8.4.39) + lilconfig: 3.1.1 + postcss: 8.4.39 + dev: false + /csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -16946,7 +13869,7 @@ packages: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 7.0.4 + minipass: 7.1.2 dev: true /fs-monkey@1.0.5: @@ -17770,13 +14693,13 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.38): + /icss-utils@5.1.0(postcss@8.4.39): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 dev: false /ieee754@1.2.1: @@ -17787,7 +14710,7 @@ packages: resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minimatch: 9.0.4 + minimatch: 9.0.5 dev: true /ignore@5.3.1: @@ -18961,7 +15884,7 @@ packages: cacache: 18.0.2 http-cache-semantics: 4.1.1 is-lambda: 1.0.1 - minipass: 7.0.4 + minipass: 7.1.2 minipass-fetch: 3.0.4 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -19938,14 +16861,14 @@ packages: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - minipass: 7.0.4 + minipass: 7.1.2 dev: true /minipass-fetch@3.0.4: resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 7.0.4 + minipass: 7.1.2 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: @@ -20184,7 +17107,7 @@ packages: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 - glob: 10.3.12 + glob: 10.4.2 graceful-fs: 4.2.11 make-fetch-happen: 13.0.0 nopt: 7.2.0 @@ -20308,7 +17231,7 @@ packages: dependencies: '@npmcli/redact': 2.0.0 make-fetch-happen: 13.0.0 - minipass: 7.0.4 + minipass: 7.1.2 minipass-fetch: 3.0.4 minipass-json-stream: 1.0.1 minizlib: 2.1.2 @@ -20967,6 +17890,17 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-calc@9.0.1(postcss@8.4.39): + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + dev: false + /postcss-colormin@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} engines: {node: ^14 || ^16 || >=18.0} @@ -20980,6 +17914,19 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-colormin@6.1.0(postcss@8.4.39): + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-convert-values@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} engines: {node: ^14 || ^16 || >=18.0} @@ -20991,6 +17938,17 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-convert-values@6.1.0(postcss@8.4.39): + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-discard-comments@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} engines: {node: ^14 || ^16 || >=18.0} @@ -21000,6 +17958,15 @@ packages: postcss: 8.4.38 dev: false + /postcss-discard-comments@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + dev: false + /postcss-discard-duplicates@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} engines: {node: ^14 || ^16 || >=18.0} @@ -21009,6 +17976,15 @@ packages: postcss: 8.4.38 dev: false + /postcss-discard-duplicates@6.0.3(postcss@8.4.39): + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + dev: false + /postcss-discard-empty@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -21018,6 +17994,15 @@ packages: postcss: 8.4.38 dev: false + /postcss-discard-empty@6.0.3(postcss@8.4.39): + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + dev: false + /postcss-discard-overridden@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -21027,13 +18012,22 @@ packages: postcss: 8.4.38 dev: false - /postcss-discard-unused@6.0.5(postcss@8.4.38): + /postcss-discard-overridden@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + dev: false + + /postcss-discard-unused@6.0.5(postcss@8.4.39): resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-selector-parser: 6.0.16 dev: false @@ -21053,14 +18047,14 @@ packages: - typescript dev: false - /postcss-merge-idents@6.0.3(postcss@8.4.38): + /postcss-merge-idents@6.0.3(postcss@8.4.39): resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-utils: 4.0.2(postcss@8.4.38) - postcss: 8.4.38 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 postcss-value-parser: 4.2.0 dev: false @@ -21075,6 +18069,17 @@ packages: stylehacks: 6.1.1(postcss@8.4.38) dev: false + /postcss-merge-longhand@6.0.5(postcss@8.4.39): + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.4.39) + dev: false + /postcss-merge-rules@6.1.1(postcss@8.4.38): resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -21088,6 +18093,19 @@ packages: postcss-selector-parser: 6.0.16 dev: false + /postcss-merge-rules@6.1.1(postcss@8.4.39): + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-selector-parser: 6.0.16 + dev: false + /postcss-minify-font-values@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} engines: {node: ^14 || ^16 || >=18.0} @@ -21098,6 +18116,16 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-minify-font-values@6.1.0(postcss@8.4.39): + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-minify-gradients@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} engines: {node: ^14 || ^16 || >=18.0} @@ -21110,6 +18138,18 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-minify-gradients@6.0.3(postcss@8.4.39): + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-minify-params@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} engines: {node: ^14 || ^16 || >=18.0} @@ -21122,6 +18162,18 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-minify-params@6.1.0(postcss@8.4.39): + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-minify-selectors@6.0.4(postcss@8.4.38): resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -21132,45 +18184,55 @@ packages: postcss-selector-parser: 6.0.16 dev: false - /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): + /postcss-minify-selectors@6.0.4(postcss@8.4.39): + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-modules-extract-imports@3.0.0(postcss@8.4.39): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 dev: false - /postcss-modules-local-by-default@4.0.4(postcss@8.4.38): + /postcss-modules-local-by-default@4.0.4(postcss@8.4.39): resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 + icss-utils: 5.1.0(postcss@8.4.39) + postcss: 8.4.39 postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: false - /postcss-modules-scope@3.1.1(postcss@8.4.38): + /postcss-modules-scope@3.1.1(postcss@8.4.39): resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-selector-parser: 6.0.16 dev: false - /postcss-modules-values@4.0.0(postcss@8.4.38): + /postcss-modules-values@4.0.0(postcss@8.4.39): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 + icss-utils: 5.1.0(postcss@8.4.39) + postcss: 8.4.39 dev: false /postcss-normalize-charset@6.0.2(postcss@8.4.38): @@ -21182,6 +18244,15 @@ packages: postcss: 8.4.38 dev: false + /postcss-normalize-charset@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + dev: false + /postcss-normalize-display-values@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} engines: {node: ^14 || ^16 || >=18.0} @@ -21192,6 +18263,16 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-normalize-display-values@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-positions@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} engines: {node: ^14 || ^16 || >=18.0} @@ -21202,6 +18283,16 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-normalize-positions@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-repeat-style@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -21212,6 +18303,16 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-normalize-repeat-style@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-normalize-string@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -21222,65 +18323,127 @@ packages: postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + /postcss-normalize-string@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-timing-functions@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-unicode@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-unicode@6.1.0(postcss@8.4.39): + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-url@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-url@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode@6.1.0(postcss@8.4.38): - resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - browserslist: 4.23.0 postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + /postcss-normalize-whitespace@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): - resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + /postcss-ordered-values@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: + cssnano-utils: 4.0.2(postcss@8.4.38) postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: false - /postcss-ordered-values@6.0.2(postcss@8.4.38): + /postcss-ordered-values@6.0.2(postcss@8.4.39): resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-utils: 4.0.2(postcss@8.4.38) - postcss: 8.4.38 + cssnano-utils: 4.0.2(postcss@8.4.39) + postcss: 8.4.39 postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-idents@6.0.3(postcss@8.4.38): + /postcss-reduce-idents@6.0.3(postcss@8.4.39): resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 postcss-value-parser: 4.2.0 dev: false @@ -21295,6 +18458,17 @@ packages: postcss: 8.4.38 dev: false + /postcss-reduce-initial@6.1.0(postcss@8.4.39): + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + postcss: 8.4.39 + dev: false + /postcss-reduce-transforms@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} engines: {node: ^14 || ^16 || >=18.0} @@ -21305,6 +18479,16 @@ packages: postcss-value-parser: 4.2.0 dev: false + /postcss-reduce-transforms@6.0.2(postcss@8.4.39): + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + dev: false + /postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} @@ -21313,13 +18497,13 @@ packages: util-deprecate: 1.0.2 dev: false - /postcss-sort-media-queries@5.2.0(postcss@8.4.38): + /postcss-sort-media-queries@5.2.0(postcss@8.4.39): resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.4.23 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 sort-css-media-queries: 2.2.0 dev: false @@ -21334,6 +18518,17 @@ packages: svgo: 3.3.2 dev: false + /postcss-svgo@6.0.3(postcss@8.4.39): + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + dev: false + /postcss-unique-selectors@6.0.4(postcss@8.4.38): resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} engines: {node: ^14 || ^16 || >=18.0} @@ -21344,17 +18539,27 @@ packages: postcss-selector-parser: 6.0.16 dev: false + /postcss-unique-selectors@6.0.4(postcss@8.4.39): + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.39 + postcss-selector-parser: 6.0.16 + dev: false + /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false - /postcss-zindex@6.0.2(postcss@8.4.38): + /postcss-zindex@6.0.2(postcss@8.4.39): resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.38 + postcss: 8.4.39 dev: false /postcss@8.4.38: @@ -21372,7 +18577,6 @@ packages: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 - dev: true /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} @@ -21871,11 +19075,6 @@ packages: webpack: 5.91.0(@swc/core@1.6.7) dev: false - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true - /react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -22419,7 +19618,7 @@ packages: dependencies: escalade: 3.1.2 picocolors: 1.0.1 - postcss: 8.4.38 + postcss: 8.4.39 strip-json-comments: 3.1.1 dev: false @@ -22950,7 +20149,7 @@ packages: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - minipass: 7.0.4 + minipass: 7.1.2 dev: true /stackback@0.0.2: @@ -23178,6 +20377,17 @@ packages: postcss-selector-parser: 6.0.16 dev: false + /stylehacks@6.1.1(postcss@8.4.39): + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.39 + postcss-selector-parser: 6.0.16 + dev: false + /stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} @@ -23276,13 +20486,6 @@ packages: wordwrapjs: 4.0.1 dev: true - /tabster@7.1.3: - resolution: {integrity: sha512-H8I4avK9+PqKCFEFIn5mu3Mz+yPntRrupz+O0LxkMJJ2NPyDj55pyiXwrErDhAm9kyrZFk55n7T0tycni85jmg==} - dependencies: - keyborg: 2.6.0 - tslib: 2.6.2 - dev: false - /tabster@7.3.0: resolution: {integrity: sha512-32w8YrKruie/X26YRnXWgf/OwOu/VbtDt0UgQo6hnZkAnO6dhEbznusNvDtGcD9m5FiKKi+Y/laI7Iaphvpmqw==} dependencies: @@ -23773,12 +20976,6 @@ packages: hasBin: true dev: true - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /typescript@5.5.3: resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} @@ -24044,20 +21241,6 @@ packages: requires-port: 1.0.0 dev: true - /use-disposable@1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-UMaXVlV77dWOu4GqAFNjRzHzowYKUKbJBQfCexvahrYeIz4OkUYUjna4Tjjdf92NH8Nm8J7wEfFRgTIwYjO5jg==} - peerDependencies: - '@types/react': '>=16.8.0 <19.0.0' - '@types/react-dom': '>=16.8.0 <19.0.0' - react: '>=16.8.0 <19.0.0' - react-dom: '>=16.8.0 <19.0.0' - dependencies: - '@types/react': 18.3.2 - '@types/react-dom': 18.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - dev: false - /use-disposable@1.0.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UMaXVlV77dWOu4GqAFNjRzHzowYKUKbJBQfCexvahrYeIz4OkUYUjna4Tjjdf92NH8Nm8J7wEfFRgTIwYjO5jg==} peerDependencies: @@ -24204,108 +21387,6 @@ packages: - terser dev: true - /vite-plugin-checker@0.6.4(eslint@8.57.0)(typescript@5.4.5)(vite@5.2.11): - resolution: {integrity: sha512-2zKHH5oxr+ye43nReRbC2fny1nyARwhxdm0uNYp/ERy4YvU9iZpNOsueoi/luXw5gnpqRSvjcEPxXbS153O2wA==} - engines: {node: '>=14.16'} - peerDependencies: - eslint: '>=7' - meow: ^9.0.0 - optionator: ^0.9.1 - stylelint: '>=13' - typescript: '*' - vite: '>=2.0.0' - vls: '*' - vti: '*' - vue-tsc: '>=1.3.9' - peerDependenciesMeta: - eslint: - optional: true - meow: - optional: true - optionator: - optional: true - stylelint: - optional: true - typescript: - optional: true - vls: - optional: true - vti: - optional: true - vue-tsc: - optional: true - dependencies: - '@babel/code-frame': 7.24.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - chokidar: 3.6.0 - commander: 8.3.0 - eslint: 8.57.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - npm-run-path: 4.0.1 - semver: 7.6.2 - strip-ansi: 6.0.1 - tiny-invariant: 1.3.3 - typescript: 5.4.5 - vite: 5.2.11(@types/node@18.11.19) - vscode-languageclient: 7.0.0 - vscode-languageserver: 7.0.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 - dev: true - - /vite-plugin-checker@0.6.4(eslint@8.57.0)(typescript@5.5.3)(vite@5.2.11): - resolution: {integrity: sha512-2zKHH5oxr+ye43nReRbC2fny1nyARwhxdm0uNYp/ERy4YvU9iZpNOsueoi/luXw5gnpqRSvjcEPxXbS153O2wA==} - engines: {node: '>=14.16'} - peerDependencies: - eslint: '>=7' - meow: ^9.0.0 - optionator: ^0.9.1 - stylelint: '>=13' - typescript: '*' - vite: '>=2.0.0' - vls: '*' - vti: '*' - vue-tsc: '>=1.3.9' - peerDependenciesMeta: - eslint: - optional: true - meow: - optional: true - optionator: - optional: true - stylelint: - optional: true - typescript: - optional: true - vls: - optional: true - vti: - optional: true - vue-tsc: - optional: true - dependencies: - '@babel/code-frame': 7.24.7 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - chokidar: 3.6.0 - commander: 8.3.0 - eslint: 8.57.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - npm-run-path: 4.0.1 - semver: 7.6.2 - strip-ansi: 6.0.1 - tiny-invariant: 1.3.3 - typescript: 5.5.3 - vite: 5.2.11(@types/node@18.11.19) - vscode-languageclient: 7.0.0 - vscode-languageserver: 7.0.0 - vscode-languageserver-textdocument: 1.0.11 - vscode-uri: 3.0.8 - dev: true - /vite-plugin-checker@0.7.0(eslint@8.57.0)(typescript@5.5.3)(vite@5.3.3): resolution: {integrity: sha512-F3MdUORNLcPC0oDB9zxmPDhUC8X/3fzDShU5Izk4bqE4uTgxbQdOuOCa99bS6OSyWVC0uhHG4yAtWUXM2jOx9A==} engines: {node: '>=14.16'} @@ -24357,56 +21438,6 @@ packages: vscode-uri: 3.0.8 dev: true - /vite-plugin-dts@3.9.1(@types/node@18.11.19)(typescript@5.4.5)(vite@5.2.11): - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@18.11.19) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@vue/language-core': 1.8.27(typescript@5.4.5) - debug: 4.3.4 - kolorist: 1.8.0 - magic-string: 0.30.8 - typescript: 5.4.5 - vite: 5.2.11(@types/node@18.11.19) - vue-tsc: 1.8.27(typescript@5.4.5) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - dev: true - - /vite-plugin-dts@3.9.1(@types/node@18.11.19)(typescript@5.5.3)(vite@5.2.11): - resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@18.11.19) - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@vue/language-core': 1.8.27(typescript@5.5.3) - debug: 4.3.4 - kolorist: 1.8.0 - magic-string: 0.30.8 - typescript: 5.5.3 - vite: 5.2.11(@types/node@18.11.19) - vue-tsc: 1.8.27(typescript@5.5.3) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - dev: true - /vite-plugin-dts@3.9.1(@types/node@18.11.19)(typescript@5.5.3)(vite@5.3.3): resolution: {integrity: sha512-rVp2KM9Ue22NGWB8dNtWEr+KekN3rIgz1tWD050QnRGlriUCmaDwa7qA5zDEjbXg5lAXhYMSBJtx3q3hQIJZSg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -24701,18 +21732,6 @@ packages: he: 1.2.0 dev: true - /vue-tsc@1.8.27(typescript@5.4.5): - resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} - hasBin: true - peerDependencies: - typescript: '*' - dependencies: - '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.4.5) - semver: 7.6.2 - typescript: 5.4.5 - dev: true - /vue-tsc@1.8.27(typescript@5.5.3): resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} hasBin: true From 200b5a86e23e0b68c59271303a5df7e81e411248 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 3 Jul 2024 12:50:19 -0700 Subject: [PATCH 70/70] Fix --- packages/html-program-viewer/src/utils.ts | 19 +------------------ packages/html-program-viewer/tsconfig.json | 8 +------- .../react-components/src/tree/tree-control.ts | 3 +-- packages/react-components/src/tree/tree.tsx | 4 ++-- tsconfig.ws.json | 1 - 5 files changed, 5 insertions(+), 30 deletions(-) diff --git a/packages/html-program-viewer/src/utils.ts b/packages/html-program-viewer/src/utils.ts index 4b15a8319b..b048ae0f07 100644 --- a/packages/html-program-viewer/src/utils.ts +++ b/packages/html-program-viewer/src/utils.ts @@ -1,22 +1,5 @@ -import { getNamespaceFullName, type Type, type Union } from "@typespec/compiler"; +import type { Type, Union } from "@typespec/compiler"; -export function getIdForType(type: Type): string | undefined { - if (type.kind === "Namespace") { - return getNamespaceFullName(type); - } else if ("interface" in type && type.interface) { - return `${getIdForType(type.interface)}.${type.name}`; - } else if ("model" in type && type.model) { - return `${getIdForType(type.model)}.${type.name}`; - } else if ("namespace" in type && type.namespace) { - return type.namespace.name === "" - ? type.name - : `${getNamespaceFullName(type.namespace)}.${type.name}`; - } else if ("name" in type) { - return type.name?.toString(); - } else { - return undefined; - } -} export type NamedType = Type & { name: string }; export function isNamedUnion(union: Union): union is Union & { name: string } { diff --git a/packages/html-program-viewer/tsconfig.json b/packages/html-program-viewer/tsconfig.json index 4fac8c7da6..6ecf53c452 100644 --- a/packages/html-program-viewer/tsconfig.json +++ b/packages/html-program-viewer/tsconfig.json @@ -1,10 +1,6 @@ { "extends": "../../tsconfig.base.json", - "references": [ - { "path": "../compiler/tsconfig.json" }, - { "path": "../rest/tsconfig.json" }, - { "path": "../openapi/tsconfig.json" } - ], + "references": [{ "path": "../compiler/tsconfig.json" }], "compilerOptions": { "incremental": false, "composite": false, @@ -12,8 +8,6 @@ "moduleResolution": "NodeNext", "sourceMap": false, "resolveJsonModule": true, - "outDir": "dist", - "rootDir": ".", "skipLibCheck": true, "verbatimModuleSyntax": true, "jsx": "react-jsx", diff --git a/packages/react-components/src/tree/tree-control.ts b/packages/react-components/src/tree/tree-control.ts index 9552e30eb4..69d35d48e8 100644 --- a/packages/react-components/src/tree/tree-control.ts +++ b/packages/react-components/src/tree/tree-control.ts @@ -1,7 +1,6 @@ import { useCallback, useMemo, useRef, useState } from "react"; export interface TreeControls { - readonly renderSignal: number; readonly expanded: Set; expand(key: string): void; collapse(key: string): void; @@ -46,7 +45,7 @@ export function useTreeControls({ onSetExpanded }: TreeControlsOptions): TreeCon ); return useMemo( - () => ({ expanded, toggleExpand, expand, collapse, renderSignal: rerender }), + () => ({ expanded: new Set(expanded), toggleExpand, expand, collapse }), [expanded, toggleExpand, expand, collapse, expanded, rerender] ); } diff --git a/packages/react-components/src/tree/tree.tsx b/packages/react-components/src/tree/tree.tsx index 6aec8a9479..c2f57e66d6 100644 --- a/packages/react-components/src/tree/tree.tsx +++ b/packages/react-components/src/tree/tree.tsx @@ -36,7 +36,7 @@ export function Tree({ selectionMode = "none", }: TreeProps) { const id = useId(); - const { expanded, toggleExpand, expand, collapse, renderSignal } = useTreeControls({ + const { expanded, toggleExpand, expand, collapse } = useTreeControls({ onSetExpanded, }); const [focusedIndex, setFocusedIndex] = useState(-1); @@ -44,7 +44,7 @@ export function Tree({ const rows = useMemo( () => getTreeRowsForNode(expanded, toggleExpand, tree), - [renderSignal, toggleExpand, tree] + [expanded, toggleExpand, tree] ); const parentMap = useMemo(() => computeParent(tree), [tree]); diff --git a/tsconfig.ws.json b/tsconfig.ws.json index 9265722378..6de7597a04 100644 --- a/tsconfig.ws.json +++ b/tsconfig.ws.json @@ -11,7 +11,6 @@ { "path": "packages/internal-build-utils/tsconfig.json" }, { "path": "packages/bundle-uploader/tsconfig.json" }, { "path": "packages/tmlanguage-generator/tsconfig.json" }, - { "path": "packages/html-program-viewer/tsconfig.json" }, { "path": "packages/protobuf/tsconfig.json" }, { "path": "packages/openapi3/tsconfig.json" }, { "path": "packages/monarch/tsconfig.json" },