Repository: mondaycom/vibe Branch: master Commit: 3c078dc65eb5 Files: 2520 Total size: 6.6 MB Directory structure: gitextract_zqgb6goh/ ├── .claude/ │ └── skills/ │ └── vibe-breaking-change/ │ ├── SKILL.md │ └── references/ │ ├── codemod-best-practices.md │ ├── codemod-examples.md │ ├── dependency-analysis.md │ ├── pr-templates.md │ ├── testing-validation.md │ └── workflow-checklist.md ├── .cursor/ │ ├── rules/ │ │ ├── accessibility-guidelines.mdc │ │ ├── base-components.mdc │ │ ├── ci-cd-workflows.mdc │ │ ├── component-internal-structure.mdc │ │ ├── dependency-management.mdc │ │ ├── file-structures.mdc │ │ ├── layout-components.mdc │ │ ├── monorepo-structure.mdc │ │ ├── naming-conventions.mdc │ │ ├── new-component-implementation.mdc │ │ ├── package-separation.mdc │ │ ├── playground-reproduce.mdc │ │ ├── react-context.mdc │ │ ├── storybook-stories.mdc │ │ └── styling-conventions.mdc │ └── templates/ │ └── package-separation/ │ ├── QUICK_REFERENCE.md │ ├── README.md │ ├── files.d.ts │ ├── main-index.ts │ ├── package.json │ ├── rollup.config.mjs │ ├── subdirectory-index.ts │ ├── tsconfig.json │ ├── vitest.config.mjs │ └── vitest.setup.mjs ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ └── config.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── actions/ │ │ ├── check-changed-packages/ │ │ │ └── action.yml │ │ ├── determine-lerna-since-flag/ │ │ │ └── action.yml │ │ ├── download-builds/ │ │ │ └── action.yml │ │ ├── git-creds/ │ │ │ └── action.yml │ │ └── setup/ │ │ └── action.yml │ └── workflows/ │ ├── build-and-upload.yml │ ├── bundle-size.yml │ ├── chromatic.yml │ ├── merge-queue.yml │ ├── performance.yml │ ├── pr.yml │ ├── prerelease.yml │ ├── publish-storybook.yml │ ├── release-v2.yml │ ├── release.yml │ └── test.yml ├── .gitignore ├── .nvmrc ├── .prettierrc ├── CLAUDE.md ├── CNAME ├── CONTRIBUTING.md ├── README.md ├── lerna.json ├── package.json ├── packages/ │ ├── base/ │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── rollup.config.mjs │ │ ├── src/ │ │ │ ├── BaseInput/ │ │ │ │ ├── BaseInput.module.scss │ │ │ │ ├── BaseInput.tsx │ │ │ │ ├── BaseInput.types.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ └── BaseInput.test.tsx │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── types/ │ │ │ └── files.d.ts │ │ ├── tsconfig.json │ │ ├── vitest.config.mjs │ │ └── vitest.setup.mjs │ ├── codemod/ │ │ ├── .eslintrc.json │ │ ├── .prettierignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── bin/ │ │ │ └── vibe-codemod.ts │ │ ├── package.json │ │ ├── plop/ │ │ │ └── component/ │ │ │ ├── test.hbs │ │ │ ├── transform-remove-props.hbs │ │ │ ├── transform-update-prop-values.hbs │ │ │ ├── transform-update-props.hbs │ │ │ ├── transform-update-static-prop-key.hbs │ │ │ └── transform.hbs │ │ ├── plopfile.js │ │ ├── src/ │ │ │ ├── consts/ │ │ │ │ ├── index.ts │ │ │ │ └── vibe-import-paths.ts │ │ │ └── utils/ │ │ │ ├── __tests__/ │ │ │ │ ├── import-utils.test.ts │ │ │ │ └── prop-utils.test.ts │ │ │ ├── component-jsx-utils.ts │ │ │ ├── import-utils.ts │ │ │ ├── index.ts │ │ │ ├── prop-utils.ts │ │ │ ├── report-utils.ts │ │ │ └── wrap-transformation.ts │ │ ├── test/ │ │ │ └── setup.ts │ │ ├── transformations/ │ │ │ └── core/ │ │ │ ├── v2-to-v3/ │ │ │ │ ├── AttentionBox-component-migration.ts │ │ │ │ ├── Avatar-component-migration.ts │ │ │ │ ├── AvatarGroup-component-migration.ts │ │ │ │ ├── Box-component-migration.ts │ │ │ │ ├── BreadcrumbItem-component-migration.ts │ │ │ │ ├── Button-component-migration.ts │ │ │ │ ├── ButtonGroup-component-migration.ts │ │ │ │ ├── Checkbox-component-migration.ts │ │ │ │ ├── Chips-component-migration.ts │ │ │ │ ├── Clickable-component-migration.ts │ │ │ │ ├── ColorPicker-component-migration.ts │ │ │ │ ├── ColorPickerContent-component-migration.ts │ │ │ │ ├── Counter-component-migration.ts │ │ │ │ ├── Dialog-component-migration.ts │ │ │ │ ├── DialogContent-container-component-migration.ts │ │ │ │ ├── Divider-component-migration.ts │ │ │ │ ├── Dropdown-component-migration.ts │ │ │ │ ├── Icon-component-migration.ts │ │ │ │ ├── IconButton-component-migration.ts │ │ │ │ ├── InputField-component-import-migration.ts │ │ │ │ ├── Label-component-migration.ts │ │ │ │ ├── Link-component-migration.ts │ │ │ │ ├── Loader-component-migration.ts │ │ │ │ ├── Menu-component-migration.ts │ │ │ │ ├── MenuButton-component-migration.ts │ │ │ │ ├── MenuDivider-component-migration.ts │ │ │ │ ├── MenuItem-component-migration.ts │ │ │ │ ├── MenuItemButton-component-migration.ts │ │ │ │ ├── MenuTitle-component-migration.ts │ │ │ │ ├── Modal-component-migration.ts │ │ │ │ ├── ModalHeader-component-migration.ts │ │ │ │ ├── RadioButton-component-migration.ts │ │ │ │ ├── Search-component-import-migration.ts │ │ │ │ ├── Steps-component-migration.ts │ │ │ │ ├── TabList-component-migration.ts │ │ │ │ ├── TabPanels-component-migration.ts │ │ │ │ ├── TextField-component-migration.ts │ │ │ │ ├── ThemeProvider-component-migration.ts │ │ │ │ ├── Tipseen-component-migration.ts │ │ │ │ ├── TipseenContent-component-migration.ts │ │ │ │ ├── Toggle-component-migration.ts │ │ │ │ ├── Tooltip-component-migration.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── AttentionBox-component-migration.test.ts │ │ │ │ │ ├── Avatar-component-migration.test.ts │ │ │ │ │ ├── AvatarGroup-component-migration.test.ts │ │ │ │ │ ├── Box-component-migration.test.ts │ │ │ │ │ ├── BreadcrumbItem-component-migration.test.ts │ │ │ │ │ ├── Button-component-migration.test.ts │ │ │ │ │ ├── ButtonGroup-component-migration.test.ts │ │ │ │ │ ├── Checkbox-component-migration.test.ts │ │ │ │ │ ├── Chips-component-migration.test.ts │ │ │ │ │ ├── Clickable-component-migration.test.ts │ │ │ │ │ ├── ColorPicker-component-migration.test.ts │ │ │ │ │ ├── ColorPickerContent-component-migration.test.ts │ │ │ │ │ ├── Counter-component-migration.test.ts │ │ │ │ │ ├── Dialog-component-migration.test.ts │ │ │ │ │ ├── DialogContent-container-component-migration.test.ts │ │ │ │ │ ├── Divider-component-migration.test.ts │ │ │ │ │ ├── Dropdown-component-migration.test.ts │ │ │ │ │ ├── Icon-component-migration.test.ts │ │ │ │ │ ├── IconButton-component-migration.test.ts │ │ │ │ │ ├── InputField-component-import-migration.test.ts │ │ │ │ │ ├── Label-component-migration.test.ts │ │ │ │ │ ├── Link-component-migration.test.ts │ │ │ │ │ ├── Loader-component-migration.test.ts │ │ │ │ │ ├── Menu-component-migration.test.ts │ │ │ │ │ ├── MenuButton-component-migration.test.ts │ │ │ │ │ ├── MenuDivider-component-migration.test.ts │ │ │ │ │ ├── MenuItem-component-migration.test.ts │ │ │ │ │ ├── MenuItemButton-component-migration.test.ts │ │ │ │ │ ├── MenuTitle-component-migration.test.ts │ │ │ │ │ ├── Modal-component-migration.test.ts │ │ │ │ │ ├── ModalHeader-component-migration.test.ts │ │ │ │ │ ├── RadioButton-component-migration.test.ts │ │ │ │ │ ├── Search-component-import-migration.test.ts │ │ │ │ │ ├── Steps-component-migration.test.ts │ │ │ │ │ ├── TabList-component-migration.test.ts │ │ │ │ │ ├── TabPanels-component-migration.test.ts │ │ │ │ │ ├── TextField-component-migration.test.ts │ │ │ │ │ ├── ThemeProvider-component-migration.test.ts │ │ │ │ │ ├── Tipseen-component-migration.test.ts │ │ │ │ │ ├── TipseenContent-component-migration.test.ts │ │ │ │ │ ├── Toggle-component-migration.test.ts │ │ │ │ │ ├── Tooltip-component-migration.test.ts │ │ │ │ │ ├── next-imports-migration.test.ts │ │ │ │ │ ├── packages-rename-migration.test.ts │ │ │ │ │ ├── type-imports-migration.test.ts │ │ │ │ │ └── useClickableProps-hook-migration.test.ts │ │ │ │ ├── enums/ │ │ │ │ │ ├── Enums-migration.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── Enums-migration.test.ts │ │ │ │ │ └── enumMappings.json │ │ │ │ ├── next-imports-migration.ts │ │ │ │ ├── packages-rename-migration.ts │ │ │ │ ├── type-imports-migration.ts │ │ │ │ └── useClickableProps-hook-migration.ts │ │ │ └── v3-to-v4/ │ │ │ ├── Chips-component-migration.ts │ │ │ ├── Dialog-component-migration.ts │ │ │ ├── Flex-component-migration.ts │ │ │ ├── Icon-component-migration.ts │ │ │ ├── LinearProgressBar-component-migration.ts │ │ │ ├── README.md │ │ │ ├── TextField-component-migration.ts │ │ │ ├── TextWithHighlight-component-migration.ts │ │ │ ├── TipseenImage-component-migration.ts │ │ │ ├── Toggle-component-migration.ts │ │ │ ├── VirtualizedList-component-migration.ts │ │ │ ├── __tests__/ │ │ │ │ ├── Chips-component-migration.test.ts │ │ │ │ ├── Dialog-component-migration.test.ts │ │ │ │ ├── Flex-component-migration.test.ts │ │ │ │ ├── Icon-component-migration.test.ts │ │ │ │ ├── LinearProgressBar-component-migration.test.ts │ │ │ │ ├── TextField-component-migration.test.ts │ │ │ │ ├── TextWithHighlight-component-migration.test.ts │ │ │ │ ├── TipseenImage-component-migration.test.ts │ │ │ │ ├── Toggle-component-migration.test.ts │ │ │ │ ├── VirtualizedList-component-migration.test.ts │ │ │ │ ├── aria-props-migration.test.ts │ │ │ │ ├── enums-migration.test.ts │ │ │ │ ├── next-imports-migration.test.ts │ │ │ │ └── packages-rename-migration.test.ts │ │ │ ├── aria-props-migration.ts │ │ │ ├── enums/ │ │ │ │ └── enumMappings.json │ │ │ ├── enums-migration.ts │ │ │ ├── next-imports-migration.ts │ │ │ └── packages-rename-migration.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.test.json │ │ ├── types/ │ │ │ ├── index.ts │ │ │ └── transformation-context.types.ts │ │ └── vitest.config.ts │ ├── components/ │ │ ├── button/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Button/ │ │ │ │ │ ├── Button.module.scss │ │ │ │ │ ├── Button.tsx │ │ │ │ │ ├── Button.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Button.snapshot.test.tsx │ │ │ │ │ │ ├── Button.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Button.snapshot.test.tsx.snap │ │ │ │ │ ├── helper/ │ │ │ │ │ │ ├── dom-helpers.ts │ │ │ │ │ │ └── useButtonLoading.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── clickable/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Clickable/ │ │ │ │ │ ├── Clickable.module.scss │ │ │ │ │ ├── Clickable.tsx │ │ │ │ │ ├── ClickableWrapper.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Clickable.snapshot.test.tsx │ │ │ │ │ │ ├── Clickable.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Clickable.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── types/ │ │ │ │ │ └── files.d.ts │ │ │ │ └── useClickableProps/ │ │ │ │ └── useClickableProps.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── dialog/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Dialog/ │ │ │ │ │ ├── Dialog.module.scss │ │ │ │ │ ├── Dialog.tsx │ │ │ │ │ ├── Dialog.types.ts │ │ │ │ │ ├── DialogConstants.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Dialog.test.tsx │ │ │ │ │ │ └── useDisableScroll.test.ts │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── DialogContent/ │ │ │ │ │ │ │ ├── DialogContent.module.scss │ │ │ │ │ │ │ └── DialogContent.tsx │ │ │ │ │ │ └── Refable/ │ │ │ │ │ │ ├── Refable.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ └── Refable.test.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── useDisableScroll.test.ts │ │ │ │ │ │ └── useDisableScroll.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── DialogContentContainer/ │ │ │ │ │ ├── DialogContentContainer.module.scss │ │ │ │ │ ├── DialogContentContainer.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── DialogContentContainer.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── DialogContentContainer.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── icon/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Icon/ │ │ │ │ │ ├── CustomSvgIcon/ │ │ │ │ │ │ └── CustomSvgIcon.tsx │ │ │ │ │ ├── FontIcon/ │ │ │ │ │ │ └── FontIcon.tsx │ │ │ │ │ ├── Icon.module.scss │ │ │ │ │ ├── Icon.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── allIcons.test.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useIconProps.tsx │ │ │ │ │ │ └── useIconScreenReaderAccessProps.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ └── tsconfig.json │ │ ├── icon-button/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── IconButton/ │ │ │ │ │ ├── IconButton.module.scss │ │ │ │ │ ├── IconButton.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── IconButton.snapshot.test.tsx │ │ │ │ │ │ ├── IconButton.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── IconButton.snapshot.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── services/ │ │ │ │ │ └── IconButton-helpers.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── layer/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── LayerProvider/ │ │ │ │ │ ├── LayerContext.ts │ │ │ │ │ ├── LayerProvider.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── LayerProvider.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── layout/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Box/ │ │ │ │ │ ├── Box.module.scss │ │ │ │ │ ├── Box.tsx │ │ │ │ │ ├── Box.types.ts │ │ │ │ │ ├── BoxConstants.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Box.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Box.snapshot.test.tsx.snap │ │ │ │ │ ├── _utilities.scss │ │ │ │ │ └── index.ts │ │ │ │ ├── Flex/ │ │ │ │ │ ├── Flex.module.scss │ │ │ │ │ ├── Flex.tsx │ │ │ │ │ ├── Flex.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Flex.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Flex.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── loader/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Loader/ │ │ │ │ │ ├── Loader.module.scss │ │ │ │ │ ├── Loader.tsx │ │ │ │ │ ├── Loader.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Loader.snapshot.test.tsx │ │ │ │ │ │ ├── Loader.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Loader.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ ├── tooltip/ │ │ │ ├── CHANGELOG.md │ │ │ ├── package.json │ │ │ ├── rollup.config.mjs │ │ │ ├── src/ │ │ │ │ ├── Tooltip/ │ │ │ │ │ ├── Tooltip.module.scss │ │ │ │ │ ├── Tooltip.tsx │ │ │ │ │ ├── Tooltip.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Tooltip.snapshot.test.tsx │ │ │ │ │ │ ├── Tooltip.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Tooltip.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ └── types/ │ │ │ │ └── files.d.ts │ │ │ ├── tsconfig.json │ │ │ ├── vitest.config.mjs │ │ │ └── vitest.setup.mjs │ │ └── typography/ │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── rollup.config.mjs │ │ ├── src/ │ │ │ ├── Heading/ │ │ │ │ ├── Heading.module.scss │ │ │ │ ├── Heading.tsx │ │ │ │ ├── Heading.types.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── Heading.snapshot.test.tsx │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ └── Heading.snapshot.test.tsx.snap │ │ │ │ └── index.ts │ │ │ ├── Text/ │ │ │ │ ├── Text.module.scss │ │ │ │ ├── Text.tsx │ │ │ │ ├── Text.types.ts │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── Text.snapshot.test.tsx │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ └── Text.snapshot.test.tsx.snap │ │ │ │ └── index.ts │ │ │ ├── Typography/ │ │ │ │ ├── Typography.module.scss │ │ │ │ ├── Typography.tsx │ │ │ │ ├── Typography.types.ts │ │ │ │ ├── TypographyContext.ts │ │ │ │ ├── TypographyHooks.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── Typography.snapshot.test.tsx │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ └── Typography.snapshot.test.tsx.snap │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── styles/ │ │ │ │ └── typography.scss │ │ │ └── types/ │ │ │ └── files.d.ts │ │ ├── tsconfig.json │ │ ├── vitest.config.mjs │ │ └── vitest.setup.mjs │ ├── config/ │ │ ├── .eslintrc.cjs │ │ ├── CHANGELOG.md │ │ ├── eslint.config.cjs │ │ ├── package.json │ │ ├── rollup.config.mjs │ │ ├── scripts/ │ │ │ └── styleInject.ejs │ │ ├── tsconfig.json │ │ └── vitest.config.mjs │ ├── core/ │ │ ├── .eslintrc.cjs │ │ ├── .stylelintignore │ │ ├── .stylelintrc.json │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ └── fileMock.cjs │ │ ├── babel.config.cjs │ │ ├── package.json │ │ ├── plop/ │ │ │ └── component/ │ │ │ ├── component-index.txt │ │ │ ├── component-scss.txt │ │ │ ├── component-stories-mdx.txt │ │ │ ├── component-stories-tsx.txt │ │ │ ├── component-tests.txt │ │ │ ├── component-ts.txt │ │ │ ├── component-types.txt │ │ │ └── index.js │ │ ├── plopfile.js │ │ ├── rollup.config.js │ │ ├── scripts/ │ │ │ └── styleInject.ejs │ │ ├── src/ │ │ │ ├── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── exports.test.ts.snap │ │ │ │ └── exports.test.ts │ │ │ ├── components/ │ │ │ │ ├── Accordion/ │ │ │ │ │ ├── Accordion/ │ │ │ │ │ │ ├── Accordion.module.scss │ │ │ │ │ │ ├── Accordion.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── Accordion.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Accordion.snapshot.test.tsx.snap │ │ │ │ │ ├── AccordionItem/ │ │ │ │ │ │ ├── AccordionItem.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── AccordionItem.snapshot.test.tsx │ │ │ │ │ │ ├── AccordionItem.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── AccordionItem.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── AlertBanner/ │ │ │ │ │ ├── AlertBanner.module.scss │ │ │ │ │ ├── AlertBanner.tsx │ │ │ │ │ ├── AlertBanner.types.ts │ │ │ │ │ ├── AlertBannerButton/ │ │ │ │ │ │ ├── AlertBannerButton.module.scss │ │ │ │ │ │ └── AlertBannerButton.tsx │ │ │ │ │ ├── AlertBannerContext.ts │ │ │ │ │ ├── AlertBannerLink/ │ │ │ │ │ │ ├── AlertBannerLink.module.scss │ │ │ │ │ │ └── AlertBannerLink.tsx │ │ │ │ │ ├── AlertBannerText/ │ │ │ │ │ │ ├── AlertBannerText.module.scss │ │ │ │ │ │ └── AlertBannerText.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── AlertBanner.snapshot.test.tsx │ │ │ │ │ │ ├── AlertBanner.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── AlertBanner.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── AttentionBox/ │ │ │ │ │ ├── AttentionBox.module.scss │ │ │ │ │ ├── AttentionBox.tsx │ │ │ │ │ ├── AttentionBox.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── AttentionBox.test.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── AttentionBoxButton/ │ │ │ │ │ │ │ └── AttentionBoxButton.tsx │ │ │ │ │ │ ├── AttentionBoxCloseButton/ │ │ │ │ │ │ │ ├── AttentionBoxCloseButton.module.scss │ │ │ │ │ │ │ └── AttentionBoxCloseButton.tsx │ │ │ │ │ │ ├── AttentionBoxLeadingIcon/ │ │ │ │ │ │ │ ├── AttentionBoxLeadingIcon.module.scss │ │ │ │ │ │ │ └── AttentionBoxLeadingIcon.tsx │ │ │ │ │ │ └── AttentionBoxLink/ │ │ │ │ │ │ ├── AttentionBoxLink.module.scss │ │ │ │ │ │ └── AttentionBoxLink.tsx │ │ │ │ │ ├── consts/ │ │ │ │ │ │ └── icons.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── layouts/ │ │ │ │ │ │ ├── AttentionBoxCompact/ │ │ │ │ │ │ │ ├── AttentionBoxCompact.module.scss │ │ │ │ │ │ │ ├── AttentionBoxCompact.tsx │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ └── AttentionBoxCompact.test.tsx │ │ │ │ │ │ └── AttentionBoxDefault/ │ │ │ │ │ │ ├── AttentionBoxDefault.module.scss │ │ │ │ │ │ ├── AttentionBoxDefault.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ └── AttentionBoxDefault.test.tsx │ │ │ │ │ └── utils/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── iconUtils.test.ts │ │ │ │ │ └── iconUtils.ts │ │ │ │ ├── Avatar/ │ │ │ │ │ ├── Avatar.module.scss │ │ │ │ │ ├── Avatar.tsx │ │ │ │ │ ├── Avatar.types.ts │ │ │ │ │ ├── AvatarBadge.module.scss │ │ │ │ │ ├── AvatarBadge.tsx │ │ │ │ │ ├── AvatarConstants.scss │ │ │ │ │ ├── AvatarContent.module.scss │ │ │ │ │ ├── AvatarContent.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Avatar.snapshot.test.tsx │ │ │ │ │ │ ├── Avatar.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Avatar.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── AvatarGroup/ │ │ │ │ │ ├── AvatarGroup.module.scss │ │ │ │ │ ├── AvatarGroup.tsx │ │ │ │ │ ├── AvatarGroup.types.ts │ │ │ │ │ ├── AvatarGroupConstants.ts │ │ │ │ │ ├── AvatarGroupCounter.module.scss │ │ │ │ │ ├── AvatarGroupCounter.tsx │ │ │ │ │ ├── AvatarGroupCounterTooltipContainer.tsx │ │ │ │ │ ├── AvatarGroupCounterTooltipContent.module.scss │ │ │ │ │ ├── AvatarGroupCounterTooltipContent.tsx │ │ │ │ │ ├── AvatarGroupCounterTooltipContentVirtualizedList.module.scss │ │ │ │ │ ├── AvatarGroupCounterTooltipContentVirtualizedList.tsx │ │ │ │ │ ├── AvatarGroupCounterTooltipHelper.tsx │ │ │ │ │ ├── AvatarGroupHelper.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── AvatarGroup.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── AvatarGroup.snapshot.test.jsx.snap │ │ │ │ │ │ └── AvatarGroup.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Badge/ │ │ │ │ │ ├── Badge.module.scss │ │ │ │ │ ├── Badge.tsx │ │ │ │ │ ├── Badge.types.ts │ │ │ │ │ ├── Indicator/ │ │ │ │ │ │ ├── Indicator.module.scss │ │ │ │ │ │ ├── Indicator.tsx │ │ │ │ │ │ ├── Indicator.types.ts │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── Indicator.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Indicator.snapshot.test.tsx.snap │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Badge.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Badge.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── BaseItem/ │ │ │ │ │ ├── BaseItem.module.scss │ │ │ │ │ ├── BaseItem.tsx │ │ │ │ │ ├── BaseItem.types.ts │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ └── BaseItem.stories.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── BaseItem.test.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── useListItemProps.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils.tsx │ │ │ │ ├── BaseList/ │ │ │ │ │ ├── BaseList.module.scss │ │ │ │ │ ├── BaseList.tsx │ │ │ │ │ ├── BaseList.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── BaseList.test.tsx │ │ │ │ │ ├── context/ │ │ │ │ │ │ └── BaseListContext.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useBaseListFocus.ts │ │ │ │ │ │ └── useBaseListKeyboard.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ └── baseListUtils.ts │ │ │ │ ├── BreadcrumbsBar/ │ │ │ │ │ ├── BreadcrumbItem/ │ │ │ │ │ │ ├── BreadcrumbContent/ │ │ │ │ │ │ │ ├── BreadcrumbContent.module.scss │ │ │ │ │ │ │ └── BreadcrumbContent.tsx │ │ │ │ │ │ ├── BreadcrumbItem.module.scss │ │ │ │ │ │ ├── BreadcrumbItem.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── BreadcrumbItem.snapshot.test.tsx │ │ │ │ │ │ ├── BreadcrumbItem.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── BreadcrumbItem.snapshot.test.jsx.snap │ │ │ │ │ │ └── BreadcrumbItem.snapshot.test.tsx.snap │ │ │ │ │ ├── BreadcrumbMenu/ │ │ │ │ │ │ ├── BreadcrumbMenu.tsx │ │ │ │ │ │ ├── BreadcrumbMenuItem/ │ │ │ │ │ │ │ └── BreadcrumbMenuItem.tsx │ │ │ │ │ │ ├── BreadcrumbsMenu.module.scss │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── BreadcrumbMenu.snapshot.test.tsx │ │ │ │ │ │ ├── BreadcrumbMenu.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── BreadcrumbMenu.snapshot.test.jsx.snap │ │ │ │ │ │ └── BreadcrumbMenu.snapshot.test.tsx.snap │ │ │ │ │ ├── Breadcrumbs.types.ts │ │ │ │ │ ├── BreadcrumbsBar.module.scss │ │ │ │ │ ├── BreadcrumbsBar.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── BreadcrumbsBar.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── BreadcrumbsBar.snapshot.test.jsx.snap │ │ │ │ │ │ └── BreadcrumbsBar.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ButtonGroup/ │ │ │ │ │ ├── ButtonGroup.module.scss │ │ │ │ │ ├── ButtonGroup.tsx │ │ │ │ │ ├── ButtonGroupConstants.ts │ │ │ │ │ ├── ButtonWrapper.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ButtonGroup.snapshot.test.tsx │ │ │ │ │ │ ├── ButtonGroup.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── ButtonGroup.snapshot.test.tsx.snap │ │ │ │ │ │ └── ButtonGroup.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Checkbox/ │ │ │ │ │ ├── Checkbox.module.scss │ │ │ │ │ ├── Checkbox.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Checkbox.snapshot.test.tsx │ │ │ │ │ │ ├── Checkbox.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Checkbox.snapshot.test.tsx.snap │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ └── useSupportFirefoxLabelClick.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Chips/ │ │ │ │ │ ├── Chips.module.scss │ │ │ │ │ ├── Chips.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Chips.snapshot.test.tsx │ │ │ │ │ │ ├── Chips.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Chips.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ColorPicker/ │ │ │ │ │ ├── ColorPicker.module.scss │ │ │ │ │ ├── ColorPicker.tsx │ │ │ │ │ ├── ColorPicker.types.ts │ │ │ │ │ ├── ColorPickerConstants.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ColorPicker.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ColorPicker.test.tsx.snap │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ColorPickerContent/ │ │ │ │ │ │ │ ├── ColorPickerClearButton.module.scss │ │ │ │ │ │ │ ├── ColorPickerClearButton.tsx │ │ │ │ │ │ │ ├── ColorPickerColorsGrid.module.scss │ │ │ │ │ │ │ ├── ColorPickerColorsGrid.tsx │ │ │ │ │ │ │ └── ColorPickerContent.tsx │ │ │ │ │ │ └── ColorPickerItemComponent/ │ │ │ │ │ │ ├── ColorPickerItemComponent.module.scss │ │ │ │ │ │ └── ColorPickerItemComponent.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── services/ │ │ │ │ │ └── ColorPickerStyleService.ts │ │ │ │ ├── Combobox/ │ │ │ │ │ ├── Combobox.module.scss │ │ │ │ │ ├── Combobox.tsx │ │ │ │ │ ├── Combobox.types.ts │ │ │ │ │ ├── ComboboxHelpers/ │ │ │ │ │ │ ├── ComboboxHelpers.module.scss │ │ │ │ │ │ └── ComboboxHelpers.tsx │ │ │ │ │ ├── ComboboxService.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Combobox.snapshot.test.tsx │ │ │ │ │ │ ├── Combobox.test.tsx │ │ │ │ │ │ ├── ComboboxService.test.ts │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Combobox.snapshot.test.tsx.snap │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ComboboxCategory/ │ │ │ │ │ │ │ ├── ComboboxCategory.module.scss │ │ │ │ │ │ │ └── ComboboxCategory.tsx │ │ │ │ │ │ ├── ComboboxConstants.ts │ │ │ │ │ │ ├── ComboboxItems/ │ │ │ │ │ │ │ ├── ComboboxItems.module.scss │ │ │ │ │ │ │ └── ComboboxItems.tsx │ │ │ │ │ │ ├── ComboboxOption/ │ │ │ │ │ │ │ ├── ComboboxOption.module.scss │ │ │ │ │ │ │ └── ComboboxOption.tsx │ │ │ │ │ │ └── StickyCategoryHeader/ │ │ │ │ │ │ ├── StickyCategoryHeader.module.scss │ │ │ │ │ │ └── StickyCategoryHeader.tsx │ │ │ │ │ ├── helpers.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── Counter/ │ │ │ │ │ ├── Counter.module.scss │ │ │ │ │ ├── Counter.tsx │ │ │ │ │ ├── Counter.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Counter.snapshot.test.tsx │ │ │ │ │ │ ├── Counter.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Counter.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── DatePicker/ │ │ │ │ │ ├── DateContentHoverContext.tsx │ │ │ │ │ ├── DatePicker.module.scss │ │ │ │ │ ├── DatePicker.tsx │ │ │ │ │ ├── DatePicker.types.ts │ │ │ │ │ ├── DatePickerHeader.module.scss │ │ │ │ │ ├── DatePickerHeader.tsx │ │ │ │ │ ├── RangeDayContent.tsx │ │ │ │ │ ├── SingleDayContent.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── DatePicker.test.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── DatePicker.test.jsx.snap │ │ │ │ │ │ │ └── DatePicker.test.tsx.snap │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ ├── datePickerHooks.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types/ │ │ │ │ │ │ └── files.d.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── Divider/ │ │ │ │ │ ├── Divider.module.scss │ │ │ │ │ ├── Divider.tsx │ │ │ │ │ ├── Divider.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Divider.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Divider.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Dropdown/ │ │ │ │ │ ├── Dropdown.tsx │ │ │ │ │ ├── Dropdown.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── BaseList.test.tsx │ │ │ │ │ │ └── Dropdown.test.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── DropdownBase/ │ │ │ │ │ │ │ ├── DropdownBase.module.scss │ │ │ │ │ │ │ └── DropdownBase.tsx │ │ │ │ │ │ ├── DropdownBaseList/ │ │ │ │ │ │ │ ├── DropdownBaseList.module.scss │ │ │ │ │ │ │ ├── DropdownBaseList.tsx │ │ │ │ │ │ │ └── DropdownBaseList.types.ts │ │ │ │ │ │ ├── DropdownBoxMode/ │ │ │ │ │ │ │ ├── DropdownBoxMode.module.scss │ │ │ │ │ │ │ └── DropdownBoxMode.tsx │ │ │ │ │ │ ├── DropdownPopup/ │ │ │ │ │ │ │ └── DropdownPopup.tsx │ │ │ │ │ │ ├── DropdownWrapperUI.tsx │ │ │ │ │ │ ├── Menu/ │ │ │ │ │ │ │ ├── Menu.module.scss │ │ │ │ │ │ │ ├── Menu.tsx │ │ │ │ │ │ │ └── MenuList.tsx │ │ │ │ │ │ ├── MultiSelectedValues/ │ │ │ │ │ │ │ ├── MultiSelectedValues.module.scss │ │ │ │ │ │ │ └── MultiSelectedValues.tsx │ │ │ │ │ │ └── Trigger/ │ │ │ │ │ │ ├── DropdownChip.tsx │ │ │ │ │ │ ├── DropdownInput.tsx │ │ │ │ │ │ ├── MultiSelectTrigger.tsx │ │ │ │ │ │ ├── SingleSelectTrigger.tsx │ │ │ │ │ │ ├── Trigger.module.scss │ │ │ │ │ │ └── TriggerActions.tsx │ │ │ │ │ ├── context/ │ │ │ │ │ │ ├── DropdownContext.ts │ │ │ │ │ │ └── DropdownContext.types.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useDropdownCombobox.ts │ │ │ │ │ │ ├── useDropdownFiltering.ts │ │ │ │ │ │ ├── useDropdownMultiCombobox.ts │ │ │ │ │ │ ├── useDropdownMultiSelect.ts │ │ │ │ │ │ └── useDropdownSelect.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── modes/ │ │ │ │ │ │ ├── DropdownComboboxController.tsx │ │ │ │ │ │ ├── DropdownMultiComboboxController.tsx │ │ │ │ │ │ ├── DropdownMultiSelectController.tsx │ │ │ │ │ │ └── DropdownSelectController.tsx │ │ │ │ │ └── utils/ │ │ │ │ │ ├── dropdown-modifiers.ts │ │ │ │ │ └── dropdownUtils.ts │ │ │ │ ├── EditableHeading/ │ │ │ │ │ ├── EditableHeading.module.scss │ │ │ │ │ ├── EditableHeading.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── EditableHeading.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── EditableText/ │ │ │ │ │ ├── EditableText.module.scss │ │ │ │ │ ├── EditableText.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── EditableText.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── EditableTypography/ │ │ │ │ │ ├── EditableTypography.module.scss │ │ │ │ │ ├── EditableTypography.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── EditableTypography.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── EmptyState/ │ │ │ │ │ ├── EmptyState.module.scss │ │ │ │ │ ├── EmptyState.tsx │ │ │ │ │ ├── EmptyState.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── EmptyState.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── ExpandCollapse/ │ │ │ │ │ ├── ExpandCollapse.module.scss │ │ │ │ │ ├── ExpandCollapse.tsx │ │ │ │ │ ├── ExpandCollapse.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ExpandCollapse.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ExpandCollapse.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── FieldLabel/ │ │ │ │ │ ├── FieldLabel.module.scss │ │ │ │ │ ├── FieldLabel.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── FormattedNumber/ │ │ │ │ │ ├── FormattedNumber.module.scss │ │ │ │ │ ├── FormattedNumber.tsx │ │ │ │ │ ├── FormattedNumberHelpers.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── FormattedNumber.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── GridKeyboardNavigationContext/ │ │ │ │ │ ├── GridKeyboardNavigationContext.ts │ │ │ │ │ ├── GridKeyboardNavigationContextConstants.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── GridKeyboardNavigationContext.test.tsx │ │ │ │ │ │ └── helper.test.ts │ │ │ │ │ ├── helper.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── HiddenText/ │ │ │ │ │ ├── HiddenText.module.scss │ │ │ │ │ ├── HiddenText.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── HiddenText.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── HiddenText.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Info/ │ │ │ │ │ ├── Info.tsx │ │ │ │ │ ├── Info.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── Info.test.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── InfoDialogContent/ │ │ │ │ │ │ │ ├── InfoDialogContent.module.scss │ │ │ │ │ │ │ ├── InfoDialogContent.tsx │ │ │ │ │ │ │ ├── InfoDialogContent.types.ts │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ └── InfoDialogContent.test.tsx │ │ │ │ │ │ ├── InfoLink/ │ │ │ │ │ │ │ ├── InfoLink.module.scss │ │ │ │ │ │ │ ├── InfoLink.tsx │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ └── InfoLink.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── InfoText/ │ │ │ │ │ ├── InfoText.module.scss │ │ │ │ │ ├── InfoText.tsx │ │ │ │ │ ├── InfoText.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── InfoText.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Label/ │ │ │ │ │ ├── Label.module.scss │ │ │ │ │ ├── Label.tsx │ │ │ │ │ ├── Label.types.ts │ │ │ │ │ ├── LabelCelebrationAnimation.module.scss │ │ │ │ │ ├── LabelCelebrationAnimation.tsx │ │ │ │ │ ├── LabelConstants.ts │ │ │ │ │ ├── Leg.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Label.snapshot.test.tsx │ │ │ │ │ │ ├── Label.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Label.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Link/ │ │ │ │ │ ├── Link.module.scss │ │ │ │ │ ├── Link.tsx │ │ │ │ │ ├── Link.types.ts │ │ │ │ │ ├── LinkConsts.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Link.snapshot.test.tsx │ │ │ │ │ │ ├── Link.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Link.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── List/ │ │ │ │ │ ├── List.module.scss │ │ │ │ │ ├── List.tsx │ │ │ │ │ ├── List.types.ts │ │ │ │ │ ├── VirtualizedListItems/ │ │ │ │ │ │ ├── VirtualizedListItems.module.scss │ │ │ │ │ │ └── VirtualizedListItems.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── List.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── List.test.jsx.snap │ │ │ │ │ │ └── List.test.tsx.snap │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── ListContext.ts │ │ │ │ │ └── ListUtils.ts │ │ │ │ ├── ListItem/ │ │ │ │ │ ├── ListItem.module.scss │ │ │ │ │ ├── ListItem.tsx │ │ │ │ │ ├── ListItem.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ListItem.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ListItem.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ListItemAvatar/ │ │ │ │ │ ├── ListItemAvatar.module.scss │ │ │ │ │ ├── ListItemAvatar.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ListItemAvatar.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ListItemAvatar.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ListItemIcon/ │ │ │ │ │ ├── ListItemIcon.module.scss │ │ │ │ │ ├── ListItemIcon.tsx │ │ │ │ │ ├── ListItemIcon.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ListItemIcon.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ListItemIcon.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ListTitle/ │ │ │ │ │ ├── ListTitle.module.scss │ │ │ │ │ ├── ListTitle.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── ListTitle.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ListTitle.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Menu/ │ │ │ │ │ ├── Menu/ │ │ │ │ │ │ ├── Menu.module.scss │ │ │ │ │ │ ├── Menu.tsx │ │ │ │ │ │ ├── MenuConstants.ts │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── Menu.test.tsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ └── Menu.test.tsx.snap │ │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ ├── useAdjacentSelectableMenuIndex.test.tsx │ │ │ │ │ │ │ │ ├── useFocusOnMount.test.tsx │ │ │ │ │ │ │ │ └── useLastNavigationDirection.test.tsx │ │ │ │ │ │ │ ├── useAdjacentSelectableMenuIndex.tsx │ │ │ │ │ │ │ ├── useCloseMenuOnKeyEvent.tsx │ │ │ │ │ │ │ ├── useFocusOnMount.tsx │ │ │ │ │ │ │ ├── useLastNavigationDirection.tsx │ │ │ │ │ │ │ ├── useMenuId.tsx │ │ │ │ │ │ │ ├── useMenuKeyboardNavigation.tsx │ │ │ │ │ │ │ ├── useMouseLeave.tsx │ │ │ │ │ │ │ ├── useOnCloseMenu.tsx │ │ │ │ │ │ │ └── useSubMenuIndex.tsx │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── utils.test.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── MenuDivider/ │ │ │ │ │ │ ├── MenuDivider.module.scss │ │ │ │ │ │ └── MenuDivider.tsx │ │ │ │ │ ├── MenuGridItem/ │ │ │ │ │ │ ├── MenuGridItem.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── MenuGridItem.snapshot.test.tsx │ │ │ │ │ │ │ ├── MenuGridItem.test.tsx │ │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ │ ├── MenuGridItem.snapshot.test.jsx.snap │ │ │ │ │ │ │ │ └── MenuGridItem.snapshot.test.tsx.snap │ │ │ │ │ │ │ ├── useFocusGridItemByActiveStatus.test.ts │ │ │ │ │ │ │ └── useMenuGridItemNavContext.test.ts │ │ │ │ │ │ ├── useFocusGridItemByActiveStatus.tsx │ │ │ │ │ │ └── useMenuGridItemNavContext.tsx │ │ │ │ │ ├── MenuItem/ │ │ │ │ │ │ ├── AvatarMenuItem.tsx │ │ │ │ │ │ ├── MenuItem.module.scss │ │ │ │ │ │ ├── MenuItem.tsx │ │ │ │ │ │ ├── MenuItem.types.ts │ │ │ │ │ │ ├── MenuItemConstants.ts │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── MenuItem.snapshot.test.tsx │ │ │ │ │ │ │ ├── MenuItem.test.tsx │ │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ │ └── MenuItem.snapshot.test.tsx.snap │ │ │ │ │ │ ├── components/ │ │ │ │ │ │ │ ├── BaseMenuItem/ │ │ │ │ │ │ │ │ ├── BaseMenuItem.module.scss │ │ │ │ │ │ │ │ ├── BaseMenuItem.tsx │ │ │ │ │ │ │ │ ├── BaseMenuItem.types.ts │ │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ │ └── BaseMenuItem.test.tsx │ │ │ │ │ │ │ ├── MenuItemIcon/ │ │ │ │ │ │ │ │ ├── MenuItemIcon.module.scss │ │ │ │ │ │ │ │ ├── MenuItemIcon.tsx │ │ │ │ │ │ │ │ ├── MenuItemIcon.types.ts │ │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ │ └── MenuItemIcon.test.tsx │ │ │ │ │ │ │ ├── MenuItemSubMenu/ │ │ │ │ │ │ │ │ ├── MenuItemSubMenu.tsx │ │ │ │ │ │ │ │ ├── MenuItemSubMenu.types.ts │ │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ │ └── MenuItemSubMenu.test.tsx │ │ │ │ │ │ │ └── MenuItemSubMenuIcon/ │ │ │ │ │ │ │ ├── MenuItemSubMenuIcon.module.scss │ │ │ │ │ │ │ ├── MenuItemSubMenuIcon.tsx │ │ │ │ │ │ │ ├── MenuItemSubMenuIcon.types.ts │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ └── MenuItemSubMenuIcon.test.tsx │ │ │ │ │ │ └── hooks/ │ │ │ │ │ │ ├── useMenuItemKeyboardEvents.ts │ │ │ │ │ │ └── useMenuItemMouseEvents.ts │ │ │ │ │ ├── MenuItemButton/ │ │ │ │ │ │ ├── MenuItemButton.module.scss │ │ │ │ │ │ ├── MenuItemButton.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── MenuItemButton.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── MenuItemButton.test.jsx.snap │ │ │ │ │ │ └── MenuItemButton.test.tsx.snap │ │ │ │ │ ├── MenuTitle/ │ │ │ │ │ │ ├── MenuTitle.module.scss │ │ │ │ │ │ ├── MenuTitle.tsx │ │ │ │ │ │ ├── MenuTitle.type.ts │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── MenuTitle.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── MenuTitle.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── MenuButton/ │ │ │ │ │ ├── MenuButton.module.scss │ │ │ │ │ ├── MenuButton.tsx │ │ │ │ │ ├── MenuButton.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── MenuButton.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── MenuButton.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Modal/ │ │ │ │ │ ├── Modal/ │ │ │ │ │ │ ├── Modal.module.scss │ │ │ │ │ │ ├── Modal.tsx │ │ │ │ │ │ ├── Modal.types.tsx │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── Modal.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ModalContent/ │ │ │ │ │ │ ├── ModalContent.tsx │ │ │ │ │ │ ├── ModalContent.types.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ModalHeader/ │ │ │ │ │ │ ├── ModalHeader.module.scss │ │ │ │ │ │ ├── ModalHeader.tsx │ │ │ │ │ │ ├── ModalHeader.types.ts │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── ModalHeader.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ModalMedia/ │ │ │ │ │ │ ├── ModalMedia.module.scss │ │ │ │ │ │ ├── ModalMedia.tsx │ │ │ │ │ │ ├── ModalMedia.types.ts │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ModalTopActions/ │ │ │ │ │ │ ├── ModalTopActions.module.scss │ │ │ │ │ │ ├── ModalTopActions.tsx │ │ │ │ │ │ ├── ModalTopActions.types.ts │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ └── ModalTopActions.test.tsx │ │ │ │ │ ├── context/ │ │ │ │ │ │ ├── ModalContext.tsx │ │ │ │ │ │ └── ModalContext.types.ts │ │ │ │ │ ├── footers/ │ │ │ │ │ │ ├── ModalFooter/ │ │ │ │ │ │ │ ├── ModalFooter.module.scss │ │ │ │ │ │ │ ├── ModalFooter.tsx │ │ │ │ │ │ │ └── ModalFooter.types.ts │ │ │ │ │ │ ├── ModalFooterBase/ │ │ │ │ │ │ │ ├── ModalFooterBase.module.scss │ │ │ │ │ │ │ ├── ModalFooterBase.tsx │ │ │ │ │ │ │ ├── ModalFooterBase.types.ts │ │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ │ └── ModalFooterBase.test.tsx │ │ │ │ │ │ ├── ModalFooterWizard/ │ │ │ │ │ │ │ ├── ModalFooterWizard.module.scss │ │ │ │ │ │ │ ├── ModalFooterWizard.tsx │ │ │ │ │ │ │ └── ModalFooterWizard.types.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── getPropsForButton.test.ts │ │ │ │ │ │ └── getPropsForButton.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useFocusEscapeTargets/ │ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ │ └── useFocusEscapeTargets.test.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── useFocusEscapeTargets.ts │ │ │ │ │ │ │ └── useFocusEscapeTargets.types.ts │ │ │ │ │ │ └── usePortalTarget/ │ │ │ │ │ │ ├── usePortalTarget.ts │ │ │ │ │ │ └── usePortalTarget.types.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── layouts/ │ │ │ │ │ ├── ModalBasicLayout/ │ │ │ │ │ │ ├── ModalBasicLayout.module.scss │ │ │ │ │ │ ├── ModalBasicLayout.tsx │ │ │ │ │ │ └── ModalBasicLayout.types.ts │ │ │ │ │ ├── ModalFooterShadow.module.scss │ │ │ │ │ ├── ModalFooterShadow.tsx │ │ │ │ │ ├── ModalFooterShadow.types.ts │ │ │ │ │ ├── ModalLayoutScrollableContent.module.scss │ │ │ │ │ ├── ModalLayoutScrollableContent.tsx │ │ │ │ │ ├── ModalLayoutScrollableContent.types.ts │ │ │ │ │ ├── ModalMediaLayout/ │ │ │ │ │ │ ├── ModalMediaLayout.module.scss │ │ │ │ │ │ ├── ModalMediaLayout.tsx │ │ │ │ │ │ └── ModalMediaLayout.types.ts │ │ │ │ │ ├── ModalSideBySideLayout/ │ │ │ │ │ │ ├── ModalSideBySideLayout.module.scss │ │ │ │ │ │ ├── ModalSideBySideLayout.tsx │ │ │ │ │ │ └── ModalSideBySideLayout.types.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── useLayoutScrolledContent.ts │ │ │ │ ├── MultiStepIndicator/ │ │ │ │ │ ├── MultiStep.types.ts │ │ │ │ │ ├── MultiStepIndicator.module.scss │ │ │ │ │ ├── MultiStepIndicator.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── MultiStepIndicator.snapshot.test.tsx │ │ │ │ │ │ ├── MultiStepIndicator.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── MultiStepIndicator.snapshot.test.tsx.snap │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── StepIndicator/ │ │ │ │ │ │ ├── StepIndicator.module.scss │ │ │ │ │ │ └── StepIndicator.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── NumberField/ │ │ │ │ │ ├── NumberField.module.scss │ │ │ │ │ ├── NumberField.tsx │ │ │ │ │ ├── NumberField.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── NumberField.test.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── NumberFieldSpinButton/ │ │ │ │ │ │ ├── NumberFieldSpinButton.module.scss │ │ │ │ │ │ ├── NumberFieldSpinButton.tsx │ │ │ │ │ │ ├── NumberFieldSpinButton.types.ts │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ └── NumberFieldSpinButton.test.tsx │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── useNumberFieldState.test.ts │ │ │ │ │ │ │ └── useSpinButtonHandlers.test.ts │ │ │ │ │ │ ├── useNumberFieldState.ts │ │ │ │ │ │ └── useSpinButtonHandlers.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── calcValue.test.ts │ │ │ │ │ └── calcValue.ts │ │ │ │ ├── ProgressBars/ │ │ │ │ │ ├── PercentageLabel/ │ │ │ │ │ │ ├── PercentageLabel.module.scss │ │ │ │ │ │ └── PercentageLabel.tsx │ │ │ │ │ ├── ProgressBar/ │ │ │ │ │ │ ├── Bar/ │ │ │ │ │ │ │ ├── Bar.module.scss │ │ │ │ │ │ │ └── Bar.tsx │ │ │ │ │ │ ├── ProgressBar.module.scss │ │ │ │ │ │ ├── ProgressBar.tsx │ │ │ │ │ │ ├── ProgressBar.types.ts │ │ │ │ │ │ ├── ProgressBarHelpers.ts │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── ProgressBar.snapshot.test.tsx │ │ │ │ │ │ ├── ProgressBar.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── ProgressBar.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── RadioButton/ │ │ │ │ │ ├── RadioButton.module.scss │ │ │ │ │ ├── RadioButton.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── RadioButton.snapshot.test.tsx │ │ │ │ │ │ ├── RadioButton.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── RadioButton.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Search/ │ │ │ │ │ ├── Search.module.scss │ │ │ │ │ ├── Search.tsx │ │ │ │ │ ├── Search.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── Search.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Skeleton/ │ │ │ │ │ ├── Skeleton.module.scss │ │ │ │ │ ├── Skeleton.tsx │ │ │ │ │ ├── SkeletonConstants.ts │ │ │ │ │ ├── SkeletonVariables.scss │ │ │ │ │ ├── Skelton.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Skeleton.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── Skeleton.snapshot.test.jsx.snap │ │ │ │ │ │ └── Skeleton.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── SlideTransition/ │ │ │ │ │ ├── SlideTransition.module.scss │ │ │ │ │ ├── SlideTransition.tsx │ │ │ │ │ └── SlideTransition.types.ts │ │ │ │ ├── Slider/ │ │ │ │ │ ├── SelectionIndicator.module.scss │ │ │ │ │ ├── SelectionIndicator.tsx │ │ │ │ │ ├── Slider.module.scss │ │ │ │ │ ├── Slider.tsx │ │ │ │ │ ├── Slider.types.ts │ │ │ │ │ ├── SliderBase/ │ │ │ │ │ │ ├── SliderBase.module.scss │ │ │ │ │ │ ├── SliderBase.tsx │ │ │ │ │ │ ├── SliderFilledTrack.module.scss │ │ │ │ │ │ ├── SliderFilledTrack.tsx │ │ │ │ │ │ ├── SliderRail.module.scss │ │ │ │ │ │ ├── SliderRail.tsx │ │ │ │ │ │ ├── SliderThumb.module.scss │ │ │ │ │ │ ├── SliderThumb.tsx │ │ │ │ │ │ ├── SliderTrack.module.scss │ │ │ │ │ │ └── SliderTrack.tsx │ │ │ │ │ ├── SliderConstants.ts │ │ │ │ │ ├── SliderContext.tsx │ │ │ │ │ ├── SliderHelpers.ts │ │ │ │ │ ├── SliderHooks.ts │ │ │ │ │ ├── SliderInfix.module.scss │ │ │ │ │ ├── SliderInfix.tsx │ │ │ │ │ ├── SliderInfixHooks.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Slider-helpers.test.ts │ │ │ │ │ │ ├── Slider-non-ranged.test.tsx │ │ │ │ │ │ ├── Slider-ranged.test.tsx │ │ │ │ │ │ ├── Slider.snapshot.test.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ ├── Slider-non-ranged.test.jsx.snap │ │ │ │ │ │ │ ├── Slider-non-ranged.test.tsx.snap │ │ │ │ │ │ │ ├── Slider-ranged.test.jsx.snap │ │ │ │ │ │ │ ├── Slider-ranged.test.tsx.snap │ │ │ │ │ │ │ ├── Slider.snapshot.test.jsx.snap │ │ │ │ │ │ │ └── Slider.snapshot.test.tsx.snap │ │ │ │ │ │ └── sliderTestUtils.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── SplitButton/ │ │ │ │ │ ├── SplitButton.module.scss │ │ │ │ │ ├── SplitButton.tsx │ │ │ │ │ ├── SplitButtonConstants.ts │ │ │ │ │ ├── SplitButtonMenu/ │ │ │ │ │ │ ├── SplitButtonMenu.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── SplitButtonMenu.snapshot.test.tsx │ │ │ │ │ │ ├── SplitButtonMenu.test.tsx │ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ │ └── SplitButtonMenu.snapshot.test.tsx.snap │ │ │ │ │ │ └── test-utils.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── SplitButton.snapshot.test.tsx │ │ │ │ │ │ ├── SplitButton.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── SplitButton.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Steps/ │ │ │ │ │ ├── Steps.module.scss │ │ │ │ │ ├── Steps.tsx │ │ │ │ │ ├── Steps.types.ts │ │ │ │ │ ├── StepsCommand.module.scss │ │ │ │ │ ├── StepsCommand.tsx │ │ │ │ │ ├── StepsConstants.ts │ │ │ │ │ ├── StepsDot.module.scss │ │ │ │ │ ├── StepsDot.tsx │ │ │ │ │ ├── StepsGalleryHeader.module.scss │ │ │ │ │ ├── StepsGalleryHeader.tsx │ │ │ │ │ ├── StepsHeader.module.scss │ │ │ │ │ ├── StepsHeader.tsx │ │ │ │ │ ├── StepsNumbersHeader.module.scss │ │ │ │ │ ├── StepsNumbersHeader.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Steps.snapshot.test.tsx │ │ │ │ │ │ ├── Steps.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Steps.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Switch/ │ │ │ │ │ ├── Switch.module.scss │ │ │ │ │ ├── Switch.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Table/ │ │ │ │ │ ├── Table/ │ │ │ │ │ │ ├── Table.module.scss │ │ │ │ │ │ ├── Table.tsx │ │ │ │ │ │ ├── Table.types.ts │ │ │ │ │ │ ├── TableConsts.ts │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ ├── Table.test.tsx │ │ │ │ │ │ │ ├── TableHelpers.test.tsx │ │ │ │ │ │ │ └── tableTestUtils.tsx │ │ │ │ │ │ └── tableHelpers.ts │ │ │ │ │ ├── TableBody/ │ │ │ │ │ │ ├── TableBody.module.scss │ │ │ │ │ │ └── TableBody.tsx │ │ │ │ │ ├── TableCell/ │ │ │ │ │ │ ├── TableCell.module.scss │ │ │ │ │ │ └── TableCell.tsx │ │ │ │ │ ├── TableCellSkeleton/ │ │ │ │ │ │ ├── TableCellSkeleton.module.scss │ │ │ │ │ │ └── TableCellSkeleton.tsx │ │ │ │ │ ├── TableContainer/ │ │ │ │ │ │ ├── TableContainer.module.scss │ │ │ │ │ │ ├── TableContainer.tsx │ │ │ │ │ │ └── TableContainer.types.ts │ │ │ │ │ ├── TableHeader/ │ │ │ │ │ │ ├── TableHeader.module.scss │ │ │ │ │ │ └── TableHeader.tsx │ │ │ │ │ ├── TableHeaderCell/ │ │ │ │ │ │ ├── TableHeaderCell.module.scss │ │ │ │ │ │ └── TableHeaderCell.tsx │ │ │ │ │ ├── TableRow/ │ │ │ │ │ │ ├── TableRow.module.scss │ │ │ │ │ │ └── TableRow.tsx │ │ │ │ │ ├── TableRowMenu/ │ │ │ │ │ │ ├── TableRowMenu.module.scss │ │ │ │ │ │ ├── TableRowMenu.tsx │ │ │ │ │ │ └── TableRowMenu.types.ts │ │ │ │ │ ├── TableVirtualizedBody/ │ │ │ │ │ │ ├── TableVirtualizedBody.module.scss │ │ │ │ │ │ └── TableVirtualizedBody.tsx │ │ │ │ │ ├── context/ │ │ │ │ │ │ ├── TableContainerContext/ │ │ │ │ │ │ │ ├── TableContainerContext.tsx │ │ │ │ │ │ │ └── TableContainerContext.types.ts │ │ │ │ │ │ ├── TableContext/ │ │ │ │ │ │ │ ├── TableContext.tsx │ │ │ │ │ │ │ └── TableContext.types.ts │ │ │ │ │ │ └── TableRowMenuContext/ │ │ │ │ │ │ ├── TableRowMenuContext.tsx │ │ │ │ │ │ └── TableRowMenuContext.types.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── Tabs/ │ │ │ │ │ ├── Tab/ │ │ │ │ │ │ ├── Tab.module.scss │ │ │ │ │ │ ├── Tab.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── Tab.snapshot.test.tsx │ │ │ │ │ │ ├── Tab.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Tab.snapshot.test.tsx.snap │ │ │ │ │ ├── TabList/ │ │ │ │ │ │ ├── TabList.module.scss │ │ │ │ │ │ ├── TabList.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── TabList.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── TabList.snapshot.test.jsx.snap │ │ │ │ │ │ └── TabList.snapshot.test.tsx.snap │ │ │ │ │ ├── TabPanel/ │ │ │ │ │ │ ├── TabPanel.module.scss │ │ │ │ │ │ ├── TabPanel.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── TabPanel.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── TabPanel.snapshot.test.tsx.snap │ │ │ │ │ ├── TabPanels/ │ │ │ │ │ │ ├── TabPanels.module.scss │ │ │ │ │ │ ├── TabPanels.tsx │ │ │ │ │ │ ├── TabPanels.types.ts │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── TabPanels.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── TabPanels.snapshot.test.jsx.snap │ │ │ │ │ │ └── TabPanels.snapshot.test.tsx.snap │ │ │ │ │ ├── TabsContext/ │ │ │ │ │ │ ├── TabsContext.tsx │ │ │ │ │ │ └── __tests__/ │ │ │ │ │ │ ├── TabsContext.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── TabsContext.snapshot.test.jsx.snap │ │ │ │ │ │ └── TabsContext.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── TextArea/ │ │ │ │ │ ├── TextArea.module.scss │ │ │ │ │ ├── TextArea.tsx │ │ │ │ │ ├── TextArea.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── TextArea.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── TextField/ │ │ │ │ │ ├── TextField.module.scss │ │ │ │ │ ├── TextField.tsx │ │ │ │ │ ├── TextField.types.ts │ │ │ │ │ ├── TextFieldConstants.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── TextField-tests.test.tsx │ │ │ │ │ │ ├── TextField.snapshot.test.tsx │ │ │ │ │ │ ├── TextField.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── TextField.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── TextWithHighlight/ │ │ │ │ │ ├── TextWithHighlight.module.scss │ │ │ │ │ ├── TextWithHighlight.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── TextWithHighlight.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── TextWithHighlight.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── ThemeProvider/ │ │ │ │ │ ├── ThemeProvider.tsx │ │ │ │ │ ├── ThemeProvider.types.ts │ │ │ │ │ ├── ThemeProviderConstants.ts │ │ │ │ │ ├── ThemeProviderUtils.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── ThemeProvider.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── Tipseen/ │ │ │ │ │ ├── Tipseen.module.scss │ │ │ │ │ ├── Tipseen.tsx │ │ │ │ │ ├── Tipseen.types.ts │ │ │ │ │ ├── TipseenBasicContent.module.scss │ │ │ │ │ ├── TipseenBasicContent.tsx │ │ │ │ │ ├── TipseenConstants.ts │ │ │ │ │ ├── TipseenContent.module.scss │ │ │ │ │ ├── TipseenContent.tsx │ │ │ │ │ ├── TipseenMedia/ │ │ │ │ │ │ ├── TipseenMedia.module.scss │ │ │ │ │ │ └── TipseenMedia.tsx │ │ │ │ │ ├── TipseenTitle.module.scss │ │ │ │ │ ├── TipseenTitle.tsx │ │ │ │ │ ├── TipseenWizard.module.scss │ │ │ │ │ ├── TipseenWizard.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Tipseen.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Tipseen.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Toast/ │ │ │ │ │ ├── Toast.module.scss │ │ │ │ │ ├── Toast.tsx │ │ │ │ │ ├── Toast.types.ts │ │ │ │ │ ├── ToastButton/ │ │ │ │ │ │ └── ToastButton.tsx │ │ │ │ │ ├── ToastConstants.ts │ │ │ │ │ ├── ToastHelpers.tsx │ │ │ │ │ ├── ToastLink/ │ │ │ │ │ │ ├── ToastLink.module.scss │ │ │ │ │ │ └── ToastLink.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Toast.snapshot.test.tsx │ │ │ │ │ │ ├── Toast.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Toast.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── Toggle/ │ │ │ │ │ ├── MockToggle.module.scss │ │ │ │ │ ├── MockToggle.tsx │ │ │ │ │ ├── Toggle.module.scss │ │ │ │ │ ├── Toggle.tsx │ │ │ │ │ ├── Toggle.types.ts │ │ │ │ │ ├── ToggleConstants.ts │ │ │ │ │ ├── ToggleText.module.scss │ │ │ │ │ ├── ToggleText.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── Toggle.snapshot.test.tsx │ │ │ │ │ │ ├── Toggle.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ └── Toggle.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── TransitionView/ │ │ │ │ │ ├── TransitionView.module.scss │ │ │ │ │ ├── TransitionView.tsx │ │ │ │ │ ├── TransitionView.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── TransitionView.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── VirtualizedGrid/ │ │ │ │ │ ├── VirtualizedGrid.module.scss │ │ │ │ │ ├── VirtualizedGrid.tsx │ │ │ │ │ ├── VirtualizedGrid.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── VirtualizedGrid.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── VirtualizedGrid.test.jsx.snap │ │ │ │ │ │ └── VirtualizedGrid.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── VirtualizedList/ │ │ │ │ │ ├── VirtualizedList.module.scss │ │ │ │ │ ├── VirtualizedList.tsx │ │ │ │ │ ├── VirtualizedList.types.ts │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── VirtualizedList.snapshot.test.tsx │ │ │ │ │ │ └── __snapshots__/ │ │ │ │ │ │ ├── VirtualizedList.snapshot.test.jsx.snap │ │ │ │ │ │ └── VirtualizedList.snapshot.test.tsx.snap │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── next/ │ │ │ │ │ ├── List/ │ │ │ │ │ │ ├── List.module.scss │ │ │ │ │ │ ├── List.tsx │ │ │ │ │ │ ├── List.types.ts │ │ │ │ │ │ ├── ListItem/ │ │ │ │ │ │ │ ├── ListItem.tsx │ │ │ │ │ │ │ ├── ListItem.types.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── ListTitle/ │ │ │ │ │ │ │ ├── ListTitle.module.scss │ │ │ │ │ │ │ ├── ListTitle.tsx │ │ │ │ │ │ │ ├── ListTitle.types.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ │ └── List.test.tsx │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ └── next.ts │ │ │ ├── constants/ │ │ │ │ ├── index.ts │ │ │ │ ├── keyCodes.ts │ │ │ │ └── sizes.ts │ │ │ ├── helpers/ │ │ │ │ └── textManipulations.ts │ │ │ ├── hooks/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── useDebounceEvent.test.ts │ │ │ │ │ ├── useEventListener.test.ts │ │ │ │ │ └── useKeyEvent.test.ts │ │ │ │ ├── createEventHandler.ts │ │ │ │ ├── index.ts │ │ │ │ ├── useActiveDescendantListFocus/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useActiveDescendantListFocus.test.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── useActiveDescendantListFocusHelpers.ts │ │ │ │ │ └── useActiveDescendantListFocusHooks.ts │ │ │ │ ├── useAfterFirstRender/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useAfterFirstRender.test.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── useDebounceEvent/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useElementsOverflowingIndex.ts │ │ │ │ ├── useEventListener/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useFocusWithin.ts │ │ │ │ ├── useFullKeyboardListeners.ts │ │ │ │ ├── useGridKeyboardNavigation/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ ├── gridKeyboardNavigationHelper.test.ts │ │ │ │ │ │ └── useGridKeyboardNavigation.test.ts │ │ │ │ │ ├── gridKeyboardNavigationHelper.ts │ │ │ │ │ └── useGridKeyboardNavigation.ts │ │ │ │ ├── useHover/ │ │ │ │ │ └── useHover.ts │ │ │ │ ├── useIsMouseEnter.ts │ │ │ │ ├── useIsMouseOver.ts │ │ │ │ ├── useItemsOverflow/ │ │ │ │ │ └── useItemsOverflow.ts │ │ │ │ ├── useKeyEvent/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useKeyboard.ts │ │ │ │ ├── useListenFocusTriggers/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useMediaQuery/ │ │ │ │ │ └── index.ts │ │ │ │ ├── usePrevious/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useRefWithCallback.ts │ │ │ │ ├── useSetFocus/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useSetFocus.test.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── useStyle.ts │ │ │ │ ├── useSwitch/ │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── useSwitch.test.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── useThrottledCallback.ts │ │ │ │ ├── useTimeout/ │ │ │ │ │ └── index.ts │ │ │ │ ├── useVibeMediaQuery/ │ │ │ │ │ └── index.ts │ │ │ │ └── useWizard/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useWizard.test.ts │ │ │ │ ├── useWizard.ts │ │ │ │ └── useWizard.types.ts │ │ │ ├── index.ts │ │ │ ├── scripts/ │ │ │ │ └── generate-metadata.ts │ │ │ ├── services/ │ │ │ │ ├── themes.ts │ │ │ │ └── virtualized-service.ts │ │ │ ├── style-imports.ts │ │ │ ├── styles/ │ │ │ │ ├── _keyframes.scss │ │ │ │ ├── keyframes/ │ │ │ │ │ ├── pop/ │ │ │ │ │ │ ├── _pop-elastic.scss │ │ │ │ │ │ ├── _pop-in-elastic-bold.scss │ │ │ │ │ │ ├── _pop-in-elastic.scss │ │ │ │ │ │ ├── _pop-in-emphasized.scss │ │ │ │ │ │ ├── _pop-in-from-trigger.scss │ │ │ │ │ │ ├── _pop-in.scss │ │ │ │ │ │ └── _pop-out-from-trigger.scss │ │ │ │ │ ├── slide/ │ │ │ │ │ │ ├── _slide-in-elastic.scss │ │ │ │ │ │ ├── _slide-in.scss │ │ │ │ │ │ └── _slide-out.scss │ │ │ │ │ └── spin/ │ │ │ │ │ └── _spin-in-emphasized.scss │ │ │ │ ├── states.scss │ │ │ │ ├── typography.scss │ │ │ │ └── utilities/ │ │ │ │ └── _utilities-settings.scss │ │ │ ├── tests/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── test-utils.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── interactions-utils.ts │ │ │ │ └── test-ids-utils.ts │ │ │ ├── types/ │ │ │ │ ├── ArrayLastElement.ts │ │ │ │ ├── Colors.ts │ │ │ │ ├── ElementContent.ts │ │ │ │ ├── FormElement.ts │ │ │ │ ├── MoveBy.ts │ │ │ │ ├── SplitString.ts │ │ │ │ ├── VibeComponentProps.ts │ │ │ │ ├── events.ts │ │ │ │ └── index.ts │ │ │ └── utils/ │ │ │ ├── colors-utils.ts │ │ │ └── colors-vars-map.ts │ │ ├── tsconfig.base.json │ │ ├── tsconfig.json │ │ ├── types/ │ │ │ ├── files.d.ts │ │ │ ├── packages.d.ts │ │ │ ├── tokens.d.ts │ │ │ └── window.d.ts │ │ ├── vite.config.ts │ │ ├── vitest.config.ts │ │ └── vitest.setup.ts │ ├── docs/ │ │ ├── .storybook/ │ │ │ ├── art.ts │ │ │ ├── main.ts │ │ │ ├── manager-head.html │ │ │ ├── manager.jsx │ │ │ ├── modes.ts │ │ │ ├── preview-body.html │ │ │ ├── preview-head.html │ │ │ ├── preview.tsx │ │ │ ├── storybook-title-fix.js │ │ │ ├── test-runner.cjs │ │ │ ├── theme.js │ │ │ └── tsconfig.json │ │ ├── CHANGELOG.md │ │ ├── chromatic.config.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── decorators/ │ │ │ │ ├── withGlobalStyle/ │ │ │ │ │ ├── withGlobalStyle.module.scss │ │ │ │ │ └── withGlobalStyle.tsx │ │ │ │ ├── withLiveEdit/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── LiveContent/ │ │ │ │ │ │ │ ├── LiveContent.module.scss │ │ │ │ │ │ │ ├── LiveContent.tsx │ │ │ │ │ │ │ └── LiveContent.types.ts │ │ │ │ │ │ └── LiveEditorAction/ │ │ │ │ │ │ ├── LiveEditorAction.module.scss │ │ │ │ │ │ ├── LiveEditorAction.tsx │ │ │ │ │ │ └── LiveEditorAction.types.ts │ │ │ │ │ ├── hooks/ │ │ │ │ │ │ ├── useApplyDecorators.ts │ │ │ │ │ │ └── useLiveEditorActions.ts │ │ │ │ │ ├── utils/ │ │ │ │ │ │ ├── parse-csf-utils.ts │ │ │ │ │ │ └── prettier-utils.ts │ │ │ │ │ ├── withLiveEdit.module.scss │ │ │ │ │ └── withLiveEdit.tsx │ │ │ │ └── withPerformanceProfiler/ │ │ │ │ └── withPerformanceProfiler.tsx │ │ │ ├── layout/ │ │ │ │ ├── canvas-wrapper/ │ │ │ │ │ ├── CanvasWrapper.module.scss │ │ │ │ │ └── CanvasWrapper.tsx │ │ │ │ ├── footer/ │ │ │ │ │ ├── ArrowIcon.tsx │ │ │ │ │ ├── Footer.module.scss │ │ │ │ │ ├── Footer.tsx │ │ │ │ │ ├── FooterCard.module.scss │ │ │ │ │ └── FooterCard.tsx │ │ │ │ ├── live-editor/ │ │ │ │ │ └── LiveEditor.tsx │ │ │ │ ├── live-preview/ │ │ │ │ │ ├── LivePreview.module.scss │ │ │ │ │ └── LivePreview.tsx │ │ │ │ ├── props-table/ │ │ │ │ │ └── props-table.jsx │ │ │ │ ├── related-components/ │ │ │ │ │ ├── component-description-map.tsx │ │ │ │ │ ├── descriptions/ │ │ │ │ │ │ ├── accordion-description/ │ │ │ │ │ │ │ ├── accordion-description.module.scss │ │ │ │ │ │ │ └── accordion-description.tsx │ │ │ │ │ │ ├── alert-banner-description.tsx │ │ │ │ │ │ ├── attention-box-description.jsx │ │ │ │ │ │ ├── avatar-description.tsx │ │ │ │ │ │ ├── avatar-group-description.tsx │ │ │ │ │ │ ├── badge-description.tsx │ │ │ │ │ │ ├── box-description.tsx │ │ │ │ │ │ ├── breadcrumbs-description.tsx │ │ │ │ │ │ ├── button-description.tsx │ │ │ │ │ │ ├── button-group-description.tsx │ │ │ │ │ │ ├── checkbox-description.tsx │ │ │ │ │ │ ├── chips-description.tsx │ │ │ │ │ │ ├── clickable-description/ │ │ │ │ │ │ │ ├── clickable-description.stories.module.scss │ │ │ │ │ │ │ └── clickable-description.tsx │ │ │ │ │ │ ├── color-picker-description.tsx │ │ │ │ │ │ ├── colors-description/ │ │ │ │ │ │ │ ├── colors-description.scss │ │ │ │ │ │ │ └── colors-description.tsx │ │ │ │ │ │ ├── combobox-description.tsx │ │ │ │ │ │ ├── counter-description.tsx │ │ │ │ │ │ ├── dialog-content-container.tsx │ │ │ │ │ │ ├── dialog-description/ │ │ │ │ │ │ │ ├── dialog-description.module.scss │ │ │ │ │ │ │ └── dialog-description.tsx │ │ │ │ │ │ ├── divider.tsx │ │ │ │ │ │ ├── dropdown-description.tsx │ │ │ │ │ │ ├── editable-heading-description.tsx │ │ │ │ │ │ ├── editable-text-description.tsx │ │ │ │ │ │ ├── expand-collapse-description/ │ │ │ │ │ │ │ ├── expand-collapse-description.module.scss │ │ │ │ │ │ │ └── expand-collapse-description.tsx │ │ │ │ │ │ ├── flex-description.tsx │ │ │ │ │ │ ├── heading-description.tsx │ │ │ │ │ │ ├── icon-button-description.tsx │ │ │ │ │ │ ├── icon-description.tsx │ │ │ │ │ │ ├── icons-description.tsx │ │ │ │ │ │ ├── label-description.tsx │ │ │ │ │ │ ├── linear-progress-bar-description.tsx │ │ │ │ │ │ ├── link-description.tsx │ │ │ │ │ │ ├── list-description.tsx │ │ │ │ │ │ ├── menu-button-description.tsx │ │ │ │ │ │ ├── menu-description.tsx │ │ │ │ │ │ ├── menu-grid-item-description.tsx │ │ │ │ │ │ ├── modal/ │ │ │ │ │ │ │ ├── ModalBasicLayoutRelatedComponent.tsx │ │ │ │ │ │ │ ├── ModalMediaLayoutRelatedComponent.tsx │ │ │ │ │ │ │ └── ModalSideBySideLayoutRelatedComponent.tsx │ │ │ │ │ │ ├── multi-step-indicator-description.tsx │ │ │ │ │ │ ├── number-field-description.tsx │ │ │ │ │ │ ├── radio-button-description.tsx │ │ │ │ │ │ ├── search-description.tsx │ │ │ │ │ │ ├── shadow-description/ │ │ │ │ │ │ │ ├── shadow-description.module.scss │ │ │ │ │ │ │ └── shadow-description.tsx │ │ │ │ │ │ ├── skeleton-description.tsx │ │ │ │ │ │ ├── slider-description.tsx │ │ │ │ │ │ ├── spacing-description/ │ │ │ │ │ │ │ ├── spacing-description.module.scss │ │ │ │ │ │ │ └── spacing-description.tsx │ │ │ │ │ │ ├── spinner-description.tsx │ │ │ │ │ │ ├── split-button-description.tsx │ │ │ │ │ │ ├── steps-description.tsx │ │ │ │ │ │ ├── tab-description.tsx │ │ │ │ │ │ ├── table-description.tsx │ │ │ │ │ │ ├── text-description.tsx │ │ │ │ │ │ ├── text-field-description.tsx │ │ │ │ │ │ ├── tipseen-description.tsx │ │ │ │ │ │ ├── toast-description.tsx │ │ │ │ │ │ ├── toggle-description.tsx │ │ │ │ │ │ ├── tooltip-description.tsx │ │ │ │ │ │ ├── typography-description/ │ │ │ │ │ │ │ └── typography-description.tsx │ │ │ │ │ │ ├── virtualized-grid-description/ │ │ │ │ │ │ │ ├── virtualized-grid-description.jsx │ │ │ │ │ │ │ └── virtualizedGrid.module.scss │ │ │ │ │ │ └── virtualized-list-description/ │ │ │ │ │ │ ├── virtualized-list-description.jsx │ │ │ │ │ │ └── virtualized-list.module.scss │ │ │ │ │ └── related-components-decorator.jsx │ │ │ │ └── toc/ │ │ │ │ ├── TableOfContents.module.scss │ │ │ │ └── TableOfContents.tsx │ │ │ ├── pages/ │ │ │ │ ├── catalog/ │ │ │ │ │ ├── Catalog.stories.templates.tsx │ │ │ │ │ ├── EmptyState/ │ │ │ │ │ │ ├── CatalogEmptyState.module.scss │ │ │ │ │ │ └── CatalogEmptyState.tsx │ │ │ │ │ ├── catalog.mdx │ │ │ │ │ └── catalog.stories.tsx │ │ │ │ ├── changelog/ │ │ │ │ │ └── changelog.mdx │ │ │ │ ├── components/ │ │ │ │ │ ├── Accordion/ │ │ │ │ │ │ ├── Accordion.interactions.ts │ │ │ │ │ │ ├── Accordion.mdx │ │ │ │ │ │ └── Accordion.stories.tsx │ │ │ │ │ ├── AlertBanner/ │ │ │ │ │ │ ├── AlertBanner.mdx │ │ │ │ │ │ ├── AlertBanner.stories.helpers.tsx │ │ │ │ │ │ └── AlertBanner.stories.tsx │ │ │ │ │ ├── AttentionBox/ │ │ │ │ │ │ ├── AttentionBox.mdx │ │ │ │ │ │ └── AttentionBox.stories.tsx │ │ │ │ │ ├── Avatar/ │ │ │ │ │ │ ├── Avatar.mdx │ │ │ │ │ │ ├── Avatar.stories.helpers.tsx │ │ │ │ │ │ ├── Avatar.stories.scss │ │ │ │ │ │ └── Avatar.stories.tsx │ │ │ │ │ ├── AvatarGroup/ │ │ │ │ │ │ ├── AvatarGroup.mdx │ │ │ │ │ │ └── AvatarGroup.stories.tsx │ │ │ │ │ ├── Badge/ │ │ │ │ │ │ ├── Badge.mdx │ │ │ │ │ │ └── Badge.stories.tsx │ │ │ │ │ ├── BaseInput/ │ │ │ │ │ │ └── BaseInput.stories.tsx │ │ │ │ │ ├── BaseList/ │ │ │ │ │ │ └── BaseList.stories.tsx │ │ │ │ │ ├── Box/ │ │ │ │ │ │ ├── Box.mdx │ │ │ │ │ │ ├── Box.stories.helpers.tsx │ │ │ │ │ │ └── Box.stories.tsx │ │ │ │ │ ├── BreadcrumbsBar/ │ │ │ │ │ │ ├── BreadcrumbItem.mdx │ │ │ │ │ │ ├── BreadcrumbItem.stories.scss │ │ │ │ │ │ ├── BreadcrumbItem.stories.tsx │ │ │ │ │ │ ├── BreadcrumbsBar.mdx │ │ │ │ │ │ ├── BreadcrumbsBar.stories.helpers.tsx │ │ │ │ │ │ ├── BreadcrumbsBar.stories.module.scss │ │ │ │ │ │ └── BreadcrumbsBar.stories.tsx │ │ │ │ │ ├── Button/ │ │ │ │ │ │ ├── Button.mdx │ │ │ │ │ │ ├── Button.stories.helpers.tsx │ │ │ │ │ │ └── Button.stories.tsx │ │ │ │ │ ├── ButtonGroup/ │ │ │ │ │ │ ├── ButtonGroup.mdx │ │ │ │ │ │ ├── ButtonGroup.stories.helpers.tsx │ │ │ │ │ │ ├── ButtonGroup.stories.tsx │ │ │ │ │ │ └── assets/ │ │ │ │ │ │ └── Desktop.tsx │ │ │ │ │ ├── Checkbox/ │ │ │ │ │ │ ├── Checkbox.mdx │ │ │ │ │ │ ├── Checkbox.stories.helpers.tsx │ │ │ │ │ │ ├── Checkbox.stories.scss │ │ │ │ │ │ └── Checkbox.stories.tsx │ │ │ │ │ ├── Chips/ │ │ │ │ │ │ ├── Chips.mdx │ │ │ │ │ │ ├── Chips.stories.helpers.tsx │ │ │ │ │ │ └── Chips.stories.tsx │ │ │ │ │ ├── Clickable/ │ │ │ │ │ │ ├── Clickable.interactions.ts │ │ │ │ │ │ ├── Clickable.mdx │ │ │ │ │ │ ├── Clickable.stories.helpers.tsx │ │ │ │ │ │ └── Clickable.stories.tsx │ │ │ │ │ ├── ColorPicker/ │ │ │ │ │ │ ├── ColorPicker.interactions.ts │ │ │ │ │ │ ├── ColorPicker.mdx │ │ │ │ │ │ └── ColorPicker.stories.tsx │ │ │ │ │ ├── Combobox/ │ │ │ │ │ │ ├── Combobox.interactions.ts │ │ │ │ │ │ ├── Combobox.mdx │ │ │ │ │ │ ├── Combobox.stories.helpers.tsx │ │ │ │ │ │ ├── Combobox.stories.tsx │ │ │ │ │ │ └── combobox-migration-guide.mdx │ │ │ │ │ ├── Counter/ │ │ │ │ │ │ ├── Counter.mdx │ │ │ │ │ │ ├── Counter.stories.helpers.tsx │ │ │ │ │ │ └── Counter.stories.tsx │ │ │ │ │ ├── DatePicker/ │ │ │ │ │ │ ├── DatePicker.mdx │ │ │ │ │ │ └── DatePicker.stories.tsx │ │ │ │ │ ├── Dialog/ │ │ │ │ │ │ ├── Dialog.interactions.ts │ │ │ │ │ │ ├── Dialog.mdx │ │ │ │ │ │ ├── Dialog.stories.helpers.tsx │ │ │ │ │ │ ├── Dialog.stories.tsx │ │ │ │ │ │ ├── DialogContentContainer.mdx │ │ │ │ │ │ └── DialogContentContainer.stories.tsx │ │ │ │ │ ├── Divider/ │ │ │ │ │ │ ├── Divider.mdx │ │ │ │ │ │ └── Divider.stories.tsx │ │ │ │ │ ├── Dropdown/ │ │ │ │ │ │ ├── Dropdown.mdx │ │ │ │ │ │ ├── DropdownBasicDropdown.mdx │ │ │ │ │ │ ├── DropdownBasicDropdown.stories.tsx │ │ │ │ │ │ ├── DropdownBoxMode.mdx │ │ │ │ │ │ ├── DropdownBoxMode.stories.tsx │ │ │ │ │ │ └── dropdown-migration-guide.mdx │ │ │ │ │ ├── EditableHeading/ │ │ │ │ │ │ ├── EditableHeading.interactions.ts │ │ │ │ │ │ ├── EditableHeading.mdx │ │ │ │ │ │ ├── EditableHeading.stories.helpers.tsx │ │ │ │ │ │ └── EditableHeading.stories.tsx │ │ │ │ │ ├── EditableText/ │ │ │ │ │ │ ├── EditableText.interactions.ts │ │ │ │ │ │ ├── EditableText.mdx │ │ │ │ │ │ ├── EditableText.stories.helpers.tsx │ │ │ │ │ │ └── EditableText.stories.tsx │ │ │ │ │ ├── EmptyState/ │ │ │ │ │ │ ├── EmptyState.mdx │ │ │ │ │ │ ├── EmptyState.stories.helpers.tsx │ │ │ │ │ │ ├── EmptyState.stories.module.scss │ │ │ │ │ │ └── EmptyState.stories.tsx │ │ │ │ │ ├── ExpandCollapse/ │ │ │ │ │ │ ├── ExpandCollapse.mdx │ │ │ │ │ │ ├── ExpandCollapse.stories.helpers.tsx │ │ │ │ │ │ └── ExpandCollapse.stories.tsx │ │ │ │ │ ├── Flex/ │ │ │ │ │ │ ├── Flex.mdx │ │ │ │ │ │ └── Flex.stories.tsx │ │ │ │ │ ├── GridKeyboardNavigationContext/ │ │ │ │ │ │ ├── useGridKeyboardNavigationContext.interactions.ts │ │ │ │ │ │ ├── useGridKeyboardNavigationContext.mdx │ │ │ │ │ │ ├── useGridKeyboardNavigationContext.stories.helpers.tsx │ │ │ │ │ │ ├── useGridKeyboardNavigationContext.stories.scss │ │ │ │ │ │ └── useGridKeyboardNavigationContext.stories.tsx │ │ │ │ │ ├── Heading/ │ │ │ │ │ │ ├── Heading.interactions.ts │ │ │ │ │ │ ├── Heading.mdx │ │ │ │ │ │ ├── Heading.stories.helpers.tsx │ │ │ │ │ │ └── Heading.stories.tsx │ │ │ │ │ ├── HiddenText/ │ │ │ │ │ │ ├── HiddenText.mdx │ │ │ │ │ │ └── HiddenText.stories.tsx │ │ │ │ │ ├── Icon/ │ │ │ │ │ │ ├── Icon.mdx │ │ │ │ │ │ └── Icon.stories.tsx │ │ │ │ │ ├── IconButton/ │ │ │ │ │ │ ├── IconButton.mdx │ │ │ │ │ │ ├── IconButton.stories.helpers.tsx │ │ │ │ │ │ └── IconButton.stories.tsx │ │ │ │ │ ├── Info/ │ │ │ │ │ │ ├── Info.mdx │ │ │ │ │ │ ├── Info.stories.module.scss │ │ │ │ │ │ └── Info.stories.tsx │ │ │ │ │ ├── Label/ │ │ │ │ │ │ ├── Label.mdx │ │ │ │ │ │ ├── Label.stories.helpers.tsx │ │ │ │ │ │ └── Label.stories.tsx │ │ │ │ │ ├── Link/ │ │ │ │ │ │ ├── Example.module.scss │ │ │ │ │ │ ├── Example.tsx │ │ │ │ │ │ ├── Link.mdx │ │ │ │ │ │ ├── Link.stories.helpers.tsx │ │ │ │ │ │ └── Link.stories.tsx │ │ │ │ │ ├── List/ │ │ │ │ │ │ ├── List.mdx │ │ │ │ │ │ ├── List.stories.helpers.tsx │ │ │ │ │ │ ├── List.stories.tsx │ │ │ │ │ │ ├── ListItem.mdx │ │ │ │ │ │ ├── ListItem.stories.tsx │ │ │ │ │ │ └── legacy/ │ │ │ │ │ │ ├── List.mdx │ │ │ │ │ │ ├── List.stories.helpers.tsx │ │ │ │ │ │ ├── List.stories.tsx │ │ │ │ │ │ ├── ListItem.mdx │ │ │ │ │ │ └── ListItem.stories.tsx │ │ │ │ │ ├── Loader/ │ │ │ │ │ │ ├── Loader.mdx │ │ │ │ │ │ ├── Loader.stories.helpers.tsx │ │ │ │ │ │ └── Loader.stories.tsx │ │ │ │ │ ├── Menu/ │ │ │ │ │ │ ├── Menu.interactions.ts │ │ │ │ │ │ ├── Menu.mdx │ │ │ │ │ │ ├── Menu.stories.helpers.tsx │ │ │ │ │ │ ├── Menu.stories.tsx │ │ │ │ │ │ ├── MenuDivider.mdx │ │ │ │ │ │ ├── MenuDivider.stories.tsx │ │ │ │ │ │ ├── MenuGridItem.mdx │ │ │ │ │ │ ├── MenuGridItem.stories.helpers.tsx │ │ │ │ │ │ ├── MenuGridItem.stories.scss │ │ │ │ │ │ ├── MenuGridItem.stories.tsx │ │ │ │ │ │ ├── MenuItem.mdx │ │ │ │ │ │ ├── MenuItem.stories.helpers.tsx │ │ │ │ │ │ ├── MenuItem.stories.tsx │ │ │ │ │ │ ├── MenuItemButton.mdx │ │ │ │ │ │ ├── MenuItemButton.stories.helpers.tsx │ │ │ │ │ │ ├── MenuItemButton.stories.tsx │ │ │ │ │ │ ├── MenuTitle.mdx │ │ │ │ │ │ └── MenuTitle.stories.tsx │ │ │ │ │ ├── MenuButton/ │ │ │ │ │ │ ├── MenuButton.mdx │ │ │ │ │ │ └── MenuButton.stories.tsx │ │ │ │ │ ├── Modal/ │ │ │ │ │ │ ├── Modal.mdx │ │ │ │ │ │ ├── Modal.stories.helpers.tsx │ │ │ │ │ │ ├── Modal.stories.module.scss │ │ │ │ │ │ ├── ModalBasicLayout.mdx │ │ │ │ │ │ ├── ModalBasicLayout.stories.helpers.tsx │ │ │ │ │ │ ├── ModalBasicLayout.stories.tsx │ │ │ │ │ │ ├── ModalMediaLayout.mdx │ │ │ │ │ │ ├── ModalMediaLayout.stories.helpers.tsx │ │ │ │ │ │ ├── ModalMediaLayout.stories.tsx │ │ │ │ │ │ ├── ModalSideBySideLayout.mdx │ │ │ │ │ │ ├── ModalSideBySideLayout.stories.helpers.tsx │ │ │ │ │ │ └── ModalSideBySideLayout.stories.tsx │ │ │ │ │ ├── MultiStepIndicator/ │ │ │ │ │ │ ├── MultiStepIndicator.mdx │ │ │ │ │ │ ├── MultiStepIndicator.stories.helpers.tsx │ │ │ │ │ │ └── MultiStepIndicator.stories.tsx │ │ │ │ │ ├── NumberField/ │ │ │ │ │ │ ├── NumberField.mdx │ │ │ │ │ │ └── NumberField.stories.tsx │ │ │ │ │ ├── ProgressBars/ │ │ │ │ │ │ ├── ProgressBar.mdx │ │ │ │ │ │ ├── ProgressBar.stories.helpers.tsx │ │ │ │ │ │ └── ProgressBar.stories.tsx │ │ │ │ │ ├── RadioButton/ │ │ │ │ │ │ ├── RadioButton.interactions.ts │ │ │ │ │ │ ├── RadioButton.mdx │ │ │ │ │ │ ├── RadioButton.stories.helpers.tsx │ │ │ │ │ │ └── RadioButton.stories.tsx │ │ │ │ │ ├── Search/ │ │ │ │ │ │ ├── Search.mdx │ │ │ │ │ │ ├── Search.stories.module.scss │ │ │ │ │ │ └── Search.stories.tsx │ │ │ │ │ ├── Skeleton/ │ │ │ │ │ │ ├── Skeleton.mdx │ │ │ │ │ │ ├── Skeleton.stories.helpers.tsx │ │ │ │ │ │ └── Skeleton.stories.tsx │ │ │ │ │ ├── Slider/ │ │ │ │ │ │ ├── Slider.interactions.ts │ │ │ │ │ │ ├── Slider.mdx │ │ │ │ │ │ ├── Slider.stories.helpers.tsx │ │ │ │ │ │ └── Slider.stories.tsx │ │ │ │ │ ├── SplitButton/ │ │ │ │ │ │ ├── SplitButton.mdx │ │ │ │ │ │ ├── SplitButton.stories.helpers.tsx │ │ │ │ │ │ └── SplitButton.stories.tsx │ │ │ │ │ ├── Steps/ │ │ │ │ │ │ ├── Steps.mdx │ │ │ │ │ │ ├── Steps.stories.helpers.tsx │ │ │ │ │ │ └── Steps.stories.tsx │ │ │ │ │ ├── Table/ │ │ │ │ │ │ ├── Table.mdx │ │ │ │ │ │ ├── Table.stories.helpers.tsx │ │ │ │ │ │ └── Table.stories.tsx │ │ │ │ │ ├── Tabs/ │ │ │ │ │ │ ├── Tabs.mdx │ │ │ │ │ │ ├── Tabs.stories.helpers.tsx │ │ │ │ │ │ └── Tabs.stories.tsx │ │ │ │ │ ├── Text/ │ │ │ │ │ │ ├── Text.interactions.ts │ │ │ │ │ │ ├── Text.mdx │ │ │ │ │ │ ├── Text.stories.helpers.tsx │ │ │ │ │ │ └── Text.stories.tsx │ │ │ │ │ ├── TextArea/ │ │ │ │ │ │ ├── TextArea.mdx │ │ │ │ │ │ └── TextArea.stories.tsx │ │ │ │ │ ├── TextField/ │ │ │ │ │ │ ├── TextField.mdx │ │ │ │ │ │ └── TextField.stories.tsx │ │ │ │ │ ├── TextWithHighlight/ │ │ │ │ │ │ ├── TextWithHighlight.mdx │ │ │ │ │ │ └── TextWithHighlight.stories.tsx │ │ │ │ │ ├── ThemeProvider/ │ │ │ │ │ │ ├── ThemeProvider.interactions.ts │ │ │ │ │ │ ├── ThemeProvider.mdx │ │ │ │ │ │ ├── ThemeProvider.stories.helpers.tsx │ │ │ │ │ │ ├── ThemeProvider.stories.tsx │ │ │ │ │ │ └── product-themes/ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── product-theme-1.ts │ │ │ │ │ │ ├── product-theme-2.ts │ │ │ │ │ │ ├── product-theme-3.ts │ │ │ │ │ │ └── product-theme-4.ts │ │ │ │ │ ├── Tipseen/ │ │ │ │ │ │ ├── Tipseen.mdx │ │ │ │ │ │ ├── Tipseen.stories.helpers.tsx │ │ │ │ │ │ └── Tipseen.stories.tsx │ │ │ │ │ ├── Toast/ │ │ │ │ │ │ ├── Toast.mdx │ │ │ │ │ │ ├── Toast.stories.helpers.tsx │ │ │ │ │ │ └── Toast.stories.tsx │ │ │ │ │ ├── Toggle/ │ │ │ │ │ │ ├── Toggle.mdx │ │ │ │ │ │ ├── Toggle.stories.helpers.tsx │ │ │ │ │ │ └── Toggle.stories.tsx │ │ │ │ │ ├── Tooltip/ │ │ │ │ │ │ ├── Tooltip.interactions.ts │ │ │ │ │ │ ├── Tooltip.mdx │ │ │ │ │ │ ├── Tooltip.stories.helpers.tsx │ │ │ │ │ │ └── Tooltip.stories.tsx │ │ │ │ │ ├── VirtualizedGrid/ │ │ │ │ │ │ ├── VirtualizedGrid.mdx │ │ │ │ │ │ ├── VirtualizedGrid.stories.helpers.tsx │ │ │ │ │ │ └── VirtualizedGrid.stories.tsx │ │ │ │ │ └── VirtualizedList/ │ │ │ │ │ ├── VirtualizedList.mdx │ │ │ │ │ ├── VirtualizedList.stories.helpers.tsx │ │ │ │ │ └── VirtualizedList.stories.tsx │ │ │ │ ├── contributing/ │ │ │ │ │ └── contributing.mdx │ │ │ │ ├── foundations/ │ │ │ │ │ ├── accessibility/ │ │ │ │ │ │ ├── accessibility.mdx │ │ │ │ │ │ ├── accessibility.stories.helpers.tsx │ │ │ │ │ │ ├── accessibility.stories.module.scss │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ └── principles/ │ │ │ │ │ │ ├── principle.scss │ │ │ │ │ │ ├── principle.tsx │ │ │ │ │ │ ├── principlesAccesability.scss │ │ │ │ │ │ └── principlesAccesability.tsx │ │ │ │ │ ├── colors/ │ │ │ │ │ │ ├── Colors.mdx │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── background-colors/ │ │ │ │ │ │ │ └── background-colors.tsx │ │ │ │ │ │ ├── border-colors/ │ │ │ │ │ │ │ └── border-colors.tsx │ │ │ │ │ │ ├── colors-description/ │ │ │ │ │ │ │ └── colors-description.tsx │ │ │ │ │ │ ├── colors.module.scss │ │ │ │ │ │ ├── colors.stories.tsx │ │ │ │ │ │ ├── content-color-cell/ │ │ │ │ │ │ │ ├── content-color-cell.module.scss │ │ │ │ │ │ │ └── content-color-cell.tsx │ │ │ │ │ │ ├── content-color-row/ │ │ │ │ │ │ │ └── content-color-row.tsx │ │ │ │ │ │ ├── content-colors/ │ │ │ │ │ │ │ ├── content-colors.module.scss │ │ │ │ │ │ │ └── content-colors.tsx │ │ │ │ │ │ ├── semantic-colors/ │ │ │ │ │ │ │ └── semantic-colors.tsx │ │ │ │ │ │ └── text-colors/ │ │ │ │ │ │ └── text-colors.jsx │ │ │ │ │ ├── motion/ │ │ │ │ │ │ ├── animation-information-box/ │ │ │ │ │ │ │ ├── animation-information-box.module.scss │ │ │ │ │ │ │ └── animation-information-box.tsx │ │ │ │ │ │ ├── animation-overviews/ │ │ │ │ │ │ │ ├── animation-overviews.module.scss │ │ │ │ │ │ │ └── animation-overviews.tsx │ │ │ │ │ │ ├── animation-types/ │ │ │ │ │ │ │ ├── animation-types.module.scss │ │ │ │ │ │ │ └── animation-types.tsx │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── duration-expressive-tokens/ │ │ │ │ │ │ │ ├── duaration-expressive-tokens.module.scss │ │ │ │ │ │ │ └── duration-expressive-tokens.tsx │ │ │ │ │ │ ├── duration-productive-tokens/ │ │ │ │ │ │ │ ├── duaration-productive-tokens.module.scss │ │ │ │ │ │ │ └── duration-productive-tokens.tsx │ │ │ │ │ │ ├── duration-token-table/ │ │ │ │ │ │ │ └── duration-token-table.tsx │ │ │ │ │ │ ├── easing-overview/ │ │ │ │ │ │ │ ├── easing-overview.module.scss │ │ │ │ │ │ │ └── easing-overview.tsx │ │ │ │ │ │ ├── easing-overviews/ │ │ │ │ │ │ │ ├── easing-overviews.module.scss │ │ │ │ │ │ │ └── easing-overviews.tsx │ │ │ │ │ │ ├── easing-token-table/ │ │ │ │ │ │ │ └── easing-token-table.tsx │ │ │ │ │ │ ├── motion.mdx │ │ │ │ │ │ └── token-Information-box/ │ │ │ │ │ │ └── token-information-box.tsx │ │ │ │ │ ├── round-corners/ │ │ │ │ │ │ ├── corners-settings/ │ │ │ │ │ │ │ ├── corner-settings.scss │ │ │ │ │ │ │ └── corner-settings.tsx │ │ │ │ │ │ ├── round-corners.mdx │ │ │ │ │ │ ├── round-corners.stories.module.scss │ │ │ │ │ │ └── rounded-corner/ │ │ │ │ │ │ ├── rounded-corner.module.scss │ │ │ │ │ │ └── rounded-corner.tsx │ │ │ │ │ ├── shadow/ │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── card-shadow-example/ │ │ │ │ │ │ │ ├── card-shadow-example.module.scss │ │ │ │ │ │ │ └── card-shadow-example.tsx │ │ │ │ │ │ ├── drag-shadow-example/ │ │ │ │ │ │ │ ├── drag-shadow-example.module.scss │ │ │ │ │ │ │ └── drag-shadow-example.tsx │ │ │ │ │ │ ├── shadow-levels/ │ │ │ │ │ │ │ ├── shadow-example/ │ │ │ │ │ │ │ │ ├── shadow-example.module.scss │ │ │ │ │ │ │ │ └── shadow-example.tsx │ │ │ │ │ │ │ ├── shadow-levels.scss │ │ │ │ │ │ │ └── shadow-levels.tsx │ │ │ │ │ │ ├── shadow.mdx │ │ │ │ │ │ └── shadow.scss │ │ │ │ │ ├── spacing/ │ │ │ │ │ │ ├── Spacing.mdx │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── spacing-sizes/ │ │ │ │ │ │ │ └── spacing-sizes.tsx │ │ │ │ │ │ ├── spacing-token-name/ │ │ │ │ │ │ │ ├── spacing-token-name.tsx │ │ │ │ │ │ │ └── spacing-usage-examples.module.scss │ │ │ │ │ │ ├── spacing-usage-examples/ │ │ │ │ │ │ │ ├── spacing-usage-examples.module.scss │ │ │ │ │ │ │ └── spacing-usage-examples.tsx │ │ │ │ │ │ ├── spacing.module.scss │ │ │ │ │ │ └── spacing.stories.tsx │ │ │ │ │ ├── typography/ │ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ ├── examples-table/ │ │ │ │ │ │ │ ├── example-table.module.scss │ │ │ │ │ │ │ └── examples-table.tsx │ │ │ │ │ │ ├── typograpghy.stories.helpers.tsx │ │ │ │ │ │ ├── typography.mdx │ │ │ │ │ │ └── typography.module.scss │ │ │ │ │ └── ux-writing-handbook/ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── ux-writing-handbook.mdx │ │ │ │ │ ├── ux-writing-handbook.stories.module.scss │ │ │ │ │ └── values/ │ │ │ │ │ ├── rulesUXWriting.tsx │ │ │ │ │ ├── values.module.scss │ │ │ │ │ ├── values.tsx │ │ │ │ │ ├── valuesUXWriting.module.scss │ │ │ │ │ └── valuesUXWriting.tsx │ │ │ │ ├── getting-started/ │ │ │ │ │ └── getting-started.mdx │ │ │ │ ├── hooks/ │ │ │ │ │ ├── useActiveDescendantListFocus/ │ │ │ │ │ │ ├── useActiveDescendantListFocus.interactions.ts │ │ │ │ │ │ ├── useActiveDescendantListFocus.mdx │ │ │ │ │ │ ├── useActiveDescendantListFocus.module.scss │ │ │ │ │ │ └── useActiveDescendantListFocus.stories.tsx │ │ │ │ │ ├── useAfterFirstRender/ │ │ │ │ │ │ ├── useAfterFirstRender.mdx │ │ │ │ │ │ └── useAfterFirstRender.stories.tsx │ │ │ │ │ ├── useClickOutside/ │ │ │ │ │ │ ├── useClickOutside.mdx │ │ │ │ │ │ └── useClickOutside.stories.tsx │ │ │ │ │ ├── useClickableProps/ │ │ │ │ │ │ ├── useClickableProps.mdx │ │ │ │ │ │ ├── useClickableProps.stories.helpers.tsx │ │ │ │ │ │ ├── useClickableProps.stories.scss │ │ │ │ │ │ └── useClickableProps.stories.tsx │ │ │ │ │ ├── useDebounceEvent/ │ │ │ │ │ │ ├── useDebounceEvent.mdx │ │ │ │ │ │ └── useDebounceEvent.stories.tsx │ │ │ │ │ ├── useEventListener/ │ │ │ │ │ │ ├── useEventListener.mdx │ │ │ │ │ │ └── useEventListener.stories.tsx │ │ │ │ │ ├── useGridKeyboardNavigation/ │ │ │ │ │ │ ├── useGridKeyboardNavigation.mdx │ │ │ │ │ │ ├── useGridKeyboardNavigation.stories.scss │ │ │ │ │ │ └── useGridKeyboardNavigation.stories.tsx │ │ │ │ │ ├── useHover/ │ │ │ │ │ │ ├── useHover.mdx │ │ │ │ │ │ └── useHover.stories.tsx │ │ │ │ │ ├── useIsOverflowing/ │ │ │ │ │ │ ├── useIsOverflowing.mdx │ │ │ │ │ │ ├── useIsOverflowing.stories.helpers.tsx │ │ │ │ │ │ ├── useIsOverflowing.stories.module.scss │ │ │ │ │ │ └── useIsOverflowing.stories.tsx │ │ │ │ │ ├── useKeyEvent/ │ │ │ │ │ │ ├── useKeyEvent.mdx │ │ │ │ │ │ └── useKeyEvent.stories.tsx │ │ │ │ │ ├── useMediaQuery/ │ │ │ │ │ │ ├── useMediaQuery.mdx │ │ │ │ │ │ └── useMediaQuery.stories.tsx │ │ │ │ │ ├── usePrevious/ │ │ │ │ │ │ ├── usePrevious.mdx │ │ │ │ │ │ ├── usePrevious.stories.module.scss │ │ │ │ │ │ └── usePrevious.stories.tsx │ │ │ │ │ ├── useSetFocus/ │ │ │ │ │ │ ├── useSetFocus.mdx │ │ │ │ │ │ ├── useSetFocus.stories.module.scss │ │ │ │ │ │ └── useSetFocus.stories.tsx │ │ │ │ │ ├── useSwitch/ │ │ │ │ │ │ ├── useSwitch.mdx │ │ │ │ │ │ └── useSwitch.stories.tsx │ │ │ │ │ ├── useTimeout/ │ │ │ │ │ │ ├── useTimeout.mdx │ │ │ │ │ │ └── useTimeout.stories.tsx │ │ │ │ │ ├── useVibeMediaQuery/ │ │ │ │ │ │ ├── useVibeMediaQuery.mdx │ │ │ │ │ │ ├── useVibeMediaQuery.stories.helpers.tsx │ │ │ │ │ │ └── useVibeMediaQuery.stories.tsx │ │ │ │ │ └── useWizard/ │ │ │ │ │ ├── useWizard.mdx │ │ │ │ │ ├── useWizard.stories.module.scss │ │ │ │ │ └── useWizard.stories.tsx │ │ │ │ ├── mcp/ │ │ │ │ │ └── mcp.mdx │ │ │ │ ├── migration-guide/ │ │ │ │ │ ├── DiffCodeBlock.tsx │ │ │ │ │ ├── vibe-3-changelog.md │ │ │ │ │ ├── vibe-4-changelog.md │ │ │ │ │ ├── vibe-4-migration-guide.mdx │ │ │ │ │ └── vibe2-migration-guide.md │ │ │ │ ├── playground/ │ │ │ │ │ ├── Playground.stories.ts │ │ │ │ │ ├── playground-helpers.ts │ │ │ │ │ └── react-docgen-output.json │ │ │ │ └── welcome/ │ │ │ │ ├── EntranceAnimation.tsx │ │ │ │ ├── Section.module.scss │ │ │ │ ├── Section.tsx │ │ │ │ ├── Title.module.scss │ │ │ │ ├── Title.tsx │ │ │ │ ├── banner/ │ │ │ │ │ ├── Vibe4Banner.module.scss │ │ │ │ │ └── Vibe4Banner.tsx │ │ │ │ ├── contributions/ │ │ │ │ │ ├── Contributor.module.scss │ │ │ │ │ ├── Contributor.tsx │ │ │ │ │ ├── Contributors.module.scss │ │ │ │ │ ├── Contributors.tsx │ │ │ │ │ ├── ContributorsList.tsx │ │ │ │ │ ├── Founders.module.scss │ │ │ │ │ ├── Founders.tsx │ │ │ │ │ ├── Team.module.scss │ │ │ │ │ ├── Team.tsx │ │ │ │ │ ├── TeamMember.module.scss │ │ │ │ │ ├── TeamMember.tsx │ │ │ │ │ └── useContributors.ts │ │ │ │ ├── hero/ │ │ │ │ │ ├── FloatingObjects.module.scss │ │ │ │ │ ├── FloatingObjects.tsx │ │ │ │ │ ├── Hero.module.scss │ │ │ │ │ ├── Hero.tsx │ │ │ │ │ ├── ResourceButton.module.scss │ │ │ │ │ ├── ResourceButton.tsx │ │ │ │ │ └── icons/ │ │ │ │ │ ├── FigmaIcon.tsx │ │ │ │ │ ├── GitHubIcon.tsx │ │ │ │ │ ├── HeroAbstractFluidShape.tsx │ │ │ │ │ ├── HeroArrowCrossShape.tsx │ │ │ │ │ ├── HeroCircleShape.tsx │ │ │ │ │ ├── HeroCircleShapeTeal.tsx │ │ │ │ │ ├── HeroCloverShape.tsx │ │ │ │ │ ├── HeroCloverShapeGreen.tsx │ │ │ │ │ └── HeroHeartShape.tsx │ │ │ │ ├── resources/ │ │ │ │ │ ├── ResourceCard.module.scss │ │ │ │ │ ├── ResourceCard.tsx │ │ │ │ │ ├── Resources.module.scss │ │ │ │ │ ├── Resources.tsx │ │ │ │ │ └── icons/ │ │ │ │ │ ├── IconComponents.tsx │ │ │ │ │ ├── IconComponentsColored.tsx │ │ │ │ │ ├── IconFoundations.tsx │ │ │ │ │ ├── IconFoundationsColored.tsx │ │ │ │ │ ├── IconPatterns.tsx │ │ │ │ │ └── IconPatternsColored.tsx │ │ │ │ └── welcome.mdx │ │ │ └── utils/ │ │ │ └── createStoryMetaSettingsDecorator.ts │ │ ├── tsconfig.base.json │ │ ├── tsconfig.json │ │ ├── tsconfig.storybook.json │ │ └── vite.config.ts │ ├── hooks/ │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── rollup.config.mjs │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── types/ │ │ │ │ └── files.d.ts │ │ │ ├── useClickOutside/ │ │ │ │ ├── __tests__/ │ │ │ │ │ └── useClickOutside.test.ts │ │ │ │ └── index.ts │ │ │ ├── useIsOverflowing/ │ │ │ │ └── index.ts │ │ │ └── useResizeObserver/ │ │ │ └── index.ts │ │ ├── tsconfig.json │ │ ├── vitest.config.mjs │ │ └── vitest.setup.mjs │ ├── icons/ │ │ ├── .cursor/ │ │ │ └── rules/ │ │ │ ├── add-icon-from-monday-task.mdc │ │ │ └── icon-generation-process.mdc │ │ ├── .eslintrc.json │ │ ├── .gitignore │ │ ├── .prettierignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── plop/ │ │ │ └── icon/ │ │ │ ├── icon-metadata.txt │ │ │ └── index.js │ │ ├── plopfile.js │ │ ├── rollup.config.js │ │ ├── scripts/ │ │ │ ├── __tests__/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ └── validate-icons-colors.test.ts.snap │ │ │ │ └── validate-icons-colors.test.ts │ │ │ ├── generate-lazy-icons.js │ │ │ ├── generate-meta.js │ │ │ ├── generate-svg-index.js │ │ │ ├── metadata-util.js │ │ │ ├── utils.js │ │ │ ├── validate-icons-colors.js │ │ │ └── validate-meta.js │ │ ├── src/ │ │ │ ├── iconsMetaData.ts │ │ │ ├── react/ │ │ │ │ ├── API.tsx │ │ │ │ ├── Academy.tsx │ │ │ │ ├── Activity.tsx │ │ │ │ ├── Add.tsx │ │ │ │ ├── AddNewDoc.tsx │ │ │ │ ├── AddSmall.tsx │ │ │ │ ├── AddToTeam.tsx │ │ │ │ ├── AddUpdate.tsx │ │ │ │ ├── Alert.tsx │ │ │ │ ├── AlignCenter.tsx │ │ │ │ ├── AlignLeft.tsx │ │ │ │ ├── AlignRight.tsx │ │ │ │ ├── Announcement.tsx │ │ │ │ ├── Apps.tsx │ │ │ │ ├── Archive.tsx │ │ │ │ ├── Attach.tsx │ │ │ │ ├── Baseline.tsx │ │ │ │ ├── Basic.tsx │ │ │ │ ├── Battery.tsx │ │ │ │ ├── BlockQuote.tsx │ │ │ │ ├── Board.tsx │ │ │ │ ├── BoardPrivate.tsx │ │ │ │ ├── BoardShareable.tsx │ │ │ │ ├── BoardTemplate.tsx │ │ │ │ ├── Bold.tsx │ │ │ │ ├── Bolt.tsx │ │ │ │ ├── Bookmark.tsx │ │ │ │ ├── Broadcast.tsx │ │ │ │ ├── Broom.tsx │ │ │ │ ├── Bug.tsx │ │ │ │ ├── Bullet.tsx │ │ │ │ ├── Bullets.tsx │ │ │ │ ├── Bulllet.tsx │ │ │ │ ├── Calendar.tsx │ │ │ │ ├── Chart.tsx │ │ │ │ ├── Check.tsx │ │ │ │ ├── CheckList.tsx │ │ │ │ ├── Checkbox.tsx │ │ │ │ ├── ClassicFolder.tsx │ │ │ │ ├── Clear.tsx │ │ │ │ ├── Clipboard.tsx │ │ │ │ ├── Close.tsx │ │ │ │ ├── CloseMedium.tsx │ │ │ │ ├── CloseRound.tsx │ │ │ │ ├── CloseSmall.tsx │ │ │ │ ├── Code.tsx │ │ │ │ ├── Collapse.tsx │ │ │ │ ├── CollapseHorizontally.tsx │ │ │ │ ├── CollapseRound.tsx │ │ │ │ ├── Column.tsx │ │ │ │ ├── Comment.tsx │ │ │ │ ├── Completed.tsx │ │ │ │ ├── Connect.tsx │ │ │ │ ├── ConnectedDoc.tsx │ │ │ │ ├── ContentDirectory.tsx │ │ │ │ ├── ConvertToItem.tsx │ │ │ │ ├── ConvertToSubitem.tsx │ │ │ │ ├── Counter.tsx │ │ │ │ ├── Country.tsx │ │ │ │ ├── CreditCard.tsx │ │ │ │ ├── Custom.tsx │ │ │ │ ├── Cut.tsx │ │ │ │ ├── Dashboard.tsx │ │ │ │ ├── DashboardPrivate.tsx │ │ │ │ ├── Deactivate.tsx │ │ │ │ ├── Delete.tsx │ │ │ │ ├── Dependency.tsx │ │ │ │ ├── Description.tsx │ │ │ │ ├── DisabledUser.tsx │ │ │ │ ├── Divider.tsx │ │ │ │ ├── Doc.tsx │ │ │ │ ├── DocPrivate.tsx │ │ │ │ ├── DocShareable.tsx │ │ │ │ ├── DocTemplate.tsx │ │ │ │ ├── DoubleCheck.tsx │ │ │ │ ├── Downgrade.tsx │ │ │ │ ├── Download.tsx │ │ │ │ ├── Drag.tsx │ │ │ │ ├── Dropdown.tsx │ │ │ │ ├── DropdownChevronDown.tsx │ │ │ │ ├── DropdownChevronLeft.tsx │ │ │ │ ├── DropdownChevronRight.tsx │ │ │ │ ├── DropdownChevronUp.tsx │ │ │ │ ├── DueDate.tsx │ │ │ │ ├── Duplicate.tsx │ │ │ │ ├── Edit.tsx │ │ │ │ ├── Education.tsx │ │ │ │ ├── Email.tsx │ │ │ │ ├── Embed.tsx │ │ │ │ ├── Emoji.tsx │ │ │ │ ├── Enter.tsx │ │ │ │ ├── EnterArrow.tsx │ │ │ │ ├── Erase.tsx │ │ │ │ ├── Event.tsx │ │ │ │ ├── Expand.tsx │ │ │ │ ├── ExternalPage.tsx │ │ │ │ ├── Favorite.tsx │ │ │ │ ├── Feedback.tsx │ │ │ │ ├── File.tsx │ │ │ │ ├── Files.tsx │ │ │ │ ├── Filter.tsx │ │ │ │ ├── Folder.tsx │ │ │ │ ├── Form.tsx │ │ │ │ ├── Formula.tsx │ │ │ │ ├── Forum.tsx │ │ │ │ ├── Forward.tsx │ │ │ │ ├── Fullscreen.tsx │ │ │ │ ├── FullscreenClose.tsx │ │ │ │ ├── Gallery.tsx │ │ │ │ ├── Gantt.tsx │ │ │ │ ├── Gif.tsx │ │ │ │ ├── Globe.tsx │ │ │ │ ├── Graph.tsx │ │ │ │ ├── Group.tsx │ │ │ │ ├── Guest.tsx │ │ │ │ ├── Health.tsx │ │ │ │ ├── Heart.tsx │ │ │ │ ├── Help.tsx │ │ │ │ ├── Hide.tsx │ │ │ │ ├── Highlight.tsx │ │ │ │ ├── HighlightColorBucket.tsx │ │ │ │ ├── Home.tsx │ │ │ │ ├── IPRestrictions.tsx │ │ │ │ ├── Idea.tsx │ │ │ │ ├── Image.tsx │ │ │ │ ├── Inbox.tsx │ │ │ │ ├── Info.tsx │ │ │ │ ├── Integrations.tsx │ │ │ │ ├── Invite.tsx │ │ │ │ ├── Italic.tsx │ │ │ │ ├── Item.tsx │ │ │ │ ├── ItemDefaultValues.tsx │ │ │ │ ├── ItemHeightDouble.tsx │ │ │ │ ├── ItemHeightSingle.tsx │ │ │ │ ├── ItemHeightTriple.tsx │ │ │ │ ├── Key.tsx │ │ │ │ ├── Keyboard.tsx │ │ │ │ ├── Labs.tsx │ │ │ │ ├── Launch.tsx │ │ │ │ ├── Layout.tsx │ │ │ │ ├── LearnMore.tsx │ │ │ │ ├── Lines.tsx │ │ │ │ ├── Link.tsx │ │ │ │ ├── Location.tsx │ │ │ │ ├── Locked.tsx │ │ │ │ ├── LogIn.tsx │ │ │ │ ├── LogOut.tsx │ │ │ │ ├── LongText.tsx │ │ │ │ ├── Mention.tsx │ │ │ │ ├── Menu.tsx │ │ │ │ ├── Microphone.tsx │ │ │ │ ├── Minimize.tsx │ │ │ │ ├── MinusSmall.tsx │ │ │ │ ├── Mirror.tsx │ │ │ │ ├── Mobile.tsx │ │ │ │ ├── MondayDoc.tsx │ │ │ │ ├── MondayLogoOutline.tsx │ │ │ │ ├── Moon.tsx │ │ │ │ ├── MoreActions.tsx │ │ │ │ ├── MoreBelow.tsx │ │ │ │ ├── MoreBelowFilled.tsx │ │ │ │ ├── Move.tsx │ │ │ │ ├── MoveArrowDown.tsx │ │ │ │ ├── MoveArrowLeft.tsx │ │ │ │ ├── MoveArrowLeftDouble.tsx │ │ │ │ ├── MoveArrowLeftNarrow.tsx │ │ │ │ ├── MoveArrowRight.tsx │ │ │ │ ├── MoveArrowRightNarrow.tsx │ │ │ │ ├── MoveArrowUp.tsx │ │ │ │ ├── Mute.tsx │ │ │ │ ├── MyWeek.tsx │ │ │ │ ├── NavigationArrow.tsx │ │ │ │ ├── NavigationChevronDown.tsx │ │ │ │ ├── NavigationChevronLeft.tsx │ │ │ │ ├── NavigationChevronRight.tsx │ │ │ │ ├── NavigationChevronUp.tsx │ │ │ │ ├── NavigationDoubleChevronLeft.tsx │ │ │ │ ├── NewTab.tsx │ │ │ │ ├── Night.tsx │ │ │ │ ├── NoColor.tsx │ │ │ │ ├── Note.tsx │ │ │ │ ├── NotificationChecked.tsx │ │ │ │ ├── Notifications.tsx │ │ │ │ ├── NotificationsMuted.tsx │ │ │ │ ├── Numbers.tsx │ │ │ │ ├── Offline.tsx │ │ │ │ ├── Open.tsx │ │ │ │ ├── PDF.tsx │ │ │ │ ├── Page.tsx │ │ │ │ ├── Paste.tsx │ │ │ │ ├── Pause.tsx │ │ │ │ ├── Person.tsx │ │ │ │ ├── PersonRound.tsx │ │ │ │ ├── Pin.tsx │ │ │ │ ├── PinFull.tsx │ │ │ │ ├── Placeholder.tsx │ │ │ │ ├── Play.tsx │ │ │ │ ├── Print.tsx │ │ │ │ ├── Prompt.tsx │ │ │ │ ├── PushNotification.tsx │ │ │ │ ├── Quote.tsx │ │ │ │ ├── Radio.tsx │ │ │ │ ├── Recurring.tsx │ │ │ │ ├── RecycleBin.tsx │ │ │ │ ├── Redo.tsx │ │ │ │ ├── Remove.tsx │ │ │ │ ├── RemoveRound.tsx │ │ │ │ ├── Reply.tsx │ │ │ │ ├── ReplyAll.tsx │ │ │ │ ├── Retry.tsx │ │ │ │ ├── Robot.tsx │ │ │ │ ├── Rotate.tsx │ │ │ │ ├── ScheduledEmail.tsx │ │ │ │ ├── ScheduledSend.tsx │ │ │ │ ├── Search.tsx │ │ │ │ ├── Security.tsx │ │ │ │ ├── Send.tsx │ │ │ │ ├── Settings.tsx │ │ │ │ ├── SettingsKnobs.tsx │ │ │ │ ├── Share.tsx │ │ │ │ ├── ShortText.tsx │ │ │ │ ├── Show.tsx │ │ │ │ ├── Shredder.tsx │ │ │ │ ├── Shuffle.tsx │ │ │ │ ├── Signature.tsx │ │ │ │ ├── Sort.tsx │ │ │ │ ├── SortAscending.tsx │ │ │ │ ├── SortDescending.tsx │ │ │ │ ├── Sound.tsx │ │ │ │ ├── Status.tsx │ │ │ │ ├── StrikethroughS.tsx │ │ │ │ ├── StrikethroughT.tsx │ │ │ │ ├── Subitems.tsx │ │ │ │ ├── Sun.tsx │ │ │ │ ├── Switch.tsx │ │ │ │ ├── Switcher.tsx │ │ │ │ ├── Table.tsx │ │ │ │ ├── Tags.tsx │ │ │ │ ├── Team.tsx │ │ │ │ ├── Text.tsx │ │ │ │ ├── TextBig.tsx │ │ │ │ ├── TextColorIndicator.tsx │ │ │ │ ├── TextCopy.tsx │ │ │ │ ├── TextFormatting.tsx │ │ │ │ ├── TextHuge.tsx │ │ │ │ ├── TextMedium.tsx │ │ │ │ ├── TextSmall.tsx │ │ │ │ ├── Textcolor.tsx │ │ │ │ ├── ThumbsDown.tsx │ │ │ │ ├── ThumbsUp.tsx │ │ │ │ ├── Time.tsx │ │ │ │ ├── Timeline.tsx │ │ │ │ ├── Translation.tsx │ │ │ │ ├── TurnInto.tsx │ │ │ │ ├── Underline.tsx │ │ │ │ ├── Undo.tsx │ │ │ │ ├── Unlocked.tsx │ │ │ │ ├── Update.tsx │ │ │ │ ├── Upgrade.tsx │ │ │ │ ├── Upload.tsx │ │ │ │ ├── UserDomain.tsx │ │ │ │ ├── UserStatus.tsx │ │ │ │ ├── Versioning.tsx │ │ │ │ ├── Video.tsx │ │ │ │ ├── Wand.tsx │ │ │ │ ├── Warning.tsx │ │ │ │ ├── WarningFull.tsx │ │ │ │ ├── WhatsNew.tsx │ │ │ │ ├── Widgets.tsx │ │ │ │ ├── Work.tsx │ │ │ │ ├── Workflow.tsx │ │ │ │ ├── Workspace.tsx │ │ │ │ ├── WrapText.tsx │ │ │ │ ├── ZoomIn.tsx │ │ │ │ ├── ZoomOut.tsx │ │ │ │ └── index.ts │ │ │ ├── svg.d.ts │ │ │ └── types.ts │ │ ├── tsconfig.json │ │ ├── tsconfig.test.json │ │ └── vitest.config.ts │ ├── mcp/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── extract-accessibility.js │ │ │ └── extract-code-samples.js │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── server/ │ │ │ ├── index.ts │ │ │ └── tools/ │ │ │ ├── dropdown-migration.ts │ │ │ ├── get-vibe-component-accessibility.ts │ │ │ ├── get-vibe-component-examples.ts │ │ │ ├── get-vibe-component-metadata.ts │ │ │ ├── icon-metadata-service.ts │ │ │ ├── list-vibe-icons.ts │ │ │ ├── list-vibe-public-components.ts │ │ │ ├── list-vibe-tokens.ts │ │ │ ├── metadata-service.ts │ │ │ ├── token-metadata-service.ts │ │ │ ├── v3-migration.ts │ │ │ └── v4-migration.ts │ │ └── tsconfig.json │ ├── shared/ │ │ ├── .eslintrc.cjs │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── constants/ │ │ │ │ ├── index.ts │ │ │ │ ├── keyCodes.ts │ │ │ │ └── sizes.ts │ │ │ ├── hooks/ │ │ │ │ ├── index.ts │ │ │ │ ├── ssr/ │ │ │ │ │ ├── useIsMounted.ts │ │ │ │ │ └── useIsomorphicLayoutEffect.ts │ │ │ │ ├── useEventListener.ts │ │ │ │ ├── useKeyEvent.ts │ │ │ │ ├── useKeyboardButtonPressedFunc.ts │ │ │ │ └── useMergeRef.ts │ │ │ ├── index.ts │ │ │ ├── tests/ │ │ │ │ ├── constants.ts │ │ │ │ ├── index.ts │ │ │ │ ├── test-ids-utils.ts │ │ │ │ └── test-utils.ts │ │ │ ├── types/ │ │ │ │ ├── ArrayLastElement.ts │ │ │ │ ├── Colors.ts │ │ │ │ ├── ElementContent.ts │ │ │ │ ├── FormElement.ts │ │ │ │ ├── MoveBy.ts │ │ │ │ ├── SplitString.ts │ │ │ │ ├── VibeComponentProps.ts │ │ │ │ ├── events.ts │ │ │ │ ├── files.d.ts │ │ │ │ ├── index.ts │ │ │ │ └── window.d.ts │ │ │ └── utils/ │ │ │ ├── colors-utils.ts │ │ │ ├── colors-vars-map.ts │ │ │ ├── dom-event-utils.ts │ │ │ ├── dom-utils.ts │ │ │ ├── function-utils.ts │ │ │ ├── index.ts │ │ │ ├── media-query-utils.ts │ │ │ ├── screenReaderAccessHelper.ts │ │ │ ├── ssr-utils.ts │ │ │ ├── testid-helper.ts │ │ │ ├── textManipulations.ts │ │ │ ├── typesciptCssModulesHelper.ts │ │ │ ├── user-agent-utils.ts │ │ │ └── warn-deprecated.ts │ │ └── tsconfig.json │ ├── storybook-blocks/ │ │ ├── .babelrc.json │ │ ├── .eslintrc.js │ │ ├── .prettierrc │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── __mocks__/ │ │ │ ├── fileMock.js │ │ │ └── styleMock.js │ │ ├── eslint/ │ │ │ └── resolver.js │ │ ├── jest.config.ts │ │ ├── package.json │ │ ├── rollup.config.js │ │ ├── scripts/ │ │ │ └── copy-mixins-to-dist.sh │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── alpha-warning/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── alpha-warning.mdx │ │ │ │ │ │ └── alpha-warning.stories.tsx │ │ │ │ │ └── alpha-warning.tsx │ │ │ │ ├── anchor-list-item/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── anchor-list-item.mdx │ │ │ │ │ │ └── anchor-list-item.stories.tsx │ │ │ │ │ ├── anchor-list-item.module.scss │ │ │ │ │ └── anchor-list-item.tsx │ │ │ │ ├── color-description/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── color-description.mdx │ │ │ │ │ │ └── color-description.stories.tsx │ │ │ │ │ ├── color-description.module.scss │ │ │ │ │ └── color-description.tsx │ │ │ │ ├── component-name/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── component-name.mdx │ │ │ │ │ │ └── component-name.stories.tsx │ │ │ │ │ ├── component-name.module.scss │ │ │ │ │ └── component-name.tsx │ │ │ │ ├── component-rule/ │ │ │ │ │ ├── component-rule-constants.ts │ │ │ │ │ ├── component-rule.module.scss │ │ │ │ │ └── component-rule.tsx │ │ │ │ ├── component-rules/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── component-rules.mdx │ │ │ │ │ │ └── component-rules.stories.tsx │ │ │ │ │ ├── component-rules.module.scss │ │ │ │ │ └── component-rules.tsx │ │ │ │ ├── deprecated-warning/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── deprecated-warning.mdx │ │ │ │ │ │ └── deprecated-warning.stories.tsx │ │ │ │ │ └── deprecated-warning.tsx │ │ │ │ ├── frame/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── frame.mdx │ │ │ │ │ │ └── frame.stories.tsx │ │ │ │ │ ├── frame.module.scss │ │ │ │ │ └── frame.tsx │ │ │ │ ├── function-arguments/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── function-arguments.mdx │ │ │ │ │ │ └── function-arguments.stories.tsx │ │ │ │ │ ├── function-argument.tsx │ │ │ │ │ ├── function-arguments.tsx │ │ │ │ │ └── index.module.scss │ │ │ │ ├── github-contributors-list/ │ │ │ │ │ ├── contributors-list.tsx │ │ │ │ │ ├── contributors.module.scss │ │ │ │ │ ├── github-contributors-list.tsx │ │ │ │ │ ├── github-contributors-types.ts │ │ │ │ │ └── github-contributors-utils.ts │ │ │ │ ├── index.ts │ │ │ │ ├── information-box/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── information-box.mdx │ │ │ │ │ │ └── information-box.stories.tsx │ │ │ │ │ ├── information-box.module.scss │ │ │ │ │ └── information-box.tsx │ │ │ │ ├── information-box-title/ │ │ │ │ │ ├── information-box-title.module.scss │ │ │ │ │ └── information-box-title.tsx │ │ │ │ ├── link/ │ │ │ │ │ ├── LinkConstants.ts │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── link.mdx │ │ │ │ │ │ └── link.stories.tsx │ │ │ │ │ ├── link.module.scss │ │ │ │ │ └── link.tsx │ │ │ │ ├── multiple-story-elements-wrapper/ │ │ │ │ │ ├── multiple-story-elements-wrapper.module.scss │ │ │ │ │ └── multiple-story-elements-wrapper.tsx │ │ │ │ ├── paragraph/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── paragraph.mdx │ │ │ │ │ │ └── paragraph.stories.tsx │ │ │ │ │ ├── paragraph.module.scss │ │ │ │ │ └── paragraph.tsx │ │ │ │ ├── related-component/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── related-component.module.scss │ │ │ │ │ └── related-component.tsx │ │ │ │ ├── related-components/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── related-components-context.ts │ │ │ │ │ ├── related-components.module.scss │ │ │ │ │ └── related-components.tsx │ │ │ │ ├── section-name/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── section-name.mdx │ │ │ │ │ │ └── section-name.stories.tsx │ │ │ │ │ ├── section-name.module.scss │ │ │ │ │ └── section-name.tsx │ │ │ │ ├── sidebar-item/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── sidebar-item.mdx │ │ │ │ │ │ └── sidebar-item.stories.tsx │ │ │ │ │ ├── sidebar-item.module.scss │ │ │ │ │ └── sidebar-item.tsx │ │ │ │ ├── status-tag/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── status-tag.mdx │ │ │ │ │ │ └── status-tag.stories.tsx │ │ │ │ │ ├── status-tag.module.scss │ │ │ │ │ └── status-tag.tsx │ │ │ │ ├── story-description/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── story-description.mdx │ │ │ │ │ │ └── story-description.stories.tsx │ │ │ │ │ ├── story-description.module.scss │ │ │ │ │ └── story-description.tsx │ │ │ │ ├── storybook-link/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── storybook-link.mdx │ │ │ │ │ │ └── storybook-link.stories.tsx │ │ │ │ │ └── storybook-link.tsx │ │ │ │ ├── tip/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── tip.mdx │ │ │ │ │ │ └── tip.stories.tsx │ │ │ │ │ ├── tip.module.scss │ │ │ │ │ ├── tip.tsx │ │ │ │ │ └── tipConstants.ts │ │ │ │ ├── title/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── title.mdx │ │ │ │ │ │ └── title.stories.tsx │ │ │ │ │ ├── title.module.scss │ │ │ │ │ └── title.tsx │ │ │ │ ├── token-table/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── token-table.mdx │ │ │ │ │ │ └── token-table.stories.tsx │ │ │ │ │ ├── token-table-head-item.tsx │ │ │ │ │ ├── token-table-row.tsx │ │ │ │ │ ├── token-table.module.scss │ │ │ │ │ └── token-table.tsx │ │ │ │ ├── unstyled-list/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── unstyled-list.mdx │ │ │ │ │ │ └── unstyled-list.stories.tsx │ │ │ │ │ └── unstyled-list.tsx │ │ │ │ ├── unstyled-list-item/ │ │ │ │ │ ├── unstyled-list-item.module.scss │ │ │ │ │ └── unstyled-list-item.tsx │ │ │ │ ├── usage-guidelines/ │ │ │ │ │ ├── __stories__/ │ │ │ │ │ │ ├── usage-guidelines.mdx │ │ │ │ │ │ └── usage-guidelines.stories.tsx │ │ │ │ │ ├── usage-guidelines.module.scss │ │ │ │ │ └── usage-guidelines.tsx │ │ │ │ └── visual-description/ │ │ │ │ ├── __stories__/ │ │ │ │ │ ├── visual-description.mdx │ │ │ │ │ └── visual-description.stories.tsx │ │ │ │ ├── visual-description.module.scss │ │ │ │ └── visual-description.tsx │ │ │ ├── decorators/ │ │ │ │ ├── index.ts │ │ │ │ ├── memory-stats.jsx │ │ │ │ └── vertical-stories.jsx │ │ │ ├── functions/ │ │ │ │ ├── createComponentTemplate.tsx │ │ │ │ ├── createStoryMetaSettings/ │ │ │ │ │ ├── createStoryMetaSettings.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── index.ts │ │ │ │ └── memory-stats/ │ │ │ │ ├── index.js │ │ │ │ └── memory-stats-lib.js │ │ │ ├── global.d.ts │ │ │ ├── helpers/ │ │ │ │ ├── components/ │ │ │ │ │ ├── Flex/ │ │ │ │ │ │ ├── Flex.module.scss │ │ │ │ │ │ ├── Flex.tsx │ │ │ │ │ │ └── FlexConstants.ts │ │ │ │ │ ├── Icons/ │ │ │ │ │ │ ├── Check.tsx │ │ │ │ │ │ └── CloseSmall.tsx │ │ │ │ │ └── Link/ │ │ │ │ │ ├── Link.module.scss │ │ │ │ │ ├── Link.tsx │ │ │ │ │ └── LinkConsts.ts │ │ │ │ ├── types/ │ │ │ │ │ ├── VibeComponent.ts │ │ │ │ │ ├── VibeComponentProps.ts │ │ │ │ │ └── index.ts │ │ │ │ └── utils/ │ │ │ │ ├── bem-helper.ts │ │ │ │ ├── function-utils.ts │ │ │ │ └── typesciptCssModulesHelper.ts │ │ │ ├── index.ts │ │ │ ├── styles/ │ │ │ │ ├── mixins/ │ │ │ │ │ ├── _focus.scss │ │ │ │ │ ├── _index.scss │ │ │ │ │ ├── _layout.scss │ │ │ │ │ └── _typography.scss │ │ │ │ └── tokens/ │ │ │ │ ├── border-radius.scss │ │ │ │ ├── colors.scss │ │ │ │ ├── index.scss │ │ │ │ ├── spacing.scss │ │ │ │ └── typography.scss │ │ │ └── types/ │ │ │ ├── ElementContent.ts │ │ │ ├── index.ts │ │ │ ├── published-types.ts │ │ │ └── withStaticProps.ts │ │ └── tsconfig.json │ ├── style/ │ │ ├── .babelrc.json │ │ ├── .cursor/ │ │ │ └── rules/ │ │ │ └── color-token-management.mdc │ │ ├── .prettierrc │ │ ├── .stylelintignore │ │ ├── .stylelintrc.json │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── plopfile.js │ │ ├── scripts/ │ │ │ └── generate-colors.ts │ │ ├── src/ │ │ │ ├── border-radius.scss │ │ │ ├── borders.scss │ │ │ ├── common.scss │ │ │ ├── files/ │ │ │ │ ├── colors.json │ │ │ │ └── tokens.json │ │ │ ├── functions/ │ │ │ │ ├── _camelize.scss │ │ │ │ ├── _capitalize.scss │ │ │ │ ├── _contain.scss │ │ │ │ ├── _extract-rgb.scss │ │ │ │ ├── _map-collect.scss │ │ │ │ └── index.scss │ │ │ ├── index.scss │ │ │ ├── mixins/ │ │ │ │ ├── _common.scss │ │ │ │ ├── _states.scss │ │ │ │ ├── _typography.scss │ │ │ │ └── index.scss │ │ │ ├── motion.scss │ │ │ ├── spacing.scss │ │ │ ├── themes/ │ │ │ │ ├── black-theme.scss │ │ │ │ ├── dark-theme.scss │ │ │ │ ├── hacker-theme.scss │ │ │ │ ├── index.scss │ │ │ │ └── light-theme.scss │ │ │ └── typography.scss │ │ ├── stylelint-config/ │ │ │ ├── index.js │ │ │ └── rules/ │ │ │ ├── use-defined-css-var-when-available/ │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ ├── contains-values-with-multiple-replacements.scss │ │ │ │ │ │ └── contains-values-with-single-replacement.scss │ │ │ │ │ ├── index.test.js │ │ │ │ │ └── props-to-allowed-vars.test.js │ │ │ │ ├── index.js │ │ │ │ ├── parse-monday-css.js │ │ │ │ └── props-to-allowed-vars.js │ │ │ └── use-new-spacing-tokens/ │ │ │ ├── __tests__/ │ │ │ │ └── index.test.js │ │ │ └── index.js │ │ ├── tsconfig.json │ │ └── types/ │ │ └── styles.d.ts │ └── testkit/ │ ├── .eslintrc.js │ ├── CHANGELOG.md │ ├── README.md │ ├── __tests__/ │ │ ├── Button.test.ts │ │ ├── ButtonGroup.test.ts │ │ ├── Checkbox.test.ts │ │ ├── ColorPicker.test.ts │ │ ├── Combobox.test.ts │ │ ├── Dropdown.test.ts │ │ ├── EditableHeading.test.ts │ │ ├── EditableText.test.ts │ │ ├── ExpandCollapse.test.ts │ │ ├── IconButton.test.ts │ │ ├── Link.test.ts │ │ ├── List.test.ts │ │ ├── ListItem.test.ts │ │ ├── Loader.test.ts │ │ ├── Menu.test.ts │ │ ├── MenuButton.test.ts │ │ ├── MenuItem.test.ts │ │ ├── Modal.test.ts │ │ ├── RadioButton.test.ts │ │ ├── Search.test.ts │ │ ├── SplitButton.test.ts │ │ ├── Steps.test.ts │ │ ├── TabList.test.ts │ │ ├── Text.test.ts │ │ ├── TextArea.test.ts │ │ ├── TextField.test.ts │ │ ├── Toast.test.ts │ │ ├── Toggle.test.ts │ │ └── utils/ │ │ └── url-helper.js │ ├── components/ │ │ ├── BaseElement.ts │ │ ├── Button.ts │ │ ├── ButtonGroup.ts │ │ ├── Checkbox.ts │ │ ├── ColorPicker.ts │ │ ├── Combobox.ts │ │ ├── Dropdown.ts │ │ ├── EditableHeading.ts │ │ ├── EditableText.ts │ │ ├── ExpandCollapse.ts │ │ ├── IconButton.ts │ │ ├── Link.ts │ │ ├── List.ts │ │ ├── ListItem.ts │ │ ├── Loader.ts │ │ ├── Menu.ts │ │ ├── MenuButton.ts │ │ ├── MenuItem.ts │ │ ├── Modal.ts │ │ ├── RadioButton.ts │ │ ├── Search.ts │ │ ├── SplitButton.ts │ │ ├── Steps.ts │ │ ├── Tab.ts │ │ ├── TabList.ts │ │ ├── Text.ts │ │ ├── TextArea.ts │ │ ├── TextField.ts │ │ ├── Toast.ts │ │ ├── Toggle.ts │ │ └── index.ts │ ├── index.ts │ ├── package.json │ ├── playwright.config.ts │ ├── scripts/ │ │ └── run-changed-tests.js │ ├── tsconfig.esm.json │ ├── tsconfig.json │ └── utils/ │ ├── common-actions.ts │ ├── enums.ts │ └── types.ts └── scripts/ ├── build-dependencies.sh ├── bundle-check/ │ ├── compare-bundles.js │ └── generate-size-limit-config.js └── performance/ ├── aggregate-metrics.js └── compare-metrics.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .claude/skills/vibe-breaking-change/SKILL.md ================================================ --- name: vibe-breaking-change description: Implements Vibe Design System breaking changes with full workflow automation including component updates, migration guide updates, codemod generation, testing, and PR creation. Use when implementing breaking changes to Vibe components that require coordinated updates across the design system. --- # Vibe Breaking Change Implementation ## Overview Implements breaking changes to Vibe Design System components following the established workflow with automated validation, documentation updates, and codemod generation where applicable. ## When to Use **Use this skill when:** - Implementing breaking API changes to Vibe components - Deprecating component props or methods - Changing component behavior that affects dependent components - Updating component interfaces that require migration documentation - Making changes that need coordinated updates across the design system **Do NOT use for:** - Non-breaking enhancements or bug fixes - Internal refactoring that doesn't affect public APIs - Style-only changes without behavioral impact - Emergency hotfixes that bypass normal workflow ## Quick Reference | Phase | Actions | Validation | |-------|---------|------------| | 1. Analysis | Identify affected components, dependencies | Component mapping complete | | 2. Implementation | Apply breaking change, update dependents | Tests pass locally | | 3. Testing | Run full test suite, update failing tests | All tests green | | 4. Documentation | Update migration guide, add codemod if deterministic | Documentation complete | | 5. Cleanup & Delivery | lint:fix, lint, build, test → commit, push, PR with task link | All checks pass, PR ready for review | ## Core Workflow ### Phase 1: Analysis and Planning **🔍 Comprehensive Dependency Analysis:** ```bash # 1. Find all imports and usage across packages grep -r "import.*ComponentName" packages/ grep -r "ComponentName" packages/ --include="*.tsx" --include="*.ts" --include="*.jsx" --include="*.js" # 2. Find specific prop usage being changed (comprehensive search) grep -r "oldProp=" packages/ --include="*.tsx" --include="*.ts" --include="*.jsx" --include="*.js" find packages -name "*.tsx" -o -name "*.ts" -o -name "*.jsx" -o -name "*.js" | xargs grep -l "oldProp\|deprecatedMethod" # 3. Analyze by package structure find packages/components -name "*.tsx" | xargs grep -l "ComponentName" # Standalone packages find packages/core/src -name "*.tsx" | xargs grep -l "ComponentName" # Core package find packages/docs -name "*.tsx" | xargs grep -l "ComponentName" # Documentation find packages/mcp -name "*.ts" | xargs grep -l "ComponentName" # MCP examples ``` **📋 Analysis Checklist:** 1. **Map Dependencies:** - [ ] Components that import the target component - [ ] Components that use the target component inline - [ ] Hook or utility functions that reference the component - [ ] Documentation and example files 2. **Assess Impact Scope:** - [ ] Standalone component packages (packages/components/*) - [ ] Core package components (packages/core/src/components/*) - [ ] Supporting packages (docs, mcp, testkit) - [ ] Test files and stories 3. **Plan Migration Strategy:** - [ ] Order of updates (component first, then dependents) - [ ] TypeScript interface changes needed - [ ] Codemod feasibility (deterministic vs manual) - [ ] Documentation updates required See `references/dependency-analysis.md` for advanced dependency mapping techniques. **📊 Expected Findings:** - **20-40 component files** typically need updates for major component changes - **Multiple package types** - standalone, core, docs, examples - **Mixed file types** - .tsx, .ts, .jsx, .js all may need updates - **Hidden dependencies** - MCP tools, test utilities, etc. ### Phase 2: Implementation **🏗️ Systematic Update Approach:** **Step 1: Source Component Updates** ```typescript // 1. Update component interface interface ComponentProps { // ❌ Remove deprecated props // oldProp?: string; // deprecatedMethod?: () => void; // ✅ Add new props with better API newProp?: string; improvedMethod?: () => void; } // 2. Update component implementation const Component = ({ newProp, ...props }: ComponentProps) => { // Implementation with new API }; ``` **Step 2: Internal Dependencies (same package)** ```typescript // Update hooks, utilities, and helpers in the same package // Example: Icon component's useIconProps hook export default function useIconProps({ label, // ✅ Updated from iconLabel // iconLabel, // ❌ Removed }) { // Implementation } ``` **Step 3: Cross-Package Updates (systematic)** ```bash # Process 20-40 files systematically # Group by package for efficient updates: # A. Standalone component packages packages/components/tooltip/src/Tooltip/Tooltip.tsx packages/components/button/src/Button/Button.tsx # B. Core package components (bulk of changes) packages/core/src/components/AttentionBox/AttentionBox.tsx packages/core/src/components/Checkbox/Checkbox.tsx # ... (typically 20-30 files) # C. Supporting files packages/mcp/src/server/tools/list-vibe-icons.ts packages/docs/src/pages/components/ComponentName/ComponentName.stories.tsx ``` **🔄 Implementation Order:** 1. **Component Package** - Update source component and internal dependencies 2. **Individual Packages** - Update standalone packages that use the component 3. **Core Package** - Systematically update all core components (largest effort) 4. **Build Fix** - Address any TypeScript errors revealed by changes 5. **Supporting Files** - Update docs, examples, MCP tools **✅ Implementation Checklist:** - [ ] Source component interface updated - [ ] Internal component dependencies updated (hooks, utilities) - [ ] Standalone packages updated (5-10 files typically) - [ ] Core package components updated (20-30 files typically) - [ ] TypeScript build errors resolved - [ ] Documentation and examples updated - [ ] All updates maintain semantic consistency ### Phase 3: Testing and Validation ```bash # Run comprehensive tests yarn workspace @vibe/core test lerna run test # Run specific component tests yarn workspace @vibe/core test -- Component # Update snapshots if needed yarn workspace @vibe/core test -- --updateSnapshot ``` See `references/testing-validation.md` for detailed testing patterns and examples. **Testing requirements:** - All existing tests pass or are updated appropriately - New tests cover breaking change scenarios - Integration tests verify dependent components work - No TypeScript errors across the monorepo ### Phase 4: Documentation Updates #### Migration Guide Update (VIBE4_MIGRATION_GUIDE.md) ```markdown ## ComponentName API Changes ### Breaking Changes **Removed `oldProp` prop** - **Before:** `` - **After:** `` - **Reason:** Better API consistency and performance ### Migration Path 1. Replace `oldProp` with `newProp` in all usages 2. Update prop value format if needed 3. Test component behavior matches expected outcome ### Codemod Available ```bash npx @vibe/codemod componentname-old-prop-to-new-prop ``` ``` #### Codemod Generation (if deterministic) ⚠️ **CRITICAL**: Follow established Vibe codemod patterns to avoid common pitfalls. See `references/codemod-best-practices.md` and `references/codemod-examples.md` for detailed patterns and real examples. ```typescript // packages/codemod/transformations/core/v3-to-v4/ComponentName-component-migration.ts import { wrap, getImports, getComponentNameOrAliasFromImports, findComponentElements, migratePropsNames } from "../../../src/utils"; import { NEW_CORE_IMPORT_PATH } from "../../../src/consts"; import { TransformationContext } from "../../../types"; /** * ComponentName migration for v3 to v4: * 1. Rename oldProp1 to newProp1 * 2. Rename oldProp2 to newProp2 */ function transform({ j, root, filePath }: TransformationContext) { // ✅ Use correct import path detection const imports = getImports(root, NEW_CORE_IMPORT_PATH); const componentName = getComponentNameOrAliasFromImports(j, imports, "ComponentName"); if (!componentName) return; const elements = findComponentElements(root, componentName); if (!elements.length) return; // ✅ Single efficient call handles all prop renames elements.forEach(elementPath => { migratePropsNames(j, elementPath, filePath, componentName, { oldProp1: "newProp1", oldProp2: "newProp2", oldProp3: "newProp3" }); }); } export default wrap(transform); ``` **Key Pattern Elements:** - ✅ Use `getImports(root, NEW_CORE_IMPORT_PATH)` not `getCoreImportsForFile()` - ✅ Use `migratePropsNames()` not non-existent `renameProp()` - ✅ Single loop with batch prop updates - ✅ Include `filePath` parameter for error reporting - ✅ Use established utility imports ### Phase 5: Cleanup, Validation, and PR Creation **⚠️ ABSOLUTE REQUIREMENT: Do NOT commit, push, or create a PR until every validation step below passes with zero errors. A PR with failing CI is not acceptable.** **Step 1: Validation gate — run each command, fix failures, repeat until all pass** Run these commands **sequentially**. If ANY command fails, fix the issue and **restart from that command**. Do NOT skip ahead. ```bash # 1. Fix lint issues across all packages yarn lint:fix # 2. Verify lint passes with zero errors yarn lint # 3. Build all packages — must exit 0 yarn build # 4. Run full test suite — must exit 0 yarn test ``` **If a step fails:** 1. Read the error output carefully 2. Fix the root cause (do not suppress or skip) 3. Re-run **from that step** through the remaining steps 4. Repeat until all 4 steps pass cleanly in sequence **Only proceed to Step 2 when lint, build, AND tests all pass with zero errors.** **Step 2: Create branch and commit only after all checks pass** See `references/pr-templates.md` for PR description, commit message, and migration guide templates. See `references/workflow-checklist.md` for a comprehensive checklist of all phases. **📋 Monday.com Task Link:** Extract the Monday.com task link from the user's original prompt if provided. The link format is: `https://monday.monday.com/boards//pulses/` Include this link in the PR description under the "Task Link" section. If no task link was provided in the original prompt, ask the user for it before creating the PR. **Commit and PR titles MUST follow [Conventional Commits](https://www.conventionalcommits.org/).** Use the appropriate type based on the nature of the change: - `feat:` — new feature or capability change - `fix:` — bug fix - `refactor:` — refactor without behavior change Always include a `BREAKING CHANGE:` footer in the commit body. ```bash # Create feature branch from vibe4 git checkout vibe4 git pull origin vibe4 git checkout -b breaking-change/component-name-api-update # Commit changes (only after all checks above pass) git add . git commit -m "feat(ComponentName): remove oldProp in favor of newProp - Remove deprecated oldProp in favor of newProp - Update all dependent components - Add migration guide and codemod - Update tests for new API BREAKING CHANGE: ComponentName.oldProp has been removed. Use ComponentName.newProp instead. Co-Authored-By: Claude Opus 4.6 " # Push and create PR git push -u origin breaking-change/component-name-api-update gh pr create \ --title "feat(ComponentName): remove oldProp in favor of newProp" \ --body "## Summary • Remove deprecated \`oldProp\` from ComponentName • Update all dependent components to use \`newProp\` • Add comprehensive migration guide • Include codemod for automated migration ## Breaking Changes - \`ComponentName.oldProp\` → \`ComponentName.newProp\` ## Task Link [Monday.com Task](https://monday.monday.com/boards//pulses/) ## Test Plan - [ ] All component tests pass - [ ] Dependent components work correctly - [ ] Codemod transforms existing usage - [ ] Migration guide tested - [ ] Build and lint checks pass 🤖 Generated with [Claude Code](https://claude.com/claude-code)" ``` ## Common Patterns ### Comprehensive Component Updates **Pattern: Systematic Cross-Package Updates** ```bash # Real example from Icon migration (28 files updated): # 1. Component package (source) packages/components/icon/src/Icon/Icon.tsx # Main component packages/components/icon/src/Icon/hooks/useIconProps.tsx # Internal hooks # 2. Related component packages packages/components/tooltip/src/Tooltip/Tooltip.tsx # Uses Icon packages/components/icon-button/src/IconButton/IconButton.tsx # Uses Icon internally # 3. Core package components (bulk updates) packages/core/src/components/AttentionBox/AttentionBox.tsx # 2 Icon instances packages/core/src/components/Checkbox/Checkbox.tsx # 2 Icon instances packages/core/src/components/Chips/Chips.tsx # 2 Icon instances # ... 20+ more core components # 4. Supporting updates packages/mcp/src/server/tools/list-vibe-icons.ts # Documentation examples packages/core/src/components/DatePicker/DatePickerHeader.tsx # Related component fixes ``` **🔧 Batch Update Strategy:** 1. Use `replace_all=true` for simple prop renames across files 2. Use `replace_all=false` for context-specific updates 3. Group similar changes together for efficiency 4. Verify build after each logical group of changes ### Deterministic Changes (Add Codemod) - Simple prop renames (`iconSize` → `size`) - Enum value updates - Import path changes - Method signature changes with clear mapping ### Non-Deterministic Changes (No Codemod) - Complex behavioral changes requiring human judgment - Context-dependent prop usage - Changes requiring business logic updates - Multi-step migration requiring staged approach ### Mixed Changes (Partial Codemod + Manual) - Prop renames (codemod) + related component fixes (manual) - API changes (codemod) + TypeScript error fixes (manual) - Interface updates (codemod) + documentation updates (manual) ### Error Recovery - If tests fail: Fix broken components, don't skip tests - If build fails: Check import/export consistency - If codemod fails: Validate transform logic with test cases - If PR blocked: Address review feedback before merging ## ⚠️ Common Pitfalls & Lessons Learned ### Codemod Implementation Issues **❌ Wrong Function Usage:** ```typescript // WRONG - this function doesn't exist renameProp(j, elementPath, "oldProp", "newProp"); // CORRECT - use established utility migratePropsNames(j, elementPath, filePath, componentName, { oldProp: "newProp" }); ``` **❌ Wrong Import Path:** ```typescript // WRONG - looks for old package name const imports = getCoreImportsForFile(root); // CORRECT - specify the right import path const imports = getImports(root, NEW_CORE_IMPORT_PATH); // "@vibe/core" ``` **❌ Inefficient Multiple Loops:** ```typescript // WRONG - separate loops for each prop if (isPropExists(j, elementPath, "prop1")) { // handle prop1 } if (isPropExists(j, elementPath, "prop2")) { // handle prop2 } // CORRECT - single efficient call migratePropsNames(j, elementPath, filePath, componentName, { prop1: "newProp1", prop2: "newProp2", prop3: "newProp3" }); ``` ### JSCodeshift Formatting Artifacts **⚠️ Problem:** jscodeshift adds unnecessary parentheses around JSX elements in files that don't even use the target component. **Example Artifacts:** ```jsx // Before codemod
// After codemod (WRONG!) (
``` **🔧 Prevention:** 1. **Target specific files** instead of entire directories 2. **Use `--dry` run first** to verify only expected files change 3. **Review all diffs carefully** before committing 4. **Create cleanup commits** if formatting issues slip through **🔧 Cleanup Pattern:** ```typescript // Find files with formatting artifacts git diff HEAD~1 HEAD --name-only | grep -v "target-component" // Manual cleanup needed for unintended changes ``` ### Documentation Reversion Issues **⚠️ Problem:** Linters, formatters, or branch switches can revert documentation changes. **🔧 Prevention:** - **Commit documentation separately** from code changes - **Verify documentation persists** after all code changes - **Check git status** before final PR creation - **Re-add documentation** if reverted by automation ### Component Package Dependencies **⚠️ Problem:** Components in different packages need different import handling. ```typescript // Icon is in @vibe/icon but also re-exported from @vibe/core // Both need to be handled correctly ``` **🔧 Solution:** - Check component package structure first - Handle both direct imports and re-exports - Test codemod on actual usage patterns ### Build System Validation **⚠️ Problem:** Not all components build even before changes, causing false positives. **🔧 Approach:** - **Test individual packages** first (`yarn workspace @vibe/icon build`) - **Focus on changed packages** rather than full monorepo build - **Separate build issues** from breaking change issues ### Cross-Package Component Updates **⚠️ Problem:** Breaking changes often affect components across multiple packages, not just the main @vibe/core package. **Real Example - Icon Migration:** Icon component is in `@vibe/icon` but used throughout: - `packages/components/tooltip/` - standalone package using Icon - `packages/core/src/components/` - 25+ core components using Icon - `packages/components/icon-button/` - IconButton using Icon internally - `packages/mcp/` - documentation and examples **🔧 Comprehensive Search Strategy:** ```bash # 1. Find ALL files with old prop usage across entire monorepo grep -r "iconType\|iconSize\|iconLabel" packages/ --include="*.tsx" --include="*.ts" --include="*.jsx" --include="*.js" # 2. Identify usage by package type find packages/components -name "*.tsx" -o -name "*.ts" | xargs grep -l "iconType=" find packages/core/src -name "*.tsx" -o -name "*.ts" | xargs grep -l "iconSize=" # 3. Check supporting files (docs, examples, tests) grep -r "iconLabel=" packages/mcp packages/docs ``` **🔧 Update Strategy:** 1. **Component Package First** - Update the source component and its internal hooks 2. **Core Package Components** - Systematically update all core components (20-30 files typical) 3. **Standalone Packages** - Update components that depend on the changed component 4. **Supporting Files** - Update documentation, examples, and MCP tools 5. **Build Verification** - Test each package individually before full build ### TypeScript Build Errors in Related Components **⚠️ Problem:** Breaking changes can reveal existing TypeScript errors in related components. **Real Example - IconButton Props:** ```typescript // DatePickerHeader was using deprecated Button static properties // Fixed to use string literals ``` **🔧 Resolution Approach:** 1. **Isolate the error** - determine if it's related to your breaking change or pre-existing 2. **Check component API** - verify correct prop values for the component 3. **Use string literals** instead of deprecated static enum properties 4. **Test build** after each fix to catch additional issues ### Documentation and Example Updates **⚠️ Problem:** Code examples in documentation and MCP tools need updating with new API. **🔧 Required Updates:** - **MCP Documentation** - Update usage examples with new props - **Component Stories** - Storybook examples using the component - **README files** - Any inline code examples - **Test files** - Update snapshot tests and component tests ## Quality Gates **⚠️ These are hard gates, not suggestions. Do NOT proceed past a gate until every item passes.** **Before committing (all must pass with exit code 0):** - [ ] `yarn lint` — zero errors - [ ] `yarn build` — zero errors - [ ] `yarn test` — zero failures - [ ] Migration guide entry complete **Before creating PR:** - [ ] All of the above still pass after final commit - [ ] Codemod tested (if applicable) - [ ] Documentation updated ## Integration Points - **Package Dependencies:** Update `package.json` files as needed - **TypeScript:** Ensure type consistency across packages - **Build System:** Verify Rollup configurations handle changes - **Storybook:** Update stories to reflect new API - **Documentation:** Sync with component documentation site ================================================ FILE: .claude/skills/vibe-breaking-change/references/codemod-best-practices.md ================================================ # Codemod Best Practices for Vibe Breaking Changes ## Lessons Learned from Real Implementation This guide covers critical lessons learned from implementing the Icon component prop renames codemod, including major pitfalls to avoid. ## ❌ Common Mistakes to Avoid ### 1. Using Non-Existent Functions **WRONG:** ```typescript import { renameProp } from "../../../src/utils"; // ❌ Doesn't exist elements.forEach(elementPath => { if (isPropExists(j, elementPath, "oldProp")) { renameProp(j, elementPath, "oldProp", "newProp"); // ❌ Function doesn't exist } }); ``` **CORRECT:** ```typescript import { migratePropsNames } from "../../../src/utils"; // ✅ Real function elements.forEach(elementPath => { migratePropsNames(j, elementPath, filePath, componentName, { oldProp: "newProp", anotherOld: "anotherNew" }); // ✅ Handles all props in one efficient call }); ``` ### 2. Wrong Import Path Detection **WRONG:** ```typescript // This only finds "monday-ui-react-core" imports, not "@vibe/core" const imports = getCoreImportsForFile(root); ``` **CORRECT:** ```typescript import { NEW_CORE_IMPORT_PATH } from "../../../src/consts"; // This finds "@vibe/core" imports correctly const imports = getImports(root, NEW_CORE_IMPORT_PATH); ``` ### 3. Inefficient Multiple Loops **WRONG:** ```typescript elements.forEach(elementPath => { // Separate check for each prop - inefficient! if (isPropExists(j, elementPath, "iconLabel")) { renameProp(j, elementPath, "iconLabel", "label"); } if (isPropExists(j, elementPath, "iconType")) { renameProp(j, elementPath, "iconType", "type"); } if (isPropExists(j, elementPath, "iconSize")) { renameProp(j, elementPath, "iconSize", "size"); } }); ``` **CORRECT:** ```typescript elements.forEach(elementPath => { // Single call handles all prop renames efficiently migratePropsNames(j, elementPath, filePath, componentName, { iconLabel: "label", iconType: "type", iconSize: "size" }); }); ``` ## 🔧 Proven Codemod Pattern Based on successful v2-v3 codemods, use this proven pattern: ```typescript import { wrap, getImports, getComponentNameOrAliasFromImports, findComponentElements, migratePropsNames } from "../../../src/utils"; import { NEW_CORE_IMPORT_PATH } from "../../../src/consts"; import { TransformationContext } from "../../../types"; function transform({ j, root, filePath }: TransformationContext) { // 1. Find imports from correct package const imports = getImports(root, NEW_CORE_IMPORT_PATH); // 2. Check if component is imported const componentName = getComponentNameOrAliasFromImports(j, imports, "ComponentName"); if (!componentName) return; // 3. Find all component elements const elements = findComponentElements(root, componentName); if (!elements.length) return; // 4. Migrate props efficiently elements.forEach(elementPath => { migratePropsNames(j, elementPath, filePath, componentName, { oldProp1: "newProp1", oldProp2: "newProp2", oldProp3: "newProp3" }); }); } export default wrap(transform); ``` ## ⚠️ JSCodeshift Formatting Artifacts ### The Problem JSCodeshift can add unnecessary parentheses around JSX elements, even in files that **don't use the target component**. **Example:** ```jsx // Original code
Content
// After codemod (WRONG!) (
Content
) ``` ### Root Cause JSCodeshift parses and rebuilds the AST, which can introduce formatting changes even when no transforms are applied. ### Prevention Strategies #### 1. Target Specific Files ```bash # WRONG - transforms entire directory npx jscodeshift -t transform.js packages/core/src/components/ # BETTER - target specific files known to use the component npx jscodeshift -t transform.js packages/core/src/components/Button/Button.tsx packages/core/src/components/IconButton/IconButton.tsx ``` #### 2. Use Dry Run First ```bash # Always run dry first to see what changes npx jscodeshift -t transform.js packages/ --dry # Review the output carefully # Only proceed if changes look correct npx jscodeshift -t transform.js packages/ ``` #### 3. Filter by Import Detection ```typescript function transform({ j, root, filePath }: TransformationContext) { // Only proceed if file actually imports the component const imports = getImports(root, NEW_CORE_IMPORT_PATH); const componentName = getComponentNameOrAliasFromImports(j, imports, "ComponentName"); if (!componentName) return; // ✅ Exit early, no changes // ... rest of transform } ``` ### Cleanup Process If formatting artifacts slip through: ```bash # 1. Identify files with unintended changes git diff HEAD~1 HEAD --name-only | grep -E "(Checkbox|AvatarGroup|Dropdown)" # 2. Review each file git diff HEAD~1 HEAD -- path/to/file.tsx # 3. Manual cleanup # Remove extra parentheses: (
# Fix indentation as needed # 4. Commit cleanup git add . git commit -m "fix: remove codemod formatting artifacts" ``` ## 🧪 Testing Best Practices ### Test Development ```typescript // Cover edge cases in tests defineInlineTest( transform, {}, prependImport('const element = ;'), prependImport('const element = ;'), "should rename all three props" ); // Test aliased imports defineInlineTest( transform, {}, `import { Icon as VibeIcon } from "@vibe/core"; const element = ;`, `import { Icon as VibeIcon } from "@vibe/core"; const element = ;`, "should work with aliased imports" ); ``` ### Expected Results - **7-8 out of 8 tests pass** - indicates working codemod - **1 formatting test failure** - expected jscodeshift artifact (acceptable) - **0 tests pass** - indicates broken codemod logic ## 📝 Documentation Integration ### Migration Guide Entry ```markdown ## ComponentName API Changes ### Breaking Changes **Props Renamed:** - `oldProp` → `newProp` - `anotherOld` → `anotherNew` ### Automated Migration ```bash npx @vibe/codemod component-name-props-update src/ ``` ### Manual Migration [Include before/after examples] ``` ### Changelog Entry ```markdown #### ComponentName v2.0.0 - **BREAKING**: Renamed props for better consistency - **Migration**: Use `npx @vibe/codemod component-name-props-update` - **Task**: Monday.com #[task-id] ``` ## 🚀 Success Criteria A successful codemod implementation should: 1. **✅ Follow established patterns** from v2-v3 codemods 2. **✅ Use correct utility functions** (migratePropsNames, getImports) 3. **✅ Handle import paths correctly** (NEW_CORE_IMPORT_PATH) 4. **✅ Be efficient** (single loop, batch prop updates) 5. **✅ Have comprehensive tests** (7+ passing test cases) 6. **✅ Minimize formatting artifacts** (targeted file updates) 7. **✅ Include cleanup process** (for any artifacts that slip through) ## 🔄 Iteration Process 1. **RED**: Write failing tests first 2. **GREEN**: Implement minimal working codemod 3. **REFACTOR**: Fix issues, improve efficiency 4. **CLEANUP**: Remove formatting artifacts 5. **DOCUMENT**: Update migration guide and changelog 6. **VALIDATE**: Test on real codebase examples ================================================ FILE: .claude/skills/vibe-breaking-change/references/codemod-examples.md ================================================ # Codemod Examples for Vibe Breaking Changes ## Simple Prop Rename ```typescript // Transform: oldProp → newProp import type { Transform } from 'jscodeshift'; const transform: Transform = (file, api) => { const j = api.jscodeshift; const root = j(file.source); // Transform JSX prop usage root .find(j.JSXElement) .filter(path => { const name = path.value.openingElement?.name; return name && name.type === 'JSXIdentifier' && name.name === 'ComponentName'; }) .forEach(path => { const attributes = path.value.openingElement?.attributes || []; attributes.forEach(attr => { if ( attr.type === 'JSXAttribute' && attr.name?.type === 'JSXIdentifier' && attr.name.name === 'oldProp' ) { attr.name.name = 'newProp'; } }); }); return root.toSource(); }; export default transform; ``` ## Enum to String Union Migration ```typescript // Transform: ComponentName.SIZE.LARGE → "large" import type { Transform } from 'jscodeshift'; const transform: Transform = (file, api) => { const j = api.jscodeshift; const root = j(file.source); // Replace enum member access with string literal root .find(j.MemberExpression, { object: { type: 'MemberExpression', object: { name: 'ComponentName' }, property: { name: 'SIZE' } } }) .forEach(path => { const property = path.value.property; if (property.type === 'Identifier') { const stringValue = property.name.toLowerCase(); j(path).replaceWith(j.literal(stringValue)); } }); return root.toSource(); }; export default transform; ``` ## Complex Import Path Update ```typescript // Transform: from old package to new package structure import type { Transform } from 'jscodeshift'; const transform: Transform = (file, api) => { const j = api.jscodeshift; const root = j(file.source); // Update import declarations root .find(j.ImportDeclaration) .filter(path => { return path.value.source.value?.includes('@vibe/core/components/ComponentName'); }) .forEach(path => { if (path.value.source.type === 'Literal') { path.value.source.value = '@vibe/component-name'; } }); return root.toSource(); }; export default transform; ``` ## Testing Codemod Changes ```bash # Test codemod on specific file npx jscodeshift -t packages/codemod/src/transforms/component-prop-rename.ts packages/core/src/components/Button/__tests__/Button.test.tsx --dry # Test on directory npx jscodeshift -t packages/codemod/src/transforms/component-prop-rename.ts packages/core/src/components/ --dry # Apply transformation npx jscodeshift -t packages/codemod/src/transforms/component-prop-rename.ts packages/core/src/components/ # Add to codemod CLI # Edit packages/codemod/src/index.ts to include new transform ``` ## Codemod Integration Checklist - [ ] Transform handles JSX usage - [ ] Transform handles TypeScript interfaces - [ ] Transform handles prop destructuring - [ ] Transform handles spread props appropriately - [ ] Test cases cover edge cases - [ ] Dry run shows expected changes - [ ] Added to codemod CLI interface - [ ] Documentation includes usage example ================================================ FILE: .claude/skills/vibe-breaking-change/references/dependency-analysis.md ================================================ # Dependency Analysis for Breaking Changes ## Component Dependency Mapping ### Finding Direct Dependencies ```bash # Find components importing the target component grep -r "import.*ComponentName" packages/core/src/components/ grep -r "import.*ComponentName" packages/components/ # Find usage in TypeScript files grep -r "ComponentName" packages/*/src/**/*.tsx grep -r "ComponentName" packages/*/src/**/*.ts # Find usage in test files grep -r "ComponentName" packages/*/src/**/__tests__/*.tsx grep -r "ComponentName" packages/*/src/**/__stories__/*.tsx ``` ### Finding Indirect Dependencies ```bash # Check for components that extend or compose target component grep -r "extends.*ComponentNameProps" packages/ grep -r "ComponentName.*Props" packages/ # Find re-exports grep -r "export.*ComponentName" packages/*/src/index.ts grep -r "export.*from.*ComponentName" packages/ ``` ### Analyzing Package Dependencies ```bash # Check package.json dependencies find packages/ -name "package.json" -exec grep -l "@vibe/component-name\|ComponentName" {} \; # Check workspace dependencies yarn workspace @vibe/core info yarn workspaces info ``` ## Impact Assessment Matrix | Component | Import Type | Usage Pattern | Breaking Impact | Update Required | |-----------|-------------|---------------|-----------------|-----------------| | ButtonGroup | Direct | Props passed through | High | Yes - API change | | Dialog | Indirect | Used in composition | Medium | Yes - prop update | | Form | Test only | Test utilities | Low | Maybe - test update | ## Component Relationship Types ### Direct Usage - Component imports and uses target component - Props passed directly to target component - **Impact:** High - requires immediate update ### Composed Usage - Component wraps or extends target component - May add additional props or behavior - **Impact:** Medium - requires careful testing ### Re-export Usage - Package re-exports target component - May not use component directly - **Impact:** Low - update exports only ### Test/Story Usage - Only used in test files or Storybook - No runtime impact on users - **Impact:** Minimal - update tests/stories ## Dependency Update Strategy ### Phase 1: Core Component Update 1. Update target component with breaking change 2. Update component types and interfaces 3. Ensure component builds and basic tests pass ### Phase 2: Direct Dependencies 1. Update components with direct imports 2. Update prop passing and usage patterns 3. Fix compilation errors ### Phase 3: Indirect Dependencies 1. Update composed components 2. Update complex usage patterns 3. Verify behavioral consistency ### Phase 4: Package Dependencies 1. Update package.json versions if needed 2. Update workspace dependencies 3. Verify cross-package compatibility ## Validation Commands ```bash # Check TypeScript compilation across all packages lerna run type-check # Check for remaining references to old API grep -r "oldProp" packages/ --include="*.ts" --include="*.tsx" # Verify no broken imports yarn workspace @vibe/core build lerna run build # Check for usage in Storybook grep -r "oldProp" packages/**/__stories__/ ``` ## Common Dependency Patterns ### Button Dependencies - ButtonGroup, IconButton, SplitButton - Form components (FieldButton, FormButton) - Dialog components (DialogButton) ### Icon Dependencies - All components using icons - IconButton, Button with icons - Menu items, navigation components ### Layout Dependencies - Grid system components - Container components - Responsive utilities ### Hook Dependencies - Components using shared hooks - Custom hook implementations - Test utilities using hooks ## Risk Mitigation ### High-Risk Changes - Core utility changes (hooks, constants) - Base component changes (Button, Icon) - Type system changes (VibeComponentProps) ### Medium-Risk Changes - Layout component changes - Form component changes - Complex composite components ### Low-Risk Changes - Leaf components (no dependencies) - Style-only changes - Test utility changes ================================================ FILE: .claude/skills/vibe-breaking-change/references/pr-templates.md ================================================ # PR and Documentation Templates ## PR Template for Breaking Changes ### PR Title Format Follow [Conventional Commits](https://www.conventionalcommits.org/). Use the appropriate type (`feat`, `fix`, `refactor`, etc.): ``` (): brief description Examples: feat(Button): remove deprecated size prop refactor(Dialog): update API for better accessibility fix(Form): replace onSubmit with onFormSubmit ``` ### PR Description Template ```markdown ## Summary • Brief description of the breaking change • Why this change was necessary • Impact on existing users ## Breaking Changes **[ComponentName] API Changes:** - ❌ Removed: `oldProp` prop - ✅ Added: `newProp` prop with enhanced functionality - 🔄 Changed: `existingProp` now requires different value format ## Migration Path ### Automated Migration (Codemod Available) ```bash npx @vibe/codemod component-name-api-update ``` ### Manual Migration **Before:** ```jsx ``` **After:** ```jsx ``` ## Task Link [Monday.com Task](https://monday.monday.com/boards//pulses/) ## Testing - [ ] All component tests pass - [ ] Integration tests updated and passing - [ ] Dependent components tested - [ ] Storybook stories render correctly - [ ] Codemod tested on real codebase examples - [ ] Performance impact assessed ## Documentation - [ ] Migration guide updated - [ ] API documentation updated - [ ] Changelog entry added - [ ] Codemod documentation added ## Validation - [ ] Full monorepo build passes - [ ] All linting checks pass - [ ] TypeScript compilation successful - [ ] No broken imports or exports - [ ] Manual testing completed ## Reviewer Notes - Focus on [specific areas of concern] - Pay attention to [migration complexity/edge cases] - Verify [specific functionality still works] --- 🤖 Generated with [Claude Code](https://claude.com/claude-code) ``` ## Commit Message Template Follow [Conventional Commits](https://www.conventionalcommits.org/). Use the appropriate type (`feat`, `fix`, `refactor`, etc.): ``` (): brief description Detailed explanation of what changed and why. Include context about the problem being solved. BREAKING CHANGE: Specific description of what breaks. Explain the old behavior vs new behavior. Migration: - Old usage: ComponentName.oldProp - New usage: ComponentName.newProp - Codemod: npx @vibe/codemod component-migration Affects: - ComponentName API - Dependent components: ButtonGroup, Dialog - Documentation: Migration guide updated Co-Authored-By: Claude Opus 4.6 ``` ## Migration Guide Entry Template ```markdown ## [ComponentName] API Changes ### Overview Brief explanation of what changed and why the breaking change was necessary. ### Breaking Changes #### Removed `oldProp` prop - **Impact**: High - affects all usage - **Reason**: Simplifies API and improves performance - **Migration**: Replace with `newProp` #### Changed `existingProp` format - **Impact**: Medium - affects complex usage - **Reason**: Better type safety and validation - **Migration**: Convert values using utility function ### Before and After #### Basic Usage ```jsx // Before // After ``` #### Advanced Usage ```jsx // Before handleOldWay(data)} /> // After handleNewWay(data)} /> ``` ### Migration Strategies #### Automated Migration Use the provided codemod for straightforward cases: ```bash npx @vibe/codemod componentname-api-update src/ ``` The codemod handles: - Simple prop renames - Basic value transformations - Import statement updates #### Manual Migration For complex cases requiring human judgment: 1. **Dynamic prop values**: Review logic and update calculations 2. **Event handlers**: Update to match new event signature 3. **Conditional usage**: Verify new API handles all conditions 4. **Tests**: Update test assertions and mocks #### Gradual Migration For large codebases, consider a phased approach: 1. **Phase 1**: Update critical components first 2. **Phase 2**: Update high-traffic components 3. **Phase 3**: Update remaining components 4. **Phase 4**: Remove any compatibility shims ### Common Issues #### TypeScript Errors ```typescript // Error: Property 'oldProp' does not exist // Solution: Use new prop name ``` #### Runtime Errors ```javascript // Error: onOldEvent is not a function props.onOldEvent?.(data); // Solution: Use new event name props.onNewEvent?.(data); ``` ### Validation After migration, verify: - [ ] No TypeScript compilation errors - [ ] Component renders as expected - [ ] Event handlers work correctly - [ ] Tests pass - [ ] No console warnings ``` ## Changelog Entry Template ```markdown ### BREAKING CHANGES #### ComponentName v2.0.0 - **BREAKING**: Removed `oldProp` in favor of `newProp` for better API consistency - **BREAKING**: Changed `existingProp` format from object to string for improved performance - **Migration**: Use `npx @vibe/codemod componentname-api-update` for automated migration - **Affects**: All ComponentName usage, ButtonGroup, Dialog components ##### Migration Example ```jsx // Before // After ``` See [Migration Guide](./VIBE4_MIGRATION_GUIDE.md#componentname-api-changes) for detailed instructions. ``` ## Code Review Checklist Template ```markdown ## Breaking Change Review Checklist ### API Design - [ ] Breaking change is necessary and well-justified - [ ] New API is more intuitive than old API - [ ] API follows Vibe design system conventions - [ ] TypeScript types are accurate and helpful ### Implementation - [ ] Target component updated correctly - [ ] All dependent components updated - [ ] No lingering references to old API - [ ] Error handling updated appropriately ### Testing - [ ] Component tests updated and comprehensive - [ ] Integration tests cover dependent components - [ ] Edge cases tested - [ ] Performance impact assessed ### Documentation - [ ] Migration guide entry is clear and complete - [ ] Code examples work correctly - [ ] Codemod documented and tested - [ ] Breaking change clearly flagged ### Developer Experience - [ ] TypeScript errors are helpful - [ ] Runtime errors (if any) are clear - [ ] Migration path is straightforward - [ ] Documentation is discoverable ### Build System - [ ] All packages build successfully - [ ] No circular dependencies introduced - [ ] Import/export structure clean - [ ] Version bumps appropriate ``` ================================================ FILE: .claude/skills/vibe-breaking-change/references/testing-validation.md ================================================ # Testing and Validation for Breaking Changes ## Testing Strategy ### 1. Unit Tests Test individual component behavior with new API ```typescript // Before: Test with old API it('should handle oldProp correctly', () => { render(); expect(screen.getByRole('button')).toHaveAttribute('data-old', 'value'); }); // After: Test with new API it('should handle newProp correctly', () => { render(); expect(screen.getByRole('button')).toHaveAttribute('data-new', 'value'); }); // Migration test: Ensure old API no longer works it('should not accept oldProp', () => { // TypeScript should prevent this at compile time // @ts-expect-error - oldProp no longer exists render(); }); ``` ### 2. Integration Tests Test dependent components work with changes ```typescript // Test component that uses the changed component it('should work with updated ComponentName API', () => { render( ); // Verify integration works expect(screen.getByTestId('parent-wrapper')).toBeInTheDocument(); expect(screen.getByRole('button')).toHaveAttribute('data-new', 'value'); }); ``` ### 3. Snapshot Testing Update snapshots for visual regression testing ```bash # Update component snapshots yarn workspace @vibe/core test -- ComponentName --updateSnapshot # Update all affected snapshots yarn workspace @vibe/core test -- --updateSnapshot # Check snapshot diffs are intentional git diff packages/core/src/components/ComponentName/__tests__/__snapshots__/ ``` ## Validation Checklist ### Pre-Implementation Validation - [ ] Impact analysis complete - [ ] Dependent components identified - [ ] Migration strategy defined - [ ] Breaking change justified and approved ### Implementation Validation - [ ] Target component updated correctly - [ ] TypeScript compilation passes - [ ] Component tests updated and passing - [ ] No console errors in development ### Dependency Validation - [ ] All dependent components updated - [ ] Integration tests passing - [ ] No broken imports or exports - [ ] Cross-package dependencies resolved ### Build Validation ```bash # Full monorepo build lerna run build # Individual package builds yarn workspace @vibe/core build yarn workspace @vibe/components build # TypeScript validation lerna run type-check # Lint validation lerna run lint ``` ### Runtime Validation ```bash # Storybook validation yarn storybook # Manually verify affected stories render correctly # Test app validation (if available) yarn start # Test breaking changes in demo application ``` ### Documentation Validation - [ ] Migration guide updated with clear examples - [ ] Breaking change documented with before/after - [ ] Codemod usage documented (if applicable) - [ ] API documentation updated ## Test Update Patterns ### Props Interface Changes ```typescript // Old interface interface OldComponentProps { oldProp?: string; size?: 'small' | 'medium' | 'large'; } // New interface interface NewComponentProps { newProp?: string; size?: ComponentSize; // enum to string union } // Test updates needed: // 1. Update prop names in test cases // 2. Update enum values to string literals // 3. Add tests for new API behavior // 4. Remove tests for deprecated functionality ``` ### Behavior Changes ```typescript // Test behavioral changes describe('ComponentName behavior changes', () => { it('should trigger callback on new event', () => { const mockCallback = jest.fn(); render(); // Trigger new behavior fireEvent.click(screen.getByRole('button')); expect(mockCallback).toHaveBeenCalledWith(/* new signature */); }); it('should not trigger old callback', () => { // Ensure old behavior is removed const mockOldCallback = jest.fn(); // @ts-expect-error - old callback should not exist render(); }); }); ``` ## Common Testing Pitfalls ### 1. Incomplete Test Updates - **Problem:** Tests still use old API but pass due to lenient typing - **Solution:** Enable strict TypeScript checking in tests - **Validation:** `yarn workspace @vibe/core test --typecheck` ### 2. Missing Integration Tests - **Problem:** Individual components work but integration breaks - **Solution:** Test component composition scenarios - **Validation:** Create test cases for typical usage patterns ### 3. Snapshot Pollution - **Problem:** Snapshots updated but changes not reviewed - **Solution:** Review snapshot diffs before committing - **Validation:** `git diff --no-index old-snapshot new-snapshot` ### 4. Performance Regressions - **Problem:** New API performs worse than old API - **Solution:** Add performance benchmarks for critical components - **Validation:** Use React DevTools Profiler ## Automated Validation Scripts ### Pre-commit Validation ```bash #!/bin/bash # scripts/validate-breaking-change.sh echo "🔍 Validating breaking change implementation..." # 1. Check TypeScript compilation echo "Checking TypeScript..." lerna run type-check || exit 1 # 2. Run tests echo "Running tests..." lerna run test || exit 1 # 3. Check for old API usage echo "Checking for old API usage..." if grep -r "oldProp" packages/ --include="*.ts" --include="*.tsx"; then echo "❌ Found old API usage" exit 1 fi # 4. Build validation echo "Validating build..." lerna run build || exit 1 echo "✅ Breaking change validation passed" ``` ================================================ FILE: .claude/skills/vibe-breaking-change/references/workflow-checklist.md ================================================ # Complete Breaking Change Workflow Checklist ## Pre-Implementation Phase ### Planning and Analysis - [ ] Breaking change request approved by team - [ ] Impact analysis completed - [ ] Alternative solutions considered and ruled out - [ ] Migration strategy defined - [ ] Timeline established ### Dependency Mapping - [ ] Direct dependencies identified - [ ] Indirect dependencies mapped - [ ] Cross-package impacts assessed - [ ] Test dependencies catalogued - [ ] Documentation dependencies noted ## Implementation Phase ### Code Changes - [ ] Target component updated with breaking change - [ ] TypeScript interfaces updated - [ ] Component logic implements new API - [ ] Old API removed or deprecated appropriately - [ ] Component constants updated ### Dependent Components - [ ] Direct dependents updated - [ ] Prop passing updated - [ ] Event handling updated - [ ] Composition patterns maintained - [ ] Integration points verified ### Type System - [ ] Component props interfaces updated - [ ] Export types updated - [ ] Enum to string union conversions (if applicable) - [ ] Generic constraints updated - [ ] Utility type helpers updated ## Testing Phase ### Unit Testing - [ ] Component tests updated for new API - [ ] Old API tests removed - [ ] Edge cases covered - [ ] Error conditions tested - [ ] Accessibility tests updated ### Integration Testing - [ ] Dependent component tests updated - [ ] Cross-package integration tested - [ ] Composition scenarios tested - [ ] Event flow tested - [ ] State management tested ### Build and Compilation - [ ] TypeScript compilation passes - [ ] All packages build successfully - [ ] No circular dependencies - [ ] Import/export consistency verified - [ ] Bundle size impact assessed ### Quality Assurance - [ ] Linting passes - [ ] Style linting passes - [ ] Prettier formatting applied - [ ] No console errors/warnings - [ ] Performance benchmarks within acceptable range ## Documentation Phase ### Migration Guide - [ ] Clear before/after examples - [ ] Migration strategies documented - [ ] Common issues addressed - [ ] Validation steps provided - [ ] Timeline for migration suggested ### API Documentation - [ ] Component API docs updated - [ ] Props documentation current - [ ] Examples reflect new API - [ ] TypeScript signatures accurate - [ ] Deprecation notices removed ### Changelog - [ ] Breaking change clearly flagged - [ ] Version bump appropriate - [ ] Impact description clear - [ ] Migration instructions included - [ ] Related issues referenced ## Codemod Phase (If Applicable) ### Codemod Development - [ ] Transform logic implements correctly - [ ] Edge cases handled - [ ] TypeScript compatibility maintained - [ ] JSX patterns covered - [ ] Test cases comprehensive ### Codemod Testing - [ ] Dry run on real examples - [ ] Before/after comparison reviewed - [ ] Complex scenarios tested - [ ] Error handling validated - [ ] Performance acceptable ### Codemod Integration - [ ] Added to codemod CLI - [ ] Documentation written - [ ] Usage examples provided - [ ] Integration tests added - [ ] Release notes updated ## Validation Phase ### Comprehensive Testing - [ ] Full test suite passes - [ ] Storybook stories render correctly - [ ] Example applications work - [ ] Performance tests pass - [ ] Accessibility tests pass ### Build Verification - [ ] All packages build - [ ] Linting checks pass - [ ] Type checking passes - [ ] Bundle analysis clean - [ ] No build warnings ### Manual Testing - [ ] Component behavior verified in browser - [ ] Responsive behavior tested - [ ] Keyboard navigation tested - [ ] Screen reader compatibility verified - [ ] Cross-browser testing completed ## Release Phase ### Branch and Commit - [ ] Feature branch created from vibe4 - [ ] Meaningful commit messages - [ ] Breaking change flagged in commit - [ ] Co-authored appropriately - [ ] Commit history clean ### Pull Request - [ ] PR title follows convention - [ ] Description comprehensive and clear - [ ] Breaking changes highlighted - [ ] Migration instructions included - [ ] Task/issue linked - [ ] Reviewers assigned ### Code Review - [ ] API design reviewed - [ ] Implementation reviewed - [ ] Test coverage reviewed - [ ] Documentation reviewed - [ ] Migration path validated ### CI/CD Pipeline - [ ] All automated tests pass - [ ] Build artifacts generated - [ ] Quality gates passed - [ ] Security scans clean - [ ] Performance benchmarks acceptable ## Post-Implementation Phase ### Merge and Deploy - [ ] PR approved and merged - [ ] Branch cleaned up - [ ] Version tagged appropriately - [ ] Release notes published - [ ] Team notified of changes ### Monitoring - [ ] Error rates monitored - [ ] Performance impact tracked - [ ] User feedback collected - [ ] Migration adoption tracked - [ ] Support requests handled ### Follow-up Actions - [ ] Migration deadline set and communicated - [ ] Deprecated API removal scheduled - [ ] Backward compatibility plan finalized - [ ] Success metrics defined - [ ] Lessons learned documented ================================================ FILE: .cursor/rules/accessibility-guidelines.mdc ================================================ --- description: Provides general web accessibility guidelines for developing components in the `@vibe/core` library (under `packages/core/`). This rule covers adherence to WCAG, use of semantic HTML, correct ARIA attribute application, ensuring keyboard navigability, proper focus management, and context-appropriate labeling for form inputs within components. globs: alwaysApply: false --- # Web Accessibility Guidelines This document outlines general web accessibility guidelines to ensure our components are usable by everyone, including people with disabilities. Adherence to these guidelines is crucial for creating inclusive digital experiences. This document is only relevant for the "@vibe/core" library, which is at "packages/core" directory. ## 1. WCAG Compliance - **Follow WCAG:** Always strive to meet the Web Content Accessibility Guidelines (WCAG) at the AA level. Refer to the latest official WCAG documentation known to you for specific success criteria and techniques. ## 2. Semantic HTML - **Use HTML Semantically:** Utilize HTML elements according to their intended purpose. For example, use `