diff --git a/change/@ni-nimble-react-87afa7f5-520c-4a7f-b04b-a3b510dc0f43.json b/change/@ni-nimble-react-87afa7f5-520c-4a7f-b04b-a3b510dc0f43.json
new file mode 100644
index 0000000000..ae4858f06f
--- /dev/null
+++ b/change/@ni-nimble-react-87afa7f5-520c-4a7f-b04b-a3b510dc0f43.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "Switch to package exports",
+ "packageName": "@ni/nimble-react",
+ "email": "rajsite@users.noreply.github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@ni-ok-react-75f3e0c4-573f-4603-a3f5-dd12c50a7dcb.json b/change/@ni-ok-react-75f3e0c4-573f-4603-a3f5-dd12c50a7dcb.json
new file mode 100644
index 0000000000..bd412f6300
--- /dev/null
+++ b/change/@ni-ok-react-75f3e0c4-573f-4603-a3f5-dd12c50a7dcb.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "Switch to package exports",
+ "packageName": "@ni/ok-react",
+ "email": "rajsite@users.noreply.github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/change/@ni-spright-react-f4aefe44-b717-4641-9803-312fbc4d9ddf.json b/change/@ni-spright-react-f4aefe44-b717-4641-9803-312fbc4d9ddf.json
new file mode 100644
index 0000000000..d3b9b47f6b
--- /dev/null
+++ b/change/@ni-spright-react-f4aefe44-b717-4641-9803-312fbc4d9ddf.json
@@ -0,0 +1,7 @@
+{
+ "type": "minor",
+ "comment": "Switch to package exports",
+ "packageName": "@ni/spright-react",
+ "email": "rajsite@users.noreply.github.com",
+ "dependentChangeType": "patch"
+}
diff --git a/packages/react-workspace/nimble-react/.npmignore b/packages/react-workspace/nimble-react/.npmignore
index 8529ba2a33..d1f6f6d931 100644
--- a/packages/react-workspace/nimble-react/.npmignore
+++ b/packages/react-workspace/nimble-react/.npmignore
@@ -1,4 +1,5 @@
*
+!/styles/*
!/dist/*.*
!/dist/esm/**
/dist/esm/**/tests
diff --git a/packages/react-workspace/nimble-react/build/generate-icons/source/index.js b/packages/react-workspace/nimble-react/build/generate-icons.mjs
similarity index 85%
rename from packages/react-workspace/nimble-react/build/generate-icons/source/index.js
rename to packages/react-workspace/nimble-react/build/generate-icons.mjs
index 60af163b9a..d0e346f7bd 100644
--- a/packages/react-workspace/nimble-react/build/generate-icons/source/index.js
+++ b/packages/react-workspace/nimble-react/build/generate-icons.mjs
@@ -2,10 +2,9 @@
* Build script for generating React wrappers for Nimble icon components.
*/
import { pascalCase, spinalCase } from '@ni/fast-web-utilities';
-import * as icons from '@ni/nimble-tokens/dist/icons/js';
-
-const fs = require('fs');
-const path = require('path');
+import * as icons from '@ni/nimble-tokens/dist/icons/js/index.js';
+import * as path from 'node:path';
+import * as fs from 'node:fs';
const trimSizeFromName = text => {
// Remove dimensions from icon name, e.g. "add16X16" -> "add"
@@ -15,7 +14,7 @@ const trimSizeFromName = text => {
const generatedFilePrefix = `// AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
// See generation source in nimble-react/build/generate-icons\n`;
-const iconsDirectory = path.resolve(__dirname, '../../../src/icons');
+const iconsDirectory = path.resolve(import.meta.dirname, '../src/icons');
if (fs.existsSync(iconsDirectory)) {
console.log(`Deleting existing icons directory "${iconsDirectory}"`);
@@ -49,4 +48,4 @@ export const Nimble${className} = wrap(${className});`;
encoding: 'utf-8'
});
}
-console.log(`Finshed writing ${fileCount} icon react wrapper files`);
+console.log(`Finished writing ${fileCount} icon react wrapper files`);
diff --git a/packages/react-workspace/nimble-react/build/generate-icons/rollup.config.js b/packages/react-workspace/nimble-react/build/generate-icons/rollup.config.js
deleted file mode 100644
index 89a182bd41..0000000000
--- a/packages/react-workspace/nimble-react/build/generate-icons/rollup.config.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { nodeResolve } from '@rollup/plugin-node-resolve';
-
-const path = require('path');
-
-export default {
- input: path.resolve(__dirname, 'source/index.js'),
- output: {
- file: path.resolve(__dirname, 'dist/index.js'),
- format: 'cjs'
- },
- plugins: [nodeResolve()]
-};
diff --git a/packages/react-workspace/nimble-react/eslint.config.mjs b/packages/react-workspace/nimble-react/eslint.config.mjs
index a16fca345f..ae6c76e9a1 100644
--- a/packages/react-workspace/nimble-react/eslint.config.mjs
+++ b/packages/react-workspace/nimble-react/eslint.config.mjs
@@ -1,20 +1,16 @@
import { defineConfig, globalIgnores } from 'eslint/config';
-import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble';
+import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript';
+import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble';
export default defineConfig([
globalIgnores(['**/dist/']),
lintNimbleConfig,
{
- files: ['**/*.js', '**/*.cjs'],
- extends: javascriptNimbleConfig,
+ files: ['build/**/*.mjs'],
+ extends: [javascriptConfig, importNodeEsmConfig],
rules: {
// Configuration scripts will not be in published package and are allowed to use devDependencies
'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
- },
- },
- {
- files: ['**/build/**/*.js'],
- rules: {
// Build scripts should give verbose logging
'no-console': 'off',
// Rollup config files use default exports
diff --git a/packages/react-workspace/nimble-react/package.json b/packages/react-workspace/nimble-react/package.json
index a0c9d1d2b0..28ba6a078c 100644
--- a/packages/react-workspace/nimble-react/package.json
+++ b/packages/react-workspace/nimble-react/package.json
@@ -7,11 +7,32 @@
"nimble",
"react"
],
+ "type": "module",
+ "exports": {
+ "./package.json": "./package.json",
+ "./styles/*": "./styles/*",
+ "./icons/*": {
+ "types": "./dist/esm/icons/*.d.ts",
+ "import": "./dist/esm/icons/*.js"
+ },
+ "./*": {
+ "types": "./dist/esm/*.d.ts",
+ "import": "./dist/esm/*/index.js"
+ }
+ },
+ "typesVersions": {
+ "*": {
+ "icons/*": [
+ "dist/esm/icons/*.d.ts"
+ ],
+ "*": [
+ "dist/esm/*/index.d.ts"
+ ]
+ }
+ },
"scripts": {
"build": "npm run build:icons && npm run build:components",
- "build:icons": "npm run build:icons:bundle && npm run build:icons:run",
- "build:icons:bundle": "rollup --bundleConfigAsCjs --config build/generate-icons/rollup.config.js",
- "build:icons:run": "node build/generate-icons/dist/index.js",
+ "build:icons": "node build/generate-icons.mjs",
"build:components": "tsc -p ./tsconfig.json",
"lint": "eslint .",
"format": "eslint . --fix",
@@ -32,8 +53,6 @@
"@ni/fast-web-utilities": "^10.0.0",
"@ni/nimble-components": "^34.10.3",
"@ni/nimble-tokens": "^8.13.6",
- "@rollup/plugin-node-resolve": "^16.0.0",
- "rollup": "^4.12.0",
"typescript": "~5.8.3"
},
"peerDependencies": {
diff --git a/packages/react-workspace/nimble-react/src/utilities/react-wrapper/index.ts b/packages/react-workspace/nimble-react/src/utilities/react-wrapper.ts
similarity index 100%
rename from packages/react-workspace/nimble-react/src/utilities/react-wrapper/index.ts
rename to packages/react-workspace/nimble-react/src/utilities/react-wrapper.ts
diff --git a/packages/react-workspace/nimble-react/tsconfig.json b/packages/react-workspace/nimble-react/tsconfig.json
index 428c889a36..2d8a6fa0a0 100644
--- a/packages/react-workspace/nimble-react/tsconfig.json
+++ b/packages/react-workspace/nimble-react/tsconfig.json
@@ -2,7 +2,7 @@
"compilerOptions": {
"declaration": true,
"esModuleInterop": true,
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
"outDir": "dist/esm",
"strict": true,
"experimentalDecorators": true,
diff --git a/packages/react-workspace/ok-react/eslint.config.mjs b/packages/react-workspace/ok-react/eslint.config.mjs
index b83cb81ca1..bf08d6e015 100644
--- a/packages/react-workspace/ok-react/eslint.config.mjs
+++ b/packages/react-workspace/ok-react/eslint.config.mjs
@@ -1,17 +1,9 @@
import { defineConfig, globalIgnores } from 'eslint/config';
-import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble';
+import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble';
export default defineConfig([
globalIgnores(['**/dist/']),
lintNimbleConfig,
- {
- files: ['**/*.js', '**/*.cjs'],
- extends: javascriptNimbleConfig,
- rules: {
- // Configuration scripts will not be in published package and are allowed to use devDependencies
- 'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
- }
- },
{
files: ['**/*.ts'],
extends: typescriptNimbleConfig,
diff --git a/packages/react-workspace/ok-react/package.json b/packages/react-workspace/ok-react/package.json
index f75375b883..bcd0f7f5ef 100644
--- a/packages/react-workspace/ok-react/package.json
+++ b/packages/react-workspace/ok-react/package.json
@@ -7,6 +7,21 @@
"ok",
"react"
],
+ "type": "module",
+ "exports": {
+ "./package.json": "./package.json",
+ "./*": {
+ "types": "./dist/esm/*.d.ts",
+ "import": "./dist/esm/*/index.js"
+ }
+ },
+ "typesVersions": {
+ "*": {
+ "*": [
+ "dist/esm/*/index.d.ts"
+ ]
+ }
+ },
"scripts": {
"build": "tsc -p ./tsconfig.json",
"lint": "eslint .",
diff --git a/packages/react-workspace/ok-react/src/utilities/react-wrapper/index.ts b/packages/react-workspace/ok-react/src/utilities/react-wrapper.ts
similarity index 100%
rename from packages/react-workspace/ok-react/src/utilities/react-wrapper/index.ts
rename to packages/react-workspace/ok-react/src/utilities/react-wrapper.ts
diff --git a/packages/react-workspace/ok-react/tsconfig.json b/packages/react-workspace/ok-react/tsconfig.json
index 428c889a36..2d8a6fa0a0 100644
--- a/packages/react-workspace/ok-react/tsconfig.json
+++ b/packages/react-workspace/ok-react/tsconfig.json
@@ -2,7 +2,7 @@
"compilerOptions": {
"declaration": true,
"esModuleInterop": true,
- "moduleResolution": "node",
+ "moduleResolution": "bundler",
"outDir": "dist/esm",
"strict": true,
"experimentalDecorators": true,
diff --git a/packages/react-workspace/react-client-app/.npmignore b/packages/react-workspace/react-client-app/.npmignore
new file mode 100644
index 0000000000..f275676171
--- /dev/null
+++ b/packages/react-workspace/react-client-app/.npmignore
@@ -0,0 +1,2 @@
+*
+!/dist/*.*
diff --git a/packages/react-workspace/react-client-app/eslint.config.mjs b/packages/react-workspace/react-client-app/eslint.config.mjs
index 6a3ab28eb1..863983589b 100644
--- a/packages/react-workspace/react-client-app/eslint.config.mjs
+++ b/packages/react-workspace/react-client-app/eslint.config.mjs
@@ -2,17 +2,22 @@ import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import { defineConfig, globalIgnores } from 'eslint/config';
-import { lintNimbleConfig, javascriptNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble';
+import { javascriptConfig, importNodeEsmConfig } from '@ni/eslint-config-javascript';
+import { lintNimbleConfig, typescriptNimbleConfig } from '@ni-private/eslint-config-nimble';
export default defineConfig([
globalIgnores(['**/dist/']),
lintNimbleConfig,
{
- files: ['**/*.js', '**/*.cjs'],
- extends: javascriptNimbleConfig,
+ files: ['vite.config.mjs'],
+ extends: [javascriptConfig, importNodeEsmConfig],
rules: {
// Configuration scripts will not be in published package and are allowed to use devDependencies
'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
+ // Build scripts should give verbose logging
+ 'no-console': 'off',
+ // Rollup config files use default exports
+ 'import/no-default-export': 'off',
},
},
{
@@ -30,7 +35,7 @@ export default defineConfig([
],
languageOptions: {
parserOptions: {
- project: './tsconfig.app.json',
+ project: './tsconfig.json',
tsconfigRootDir: import.meta.dirname,
ecmaFeatures: {
jsx: true,
@@ -58,19 +63,5 @@ export default defineConfig([
'@typescript-eslint/strict-boolean-expressions': 'off',
'no-alert': 'off',
},
- },
- {
- files: ['**/vite.config.ts'],
- languageOptions: {
- parserOptions: {
- project: './tsconfig.node.json',
- tsconfigRootDir: import.meta.dirname,
- },
- },
- rules: {
- // Configuration scripts will not be in published package and are allowed to use devDependencies
- 'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
- 'import/no-default-export': 'off',
- },
}
]);
diff --git a/packages/react-workspace/react-client-app/package.json b/packages/react-workspace/react-client-app/package.json
index 178258d2dd..6492f0018a 100644
--- a/packages/react-workspace/react-client-app/package.json
+++ b/packages/react-workspace/react-client-app/package.json
@@ -6,6 +6,7 @@
"scripts": {
"start": "vite",
"build": "tsc -b && vite build",
+ "test": "tsc -p ./tsconfig.legacy.json",
"lint": "eslint .",
"format": "eslint . --fix",
"pack": "npm pack"
diff --git a/packages/react-workspace/react-client-app/src/components/App.tsx b/packages/react-workspace/react-client-app/src/components/App.tsx
index 100788004f..eaa41a315a 100644
--- a/packages/react-workspace/react-client-app/src/components/App.tsx
+++ b/packages/react-workspace/react-client-app/src/components/App.tsx
@@ -1,70 +1,70 @@
-import { NimbleThemeProvider, Theme } from '@ni/nimble-react/dist/esm/theme-provider';
-import { NimbleAnchor } from '@ni/nimble-react/dist/esm/anchor';
-import { NimbleButton } from '@ni/nimble-react/dist/esm/button';
-import { NimbleBanner } from '@ni/nimble-react/dist/esm/banner';
-import { NimbleBreadcrumb } from '@ni/nimble-react/dist/esm/breadcrumb';
-import { NimbleBreadcrumbItem } from '@ni/nimble-react/dist/esm/breadcrumb-item';
-import { NimbleToggleButton } from '@ni/nimble-react/dist/esm/toggle-button';
-import { NimbleAnchorButton } from '@ni/nimble-react/dist/esm/anchor-button';
-import { NimbleCard } from '@ni/nimble-react/dist/esm/card';
-import { NimbleNumberField } from '@ni/nimble-react/dist/esm/number-field';
-import { NimbleSelect, type Select, type SelectChangeEvent, type SelectFilterInputEvent } from '@ni/nimble-react/dist/esm/select';
-import { NimbleListOption } from '@ni/nimble-react/dist/esm/list-option';
-import { NimbleListOptionGroup } from '@ni/nimble-react/dist/esm/list-option-group';
-import { NimbleCardButton } from '@ni/nimble-react/dist/esm/card-button';
-import { NimbleCheckbox } from '@ni/nimble-react/dist/esm/checkbox';
-import { NimbleRadioGroup } from '@ni/nimble-react/dist/esm/radio-group';
-import { NimbleRadio } from '@ni/nimble-react/dist/esm/radio';
-import { NimbleTextField } from '@ni/nimble-react/dist/esm/text-field';
-import { NimbleDialog, type Dialog, type DialogRef, DialogUserDismissed } from '@ni/nimble-react/dist/esm/dialog';
-import { NimbleDrawer, type Drawer, type DrawerRef, DrawerUserDismissed, DrawerLocation } from '@ni/nimble-react/dist/esm/drawer';
-import { NimbleMenu } from '@ni/nimble-react/dist/esm/menu';
-import { NimbleMenuItem, type MenuItemChangeEvent } from '@ni/nimble-react/dist/esm/menu-item';
-import { NimbleAnchorMenuItem } from '@ni/nimble-react/dist/esm/anchor-menu-item';
-import { NimbleMenuButton } from '@ni/nimble-react/dist/esm/menu-button';
-import { NimbleIconAdd } from '@ni/nimble-react/dist/esm/icons/add';
-import { NimbleIconCheck } from '@ni/nimble-react/dist/esm/icons/check';
-import { NimbleIconXmarkCheck } from '@ni/nimble-react/dist/esm/icons/xmark-check';
-import { NimbleSpinner } from '@ni/nimble-react/dist/esm/spinner';
-import { NimbleSwitch } from '@ni/nimble-react/dist/esm/switch';
-import { NimbleTable, type Table, type TableRowExpandToggleEvent, type TableRecord, type TableSetRecordHierarchyOptions, type TableRef } from '@ni/nimble-react/dist/esm/table';
-import { NimbleTableColumnText } from '@ni/nimble-react/dist/esm/table-column/text';
-import { NimbleTableColumnAnchor } from '@ni/nimble-react/dist/esm/table-column/anchor';
-import { NimbleTableColumnDateText } from '@ni/nimble-react/dist/esm/table-column/date-text';
-import { NimbleTableColumnMapping } from '@ni/nimble-react/dist/esm/table-column/mapping';
-import { NimbleMappingText } from '@ni/nimble-react/dist/esm/mapping/text';
-import { NimbleMappingIcon } from '@ni/nimble-react/dist/esm/mapping/icon';
-import { NimbleMappingSpinner } from '@ni/nimble-react/dist/esm/mapping/spinner';
-import { NimbleMappingEmpty } from '@ni/nimble-react/dist/esm/mapping/empty';
-import { NimbleTableColumnNumberText } from '@ni/nimble-react/dist/esm/table-column/number-text';
-import { NimbleTableColumnDurationText } from '@ni/nimble-react/dist/esm/table-column/duration-text';
-import { NimbleTableColumnMenuButton, type TableColumnMenuButtonBeforeToggleEvent } from '@ni/nimble-react/dist/esm/table-column/menu-button';
-import { NimbleTabs } from '@ni/nimble-react/dist/esm/tabs';
-import { NimbleTab } from '@ni/nimble-react/dist/esm/tab';
-import { NimbleTabsToolbar } from '@ni/nimble-react/dist/esm/tabs-toolbar';
-import { NimbleTabPanel } from '@ni/nimble-react/dist/esm/tab-panel';
-import { NimbleAnchorTabs } from '@ni/nimble-react/dist/esm/anchor-tabs';
-import { NimbleAnchorTab } from '@ni/nimble-react/dist/esm/anchor-tab';
-import { NimbleTextArea } from '@ni/nimble-react/dist/esm/text-area';
-import { NimbleToolbar } from '@ni/nimble-react/dist/esm/toolbar';
-import { NimbleTooltip } from '@ni/nimble-react/dist/esm/tooltip';
-import { NimbleTreeView } from '@ni/nimble-react/dist/esm/tree-view';
-import { NimbleTreeItem } from '@ni/nimble-react/dist/esm/tree-item';
-import { NimbleAnchorTreeItem } from '@ni/nimble-react/dist/esm/anchor-tree-item';
-import { NimbleCombobox } from '@ni/nimble-react/dist/esm/combobox';
-import { NimbleRichTextEditor, type RichTextEditor } from '@ni/nimble-react/dist/esm/rich-text/editor';
-import { NimbleRichTextMentionUsers } from '@ni/nimble-react/dist/esm/rich-text-mention/users';
-import { NimbleMappingUser } from '@ni/nimble-react/dist/esm/mapping/user';
-import { NimbleRichTextViewer } from '@ni/nimble-react/dist/esm/rich-text/viewer';
-import { SprightChatConversation } from '@ni/spright-react/dist/esm/chat/conversation';
-import { SprightChatInput } from '@ni/spright-react/dist/esm/chat/input';
-import { SprightChatMessage } from '@ni/spright-react/dist/esm/chat/message';
-import { NimbleIconCopyText } from '@ni/nimble-react/dist/esm/icons/copy-text';
-import { NimbleIconWebviCustom } from '@ni/nimble-react/dist/esm/icons/webvi-custom';
+import { NimbleThemeProvider, Theme } from '@ni/nimble-react/theme-provider';
+import { NimbleAnchor } from '@ni/nimble-react/anchor';
+import { NimbleButton } from '@ni/nimble-react/button';
+import { NimbleBanner } from '@ni/nimble-react/banner';
+import { NimbleBreadcrumb } from '@ni/nimble-react/breadcrumb';
+import { NimbleBreadcrumbItem } from '@ni/nimble-react/breadcrumb-item';
+import { NimbleToggleButton } from '@ni/nimble-react/toggle-button';
+import { NimbleAnchorButton } from '@ni/nimble-react/anchor-button';
+import { NimbleCard } from '@ni/nimble-react/card';
+import { NimbleNumberField } from '@ni/nimble-react/number-field';
+import { NimbleSelect, type Select, type SelectChangeEvent, type SelectFilterInputEvent } from '@ni/nimble-react/select';
+import { NimbleListOption } from '@ni/nimble-react/list-option';
+import { NimbleListOptionGroup } from '@ni/nimble-react/list-option-group';
+import { NimbleCardButton } from '@ni/nimble-react/card-button';
+import { NimbleCheckbox } from '@ni/nimble-react/checkbox';
+import { NimbleRadioGroup } from '@ni/nimble-react/radio-group';
+import { NimbleRadio } from '@ni/nimble-react/radio';
+import { NimbleTextField } from '@ni/nimble-react/text-field';
+import { NimbleDialog, type Dialog, type DialogRef, DialogUserDismissed } from '@ni/nimble-react/dialog';
+import { NimbleDrawer, type Drawer, type DrawerRef, DrawerUserDismissed, DrawerLocation } from '@ni/nimble-react/drawer';
+import { NimbleMenu } from '@ni/nimble-react/menu';
+import { NimbleMenuItem, type MenuItemChangeEvent } from '@ni/nimble-react/menu-item';
+import { NimbleAnchorMenuItem } from '@ni/nimble-react/anchor-menu-item';
+import { NimbleMenuButton } from '@ni/nimble-react/menu-button';
+import { NimbleIconAdd } from '@ni/nimble-react/icons/add';
+import { NimbleIconCheck } from '@ni/nimble-react/icons/check';
+import { NimbleIconXmarkCheck } from '@ni/nimble-react/icons/xmark-check';
+import { NimbleSpinner } from '@ni/nimble-react/spinner';
+import { NimbleSwitch } from '@ni/nimble-react/switch';
+import { NimbleTable, type Table, type TableRef, type TableRowExpandToggleEvent, type TableRecord, type TableSetRecordHierarchyOptions } from '@ni/nimble-react/table';
+import { NimbleTableColumnText } from '@ni/nimble-react/table-column/text';
+import { NimbleTableColumnAnchor } from '@ni/nimble-react/table-column/anchor';
+import { NimbleTableColumnDateText } from '@ni/nimble-react/table-column/date-text';
+import { NimbleTableColumnMapping } from '@ni/nimble-react/table-column/mapping';
+import { NimbleMappingText } from '@ni/nimble-react/mapping/text';
+import { NimbleMappingIcon } from '@ni/nimble-react/mapping/icon';
+import { NimbleMappingSpinner } from '@ni/nimble-react/mapping/spinner';
+import { NimbleMappingEmpty } from '@ni/nimble-react/mapping/empty';
+import { NimbleTableColumnNumberText } from '@ni/nimble-react/table-column/number-text';
+import { NimbleTableColumnDurationText } from '@ni/nimble-react/table-column/duration-text';
+import { NimbleTableColumnMenuButton, type TableColumnMenuButtonBeforeToggleEvent } from '@ni/nimble-react/table-column/menu-button';
+import { NimbleTabs } from '@ni/nimble-react/tabs';
+import { NimbleTab } from '@ni/nimble-react/tab';
+import { NimbleTabsToolbar } from '@ni/nimble-react/tabs-toolbar';
+import { NimbleTabPanel } from '@ni/nimble-react/tab-panel';
+import { NimbleAnchorTabs } from '@ni/nimble-react/anchor-tabs';
+import { NimbleAnchorTab } from '@ni/nimble-react/anchor-tab';
+import { NimbleTextArea } from '@ni/nimble-react/text-area';
+import { NimbleToolbar } from '@ni/nimble-react/toolbar';
+import { NimbleTooltip } from '@ni/nimble-react/tooltip';
+import { NimbleTreeView } from '@ni/nimble-react/tree-view';
+import { NimbleTreeItem } from '@ni/nimble-react/tree-item';
+import { NimbleAnchorTreeItem } from '@ni/nimble-react/anchor-tree-item';
+import { NimbleCombobox } from '@ni/nimble-react/combobox';
+import { NimbleRichTextEditor, type RichTextEditor } from '@ni/nimble-react/rich-text/editor';
+import { NimbleRichTextMentionUsers } from '@ni/nimble-react/rich-text-mention/users';
+import { NimbleMappingUser } from '@ni/nimble-react/mapping/user';
+import { NimbleRichTextViewer } from '@ni/nimble-react/rich-text/viewer';
+import { SprightChatConversation } from '@ni/spright-react/chat/conversation';
+import { SprightChatInput } from '@ni/spright-react/chat/input';
+import { SprightChatMessage } from '@ni/spright-react/chat/message';
+import { NimbleIconCopyText } from '@ni/nimble-react/icons/copy-text';
+import { NimbleIconWebviCustom } from '@ni/nimble-react/icons/webvi-custom';
-import { SprightRectangle } from '@ni/spright-react/dist/esm/rectangle';
+import { SprightRectangle } from '@ni/spright-react/rectangle';
-import { OkButton } from '@ni/ok-react/dist/esm/button';
+import { OkButton } from '@ni/ok-react/button';
import './App.scss';
import { useRef, useState, useEffect } from 'react';
diff --git a/packages/react-workspace/react-client-app/src/vite-env.d.ts b/packages/react-workspace/react-client-app/src/vite-env.d.ts
deleted file mode 100644
index 11f02fe2a0..0000000000
--- a/packages/react-workspace/react-client-app/src/vite-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-///