A design system in a box. hip-ui.tngl.io/docs/introduction
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

finish lint

+1005 -455
+42 -10
packages/eslint-config/base.js
··· 3 3 import eslintConfigPrettier from "eslint-config-prettier"; 4 4 import turboPlugin from "eslint-plugin-turbo"; 5 5 import tseslint from "typescript-eslint"; 6 - import onlyWarn from "eslint-plugin-only-warn"; 6 + import comments from "@eslint-community/eslint-plugin-eslint-comments/configs"; 7 + import gitignore from "eslint-config-flat-gitignore"; 8 + import { importX } from "eslint-plugin-import-x"; 9 + import { createTypeScriptImportResolver } from "eslint-import-resolver-typescript"; 10 + import perfectionist from "eslint-plugin-perfectionist"; 11 + import eslintPluginUnicorn from "eslint-plugin-unicorn"; 7 12 8 13 /** 9 14 * A shared ESLint configuration for the repository. ··· 11 16 * @type {import("eslint").Linter.Config[]} 12 17 * */ 13 18 export const config = defineConfig([ 19 + gitignore(), 14 20 eslintConfigPrettier, 15 21 eslintJs.configs.recommended, 22 + comments.recommended, 23 + importX.flatConfigs.recommended, 24 + eslintPluginUnicorn.configs.recommended, 25 + { 26 + rules: { 27 + "unicorn/prevent-abbreviations": "off", 28 + "unicorn/filename-case": "off", 29 + "unicorn/no-null": "off", 30 + "unicorn/no-nested-ternary": "off", 31 + }, 32 + }, 33 + { 34 + plugins: { 35 + perfectionist, 36 + }, 37 + rules: { 38 + "perfectionist/sort-imports": [ 39 + "error", 40 + { 41 + type: "alphabetical", 42 + }, 43 + ], 44 + }, 45 + }, 46 + { 47 + settings: { 48 + "import-x/resolver-next": [createTypeScriptImportResolver()], 49 + }, 50 + }, 16 51 { 17 52 files: ["**/*.ts", "**/*.tsx"], 18 53 ··· 24 59 }, 25 60 }, 26 61 27 - extends: [tseslint.configs.recommended], 62 + extends: [tseslint.configs.strictTypeChecked], 63 + 64 + rules: { 65 + "@typescript-eslint/no-confusing-void-expression": "off", 66 + "@typescript-eslint/unbound-method": "off", 67 + }, 28 68 }, 29 69 { 30 70 plugins: { ··· 33 73 rules: { 34 74 "turbo/no-undeclared-env-vars": "warn", 35 75 }, 36 - }, 37 - { 38 - plugins: { 39 - onlyWarn, 40 - }, 41 - }, 42 - { 43 - ignores: ["dist/**"], 44 76 }, 45 77 ]);
-49
packages/eslint-config/next.js
··· 1 - import js from "@eslint/js"; 2 - import eslintConfigPrettier from "eslint-config-prettier"; 3 - import tseslint from "typescript-eslint"; 4 - import pluginReactHooks from "eslint-plugin-react-hooks"; 5 - import pluginReact from "eslint-plugin-react"; 6 - import globals from "globals"; 7 - import pluginNext from "@next/eslint-plugin-next"; 8 - import { config as baseConfig } from "./base.js"; 9 - 10 - /** 11 - * A custom ESLint configuration for libraries that use Next.js. 12 - * 13 - * @type {import("eslint").Linter.Config[]} 14 - * */ 15 - export const nextJsConfig = [ 16 - ...baseConfig, 17 - js.configs.recommended, 18 - eslintConfigPrettier, 19 - ...tseslint.configs.recommended, 20 - { 21 - ...pluginReact.configs.flat.recommended, 22 - languageOptions: { 23 - ...pluginReact.configs.flat.recommended.languageOptions, 24 - globals: { 25 - ...globals.serviceworker, 26 - }, 27 - }, 28 - }, 29 - { 30 - plugins: { 31 - "@next/next": pluginNext, 32 - }, 33 - rules: { 34 - ...pluginNext.configs.recommended.rules, 35 - ...pluginNext.configs["core-web-vitals"].rules, 36 - }, 37 - }, 38 - { 39 - plugins: { 40 - "react-hooks": pluginReactHooks, 41 - }, 42 - settings: { react: { version: "detect" } }, 43 - rules: { 44 - ...pluginReactHooks.configs.recommended.rules, 45 - // React scope no longer necessary with new JSX transform. 46 - "react/react-in-jsx-scope": "off", 47 - }, 48 - }, 49 - ];
+8 -2
packages/eslint-config/package.json
··· 13 13 "@next/eslint-plugin-next": "^15.5.0", 14 14 "eslint": "^9.34.0", 15 15 "eslint-config-prettier": "^10.1.1", 16 - "eslint-plugin-only-warn": "^1.1.0", 17 16 "eslint-plugin-react": "^7.37.5", 18 17 "eslint-plugin-react-hooks": "^5.2.0", 19 18 "eslint-plugin-turbo": "^2.5.0", ··· 22 21 "typescript-eslint": "^8.40.0" 23 22 }, 24 23 "dependencies": { 24 + "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", 25 25 "@eslint-react/eslint-plugin": "^2.2.2", 26 26 "@stylexjs/eslint-plugin": "^0.16.2", 27 - "eslint-plugin-jsx-a11y": "^6.10.2" 27 + "eslint-config-flat-gitignore": "^2.1.0", 28 + "eslint-import-resolver-typescript": "^4.4.4", 29 + "eslint-plugin-import-x": "^4.16.1", 30 + "eslint-plugin-jsx-a11y": "^6.10.2", 31 + "eslint-plugin-perfectionist": "^4.15.1", 32 + "eslint-plugin-react-refresh": "^0.4.24", 33 + "eslint-plugin-unicorn": "^61.0.2" 28 34 } 29 35 }
+2
packages/eslint-config/react-internal.js
··· 3 3 import eslintReact from "@eslint-react/eslint-plugin"; 4 4 import { defineConfig } from "eslint/config"; 5 5 import jsxA11y from "eslint-plugin-jsx-a11y"; 6 + import reactRefresh from "eslint-plugin-react-refresh"; 6 7 7 8 import { config as baseConfig } from "./base.js"; 8 9 ··· 23 24 extends: [ 24 25 eslintReact.configs["strict-type-checked"], 25 26 jsxA11y.flatConfigs.recommended, 27 + reactRefresh.configs.recommended, 26 28 ], 27 29 28 30 settings: { react: { version: "detect" } },
+2 -3
packages/hip-ui/eslint.config.mjs
··· 1 - import { config } from "@repo/eslint-config/react-internal"; 1 + /** @type {import("eslint").Linter.Config} */ 2 2 3 - /** @type {import("eslint").Linter.Config} */ 4 - export default config; 3 + export { config as default } from "@repo/eslint-config/react-internal";
+10 -7
packages/hip-ui/src/cli/bin.ts
··· 1 1 import { app, Command, MultiCommand } from "command-line-application"; 2 + 2 3 import { installComponent } from "./install.js"; 3 4 4 5 const install: Command = { ··· 30 31 const args = app(hip); 31 32 32 33 if (args?._command === "install") { 33 - const component = Array.isArray(args.component) 34 - ? args.component 35 - : args.component 36 - ? [args.component] 37 - : []; 34 + const component = ( 35 + Array.isArray(args.component) 36 + ? args.component 37 + : args.component 38 + ? [args.component] 39 + : [] 40 + ) as string[]; 38 41 39 - installComponent({ 42 + void installComponent({ 40 43 component, 41 - all: args.all, 44 + all: args.all as boolean, 42 45 }); 43 46 }
+8 -8
packages/hip-ui/src/cli/config.ts
··· 1 1 import { lilconfig, LilconfigResult } from "lilconfig"; 2 - import { writeFileSync, readFileSync } from "fs"; 3 - import path from "path"; 2 + import { writeFileSync, readFileSync } from "node:fs"; 3 + import path from "node:path"; 4 4 5 5 export const DEFAULT_CONFIG_PATH = "hip.config.json"; 6 6 ··· 21 21 return await config.search(); 22 22 } 23 23 24 - export async function setConfig( 25 - config: LilconfigResult, 26 - options: ConfigOptions 27 - ) { 24 + export function setConfig(config: LilconfigResult, options: ConfigOptions) { 28 25 const configPath = 29 26 config?.filepath || path.join(process.cwd(), DEFAULT_CONFIG_PATH); 30 27 ··· 33 30 writeFileSync(configPath, JSON.stringify(options, null, 2)); 34 31 console.log(`✅ Config written to ${configPath}`); 35 32 } else if (configPath.includes("package.json")) { 36 - const existingPackageJson = readFileSync(configPath, "utf-8"); 37 - const packageJson = JSON.parse(existingPackageJson); 33 + const existingPackageJson = readFileSync(configPath, "utf8"); 34 + const packageJson = JSON.parse(existingPackageJson) as Record< 35 + string, 36 + unknown 37 + >; 38 38 packageJson["hip"] = options; 39 39 writeFileSync(configPath, JSON.stringify(packageJson, null, 2)); 40 40 console.log(`✅ Config written to ${configPath}`);
+76 -63
packages/hip-ui/src/cli/install.tsx
··· 1 + /* eslint-disable react-refresh/only-export-components */ 2 + 1 3 import { Option, Select, TextInput } from "@inkjs/ui"; 2 - import path from "path"; 3 4 import { render, Box, Text } from "ink"; 5 + import { exec } from "node:child_process"; 6 + import { readFileSync, writeFileSync } from "node:fs"; 7 + import { mkdir } from "node:fs/promises"; 8 + import path from "node:path"; 4 9 import * as React from "react"; 5 - import { mkdir } from "fs/promises"; 6 - import { exec } from "child_process"; 7 - import { readFileSync, writeFileSync } from "fs"; 8 10 9 - import { ConfigOptions, getConfig, setConfig } from "./config.js"; 10 - import { ComponentConfig } from "../types.js"; 11 - 11 + import { buttonGroupConfig } from "../components/button-group/button-group-config.js"; 12 12 import { buttonConfig } from "../components/button/button-config.js"; 13 + import { cardConfig } from "../components/card/card-config.js"; 14 + import { checkboxConfig } from "../components/checkbox/checkbox-config.js"; 15 + import { colorFieldConfig } from "../components/color-field/color-field-config.js"; 16 + import { comboboxConfig } from "../components/combobox/combobox-config.js"; 17 + import { commandMenuConfig } from "../components/command-menu/command-menu-config.js"; 18 + import { contextMenuConfig } from "../components/context-menu/context-menu-config.js"; 19 + import { dateFieldConfig } from "../components/date-field/date-field-config.js"; 13 20 import { flexConfig } from "../components/flex/flex-config.js"; 14 - import { typographyConfig } from "../components/typography/typography-config.js"; 15 - import { tooltipConfig } from "../components/tooltip/tooltip-config.js"; 16 21 import { iconButtonConfig } from "../components/icon-button/icon-button-config.js"; 17 - import { popoverConfig } from "../components/popover/popover-config.js"; 18 - import { buttonGroupConfig } from "../components/button-group/button-group-config.js"; 19 - import { cardConfig } from "../components/card/card-config.js"; 20 - import { textFieldConfig } from "../components/text-field/text-field-config.js"; 21 22 import { labelConfig } from "../components/label/label-config.js"; 22 23 import { linkConfig } from "../components/link/link-config.js"; 23 - import { checkboxConfig } from "../components/checkbox/checkbox-config.js"; 24 + import { listboxConfig } from "../components/listbox/listbox-config.js"; 25 + import { menuConfig } from "../components/menu/menu-config.js"; 26 + import { numberFieldConfig } from "../components/number-field/number-field-config.js"; 27 + import { popoverConfig } from "../components/popover/popover-config.js"; 24 28 import { radioConfig } from "../components/radio/radio-config.js"; 29 + import { searchFieldConfig } from "../components/search-field/search-field-config.js"; 30 + import { selectConfig } from "../components/select/select-config.js"; 25 31 import { separatorConfig } from "../components/separator/separator-config.js"; 26 32 import { textAreaConfig } from "../components/text-area/text-area-config.js"; 27 - import { selectConfig } from "../components/select/select-config.js"; 28 - import { toggleButtonConfig } from "../components/toggle-button/toggle-button-config.js"; 29 - import { toggleButtonGroupConfig } from "../components/toggle-button-group/toggle-button-group-config.js"; 30 - import { listboxConfig } from "../components/listbox/listbox-config.js"; 31 - import { menuConfig } from "../components/menu/menu-config.js"; 32 - import { contextMenuConfig } from "../components/context-menu/context-menu-config.js"; 33 + import { textFieldConfig } from "../components/text-field/text-field-config.js"; 33 34 import { timeFieldConfig } from "../components/time-field/time-field-config.js"; 34 - import { dateFieldConfig } from "../components/date-field/date-field-config.js"; 35 - import { searchFieldConfig } from "../components/search-field/search-field-config.js"; 36 - import { colorFieldConfig } from "../components/color-field/color-field-config.js"; 37 - import { numberFieldConfig } from "../components/number-field/number-field-config.js"; 38 - import { comboboxConfig } from "../components/combobox/combobox-config.js"; 35 + import { toggleButtonGroupConfig } from "../components/toggle-button-group/toggle-button-group-config.js"; 36 + import { toggleButtonConfig } from "../components/toggle-button/toggle-button-config.js"; 37 + import { tooltipConfig } from "../components/tooltip/tooltip-config.js"; 39 38 import { treeConfig } from "../components/tree/tree-config.js"; 40 - import { commandMenuConfig } from "../components/command-menu/command-menu-config.js"; 39 + import { typographyConfig } from "../components/typography/typography-config.js"; 40 + import { ComponentConfig } from "../types.js"; 41 + import { ConfigOptions, getConfig, setConfig } from "./config.js"; 41 42 42 43 const __dirname = path.dirname(new URL(import.meta.url).pathname); 43 44 ··· 132 133 ); 133 134 } 134 135 135 - const ConfigPrompt = ({ config }: { config: ConfigOptions | null }) => { 136 + const ConfigPrompt = ({ 137 + config, 138 + }: { 139 + config: Partial<ConfigOptions> | null; 140 + }) => { 136 141 const [value, setValue] = React.useState(config?.componentDir); 137 142 const [packageManager, setPackageManager] = React.useState( 138 - config?.packageManager 143 + config?.packageManager, 139 144 ); 140 145 const [step, setStep] = React.useState(0); 141 146 ··· 154 159 label="Component directory:" 155 160 defaultValue={value} 156 161 onChange={setValue} 157 - onSubmit={() => setStep(step + 1)} 162 + onSubmit={() => { 163 + setStep(step + 1); 164 + }} 158 165 isEditing={step === 0} 159 166 /> 160 167 ··· 179 186 180 187 async function setup() { 181 188 const loadedConfig = await getConfig(); 182 - const config: ConfigOptions = loadedConfig ? { ...loadedConfig.config } : {}; 189 + const config = ( 190 + loadedConfig ? { ...loadedConfig.config } : {} 191 + ) as Partial<ConfigOptions>; 183 192 184 193 if (config.componentDir && config.packageManager) { 185 - return config; 194 + return config as ConfigOptions; 186 195 } 187 196 188 197 const { waitUntilExit } = render(<ConfigPrompt config={config} />); 189 198 await waitUntilExit(); 190 199 191 200 if ( 192 - config.componentDir !== loadedConfig?.config.componentDir || 193 - config.packageManager !== loadedConfig?.config.packageManager 201 + config.componentDir !== 202 + (loadedConfig?.config as ConfigOptions).componentDir || 203 + config.packageManager !== 204 + (loadedConfig?.config as ConfigOptions).packageManager 194 205 ) { 195 - await setConfig(loadedConfig, config); 206 + setConfig(loadedConfig, config as ConfigOptions); 196 207 } 197 208 198 - return config; 209 + return config as ConfigOptions; 199 210 } 200 211 201 212 async function installDependencies( 202 213 config: ConfigOptions, 203 - dependencies: { [key: string]: string } | undefined 214 + dependencies: { [key: string]: string } | undefined, 204 215 ) { 205 216 if (!dependencies) { 206 217 return; ··· 208 219 209 220 const packageJson = readFileSync( 210 221 path.join(process.cwd(), "package.json"), 211 - "utf-8" 222 + "utf8", 212 223 ); 213 - const packageJsonObject = JSON.parse(packageJson); 224 + const packageJsonObject = JSON.parse(packageJson) as Record<string, unknown>; 225 + 226 + const packageDependencies = packageJsonObject.dependencies as Record< 227 + string, 228 + string 229 + >; 214 230 215 231 for (const [packageName, version] of Object.entries(dependencies)) { 216 - if (packageJsonObject.dependencies[packageName] === version) { 232 + if (packageDependencies[packageName] === version) { 217 233 continue; 218 234 } 219 235 ··· 224 240 if (error) { 225 241 console.error( 226 242 `❌ Error installing ${packageName}@${version}:`, 227 - error 243 + error, 228 244 ); 229 245 } 230 246 231 247 resolve(true); 232 - }) 248 + }), 233 249 ); 234 250 } 235 251 } ··· 237 253 async function outputFile( 238 254 config: ConfigOptions, 239 255 filepath: string, 240 - content: string 256 + content: string, 241 257 ) { 242 258 const outputPath = path.join(process.cwd(), config.componentDir, filepath); 243 259 await mkdir(path.dirname(outputPath), { recursive: true }); ··· 246 262 247 263 async function installHipDependencies( 248 264 config: ConfigOptions, 249 - componentConfig: ComponentConfig 265 + componentConfig: ComponentConfig, 250 266 ) { 251 267 if (!componentConfig.hipDependencies) { 252 268 return; ··· 258 274 __dirname, 259 275 "../../src/components", 260 276 componentConfig.name, 261 - dependency 277 + dependency, 262 278 ), 263 - "utf-8" 279 + "utf8", 264 280 ); 265 281 await outputFile( 266 282 config, 267 283 path.join(componentConfig.name, dependency), // kind of hacky but works 268 - content 284 + content, 269 285 ); 270 286 console.log(`➕ Created ${dependency}`); 271 287 } ··· 273 289 274 290 async function copyFiles( 275 291 config: ConfigOptions, 276 - componentConfig: ComponentConfig 292 + componentConfig: ComponentConfig, 277 293 ) { 278 294 const outputPath = path.join(componentConfig.name, "index.tsx"); 279 295 const template = readFileSync( ··· 281 297 __dirname, 282 298 "../../src/components", 283 299 componentConfig.name, 284 - componentConfig.filepath 300 + componentConfig.filepath, 285 301 ), 286 - "utf-8" 302 + "utf8", 287 303 ); 288 304 289 305 await outputFile(config, outputPath, template); ··· 297 313 component: string[]; 298 314 all: boolean; 299 315 }) { 300 - let componentConfigs: ComponentConfig[] = []; 301 - 302 - if (all) { 303 - componentConfigs = COMPONENT_CONFIGS; 304 - } else { 305 - componentConfigs = component 306 - .map((componentName) => 307 - COMPONENT_CONFIGS.find((config) => config.name === componentName) 308 - ) 309 - .filter((config) => config !== undefined); 310 - } 316 + const componentConfigs = all 317 + ? COMPONENT_CONFIGS 318 + : component 319 + .map((componentName) => 320 + COMPONENT_CONFIGS.find((config) => config.name === componentName), 321 + ) 322 + .filter((config): config is ComponentConfig => config !== undefined); 311 323 312 324 for (const componentName of component) { 313 325 const componentConfig = COMPONENT_CONFIGS.find( 314 - (config) => config.name === componentName 326 + (config) => config.name === componentName, 315 327 ); 316 328 317 329 if (!componentConfig) { 318 - console.error(`❌ Component ${componentName} not found.`); 319 - process.exit(1); 330 + throw new Error(`Component ${componentName} not found.`); 320 331 } 321 332 322 333 componentConfigs.push(componentConfig); ··· 332 343 console.log(`✅ Installed ${componentConfig.name}\n`); 333 344 } 334 345 } 346 + 347 + /* eslint-enable react-refresh/only-export-components */
+3 -2
packages/hip-ui/src/components/button-group/index.tsx
··· 1 1 "use client"; 2 2 3 + import * as stylex from "@stylexjs/stylex"; 3 4 import { Group, GroupProps } from "react-aria-components"; 4 - import * as stylex from "@stylexjs/stylex"; 5 + 5 6 import { ButtonGroupContext } from "../button/context"; 6 7 7 8 const styles = stylex.create({ ··· 35 36 styles.group, 36 37 orientation === "horizontal" && styles.horizontal, 37 38 orientation === "vertical" && styles.vertical, 38 - style 39 + style, 39 40 )} 40 41 {...props} 41 42 >
+1 -1
packages/hip-ui/src/components/button/index.tsx
··· 1 1 "use client"; 2 2 3 + import * as stylex from "@stylexjs/stylex"; 3 4 import { 4 5 Button as AriaButton, 5 6 ButtonProps as AriaButtonProps, 6 7 } from "react-aria-components"; 7 - import * as stylex from "@stylexjs/stylex"; 8 8 9 9 import { useButtonStyles } from "../theme/useButtonStyles"; 10 10 import { Size, ButtonVariant } from "../types";
+2 -2
packages/hip-ui/src/components/card/index.tsx
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 2 3 - import { gray } from "../theme/semantic-color.stylex"; 3 + import { Flex } from "../flex"; 4 4 import { radius } from "../theme/radius.stylex"; 5 + import { gray } from "../theme/semantic-color.stylex"; 5 6 import { spacing } from "../theme/spacing.stylex"; 6 7 import { fontFamily, fontSize, fontWeight } from "../theme/typography.stylex"; 7 - import { Flex } from "../flex"; 8 8 9 9 const styles = stylex.create({ 10 10 card: {
+9 -8
packages/hip-ui/src/components/checkbox/index.tsx
··· 3 3 CheckboxGroupProps as AriaCheckboxGroupProps, 4 4 ValidationResult, 5 5 } from "react-aria-components"; 6 + 7 + import * as stylex from "@stylexjs/stylex"; 8 + import { Check, Minus } from "lucide-react"; 6 9 import { 7 10 Checkbox as AriaCheckbox, 8 11 CheckboxGroup as AriaCheckboxGroup, 9 12 FieldError, 10 13 } from "react-aria-components"; 11 - import * as stylex from "@stylexjs/stylex"; 12 - import { Check, Minus } from "lucide-react"; 13 14 14 - import { spacing } from "../theme/spacing.stylex"; 15 + import { Flex } from "../flex"; 16 + import { Description, Label } from "../label"; 15 17 import { radius } from "../theme/radius.stylex"; 16 18 import { gray, primary } from "../theme/semantic-color.stylex"; 19 + import { spacing } from "../theme/spacing.stylex"; 17 20 import { fontFamily, fontSize, lineHeight } from "../theme/typography.stylex"; 18 - import { Flex } from "../flex"; 19 - import { Description, Label } from "../label"; 20 21 import { Size } from "../types"; 21 22 22 23 const styles = stylex.create({ ··· 74 75 }: CheckboxGroupProps) { 75 76 return ( 76 77 <AriaCheckboxGroup {...props} {...stylex.props(styles.group, style)}> 77 - {label !== undefined && <Label size={size}>{label}</Label>} 78 + {label !== null && <Label size={size}>{label}</Label>} 78 79 <Flex direction="column" gap="2"> 79 80 {children} 80 81 </Flex> ··· 102 103 ? [gray.bgSolid, gray.border, styles.checked] 103 104 : isSelected 104 105 ? [primary.bgSolid, primary.borderInteractive, styles.checked] 105 - : [gray.borderInteractive] 106 + : [gray.borderInteractive], 106 107 )} 107 108 > 108 109 {isIndeterminate ? ( ··· 111 112 <Check size={16} /> 112 113 ) : null} 113 114 </div> 114 - {children !== undefined && ( 115 + {children !== null && ( 115 116 <Flex direction="column" gap="1"> 116 117 {children} 117 118 </Flex>
+7 -6
packages/hip-ui/src/components/color-field/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { useRef } from "react"; 1 3 import { 2 4 ColorFieldProps as AriaColorFieldProps, 3 5 Input, ··· 6 8 FieldError, 7 9 ColorField as AriaColorField, 8 10 } from "react-aria-components"; 9 - import * as stylex from "@stylexjs/stylex"; 11 + 10 12 import { Description, Label } from "../label"; 11 - import { useRef } from "react"; 13 + import { useInputStyles } from "../theme/useInputStyles"; 12 14 import { Size } from "../types"; 13 - import { useInputStyles } from "../theme/useInputStyles"; 14 15 15 16 export interface ColorFieldProps 16 17 extends Omit<AriaColorFieldProps, "style" | "className">, ··· 40 41 41 42 return ( 42 43 <AriaColorField {...props} {...stylex.props(inputStyles.field, style)}> 43 - {label !== undefined && <Label size={size}>{label}</Label>} 44 + {label !== null && <Label size={size}>{label}</Label>} 44 45 {/* 45 46 This onClick is specifically for mouse users not clicking directly on the input. 46 47 A keyboard user would not encounter the same issue. ··· 50 51 {...stylex.props(inputStyles.wrapper)} 51 52 onClick={() => inputRef.current?.focus()} 52 53 > 53 - {prefix !== undefined && ( 54 + {prefix !== null && ( 54 55 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 55 56 )} 56 57 <Input ··· 58 59 ref={inputRef} 59 60 {...stylex.props(inputStyles.input)} 60 61 /> 61 - {suffix !== undefined && ( 62 + {suffix !== null && ( 62 63 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 63 64 )} 64 65 </div>
+27 -33
packages/hip-ui/src/components/combobox/index.tsx
··· 1 + import type { ListBoxProps, ValidationResult } from "react-aria-components"; 2 + 3 + import * as stylex from "@stylexjs/stylex"; 4 + import { ChevronDown } from "lucide-react"; 5 + import { use } from "react"; 1 6 import { 2 7 Button, 3 8 Popover, ··· 5 10 ComboBox as AriaComboBox, 6 11 ComboBoxProps as AriaComboBoxProps, 7 12 Input, 13 + FieldError, 8 14 } from "react-aria-components"; 9 - import * as stylex from "@stylexjs/stylex"; 10 - import type { 11 - ListBoxProps, 12 - ListBoxSectionProps, 13 - ValidationResult, 14 - } from "react-aria-components"; 15 - import { FieldError } from "react-aria-components"; 16 - import { Description, Label } from "../label"; 17 - import { ChevronDown } from "lucide-react"; 18 - import { Size } from "../types"; 19 - import { 20 - ListBox, 21 - ListBoxItem, 22 - ListBoxItemProps, 23 - ListBoxSectionHeaderProps, 24 - ListBoxSectionHeader, 25 - ListBoxSeparatorProps, 26 - ListBoxSeparator, 27 - ListBoxSection, 28 - } from "../listbox"; 15 + 29 16 import { SizeContext } from "../context"; 17 + import { IconButton } from "../icon-button"; 18 + import { Description, Label } from "../label"; 19 + import { ListBox } from "../listbox"; 20 + import { spacing } from "../theme/spacing.stylex"; 30 21 import { useInputStyles } from "../theme/useInputStyles"; 31 22 import { usePopoverStyles } from "../theme/usePopoverStyles"; 32 - import { IconButton } from "../icon-button"; 23 + import { Size } from "../types"; 33 24 import { SmallBody } from "../typography"; 34 - import { spacing } from "../theme/spacing.stylex"; 35 - import { use } from "react"; 36 25 37 26 const styles = stylex.create({ 38 27 matchWidth: { ··· 102 91 <AriaComboBox {...props} {...stylex.props(inputStyles.field, style)}> 103 92 {label && <Label size={size}>{label}</Label>} 104 93 <Button {...stylex.props(inputStyles.wrapper)}> 105 - {prefix !== undefined && ( 94 + {prefix !== null && ( 106 95 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 107 96 )} 108 97 <Input 109 98 {...stylex.props(inputStyles.input)} 110 99 placeholder={placeholder} 111 100 /> 112 - {suffix !== undefined && ( 101 + {suffix !== null && ( 113 102 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 114 103 )} 115 104 <div {...stylex.props(inputStyles.addon)}> ··· 140 129 ); 141 130 } 142 131 143 - export type ComboBoxItemProps = ListBoxItemProps; 144 - export const ComboBoxItem = ListBoxItem; 145 - export type ComboBoxSectionProps<T extends object> = ListBoxSectionProps<T>; 146 - export const ComboBoxSection = ListBoxSection; 147 - export type ComboBoxSectionHeaderProps = ListBoxSectionHeaderProps; 148 - export const ComboBoxSectionHeader = ListBoxSectionHeader; 149 - export type ComboBoxSeparatorProps = ListBoxSeparatorProps; 150 - export const ComboBoxSeparator = ListBoxSeparator; 132 + export type { 133 + ListBoxItemProps as ComboBoxItemProps, 134 + ListBoxSectionProps as ComboBoxSectionProps, 135 + ListBoxSectionHeaderProps as ComboBoxSectionHeaderProps, 136 + ListBoxSeparatorProps as ComboBoxSeparatorProps, 137 + } from "../listbox"; 138 + 139 + export { 140 + ListBoxItem as ComboBoxItem, 141 + ListBoxSection as ComboBoxSection, 142 + ListBoxSectionHeader as ComboBoxSectionHeader, 143 + ListBoxSeparator as ComboBoxSeparator, 144 + } from "../listbox";
+30 -30
packages/hip-ui/src/components/command-menu/index.tsx
··· 1 + import { useControlledState } from "@react-stately/utils"; 2 + import * as stylex from "@stylexjs/stylex"; 3 + import { useEffect, useEffectEvent } from "react"; 1 4 import { 2 5 InputProps, 3 6 Modal, ··· 8 11 ModalOverlay, 9 12 AutocompleteProps as AriaAutocompleteProps, 10 13 } from "react-aria-components"; 11 - import { useControlledState } from "@react-stately/utils"; 14 + import { OverlayTriggerProps } from "react-stately"; 15 + 16 + import { SizeContext } from "../context"; 12 17 import { SearchField } from "../search-field"; 13 - import { OverlayTriggerProps } from "react-stately"; 14 - import { 15 - MenuItem, 16 - MenuItemProps, 17 - MenuSection, 18 - MenuSectionHeader, 19 - MenuSectionHeaderProps, 20 - MenuSectionProps, 21 - MenuSeparator, 22 - MenuSeparatorProps, 23 - } from "../menu"; 24 - import { useEffect, useEffectEvent } from "react"; 25 - import * as stylex from "@stylexjs/stylex"; 26 - import { shadow } from "../theme/shadow.stylex"; 18 + import { Separator } from "../separator"; 19 + import { animations } from "../theme/animations.stylex"; 27 20 import { radius } from "../theme/radius.stylex"; 28 21 import { gray } from "../theme/semantic-color.stylex"; 29 - import { animations } from "../theme/animations.stylex"; 22 + import { shadow } from "../theme/shadow.stylex"; 30 23 import { spacing } from "../theme/spacing.stylex"; 31 - import { SizeContext } from "../context"; 32 - import { Separator } from "../separator"; 33 24 34 25 const styles = stylex.create({ 35 26 overlay: { ··· 127 118 const [isOpen, setIsOpen] = useControlledState( 128 119 isOpenProp, 129 120 defaultOpen ?? false, 130 - onOpenChange 121 + onOpenChange, 131 122 ); 132 - const onClose = useEffectEvent(() => setIsOpen(false)); 123 + const onClose = useEffectEvent(() => { 124 + setIsOpen(false); 125 + }); 133 126 134 127 useEffect(() => { 135 128 if (disableGlobalShortcut) return; ··· 140 133 } 141 134 } 142 135 143 - window.addEventListener("keydown", handleKeyDown); 136 + globalThis.addEventListener("keydown", handleKeyDown); 144 137 145 - return () => window.removeEventListener("keydown", handleKeyDown); 138 + return () => { 139 + globalThis.removeEventListener("keydown", handleKeyDown); 140 + }; 146 141 }, [setIsOpen, disableGlobalShortcut]); 147 142 148 143 return ( ··· 180 175 ); 181 176 } 182 177 183 - export type CommandMenuItemProps = MenuItemProps; 184 - export const CommandMenuItem = MenuItem; 185 - export type CommandMenuSectionHeaderProps = MenuSectionHeaderProps; 186 - export const CommandMenuSectionHeader = MenuSectionHeader; 187 - export type CommandMenuSectionProps<T extends object> = MenuSectionProps<T>; 188 - export const CommandMenuSection = MenuSection; 189 - export type CommandMenuSeparatorProps = MenuSeparatorProps; 190 - export const CommandMenuSeparator = MenuSeparator; 178 + export type { 179 + MenuItemProps as CommandMenuItemProps, 180 + MenuSectionHeaderProps as CommandMenuSectionHeaderProps, 181 + MenuSectionProps as CommandMenuSectionProps, 182 + MenuSeparatorProps as CommandMenuSeparatorProps, 183 + } from "../menu"; 184 + 185 + export { 186 + MenuItem as CommandMenuItem, 187 + MenuSectionHeader as CommandMenuSectionHeader, 188 + MenuSection as CommandMenuSection, 189 + MenuSeparator as CommandMenuSeparator, 190 + } from "../menu";
+18 -18
packages/hip-ui/src/components/context-menu/index.tsx
··· 1 1 import { OverlayTriggerProps } from "@react-types/overlays"; 2 + import * as stylex from "@stylexjs/stylex"; 3 + import { 4 + Children, 5 + cloneElement, 6 + createContext, 7 + use, 8 + useCallback, 9 + useRef, 10 + useState, 11 + } from "react"; 12 + import { AriaButtonProps, useMenuTrigger } from "react-aria"; 2 13 import { 3 14 Menu as AriaMenu, 4 15 MenuProps as AriaMenuProps, ··· 10 21 Provider, 11 22 RootMenuTriggerStateContext, 12 23 } from "react-aria-components"; 13 - import * as stylex from "@stylexjs/stylex"; 24 + import { useMenuTriggerState } from "react-stately"; 14 25 15 - import { 16 - Children, 17 - cloneElement, 18 - createContext, 19 - use, 20 - useCallback, 21 - useRef, 22 - useState, 23 - } from "react"; 24 - import { Size } from "../types"; 25 26 import { SizeContext } from "../context"; 26 - import { useMenuTriggerState } from "react-stately"; 27 - import { AriaButtonProps, useMenuTrigger } from "react-aria"; 28 27 import { usePopoverStyles } from "../theme/usePopoverStyles"; 28 + import { Size } from "../types"; 29 29 30 30 const ContextMenuTriggerPropsContext = createContext< 31 - AriaButtonProps<"button"> & { ref?: React.Ref<HTMLDivElement> } 31 + AriaButtonProps & { ref?: React.Ref<HTMLDivElement> } 32 32 >({}); 33 33 34 34 interface Position { ··· 55 55 const { menuTriggerProps, menuProps } = useMenuTrigger( 56 56 { ...props, type: "menu" }, 57 57 state, 58 - ref 58 + ref, 59 59 ); 60 60 61 61 return ( ··· 97 97 overlayTriggerState?.open(); 98 98 setPosition({ x: e.pageX, y: e.pageY }); 99 99 }, 100 - [overlayTriggerState, setPosition] 100 + [overlayTriggerState, setPosition], 101 101 ); 102 102 103 103 // eslint-disable-next-line @eslint-react/no-children-count ··· 117 117 "aria-haspopup": menuTriggerProps["aria-haspopup"], 118 118 id: menuTriggerProps["id"], 119 119 onContextMenu: onContextMenu, 120 - } 120 + }, 121 121 )} 122 122 <div 123 123 ref={menuTriggerProps.ref} 124 - style={{ position: "absolute", top: position?.y, left: position?.x }} 124 + style={{ position: "absolute", top: position.y, left: position.x }} 125 125 /> 126 126 </> 127 127 );
+1
packages/hip-ui/src/components/context.ts
··· 1 1 import { createContext } from "react"; 2 + 2 3 import { Size } from "./types"; 3 4 4 5 export const SizeContext = createContext<Size>("md");
+8 -7
packages/hip-ui/src/components/date-field/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { useRef } from "react"; 1 3 import { 2 4 DateFieldProps as AriaDateFieldProps, 3 5 DateInput, 4 6 DateSegment, 5 7 DateValue, 6 8 ValidationResult, 9 + FieldError, 10 + DateField as AriaDateField, 7 11 } from "react-aria-components"; 8 12 9 - import { FieldError, DateField as AriaDateField } from "react-aria-components"; 10 - import * as stylex from "@stylexjs/stylex"; 11 13 import { Description, Label } from "../label"; 12 - import { useRef } from "react"; 14 + import { useInputStyles } from "../theme/useInputStyles"; 13 15 import { Size } from "../types"; 14 - import { useInputStyles } from "../theme/useInputStyles"; 15 16 16 17 export interface DateFieldProps<T extends DateValue> 17 18 extends Omit<AriaDateFieldProps<T>, "style" | "className"> { ··· 39 40 40 41 return ( 41 42 <AriaDateField {...props} {...stylex.props(inputStyles.field, style)}> 42 - {label !== undefined && <Label size={size}>{label}</Label>} 43 + {label !== null && <Label size={size}>{label}</Label>} 43 44 {/* 44 45 This onClick is specifically for mouse users not clicking directly on the input. 45 46 A keyboard user would not encounter the same issue. ··· 49 50 {...stylex.props(inputStyles.wrapper)} 50 51 onClick={() => inputRef.current?.focus()} 51 52 > 52 - {prefix !== undefined && ( 53 + {prefix !== null && ( 53 54 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 54 55 )} 55 56 <DateInput {...stylex.props(inputStyles.input)} ref={inputRef}> 56 57 {(segment) => <DateSegment segment={segment} />} 57 58 </DateInput> 58 - {suffix !== undefined && ( 59 + {suffix !== null && ( 59 60 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 60 61 )} 61 62 </div>
+2 -1
packages/hip-ui/src/components/flex/index.tsx
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 + 2 3 import { Spacing, spacing } from "../theme/spacing.stylex"; 3 4 4 5 const styles = stylex.create({ ··· 141 142 142 143 typeof gap === "string" && styles[`gap-${gap}` as keyof typeof styles], 143 144 144 - style 145 + style, 145 146 )} 146 147 /> 147 148 );
+4 -4
packages/hip-ui/src/components/icon-button/index.tsx
··· 1 1 "use client"; 2 2 3 - import { ButtonProps as AriaButtonProps } from "react-aria-components"; 4 3 import * as stylex from "@stylexjs/stylex"; 4 + import { use } from "react"; 5 + import { ButtonProps as AriaButtonProps } from "react-aria-components"; 5 6 6 - import { Tooltip } from "../tooltip"; 7 7 import { Button } from "../button"; 8 + import { SizeContext } from "../context"; 8 9 import { spacing } from "../theme/spacing.stylex"; 10 + import { Tooltip } from "../tooltip"; 9 11 import { ButtonVariant, Size } from "../types"; 10 - import { use } from "react"; 11 - import { SizeContext } from "../context"; 12 12 13 13 const styles = stylex.create({ 14 14 sm: {
+6 -6
packages/hip-ui/src/components/label/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { use } from "react"; 1 3 import { 2 4 LabelProps as AriaLabelProps, 3 5 Text, 4 6 TextProps, 7 + Label as AriaLabel, 5 8 } from "react-aria-components"; 6 - import { Label as AriaLabel } from "react-aria-components"; 7 - import * as stylex from "@stylexjs/stylex"; 8 9 10 + import { SizeContext } from "../context"; 11 + import { gray } from "../theme/semantic-color.stylex"; 9 12 import { fontSize, fontWeight, lineHeight } from "../theme/typography.stylex"; 10 - import { gray } from "../theme/semantic-color.stylex"; 11 13 import { Size } from "../types"; 12 - import { use } from "react"; 13 - import { SizeContext } from "../context"; 14 14 15 15 const styles = stylex.create({ 16 16 label: { ··· 76 76 styles.description, 77 77 gray.textDim, 78 78 size === "sm" && styles.descriptionSm, 79 - style 79 + style, 80 80 )} 81 81 {...props} 82 82 />
+6 -7
packages/hip-ui/src/components/link/index.tsx
··· 1 - import { LinkProps as AriaLinkProps } from "react-aria-components"; 2 - import { Link as AriaLink } from "react-aria-components"; 3 1 import * as stylex from "@stylexjs/stylex"; 2 + import { use } from "react"; 3 + import { 4 + LinkProps as AriaLinkProps, 5 + Link as AriaLink, 6 + } from "react-aria-components"; 4 7 5 8 import { blue } from "../theme/colors.stylex"; 6 9 import { fontFamily, fontWeight } from "../theme/typography.stylex"; 7 - import { createContext, use } from "react"; 10 + import { LinkContext } from "./link-context"; 8 11 9 12 const styles = stylex.create({ 10 13 link: { ··· 21 24 }, 22 25 }, 23 26 }); 24 - 25 - export const LinkContext = createContext<{ 26 - style?: stylex.StyleXStyles | stylex.StyleXStyles[]; 27 - }>({}); 28 27 29 28 export interface LinkProps extends Omit<AriaLinkProps, "style" | "className"> { 30 29 style?: stylex.StyleXStyles | stylex.StyleXStyles[];
+10 -9
packages/hip-ui/src/components/listbox/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { Check } from "lucide-react"; 3 + import { use } from "react"; 1 4 import { 2 5 ListBoxProps as AriaListBoxProps, 3 6 ListBoxItem as AriaListBoxItem, ··· 8 11 Header, 9 12 SeparatorProps, 10 13 } from "react-aria-components"; 11 - import * as stylex from "@stylexjs/stylex"; 12 - import { Check } from "lucide-react"; 13 - import { spacing } from "../theme/spacing.stylex"; 14 - import { typeramp } from "../theme/typography.stylex"; 15 - import { Size } from "../types"; 14 + 16 15 import { SizeContext } from "../context"; 17 - import { use } from "react"; 18 16 import { Separator } from "../separator"; 19 17 import { gray } from "../theme/semantic-color.stylex"; 18 + import { spacing } from "../theme/spacing.stylex"; 19 + import { typeramp } from "../theme/typography.stylex"; 20 20 import { useListBoxItemStyles } from "../theme/useListBoxItemStyles"; 21 + import { Size } from "../types"; 21 22 22 23 const styles = stylex.create({ 23 24 listBox: { ··· 97 98 > 98 99 {({ isSelected }) => ( 99 100 <div {...stylex.props(listBoxItemStyles.inner)}> 100 - {prefix !== undefined && ( 101 + {prefix !== null && ( 101 102 <div {...stylex.props(listBoxItemStyles.addon)}>{prefix}</div> 102 103 )} 103 104 <div {...stylex.props(listBoxItemStyles.label)}>{children}</div> 104 - {suffix !== undefined && ( 105 + {suffix !== null && ( 105 106 <div {...stylex.props(listBoxItemStyles.addon)}>{suffix}</div> 106 107 )} 107 108 {isSelected && ( ··· 154 155 styles.sectionLabel, 155 156 gray.textDim, 156 157 styles[`${size}SectionLabel`], 157 - style 158 + style, 158 159 )} 159 160 /> 160 161 );
+17 -17
packages/hip-ui/src/components/menu/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { Check, ChevronRight } from "lucide-react"; 3 + import { use } from "react"; 1 4 import { 2 5 MenuTriggerProps, 3 6 MenuTrigger, ··· 12 15 SubmenuTrigger, 13 16 PopoverProps, 14 17 } from "react-aria-components"; 15 - import * as stylex from "@stylexjs/stylex"; 16 - import { Size } from "../types"; 17 - import { 18 - ListBoxSectionHeaderProps, 19 - ListBoxSectionHeader, 20 - ListBoxSeparator, 21 - ListBoxSeparatorProps, 22 - } from "../listbox"; 18 + 23 19 import { SizeContext } from "../context"; 24 - import { Check, ChevronRight } from "lucide-react"; 20 + import { useListBoxItemStyles } from "../theme/useListBoxItemStyles"; 25 21 import { usePopoverStyles } from "../theme/usePopoverStyles"; 26 - import { useListBoxItemStyles } from "../theme/useListBoxItemStyles"; 27 - import { use } from "react"; 22 + import { Size } from "../types"; 28 23 29 24 export interface MenuProps<T extends object> 30 25 extends Omit<MenuTriggerProps, "trigger" | "children">, ··· 163 158 > 164 159 {({ isSelected, hasSubmenu }) => ( 165 160 <div {...stylex.props(menuItemStyles.inner)}> 166 - {prefix !== undefined && ( 161 + {prefix !== null && ( 167 162 <div {...stylex.props(menuItemStyles.addon)}>{prefix}</div> 168 163 )} 169 164 <div {...stylex.props(menuItemStyles.label)}>{children}</div> 170 - {suffix !== undefined && ( 165 + {suffix !== null && ( 171 166 <div {...stylex.props(menuItemStyles.addon)}>{suffix}</div> 172 167 )} 173 168 {isSelected && ( ··· 186 181 ); 187 182 } 188 183 189 - export type MenuSectionHeaderProps = ListBoxSectionHeaderProps; 190 - export const MenuSectionHeader = ListBoxSectionHeader; 191 - export type MenuSeparatorProps = ListBoxSeparatorProps; 192 - export const MenuSeparator = ListBoxSeparator; 184 + export type { 185 + ListBoxSectionHeaderProps as MenuSectionHeaderProps, 186 + ListBoxSeparatorProps as MenuSeparatorProps, 187 + } from "../listbox"; 188 + 189 + export { 190 + ListBoxSectionHeader as MenuSectionHeader, 191 + ListBoxSeparator as MenuSeparator, 192 + } from "../listbox";
+10 -9
packages/hip-ui/src/components/number-field/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { Minus, Plus } from "lucide-react"; 3 + import { useRef } from "react"; 1 4 import { 2 5 NumberFieldProps as AriaNumberFieldProps, 3 6 Input, ··· 8 11 Group, 9 12 Button, 10 13 } from "react-aria-components"; 11 - import * as stylex from "@stylexjs/stylex"; 14 + 12 15 import { Description, Label } from "../label"; 13 - import { useRef } from "react"; 14 - import { Size } from "../types"; 15 - import { useInputStyles } from "../theme/useInputStyles"; 16 - import { Minus, Plus } from "lucide-react"; 16 + import { slate } from "../theme/colors.stylex"; 17 17 import { gray } from "../theme/semantic-color.stylex"; 18 18 import { spacing } from "../theme/spacing.stylex"; 19 - import { slate } from "../theme/colors.stylex"; 19 + import { useInputStyles } from "../theme/useInputStyles"; 20 + import { Size } from "../types"; 20 21 21 22 const styles = stylex.create({ 22 23 buttons: { ··· 78 79 const buttonStyles = stylex.props( 79 80 styles.button, 80 81 gray.borderInteractive, 81 - gray.bgAction 82 + gray.bgAction, 82 83 ); 83 84 84 85 return ( ··· 93 94 {...stylex.props(inputStyles.wrapper)} 94 95 onClick={() => inputRef.current?.focus()} 95 96 > 96 - {prefix !== undefined && ( 97 + {prefix !== null && ( 97 98 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 98 99 )} 99 100 <Input ··· 101 102 ref={inputRef} 102 103 {...stylex.props(inputStyles.input)} 103 104 /> 104 - {suffix !== undefined && ( 105 + {suffix !== null && ( 105 106 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 106 107 )} 107 108 <Group {...stylex.props(styles.buttons)}>
+1 -1
packages/hip-ui/src/components/popover/index.tsx
··· 1 1 "use client"; 2 2 3 + import * as stylex from "@stylexjs/stylex"; 3 4 import { 4 5 OverlayArrow, 5 6 Popover as AriaPopover, ··· 8 9 DialogTriggerProps, 9 10 Dialog, 10 11 } from "react-aria-components"; 11 - import * as stylex from "@stylexjs/stylex"; 12 12 13 13 import { slate } from "../theme/colors.stylex"; 14 14 import { spacing } from "../theme/spacing.stylex";
+7 -6
packages/hip-ui/src/components/radio/index.tsx
··· 3 3 RadioGroupProps as AriaRadioGroupProps, 4 4 ValidationResult, 5 5 } from "react-aria-components"; 6 + 7 + import * as stylex from "@stylexjs/stylex"; 6 8 import { 7 9 Radio as AriaRadio, 8 10 RadioGroup as AriaRadioGroup, 9 11 FieldError, 10 12 SelectionIndicator, 11 13 } from "react-aria-components"; 12 - import * as stylex from "@stylexjs/stylex"; 13 14 14 - import { spacing } from "../theme/spacing.stylex"; 15 + import { Flex } from "../flex"; 16 + import { Description, Label } from "../label"; 15 17 import { radius } from "../theme/radius.stylex"; 16 18 import { gray, primary } from "../theme/semantic-color.stylex"; 19 + import { spacing } from "../theme/spacing.stylex"; 17 20 import { fontFamily, fontSize, lineHeight } from "../theme/typography.stylex"; 18 - import { Flex } from "../flex"; 19 - import { Description, Label } from "../label"; 20 21 import { Size } from "../types"; 21 22 22 23 const scaleIn = stylex.keyframes({ ··· 104 105 }: RadioGroupProps) { 105 106 return ( 106 107 <AriaRadioGroup {...props} {...stylex.props(styles.group, style)}> 107 - {label !== undefined && <Label size={size}>{label}</Label>} 108 + {label !== null && <Label size={size}>{label}</Label>} 108 109 <Flex direction="column" gap="2"> 109 110 {children} 110 111 </Flex> ··· 132 133 ? [gray.bgSolid, gray.border, styles.checked] 133 134 : isSelected 134 135 ? [primary.bgSolid, primary.borderInteractive, styles.checked] 135 - : [gray.borderInteractive] 136 + : [gray.borderInteractive], 136 137 )} 137 138 > 138 139 <SelectionIndicator {...stylex.props(styles.selectionIndicator)} />
+11 -10
packages/hip-ui/src/components/search-field/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { SearchIcon, X } from "lucide-react"; 3 + import { useRef } from "react"; 1 4 import { 2 5 SearchFieldProps as AriaSearchFieldProps, 3 6 Input, ··· 6 9 FieldError, 7 10 SearchField as AriaSearchField, 8 11 } from "react-aria-components"; 9 - import * as stylex from "@stylexjs/stylex"; 12 + 13 + import { IconButton } from "../icon-button"; 10 14 import { Description, Label } from "../label"; 11 - import { useRef } from "react"; 12 - import { Size } from "../types"; 15 + import { spacing } from "../theme/spacing.stylex"; 13 16 import { useInputStyles } from "../theme/useInputStyles"; 14 - import { SearchIcon, X } from "lucide-react"; 15 - import { IconButton } from "../icon-button"; 16 - import { spacing } from "../theme/spacing.stylex"; 17 + import { Size } from "../types"; 17 18 18 19 const styles = stylex.create({ 19 20 wrapper: { ··· 63 64 {({ isEmpty }) => { 64 65 return ( 65 66 <> 66 - {label !== undefined && <Label size={size}>{label}</Label>} 67 + {label !== null && <Label size={size}>{label}</Label>} 67 68 {/* 68 69 This onClick is specifically for mouse users not clicking directly on the input. 69 70 A keyboard user would not encounter the same issue. ··· 73 74 {...stylex.props(inputStyles.wrapper, styles.wrapper)} 74 75 onClick={() => inputRef.current?.focus()} 75 76 > 76 - {prefix !== undefined && ( 77 + {prefix !== null && ( 77 78 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 78 79 )} 79 80 <Input ··· 81 82 ref={inputRef} 82 83 {...stylex.props( 83 84 inputStyles.input, 84 - !isEmpty && styles.clearButtonPadding 85 + !isEmpty && styles.clearButtonPadding, 85 86 )} 86 87 /> 87 - {suffix !== undefined && ( 88 + {suffix !== null && ( 88 89 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 89 90 )} 90 91 {!isEmpty && (
+26 -31
packages/hip-ui/src/components/select/index.tsx
··· 1 + import type { ValidationResult } from "react-aria-components"; 2 + 3 + import * as stylex from "@stylexjs/stylex"; 4 + import { ChevronDown } from "lucide-react"; 5 + import { use } from "react"; 1 6 import { 2 7 SelectProps as AriaSelectProps, 3 8 Button, 4 9 Popover, 5 10 SelectValue, 6 11 PopoverProps, 12 + Select as AriaSelect, 13 + FieldError, 7 14 } from "react-aria-components"; 8 - import { Select as AriaSelect } from "react-aria-components"; 9 - import * as stylex from "@stylexjs/stylex"; 10 - import type { 11 - ListBoxSectionProps, 12 - ValidationResult, 13 - } from "react-aria-components"; 14 - import { FieldError } from "react-aria-components"; 15 + 16 + import { SizeContext } from "../context"; 15 17 import { Description, Label } from "../label"; 16 - import { ChevronDown } from "lucide-react"; 17 - import { Size } from "../types"; 18 - import { 19 - ListBox, 20 - ListBoxItem, 21 - ListBoxItemProps, 22 - ListBoxSectionHeaderProps, 23 - ListBoxSectionHeader, 24 - ListBoxSeparatorProps, 25 - ListBoxSeparator, 26 - ListBoxSection, 27 - } from "../listbox"; 28 - import { SizeContext } from "../context"; 18 + import { ListBox } from "../listbox"; 29 19 import { useInputStyles } from "../theme/useInputStyles"; 30 20 import { usePopoverStyles } from "../theme/usePopoverStyles"; 31 - import { use } from "react"; 21 + import { Size } from "../types"; 32 22 33 23 const styles = stylex.create({ 34 24 matchWidth: { ··· 90 80 > 91 81 {label && <Label size={size}>{label}</Label>} 92 82 <Button {...stylex.props(inputStyles.wrapper)}> 93 - {prefix !== undefined && ( 83 + {prefix !== null && ( 94 84 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 95 85 )} 96 86 <SelectValue {...stylex.props(inputStyles.input)}> ··· 101 91 return defaultChildren; 102 92 }} 103 93 </SelectValue> 104 - {suffix !== undefined && ( 94 + {suffix !== null && ( 105 95 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 106 96 )} 107 97 <div {...stylex.props(inputStyles.addon)}> ··· 129 119 ); 130 120 } 131 121 132 - export type SelectItemProps = ListBoxItemProps; 133 - export const SelectItem = ListBoxItem; 134 - export type SelectSectionProps<T extends object> = ListBoxSectionProps<T>; 135 - export const SelectSection = ListBoxSection; 136 - export type SelectSectionHeaderProps = ListBoxSectionHeaderProps; 137 - export const SelectSectionHeader = ListBoxSectionHeader; 138 - export type SelectSeparatorProps = ListBoxSeparatorProps; 139 - export const SelectSeparator = ListBoxSeparator; 122 + export type { 123 + ListBoxItemProps as SelectItemProps, 124 + ListBoxSectionProps as SelectSectionProps, 125 + ListBoxSectionHeaderProps as SelectSectionHeaderProps, 126 + ListBoxSeparatorProps as SelectSeparatorProps, 127 + } from "../listbox"; 128 + 129 + export { 130 + ListBoxItem as SelectItem, 131 + ListBoxSection as SelectSection, 132 + ListBoxSectionHeader as SelectSectionHeader, 133 + ListBoxSeparator as SelectSeparator, 134 + } from "../listbox";
+4 -2
packages/hip-ui/src/components/separator/index.tsx
··· 1 - import { SeparatorProps as AriaSeparatorProps } from "react-aria-components"; 2 - import { Separator as AriaSeparator } from "react-aria-components"; 3 1 import * as stylex from "@stylexjs/stylex"; 2 + import { 3 + SeparatorProps as AriaSeparatorProps, 4 + Separator as AriaSeparator, 5 + } from "react-aria-components"; 4 6 5 7 import { slate } from "../theme/colors.stylex"; 6 8
+11 -14
packages/hip-ui/src/components/text-area/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { use, useRef } from "react"; 1 3 import { 2 4 TextArea as AriaTextArea, 3 5 TextAreaProps as AriaTextAreaProps, 4 6 InputProps, 5 7 TextFieldProps, 6 8 ValidationResult, 9 + FieldError, 10 + TextField as AriaTextField, 7 11 } from "react-aria-components"; 8 12 9 - import { FieldError, TextField as AriaTextField } from "react-aria-components"; 10 - import * as stylex from "@stylexjs/stylex"; 13 + import { SizeContext } from "../context"; 14 + import { Description, Label } from "../label"; 15 + import { slate } from "../theme/colors.stylex"; 16 + import { radius } from "../theme/radius.stylex"; 11 17 import { gray } from "../theme/semantic-color.stylex"; 12 18 import { spacing } from "../theme/spacing.stylex"; 13 - import { Description, Label } from "../label"; 14 - import { radius } from "../theme/radius.stylex"; 15 19 import { lineHeight, fontSize, fontFamily } from "../theme/typography.stylex"; 16 - import { slate } from "../theme/colors.stylex"; 17 - import { use, useRef } from "react"; 18 20 import { Size } from "../types"; 19 - import { SizeContext } from "../context"; 20 21 21 22 const styles = stylex.create({ 22 23 wrapper: { ··· 140 141 141 142 return ( 142 143 <AriaTextField {...props} {...stylex.props(styles.wrapper, style)}> 143 - {label !== undefined && <Label size={size}>{label}</Label>} 144 + {label !== null && <Label size={size}>{label}</Label>} 144 145 {/* 145 146 This onClick is specifically for mouse users not clicking directly on the input. 146 147 A keyboard user would not encounter the same issue. ··· 150 151 {...stylex.props(styles.inputWrapper, gray.bgUi, gray.text)} 151 152 onClick={() => textAreaRef.current?.focus()} 152 153 > 153 - {prefix !== undefined && ( 154 - <div {...stylex.props(styles.addon)}>{prefix}</div> 155 - )} 154 + {prefix !== null && <div {...stylex.props(styles.addon)}>{prefix}</div>} 156 155 <AriaTextArea 157 156 {...stylex.props(styles.input, styles[`${size}Input`])} 158 157 ref={textAreaRef} 159 158 placeholder={placeholder} 160 159 rows={rows} 161 160 /> 162 - {suffix !== undefined && ( 163 - <div {...stylex.props(styles.addon)}>{suffix}</div> 164 - )} 161 + {suffix !== null && <div {...stylex.props(styles.addon)}>{suffix}</div>} 165 162 </div> 166 163 {description && <Description size={size}>{description}</Description>} 167 164 <FieldError>{errorMessage}</FieldError>
+13 -15
packages/hip-ui/src/components/text-field/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { Eye, EyeOff } from "lucide-react"; 3 + import { useRef, useState, use } from "react"; 1 4 import { 2 5 TextFieldProps as AriaTextFieldProps, 3 6 InputContext, 4 7 InputProps, 5 8 ValidationResult, 6 - } from "react-aria-components"; 7 - 8 - import { 9 9 FieldError, 10 10 Input, 11 11 TextField as AriaTextField, 12 12 } from "react-aria-components"; 13 - import * as stylex from "@stylexjs/stylex"; 14 - import { Description, Label } from "../label"; 15 - import { useRef } from "react"; 16 - import { useState } from "react"; 13 + 17 14 import { IconButton } from "../icon-button"; 18 - import { Eye, EyeOff } from "lucide-react"; 19 - import { use } from "react"; 20 - import { Size } from "../types"; 15 + import { Description, Label } from "../label"; 21 16 import { useInputStyles } from "../theme/useInputStyles"; 17 + import { Size } from "../types"; 22 18 23 19 function PasswordToggle({ 24 20 type, ··· 39 35 size="sm" 40 36 variant="tertiary" 41 37 label="Toggle password visibility" 42 - onPress={() => setType(type === "password" ? "text" : "password")} 38 + onPress={() => { 39 + setType(type === "password" ? "text" : "password"); 40 + }} 43 41 > 44 42 {type === "password" ? <EyeOff /> : <Eye />} 45 43 </IconButton> ··· 72 70 }: TextFieldProps) { 73 71 const inputRef = useRef<HTMLInputElement>(null); 74 72 const [type, setType] = useState<TextFieldProps["type"]>( 75 - props.type || "text" 73 + props.type || "text", 76 74 ); 77 75 const isPasswordInput = props.type === "password"; 78 76 const inputStyles = useInputStyles({ size }); ··· 83 81 type={type} 84 82 {...stylex.props(inputStyles.field, style)} 85 83 > 86 - {label !== undefined && <Label size={size}>{label}</Label>} 84 + {label !== null && <Label size={size}>{label}</Label>} 87 85 {/* 88 86 This onClick is specifically for mouse users not clicking directly on the input. 89 87 A keyboard user would not encounter the same issue. ··· 93 91 {...stylex.props(inputStyles.wrapper)} 94 92 onClick={() => inputRef.current?.focus()} 95 93 > 96 - {prefix !== undefined && ( 94 + {prefix !== null && ( 97 95 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 98 96 )} 99 97 <Input ··· 101 99 ref={inputRef} 102 100 placeholder={placeholder} 103 101 /> 104 - {suffix !== undefined && ( 102 + {suffix !== null && ( 105 103 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 106 104 )} 107 105 {isPasswordInput && (
+1
packages/hip-ui/src/components/theme/semantic-color.stylex.tsx
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 + 2 3 import { slate, plum } from "./colors.stylex"; 3 4 4 5 // eslint-disable-next-line @stylexjs/enforce-extension
+2 -1
packages/hip-ui/src/components/theme/typography.stylex.tsx
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 + 3 + import { breakpoints } from "./breakpoints.stylex"; 2 4 import { spacing } from "./spacing.stylex"; 3 - import { breakpoints } from "./breakpoints.stylex"; 4 5 5 6 export const fontFamily = stylex.defineVars({ 6 7 sans: "Inter, sans-serif",
+7 -7
packages/hip-ui/src/components/theme/useButtonStyles.ts
··· 1 1 "use client"; 2 2 3 3 import * as stylex from "@stylexjs/stylex"; 4 + import { use } from "react"; 4 5 5 - import { spacing } from "./spacing.stylex"; 6 + import { ButtonGroupContext } from "../button/context"; 7 + import { SizeContext } from "../context"; 8 + import { Size, ButtonVariant } from "../types"; 9 + import { slate } from "./colors.stylex"; 6 10 import { radius } from "./radius.stylex"; 7 11 import { gray, primary } from "./semantic-color.stylex"; 12 + import { shadow } from "./shadow.stylex"; 13 + import { spacing } from "./spacing.stylex"; 8 14 import { 9 15 fontFamily, 10 16 fontSize, 11 17 fontWeight, 12 18 lineHeight, 13 19 } from "./typography.stylex"; 14 - import { shadow } from "./shadow.stylex"; 15 - import { slate } from "./colors.stylex"; 16 - import { use } from "react"; 17 - import { Size, ButtonVariant } from "../types"; 18 - import { ButtonGroupContext } from "../button/context"; 19 - import { SizeContext } from "../context"; 20 20 21 21 const styles = stylex.create({ 22 22 shadow: {
+6 -5
packages/hip-ui/src/components/theme/useInputStyles.ts
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 + import { use } from "react"; 3 + 4 + import { SizeContext } from "../context"; 5 + import { Size } from "../types"; 6 + import { slate } from "./colors.stylex"; 7 + import { radius } from "./radius.stylex"; 2 8 import { gray } from "./semantic-color.stylex"; 3 9 import { spacing } from "./spacing.stylex"; 4 - import { radius } from "./radius.stylex"; 5 10 import { lineHeight, fontSize } from "./typography.stylex"; 6 - import { slate } from "./colors.stylex"; 7 - import { Size } from "../types"; 8 - import { use } from "react"; 9 - import { SizeContext } from "../context"; 10 11 11 12 const styles = stylex.create({ 12 13 field: {
+4 -3
packages/hip-ui/src/components/theme/useListBoxItemStyles.ts
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 - import { spacing } from "../theme/spacing.stylex"; 2 + import { use } from "react"; 3 + 4 + import { SizeContext } from "../context"; 3 5 import { plum, slate } from "../theme/colors.stylex"; 4 6 import { radius } from "../theme/radius.stylex"; 7 + import { spacing } from "../theme/spacing.stylex"; 5 8 import { 6 9 fontSize, 7 10 fontWeight, 8 11 lineHeight, 9 12 typeramp, 10 13 } from "../theme/typography.stylex"; 11 - import { SizeContext } from "../context"; 12 - import { use } from "react"; 13 14 14 15 const styles = stylex.create({ 15 16 item: {
+1 -1
packages/hip-ui/src/components/theme/usePopoverStyles.ts
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 2 3 3 import { radius } from "./radius.stylex"; 4 - import { spacing } from "./spacing.stylex"; 5 4 import { gray } from "./semantic-color.stylex"; 6 5 import { shadow } from "./shadow.stylex"; 6 + import { spacing } from "./spacing.stylex"; 7 7 8 8 const styles = stylex.create({ 9 9 popover: {
+8 -7
packages/hip-ui/src/components/time-field/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 2 + import { useRef } from "react"; 1 3 import { 2 4 TimeFieldProps as AriaTimeFieldProps, 3 5 DateInput, 4 6 DateSegment, 5 7 TimeValue, 6 8 ValidationResult, 9 + FieldError, 10 + TimeField as AriaTimeField, 7 11 } from "react-aria-components"; 8 12 9 - import { FieldError, TimeField as AriaTimeField } from "react-aria-components"; 10 - import * as stylex from "@stylexjs/stylex"; 11 13 import { Description, Label } from "../label"; 12 - import { useRef } from "react"; 14 + import { useInputStyles } from "../theme/useInputStyles"; 13 15 import { Size } from "../types"; 14 - import { useInputStyles } from "../theme/useInputStyles"; 15 16 16 17 export interface TimeFieldProps<T extends TimeValue> 17 18 extends Omit<AriaTimeFieldProps<T>, "style" | "className"> { ··· 39 40 40 41 return ( 41 42 <AriaTimeField {...props} {...stylex.props(inputStyles.field, style)}> 42 - {label !== undefined && <Label size={size}>{label}</Label>} 43 + {label !== null && <Label size={size}>{label}</Label>} 43 44 {/* 44 45 This onClick is specifically for mouse users not clicking directly on the input. 45 46 A keyboard user would not encounter the same issue. ··· 49 50 {...stylex.props(inputStyles.wrapper)} 50 51 onClick={() => inputRef.current?.focus()} 51 52 > 52 - {prefix !== undefined && ( 53 + {prefix !== null && ( 53 54 <div {...stylex.props(inputStyles.addon)}>{prefix}</div> 54 55 )} 55 56 <DateInput {...stylex.props(inputStyles.input)} ref={inputRef}> 56 57 {(segment) => <DateSegment segment={segment} />} 57 58 </DateInput> 58 - {suffix !== undefined && ( 59 + {suffix !== null && ( 59 60 <div {...stylex.props(inputStyles.addon)}>{suffix}</div> 60 61 )} 61 62 </div>
+10 -9
packages/hip-ui/src/components/toggle-button copy/index.tsx
··· 1 - import { ToggleButtonProps as AriaToggleButtonProps } from "react-aria-components"; 2 - import { ToggleButton as AriaToggleButton } from "react-aria-components"; 3 1 import * as stylex from "@stylexjs/stylex"; 2 + import { Children, use } from "react"; 3 + import { 4 + ToggleButtonProps as AriaToggleButtonProps, 5 + ToggleButton as AriaToggleButton, 6 + } from "react-aria-components"; 4 7 5 - import { spacing } from "../theme/spacing.stylex"; 8 + import { SizeContext } from "../context"; 6 9 import { plum, slate } from "../theme/colors.stylex"; 7 - import { Children, use } from "react"; 10 + import { spacing } from "../theme/spacing.stylex"; 8 11 import { useButtonStyles } from "../theme/useButtonStyles"; 9 - import { SizeContext } from "../context"; 10 12 11 13 const styles = stylex.create({ 12 14 primarySelected: { ··· 110 112 buttonStyles, 111 113 styles[size], 112 114 isSelected ? styles[`${variant}Selected`] : undefined, 113 - style 115 + style, 114 116 ); 115 117 116 118 return ( ··· 124 126 {/* eslint-disable-next-line @eslint-react/no-children-map */} 125 127 {Children.map(children, (child, index) => 126 128 typeof child === "string" ? ( 127 - // eslint-disable-next-line @eslint-react/no-array-index-key 128 - <span key={`${child}-${index}`}>{child}</span> 129 + <span key={`${child}-${index.toString()}`}>{child}</span> 129 130 ) : ( 130 131 child 131 - ) 132 + ), 132 133 )} 133 134 </AriaToggleButton> 134 135 );
+4 -3
packages/hip-ui/src/components/toggle-button-group/index.tsx
··· 1 1 "use client"; 2 2 3 + import * as stylex from "@stylexjs/stylex"; 4 + import { use } from "react"; 3 5 import { 4 6 ToggleButtonGroupProps as AriaToggleButtonGroupProps, 5 7 ToggleButtonGroup as AriaToggleButtonGroup, 6 8 } from "react-aria-components"; 7 - import * as stylex from "@stylexjs/stylex"; 9 + 8 10 import { ButtonGroupContext } from "../button/context"; 9 - import { use } from "react"; 10 11 11 12 const styles = stylex.create({ 12 13 group: { ··· 73 74 orientation === "horizontal" && styles.horizontal, 74 75 orientation === "vertical" && styles.vertical, 75 76 ], 76 - style 77 + style, 77 78 )} 78 79 {...props} 79 80 >
+10 -9
packages/hip-ui/src/components/toggle-button/index.tsx
··· 1 - import { ToggleButtonProps as AriaToggleButtonProps } from "react-aria-components"; 2 - import { ToggleButton as AriaToggleButton } from "react-aria-components"; 3 1 import * as stylex from "@stylexjs/stylex"; 2 + import { Children, use } from "react"; 3 + import { 4 + ToggleButtonProps as AriaToggleButtonProps, 5 + ToggleButton as AriaToggleButton, 6 + } from "react-aria-components"; 4 7 5 - import { spacing } from "../theme/spacing.stylex"; 8 + import { SizeContext } from "../context"; 6 9 import { plum, slate } from "../theme/colors.stylex"; 7 - import { Children, use } from "react"; 10 + import { spacing } from "../theme/spacing.stylex"; 8 11 import { useButtonStyles } from "../theme/useButtonStyles"; 9 12 import { ButtonVariant, Size } from "../types"; 10 - import { SizeContext } from "../context"; 11 13 12 14 const styles = stylex.create({ 13 15 primarySelected: { ··· 111 113 buttonStyles, 112 114 styles[size], 113 115 isSelected ? styles[`${variant}Selected`] : undefined, 114 - style 116 + style, 115 117 ); 116 118 117 119 return ( ··· 125 127 {/* eslint-disable-next-line @eslint-react/no-children-map */} 126 128 {Children.map(children, (child, index) => 127 129 typeof child === "string" ? ( 128 - // eslint-disable-next-line @eslint-react/no-array-index-key 129 - <span key={`${child}-${index}`}>{child}</span> 130 + <span key={`${child}-${index.toString()}`}>{child}</span> 130 131 ) : ( 131 132 child 132 - ) 133 + ), 133 134 )} 134 135 </AriaToggleButton> 135 136 );
+4 -4
packages/hip-ui/src/components/tooltip/index.tsx
··· 1 1 "use client"; 2 2 3 + import * as stylex from "@stylexjs/stylex"; 3 4 import { 4 5 OverlayArrow, 5 6 Tooltip as AriaTooltip, ··· 7 8 TooltipTriggerComponentProps, 8 9 TooltipProps as AriaTooltipProps, 9 10 } from "react-aria-components"; 10 - import * as stylex from "@stylexjs/stylex"; 11 11 12 + import { slateInverted } from "../theme/colors.stylex"; 13 + import { radius } from "../theme/radius.stylex"; 14 + import { shadow } from "../theme/shadow.stylex"; 12 15 import { spacing } from "../theme/spacing.stylex"; 13 - import { radius } from "../theme/radius.stylex"; 14 16 import { fontFamily, fontSize, lineHeight } from "../theme/typography.stylex"; 15 - import { shadow } from "../theme/shadow.stylex"; 16 - import { slateInverted } from "../theme/colors.stylex"; 17 17 18 18 const tooltipStyle = stylex.create({ 19 19 content: {
+11 -10
packages/hip-ui/src/components/tree/index.tsx
··· 1 + import * as stylex from "@stylexjs/stylex"; 1 2 import { ChevronRight, GripVertical } from "lucide-react"; 3 + import { use } from "react"; 2 4 import { 3 5 Button, 4 6 Tree as AriaTree, ··· 8 10 TreeItemProps as AriaTreeItemProps, 9 11 TreeItemContentProps as AriaTreeItemContentProps, 10 12 } from "react-aria-components"; 13 + 11 14 import { Checkbox } from "../checkbox"; 12 - import * as stylex from "@stylexjs/stylex"; 13 - import { Size } from "../types"; 14 15 import { SizeContext } from "../context"; 15 - import { useListBoxItemStyles } from "../theme/useListBoxItemStyles"; 16 + import { radius } from "../theme/radius.stylex"; 17 + import { gray } from "../theme/semantic-color.stylex"; 16 18 import { spacing } from "../theme/spacing.stylex"; 17 - import { gray } from "../theme/semantic-color.stylex"; 18 - import { radius } from "../theme/radius.stylex"; 19 - import { use } from "react"; 19 + import { useListBoxItemStyles } from "../theme/useListBoxItemStyles"; 20 + import { Size } from "../types"; 20 21 21 22 const styles = stylex.create({ 22 23 wrapper: { ··· 118 119 styles.chevron, 119 120 gray.textDim, 120 121 listBoxItemStyles.addon, 121 - !hasChildItems && styles.hidden 122 + !hasChildItems && styles.hidden, 122 123 )} 123 124 > 124 125 <ChevronRight size={16} /> 125 126 </Button> 126 127 127 128 <div {...stylex.props(styles.content)}> 128 - {prefix !== undefined && ( 129 + {prefix !== null && ( 129 130 <div {...stylex.props(listBoxItemStyles.addon, styles.addon)}> 130 131 {prefix} 131 132 </div> 132 133 )} 133 134 <div {...stylex.props(listBoxItemStyles.label)}>{children}</div> 134 - {suffix !== undefined && ( 135 + {suffix !== null && ( 135 136 <div {...stylex.props(listBoxItemStyles.addon, styles.addon)}> 136 137 {suffix} 137 138 </div> ··· 169 170 listBoxItemStyles.wrapper, 170 171 styles.wrapper, 171 172 styles.itemInner, 172 - style 173 + style, 173 174 )} 174 175 > 175 176 <TreeItemContent prefix={prefix} suffix={suffix}>
+9 -8
packages/hip-ui/src/components/typography/index.tsx
··· 1 1 import * as stylex from "@stylexjs/stylex"; 2 + import { useMemo } from "react"; 3 + 4 + import { LinkContext } from "../link/link-context"; 5 + import { radius } from "../theme/radius.stylex"; 6 + import { gray } from "../theme/semantic-color.stylex"; 7 + import { spacing } from "../theme/spacing.stylex"; 2 8 import { 3 9 fontFamily, 4 10 fontSize, 5 11 lineHeight, 6 12 typeramp, 7 13 } from "../theme/typography.stylex"; 8 - import { gray } from "../theme/semantic-color.stylex"; 9 - import { spacing } from "../theme/spacing.stylex"; 10 - import { radius } from "../theme/radius.stylex"; 11 - import { useMemo } from "react"; 12 - import { LinkContext } from "../link"; 13 14 14 15 const styles = stylex.create({ 15 16 blockquote: { ··· 121 122 {...stylex.props( 122 123 typeramp.smallBody, 123 124 variant === "secondary" && gray.textDim, 124 - style 125 + style, 125 126 )} 126 127 {...props} 127 128 /> ··· 143 144 () => ({ 144 145 style: [variant === "secondary" && gray.textDim, styles.underline], 145 146 }), 146 - [variant] 147 + [variant], 147 148 ); 148 149 149 150 return ( ··· 152 153 {...stylex.props( 153 154 typeramp.sublabel, 154 155 variant === "secondary" && gray.textDim, 155 - style 156 + style, 156 157 )} 157 158 {...props} 158 159 />
+1
packages/hip-ui/src/components/typography/typography-config.ts
··· 9 9 "../theme/semantic-color.stylex.tsx", 10 10 "../theme/spacing.stylex.tsx", 11 11 "../theme/typography.stylex.tsx", 12 + "../link/link-context.ts", 12 13 ], 13 14 };
+538 -7
pnpm-lock.yaml
··· 90 90 91 91 packages/eslint-config: 92 92 dependencies: 93 + '@eslint-community/eslint-plugin-eslint-comments': 94 + specifier: ^4.5.0 95 + version: 4.5.0(eslint@9.34.0(jiti@2.6.1)) 93 96 '@eslint-react/eslint-plugin': 94 97 specifier: ^2.2.2 95 98 version: 2.2.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) 96 99 '@stylexjs/eslint-plugin': 97 100 specifier: ^0.16.2 98 101 version: 0.16.2 102 + eslint-config-flat-gitignore: 103 + specifier: ^2.1.0 104 + version: 2.1.0(eslint@9.34.0(jiti@2.6.1)) 105 + eslint-import-resolver-typescript: 106 + specifier: ^4.4.4 107 + version: 4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)))(eslint@9.34.0(jiti@2.6.1)) 108 + eslint-plugin-import-x: 109 + specifier: ^4.16.1 110 + version: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)) 99 111 eslint-plugin-jsx-a11y: 100 112 specifier: ^6.10.2 101 113 version: 6.10.2(eslint@9.34.0(jiti@2.6.1)) 114 + eslint-plugin-perfectionist: 115 + specifier: ^4.15.1 116 + version: 4.15.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) 117 + eslint-plugin-react-refresh: 118 + specifier: ^0.4.24 119 + version: 0.4.24(eslint@9.34.0(jiti@2.6.1)) 120 + eslint-plugin-unicorn: 121 + specifier: ^61.0.2 122 + version: 61.0.2(eslint@9.34.0(jiti@2.6.1)) 102 123 devDependencies: 103 124 '@eslint/js': 104 125 specifier: ^9.34.0 ··· 112 133 eslint-config-prettier: 113 134 specifier: ^10.1.1 114 135 version: 10.1.1(eslint@9.34.0(jiti@2.6.1)) 115 - eslint-plugin-only-warn: 116 - specifier: ^1.1.0 117 - version: 1.1.0 118 136 eslint-plugin-react: 119 137 specifier: ^7.37.5 120 138 version: 7.37.5(eslint@9.34.0(jiti@2.6.1)) ··· 318 336 '@dual-bundle/import-meta-resolve@4.2.1': 319 337 resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} 320 338 339 + '@emnapi/core@1.5.0': 340 + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} 341 + 342 + '@emnapi/runtime@1.5.0': 343 + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} 344 + 345 + '@emnapi/wasi-threads@1.1.0': 346 + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} 347 + 321 348 '@esbuild/aix-ppc64@0.25.10': 322 349 resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} 323 350 engines: {node: '>=18'} ··· 474 501 cpu: [x64] 475 502 os: [win32] 476 503 504 + '@eslint-community/eslint-plugin-eslint-comments@4.5.0': 505 + resolution: {integrity: sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==} 506 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 507 + peerDependencies: 508 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 509 + 477 510 '@eslint-community/eslint-utils@4.7.0': 478 511 resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 479 512 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} ··· 511 544 resolution: {integrity: sha512-psNsMfCypVaTnBDJyUFtpYb2+02mQ4lHiXN0kdnanAAXKJcDORH/1tw6k4xmv2qJ076kZtblIbhulN75RlJhmg==} 512 545 engines: {node: '>=20.19.0'} 513 546 547 + '@eslint/compat@1.4.0': 548 + resolution: {integrity: sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==} 549 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 550 + peerDependencies: 551 + eslint: ^8.40 || 9 552 + peerDependenciesMeta: 553 + eslint: 554 + optional: true 555 + 514 556 '@eslint/config-array@0.21.0': 515 557 resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 516 558 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} ··· 521 563 522 564 '@eslint/core@0.15.2': 523 565 resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} 566 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 567 + 568 + '@eslint/core@0.16.0': 569 + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} 524 570 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 525 571 526 572 '@eslint/eslintrc@3.3.1': ··· 624 670 625 671 '@jridgewell/trace-mapping@0.3.31': 626 672 resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 673 + 674 + '@napi-rs/wasm-runtime@0.2.12': 675 + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} 627 676 628 677 '@next/eslint-plugin-next@15.5.0': 629 678 resolution: {integrity: sha512-+k83U/fST66eQBjTltX2T9qUYd43ntAe+NZ5qeZVTQyTiFiHvTLtkpLKug4AnZAtuI/lwz5tl/4QDJymjVkybg==} ··· 1442 1491 '@swc/types@0.1.25': 1443 1492 resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} 1444 1493 1494 + '@tybys/wasm-util@0.10.1': 1495 + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} 1496 + 1445 1497 '@types/babel__core@7.20.5': 1446 1498 resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 1447 1499 ··· 1595 1647 resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} 1596 1648 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1597 1649 1650 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': 1651 + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} 1652 + cpu: [arm] 1653 + os: [android] 1654 + 1655 + '@unrs/resolver-binding-android-arm64@1.11.1': 1656 + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} 1657 + cpu: [arm64] 1658 + os: [android] 1659 + 1660 + '@unrs/resolver-binding-darwin-arm64@1.11.1': 1661 + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} 1662 + cpu: [arm64] 1663 + os: [darwin] 1664 + 1665 + '@unrs/resolver-binding-darwin-x64@1.11.1': 1666 + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} 1667 + cpu: [x64] 1668 + os: [darwin] 1669 + 1670 + '@unrs/resolver-binding-freebsd-x64@1.11.1': 1671 + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} 1672 + cpu: [x64] 1673 + os: [freebsd] 1674 + 1675 + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': 1676 + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} 1677 + cpu: [arm] 1678 + os: [linux] 1679 + 1680 + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': 1681 + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} 1682 + cpu: [arm] 1683 + os: [linux] 1684 + 1685 + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': 1686 + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} 1687 + cpu: [arm64] 1688 + os: [linux] 1689 + 1690 + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': 1691 + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} 1692 + cpu: [arm64] 1693 + os: [linux] 1694 + 1695 + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': 1696 + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} 1697 + cpu: [ppc64] 1698 + os: [linux] 1699 + 1700 + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': 1701 + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} 1702 + cpu: [riscv64] 1703 + os: [linux] 1704 + 1705 + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': 1706 + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} 1707 + cpu: [riscv64] 1708 + os: [linux] 1709 + 1710 + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': 1711 + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} 1712 + cpu: [s390x] 1713 + os: [linux] 1714 + 1715 + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': 1716 + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} 1717 + cpu: [x64] 1718 + os: [linux] 1719 + 1720 + '@unrs/resolver-binding-linux-x64-musl@1.11.1': 1721 + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} 1722 + cpu: [x64] 1723 + os: [linux] 1724 + 1725 + '@unrs/resolver-binding-wasm32-wasi@1.11.1': 1726 + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} 1727 + engines: {node: '>=14.0.0'} 1728 + cpu: [wasm32] 1729 + 1730 + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': 1731 + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} 1732 + cpu: [arm64] 1733 + os: [win32] 1734 + 1735 + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': 1736 + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} 1737 + cpu: [ia32] 1738 + os: [win32] 1739 + 1740 + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': 1741 + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} 1742 + cpu: [x64] 1743 + os: [win32] 1744 + 1598 1745 '@vitejs/plugin-react@5.0.2': 1599 1746 resolution: {integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==} 1600 1747 engines: {node: ^20.19.0 || >=22.12.0} ··· 1861 2008 buffer-from@1.1.2: 1862 2009 resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1863 2010 2011 + builtin-modules@5.0.0: 2012 + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} 2013 + engines: {node: '>=18.20'} 2014 + 1864 2015 cac@6.7.14: 1865 2016 resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1866 2017 engines: {node: '>=8'} ··· 1900 2051 resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} 1901 2052 engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1902 2053 2054 + change-case@5.4.4: 2055 + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} 2056 + 1903 2057 check-error@2.1.1: 1904 2058 resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1905 2059 engines: {node: '>= 16'} ··· 1908 2062 resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} 1909 2063 engines: {node: '>=6.0'} 1910 2064 2065 + ci-info@4.3.1: 2066 + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} 2067 + engines: {node: '>=8'} 2068 + 2069 + clean-regexp@1.0.0: 2070 + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} 2071 + engines: {node: '>=4'} 2072 + 1911 2073 cli-boxes@3.0.0: 1912 2074 resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} 1913 2075 engines: {node: '>=10'} ··· 1962 2124 commander@2.20.3: 1963 2125 resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 1964 2126 2127 + comment-parser@1.4.1: 2128 + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} 2129 + engines: {node: '>= 12.0.0'} 2130 + 1965 2131 compare-versions@6.1.1: 1966 2132 resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} 1967 2133 ··· 1974 2140 convert-to-spaces@2.0.1: 1975 2141 resolution: {integrity: sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==} 1976 2142 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2143 + 2144 + core-js-compat@3.46.0: 2145 + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} 1977 2146 1978 2147 cross-spawn@7.0.6: 1979 2148 resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} ··· 2146 2315 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 2147 2316 engines: {node: '>=10'} 2148 2317 2318 + eslint-config-flat-gitignore@2.1.0: 2319 + resolution: {integrity: sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==} 2320 + peerDependencies: 2321 + eslint: ^9.5.0 2322 + 2149 2323 eslint-config-prettier@10.1.1: 2150 2324 resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} 2151 2325 hasBin: true 2152 2326 peerDependencies: 2153 2327 eslint: '>=7.0.0' 2154 2328 2329 + eslint-import-context@0.1.9: 2330 + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} 2331 + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 2332 + peerDependencies: 2333 + unrs-resolver: ^1.0.0 2334 + peerDependenciesMeta: 2335 + unrs-resolver: 2336 + optional: true 2337 + 2338 + eslint-import-resolver-typescript@4.4.4: 2339 + resolution: {integrity: sha512-1iM2zeBvrYmUNTj2vSC/90JTHDth+dfOfiNKkxApWRsTJYNrc8rOdxxIf5vazX+BiAXTeOT0UvWpGI/7qIWQOw==} 2340 + engines: {node: ^16.17.0 || >=18.6.0} 2341 + peerDependencies: 2342 + eslint: '*' 2343 + eslint-plugin-import: '*' 2344 + eslint-plugin-import-x: '*' 2345 + peerDependenciesMeta: 2346 + eslint-plugin-import: 2347 + optional: true 2348 + eslint-plugin-import-x: 2349 + optional: true 2350 + 2351 + eslint-plugin-import-x@4.16.1: 2352 + resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==} 2353 + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 2354 + peerDependencies: 2355 + '@typescript-eslint/utils': ^8.0.0 2356 + eslint: ^8.57.0 || ^9.0.0 2357 + eslint-import-resolver-node: '*' 2358 + peerDependenciesMeta: 2359 + '@typescript-eslint/utils': 2360 + optional: true 2361 + eslint-import-resolver-node: 2362 + optional: true 2363 + 2155 2364 eslint-plugin-jsx-a11y@6.10.2: 2156 2365 resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} 2157 2366 engines: {node: '>=4.0'} 2158 2367 peerDependencies: 2159 2368 eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 2160 2369 2161 - eslint-plugin-only-warn@1.1.0: 2162 - resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} 2163 - engines: {node: '>=6'} 2370 + eslint-plugin-perfectionist@4.15.1: 2371 + resolution: {integrity: sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==} 2372 + engines: {node: ^18.0.0 || >=20.0.0} 2373 + peerDependencies: 2374 + eslint: '>=8.45.0' 2164 2375 2165 2376 eslint-plugin-react-dom@2.2.2: 2166 2377 resolution: {integrity: sha512-0M46zRkB6b4RFLOVYMwrKP/bN0fHTTt+En4k/oDel4iu3cFJtRuEy8+YjtFcf2ab+BS7MJzF1kL0Ye7oA6WcEA==} ··· 2189 2400 eslint: ^9.37.0 2190 2401 typescript: ^5.9.3 2191 2402 2403 + eslint-plugin-react-refresh@0.4.24: 2404 + resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} 2405 + peerDependencies: 2406 + eslint: '>=8.40' 2407 + 2192 2408 eslint-plugin-react-web-api@2.2.2: 2193 2409 resolution: {integrity: sha512-EruXKY21IbDf8r/yV99WGQ7WgS9oSYy7RPZ9SNaZe5NCfJ2ce8L5nB9rRYzpVqSxvmEyajlgogfB0REdYr6D2Q==} 2194 2410 engines: {node: '>=20.19.0'} ··· 2215 2431 eslint: '>6.6.0' 2216 2432 turbo: '>2.0.0' 2217 2433 2434 + eslint-plugin-unicorn@61.0.2: 2435 + resolution: {integrity: sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==} 2436 + engines: {node: ^20.10.0 || >=21.0.0} 2437 + peerDependencies: 2438 + eslint: '>=9.29.0' 2439 + 2218 2440 eslint-scope@5.1.1: 2219 2441 resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 2220 2442 engines: {node: '>=8.0.0'} ··· 2327 2549 resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} 2328 2550 engines: {node: '>=4.0.0'} 2329 2551 2552 + find-up-simple@1.0.1: 2553 + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} 2554 + engines: {node: '>=18'} 2555 + 2330 2556 find-up@5.0.0: 2331 2557 resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 2332 2558 engines: {node: '>=10'} ··· 2381 2607 resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 2382 2608 engines: {node: '>= 0.4'} 2383 2609 2610 + get-tsconfig@4.12.0: 2611 + resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} 2612 + 2384 2613 glob-parent@5.1.2: 2385 2614 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 2386 2615 engines: {node: '>= 6'} ··· 2523 2752 is-boolean-object@1.2.2: 2524 2753 resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} 2525 2754 engines: {node: '>= 0.4'} 2755 + 2756 + is-builtin-module@5.0.0: 2757 + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} 2758 + engines: {node: '>=18.20'} 2759 + 2760 + is-bun-module@2.0.0: 2761 + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} 2526 2762 2527 2763 is-callable@1.2.7: 2528 2764 resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} ··· 2685 2921 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2686 2922 hasBin: true 2687 2923 2924 + jsesc@3.0.2: 2925 + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 2926 + engines: {node: '>=6'} 2927 + hasBin: true 2928 + 2688 2929 jsesc@3.1.0: 2689 2930 resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 2690 2931 engines: {node: '>=6'} ··· 2891 3132 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2892 3133 hasBin: true 2893 3134 3135 + napi-postinstall@0.3.4: 3136 + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} 3137 + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 3138 + hasBin: true 3139 + 2894 3140 natural-compare@1.4.0: 2895 3141 resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 3142 + 3143 + natural-orderby@5.0.0: 3144 + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} 3145 + engines: {node: '>=18'} 2896 3146 2897 3147 neo-async@2.6.2: 2898 3148 resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} ··· 2995 3245 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 2996 3246 engines: {node: '>=12'} 2997 3247 3248 + pluralize@8.0.0: 3249 + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} 3250 + engines: {node: '>=4'} 3251 + 2998 3252 possible-typed-array-names@1.1.0: 2999 3253 resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} 3000 3254 engines: {node: '>= 0.4'} ··· 3083 3337 resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 3084 3338 engines: {node: '>= 0.4'} 3085 3339 3340 + regexp-tree@0.1.27: 3341 + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} 3342 + hasBin: true 3343 + 3086 3344 regexp.prototype.flags@1.5.4: 3087 3345 resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 3088 3346 engines: {node: '>= 0.4'} 3089 3347 3348 + regjsparser@0.12.0: 3349 + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} 3350 + hasBin: true 3351 + 3090 3352 remove-markdown@0.3.0: 3091 3353 resolution: {integrity: sha512-5392eIuy1mhjM74739VunOlsOYKjsH82rQcTBlJ1bkICVC3dQ3ksQzTHh4jGHQFnM+1xzLzcFOMH+BofqXhroQ==} 3092 3354 ··· 3101 3363 resolve-from@4.0.0: 3102 3364 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 3103 3365 engines: {node: '>=4'} 3366 + 3367 + resolve-pkg-maps@1.0.0: 3368 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 3104 3369 3105 3370 resolve@2.0.0-next.5: 3106 3371 resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} ··· 3233 3498 resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 3234 3499 engines: {node: '>=0.10.0'} 3235 3500 3501 + stable-hash-x@0.2.0: 3502 + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} 3503 + engines: {node: '>=12.0.0'} 3504 + 3236 3505 stack-utils@2.0.6: 3237 3506 resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 3238 3507 engines: {node: '>=10'} ··· 3293 3562 resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 3294 3563 engines: {node: '>=12'} 3295 3564 3565 + strip-indent@4.1.1: 3566 + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} 3567 + engines: {node: '>=12'} 3568 + 3296 3569 strip-json-comments@3.1.1: 3297 3570 resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3298 3571 engines: {node: '>=8'} ··· 3498 3771 unplugin@1.16.1: 3499 3772 resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} 3500 3773 engines: {node: '>=14.0.0'} 3774 + 3775 + unrs-resolver@1.11.1: 3776 + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} 3501 3777 3502 3778 update-browserslist-db@1.1.3: 3503 3779 resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} ··· 3849 4125 3850 4126 '@dual-bundle/import-meta-resolve@4.2.1': {} 3851 4127 4128 + '@emnapi/core@1.5.0': 4129 + dependencies: 4130 + '@emnapi/wasi-threads': 1.1.0 4131 + tslib: 2.8.1 4132 + optional: true 4133 + 4134 + '@emnapi/runtime@1.5.0': 4135 + dependencies: 4136 + tslib: 2.8.1 4137 + optional: true 4138 + 4139 + '@emnapi/wasi-threads@1.1.0': 4140 + dependencies: 4141 + tslib: 2.8.1 4142 + optional: true 4143 + 3852 4144 '@esbuild/aix-ppc64@0.25.10': 3853 4145 optional: true 3854 4146 ··· 3927 4219 '@esbuild/win32-x64@0.25.10': 3928 4220 optional: true 3929 4221 4222 + '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.34.0(jiti@2.6.1))': 4223 + dependencies: 4224 + escape-string-regexp: 4.0.0 4225 + eslint: 9.34.0(jiti@2.6.1) 4226 + ignore: 5.3.2 4227 + 3930 4228 '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.6.1))': 3931 4229 dependencies: 3932 4230 eslint: 9.34.0(jiti@2.6.1) ··· 4007 4305 - supports-color 4008 4306 - typescript 4009 4307 4308 + '@eslint/compat@1.4.0(eslint@9.34.0(jiti@2.6.1))': 4309 + dependencies: 4310 + '@eslint/core': 0.16.0 4311 + optionalDependencies: 4312 + eslint: 9.34.0(jiti@2.6.1) 4313 + 4010 4314 '@eslint/config-array@0.21.0': 4011 4315 dependencies: 4012 4316 '@eslint/object-schema': 2.1.6 ··· 4018 4322 '@eslint/config-helpers@0.3.1': {} 4019 4323 4020 4324 '@eslint/core@0.15.2': 4325 + dependencies: 4326 + '@types/json-schema': 7.0.15 4327 + 4328 + '@eslint/core@0.16.0': 4021 4329 dependencies: 4022 4330 '@types/json-schema': 7.0.15 4023 4331 ··· 4146 4454 dependencies: 4147 4455 '@jridgewell/resolve-uri': 3.1.2 4148 4456 '@jridgewell/sourcemap-codec': 1.5.5 4457 + 4458 + '@napi-rs/wasm-runtime@0.2.12': 4459 + dependencies: 4460 + '@emnapi/core': 1.5.0 4461 + '@emnapi/runtime': 1.5.0 4462 + '@tybys/wasm-util': 0.10.1 4463 + optional: true 4149 4464 4150 4465 '@next/eslint-plugin-next@15.5.0': 4151 4466 dependencies: ··· 5366 5681 dependencies: 5367 5682 '@swc/counter': 0.1.3 5368 5683 5684 + '@tybys/wasm-util@0.10.1': 5685 + dependencies: 5686 + tslib: 2.8.1 5687 + optional: true 5688 + 5369 5689 '@types/babel__core@7.20.5': 5370 5690 dependencies: 5371 5691 '@babel/parser': 7.28.4 ··· 5584 5904 '@typescript-eslint/types': 8.46.1 5585 5905 eslint-visitor-keys: 4.2.1 5586 5906 5907 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': 5908 + optional: true 5909 + 5910 + '@unrs/resolver-binding-android-arm64@1.11.1': 5911 + optional: true 5912 + 5913 + '@unrs/resolver-binding-darwin-arm64@1.11.1': 5914 + optional: true 5915 + 5916 + '@unrs/resolver-binding-darwin-x64@1.11.1': 5917 + optional: true 5918 + 5919 + '@unrs/resolver-binding-freebsd-x64@1.11.1': 5920 + optional: true 5921 + 5922 + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': 5923 + optional: true 5924 + 5925 + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': 5926 + optional: true 5927 + 5928 + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': 5929 + optional: true 5930 + 5931 + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': 5932 + optional: true 5933 + 5934 + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': 5935 + optional: true 5936 + 5937 + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': 5938 + optional: true 5939 + 5940 + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': 5941 + optional: true 5942 + 5943 + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': 5944 + optional: true 5945 + 5946 + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': 5947 + optional: true 5948 + 5949 + '@unrs/resolver-binding-linux-x64-musl@1.11.1': 5950 + optional: true 5951 + 5952 + '@unrs/resolver-binding-wasm32-wasi@1.11.1': 5953 + dependencies: 5954 + '@napi-rs/wasm-runtime': 0.2.12 5955 + optional: true 5956 + 5957 + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': 5958 + optional: true 5959 + 5960 + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': 5961 + optional: true 5962 + 5963 + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': 5964 + optional: true 5965 + 5587 5966 '@vitejs/plugin-react@5.0.2(vite@7.1.5(@types/node@24.7.2)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.0))': 5588 5967 dependencies: 5589 5968 '@babel/core': 7.28.4 ··· 5921 6300 5922 6301 buffer-from@1.1.2: {} 5923 6302 6303 + builtin-modules@5.0.0: {} 6304 + 5924 6305 cac@6.7.14: {} 5925 6306 5926 6307 call-bind-apply-helpers@1.0.2: ··· 5965 6346 5966 6347 chalk@5.6.2: {} 5967 6348 6349 + change-case@5.4.4: {} 6350 + 5968 6351 check-error@2.1.1: {} 5969 6352 5970 6353 chrome-trace-event@1.0.4: {} 5971 6354 6355 + ci-info@4.3.1: {} 6356 + 6357 + clean-regexp@1.0.0: 6358 + dependencies: 6359 + escape-string-regexp: 1.0.5 6360 + 5972 6361 cli-boxes@3.0.0: {} 5973 6362 5974 6363 cli-cursor@4.0.0: ··· 6029 6418 6030 6419 commander@2.20.3: {} 6031 6420 6421 + comment-parser@1.4.1: {} 6422 + 6032 6423 compare-versions@6.1.1: {} 6033 6424 6034 6425 concat-map@0.0.1: {} ··· 6036 6427 convert-source-map@2.0.0: {} 6037 6428 6038 6429 convert-to-spaces@2.0.1: {} 6430 + 6431 + core-js-compat@3.46.0: 6432 + dependencies: 6433 + browserslist: 4.26.3 6039 6434 6040 6435 cross-spawn@7.0.6: 6041 6436 dependencies: ··· 6286 6681 6287 6682 escape-string-regexp@4.0.0: {} 6288 6683 6684 + eslint-config-flat-gitignore@2.1.0(eslint@9.34.0(jiti@2.6.1)): 6685 + dependencies: 6686 + '@eslint/compat': 1.4.0(eslint@9.34.0(jiti@2.6.1)) 6687 + eslint: 9.34.0(jiti@2.6.1) 6688 + 6289 6689 eslint-config-prettier@10.1.1(eslint@9.34.0(jiti@2.6.1)): 6290 6690 dependencies: 6291 6691 eslint: 9.34.0(jiti@2.6.1) 6292 6692 6693 + eslint-import-context@0.1.9(unrs-resolver@1.11.1): 6694 + dependencies: 6695 + get-tsconfig: 4.12.0 6696 + stable-hash-x: 0.2.0 6697 + optionalDependencies: 6698 + unrs-resolver: 1.11.1 6699 + 6700 + eslint-import-resolver-typescript@4.4.4(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)))(eslint@9.34.0(jiti@2.6.1)): 6701 + dependencies: 6702 + debug: 4.4.1 6703 + eslint: 9.34.0(jiti@2.6.1) 6704 + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) 6705 + get-tsconfig: 4.12.0 6706 + is-bun-module: 2.0.0 6707 + stable-hash-x: 0.2.0 6708 + tinyglobby: 0.2.15 6709 + unrs-resolver: 1.11.1 6710 + optionalDependencies: 6711 + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)) 6712 + transitivePeerDependencies: 6713 + - supports-color 6714 + 6715 + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.6.1)): 6716 + dependencies: 6717 + '@typescript-eslint/types': 8.46.1 6718 + comment-parser: 1.4.1 6719 + debug: 4.4.1 6720 + eslint: 9.34.0(jiti@2.6.1) 6721 + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) 6722 + is-glob: 4.0.3 6723 + minimatch: 9.0.5 6724 + semver: 7.7.2 6725 + stable-hash-x: 0.2.0 6726 + unrs-resolver: 1.11.1 6727 + optionalDependencies: 6728 + '@typescript-eslint/utils': 8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) 6729 + transitivePeerDependencies: 6730 + - supports-color 6731 + 6293 6732 eslint-plugin-jsx-a11y@6.10.2(eslint@9.34.0(jiti@2.6.1)): 6294 6733 dependencies: 6295 6734 aria-query: 5.3.2 ··· 6309 6748 safe-regex-test: 1.1.0 6310 6749 string.prototype.includes: 2.0.1 6311 6750 6312 - eslint-plugin-only-warn@1.1.0: {} 6751 + eslint-plugin-perfectionist@4.15.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): 6752 + dependencies: 6753 + '@typescript-eslint/types': 8.46.1 6754 + '@typescript-eslint/utils': 8.46.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2) 6755 + eslint: 9.34.0(jiti@2.6.1) 6756 + natural-orderby: 5.0.0 6757 + transitivePeerDependencies: 6758 + - supports-color 6759 + - typescript 6313 6760 6314 6761 eslint-plugin-react-dom@2.2.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): 6315 6762 dependencies: ··· 6368 6815 typescript: 5.9.2 6369 6816 transitivePeerDependencies: 6370 6817 - supports-color 6818 + 6819 + eslint-plugin-react-refresh@0.4.24(eslint@9.34.0(jiti@2.6.1)): 6820 + dependencies: 6821 + eslint: 9.34.0(jiti@2.6.1) 6371 6822 6372 6823 eslint-plugin-react-web-api@2.2.2(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.2): 6373 6824 dependencies: ··· 6435 6886 eslint: 9.34.0(jiti@2.6.1) 6436 6887 turbo: 2.5.8 6437 6888 6889 + eslint-plugin-unicorn@61.0.2(eslint@9.34.0(jiti@2.6.1)): 6890 + dependencies: 6891 + '@babel/helper-validator-identifier': 7.27.1 6892 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) 6893 + '@eslint/plugin-kit': 0.3.5 6894 + change-case: 5.4.4 6895 + ci-info: 4.3.1 6896 + clean-regexp: 1.0.0 6897 + core-js-compat: 3.46.0 6898 + eslint: 9.34.0(jiti@2.6.1) 6899 + esquery: 1.6.0 6900 + find-up-simple: 1.0.1 6901 + globals: 16.3.0 6902 + indent-string: 5.0.0 6903 + is-builtin-module: 5.0.0 6904 + jsesc: 3.1.0 6905 + pluralize: 8.0.0 6906 + regexp-tree: 0.1.27 6907 + regjsparser: 0.12.0 6908 + semver: 7.7.2 6909 + strip-indent: 4.1.1 6910 + 6438 6911 eslint-scope@5.1.1: 6439 6912 dependencies: 6440 6913 esrecurse: 4.3.0 ··· 6569 7042 dependencies: 6570 7043 array-back: 3.1.0 6571 7044 7045 + find-up-simple@1.0.1: {} 7046 + 6572 7047 find-up@5.0.0: 6573 7048 dependencies: 6574 7049 locate-path: 6.0.0 ··· 6634 7109 es-errors: 1.3.0 6635 7110 get-intrinsic: 1.3.0 6636 7111 7112 + get-tsconfig@4.12.0: 7113 + dependencies: 7114 + resolve-pkg-maps: 1.0.0 7115 + 6637 7116 glob-parent@5.1.2: 6638 7117 dependencies: 6639 7118 is-glob: 4.0.3 ··· 6787 7266 call-bound: 1.0.4 6788 7267 has-tostringtag: 1.0.2 6789 7268 7269 + is-builtin-module@5.0.0: 7270 + dependencies: 7271 + builtin-modules: 5.0.0 7272 + 7273 + is-bun-module@2.0.0: 7274 + dependencies: 7275 + semver: 7.7.2 7276 + 6790 7277 is-callable@1.2.7: {} 6791 7278 6792 7279 is-core-module@2.16.1: ··· 6953 7440 js-yaml@4.1.0: 6954 7441 dependencies: 6955 7442 argparse: 2.0.1 7443 + 7444 + jsesc@3.0.2: {} 6956 7445 6957 7446 jsesc@3.1.0: {} 6958 7447 ··· 7115 7604 7116 7605 nanoid@3.3.11: {} 7117 7606 7607 + napi-postinstall@0.3.4: {} 7608 + 7118 7609 natural-compare@1.4.0: {} 7610 + 7611 + natural-orderby@5.0.0: {} 7119 7612 7120 7613 neo-async@2.6.2: {} 7121 7614 ··· 7218 7711 picomatch@2.3.1: {} 7219 7712 7220 7713 picomatch@4.0.3: {} 7714 + 7715 + pluralize@8.0.0: {} 7221 7716 7222 7717 possible-typed-array-names@1.1.0: {} 7223 7718 ··· 7395 7890 get-intrinsic: 1.3.0 7396 7891 get-proto: 1.0.1 7397 7892 which-builtin-type: 1.2.1 7893 + 7894 + regexp-tree@0.1.27: {} 7398 7895 7399 7896 regexp.prototype.flags@1.5.4: 7400 7897 dependencies: ··· 7405 7902 gopd: 1.2.0 7406 7903 set-function-name: 2.0.2 7407 7904 7905 + regjsparser@0.12.0: 7906 + dependencies: 7907 + jsesc: 3.0.2 7908 + 7408 7909 remove-markdown@0.3.0: {} 7409 7910 7410 7911 repeat-element@1.1.4: {} ··· 7412 7913 require-from-string@2.0.2: {} 7413 7914 7414 7915 resolve-from@4.0.0: {} 7916 + 7917 + resolve-pkg-maps@1.0.0: {} 7415 7918 7416 7919 resolve@2.0.0-next.5: 7417 7920 dependencies: ··· 7585 8088 7586 8089 source-map@0.6.1: {} 7587 8090 8091 + stable-hash-x@0.2.0: {} 8092 + 7588 8093 stack-utils@2.0.6: 7589 8094 dependencies: 7590 8095 escape-string-regexp: 2.0.0 ··· 7676 8181 dependencies: 7677 8182 ansi-regex: 6.2.2 7678 8183 8184 + strip-indent@4.1.1: {} 8185 + 7679 8186 strip-json-comments@3.1.1: {} 7680 8187 7681 8188 strip-literal@3.1.0: ··· 7881 8388 dependencies: 7882 8389 acorn: 8.15.0 7883 8390 webpack-virtual-modules: 0.6.2 8391 + 8392 + unrs-resolver@1.11.1: 8393 + dependencies: 8394 + napi-postinstall: 0.3.4 8395 + optionalDependencies: 8396 + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 8397 + '@unrs/resolver-binding-android-arm64': 1.11.1 8398 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 8399 + '@unrs/resolver-binding-darwin-x64': 1.11.1 8400 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 8401 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 8402 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 8403 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 8404 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 8405 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 8406 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 8407 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 8408 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 8409 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 8410 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 8411 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 8412 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 8413 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 8414 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 7884 8415 7885 8416 update-browserslist-db@1.1.3(browserslist@4.26.3): 7886 8417 dependencies: