feat(smart-app): implement complete mobile app MVP

- App.tsx: full navigation (Auth stack + Main tabs with 5 screens)
- Auth: LoginScreen, RegisterScreen, ForgotPasswordScreen
- HomeScreen: dashboard with IoT metrics, weather widget, alerts, quick actions, sensors
- MapScreen: interactive map with layer toggles (6 layers)
- MarketplaceScreen: categories (6), products (5), search
- ChatScreen: AI chat with quick prompts (4), bot responses
- ProfileScreen: user info, stats, menu (9 items), logout
- AlertsScreen: alert list with severity, acknowledge
- SensorsScreen: sensor list with type filters (6 types), search
- ZonesScreen: zone cards with stats
- SettingsScreen: language picker (FR/EN/ES/DE), privacy, about
- Stores: iotStore (sensors, zones, alerts), notificationStore, uiStore + i18n
- Hooks: useSensors, useAlerts, useNotifications, useLocation
- Components: Card, Button, LoadingSpinner, ErrorBoundary, Header
- Services: iotService, notificationService (with axios API client)
- Utils: formatters (temp, AQI, noise, dates), validators (email, password, IBAN)
- Theme: colors.ts with full design system (Blue Ocean palette)
- Ditto: fixed MongoDB connection, new JWT secrets, official gateway image
This commit is contained in:
Eric FELIXINE
2026-06-01 18:00:35 -04:00
parent 08ca495bde
commit e30ae8ed09
35578 changed files with 3703534 additions and 43 deletions

View File

@@ -0,0 +1,92 @@
# @react-native/community-cli-plugin
> This is an internal dependency of React Native. **Please don't depend on it directly.**
CLI entry points supporting core React Native development features.
Formerly [@react-native-community/cli-plugin-metro](https://www.npmjs.com/package/@react-native-community/cli-plugin-metro).
## Commands
### `start`
Start the React Native development server.
#### Usage
```sh
npx react-native start [options]
```
#### Options
| Option | Description |
| - | - |
| `--port <number>` | Set the server port. |
| `--host <string>` | Set the server host. |
| `--projectRoot <path>` | Set the path to the project root. |
| `--watchFolders <list>` | Specify additional folders to be added to the watch list. |
| `--assetPlugins <list>` | Specify additional asset plugins. |
| `--sourceExts <list>` | Specify additional source extensions to bundle. |
| `--max-workers <number>` | Set the maximum number of workers the worker-pool will spawn for transforming files. Defaults to the number of the cores available on your machine. |
| `--transformer <string>` | Specify a custom transformer. |
| `--reset-cache` | Remove cached files. |
| `--custom-log-reporter-path <string>` | Specify a module path exporting a replacement for `TerminalReporter`. |
| `--https` | Enable HTTPS connections. |
| `--key <path>`| Specify path to a custom SSL key. |
| `--cert <path>` | Specify path to a custom SSL cert. |
| `--config <string>` | Path to the CLI configuration file. |
| `--no-interactive` | Disable interactive mode. |
### `bundle`
Build the bundle for the provided JavaScript entry file.
#### Usage
```sh
npx react-native bundle --entry-file <path> [options]
```
#### Options
| Option | Description |
| - | - |
| `--entry-file <path>` | Set the path to the root JavaScript entry file. |
| `--platform <string>` | Set the target platform (either `"android"` or `"ios"`). Defaults to `"ios"`. |
| `--transformer <string>` | Specify a custom transformer. |
| `--dev [boolean]` | If `false`, warnings are disabled and the bundle is minified. Defaults to `true`. |
| `--minify [boolean]` | Allows overriding whether bundle is minified. Defaults to `false` if `--dev` is set. Disabling minification can be useful for speeding up production builds for testing purposes. |
| `--bundle-output <string>` | Specify the path to store the resulting bundle. |
| `--bundle-encoding <string>` | Specify the encoding for writing the bundle (<https://nodejs.org/api/buffer.html#buffer_buffer>). |
| `--resolver-option <string...>` | Custom resolver options of the form key=value. URL-encoded. May be specified multiple times. |
| `--sourcemap-output <string>` | Specify the path to store the source map file for the resulting bundle. |
| `--sourcemap-sources-root <string>` | Set the root path for source map entries. |
| `--sourcemap-use-absolute-path` | Report `SourceMapURL` using its full path. |
| `--max-workers <number>` | Set the maximum number of workers the worker-pool will spawn for transforming files. Defaults to the number of the cores available on your machine. |
| `--assets-dest <string>` | Specify the directory path for storing assets referenced in the bundle. |
| `--reset-cache` | Remove cached files. |
| `--read-global-cache` | Attempt to fetch transformed JS code from the global cache, if configured. Defaults to `false`. |
| `--config <string>` | Path to the CLI configuration file. |
### `ram-bundle`
Build the [RAM bundle](https://reactnative.dev/docs/ram-bundles-inline-requires) for the provided JavaScript entry file.
#### Usage
```sh
npx react-native ram-bundle --entry-file <path> [options]
```
#### Options
Accepts all options supported by [`bundle`](#bundle) and the following:
| Option | Description |
| - | - |
| `--indexed-ram-bundle` | Force the "Indexed RAM" bundle file format, even when building for Android. |
## Contributing
Changes to this package can be made locally and tested against the `rn-tester` app, per the [Contributing guide](https://reactnative.dev/contributing/overview#contributing-code). During development, this package is automatically run from source with no build step.

View File

@@ -0,0 +1,77 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.cleanAssetCatalog = cleanAssetCatalog;
exports.getImageSet = getImageSet;
exports.isCatalogAsset = isCatalogAsset;
exports.writeImageSet = writeImageSet;
var _assetPathUtils = _interopRequireDefault(require("./assetPathUtils"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
function cleanAssetCatalog(catalogDir) {
const files = _fs.default
.readdirSync(catalogDir)
.filter((file) => file.endsWith(".imageset"));
for (const file of files) {
_fs.default.rmSync(_path.default.join(catalogDir, file), {
recursive: true,
force: true,
});
}
}
function getImageSet(catalogDir, asset, scales) {
const fileName = _assetPathUtils.default.getResourceIdentifier(asset);
return {
basePath: _path.default.join(catalogDir, `${fileName}.imageset`),
files: scales.map((scale, idx) => {
const suffix = scale === 1 ? "" : `@${scale}x`;
return {
name: `${fileName + suffix}.${asset.type}`,
scale,
src: asset.files[idx],
};
}),
};
}
function isCatalogAsset(asset) {
return asset.type === "png" || asset.type === "jpg" || asset.type === "jpeg";
}
function writeImageSet(imageSet) {
_fs.default.mkdirSync(imageSet.basePath, {
recursive: true,
});
for (const file of imageSet.files) {
const dest = _path.default.join(imageSet.basePath, file.name);
_fs.default.copyFileSync(file.src, dest);
}
_fs.default.writeFileSync(
_path.default.join(imageSet.basePath, "Contents.json"),
JSON.stringify({
images: imageSet.files.map((file) => ({
filename: file.name,
idiom: "universal",
scale: `${file.scale}x`,
})),
info: {
author: "xcode",
version: 1,
},
})
);
}

View File

@@ -0,0 +1,29 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { AssetData } from "metro/src/Assets";
declare export function cleanAssetCatalog(catalogDir: string): void;
type ImageSet = {
basePath: string,
files: { name: string, src: string, scale: number }[],
};
declare export function getImageSet(
catalogDir: string,
asset: AssetData,
scales: $ReadOnlyArray<number>
): ImageSet;
declare export function isCatalogAsset(asset: AssetData): boolean;
declare export function writeImageSet(imageSet: ImageSet): void;

View File

@@ -0,0 +1,79 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
/**
* FIXME: using number to represent discrete scale numbers is fragile in essence because of
* floating point numbers imprecision.
*/
function getAndroidAssetSuffix(scale) {
switch (scale) {
case 0.75:
return "ldpi";
case 1:
return "mdpi";
case 1.5:
return "hdpi";
case 2:
return "xhdpi";
case 3:
return "xxhdpi";
case 4:
return "xxxhdpi";
default:
return "";
}
}
// See https://developer.android.com/guide/topics/resources/drawable-resource.html
const drawableFileTypes = new Set(["gif", "jpeg", "jpg", "png", "webp", "xml"]);
function getAndroidResourceFolderName(asset, scale) {
if (!drawableFileTypes.has(asset.type)) {
return "raw";
}
const suffix = getAndroidAssetSuffix(scale);
if (!suffix) {
throw new Error(
`Don't know which android drawable suffix to use for asset: ${JSON.stringify(
asset
)}`
);
}
return `drawable-${suffix}`;
}
function getResourceIdentifier(asset) {
const folderPath = getBasePath(asset);
return `${folderPath}/${asset.name}`
.toLowerCase()
.replace(/\//g, "_") // Encode folder structure in file name
.replace(/([^a-z0-9_])/g, "") // Remove illegal chars
.replace(/^assets_/, ""); // Remove "assets_" prefix
}
function getBasePath(asset) {
let basePath = asset.httpServerLocation;
if (basePath[0] === "/") {
basePath = basePath.substr(1);
}
return basePath;
}
var _default = {
getAndroidAssetSuffix,
getAndroidResourceFolderName,
getResourceIdentifier,
getBasePath,
};
exports.default = _default;

View File

@@ -0,0 +1,39 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
export type PackagerAsset = $ReadOnly<{
httpServerLocation: string,
name: string,
type: string,
...
}>;
/**
* FIXME: using number to represent discrete scale numbers is fragile in essence because of
* floating point numbers imprecision.
*/
declare function getAndroidAssetSuffix(scale: number): string;
declare function getAndroidResourceFolderName(
asset: PackagerAsset,
scale: number
): string;
declare function getResourceIdentifier(asset: PackagerAsset): string;
declare function getBasePath(asset: PackagerAsset): string;
declare export default {
getAndroidAssetSuffix: getAndroidAssetSuffix,
getAndroidResourceFolderName: getAndroidResourceFolderName,
getResourceIdentifier: getResourceIdentifier,
getBasePath: getBasePath,
};

View File

@@ -0,0 +1,128 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.unstable_buildBundleWithConfig = exports.default = void 0;
var _loadMetroConfig = _interopRequireDefault(
require("../../utils/loadMetroConfig")
);
var _parseKeyValueParamArray = _interopRequireDefault(
require("../../utils/parseKeyValueParamArray")
);
var _saveAssets = _interopRequireDefault(require("./saveAssets"));
var _cliTools = require("@react-native-community/cli-tools");
var _chalk = _interopRequireDefault(require("chalk"));
var _Server = _interopRequireDefault(require("metro/src/Server"));
var _bundle = _interopRequireDefault(require("metro/src/shared/output/bundle"));
var _RamBundle = _interopRequireDefault(
require("metro/src/shared/output/RamBundle")
);
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
async function buildBundle(_argv, ctx, args, bundleImpl = _bundle.default) {
const config = await (0, _loadMetroConfig.default)(ctx, {
maxWorkers: args.maxWorkers,
resetCache: args.resetCache,
config: args.config,
});
return buildBundleWithConfig(args, config, bundleImpl);
}
async function buildBundleWithConfig(
args,
config,
bundleImpl = _bundle.default
) {
const customResolverOptions = (0, _parseKeyValueParamArray.default)(
args.resolverOption ?? []
);
if (config.resolver.platforms.indexOf(args.platform) === -1) {
_cliTools.logger.error(
`Invalid platform ${
args.platform ? `"${_chalk.default.bold(args.platform)}" ` : ""
}selected.`
);
_cliTools.logger.info(
`Available platforms are: ${config.resolver.platforms
.map((x) => `"${_chalk.default.bold(x)}"`)
.join(
", "
)}. If you are trying to bundle for an out-of-tree platform, it may not be installed.`
);
throw new Error("Bundling failed");
}
// This is used by a bazillion of npm modules we don't control so we don't
// have other choice than defining it as an env variable here.
process.env.NODE_ENV = args.dev ? "development" : "production";
let sourceMapUrl = args.sourcemapOutput;
if (sourceMapUrl != null && !args.sourcemapUseAbsolutePath) {
sourceMapUrl = _path.default.basename(sourceMapUrl);
}
// $FlowIgnore[prop-missing]
const requestOpts = {
entryFile: args.entryFile,
sourceMapUrl,
dev: args.dev,
minify: args.minify !== undefined ? args.minify : !args.dev,
platform: args.platform,
unstable_transformProfile: args.unstableTransformProfile,
customResolverOptions,
};
const server = new _Server.default(config);
try {
const bundle = await bundleImpl.build(server, requestOpts);
// $FlowIgnore[class-object-subtyping]
// $FlowIgnore[incompatible-call]
// $FlowIgnore[prop-missing]
// $FlowIgnore[incompatible-exact]
await bundleImpl.save(bundle, args, _cliTools.logger.info);
// Save the assets of the bundle
const outputAssets = await server.getAssets({
..._Server.default.DEFAULT_BUNDLE_OPTIONS,
...requestOpts,
bundleType: "todo",
});
// When we're done saving bundle output and the assets, we're done.
return await (0, _saveAssets.default)(
outputAssets,
args.platform,
args.assetsDest,
args.assetCatalogDest
);
} finally {
server.end();
}
}
/**
* UNSTABLE: This function is likely to be relocated and its API changed in
* the near future. `@react-native/community-cli-plugin` should not be directly
* depended on by projects or integrators -- this is exported for legacy
* compatibility.
*
* Create a bundle using a pre-loaded Metro config. The config can be
* re-used for several bundling calls if multiple platforms are being
* bundled.
*/
const unstable_buildBundleWithConfig = buildBundleWithConfig;
exports.unstable_buildBundleWithConfig = unstable_buildBundleWithConfig;
var _default = buildBundle;
exports.default = _default;

View File

@@ -0,0 +1,64 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Config } from "@react-native-community/cli-types";
import type { ConfigT } from "metro-config";
import metroBundle from "metro/src/shared/output/bundle";
import metroRamBundle from "metro/src/shared/output/RamBundle";
export type BundleCommandArgs = {
assetsDest?: string,
assetCatalogDest?: string,
entryFile: string,
resetCache: boolean,
resetGlobalCache: boolean,
transformer?: string,
minify?: boolean,
config?: string,
platform: string,
dev: boolean,
bundleOutput: string,
bundleEncoding?: "utf8" | "utf16le" | "ascii",
maxWorkers?: number,
sourcemapOutput?: string,
sourcemapSourcesRoot?: string,
sourcemapUseAbsolutePath: boolean,
verbose: boolean,
unstableTransformProfile: string,
indexedRamBundle?: boolean,
resolverOption?: Array<string>,
};
declare function buildBundle(
_argv: Array<string>,
ctx: Config,
args: BundleCommandArgs,
bundleImpl: typeof metroBundle | typeof metroRamBundle
): Promise<void>;
declare function buildBundleWithConfig(
args: BundleCommandArgs,
config: ConfigT,
bundleImpl: typeof metroBundle | typeof metroRamBundle
): Promise<void>;
/**
* UNSTABLE: This function is likely to be relocated and its API changed in
* the near future. `@react-native/community-cli-plugin` should not be directly
* depended on by projects or integrators -- this is exported for legacy
* compatibility.
*
* Create a bundle using a pre-loaded Metro config. The config can be
* re-used for several bundling calls if multiple platforms are being
* bundled.
*/
declare export const unstable_buildBundleWithConfig: typeof buildBundleWithConfig;
declare export default typeof buildBundle;

View File

@@ -0,0 +1,47 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const ALLOWED_SCALES = {
ios: [1, 2, 3],
};
function filterPlatformAssetScales(platform, scales) {
const whitelist = ALLOWED_SCALES[platform];
if (!whitelist) {
return scales;
}
const result = scales.filter((scale) => whitelist.indexOf(scale) > -1);
if (result.length === 0 && scales.length > 0) {
// No matching scale found, but there are some available. Ideally we don't
// want to be in this situation and should throw, but for now as a fallback
// let's just use the closest larger image
const maxScale = whitelist[whitelist.length - 1];
for (const scale of scales) {
if (scale > maxScale) {
result.push(scale);
break;
}
}
// There is no larger scales available, use the largest we have
if (result.length === 0) {
result.push(scales[scales.length - 1]);
}
}
return result;
}
var _default = filterPlatformAssetScales;
exports.default = _default;

View File

@@ -0,0 +1,17 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
declare function filterPlatformAssetScales(
platform: string,
scales: $ReadOnlyArray<number>
): $ReadOnlyArray<number>;
declare export default typeof filterPlatformAssetScales;

View File

@@ -0,0 +1,32 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _assetPathUtils = _interopRequireDefault(require("./assetPathUtils"));
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
function getAssetDestPathAndroid(asset, scale) {
const androidFolder = _assetPathUtils.default.getAndroidResourceFolderName(
asset,
scale
);
const fileName = _assetPathUtils.default.getResourceIdentifier(asset);
return _path.default.join(androidFolder, `${fileName}.${asset.type}`);
}
var _default = getAssetDestPathAndroid;
exports.default = _default;

View File

@@ -0,0 +1,19 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { PackagerAsset } from "./assetPathUtils";
declare function getAssetDestPathAndroid(
asset: PackagerAsset,
scale: number
): string;
declare export default typeof getAssetDestPathAndroid;

View File

@@ -0,0 +1,34 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
function getAssetDestPathIOS(asset, scale) {
const suffix = scale === 1 ? "" : `@${scale}x`;
const fileName = `${asset.name + suffix}.${asset.type}`;
return _path.default.join(
// Assets can have relative paths outside of the project root.
// Replace `../` with `_` to make sure they don't end up outside of
// the expected assets directory.
asset.httpServerLocation.substr(1).replace(/\.\.\//g, "_"),
fileName
);
}
var _default = getAssetDestPathIOS;
exports.default = _default;

View File

@@ -0,0 +1,19 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { PackagerAsset } from "./assetPathUtils";
declare function getAssetDestPathIOS(
asset: PackagerAsset,
scale: number
): string;
declare export default typeof getAssetDestPathIOS;

View File

@@ -0,0 +1,130 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _buildBundle = _interopRequireDefault(require("./buildBundle"));
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const bundleCommand = {
name: "bundle",
description: "Build the bundle for the provided JavaScript entry file.",
func: _buildBundle.default,
options: [
{
name: "--entry-file <path>",
description:
"Path to the root JS file, either absolute or relative to JS root",
},
{
name: "--platform <string>",
description: 'Either "ios" or "android"',
default: "ios",
},
{
name: "--transformer <string>",
description: "Specify a custom transformer to be used",
},
{
name: "--dev [boolean]",
description: "If false, warnings are disabled and the bundle is minified",
parse: (val) => val !== "false",
default: true,
},
{
name: "--minify [boolean]",
description:
"Allows overriding whether bundle is minified. This defaults to " +
"false if dev is true, and true if dev is false. Disabling minification " +
"can be useful for speeding up production builds for testing purposes.",
parse: (val) => val !== "false",
},
{
name: "--bundle-output <string>",
description:
"File name where to store the resulting bundle, ex. /tmp/groups.bundle",
},
{
name: "--bundle-encoding <string>",
description:
"Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer).",
default: "utf8",
},
{
name: "--max-workers <number>",
description:
"Specifies the maximum number of workers the worker-pool " +
"will spawn for transforming files. This defaults to the number of the " +
"cores available on your machine.",
parse: (workers) => Number(workers),
},
{
name: "--sourcemap-output <string>",
description:
"File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map",
},
{
name: "--sourcemap-sources-root <string>",
description:
"Path to make sourcemap's sources entries relative to, ex. /root/dir",
},
{
name: "--sourcemap-use-absolute-path",
description: "Report SourceMapURL using its full path",
default: false,
},
{
name: "--assets-dest <string>",
description:
"Directory name where to store assets referenced in the bundle",
},
{
name: "--unstable-transform-profile <string>",
description:
"Experimental, transform JS for a specific JS engine. Currently supported: hermes, hermes-canary, default",
default: "default",
},
{
name: "--asset-catalog-dest [string]",
description: "Path where to create an iOS Asset Catalog for images",
},
{
name: "--reset-cache",
description: "Removes cached files",
default: false,
},
{
name: "--read-global-cache",
description:
"Try to fetch transformed JS code from the global cache, if configured.",
default: false,
},
{
name: "--config <string>",
description: "Path to the CLI configuration file",
parse: (val) => _path.default.resolve(val),
},
{
name: "--resolver-option <string...>",
description:
"Custom resolver options of the form key=value. URL-encoded. May be specified multiple times.",
parse: (val, previous = []) => previous.concat([val]),
},
],
};
var _default = bundleCommand;
exports.default = _default;

View File

@@ -0,0 +1,18 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Command } from "@react-native-community/cli-types";
export type { BundleCommandArgs } from "./buildBundle";
declare const bundleCommand: Command;
declare export default typeof bundleCommand;

View File

@@ -0,0 +1,138 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _assetCatalogIOS = require("./assetCatalogIOS");
var _filterPlatformAssetScales = _interopRequireDefault(
require("./filterPlatformAssetScales")
);
var _getAssetDestPathAndroid = _interopRequireDefault(
require("./getAssetDestPathAndroid")
);
var _getAssetDestPathIOS = _interopRequireDefault(
require("./getAssetDestPathIOS")
);
var _cliTools = require("@react-native-community/cli-tools");
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
async function saveAssets(assets, platform, assetsDest, assetCatalogDest) {
if (assetsDest == null) {
_cliTools.logger.warn("Assets destination folder is not set, skipping...");
return;
}
const filesToCopy = {};
const getAssetDestPath =
platform === "android"
? _getAssetDestPathAndroid.default
: _getAssetDestPathIOS.default;
const addAssetToCopy = (asset) => {
const validScales = new Set(
(0, _filterPlatformAssetScales.default)(platform, asset.scales)
);
asset.scales.forEach((scale, idx) => {
if (!validScales.has(scale)) {
return;
}
const src = asset.files[idx];
const dest = _path.default.join(
assetsDest,
getAssetDestPath(asset, scale)
);
filesToCopy[src] = dest;
});
};
if (platform === "ios" && assetCatalogDest != null) {
// Use iOS Asset Catalog for images. This will allow Apple app thinning to
// remove unused scales from the optimized bundle.
const catalogDir = _path.default.join(
assetCatalogDest,
"RNAssets.xcassets"
);
if (!_fs.default.existsSync(catalogDir)) {
_cliTools.logger.error(
`Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`
);
return;
}
_cliTools.logger.info("Adding images to asset catalog", catalogDir);
(0, _assetCatalogIOS.cleanAssetCatalog)(catalogDir);
for (const asset of assets) {
if ((0, _assetCatalogIOS.isCatalogAsset)(asset)) {
const imageSet = (0, _assetCatalogIOS.getImageSet)(
catalogDir,
asset,
(0, _filterPlatformAssetScales.default)(platform, asset.scales)
);
(0, _assetCatalogIOS.writeImageSet)(imageSet);
} else {
addAssetToCopy(asset);
}
}
_cliTools.logger.info("Done adding images to asset catalog");
} else {
assets.forEach(addAssetToCopy);
}
return copyAll(filesToCopy);
}
function copyAll(filesToCopy) {
const queue = Object.keys(filesToCopy);
if (queue.length === 0) {
return Promise.resolve();
}
_cliTools.logger.info(`Copying ${queue.length} asset files`);
return new Promise((resolve, reject) => {
const copyNext = (error) => {
if (error) {
reject(error);
return;
}
if (queue.length === 0) {
_cliTools.logger.info("Done copying assets");
resolve();
} else {
// queue.length === 0 is checked in previous branch, so this is string
const src = queue.shift();
const dest = filesToCopy[src];
copy(src, dest, copyNext);
}
};
copyNext();
});
}
function copy(src, dest, callback) {
const destDir = _path.default.dirname(dest);
_fs.default.mkdir(
destDir,
{
recursive: true,
},
(err) => {
if (err) {
callback(err);
return;
}
_fs.default
.createReadStream(src)
.pipe(_fs.default.createWriteStream(dest))
.on("finish", callback);
}
);
}
var _default = saveAssets;
exports.default = _default;

View File

@@ -0,0 +1,21 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { AssetData } from "metro/src/Assets";
declare function saveAssets(
assets: $ReadOnlyArray<AssetData>,
platform: string,
assetsDest?: string,
assetCatalogDest?: string
): Promise<void>;
declare export default typeof saveAssets;

View File

@@ -0,0 +1,45 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _bundle = _interopRequireDefault(require("../bundle"));
var _buildBundle = _interopRequireDefault(require("../bundle/buildBundle"));
var _RamBundle = _interopRequireDefault(
require("metro/src/shared/output/RamBundle")
);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const ramBundleCommand = {
name: "ram-bundle",
description:
"Build the RAM bundle for the provided JavaScript entry file. See https://reactnative.dev/docs/ram-bundles-inline-requires.",
func: (argv, config, args) => {
return (0, _buildBundle.default)(argv, config, args, _RamBundle.default);
},
options: [
// $FlowFixMe[incompatible-type] options is nonnull
..._bundle.default.options,
{
name: "--indexed-ram-bundle",
description:
'Force the "Indexed RAM" bundle file format, even when building for android',
default: false,
},
],
};
var _default = ramBundleCommand;
exports.default = _default;

View File

@@ -0,0 +1,16 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Command } from "@react-native-community/cli-types";
declare const ramBundleCommand: Command;
declare export default typeof ramBundleCommand;

View File

@@ -0,0 +1,114 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = attachKeyHandlers;
var _KeyPressHandler = require("../../utils/KeyPressHandler");
var _cliTools = require("@react-native-community/cli-tools");
var _chalk = _interopRequireDefault(require("chalk"));
var _execa = _interopRequireDefault(require("execa"));
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const CTRL_C = "\u0003";
const CTRL_D = "\u0004";
function attachKeyHandlers({
cliConfig,
devServerUrl,
messageSocket,
experimentalDebuggerFrontend,
}) {
if (process.stdin.isTTY !== true) {
_cliTools.logger.debug(
"Interactive mode is not supported in this environment"
);
return;
}
const execaOptions = {
env: {
FORCE_COLOR: _chalk.default.supportsColor ? "true" : "false",
},
};
const keyPressHandler = new _KeyPressHandler.KeyPressHandler(async (key) => {
switch (key) {
case "r":
_cliTools.logger.info("Reloading connected app(s)...");
messageSocket.broadcast("reload", null);
break;
case "d":
_cliTools.logger.info("Opening Dev Menu...");
messageSocket.broadcast("devMenu", null);
break;
case "i":
_cliTools.logger.info("Opening app on iOS...");
(0, _execa.default)(
"npx",
[
"react-native",
"run-ios",
...(cliConfig.project.ios?.watchModeCommandParams ?? []),
],
execaOptions
).stdout?.pipe(process.stdout);
break;
case "a":
_cliTools.logger.info("Opening app on Android...");
(0, _execa.default)(
"npx",
[
"react-native",
"run-android",
...(cliConfig.project.android?.watchModeCommandParams ?? []),
],
execaOptions
).stdout?.pipe(process.stdout);
break;
case "j":
if (!experimentalDebuggerFrontend) {
return;
}
await (0, _nodeFetch.default)(devServerUrl + "/open-debugger", {
method: "POST",
});
break;
case CTRL_C:
case CTRL_D:
_cliTools.logger.info("Stopping server");
keyPressHandler.stopInterceptingKeyStrokes();
process.emit("SIGINT");
process.exit();
}
});
keyPressHandler.createInteractionListener();
keyPressHandler.startInterceptingKeyStrokes();
_cliTools.logger.log(
[
"",
`${_chalk.default.bold("i")} - run on iOS`,
`${_chalk.default.bold("a")} - run on Android`,
`${_chalk.default.bold("d")} - open Dev Menu`,
...(experimentalDebuggerFrontend
? [
`${_chalk.default.bold(
"j"
)} - open debugger (experimental, Hermes only)`,
]
: []),
`${_chalk.default.bold("r")} - reload app`,
"",
].join("\n")
);
}

View File

@@ -0,0 +1,22 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Config } from "@react-native-community/cli-types";
declare export default function attachKeyHandlers({
cliConfig: Config,
devServerUrl: string,
messageSocket: $ReadOnly<{
broadcast: (type: string, params?: Record<string, mixed> | null) => void,
...
}>,
experimentalDebuggerFrontend: boolean,
}): void;

View File

@@ -0,0 +1,112 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _runServer = _interopRequireDefault(require("./runServer"));
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const startCommand = {
name: "start",
func: _runServer.default,
description: "Start the React Native development server.",
options: [
{
name: "--port <number>",
parse: Number,
},
{
name: "--host <string>",
default: "",
},
{
name: "--projectRoot <path>",
description: "Path to a custom project root",
parse: (val) => _path.default.resolve(val),
},
{
name: "--watchFolders <list>",
description:
"Specify any additional folders to be added to the watch list",
parse: (val) =>
val.split(",").map((folder) => _path.default.resolve(folder)),
},
{
name: "--assetPlugins <list>",
description:
"Specify any additional asset plugins to be used by the packager by full filepath",
parse: (val) => val.split(","),
},
{
name: "--sourceExts <list>",
description:
"Specify any additional source extensions to be used by the packager",
parse: (val) => val.split(","),
},
{
name: "--max-workers <number>",
description:
"Specifies the maximum number of workers the worker-pool " +
"will spawn for transforming files. This defaults to the number of the " +
"cores available on your machine.",
parse: (workers) => Number(workers),
},
{
name: "--transformer <string>",
description: "Specify a custom transformer to be used",
},
{
name: "--reset-cache, --resetCache",
description: "Removes cached files",
},
{
name: "--custom-log-reporter-path, --customLogReporterPath <string>",
description:
"Path to a JavaScript file that exports a log reporter as a replacement for TerminalReporter",
},
{
name: "--https",
description: "Enables https connections to the server",
},
{
name: "--key <path>",
description: "Path to custom SSL key",
},
{
name: "--cert <path>",
description: "Path to custom SSL cert",
},
{
name: "--config <string>",
description: "Path to the CLI configuration file",
parse: (val) => _path.default.resolve(val),
},
{
name: "--no-interactive",
description: "Disables interactive mode",
},
{
name: "--experimental-debugger",
description:
"[Experimental] Enable the new debugger experience and 'j' to " +
"debug. This enables the new frontend experience only: connection " +
"reliability and some basic features are unstable in this release.",
},
],
};
var _default = startCommand;
exports.default = _default;

View File

@@ -0,0 +1,18 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Command } from "@react-native-community/cli-types";
export type { StartCommandArgs } from "./runServer";
declare const startCommand: Command;
declare export default typeof startCommand;

View File

@@ -0,0 +1,176 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = void 0;
var _isDevServerRunning = _interopRequireDefault(
require("../../utils/isDevServerRunning")
);
var _loadMetroConfig = _interopRequireDefault(
require("../../utils/loadMetroConfig")
);
var _attachKeyHandlers = _interopRequireDefault(require("./attachKeyHandlers"));
var _cliServerApi = require("@react-native-community/cli-server-api");
var _cliTools = require("@react-native-community/cli-tools");
var _devMiddleware = require("@react-native/dev-middleware");
var _chalk = _interopRequireDefault(require("chalk"));
var _metro = _interopRequireDefault(require("metro"));
var _metroCore = require("metro-core");
var _path = _interopRequireDefault(require("path"));
var _url = _interopRequireDefault(require("url"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
async function runServer(_argv, ctx, args) {
const metroConfig = await (0, _loadMetroConfig.default)(ctx, {
config: args.config,
maxWorkers: args.maxWorkers,
port: args.port ?? 8081,
resetCache: args.resetCache,
watchFolders: args.watchFolders,
projectRoot: args.projectRoot,
sourceExts: args.sourceExts,
});
const hostname = args.host?.length ? args.host : "localhost";
const {
projectRoot,
server: { port },
watchFolders,
} = metroConfig;
const protocol = args.https === true ? "https" : "http";
const devServerUrl = _url.default.format({
protocol,
hostname,
port,
});
_cliTools.logger.info(`Welcome to React Native v${ctx.reactNativeVersion}`);
const serverStatus = await (0, _isDevServerRunning.default)(
devServerUrl,
projectRoot
);
if (serverStatus === "matched_server_running") {
_cliTools.logger.info(
`A dev server is already running for this project on port ${port}. Exiting.`
);
return;
} else if (serverStatus === "port_taken") {
_cliTools.logger.error(
`Another process is running on port ${port}. Please terminate this ` +
'process and try again, or use another port with "--port".'
);
return;
}
_cliTools.logger.info(
`Starting dev server on port ${_chalk.default.bold(String(port))}...`
);
if (args.assetPlugins) {
// $FlowIgnore[cannot-write] Assigning to readonly property
metroConfig.transformer.assetPlugins = args.assetPlugins.map((plugin) =>
require.resolve(plugin)
);
}
const {
middleware: communityMiddleware,
websocketEndpoints: communityWebsocketEndpoints,
messageSocketEndpoint,
eventsSocketEndpoint,
} = (0, _cliServerApi.createDevServerMiddleware)({
host: hostname,
port,
watchFolders,
});
const { middleware, websocketEndpoints } = (0,
_devMiddleware.createDevMiddleware)({
projectRoot,
serverBaseUrl: devServerUrl,
logger: _cliTools.logger,
unstable_experiments: {
// NOTE: Only affects the /open-debugger endpoint
enableNewDebugger: args.experimentalDebugger,
},
});
let reportEvent;
const terminal = new _metroCore.Terminal(process.stdout);
const ReporterImpl = getReporterImpl(args.customLogReporterPath);
const terminalReporter = new ReporterImpl(terminal);
// $FlowIgnore[cannot-write] Assigning to readonly property
metroConfig.reporter = {
update(event) {
terminalReporter.update(event);
if (reportEvent) {
reportEvent(event);
}
if (args.interactive && event.type === "initialize_done") {
_cliTools.logger.info("Dev server ready");
(0, _attachKeyHandlers.default)({
cliConfig: ctx,
devServerUrl,
messageSocket: messageSocketEndpoint,
experimentalDebuggerFrontend: args.experimentalDebugger,
});
}
},
};
const serverInstance = await _metro.default.runServer(metroConfig, {
host: args.host,
secure: args.https,
secureCert: args.cert,
secureKey: args.key,
unstable_extraMiddleware: [
communityMiddleware,
_cliServerApi.indexPageMiddleware,
middleware,
],
websocketEndpoints: {
...communityWebsocketEndpoints,
...websocketEndpoints,
},
});
reportEvent = eventsSocketEndpoint.reportEvent;
// In Node 8, the default keep-alive for an HTTP connection is 5 seconds. In
// early versions of Node 8, this was implemented in a buggy way which caused
// some HTTP responses (like those containing large JS bundles) to be
// terminated early.
//
// As a workaround, arbitrarily increase the keep-alive from 5 to 30 seconds,
// which should be enough to send even the largest of JS bundles.
//
// For more info: https://github.com/nodejs/node/issues/13391
//
serverInstance.keepAliveTimeout = 30000;
await _cliTools.version.logIfUpdateAvailable(ctx.root);
}
function getReporterImpl(customLogReporterPath) {
if (customLogReporterPath == null) {
return require("metro/src/lib/TerminalReporter");
}
try {
// First we let require resolve it, so we can require packages in node_modules
// as expected. eg: require('my-package/reporter');
// $FlowIgnore[unsupported-syntax]
return require(customLogReporterPath);
} catch (e) {
if (e.code !== "MODULE_NOT_FOUND") {
throw e;
}
// If that doesn't work, then we next try relative to the cwd, eg:
// require('./reporter');
// $FlowIgnore[unsupported-syntax]
return require(_path.default.resolve(customLogReporterPath));
}
}
var _default = runServer;
exports.default = _default;

View File

@@ -0,0 +1,39 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Config } from "@react-native-community/cli-types";
export type StartCommandArgs = {
assetPlugins?: string[],
cert?: string,
customLogReporterPath?: string,
experimentalDebugger: boolean,
host?: string,
https?: boolean,
maxWorkers?: number,
key?: string,
platforms?: string[],
port?: number,
resetCache?: boolean,
sourceExts?: string[],
transformer?: string,
watchFolders?: string[],
config?: string,
projectRoot?: string,
interactive: boolean,
};
declare function runServer(
_argv: Array<string>,
ctx: Config,
args: StartCommandArgs
): void;
declare export default typeof runServer;

View File

@@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
Object.defineProperty(exports, "bundleCommand", {
enumerable: true,
get: function () {
return _bundle.default;
},
});
Object.defineProperty(exports, "ramBundleCommand", {
enumerable: true,
get: function () {
return _ramBundle.default;
},
});
Object.defineProperty(exports, "startCommand", {
enumerable: true,
get: function () {
return _start.default;
},
});
Object.defineProperty(exports, "unstable_buildBundleWithConfig", {
enumerable: true,
get: function () {
return _buildBundle.unstable_buildBundleWithConfig;
},
});
var _bundle = _interopRequireDefault(require("./commands/bundle"));
var _ramBundle = _interopRequireDefault(require("./commands/ram-bundle"));
var _start = _interopRequireDefault(require("./commands/start"));
var _buildBundle = require("./commands/bundle/buildBundle");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}

View File

@@ -0,0 +1,16 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
export { default as bundleCommand } from "./commands/bundle";
export { default as ramBundleCommand } from "./commands/ram-bundle";
export { default as startCommand } from "./commands/start";
export { unstable_buildBundleWithConfig } from "./commands/bundle/buildBundle";

View File

@@ -0,0 +1,3 @@
"use strict";
module.exports = require("./index.flow");

View File

@@ -0,0 +1,12 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
* @format
* @oncall react_native
*/
declare module.exports: $FlowFixMe;

View File

@@ -0,0 +1,91 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.KeyPressHandler = void 0;
var _cliTools = require("@react-native-community/cli-tools");
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
const CTRL_C = "\u0003";
/** An abstract key stroke interceptor. */
class KeyPressHandler {
_isInterceptingKeyStrokes = false;
_isHandlingKeyPress = false;
constructor(onPress) {
this._onPress = onPress;
}
/** Start observing interaction pause listeners. */
createInteractionListener() {
// Support observing prompts.
let wasIntercepting = false;
const listener = ({ pause }) => {
if (pause) {
// Track if we were already intercepting key strokes before pausing, so we can
// resume after pausing.
wasIntercepting = this._isInterceptingKeyStrokes;
this.stopInterceptingKeyStrokes();
} else if (wasIntercepting) {
// Only start if we were previously intercepting.
this.startInterceptingKeyStrokes();
}
};
return listener;
}
_handleKeypress = async (key) => {
// Prevent sending another event until the previous event has finished.
if (this._isHandlingKeyPress && key !== CTRL_C) {
return;
}
this._isHandlingKeyPress = true;
try {
_cliTools.logger.debug(`Key pressed: ${key}`);
await this._onPress(key);
} catch (error) {
return new _cliTools.CLIError(
"There was an error with the key press handler."
);
} finally {
this._isHandlingKeyPress = false;
}
};
/** Start intercepting all key strokes and passing them to the input `onPress` method. */
startInterceptingKeyStrokes() {
if (this._isInterceptingKeyStrokes) {
return;
}
this._isInterceptingKeyStrokes = true;
const { stdin } = process;
// $FlowFixMe[prop-missing]
stdin.setRawMode(true);
stdin.resume();
stdin.setEncoding("utf8");
stdin.on("data", this._handleKeypress);
}
/** Stop intercepting all key strokes. */
stopInterceptingKeyStrokes() {
if (!this._isInterceptingKeyStrokes) {
return;
}
this._isInterceptingKeyStrokes = false;
const { stdin } = process;
stdin.removeListener("data", this._handleKeypress);
// $FlowFixMe[prop-missing]
stdin.setRawMode(false);
stdin.resume();
}
}
exports.KeyPressHandler = KeyPressHandler;

View File

@@ -0,0 +1,22 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
/** An abstract key stroke interceptor. */
declare export class KeyPressHandler {
_isInterceptingKeyStrokes: $FlowFixMe;
_isHandlingKeyPress: $FlowFixMe;
_onPress: (key: string) => Promise<void>;
constructor(onPress: (key: string) => Promise<void>): void;
createInteractionListener(): ({ pause: boolean, ... }) => void;
_handleKeypress: $FlowFixMe;
startInterceptingKeyStrokes(): void;
stopInterceptingKeyStrokes(): void;
}

View File

@@ -0,0 +1,75 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = isDevServerRunning;
var _net = _interopRequireDefault(require("net"));
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
/**
* Determine whether we can run the dev server.
*
* Return values:
* - `not_running`: The port is unoccupied.
* - `matched_server_running`: The port is occupied by another instance of this
* dev server (matching the passed `projectRoot`).
* - `port_taken`: The port is occupied by another process.
* - `unknown`: An error was encountered; attempt server creation anyway.
*/
async function isDevServerRunning(devServerUrl, projectRoot) {
const { hostname, port } = new URL(devServerUrl);
try {
if (!(await isPortOccupied(hostname, port))) {
return "not_running";
}
const statusResponse = await (0, _nodeFetch.default)(
`${devServerUrl}/status`
);
const body = await statusResponse.text();
return body === "packager-status:running" &&
statusResponse.headers.get("X-React-Native-Project-Root") === projectRoot
? "matched_server_running"
: "port_taken";
} catch (e) {
return "unknown";
}
}
async function isPortOccupied(hostname, port) {
let result = false;
const server = _net.default.createServer();
return new Promise((resolve, reject) => {
server.once("error", (e) => {
server.close();
if (e.code === "EADDRINUSE") {
result = true;
} else {
reject(e);
}
});
server.once("listening", () => {
result = false;
server.close();
});
server.once("close", () => {
resolve(result);
});
server.listen({
host: hostname,
port,
});
});
}

View File

@@ -0,0 +1,25 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
/**
* Determine whether we can run the dev server.
*
* Return values:
* - `not_running`: The port is unoccupied.
* - `matched_server_running`: The port is occupied by another instance of this
* dev server (matching the passed `projectRoot`).
* - `port_taken`: The port is occupied by another process.
* - `unknown`: An error was encountered; attempt server creation anyway.
*/
declare export default function isDevServerRunning(
devServerUrl: string,
projectRoot: string
): Promise<"not_running" | "matched_server_running" | "port_taken" | "unknown">;

View File

@@ -0,0 +1,109 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = loadMetroConfig;
var _metroPlatformResolver = require("./metroPlatformResolver");
var _cliTools = require("@react-native-community/cli-tools");
var _metroConfig = require("metro-config");
var _path = _interopRequireDefault(require("path"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
/**
* Get the config options to override based on RN CLI inputs.
*/
function getOverrideConfig(ctx, config) {
const outOfTreePlatforms = Object.keys(ctx.platforms).filter(
(platform) => ctx.platforms[platform].npmPackageName
);
const resolver = {
platforms: [...Object.keys(ctx.platforms), "native"],
};
if (outOfTreePlatforms.length) {
resolver.resolveRequest = (0,
_metroPlatformResolver.reactNativePlatformResolver)(
outOfTreePlatforms.reduce((result, platform) => {
result[platform] = ctx.platforms[platform].npmPackageName;
return result;
}, {}),
config.resolver?.resolveRequest
);
}
return {
resolver,
serializer: {
// We can include multiple copies of InitializeCore here because metro will
// only add ones that are already part of the bundle
getModulesRunBeforeMainModule: () => [
require.resolve(
_path.default.join(
ctx.reactNativePath,
"Libraries/Core/InitializeCore"
),
{
paths: [ctx.root],
}
),
...outOfTreePlatforms.map((platform) =>
require.resolve(
`${ctx.platforms[platform].npmPackageName}/Libraries/Core/InitializeCore`,
{
paths: [ctx.root],
}
)
),
],
},
};
}
/**
* Load Metro config.
*
* Allows the CLI to override select values in `metro.config.js` based on
* dynamic user options in `ctx`.
*/
async function loadMetroConfig(ctx, options = {}) {
const cwd = ctx.root;
const projectConfig = await (0, _metroConfig.resolveConfig)(
options.config,
cwd
);
if (projectConfig.isEmpty) {
throw new _cliTools.CLIError(`No Metro config found in ${cwd}`);
}
_cliTools.logger.debug(`Reading Metro config from ${projectConfig.filepath}`);
if (!global.__REACT_NATIVE_METRO_CONFIG_LOADED) {
for (const line of `
=================================================================================================
From React Native 0.73, your project's Metro config should extend '@react-native/metro-config'
or it will fail to build. Please copy the template at:
https://github.com/facebook/react-native/blob/main/packages/react-native/template/metro.config.js
This warning will be removed in future (https://github.com/facebook/metro/issues/1018).
=================================================================================================
`
.trim()
.split("\n")) {
_cliTools.logger.warn(line);
}
}
const config = await (0, _metroConfig.loadConfig)({
cwd,
...options,
});
const overrideConfig = getOverrideConfig(ctx, config);
return (0, _metroConfig.mergeConfig)(config, overrideConfig);
}

View File

@@ -0,0 +1,33 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { Config } from "@react-native-community/cli-types";
import type { ConfigT, YargArguments } from "metro-config";
export type { Config };
export type ConfigLoadingContext = $ReadOnly<{
root: Config["root"],
reactNativePath: Config["reactNativePath"],
platforms: Config["platforms"],
...
}>;
/**
* Load Metro config.
*
* Allows the CLI to override select values in `metro.config.js` based on
* dynamic user options in `ctx`.
*/
declare export default function loadMetroConfig(
ctx: ConfigLoadingContext,
options: YargArguments
): Promise<ConfigT>;

View File

@@ -0,0 +1,49 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.reactNativePlatformResolver = reactNativePlatformResolver;
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
/**
* This is an implementation of a metro resolveRequest option which will remap react-native imports
* to different npm packages based on the platform requested. This allows a single metro instance/config
* to produce bundles for multiple out of tree platforms at a time.
*
* @param platformImplementations
* A map of platform to npm package that implements that platform
*
* Ex:
* {
* windows: 'react-native-windows'
* macos: 'react-native-macos'
* }
*/
function reactNativePlatformResolver(platformImplementations, customResolver) {
return (context, moduleName, platform) => {
let modifiedModuleName = moduleName;
if (platform != null && platformImplementations[platform]) {
if (moduleName === "react-native") {
modifiedModuleName = platformImplementations[platform];
} else if (moduleName.startsWith("react-native/")) {
modifiedModuleName = `${
platformImplementations[platform]
}/${modifiedModuleName.slice("react-native/".length)}`;
}
}
if (customResolver) {
return customResolver(context, modifiedModuleName, platform);
}
return context.resolveRequest(context, modifiedModuleName, platform);
};
}

View File

@@ -0,0 +1,33 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
import type { CustomResolver } from "metro-resolver";
/**
* This is an implementation of a metro resolveRequest option which will remap react-native imports
* to different npm packages based on the platform requested. This allows a single metro instance/config
* to produce bundles for multiple out of tree platforms at a time.
*
* @param platformImplementations
* A map of platform to npm package that implements that platform
*
* Ex:
* {
* windows: 'react-native-windows'
* macos: 'react-native-macos'
* }
*/
declare export function reactNativePlatformResolver(
platformImplementations: {
[platform: string]: string,
},
customResolver: ?CustomResolver
): CustomResolver;

View File

@@ -0,0 +1,34 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true,
});
exports.default = parseKeyValueParamArray;
var _querystring = _interopRequireDefault(require("querystring"));
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
* @oncall react_native
*/
function parseKeyValueParamArray(keyValueArray) {
const result = {};
for (const item of keyValueArray) {
if (item.indexOf("=") === -1) {
throw new Error('Expected parameter to include "=" but found: ' + item);
}
if (item.indexOf("&") !== -1) {
throw new Error('Parameter cannot include "&" but found: ' + item);
}
Object.assign(result, _querystring.default.parse(item));
}
return result;
}

View File

@@ -0,0 +1,14 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow strict-local
* @format
* @oncall react_native
*/
declare export default function parseKeyValueParamArray(
keyValueArray: $ReadOnlyArray<string>
): Record<string, string>;

View File

@@ -0,0 +1,10 @@
@generated SignedSource<<fbad20dc7d32047d6d436b94ec8a15b4>>
Git revision: 12a45e0628384aa80075493354159ef5d91b2698
Built with --nohooks: false
Is local checkout: false
Remote URL: https://github.com/facebookexperimental/rn-chrome-devtools-frontend
Remote branch: main
GN build args (overrides only):
is_official_build = true
Git status in checkout:
<no changes>

View File

@@ -0,0 +1,37 @@
# @react-native/debugger-frontend
![npm package](https://img.shields.io/npm/v/@react-native/debugger-frontend?color=brightgreen&label=npm%20package)
Debugger frontend for React Native based on Chrome DevTools.
This package is internal to React Native and is intended to be used via [`@react-native/dev-middleware`](https://www.npmjs.com/package/@react-native/dev-middleware).
## Usage
The package exports the absolute path to the directory containing the frontend assets.
```js
const frontendPath = require('@react-native/debugger-frontend');
// Pass frontendPath to a static server, etc
```
## Contributing
### Source repo
Source code for this package lives in the [facebookexperimental/rn-chrome-devtools-frontend](https://github.com/facebookexperimental/rn-chrome-devtools-frontend) repo. See below for how we build and check in changes.
### Updating the frontend assets
The compiled assets for the debugger frontend are periodically checked into this package under the `dist/` folder. To update these, run `node scripts/debugger-frontend/sync-and-build` from the root of your `react-native` checkout.
```sh
# For main
node scripts/debugger-frontend/sync-and-build --branch main
# For stable branches (e.g. '0.73-stable')
node scripts/debugger-frontend/sync-and-build --branch 0.73-stable
```
By default, this will clone and build from [facebookexperimental/rn-chrome-devtools-frontend](https://github.com/facebookexperimental/rn-chrome-devtools-frontend).

View File

@@ -0,0 +1,28 @@
// Copyright (c) Meta Platforms, Inc. and affiliates.
// Copyright 2014 The Chromium Authors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc., Meta Platforms, Inc., nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.062 17 3 15.938 5.438 13.5H4V12h4v4H6.5v-1.438L4.062 17Zm11.876 0L13.5 14.562V16H12v-4h4v1.5h-1.438L17 15.938 15.938 17ZM4 8V6.5h1.438L3 4.062 4.062 3 6.5 5.438V4H8v4H4Zm8 0V4h1.5v1.438L15.938 3 17 4.062 14.562 6.5H16V8h-4Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 331 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m10 18-3.5-3.5 1.062-1.062 1.688 1.687V10.75H4.875l1.687 1.688L5.5 13.5 2 10l3.5-3.5 1.062 1.062L4.875 9.25H9.25V4.875L7.562 6.562 6.5 5.5 10 2l3.5 3.5-1.062 1.062-1.688-1.687V9.25h4.375l-1.687-1.688L14.5 6.5 18 10l-3.5 3.5-1.062-1.062 1.687-1.688H10.75v4.375l1.688-1.687L13.5 14.5 10 18Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 393 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m8 16.25-1.062-1.062 1.291-1.292c-1.82-.195-3.312-.66-4.479-1.396C2.583 11.764 2 10.93 2 10c0-1.111.778-2.056 2.333-2.833C5.889 6.389 7.778 6 10 6s4.111.389 5.667 1.167C17.222 7.944 18 8.889 18 10c0 .833-.455 1.587-1.365 2.26-.91.674-2.121 1.157-3.635 1.448v-1.541c1-.237 1.833-.56 2.5-.969.667-.41 1-.81 1-1.198 0-.639-.674-1.215-2.021-1.729S11.639 7.5 10 7.5c-1.625 0-3.115.26-4.469.781C4.177 8.801 3.5 9.375 3.5 10c0 .472.448.944 1.344 1.417.896.472 1.941.784 3.135.937l-1.041-1.042L8 10.25l3 3-3 3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 607 B

View File

@@ -0,0 +1,224 @@
// Copyright 2023 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
const sheet = new CSSStyleSheet();
sheet.replaceSync(':root {}');
const style = sheet.cssRules[0].style;
style.setProperty('--image-file-accelerometer-bottom', 'url(\"' + new URL('./accelerometer-bottom.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-accelerometer-left', 'url(\"' + new URL('./accelerometer-left.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-accelerometer-right', 'url(\"' + new URL('./accelerometer-right.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-accelerometer-top', 'url(\"' + new URL('./accelerometer-top.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-chromeLeft', 'url(\"' + new URL('./chromeLeft.avif', import.meta.url).toString() + '\")');
style.setProperty('--image-file-chromeMiddle', 'url(\"' + new URL('./chromeMiddle.avif', import.meta.url).toString() + '\")');
style.setProperty('--image-file-chromeRight', 'url(\"' + new URL('./chromeRight.avif', import.meta.url).toString() + '\")');
style.setProperty('--image-file-cssoverview_icons_2x', 'url(\"' + new URL('./cssoverview_icons_2x.avif', import.meta.url).toString() + '\")');
style.setProperty('--image-file-favicon', 'url(\"' + new URL('./favicon.ico', import.meta.url).toString() + '\")');
style.setProperty('--image-file-navigationControls_2x', 'url(\"' + new URL('./navigationControls_2x.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-navigationControls', 'url(\"' + new URL('./navigationControls.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-nodeIcon', 'url(\"' + new URL('./nodeIcon.avif', import.meta.url).toString() + '\")');
style.setProperty('--image-file-popoverArrows', 'url(\"' + new URL('./popoverArrows.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-react_native/welcomeIcon', 'url(\"' + new URL('./react_native/welcomeIcon.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-toolbarResizerVertical', 'url(\"' + new URL('./toolbarResizerVertical.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-touchCursor_2x', 'url(\"' + new URL('./touchCursor_2x.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-touchCursor', 'url(\"' + new URL('./touchCursor.png', import.meta.url).toString() + '\")');
style.setProperty('--image-file-whatsnew', 'url(\"' + new URL('./whatsnew.avif', import.meta.url).toString() + '\")');
style.setProperty('--image-file-3d-center', 'url(\"' + new URL(new URL('3d-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-3d-pan', 'url(\"' + new URL(new URL('3d-pan.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-3d-rotate', 'url(\"' + new URL(new URL('3d-rotate.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-accelerometer-back', 'url(\"' + new URL(new URL('accelerometer-back.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-accelerometer-front', 'url(\"' + new URL(new URL('accelerometer-front.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-center', 'url(\"' + new URL(new URL('align-content-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-end', 'url(\"' + new URL(new URL('align-content-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-space-around', 'url(\"' + new URL(new URL('align-content-space-around.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-space-between', 'url(\"' + new URL(new URL('align-content-space-between.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-space-evenly', 'url(\"' + new URL(new URL('align-content-space-evenly.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-start', 'url(\"' + new URL(new URL('align-content-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-content-stretch', 'url(\"' + new URL(new URL('align-content-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-items-baseline', 'url(\"' + new URL(new URL('align-items-baseline.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-items-center', 'url(\"' + new URL(new URL('align-items-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-items-end', 'url(\"' + new URL(new URL('align-items-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-items-start', 'url(\"' + new URL(new URL('align-items-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-items-stretch', 'url(\"' + new URL(new URL('align-items-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-self-center', 'url(\"' + new URL(new URL('align-self-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-self-end', 'url(\"' + new URL(new URL('align-self-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-self-start', 'url(\"' + new URL(new URL('align-self-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-align-self-stretch', 'url(\"' + new URL(new URL('align-self-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-arrow-down', 'url(\"' + new URL(new URL('arrow-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-arrow-drop-down-dark', 'url(\"' + new URL(new URL('arrow-drop-down-dark.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-arrow-drop-down-light', 'url(\"' + new URL(new URL('arrow-drop-down-light.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-arrow-up-down-circle', 'url(\"' + new URL(new URL('arrow-up-down-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-arrow-up-down', 'url(\"' + new URL(new URL('arrow-up-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-arrow-up', 'url(\"' + new URL(new URL('arrow-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bell', 'url(\"' + new URL(new URL('bell.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bezier-curve-filled', 'url(\"' + new URL(new URL('bezier-curve-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bin', 'url(\"' + new URL(new URL('bin.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bottom-panel-close', 'url(\"' + new URL(new URL('bottom-panel-close.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bottom-panel-open', 'url(\"' + new URL(new URL('bottom-panel-open.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-brackets', 'url(\"' + new URL(new URL('brackets.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-breakpoint-circle', 'url(\"' + new URL(new URL('breakpoint-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-breakpoint-crossed-filled', 'url(\"' + new URL(new URL('breakpoint-crossed-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-breakpoint-crossed', 'url(\"' + new URL(new URL('breakpoint-crossed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-brush-filled', 'url(\"' + new URL(new URL('brush-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-brush', 'url(\"' + new URL(new URL('brush.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bug', 'url(\"' + new URL(new URL('bug.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-bundle', 'url(\"' + new URL(new URL('bundle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-check-circle', 'url(\"' + new URL(new URL('check-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-check-double', 'url(\"' + new URL(new URL('check-double.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-checker', 'url(\"' + new URL(new URL('checker.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-checkmark', 'url(\"' + new URL(new URL('checkmark.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-chevron-double-right', 'url(\"' + new URL(new URL('chevron-double-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-chevron-down', 'url(\"' + new URL(new URL('chevron-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-chevron-left-dot', 'url(\"' + new URL(new URL('chevron-left-dot.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-chevron-left', 'url(\"' + new URL(new URL('chevron-left.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-chevron-right', 'url(\"' + new URL(new URL('chevron-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-chevron-up', 'url(\"' + new URL(new URL('chevron-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-clear-list', 'url(\"' + new URL(new URL('clear-list.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-clear', 'url(\"' + new URL(new URL('clear.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-cloud', 'url(\"' + new URL(new URL('cloud.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-code-circle', 'url(\"' + new URL(new URL('code-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-code', 'url(\"' + new URL(new URL('code.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-colon', 'url(\"' + new URL(new URL('colon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-color-picker-filled', 'url(\"' + new URL(new URL('color-picker-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-color-picker', 'url(\"' + new URL(new URL('color-picker.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-console-conditional-breakpoint', 'url(\"' + new URL(new URL('console-conditional-breakpoint.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-console-logpoint', 'url(\"' + new URL(new URL('console-logpoint.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-cookie', 'url(\"' + new URL(new URL('cookie.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-copy', 'url(\"' + new URL(new URL('copy.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-credit-card', 'url(\"' + new URL(new URL('credit-card.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-cross-circle-filled', 'url(\"' + new URL(new URL('cross-circle-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-cross-circle', 'url(\"' + new URL(new URL('cross-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-cross', 'url(\"' + new URL(new URL('cross.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-custom-typography', 'url(\"' + new URL(new URL('custom-typography.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-database', 'url(\"' + new URL(new URL('database.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-deployed', 'url(\"' + new URL(new URL('deployed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-device-fold', 'url(\"' + new URL(new URL('device-fold.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-devices', 'url(\"' + new URL(new URL('devices.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-dock-bottom', 'url(\"' + new URL(new URL('dock-bottom.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-dock-left', 'url(\"' + new URL(new URL('dock-left.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-dock-right', 'url(\"' + new URL(new URL('dock-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-dock-window', 'url(\"' + new URL(new URL('dock-window.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-document', 'url(\"' + new URL(new URL('document.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-dots-horizontal', 'url(\"' + new URL(new URL('dots-horizontal.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-dots-vertical', 'url(\"' + new URL(new URL('dots-vertical.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-download', 'url(\"' + new URL(new URL('download.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-edit', 'url(\"' + new URL(new URL('edit.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-empty', 'url(\"' + new URL(new URL('empty.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-errorWave', 'url(\"' + new URL(new URL('errorWave.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-exclamation', 'url(\"' + new URL(new URL('exclamation.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-experiment-check', 'url(\"' + new URL(new URL('experiment-check.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-experiment', 'url(\"' + new URL(new URL('experiment.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-eye', 'url(\"' + new URL(new URL('eye.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-document', 'url(\"' + new URL(new URL('file-document.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-font', 'url(\"' + new URL(new URL('file-font.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-generic', 'url(\"' + new URL(new URL('file-generic.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-image', 'url(\"' + new URL(new URL('file-image.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-script', 'url(\"' + new URL(new URL('file-script.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-snippet', 'url(\"' + new URL(new URL('file-snippet.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-file-stylesheet', 'url(\"' + new URL(new URL('file-stylesheet.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-filter-clear', 'url(\"' + new URL(new URL('filter-clear.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-filter-filled', 'url(\"' + new URL(new URL('filter-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-filter', 'url(\"' + new URL(new URL('filter.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-flex-direction', 'url(\"' + new URL(new URL('flex-direction.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-flex-no-wrap', 'url(\"' + new URL(new URL('flex-no-wrap.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-flex-wrap', 'url(\"' + new URL(new URL('flex-wrap.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-flow', 'url(\"' + new URL(new URL('flow.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-fold-more', 'url(\"' + new URL(new URL('fold-more.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-folder', 'url(\"' + new URL(new URL('folder.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-frame-crossed', 'url(\"' + new URL(new URL('frame-crossed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-frame-icon', 'url(\"' + new URL(new URL('frame-icon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-frame', 'url(\"' + new URL(new URL('frame.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-gear-filled', 'url(\"' + new URL(new URL('gear-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-gear', 'url(\"' + new URL(new URL('gear.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-gears', 'url(\"' + new URL(new URL('gears.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-heap-snapshot', 'url(\"' + new URL(new URL('heap-snapshot.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-heap-snapshots', 'url(\"' + new URL(new URL('heap-snapshots.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-help', 'url(\"' + new URL(new URL('help.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-iframe-crossed', 'url(\"' + new URL(new URL('iframe-crossed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-iframe', 'url(\"' + new URL(new URL('iframe.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-import', 'url(\"' + new URL(new URL('import.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-info-filled', 'url(\"' + new URL(new URL('info-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-info', 'url(\"' + new URL(new URL('info.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-issue-cross-filled', 'url(\"' + new URL(new URL('issue-cross-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-issue-exclamation-filled', 'url(\"' + new URL(new URL('issue-exclamation-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-issue-questionmark-filled', 'url(\"' + new URL(new URL('issue-questionmark-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-issue-text-filled', 'url(\"' + new URL(new URL('issue-text-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-content-center', 'url(\"' + new URL(new URL('justify-content-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-content-end', 'url(\"' + new URL(new URL('justify-content-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-content-space-around', 'url(\"' + new URL(new URL('justify-content-space-around.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-content-space-between', 'url(\"' + new URL(new URL('justify-content-space-between.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-content-space-evenly', 'url(\"' + new URL(new URL('justify-content-space-evenly.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-content-start', 'url(\"' + new URL(new URL('justify-content-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-items-center', 'url(\"' + new URL(new URL('justify-items-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-items-end', 'url(\"' + new URL(new URL('justify-items-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-items-start', 'url(\"' + new URL(new URL('justify-items-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-justify-items-stretch', 'url(\"' + new URL(new URL('justify-items-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-keyboard-pen', 'url(\"' + new URL(new URL('keyboard-pen.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-large-arrow-right-filled', 'url(\"' + new URL(new URL('large-arrow-right-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-largeIcons', 'url(\"' + new URL(new URL('largeIcons.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-layers-filled', 'url(\"' + new URL(new URL('layers-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-layers', 'url(\"' + new URL(new URL('layers.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-left-panel-close', 'url(\"' + new URL(new URL('left-panel-close.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-left-panel-open', 'url(\"' + new URL(new URL('left-panel-open.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-lighthouse_logo', 'url(\"' + new URL(new URL('lighthouse_logo.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-list', 'url(\"' + new URL(new URL('list.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-mediumIcons', 'url(\"' + new URL(new URL('mediumIcons.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-memory', 'url(\"' + new URL(new URL('memory.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-minus', 'url(\"' + new URL(new URL('minus.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-minus_icon', 'url(\"' + new URL(new URL('minus_icon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-network-settings', 'url(\"' + new URL(new URL('network-settings.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-node_search_icon', 'url(\"' + new URL(new URL('node_search_icon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-open-externally', 'url(\"' + new URL(new URL('open-externally.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-pause', 'url(\"' + new URL(new URL('pause.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-performance', 'url(\"' + new URL(new URL('performance.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-person', 'url(\"' + new URL(new URL('person.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-play', 'url(\"' + new URL(new URL('play.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-plus', 'url(\"' + new URL(new URL('plus.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-popup', 'url(\"' + new URL(new URL('popup.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-preview_feature_video_thumbnail', 'url(\"' + new URL(new URL('preview_feature_video_thumbnail.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-profile', 'url(\"' + new URL(new URL('profile.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-record-start', 'url(\"' + new URL(new URL('record-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-record-stop', 'url(\"' + new URL(new URL('record-stop.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-redo', 'url(\"' + new URL(new URL('redo.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-refresh', 'url(\"' + new URL(new URL('refresh.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-replace', 'url(\"' + new URL(new URL('replace.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-replay', 'url(\"' + new URL(new URL('replay.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-resizeDiagonal', 'url(\"' + new URL(new URL('resizeDiagonal.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-resizeHorizontal', 'url(\"' + new URL(new URL('resizeHorizontal.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-resizeVertical', 'url(\"' + new URL(new URL('resizeVertical.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-resume', 'url(\"' + new URL(new URL('resume.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-review', 'url(\"' + new URL(new URL('review.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-right-panel-close', 'url(\"' + new URL(new URL('right-panel-close.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-right-panel-open', 'url(\"' + new URL(new URL('right-panel-open.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-screen-rotation', 'url(\"' + new URL(new URL('screen-rotation.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-search', 'url(\"' + new URL(new URL('search.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-securityIcons', 'url(\"' + new URL(new URL('securityIcons.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-select-element', 'url(\"' + new URL(new URL('select-element.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-settings_14x14_icon', 'url(\"' + new URL(new URL('settings_14x14_icon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-shadow', 'url(\"' + new URL(new URL('shadow.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-smallIcons', 'url(\"' + new URL(new URL('smallIcons.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-snippet', 'url(\"' + new URL(new URL('snippet.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-star', 'url(\"' + new URL(new URL('star.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-step-into', 'url(\"' + new URL(new URL('step-into.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-step-out', 'url(\"' + new URL(new URL('step-out.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-step-over', 'url(\"' + new URL(new URL('step-over.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-step', 'url(\"' + new URL(new URL('step.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-stop', 'url(\"' + new URL(new URL('stop.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-symbol', 'url(\"' + new URL(new URL('symbol.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-sync', 'url(\"' + new URL(new URL('sync.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-table', 'url(\"' + new URL(new URL('table.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-top-panel-close', 'url(\"' + new URL(new URL('top-panel-close.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-top-panel-open', 'url(\"' + new URL(new URL('top-panel-open.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-triangle-bottom-right', 'url(\"' + new URL(new URL('triangle-bottom-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-triangle-down', 'url(\"' + new URL(new URL('triangle-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-triangle-left', 'url(\"' + new URL(new URL('triangle-left.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-triangle-right', 'url(\"' + new URL(new URL('triangle-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-triangle-up', 'url(\"' + new URL(new URL('triangle-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-undo', 'url(\"' + new URL(new URL('undo.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-warning-filled', 'url(\"' + new URL(new URL('warning-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-warning', 'url(\"' + new URL(new URL('warning.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-warning_icon', 'url(\"' + new URL(new URL('warning_icon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-watch', 'url(\"' + new URL(new URL('watch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
style.setProperty('--image-file-width', 'url(\"' + new URL(new URL('width.svg', import.meta.url).href, import.meta.url).toString() + '\")');
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="770" height="1580"><path style="fill:none;stroke:#f80;stroke-width:9" d="M766 366v100" transform="matrix(-1 0 0 1 770.5 0)"/><path style="fill:none;stroke:#888;stroke-width:9" d="M766 768V568" transform="matrix(-1 0 0 1 770.5 0)"/><g style="fill-rule:evenodd" transform="matrix(-1 0 0 1 770.5 0)"><rect style="fill:#222" width="767" height="1580" ry="80" rx="80"/></g><g style="fill:#fff;fill-rule:evenodd" transform="matrix(-1 0 0 1 770.5 0)"><rect style="fill-opacity:.13332998" x="273.5" y="1526" width="220" height="15" ry="5" rx="5"/><path style="fill-opacity:.86667002" d="M70.363 6.95C28.333 5.754 4.808 47.982 4.838 83.222l1.194 1424.49c.026 30.952 32.038 68.279 64.634 68.216l622.086-1.194c30.873-.06 68.216-37.263 68.216-64.634V76.057c0-31.282-24.689-66.72-63.137-70.302C456.898 4.61 269.722 6.95 70.363 6.95Z"/></g></svg>

After

Width:  |  Height:  |  Size: 879 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="1580" width="770"><path d="M766 366v100" stroke="#f80" stroke-width="9" fill="none"/><path d="M766 768V568" stroke="#888" stroke-width="9" fill="none"/><g fill-rule="evenodd"><rect rx="80" ry="80" height="1580" width="767" fill="#222"/><rect fill-opacity=".133" rx="5" ry="5" height="18" width="80" y="80" x="343.5" fill="#fff"/><circle cx="459" fill-opacity=".267" cy="76.25" r="15" fill="#00f"/><circle cx="297.25" fill-opacity=".267" cy="74" r="17.5" fill="#00f"/></g><g fill-rule="evenodd" fill="#fff"><rect fill-opacity=".133" rx="10" ry="10" height="25" width="50" y="34" x="358.5"/><rect fill-opacity=".133" rx="5" ry="5" height="15" width="220" y="1526" x="273.5"/><path d="M83.5 38c-27.7 0-50 22.3-50 50v1360c0 16.62 13.38 30 30 30h640c16.62 0 30-13.38 30-30V88c0-27.7-22.3-50-50-50h-140c-19.39 0-35 15.61-35 35v4c0 24.93-20.07 45-45 45h-160c-24.93 0-45-20.07-45-45v-4c0-19.39-15.61-35-35-35h-70z" fill-opacity=".867"/></g></svg>

After

Width:  |  Height:  |  Size: 986 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 10.75H2v-1.5h16v1.5Z" fill="#000"/><path d="M6 4h8v3H6V4ZM6 13h8v3H6v-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 221 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 18H2v-1.5h16V18Z" fill="#000"/><path d="M6 6h8v3H6V6ZM6 11h8v3H6v-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 217 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 18H2v-1.5h16V18ZM18 3.5H2V2h16v1.5Z" fill="#000"/><path d="M6 5h8v3H6V5ZM6 12h8v3H6v-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M14 3.5h4V2H2v1.5h4v3h8v-3ZM2 18h16v-1.5h-4v-3H6v3H2V18Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 161 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 18H2v-1.5h16V18ZM18 3.5H2V2h16v1.5Z" fill="#000"/><path d="M6 6h8v3H6V6ZM6 11h8v3H6v-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 236 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 3.5H2V2h16v1.5Z" fill="#000"/><path d="M6 6h8v3H6V6ZM6 11h8v3H6v-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 216 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.5h4V9h8V3.5h4V2H2v1.5ZM2 18h16v-1.5h-4V11H6v5.5H2V18Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 163 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="m9.104 4-3.75 10h1.729L8 11.438h4.042L12.916 14h1.73l-3.75-10H9.104Zm2.396 6H8.521l1.437-4.146h.084L11.5 10Z" fill="#000"/><path d="M18 16.5H2V18h16v-1.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 299 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 10.75H2v-1.5h16v1.5Z" fill="#000"/><path d="M9 3v14H6V3h3ZM15 6v8h-3V6h3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 16.5h16V18H2v-1.5ZM6 15V4h3v11H6ZM11 8v7h3V8h-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 156 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.5h16V2H2v1.5ZM6 5v11h3V5H6ZM11 12V5h3v7h-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 153 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 16.5H2V18h16v-1.5ZM18 2H2v1.5h16V2ZM6 15V5h3v10H6ZM11 5v10h3V5h-3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 175 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.5 9.25V3h-3v6.25H2v1.5h6.5V17h3v-6.25H18v-1.5h-6.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 160 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.5 15V4h-3v11h3ZM2 18h16v-1.5H2V18Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 143 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.5h16V2H2v1.5ZM11.5 16V5h-3v11h3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 142 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.5H2V2h16v1.5ZM18 18H2v-1.5h16V18ZM11.5 15V5h-3v10h3Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 163 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.25 3v11.125l-2.188-2.187L6 13l4 4 4-4-1.062-1.062-2.188 2.187V3h-1.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 177 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 12 6 8h8l-4 4Z" fill="#919191"/></svg>

After

Width:  |  Height:  |  Size: 126 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 12 6 8h8l-4 4Z" fill="#6E6E6E"/></svg>

After

Width:  |  Height:  |  Size: 126 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M6.896 17.375A7.794 7.794 0 0 0 10 18c1.111 0 2.15-.208 3.115-.625a8.066 8.066 0 0 0 4.26-4.271A7.794 7.794 0 0 0 18 10c0-1.111-.208-2.15-.625-3.115a8.101 8.101 0 0 0-4.26-4.26A7.775 7.775 0 0 0 10 2a7.795 7.795 0 0 0-3.104.625 8.066 8.066 0 0 0-4.271 4.26A7.775 7.775 0 0 0 2 10c0 1.097.208 2.132.625 3.104.417.972.99 1.823 1.719 2.552.73.73 1.58 1.302 2.552 1.719Zm4.854-1.095a6.796 6.796 0 0 1-1.75.22c-1.805 0-3.34-.632-4.604-1.896C4.132 13.34 3.5 11.805 3.5 10c0-1.805.632-3.34 1.896-4.604A6.665 6.665 0 0 1 6.75 4.343v7.346l-1.22-1.22-1.06 1.061 3.03 3.03 3.03-3.03-1.06-1.06-1.22 1.22V3.72A6.794 6.794 0 0 1 10 3.5c1.805 0 3.34.632 4.604 1.896C15.868 6.66 16.5 8.195 16.5 10c0 1.805-.632 3.34-1.896 4.604a6.666 6.666 0 0 1-1.354 1.053V8.311l1.22 1.22 1.06-1.061-3.03-3.03-3.03 3.03 1.06 1.06 1.22-1.22v7.97Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 959 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.75 11V4.875L4.562 7.062 3.5 6l4-4 4 4-1.062 1.062L8.25 4.875V11h-1.5Zm5.75 7-4-4 1.062-1.062 2.188 2.187V9h1.5v6.125l2.188-2.187L16.5 14l-4 4Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 250 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.25 17V5.875L7.062 8.062 6 7l4-4 4 4-1.062 1.062-2.188-2.187V17h-1.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 176 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4 15.5V14h1V9c0-1.195.372-2.254 1.115-3.177S7.819 4.327 9 4.104V3c0-.278.097-.514.292-.708A.962.962 0 0 1 10 2c.278 0 .514.097.708.292.195.194.292.43.292.708v1.104c1.18.223 2.142.792 2.885 1.708C14.628 6.729 15 7.792 15 9v5h1v1.5H4Zm6 2.5c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 8.5 16.5h3c0 .417-.146.77-.438 1.062A1.444 1.444 0 0 1 10 18Zm-3.5-4h7V9c0-.972-.34-1.798-1.021-2.479C11.799 5.841 10.972 5.5 10 5.5c-.972 0-1.798.34-2.479 1.021C6.841 7.201 6.5 8.028 6.5 9v5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 583 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 3A1.5 1.5 0 0 0 3 4.5v11A1.5 1.5 0 0 0 4.5 17h11a1.5 1.5 0 0 0 1.5-1.5v-11A1.5 1.5 0 0 0 15.5 3h-11ZM6 14c1.575 0 2.69-.439 3.494-1.22.727-.708 1.108-1.623 1.401-2.329l.028-.066c.328-.787.571-1.335.977-1.73C12.253 8.31 12.825 8 14 8V6c-1.575 0-2.69.439-3.494 1.22-.727.708-1.108 1.623-1.401 2.329l-.028.066c-.328.787-.571 1.335-.977 1.73-.353.344-.925.655-2.1.655v2Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 516 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.5 17c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 5 15.5v-10H4V4h4V3h4v1h4v1.5h-1v10c0 .417-.146.77-.438 1.062A1.444 1.444 0 0 1 13.5 17h-7Zm7-11.5h-7v10h7v-10ZM8 14h1.5V7H8v7Zm2.5 0H12V7h-1.5v7Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 304 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m10 10 3.25-3.5h-6.5L10 10Zm5.604-7c.39 0 .72.135.99.406.27.27.406.6.406.99v11.208c0 .39-.135.72-.406.99-.27.27-.6.406-.99.406H4.396c-.39 0-.72-.135-.99-.406-.27-.27-.406-.6-.406-.99V4.396c0-.39.135-.72.406-.99.27-.27.6-.406.99-.406h11.208ZM4.5 13v2.5h11V13h-11Zm11-1.5v-7h-11v7h11Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 387 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.75 9.5h6.5L10 6 6.75 9.5ZM4.396 17c-.39 0-.72-.135-.99-.406-.27-.27-.406-.6-.406-.99V4.396c0-.39.135-.72.406-.99.27-.27.6-.406.99-.406h11.208c.39 0 .72.135.99.406.27.27.406.6.406.99v11.208c0 .39-.135.72-.406.99-.27.27-.6.406-.99.406H4.396Zm.104-4v2.5h11V13h-11Zm0-1.5h11v-7h-11v7Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 388 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12 16v-1.5h1.75a.723.723 0 0 0 .531-.219.723.723 0 0 0 .219-.531v-1.5c0-.57.191-1.059.573-1.469a2.27 2.27 0 0 1 1.427-.719v-.083a2.604 2.604 0 0 1-1.427-.771A2.042 2.042 0 0 1 14.5 7.75v-1.5a.723.723 0 0 0-.219-.531.723.723 0 0 0-.531-.219H12V4h1.75a2.17 2.17 0 0 1 1.594.656c.437.437.656.969.656 1.594v1.5c0 .208.073.385.219.531a.723.723 0 0 0 .531.219H18v3h-1.25a.723.723 0 0 0-.531.219.723.723 0 0 0-.219.531v1.5a2.17 2.17 0 0 1-.656 1.594A2.17 2.17 0 0 1 13.75 16H12Zm-5.75 0a2.17 2.17 0 0 1-1.594-.656A2.17 2.17 0 0 1 4 13.75v-1.5a.723.723 0 0 0-.219-.531.723.723 0 0 0-.531-.219H2v-3h1.25a.723.723 0 0 0 .531-.219A.723.723 0 0 0 4 7.75v-1.5c0-.625.219-1.157.656-1.594A2.17 2.17 0 0 1 6.25 4H8v1.5H6.25a.723.723 0 0 0-.531.219.723.723 0 0 0-.219.531v1.5c0 .583-.191 1.08-.573 1.49-.382.41-.858.649-1.427.718v.084a2.15 2.15 0 0 1 1.427.708c.382.417.573.917.573 1.5v1.5c0 .208.073.385.219.531a.723.723 0 0 0 .531.219H8V16H6.25Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 18a7.794 7.794 0 0 1-3.104-.625 8.067 8.067 0 0 1-2.552-1.719 8.065 8.065 0 0 1-1.719-2.552A7.795 7.795 0 0 1 2 10c0-1.111.208-2.15.625-3.115a8.066 8.066 0 0 1 4.271-4.26A7.795 7.795 0 0 1 10 2c1.111 0 2.15.208 3.115.625a8.1 8.1 0 0 1 4.26 4.26C17.792 7.85 18 8.889 18 10a7.794 7.794 0 0 1-.625 3.104 8.066 8.066 0 0 1-4.26 4.271A7.775 7.775 0 0 1 10 18Zm0-1.5c1.805 0 3.34-.632 4.604-1.896C15.868 13.34 16.5 11.805 16.5 10c0-1.805-.632-3.34-1.896-4.604C13.34 4.132 11.805 3.5 10 3.5c-1.805 0-3.34.632-4.604 1.896C4.132 6.66 3.5 8.195 3.5 10c0 1.805.632 3.34 1.896 4.604C6.66 15.868 8.195 16.5 10 16.5Z" fill="#000"/><path fill-rule="evenodd" clip-rule="evenodd" d="M5.75 7.5c0-.69.56-1.25 1.25-1.25h4.766c.37 0 .723.165.96.45l2.75 3.3-2.75 3.3a1.25 1.25 0 0 1-.96.45H7c-.69 0-1.25-.56-1.25-1.25v-5Zm1.5.25v4.5h4.399L13.524 10l-1.875-2.25H7.25Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 953 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.06 17 3 2.94 1.94 4l2 2H3.5A1.5 1.5 0 0 0 2 7.5v5A1.5 1.5 0 0 0 3.5 14h8.44L16 18.06 17.06 17Zm.94-7-2.72 3.108L8.172 6h5.647a1.5 1.5 0 0 1 1.13.512L18 10Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 304 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M17.06 17 3 2.94 1.94 4l2 2H3.5A1.5 1.5 0 0 0 2 7.5v5A1.5 1.5 0 0 0 3.5 14h8.44L16 18.06 17.06 17Zm-6.62-4.5-5-5H3.5v5h6.94ZM18 10l-2.72 3.108-1.063-1.063L16.007 10l-2.188-2.5H9.672L8.172 6h5.647a1.5 1.5 0 0 1 1.13.512L18 10Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 370 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 18.021c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 8 16.521v-3.5H5.5c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 4 11.521v-5.5c0-.847.292-1.56.875-2.136.583-.576 1.292-.864 2.125-.864h9v8.5c0 .417-.15.77-.448 1.062-.299.292-.65.438-1.052.438H12v3.5c0 .417-.15.77-.448 1.062-.299.292-.65.438-1.052.438h-1Zm-4-9.5h9v-4h-1v3H12v-3h-1v1.5H9.5v-1.5H7a1.67 1.67 0 0 0-1.062.448c-.292.27-.438.621-.438 1.052v2.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 519 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.5 18.021c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 8 16.521v-3.5H5.5c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 4 11.521v-5.5c0-.847.292-1.56.875-2.136.583-.576 1.292-.864 2.125-.864h9v8.5c0 .417-.15.77-.448 1.062-.299.292-.65.438-1.052.438H12v3.5c0 .417-.15.77-.448 1.062-.299.292-.65.438-1.052.438h-1Zm-4-9.5h9v-4h-1v3H12v-3h-1v1.5H9.5v-1.5H7a1.67 1.67 0 0 0-1.062.448c-.292.27-.438.621-.438 1.052v2.5Zm0 3h9v-1.5h-9v1.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M10 17a4.02 4.02 0 0 1-2.271-.677A3.615 3.615 0 0 1 6.292 14.5H4V13h2v-1.25H4v-1.5h2V9H4V7.5h2.292c.11-.361.291-.688.541-.979.25-.292.535-.549.855-.771L6 4.062 7.062 3l2.105 2.083a3.463 3.463 0 0 1 1.687 0L12.938 3 14 4.062 12.312 5.75c.32.222.598.479.834.771.236.291.423.618.562.979H16V9h-2v1.25h2v1.5h-2V13h2v1.5h-2.292a3.615 3.615 0 0 1-1.437 1.823A4.021 4.021 0 0 1 10 17Zm0-1.5c.68 0 1.26-.243 1.74-.729A2.587 2.587 0 0 0 12.5 13V9a2.256 2.256 0 0 0-.698-1.771 2.446 2.446 0 0 0-1.781-.729c-.709 0-1.302.243-1.781.729A2.504 2.504 0 0 0 7.5 9v4a2.34 2.34 0 0 0 .708 1.771c.487.486 1.084.729 1.792.729ZM8.5 13h3v-1.5h-3V13Zm0-2.5h3V9h-3v1.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 749 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M3 16.5V7.917a1.314 1.314 0 0 1-.74-.542A1.56 1.56 0 0 1 2 6.5v-3c0-.417.146-.77.438-1.062A1.444 1.444 0 0 1 3.5 2h13c.417 0 .77.146 1.062.438.292.291.438.645.438 1.062v3c0 .32-.087.611-.26.875-.174.264-.42.445-.74.542V16.5c0 .417-.146.77-.438 1.062A1.444 1.444 0 0 1 15.5 18h-11c-.417 0-.77-.146-1.062-.438A1.444 1.444 0 0 1 3 16.5ZM4.5 8v8.5h11V8h-11Zm12-1.5v-3h-13v3h13Zm-8.5 5h4V10H8v1.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 497 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m8.938 13 4.958-4.938L12.833 7l-3.895 3.875-1.771-1.75-1.063 1.063L8.938 13ZM10 18a7.794 7.794 0 0 1-3.104-.625 8.067 8.067 0 0 1-2.552-1.719 8.065 8.065 0 0 1-1.719-2.552A7.795 7.795 0 0 1 2 10c0-1.111.208-2.15.625-3.115a8.066 8.066 0 0 1 4.271-4.26A7.795 7.795 0 0 1 10 2c1.111 0 2.15.208 3.115.625a8.1 8.1 0 0 1 4.26 4.26C17.792 7.85 18 8.889 18 10a7.794 7.794 0 0 1-.625 3.104 8.066 8.066 0 0 1-4.26 4.271A7.775 7.775 0 0 1 10 18Zm0-1.5c1.805 0 3.34-.632 4.604-1.896C15.868 13.34 16.5 11.805 16.5 10c0-1.805-.632-3.34-1.896-4.604C13.34 4.132 11.805 3.5 10 3.5c-1.805 0-3.34.632-4.604 1.896C4.132 6.66 3.5 8.195 3.5 10c0 1.805.632 3.34 1.896 4.604C6.66 15.868 8.195 16.5 10 16.5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 787 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m6.104 14.146-3.542-3.542 1.063-1.062 2.48 2.479 1.062 1.062-1.063 1.063Zm4.25-.021-3.541-3.52 1.062-1.063 2.48 2.479 6-6.021 1.062 1.063-7.063 7.062Zm0-4.23L9.292 8.834 12.125 6l1.063 1.063-2.834 2.833Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 308 B

View File

@@ -0,0 +1 @@
<svg width="12" height="12" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill="#fff" d="M0 0h12v12H0z"/><path fill="#CCC" d="M0 0h6v6H0zM6 6h6v6H6z"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h12v12H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 269 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m8.229 14.062-3.521-3.541L5.75 9.479l2.479 2.459 6.021-6L15.292 7l-7.063 7.062Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 184 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M5.062 15 4 13.938 7.938 10 4 6.062 5.062 5l5 5-5 5ZM11 15l-1.062-1.062L13.875 10 9.938 6.062 11 5l5 5-5 5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 212 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m10 13.063-5-5L6.063 7 10 10.938 13.938 7 15 8.063l-5 5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 161 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m10 15-5-5 5-5 1.062 1.062L7.125 10l3.937 3.938L10 15Z" fill="#000"/><circle cx="12.5" cy="10.125" r="1.25" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 211 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m12 15-5-5 5-5 1.062 1.062L9.125 10l3.937 3.938L12 15Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 159 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m8 15-1.062-1.062L10.875 10 6.938 6.062 8 5l5 5-5 5Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 157 B

View File

@@ -0,0 +1 @@
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M6.063 13 5 11.937l5-5 5 5L13.937 13 10 9.062 6.062 13Z" fill="#000"/></svg>

After

Width:  |  Height:  |  Size: 160 B

Some files were not shown because too many files have changed in this diff Show More