From 43fbfc59b3c8bca078d035c1fe5efa17c0a3762c Mon Sep 17 00:00:00 2001 From: Lukas Lieb Date: Fri, 20 Mar 2026 15:11:20 +0100 Subject: [PATCH] Tailwind --- .vscode/extensions.json | 1 + .vscode/settings.json | 4 + database-editor.code-workspace | 12 +- eslint.config.mjs | 1 + integrations/standalone/package.json | 2 + integrations/standalone/src/index.css | 18 +- integrations/standalone/src/index.tsx | 2 +- integrations/standalone/vite.config.ts | 3 +- package.json | 1 + packages/database-editor/eslint.config.mjs | 10 + packages/database-editor/package.json | 2 + .../database-editor/src/DatabaseEditor.css | 7 - .../database-editor/src/DatabaseEditor.tsx | 24 ++- .../components/ImportWizard/ImportWizard.css | 9 - .../components/ImportWizard/ImportWizard.tsx | 3 +- .../components/ImportWizard/WizardContent.css | 19 -- .../components/ImportWizard/WizardContent.tsx | 13 +- .../components/AttributeSelection.css | 13 -- .../components/AttributeSelection.tsx | 13 +- .../ImportWizard/components/SelectionList.css | 38 ---- .../ImportWizard/components/SelectionList.tsx | 19 +- .../components/SelectionListButton.css | 13 -- .../components/SelectionListButton.tsx | 7 +- .../ImportWizard/components/Timeline.css | 52 ----- .../ImportWizard/components/Timeline.tsx | 39 ++-- .../ImportWizard/pages/CreationPage.css | 14 -- .../ImportWizard/pages/CreationPage.tsx | 25 ++- .../ImportWizard/pages/CreationResult.css | 20 -- .../ImportWizard/pages/CreationResult.tsx | 23 +-- .../ImportWizard/pages/DataSourcePage.css | 3 - .../ImportWizard/pages/DataSourcePage.tsx | 7 +- .../ImportWizard/pages/TableSelectionPage.tsx | 2 +- .../editor/detail/DatabaseDetail.css | 4 - .../editor/detail/DatabaseDetail.tsx | 19 +- .../master/AddDatabaseConnectionDialog.tsx | 2 +- .../master/ConnectionStateIndicator.css | 44 ---- .../master/ConnectionStateIndicator.tsx | 37 ++-- .../editor/master/DatabaseMasterContent.css | 9 - .../editor/master/DatabaseMasterContent.tsx | 5 +- .../editor/master/DatabaseMasterToolbar.tsx | 2 +- .../editor/master/MasterControl.tsx | 28 +-- packages/database-editor/src/index.css | 2 + packages/database-editor/src/index.ts | 1 + .../src/translation/database-editor/de.json | 2 +- .../src/translation/database-editor/en.json | 2 +- packages/database-editor/vite.config.ts | 3 +- .../mock/databaseEditor/detailView.spec.ts | 8 +- .../mock/databaseEditor/editor.spec.ts | 8 +- .../mock/databaseEditor/master.spec.ts | 28 +-- .../mock/importWizard/creationPage.spec.ts | 2 +- .../mock/importWizard/resultPage.spec.ts | 2 +- .../importWizard/tableSelectionPage.spec.ts | 12 +- .../tests/pageobjects/DatabaseEditor.ts | 6 +- .../tests/pageobjects/detail/DetailPanel.ts | 8 +- .../pageobjects/main/AddDatabaseConnection.ts | 2 +- playwright/tests/pageobjects/main/Control.ts | 2 +- .../tests/pageobjects/main/MainPanel.ts | 4 +- playwright/tests/pageobjects/main/Toolbar.ts | 2 +- .../main/import-wizard/CreationPage.ts | 8 +- .../main/import-wizard/DataSourcePage.ts | 2 +- .../main/import-wizard/ResultPage.ts | 6 +- .../pageobjects/main/import-wizard/Table.ts | 8 +- .../main/import-wizard/TableSelectionPage.ts | 10 +- .../main/import-wizard/Timeline.ts | 6 +- pnpm-lock.yaml | 193 +++++++++++++++++- 65 files changed, 429 insertions(+), 467 deletions(-) create mode 100644 packages/database-editor/eslint.config.mjs delete mode 100644 packages/database-editor/src/DatabaseEditor.css delete mode 100644 packages/database-editor/src/components/ImportWizard/ImportWizard.css delete mode 100644 packages/database-editor/src/components/ImportWizard/WizardContent.css delete mode 100644 packages/database-editor/src/components/ImportWizard/components/AttributeSelection.css delete mode 100644 packages/database-editor/src/components/ImportWizard/components/SelectionList.css delete mode 100644 packages/database-editor/src/components/ImportWizard/components/SelectionListButton.css delete mode 100644 packages/database-editor/src/components/ImportWizard/components/Timeline.css delete mode 100644 packages/database-editor/src/components/ImportWizard/pages/CreationPage.css delete mode 100644 packages/database-editor/src/components/ImportWizard/pages/CreationResult.css delete mode 100644 packages/database-editor/src/components/ImportWizard/pages/DataSourcePage.css delete mode 100644 packages/database-editor/src/components/editor/detail/DatabaseDetail.css delete mode 100644 packages/database-editor/src/components/editor/master/ConnectionStateIndicator.css delete mode 100644 packages/database-editor/src/components/editor/master/DatabaseMasterContent.css create mode 100644 packages/database-editor/src/index.css diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 460ab746..e5330f4a 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,6 +2,7 @@ "recommendations": [ "esbenp.prettier-vscode", "dbaeumer.vscode-eslint", + "bradlc.vscode-tailwindcss", "vitest.explorer", "ms-playwright.playwright" ], diff --git a/.vscode/settings.json b/.vscode/settings.json index 3383acf3..e0856021 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,10 @@ }, "task.autoDetect": "off", "typescript.tsdk": "node_modules/typescript/lib", + "files.associations": { + "*.css": "tailwindcss" + }, + "tailwindCSS.classFunctions": ["clsx", "cn", "cva"], "[css]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, diff --git a/database-editor.code-workspace b/database-editor.code-workspace index 84eb91d0..a2a6ea92 100644 --- a/database-editor.code-workspace +++ b/database-editor.code-workspace @@ -1,6 +1,12 @@ { "extensions": { - "recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "vitest.explorer", "ms-playwright.playwright"] + "recommendations": [ + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "bradlc.vscode-tailwindcss", + "vitest.explorer", + "ms-playwright.playwright" + ] }, "folders": [ { @@ -37,6 +43,10 @@ "**/node_modules": true, "**/lib": true }, + "files.associations": { + "*.css": "tailwindcss" + }, + "tailwindCSS.classFunctions": ["clsx", "cn", "cva"], "[css]": { "editor.defaultFormatter": "esbenp.prettier-vscode" }, diff --git a/eslint.config.mjs b/eslint.config.mjs index 5969e7a8..e9ada01b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,6 +5,7 @@ export default defineConfig([ globalIgnores(['packages/protocol/src/editor.ts']), ...config.base, ...config.i18n, + ...config.tailwind('packages/database-editor/src/index.css'), // TypeScript configs { name: 'typescript-eslint', diff --git a/integrations/standalone/package.json b/integrations/standalone/package.json index 1fe490bb..7d606e6e 100644 --- a/integrations/standalone/package.json +++ b/integrations/standalone/package.json @@ -17,9 +17,11 @@ "react-i18next": "^16.0.0" }, "devDependencies": { + "@tailwindcss/vite": "^4.2.2", "@types/react": "^19.0.7", "@types/react-dom": "^19.0.3", "@vitejs/plugin-react": "^6.0.0", + "tailwindcss": "^4.2.2", "vite": "^8.0.0" }, "scripts": { diff --git a/integrations/standalone/src/index.css b/integrations/standalone/src/index.css index ea50eb70..d7a0305b 100644 --- a/integrations/standalone/src/index.css +++ b/integrations/standalone/src/index.css @@ -1,6 +1,8 @@ -@layer icons; +@import 'tailwindcss'; +@source '../node_modules/@axonivy/database-editor/src'; +@import '@axonivy/ui-components/src/styles/themes.css'; -@import '@axonivy/ui-icons/src-gen/ivy-icons.css' layer(icons); +@import '@axonivy/ui-icons/src-gen/ivy-icons.css' layer(base); @import '@axonivy/ui-components/lib/components.css'; html, @@ -9,15 +11,3 @@ body, height: 100%; overflow: hidden; } - -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', - 'Helvetica Neue', sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; -} diff --git a/integrations/standalone/src/index.tsx b/integrations/standalone/src/index.tsx index b7bf7426..b3d52ce6 100644 --- a/integrations/standalone/src/index.tsx +++ b/integrations/standalone/src/index.tsx @@ -25,7 +25,7 @@ export async function start(): Promise { root.render( - + diff --git a/integrations/standalone/vite.config.ts b/integrations/standalone/vite.config.ts index dc037b8f..8d28f0db 100644 --- a/integrations/standalone/vite.config.ts +++ b/integrations/standalone/vite.config.ts @@ -1,9 +1,10 @@ +import tailwindcss from '@tailwindcss/vite'; import react from '@vitejs/plugin-react'; import { resolve } from 'path'; import { defineConfig } from 'vite'; export default defineConfig({ - plugins: [react()], + plugins: [tailwindcss(), react()], build: { outDir: 'build', chunkSizeWarningLimit: 5000, diff --git a/package.json b/package.json index c5edbaf1..6742fa1d 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@types/node": "^24.0.0", "prettier": "^3.6.2", "rimraf": "^6.0.1", + "tailwindcss": "^4.2.2", "typescript": "^5.8.3" }, "prettier": "@axonivy/prettier-config" diff --git a/packages/database-editor/eslint.config.mjs b/packages/database-editor/eslint.config.mjs new file mode 100644 index 00000000..18d59e5d --- /dev/null +++ b/packages/database-editor/eslint.config.mjs @@ -0,0 +1,10 @@ +import config from '@axonivy/eslint-config'; +import root from '../../eslint.config.mjs'; + +export default config.defineConfig(...root, { + settings: { + 'better-tailwindcss': { + entryPoint: 'src/index.css' + } + } +}); diff --git a/packages/database-editor/package.json b/packages/database-editor/package.json index 26355660..01aa17c4 100644 --- a/packages/database-editor/package.json +++ b/packages/database-editor/package.json @@ -35,6 +35,7 @@ "@axonivy/jsonrpc": "~14.0.0-next.1079.485110d", "@axonivy/ui-components": "~14.0.0-next.1079.485110d", "@axonivy/ui-icons": "~14.0.0-next.1079.485110d", + "@tailwindcss/vite": "^4.2.2", "@tanstack/react-table": "^8.21.3", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.2.0", @@ -45,6 +46,7 @@ "jsdom": "^28.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", + "tailwindcss": "^4.2.2", "typescript": "^5.8.3", "vite": "^8.0.0", "vite-plugin-dts": "^4.5.0", diff --git a/packages/database-editor/src/DatabaseEditor.css b/packages/database-editor/src/DatabaseEditor.css deleted file mode 100644 index fb956cf0..00000000 --- a/packages/database-editor/src/DatabaseEditor.css +++ /dev/null @@ -1,7 +0,0 @@ -.database-editor-main-panel { - background-color: var(--N75); -} - -.database-editor-panel-content { - height: 100%; -} diff --git a/packages/database-editor/src/DatabaseEditor.tsx b/packages/database-editor/src/DatabaseEditor.tsx index 654122f9..2bd98743 100644 --- a/packages/database-editor/src/DatabaseEditor.tsx +++ b/packages/database-editor/src/DatabaseEditor.tsx @@ -19,10 +19,9 @@ import { } from '@axonivy/ui-components'; import { IvyIcons } from '@axonivy/ui-icons'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { AppProvider } from './AppContext'; -import './DatabaseEditor.css'; import { DatabaseDetail } from './components/editor/detail/DatabaseDetail'; import { DatabaseMasterContent } from './components/editor/master/DatabaseMasterContent'; import { DatabaseMasterToolbar } from './components/editor/master/DatabaseMasterToolbar'; @@ -150,10 +149,21 @@ export const DatabaseEditor = (props: EditorProps) => { const openUrl = useAction('openUrl'); useHotkeys(hotkeys.openHelp.hotkey, () => openUrl(data?.helpUrl), { scopes: ['global'] }); useHotkeys(hotkeys.testConnection.hotkey, () => connectionTestFunction.mutate(), { scopes: ['global'] }); + const detailRef = useRef(null); + useHotkeys( + hotkeys.focusInscription.hotkey, + () => { + setDetail(true); + detailRef.current?.focus(); + }, + { + scopes: ['global'] + } + ); if (isPending) { return ( - + ); @@ -180,8 +190,8 @@ export const DatabaseEditor = (props: EditorProps) => { }} > - - + + @@ -189,8 +199,8 @@ export const DatabaseEditor = (props: EditorProps) => { {detail && ( <> - - + + )} diff --git a/packages/database-editor/src/components/ImportWizard/ImportWizard.css b/packages/database-editor/src/components/ImportWizard/ImportWizard.css deleted file mode 100644 index 54d6aacd..00000000 --- a/packages/database-editor/src/components/ImportWizard/ImportWizard.css +++ /dev/null @@ -1,9 +0,0 @@ -div.database-editor-import-dialog { - max-width: unset; - max-height: unset; - width: clamp(300px, 1200px, calc(100% - 200px)); -} - -.databse-editor-import-title { - visibility: collapse; -} diff --git a/packages/database-editor/src/components/ImportWizard/ImportWizard.tsx b/packages/database-editor/src/components/ImportWizard/ImportWizard.tsx index 6e387e24..9ea63732 100644 --- a/packages/database-editor/src/components/ImportWizard/ImportWizard.tsx +++ b/packages/database-editor/src/components/ImportWizard/ImportWizard.tsx @@ -15,7 +15,6 @@ import { useState, type ReactNode } from 'react'; import { useTranslation } from 'react-i18next'; import { ContextProvider } from '../../util/ContextProvider'; import { useKnownHotkeys } from '../../util/hotkeys'; -import './ImportWizard.css'; import { WizardContent } from './WizardContent'; const DIALOG_HOTKEY_IDS = ['importWizardDialog']; @@ -52,7 +51,7 @@ export const ImportWizard = ({ {hotkeys.generate.label} - + {t('import.generate')} onOpenChange(false)} callback={callback} /> diff --git a/packages/database-editor/src/components/ImportWizard/WizardContent.css b/packages/database-editor/src/components/ImportWizard/WizardContent.css deleted file mode 100644 index 8e8b9183..00000000 --- a/packages/database-editor/src/components/ImportWizard/WizardContent.css +++ /dev/null @@ -1,19 +0,0 @@ -.database-editor-import-content { - box-sizing: border-box; - align-self: center; - width: 100%; - height: 80vh; - padding: 20px 50px 10px 50px; -} - -.import-wizard-page { - height: 100%; - overflow: auto; -} -.import-wizard-proceed-buttons { - width: 100%; -} - -button.import-wizard-close-hidden { - display: none; -} diff --git a/packages/database-editor/src/components/ImportWizard/WizardContent.tsx b/packages/database-editor/src/components/ImportWizard/WizardContent.tsx index 921b0cd3..3485c5e2 100644 --- a/packages/database-editor/src/components/ImportWizard/WizardContent.tsx +++ b/packages/database-editor/src/components/ImportWizard/WizardContent.tsx @@ -5,7 +5,6 @@ import { useTranslation } from 'react-i18next'; import { ProceedButton } from './components/ProceedButton'; import { Timeline } from './components/Timeline'; import { usePages } from './pages/usePages'; -import './WizardContent.css'; export type ImportPage = { page: ReactNode; @@ -29,22 +28,16 @@ export const WizardContent = ({ projects, closeDialog, callback }: WizardContent {pages[activePage]?.page} - - +