diff --git a/.github/workflows/ui-patterns-tests.yml b/.github/workflows/ui-patterns-tests.yml index 4c2655def57..c1a20d90fa9 100644 --- a/.github/workflows/ui-patterns-tests.yml +++ b/.github/workflows/ui-patterns-tests.yml @@ -43,10 +43,10 @@ jobs: - name: Validate exports run: | pnpm --filter ui-patterns gen:exports - if ! git diff --ignore-space-at-eol --exit-code --quiet packages/ui-patterns/package.json then - echo "Detected uncommitted changes after build. Run pnpm --filter ui-patterns gen:exports to fix it." - git diff - exit 1 + if ! git diff --ignore-space-at-eol --exit-code --quiet packages/ui-patterns/package.json; then + echo "Detected uncommitted changes after build. Run pnpm --filter ui-patterns gen:exports to fix it."; + git diff; + exit 1; fi - name: Run tests run: pnpm run test:ui-patterns diff --git a/apps/design-system/components/theme-settings.tsx b/apps/design-system/components/theme-settings.tsx index 7b72bd9daab..19abbeef152 100644 --- a/apps/design-system/components/theme-settings.tsx +++ b/apps/design-system/components/theme-settings.tsx @@ -3,7 +3,7 @@ import { useTheme } from 'next-themes' import { useEffect, useState } from 'react' import SVG from 'react-inlinesvg' -import { RadioGroup, RadioGroupLargeItem, singleThemes, Theme } from 'ui' +import { RadioGroup, RadioGroupLargeItem, singleThemes } from 'ui' const ThemeSettings = () => { const [mounted, setMounted] = useState(false) @@ -33,7 +33,7 @@ const ThemeSettings = () => { value={theme} className="flex flex-wrap gap-3" > - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( diff --git a/apps/design-system/components/theme-switcher-dropdown.tsx b/apps/design-system/components/theme-switcher-dropdown.tsx index 23b706a9c47..039f00a1911 100644 --- a/apps/design-system/components/theme-switcher-dropdown.tsx +++ b/apps/design-system/components/theme-switcher-dropdown.tsx @@ -13,7 +13,6 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, singleThemes, - Theme, } from 'ui' const ThemeSwitcherDropdown = () => { @@ -59,7 +58,7 @@ const ThemeSwitcherDropdown = () => { value={theme} onValueChange={(themeValue) => setTheme(themeValue)} > - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( {theme.name} diff --git a/apps/docs/components/Navigation/NavigationMenu/TopNavDropdown.tsx b/apps/docs/components/Navigation/NavigationMenu/TopNavDropdown.tsx index 530c8820949..383d42d9ed2 100644 --- a/apps/docs/components/Navigation/NavigationMenu/TopNavDropdown.tsx +++ b/apps/docs/components/Navigation/NavigationMenu/TopNavDropdown.tsx @@ -17,8 +17,7 @@ import { DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, - Theme, - themes, + singleThemes, } from 'ui' import MenuIconPicker from './MenuIconPicker' @@ -106,9 +105,9 @@ const TopNavDropdown = () => { setTheme(value) }} > - {themes + {singleThemes .filter((x) => x.value === 'light' || x.value === 'dark' || x.value === 'system') - .map((theme: Theme) => ( + .map((theme) => ( {theme.name} diff --git a/apps/learn/components/theme-switcher-dropdown.tsx b/apps/learn/components/theme-switcher-dropdown.tsx index 9a53adadb1d..776909bb4f5 100644 --- a/apps/learn/components/theme-switcher-dropdown.tsx +++ b/apps/learn/components/theme-switcher-dropdown.tsx @@ -14,7 +14,6 @@ import { DropdownMenuTrigger, RadioGroup, singleThemes, - Theme, } from 'ui' const ThemeSwitcherDropdown = () => { @@ -75,7 +74,7 @@ const ThemeSwitcherDropdown = () => { value={theme} onValueChange={(themeValue) => setTheme(themeValue)} > - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( {theme.name} diff --git a/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx b/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx index 455dc84916e..6037e19d3b0 100644 --- a/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx +++ b/apps/studio/components/interfaces/Account/Preferences/ThemeSettings.tsx @@ -15,7 +15,6 @@ import { SelectValue, Separator, singleThemes, - Theme, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { @@ -58,7 +57,7 @@ export const ThemeSettings = () => { value={theme} className="grid grid-cols-2 gap-4" > - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( { @@ -75,7 +74,7 @@ const ThemeSwitcherDropdown = () => { value={theme} onValueChange={(themeValue) => setTheme(themeValue)} > - {singleThemes.map((theme: Theme) => ( + {singleThemes.map((theme) => ( {theme.name} diff --git a/apps/www/components/ImageModal.tsx b/apps/www/components/ImageModal.tsx index 8774bec7deb..fad5255ca5f 100644 --- a/apps/www/components/ImageModal.tsx +++ b/apps/www/components/ImageModal.tsx @@ -1,6 +1,7 @@ +import { cva } from 'class-variance-authority' import { Dialog } from 'radix-ui' import { useEffect, useState } from 'react' -import styleHandler from 'ui/src/lib/theme/styleHandler' +import { cn } from 'ui' export type ImageModalProps = RadixProps & Props @@ -24,6 +25,28 @@ interface Props { className?: string } +const dialogContentVariants = cva( + cn('relative data-open:animate-overlay-show data-closed:animate-overlay-hide'), + { + variants: { + size: { + tiny: `sm:align-middle sm:w-full sm:max-w-xs`, + small: `sm:align-middle sm:w-full sm:max-w-sm`, + medium: `sm:align-middle sm:w-full sm:max-w-lg`, + large: `sm:align-middle sm:w-full md:max-w-xl`, + xlarge: `sm:align-middle sm:w-full md:max-w-3xl`, + xxlarge: `sm:align-middle sm:w-full max-w-screen md:max-w-6xl`, + xxxlarge: `sm:align-middle sm:w-full md:max-w-7xl`, + }, + }, + } +) + +const overlayClasses = + 'z-40 fixed bg-alternative h-full w-full left-0 top-0 opacity-75 data-closed:animate-fade-out-overlay-bg data-open:animate-fade-in-overlay-bg' +const scrollOverlayClasses = + 'z-40 fixed inset-0 grid place-items-center overflow-y-auto data-open:animate-overlay-show data-closed:animate-overlay-hide' + /** * Similar to ui/Modal component but with an unstyled dialog content component. * Mainly used to show images in a overlay. @@ -37,8 +60,6 @@ const ImageModal = ({ }: ImageModalProps) => { const [open, setOpen] = useState(visible ? visible : false) - const __styles = styleHandler('modal') - useEffect(() => { setOpen(visible) }, [visible]) @@ -53,14 +74,12 @@ const ImageModal = ({ } } - const contentClasses = 'relative data-open:animate-overlay-show data-closed:animate-overlay-hide' - return ( - - - + + + {children} @@ -70,8 +89,7 @@ const ImageModal = ({ } function Content({ children }: { children: React.ReactNode }) { - const __styles = styleHandler('modal') - return
{children}
+ return
{children}
} ImageModal.Content = Content diff --git a/packages/ui-patterns/package.json b/packages/ui-patterns/package.json index 2f843672147..6ffff31a805 100644 --- a/packages/ui-patterns/package.json +++ b/packages/ui-patterns/package.json @@ -86,6 +86,10 @@ "import": "./src/CommandMenu/api/CommandHeader.tsx", "types": "./src/CommandMenu/api/CommandHeader.tsx" }, + "./CommandMenu/api/CommandMenu": { + "import": "./src/CommandMenu/api/CommandMenu.tsx", + "types": "./src/CommandMenu/api/CommandMenu.tsx" + }, "./CommandMenu/api/CommandMenuInput": { "import": "./src/CommandMenu/api/CommandMenuInput.tsx", "types": "./src/CommandMenu/api/CommandMenuInput.tsx" @@ -94,10 +98,6 @@ "import": "./src/CommandMenu/api/CommandMenuList.tsx", "types": "./src/CommandMenu/api/CommandMenuList.tsx" }, - "./CommandMenu/api/CommandMenu": { - "import": "./src/CommandMenu/api/CommandMenu.tsx", - "types": "./src/CommandMenu/api/CommandMenu.tsx" - }, "./CommandMenu/api/CommandProvider": { "import": "./src/CommandMenu/api/CommandProvider.tsx", "types": "./src/CommandMenu/api/CommandProvider.tsx" @@ -106,18 +106,10 @@ "import": "./src/CommandMenu/api/TextHighlighter.tsx", "types": "./src/CommandMenu/api/TextHighlighter.tsx" }, - "./CommandMenu/api/hooks/commandsHooks.test": { - "import": "./src/CommandMenu/api/hooks/commandsHooks.test.tsx", - "types": "./src/CommandMenu/api/hooks/commandsHooks.test.tsx" - }, "./CommandMenu/api/hooks/commandsHooks": { "import": "./src/CommandMenu/api/hooks/commandsHooks.ts", "types": "./src/CommandMenu/api/hooks/commandsHooks.ts" }, - "./CommandMenu/api/hooks/pagesHooks.test": { - "import": "./src/CommandMenu/api/hooks/pagesHooks.test.tsx", - "types": "./src/CommandMenu/api/hooks/pagesHooks.test.tsx" - }, "./CommandMenu/api/hooks/pagesHooks": { "import": "./src/CommandMenu/api/hooks/pagesHooks.ts", "types": "./src/CommandMenu/api/hooks/pagesHooks.ts" @@ -162,10 +154,6 @@ "import": "./src/CommandMenu/index.tsx", "types": "./src/CommandMenu/index.tsx" }, - "./CommandMenu/internal/CommandMenuItem": { - "import": "./src/CommandMenu/internal/CommandMenuItem.tsx", - "types": "./src/CommandMenu/internal/CommandMenuItem.tsx" - }, "./CommandMenu/internal/CommandMenuEmpty": { "import": "./src/CommandMenu/internal/CommandMenuEmpty.tsx", "types": "./src/CommandMenu/internal/CommandMenuEmpty.tsx" @@ -174,6 +162,10 @@ "import": "./src/CommandMenu/internal/CommandMenuGroup.tsx", "types": "./src/CommandMenu/internal/CommandMenuGroup.tsx" }, + "./CommandMenu/internal/CommandMenuItem": { + "import": "./src/CommandMenu/internal/CommandMenuItem.tsx", + "types": "./src/CommandMenu/internal/CommandMenuItem.tsx" + }, "./CommandMenu/internal/CommandSection": { "import": "./src/CommandMenu/internal/CommandSection.tsx", "types": "./src/CommandMenu/internal/CommandSection.tsx" @@ -186,14 +178,6 @@ "import": "./src/CommandMenu/internal/state/commandsState.ts", "types": "./src/CommandMenu/internal/state/commandsState.ts" }, - "./CommandMenu/internal/state/commandsStates.test": { - "import": "./src/CommandMenu/internal/state/commandsStates.test.ts", - "types": "./src/CommandMenu/internal/state/commandsStates.test.ts" - }, - "./CommandMenu/internal/state/pagesState.test": { - "import": "./src/CommandMenu/internal/state/pagesState.test.ts", - "types": "./src/CommandMenu/internal/state/pagesState.test.ts" - }, "./CommandMenu/internal/state/pagesState": { "import": "./src/CommandMenu/internal/state/pagesState.ts", "types": "./src/CommandMenu/internal/state/pagesState.ts" @@ -238,10 +222,6 @@ "import": "./src/CommandMenu/prepackaged/Support.tsx", "types": "./src/CommandMenu/prepackaged/Support.tsx" }, - "./CommandMenu/prepackaged/ThemeSwitcher.test": { - "import": "./src/CommandMenu/prepackaged/ThemeSwitcher.test.tsx", - "types": "./src/CommandMenu/prepackaged/ThemeSwitcher.test.tsx" - }, "./CommandMenu/prepackaged/ThemeSwitcher": { "import": "./src/CommandMenu/prepackaged/ThemeSwitcher.tsx", "types": "./src/CommandMenu/prepackaged/ThemeSwitcher.tsx" @@ -258,10 +238,6 @@ "import": "./src/CommandMenu/prepackaged/ai/queryAi.ts", "types": "./src/CommandMenu/prepackaged/ai/queryAi.ts" }, - "./CommandMenu/prepackaged/ai/useAiChat.test": { - "import": "./src/CommandMenu/prepackaged/ai/useAiChat.test.ts", - "types": "./src/CommandMenu/prepackaged/ai/useAiChat.test.ts" - }, "./CommandMenu/prepackaged/ai/useAiChat": { "import": "./src/CommandMenu/prepackaged/ai/useAiChat.ts", "types": "./src/CommandMenu/prepackaged/ai/useAiChat.ts" @@ -310,6 +286,10 @@ "import": "./src/DataInputs/Input.tsx", "types": "./src/DataInputs/Input.tsx" }, + "./DatePicker/DatePicker": { + "import": "./src/DatePicker/DatePicker.tsx", + "types": "./src/DatePicker/DatePicker.tsx" + }, "./DatePicker": { "import": "./src/DatePicker/index.ts", "types": "./src/DatePicker/index.ts" @@ -350,10 +330,6 @@ "import": "./src/FilterBar/DefaultCommandList.tsx", "types": "./src/FilterBar/DefaultCommandList.tsx" }, - "./FilterBar/FilterBar.test": { - "import": "./src/FilterBar/FilterBar.test.tsx", - "types": "./src/FilterBar/FilterBar.test.tsx" - }, "./FilterBar/FilterBar": { "import": "./src/FilterBar/FilterBar.tsx", "types": "./src/FilterBar/FilterBar.tsx" @@ -374,10 +350,6 @@ "import": "./src/FilterBar/OperatorSymbolBadge.tsx", "types": "./src/FilterBar/OperatorSymbolBadge.tsx" }, - "./FilterBar/hooks.test": { - "import": "./src/FilterBar/hooks.test.ts", - "types": "./src/FilterBar/hooks.test.ts" - }, "./FilterBar/hooks": { "import": "./src/FilterBar/hooks.ts", "types": "./src/FilterBar/hooks.ts" @@ -386,10 +358,6 @@ "import": "./src/FilterBar/index.ts", "types": "./src/FilterBar/index.ts" }, - "./FilterBar/menuItems.test": { - "import": "./src/FilterBar/menuItems.test.ts", - "types": "./src/FilterBar/menuItems.test.ts" - }, "./FilterBar/menuItems": { "import": "./src/FilterBar/menuItems.ts", "types": "./src/FilterBar/menuItems.ts" @@ -414,10 +382,6 @@ "import": "./src/FilterBar/useKeyboardNavigation.ts", "types": "./src/FilterBar/useKeyboardNavigation.ts" }, - "./FilterBar/utils.test": { - "import": "./src/FilterBar/utils.test.ts", - "types": "./src/FilterBar/utils.test.ts" - }, "./FilterBar/utils": { "import": "./src/FilterBar/utils.ts", "types": "./src/FilterBar/utils.ts" @@ -450,17 +414,29 @@ "import": "./src/LogsBarChart/index.tsx", "types": "./src/LogsBarChart/index.tsx" }, + "./Markdown/components": { + "import": "./src/Markdown/components.tsx", + "types": "./src/Markdown/components.tsx" + }, "./Markdown": { "import": "./src/Markdown/index.tsx", "types": "./src/Markdown/index.tsx" }, + "./McpUrlBuilder/McpConfigPanel.md": { + "import": "./src/McpUrlBuilder/McpConfigPanel.md.tsx", + "types": "./src/McpUrlBuilder/McpConfigPanel.md.tsx" + }, "./McpUrlBuilder/McpConfigPanel": { "import": "./src/McpUrlBuilder/McpConfigPanel.tsx", "types": "./src/McpUrlBuilder/McpConfigPanel.tsx" }, - "./McpUrlBuilder/McpConfigPanel.md": { - "import": "./src/McpUrlBuilder/McpConfigPanel.md.tsx", - "types": "./src/McpUrlBuilder/McpConfigPanel.md.tsx" + "./McpUrlBuilder/clients.data": { + "import": "./src/McpUrlBuilder/clients.data.ts", + "types": "./src/McpUrlBuilder/clients.data.ts" + }, + "./McpUrlBuilder/clients.instructions.md": { + "import": "./src/McpUrlBuilder/clients.instructions.md.tsx", + "types": "./src/McpUrlBuilder/clients.instructions.md.tsx" }, "./McpUrlBuilder/components/ClientSelectDropdown": { "import": "./src/McpUrlBuilder/components/ClientSelectDropdown.tsx", @@ -470,6 +446,10 @@ "import": "./src/McpUrlBuilder/components/ConnectionIcon.tsx", "types": "./src/McpUrlBuilder/components/ConnectionIcon.tsx" }, + "./McpUrlBuilder/components/InstructionBlocks": { + "import": "./src/McpUrlBuilder/components/InstructionBlocks.tsx", + "types": "./src/McpUrlBuilder/components/InstructionBlocks.tsx" + }, "./McpUrlBuilder/components/McpConfigurationDisplay": { "import": "./src/McpUrlBuilder/components/McpConfigurationDisplay.tsx", "types": "./src/McpUrlBuilder/components/McpConfigurationDisplay.tsx" @@ -478,22 +458,14 @@ "import": "./src/McpUrlBuilder/components/McpConfigurationOptions.tsx", "types": "./src/McpUrlBuilder/components/McpConfigurationOptions.tsx" }, - "./McpUrlBuilder/clients.data": { - "import": "./src/McpUrlBuilder/clients.data.ts", - "types": "./src/McpUrlBuilder/clients.data.ts" - }, - "./McpUrlBuilder/utils/serializeMcpConfig": { - "import": "./src/McpUrlBuilder/utils/serializeMcpConfig.ts", - "types": "./src/McpUrlBuilder/utils/serializeMcpConfig.ts" + "./McpUrlBuilder": { + "import": "./src/McpUrlBuilder/index.ts", + "types": "./src/McpUrlBuilder/index.ts" }, "./McpUrlBuilder/mcpClients": { "import": "./src/McpUrlBuilder/mcpClients.tsx", "types": "./src/McpUrlBuilder/mcpClients.tsx" }, - "./McpUrlBuilder": { - "import": "./src/McpUrlBuilder/index.ts", - "types": "./src/McpUrlBuilder/index.ts" - }, "./McpUrlBuilder/types": { "import": "./src/McpUrlBuilder/types.ts", "types": "./src/McpUrlBuilder/types.ts" @@ -506,10 +478,6 @@ "import": "./src/McpUrlBuilder/utils/getMcpButtonData.ts", "types": "./src/McpUrlBuilder/utils/getMcpButtonData.ts" }, - "./McpUrlBuilder/utils/getMcpIconSrc.test": { - "import": "./src/McpUrlBuilder/utils/getMcpIconSrc.test.ts", - "types": "./src/McpUrlBuilder/utils/getMcpIconSrc.test.ts" - }, "./McpUrlBuilder/utils/getMcpIconSrc": { "import": "./src/McpUrlBuilder/utils/getMcpIconSrc.ts", "types": "./src/McpUrlBuilder/utils/getMcpIconSrc.ts" @@ -522,6 +490,10 @@ "import": "./src/McpUrlBuilder/utils/mcpIconAssets.ts", "types": "./src/McpUrlBuilder/utils/mcpIconAssets.ts" }, + "./McpUrlBuilder/utils/serializeMcpConfig": { + "import": "./src/McpUrlBuilder/utils/serializeMcpConfig.ts", + "types": "./src/McpUrlBuilder/utils/serializeMcpConfig.ts" + }, "./Mermaid/Mermaid": { "import": "./src/Mermaid/Mermaid.tsx", "types": "./src/Mermaid/Mermaid.tsx" @@ -534,10 +506,6 @@ "import": "./src/MetricCard/index.tsx", "types": "./src/MetricCard/index.tsx" }, - "./MobileSheetNav/MobileSheetNav.test": { - "import": "./src/MobileSheetNav/MobileSheetNav.test.tsx", - "types": "./src/MobileSheetNav/MobileSheetNav.test.tsx" - }, "./MobileSheetNav/MobileSheetNav": { "import": "./src/MobileSheetNav/MobileSheetNav.tsx", "types": "./src/MobileSheetNav/MobileSheetNav.tsx" @@ -546,26 +514,14 @@ "import": "./src/MobileSheetNav/index.ts", "types": "./src/MobileSheetNav/index.ts" }, - "./MultiSelectDeprecated/Badges": { - "import": "./src/MultiSelectDeprecated/Badges.tsx", - "types": "./src/MultiSelectDeprecated/Badges.tsx" - }, - "./MultiSelectDeprecated/MultiSelectV2": { - "import": "./src/MultiSelectDeprecated/MultiSelectV2.tsx", - "types": "./src/MultiSelectDeprecated/MultiSelectV2.tsx" - }, - "./MultiSelectDeprecated": { - "import": "./src/MultiSelectDeprecated/index.tsx", - "types": "./src/MultiSelectDeprecated/index.tsx" - }, - "./MultipleCodeBlock/index.test": { - "import": "./src/MultipleCodeBlock/index.test.tsx", - "types": "./src/MultipleCodeBlock/index.test.tsx" - }, "./MultipleCodeBlock": { "import": "./src/MultipleCodeBlock/index.tsx", "types": "./src/MultipleCodeBlock/index.tsx" }, + "./PageBreadcrumbs": { + "import": "./src/PageBreadcrumbs/index.tsx", + "types": "./src/PageBreadcrumbs/index.tsx" + }, "./PageContainer": { "import": "./src/PageContainer/index.tsx", "types": "./src/PageContainer/index.tsx" @@ -574,10 +530,6 @@ "import": "./src/PageHeader/index.tsx", "types": "./src/PageHeader/index.tsx" }, - "./PageBreadcrumbs": { - "import": "./src/PageBreadcrumbs/index.tsx", - "types": "./src/PageBreadcrumbs/index.tsx" - }, "./PageNav": { "import": "./src/PageNav/index.tsx", "types": "./src/PageNav/index.tsx" @@ -614,10 +566,6 @@ "import": "./src/Row/Row.utils.ts", "types": "./src/Row/Row.utils.ts" }, - "./Row/index.test": { - "import": "./src/Row/index.test.ts", - "types": "./src/Row/index.test.ts" - }, "./Row": { "import": "./src/Row/index.tsx", "types": "./src/Row/index.tsx" @@ -678,6 +626,14 @@ "import": "./src/StatusCode/index.tsx", "types": "./src/StatusCode/index.tsx" }, + "./Table/TanStackTableHeadSort": { + "import": "./src/Table/TanStackTableHeadSort.tsx", + "types": "./src/Table/TanStackTableHeadSort.tsx" + }, + "./Table": { + "import": "./src/Table/index.ts", + "types": "./src/Table/index.ts" + }, "./TextLink": { "import": "./src/TextLink/index.tsx", "types": "./src/TextLink/index.tsx" @@ -686,14 +642,14 @@ "import": "./src/ThemeToggle.tsx", "types": "./src/ThemeToggle.tsx" }, + "./TimestampInfo/TimestampInfoProvider": { + "import": "./src/TimestampInfo/TimestampInfoProvider.tsx", + "types": "./src/TimestampInfo/TimestampInfoProvider.tsx" + }, "./TimestampInfo": { "import": "./src/TimestampInfo/index.tsx", "types": "./src/TimestampInfo/index.tsx" }, - "./Table": { - "import": "./src/Table/index.ts", - "types": "./src/Table/index.ts" - }, "./Toc": { "import": "./src/Toc/index.ts", "types": "./src/Toc/index.ts" @@ -734,14 +690,14 @@ "import": "./src/admonition.tsx", "types": "./src/admonition.tsx" }, - "./consent": { - "import": "./src/consent.tsx", - "types": "./src/consent.tsx" - }, "./collapsible-alert": { "import": "./src/collapsible-alert.tsx", "types": "./src/collapsible-alert.tsx" }, + "./consent": { + "import": "./src/consent.tsx", + "types": "./src/consent.tsx" + }, "./form/FormItemLayout/FormItemLayout": { "import": "./src/form/FormItemLayout/FormItemLayout.tsx", "types": "./src/form/FormItemLayout/FormItemLayout.tsx" @@ -750,10 +706,6 @@ "import": "./src/form/FormLayout2.tsx", "types": "./src/form/FormLayout2.tsx" }, - "./form/KeyValueFieldArray/KeyValueFieldArray.test": { - "import": "./src/form/KeyValueFieldArray/KeyValueFieldArray.test.tsx", - "types": "./src/form/KeyValueFieldArray/KeyValueFieldArray.test.tsx" - }, "./form/KeyValueFieldArray/KeyValueFieldArray": { "import": "./src/form/KeyValueFieldArray/KeyValueFieldArray.tsx", "types": "./src/form/KeyValueFieldArray/KeyValueFieldArray.tsx" @@ -762,18 +714,14 @@ "import": "./src/form/KeyValueFieldArray/validation.ts", "types": "./src/form/KeyValueFieldArray/validation.ts" }, - "./form/SingleValueFieldArray/SingleValueFieldArray.test": { - "import": "./src/form/SingleValueFieldArray/SingleValueFieldArray.test.tsx", - "types": "./src/form/SingleValueFieldArray/SingleValueFieldArray.test.tsx" + "./form/Layout/FormLayout": { + "import": "./src/form/Layout/FormLayout.tsx", + "types": "./src/form/Layout/FormLayout.tsx" }, "./form/SingleValueFieldArray/SingleValueFieldArray": { "import": "./src/form/SingleValueFieldArray/SingleValueFieldArray.tsx", "types": "./src/form/SingleValueFieldArray/SingleValueFieldArray.tsx" }, - "./form/Layout/FormLayout": { - "import": "./src/form/Layout/FormLayout.tsx", - "types": "./src/form/Layout/FormLayout.tsx" - }, "./form/utils": { "import": "./src/form/utils.tsx", "types": "./src/form/utils.tsx" @@ -786,10 +734,6 @@ "import": "./src/multi-select/index.tsx", "types": "./src/multi-select/index.tsx" }, - "./multi-select/multi-select.test": { - "import": "./src/multi-select/multi-select.test.tsx", - "types": "./src/multi-select/multi-select.test.tsx" - }, "./multi-select/multi-select": { "import": "./src/multi-select/multi-select.tsx", "types": "./src/multi-select/multi-select.tsx" diff --git a/packages/ui-patterns/scripts/update-exports.ts b/packages/ui-patterns/scripts/update-exports.ts index 0ce204860fe..f9848d9dbf5 100644 --- a/packages/ui-patterns/scripts/update-exports.ts +++ b/packages/ui-patterns/scripts/update-exports.ts @@ -1,4 +1,5 @@ import * as fs from 'node:fs' +import { EOL } from 'node:os' import * as path from 'node:path' const SRC_DIR = path.resolve(__dirname, '..', 'src') @@ -19,7 +20,7 @@ function getAllSourceFiles(dir: string): ExportMap { if (entry.isDirectory()) { Object.assign(exportsMap, getAllSourceFiles(fullPath)) - } else if (entry.isFile() && /\.(ts|tsx|css)$/.test(entry.name)) { + } else if (entry.isFile() && /\.(ts|tsx|css)$/.test(entry.name) && !/\.test/.test(entry.name)) { const relativePath = path.relative(SRC_DIR, fullPath) const noExtension = relativePath.replace(/\.(ts|tsx)$/, '') const segments = noExtension.split(path.sep) @@ -48,14 +49,11 @@ function updatePackageJson(exportsMap: ExportMap): void { packageJson.exports = { './package.json': './package.json', - '.': { - import: './index.tsx', - types: './index.tsx', - }, ...exportsMap, } fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)) + fs.appendFileSync(packageJsonPath, EOL, 'utf8') console.log('✅ package.json exports updated (with clean index paths).') } diff --git a/packages/ui-patterns/src/AuthenticatedDropdownMenu/index.tsx b/packages/ui-patterns/src/AuthenticatedDropdownMenu/index.tsx index 75d2cd8bf6b..447c282197b 100644 --- a/packages/ui-patterns/src/AuthenticatedDropdownMenu/index.tsx +++ b/packages/ui-patterns/src/AuthenticatedDropdownMenu/index.tsx @@ -19,9 +19,8 @@ import { DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger, + singleThemes, } from 'ui' -import { themes } from 'ui/src/components/ThemeProvider/themes' -import type { Theme } from 'ui/src/components/ThemeProvider/themes' interface Props { menu: menuItem[][] @@ -116,11 +115,11 @@ export const AuthenticatedDropdownMenu = ({ user, menu, site }: Props) => { setTheme(value) }} > - {themes + {singleThemes .filter( (x) => x.value === 'light' || x.value === 'dark' || x.value === 'system' ) - .map((theme: Theme) => ( + .map((theme) => ( name === 'System' || name === 'Light' || name === 'Dark') .map((theme) => ({ id: `switch-theme-${theme.value}`, diff --git a/packages/ui-patterns/src/ThemeToggle.tsx b/packages/ui-patterns/src/ThemeToggle.tsx index 4d416e7c2ff..b980d7ef9f6 100644 --- a/packages/ui-patterns/src/ThemeToggle.tsx +++ b/packages/ui-patterns/src/ThemeToggle.tsx @@ -11,8 +11,7 @@ import { DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger, - Theme, - themes, + singleThemes, } from 'ui' interface ThemeToggleProps { @@ -65,9 +64,9 @@ export const ThemeToggle = ({ setTheme(value) }} > - {themes + {singleThemes .filter((x) => x.value === 'dark' || x.value === 'light' || x.value === 'system') - .map((theme: Theme) => ( + .map((theme) => ( {theme.name} diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index f8cc6ed682d..fccd9efd4ea 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -37,7 +37,6 @@ export * from './src/components/LoadingLine' export * from './src/layout/ai-icon-animation' // theme switcher -export * from './src/components/ThemeProvider/themes' export * from './src/components/ThemeProvider/singleThemes' // shadcn diff --git a/packages/ui/src/components/Icon/IconBase.tsx b/packages/ui/src/components/Icon/IconBase.tsx index 0ef5f1bce90..b805432261c 100644 --- a/packages/ui/src/components/Icon/IconBase.tsx +++ b/packages/ui/src/components/Icon/IconBase.tsx @@ -2,7 +2,6 @@ import React from 'react' -import styleHandler from '../../lib/theme/styleHandler' import { cn } from '../../lib/utils/cn' import { IconContext } from './IconContext' @@ -37,8 +36,6 @@ function IconBase({ icon, ...props }: Props) { - const __styles = styleHandler('icon') - return ( {({ contextSize, className: contextClassName }) => { @@ -119,7 +116,11 @@ function IconBase({ IconComponent() ) - return background ?
{Icon}
: Icon + return background ? ( +
{Icon}
+ ) : ( + Icon + ) }}
) diff --git a/packages/ui/src/components/Loading/Loading.tsx b/packages/ui/src/components/Loading/Loading.tsx index 9dffef2eda2..fa179b8022e 100644 --- a/packages/ui/src/components/Loading/Loading.tsx +++ b/packages/ui/src/components/Loading/Loading.tsx @@ -1,7 +1,6 @@ import { Loader2 } from 'lucide-react' import React from 'react' -import styleHandler from '../../lib/theme/styleHandler' import { cn } from '../../lib/utils/cn' interface Props { @@ -10,22 +9,26 @@ interface Props { isFullHeight?: boolean } export default function Loading({ children, active, isFullHeight = false }: Props) { - const __styles = styleHandler('loading') - - let classNames = [__styles.base] - - let contentClasses = [__styles.content.base] - - if (active) { - contentClasses.push(__styles.content.active) - } - - let spinnerClasses = [__styles.spinner] - return ( -
-
{children}
- {active && } +
+
+ {children} +
+ {active && ( + + )}
) } diff --git a/packages/ui/src/components/Menu/Menu.tsx b/packages/ui/src/components/Menu/Menu.tsx index 262d2fab14f..87d67edf655 100644 --- a/packages/ui/src/components/Menu/Menu.tsx +++ b/packages/ui/src/components/Menu/Menu.tsx @@ -1,8 +1,8 @@ 'use client' +import { cva } from 'class-variance-authority' import React from 'react' -import styleHandler from '../../lib/theme/styleHandler' import { cn } from '../../lib/utils/cn' import { MenuContextProvider, useMenuContext } from './MenuContext' @@ -42,45 +42,84 @@ interface ItemProps { style?: React.CSSProperties } +export const menuItemVariants = cva( + cn( + 'cursor-pointer flex space-x-3 items-center outline-hidden focus-visible:ring-1 ring-foreground-muted focus-visible:z-10 group' + ), + { + variants: { + type: { + text: 'py-1', + border: 'px-4 py-1', + pills: 'my-px px-3 py-[3px] rounded-md transition-colors active:bg-sidebar-accent/50', + }, + active: { + true: 'font-semibold z-10', + false: 'font-normal border-default group-hover:border-foreground-muted', + }, + }, + compoundVariants: [ + { + type: 'text', + active: true, + className: 'text-foreground-muted', + }, + { + type: 'border', + active: true, + className: 'text-foreground-muted border-l border-brand group-hover:border-brand', + }, + { + type: 'border', + active: false, + className: 'border-l', + }, + { + type: 'pills', + active: true, + className: 'bg-sidebar-accent text-foreground-lighter', + }, + { + type: 'pills', + active: false, + className: 'hover:bg-sidebar-accent/50', + }, + ], + defaultVariants: { + active: false, + }, + } +) + export function Item({ children, icon, active, onClick, style }: ItemProps) { - const __styles = styleHandler('menu') - const { type } = useMenuContext() - let classes = [__styles.item.base] - - classes.push(__styles.item.variants[type].base) - - if (active) { - classes.push(__styles.item.variants[type].active) - } else { - classes.push(__styles.item.variants[type].normal) - } - - let contentClasses = [__styles.item.content.base] - if (active) { - contentClasses.push(__styles.item.content.active) - } else { - contentClasses.push(__styles.item.content.normal) - } - - let iconClasses = [__styles.item.icon.base] - if (active) { - iconClasses.push(__styles.item.icon.active) - } else { - iconClasses.push(__styles.item.icon.normal) - } - return (
  • - {icon &&
    {icon}
    } - {children} + {icon && ( +
    + {icon} +
    + )} + + {children} +
  • ) } @@ -92,12 +131,15 @@ interface GroupProps { } export function Group({ children, icon, title }: GroupProps) { - const __styles = styleHandler('menu') const { type } = useMenuContext() return ( -
    - {icon && {icon}} - {title} +
    + {icon && {icon}} + {title} {children}
    ) diff --git a/packages/ui/src/components/SidePanel/SidePanel.tsx b/packages/ui/src/components/SidePanel/SidePanel.tsx index 721e1d052c8..9e1921305b0 100644 --- a/packages/ui/src/components/SidePanel/SidePanel.tsx +++ b/packages/ui/src/components/SidePanel/SidePanel.tsx @@ -1,11 +1,12 @@ 'use client' +import { cva } from 'class-variance-authority' import { Dialog } from 'radix-ui' import React from 'react' import { Button } from '../../components/Button/Button' import { Tooltip, TooltipContent, TooltipTrigger } from '../../components/shadcn/ui/tooltip' -import styleHandler from '../../lib/theme/styleHandler' +import { cn } from '../../lib/utils' export type SidePanelProps = RadixProps & CustomProps @@ -41,6 +42,34 @@ interface CustomProps { tooltip?: string } +export const sidePanelContentVariants = cva( + cn('z-50 bg-dash-sidebar flex flex-col fixed inset-y-0 h-full lg:h-screen border-l shadow-xl'), + { + variants: { + size: { + medium: `w-screen max-w-md h-full`, + large: `w-screen max-w-2xl h-full`, + xlarge: `w-screen max-w-3xl h-full`, + xxlarge: `w-screen max-w-4xl h-full`, + xxxlarge: `w-screen max-w-5xl h-full`, + xxxxlarge: `w-screen max-w-6xl h-full`, + }, + align: { + left: ` + left-0 + data-open:animate-panel-slide-left-out + data-closed:animate-panel-slide-left-in + `, + right: ` + right-0 + data-open:animate-panel-slide-right-out + data-closed:animate-panel-slide-right-in + `, + }, + }, + } +) + const SidePanel = ({ id, disabled, @@ -63,12 +92,10 @@ const SidePanel = ({ tooltip, ...props }: SidePanelProps) => { - const __styles = styleHandler('sidepanel') - const footerContent = customFooter ? ( customFooter ) : ( -
    +