From b5b037060697ca41ef1a671be3bf8bc3845c34e1 Mon Sep 17 00:00:00 2001 From: Zinkue <104169193+Zinkue@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:51:07 +0200 Subject: [PATCH 1/6] Add theme config property --- .../airflow/api_fastapi/core_api/datamodels/ui/config.py | 1 + .../airflow/api_fastapi/core_api/openapi/_private_ui.yaml | 4 ++++ .../src/airflow/api_fastapi/core_api/routes/ui/config.py | 1 + airflow-core/src/airflow/config_templates/config.yml | 8 ++++++++ .../src/airflow/ui/openapi-gen/requests/schemas.gen.ts | 6 +++++- .../src/airflow/ui/openapi-gen/requests/types.gen.ts | 1 + airflow-core/src/airflow/ui/src/mocks/handlers/config.ts | 1 + .../unit/api_fastapi/core_api/routes/ui/test_config.py | 2 ++ 8 files changed, 23 insertions(+), 1 deletion(-) diff --git a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py index 5644f49e0cfa2..3e8a9cb734325 100644 --- a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py +++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py @@ -35,3 +35,4 @@ class ConfigResponse(BaseModel): dashboard_alert: list[UIAlert] show_external_log_redirect: bool external_log_name: str | None = None + theme: str diff --git a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml index bc916225b7f49..81f4a305a88c2 100644 --- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml +++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml @@ -1245,6 +1245,9 @@ components: - type: string - type: 'null' title: External Log Name + theme: + type: string + title: Theme type: object required: - page_size @@ -1257,6 +1260,7 @@ components: - test_connection - dashboard_alert - show_external_log_redirect + - theme title: ConfigResponse description: configuration serializer. ConnectionHookFieldBehavior: diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py index c0b7dd2e3b638..01a8118b015e6 100644 --- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py +++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py @@ -59,6 +59,7 @@ def get_configs() -> ConfigResponse: "dashboard_alert": [alert for alert in DASHBOARD_UIALERTS if isinstance(alert, UIAlert)], "show_external_log_redirect": task_log_reader.supports_external_link, "external_log_name": getattr(task_log_reader.log_handler, "log_name", None), + "theme": conf.get("api", "theme", fallback=""), } config.update({key: value for key, value in additional_config.items()}) diff --git a/airflow-core/src/airflow/config_templates/config.yml b/airflow-core/src/airflow/config_templates/config.yml index 131d71c5b57a3..6712e646a2c45 100644 --- a/airflow-core/src/airflow/config_templates/config.yml +++ b/airflow-core/src/airflow/config_templates/config.yml @@ -1360,6 +1360,14 @@ api: type: string example: ~ default: + theme: + description: | + Creates and sets a custom color palette for the side/navbar based on a color. + It expects a hex color code. If the value is not provided UI will use default theme. + version_added: ~ + type: string + example: "#dce7f5" + default: enable_swagger_ui: description: | Boolean for running SwaggerUI in the webserver. diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts index 5e826f98f4b13..a1cd1f7c98b0a 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts @@ -6983,10 +6983,14 @@ export const $ConfigResponse = { } ], title: 'External Log Name' + }, + theme: { + type: 'string', + title: 'Theme' } }, type: 'object', - required: ['page_size', 'auto_refresh_interval', 'hide_paused_dags_by_default', 'instance_name', 'enable_swagger_ui', 'require_confirmation_dag_change', 'default_wrap', 'test_connection', 'dashboard_alert', 'show_external_log_redirect'], + required: ['page_size', 'auto_refresh_interval', 'hide_paused_dags_by_default', 'instance_name', 'enable_swagger_ui', 'require_confirmation_dag_change', 'default_wrap', 'test_connection', 'dashboard_alert', 'show_external_log_redirect', 'theme'], title: 'ConfigResponse', description: 'configuration serializer.' } as const; diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts index 6db170921b020..16e9e0ea2f094 100644 --- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts +++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts @@ -1749,6 +1749,7 @@ export type ConfigResponse = { dashboard_alert: Array; show_external_log_redirect: boolean; external_log_name?: string | null; + theme: string; }; /** diff --git a/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts b/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts index 3caa610c125b5..bc5f2a035966b 100644 --- a/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts +++ b/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts @@ -29,6 +29,7 @@ export const handlers: Array = [ page_size: 15, require_confirmation_dag_change: false, test_connection: "Disabled", + theme: "", }), ), ]; diff --git a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py index e98ad44bb72ad..9682a423e2f5f 100644 --- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py +++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py @@ -34,6 +34,7 @@ "dashboard_alert": [], "show_external_log_redirect": False, "external_log_name": None, + "theme": "", } @@ -51,6 +52,7 @@ def mock_config_data(): ("api", "default_wrap"): "false", ("api", "auto_refresh_interval"): "3", ("api", "require_confirmation_dag_change"): "false", + ("api", "theme"): "", } ): yield From aa02b3af43f876501ee925ce2711af045d59b6fa Mon Sep 17 00:00:00 2001 From: Zinkue <104169193+Zinkue@users.noreply.github.com> Date: Mon, 13 Oct 2025 22:53:15 +0200 Subject: [PATCH 2/6] Add culori package --- airflow-core/src/airflow/ui/package.json | 4 +++- airflow-core/src/airflow/ui/pnpm-lock.yaml | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/airflow-core/src/airflow/ui/package.json b/airflow-core/src/airflow/ui/package.json index 49b0bdc1faa9a..ccb062854d4af 100644 --- a/airflow-core/src/airflow/ui/package.json +++ b/airflow-core/src/airflow/ui/package.json @@ -66,7 +66,9 @@ "use-debounce": "^10.0.4", "usehooks-ts": "^3.1.1", "yaml": "^2.6.1", - "zustand": "^5.0.4" + "zustand": "^5.0.4", + "culori": "^4.0.2", + "@types/culori": "^4.0.1" }, "devDependencies": { "@7nohe/openapi-react-query-codegen": "^1.6.2", diff --git a/airflow-core/src/airflow/ui/pnpm-lock.yaml b/airflow-core/src/airflow/ui/pnpm-lock.yaml index 36dca4e6b6b97..442a26cbbabad 100644 --- a/airflow-core/src/airflow/ui/pnpm-lock.yaml +++ b/airflow-core/src/airflow/ui/pnpm-lock.yaml @@ -29,6 +29,9 @@ importers: '@tanstack/react-virtual': specifier: ^3.13.8 version: 3.13.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@types/culori': + specifier: ^4.0.1 + version: 4.0.1 '@types/debounce-promise': specifier: ^3.1.9 version: 3.1.9 @@ -68,6 +71,9 @@ importers: chartjs-plugin-annotation: specifier: ^3.1.0 version: 3.1.0(chart.js@4.4.9) + culori: + specifier: ^4.0.2 + version: 4.0.2 dayjs: specifier: ^1.11.13 version: 1.11.13 @@ -1150,6 +1156,9 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/culori@4.0.1': + resolution: {integrity: sha512-43M51r/22CjhbOXyGT361GZ9vncSVQ39u62x5eJdBQFviI8zWp2X5jzqg7k4M6PVgDQAClpy2bUe2dtwEgEDVQ==} + '@types/d3-array@3.0.3': resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} @@ -2220,6 +2229,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + culori@4.0.2: + resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + d3-array@3.2.1: resolution: {integrity: sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==} engines: {node: '>=12'} @@ -5679,6 +5692,8 @@ snapshots: '@types/cookie@0.6.0': {} + '@types/culori@4.0.1': {} + '@types/d3-array@3.0.3': {} '@types/d3-color@3.1.0': {} @@ -7400,6 +7415,8 @@ snapshots: csstype@3.1.3: {} + culori@4.0.2: {} + d3-array@3.2.1: dependencies: internmap: 2.0.3 From c15d48f7c6b7f25b5b044dd5a32c444f1a43a33b Mon Sep 17 00:00:00 2001 From: Zinkue <104169193+Zinkue@users.noreply.github.com> Date: Wed, 15 Oct 2025 00:04:54 +0200 Subject: [PATCH 3/6] Add palette generator --- .../chakraCustom/ChakraCustomProvider.tsx | 40 + .../ui/src/context/chakraCustom/index.ts | 20 + airflow-core/src/airflow/ui/src/main.tsx | 15 +- .../pages/TaskInstance/Logs/TaskLogHeader.tsx | 3 +- airflow-core/src/airflow/ui/src/theme.ts | 724 +++++++++--------- .../airflow/ui/src/utils/generatePalette.ts | 50 ++ 6 files changed, 484 insertions(+), 368 deletions(-) create mode 100644 airflow-core/src/airflow/ui/src/context/chakraCustom/ChakraCustomProvider.tsx create mode 100644 airflow-core/src/airflow/ui/src/context/chakraCustom/index.ts create mode 100644 airflow-core/src/airflow/ui/src/utils/generatePalette.ts diff --git a/airflow-core/src/airflow/ui/src/context/chakraCustom/ChakraCustomProvider.tsx b/airflow-core/src/airflow/ui/src/context/chakraCustom/ChakraCustomProvider.tsx new file mode 100644 index 0000000000000..f351460c761e8 --- /dev/null +++ b/airflow-core/src/airflow/ui/src/context/chakraCustom/ChakraCustomProvider.tsx @@ -0,0 +1,40 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ChakraProvider } from "@chakra-ui/react"; +import { useMemo, type PropsWithChildren } from "react"; + +import { useConfig } from "src/queries/useConfig"; +import { createTheme } from "src/theme"; +import { generatePalette } from "src/utils/generatePalette"; + +export const ChakraCustomProvider = ({ children }: PropsWithChildren) => { + const getTheme = useConfig("theme"); + + const system = useMemo(() => { + if (typeof getTheme === "undefined") { + return undefined; + } + + const theme = typeof getTheme === "string" ? getTheme : ""; + + return createTheme(generatePalette(theme)); + }, [getTheme]); + + return system && {children}; +}; diff --git a/airflow-core/src/airflow/ui/src/context/chakraCustom/index.ts b/airflow-core/src/airflow/ui/src/context/chakraCustom/index.ts new file mode 100644 index 0000000000000..0ad3c5ef2293b --- /dev/null +++ b/airflow-core/src/airflow/ui/src/context/chakraCustom/index.ts @@ -0,0 +1,20 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./ChakraCustomProvider"; diff --git a/airflow-core/src/airflow/ui/src/main.tsx b/airflow-core/src/airflow/ui/src/main.tsx index a98de89b4868e..6ed6f3dba7613 100644 --- a/airflow-core/src/airflow/ui/src/main.tsx +++ b/airflow-core/src/airflow/ui/src/main.tsx @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ -import { ChakraProvider } from "@chakra-ui/react"; import { QueryClientProvider } from "@tanstack/react-query"; import axios, { type AxiosError } from "axios"; import { StrictMode } from "react"; @@ -29,6 +28,7 @@ import * as ReactRouterDOM from "react-router-dom"; import * as ReactJSXRuntime from "react/jsx-runtime"; import type { HTTPExceptionResponse } from "openapi/requests/types.gen"; +import { ChakraCustomProvider } from "src/context/chakraCustom"; import { ColorModeProvider } from "src/context/colorMode"; import { TimezoneProvider } from "src/context/timezone"; import { router } from "src/router"; @@ -36,7 +36,6 @@ import { getRedirectPath } from "src/utils/links.ts"; import i18n from "./i18n/config"; import { client } from "./queryClient"; -import { system } from "./theme"; // Set React, ReactDOM, and ReactJSXRuntime on globalThis to share them with the dynamically imported React plugins. // Only one instance of React should be used. @@ -69,15 +68,15 @@ axios.interceptors.response.use( createRoot(document.querySelector("#root") as HTMLDivElement).render( - - - + + + - - - + + + , ); diff --git a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx index 0d8d6c88e7722..bf925e7fcdee6 100644 --- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx +++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx @@ -42,7 +42,7 @@ import type { TaskInstanceResponse } from "openapi/requests/types.gen"; import { TaskTrySelect } from "src/components/TaskTrySelect"; import { Button, Menu, Select, Tooltip } from "src/components/ui"; import { SearchParamsKeys } from "src/constants/searchParams"; -import { system } from "src/theme"; +import { createTheme } from "src/theme"; import { type LogLevel, logLevelColorMapping, logLevelOptions } from "src/utils/logs"; type Props = { @@ -85,6 +85,7 @@ export const TaskLogHeader = ({ const sources = searchParams.getAll(SearchParamsKeys.SOURCE); const logLevels = searchParams.getAll(SearchParamsKeys.LOG_LEVEL); const hasLogLevels = logLevels.length > 0; + const system = createTheme(); // Have select zIndex greater than modal zIndex in fullscreen so that // select options are displayed. diff --git a/airflow-core/src/airflow/ui/src/theme.ts b/airflow-core/src/airflow/ui/src/theme.ts index bd8206c11d338..f60a23ef187ed 100644 --- a/airflow-core/src/airflow/ui/src/theme.ts +++ b/airflow-core/src/airflow/ui/src/theme.ts @@ -23,6 +23,8 @@ import { createSystem, defaultConfig, defineConfig } from "@chakra-ui/react"; import type { CSSProperties } from "react"; +import type { Palette } from "src/utils/generatePalette"; + const generateSemanticTokens = (color: string, darkContrast: string = "white") => ({ solid: { value: `{colors.${color}.600}` }, contrast: { value: { _light: "white", _dark: darkContrast } }, @@ -33,371 +35,375 @@ const generateSemanticTokens = (color: string, darkContrast: string = "white") = focusRing: { value: { _light: `{colors.${color}.800}`, _dark: `{colors.${color}.200}` } }, }); -export const customConfig = defineConfig({ - // See https://chakra-ui.com/docs/theming/colors for more information on the colors used here. - theme: { - tokens: { - colors: { - black: { value: "oklch(0.23185 0.0323 266.44)" }, // Custom value for dark mode - brand: { - "50": { value: "oklch(0.98 0.006 248.717)" }, - "100": { value: "oklch(0.962 0.012 249.460)" }, - "200": { value: "oklch(0.923 0.023 255.082)" }, - "300": { value: "oklch(0.865 0.039 252.420)" }, - "400": { value: "oklch(0.705 0.066 256.378)" }, - "500": { value: "oklch(0.575 0.08 257.759)" }, - "600": { value: "oklch(0.469 0.084 257.657)" }, - "700": { value: "oklch(0.399 0.084 257.850)" }, - "800": { value: "oklch(0.324 0.072 260.329)" }, - "900": { value: "oklch(0.259 0.062 265.566)" }, - "950": { value: "oklch(0.179 0.05 265.487)" }, - }, - gray: { - // Values modified from original Tailwind to improve contrast in Chakra UI - "50": { value: "oklch(0.985 0.004 253)" }, // Original: oklch(0.985 0.002 247.839) - "100": { value: "oklch(0.955 0.006 253)" }, // Original: oklch(0.967 0.003 264.542) - "200": { value: "oklch(0.915 0.01 253)" }, // Original: oklch(0.928 0.006 264.531) - "300": { value: "oklch(0.85 0.016 253)" }, // Original: oklch(0.872 0.01 258.338) - "400": { value: "oklch(0.75 0.025 252)" }, // Original: oklch(0.707 0.022 261.325) - "500": { value: "oklch(0.63 0.042 252)" }, // Original: oklch(0.551 0.027 264.364) - "600": { value: "oklch(0.45 0.055 251)" }, // Original: oklch(0.446 0.03 256.802) - "700": { value: "oklch(0.35 0.045 251)" }, // Original: oklch(0.373 0.034 259.733) - "800": { value: "oklch(0.28 0.035 251)" }, // Original: oklch(0.278 0.033 256.848) - "900": { value: "oklch(0.18 0.03 251)" }, // Original: oklch(0.21 0.034 264.665) - "950": { value: "oklch(0.11 0.025 251)" }, // Original: oklch(0.13 0.028 261.692) - }, - // TAILWIND 4.0 COLORS - // See https://tailwindcss.com/docs/colors for more information on the colors used here. - red: { - "50": { value: "oklch(0.971 0.013 17.38)" }, - "100": { value: "oklch(0.936 0.032 17.717)" }, - "200": { value: "oklch(0.885 0.062 18.334)" }, - "300": { value: "oklch(0.808 0.114 19.571)" }, - "400": { value: "oklch(0.704 0.191 22.216)" }, - "500": { value: "oklch(0.637 0.237 25.331)" }, - "600": { value: "oklch(0.577 0.245 27.325)" }, - "700": { value: "oklch(0.505 0.213 27.518)" }, - "800": { value: "oklch(0.444 0.177 26.899)" }, - "900": { value: "oklch(0.396 0.141 25.723)" }, - "950": { value: "oklch(0.258 0.092 26.042)" }, - }, - // Values modified from original Tailwind to improve contrast in Chakra UI - orange: { - "50": { value: "oklch(0.982 0.013 83.915)" }, - "100": { value: "oklch(0.961 0.033 82.320)" }, - "200": { value: "oklch(0.918 0.065 79.975)" }, - "300": { value: "oklch(0.857 0.118 76.815)" }, - "400": { value: "oklch(0.7492 0.1439 62.081)" }, // Original: oklch(0.774 0.186 71.555) - "500": { value: "oklch(0.6462 0.1979 43.792)" }, // Original: oklch(0.705 0.213 47.604) - "600": { value: "oklch(0.5902 0.198 35.93)" }, // Original: oklch(0.632 0.214 41.185) - "700": { value: "oklch(0.553 0.184 41.777)" }, - "800": { value: "oklch(0.469 0.144 45.164)" }, - "900": { value: "oklch(0.414 0.110 48.717)" }, - "950": { value: "oklch(0.271 0.069 52.345)" }, - }, - amber: { - "50": { value: "oklch(0.987 0.022 95.277)" }, - "100": { value: "oklch(0.962 0.059 95.617)" }, - "200": { value: "oklch(0.924 0.12 95.746)" }, - "300": { value: "oklch(0.879 0.169 91.605)" }, - "400": { value: "oklch(0.828 0.189 84.429)" }, - "500": { value: "oklch(0.769 0.188 70.08)" }, - "600": { value: "oklch(0.666 0.179 58.318)" }, - "700": { value: "oklch(0.555 0.163 48.998)" }, - "800": { value: "oklch(0.473 0.137 46.201)" }, - "900": { value: "oklch(0.414 0.112 45.904)" }, - "950": { value: "oklch(0.279 0.077 45.635)" }, - }, - yellow: { - "50": { value: "oklch(0.987 0.026 102.212)" }, - "100": { value: "oklch(0.973 0.071 103.193)" }, - "200": { value: "oklch(0.945 0.129 101.54)" }, - "300": { value: "oklch(0.905 0.182 98.111)" }, - "400": { value: "oklch(0.852 0.199 91.936)" }, - "500": { value: "oklch(0.795 0.184 86.047)" }, - "600": { value: "oklch(0.681 0.162 75.834)" }, - "700": { value: "oklch(0.554 0.135 66.442)" }, - "800": { value: "oklch(0.476 0.114 61.907)" }, - "900": { value: "oklch(0.421 0.095 57.708)" }, - "950": { value: "oklch(0.286 0.066 53.813)" }, - }, - lime: { - "50": { value: "oklch(0.986 0.031 120.757)" }, - "100": { value: "oklch(0.967 0.067 122.328)" }, - "200": { value: "oklch(0.938 0.127 124.321)" }, - "300": { value: "oklch(0.897 0.196 126.665)" }, - "400": { value: "oklch(0.841 0.238 128.85)" }, - "500": { value: "oklch(0.768 0.233 130.85)" }, - "600": { value: "oklch(0.648 0.2 131.684)" }, - "700": { value: "oklch(0.532 0.157 131.589)" }, - "800": { value: "oklch(0.453 0.124 130.933)" }, - "900": { value: "oklch(0.405 0.101 131.063)" }, - "950": { value: "oklch(0.274 0.072 132.109)" }, - }, - green: { +const defaultBrandPalette: Palette = { + "50": { value: "oklch(0.98 0.006 248.717)" }, + "100": { value: "oklch(0.962 0.012 249.460)" }, + "200": { value: "oklch(0.923 0.023 255.082)" }, + "300": { value: "oklch(0.865 0.039 252.420)" }, + "400": { value: "oklch(0.705 0.066 256.378)" }, + "500": { value: "oklch(0.575 0.08 257.759)" }, + "600": { value: "oklch(0.469 0.084 257.657)" }, + "700": { value: "oklch(0.399 0.084 257.850)" }, + "800": { value: "oklch(0.324 0.072 260.329)" }, + "900": { value: "oklch(0.259 0.062 265.566)" }, + "950": { value: "oklch(0.179 0.05 265.487)" }, +}; + +export const createTheme = (palette: Palette | undefined = defaultBrandPalette) => { + const customConfig = defineConfig({ + // See https://chakra-ui.com/docs/theming/colors for more information on the colors used here. + theme: { + tokens: { + colors: { + black: { value: "oklch(0.23185 0.0323 266.44)" }, // Custom value for dark mode + brand: palette, + gray: { + // Values modified from original Tailwind to improve contrast in Chakra UI + "50": { value: "oklch(0.985 0.004 253)" }, // Original: oklch(0.985 0.002 247.839) + "100": { value: "oklch(0.955 0.006 253)" }, // Original: oklch(0.967 0.003 264.542) + "200": { value: "oklch(0.915 0.01 253)" }, // Original: oklch(0.928 0.006 264.531) + "300": { value: "oklch(0.85 0.016 253)" }, // Original: oklch(0.872 0.01 258.338) + "400": { value: "oklch(0.75 0.025 252)" }, // Original: oklch(0.707 0.022 261.325) + "500": { value: "oklch(0.63 0.042 252)" }, // Original: oklch(0.551 0.027 264.364) + "600": { value: "oklch(0.45 0.055 251)" }, // Original: oklch(0.446 0.03 256.802) + "700": { value: "oklch(0.35 0.045 251)" }, // Original: oklch(0.373 0.034 259.733) + "800": { value: "oklch(0.28 0.035 251)" }, // Original: oklch(0.278 0.033 256.848) + "900": { value: "oklch(0.18 0.03 251)" }, // Original: oklch(0.21 0.034 264.665) + "950": { value: "oklch(0.11 0.025 251)" }, // Original: oklch(0.13 0.028 261.692) + }, + // TAILWIND 4.0 COLORS + // See https://tailwindcss.com/docs/colors for more information on the colors used here. + red: { + "50": { value: "oklch(0.971 0.013 17.38)" }, + "100": { value: "oklch(0.936 0.032 17.717)" }, + "200": { value: "oklch(0.885 0.062 18.334)" }, + "300": { value: "oklch(0.808 0.114 19.571)" }, + "400": { value: "oklch(0.704 0.191 22.216)" }, + "500": { value: "oklch(0.637 0.237 25.331)" }, + "600": { value: "oklch(0.577 0.245 27.325)" }, + "700": { value: "oklch(0.505 0.213 27.518)" }, + "800": { value: "oklch(0.444 0.177 26.899)" }, + "900": { value: "oklch(0.396 0.141 25.723)" }, + "950": { value: "oklch(0.258 0.092 26.042)" }, + }, // Values modified from original Tailwind to improve contrast in Chakra UI - "50": { value: "oklch(0.982 0.018 155.826)" }, - "100": { value: "oklch(0.962 0.044 156.743)" }, - "200": { value: "oklch(0.925 0.084 155.995)" }, - "300": { value: "oklch(0.75 0.18 153.0)" }, // Original: oklch(0.871 0.15 154.449) - "400": { value: "oklch(0.625 0.209 150.0)" }, // Original: oklch(0.792 0.209 151.711) - "500": { value: "oklch(0.528 0.219 149.579)" }, // Original: oklch(0.723 0.219 149.579) - "600": { value: "oklch(0.47 0.20 149.0)" }, // Original: oklch(0.627 0.194 149.214) - "700": { value: "oklch(0.40 0.16 149.5)" }, // Original: oklch(0.527 0.154 150.069) - "800": { value: "oklch(0.448 0.119 151.328)" }, - "900": { value: "oklch(0.393 0.095 152.535)" }, - "950": { value: "oklch(0.266 0.065 152.934)" }, - }, - emerald: { - "50": { value: "oklch(0.979 0.021 166.113)" }, - "100": { value: "oklch(0.95 0.052 163.051)" }, - "200": { value: "oklch(0.905 0.093 164.15)" }, - "300": { value: "oklch(0.845 0.143 164.978)" }, - "400": { value: "oklch(0.765 0.177 163.223)" }, - "500": { value: "oklch(0.696 0.17 162.48)" }, - "600": { value: "oklch(0.596 0.145 163.225)" }, - "700": { value: "oklch(0.508 0.118 165.612)" }, - "800": { value: "oklch(0.432 0.095 166.913)" }, - "900": { value: "oklch(0.378 0.077 168.94)" }, - "950": { value: "oklch(0.262 0.051 172.552)" }, - }, - teal: { - "50": { value: "oklch(0.984 0.014 180.72)" }, - "100": { value: "oklch(0.953 0.051 180.801)" }, - "200": { value: "oklch(0.91 0.096 180.426)" }, - "300": { value: "oklch(0.855 0.138 181.071)" }, - "400": { value: "oklch(0.777 0.152 181.912)" }, - "500": { value: "oklch(0.704 0.14 182.503)" }, - "600": { value: "oklch(0.6 0.118 184.704)" }, - "700": { value: "oklch(0.511 0.096 186.391)" }, - "800": { value: "oklch(0.437 0.078 188.216)" }, - "900": { value: "oklch(0.386 0.063 188.416)" }, - "950": { value: "oklch(0.277 0.046 192.524)" }, - }, - cyan: { - "50": { value: "oklch(0.984 0.019 200.873)" }, - "100": { value: "oklch(0.956 0.045 203.388)" }, - "200": { value: "oklch(0.917 0.08 205.041)" }, - "300": { value: "oklch(0.865 0.127 207.078)" }, - "400": { value: "oklch(0.789 0.154 211.53)" }, - "500": { value: "oklch(0.715 0.143 215.221)" }, - "600": { value: "oklch(0.609 0.126 221.723)" }, - "700": { value: "oklch(0.52 0.105 223.128)" }, - "800": { value: "oklch(0.45 0.085 224.283)" }, - "900": { value: "oklch(0.398 0.07 227.392)" }, - "950": { value: "oklch(0.302 0.056 229.695)" }, - }, - sky: { - "50": { value: "oklch(0.977 0.013 236.62)" }, - "100": { value: "oklch(0.951 0.026 236.824)" }, - "200": { value: "oklch(0.901 0.058 230.902)" }, - "300": { value: "oklch(0.828 0.111 230.318)" }, - "400": { value: "oklch(0.746 0.16 232.661)" }, - "500": { value: "oklch(0.685 0.169 237.323)" }, - "600": { value: "oklch(0.588 0.158 241.966)" }, - "700": { value: "oklch(0.5 0.134 242.749)" }, - "800": { value: "oklch(0.443 0.11 240.79)" }, - "900": { value: "oklch(0.391 0.09 240.876)" }, - "950": { value: "oklch(0.293 0.066 243.157)" }, - }, - blue: { - "50": { value: "oklch(0.97 0.014 254.604)" }, - "100": { value: "oklch(0.932 0.032 255.585)" }, - "200": { value: "oklch(0.882 0.059 254.128)" }, - "300": { value: "oklch(0.809 0.105 251.813)" }, - "400": { value: "oklch(0.707 0.165 254.624)" }, - "500": { value: "oklch(0.623 0.214 259.815)" }, - "600": { value: "oklch(0.546 0.245 262.881)" }, - "700": { value: "oklch(0.488 0.243 264.376)" }, - "800": { value: "oklch(0.424 0.199 265.638)" }, - "900": { value: "oklch(0.379 0.146 265.522)" }, - "950": { value: "oklch(0.282 0.091 267.935)" }, - }, - indigo: { - "50": { value: "oklch(0.962 0.018 272.314)" }, - "100": { value: "oklch(0.93 0.034 272.788)" }, - "200": { value: "oklch(0.87 0.065 274.039)" }, - "300": { value: "oklch(0.785 0.115 274.713)" }, - "400": { value: "oklch(0.673 0.182 276.935)" }, - "500": { value: "oklch(0.585 0.233 277.117)" }, - "600": { value: "oklch(0.511 0.262 276.966)" }, - "700": { value: "oklch(0.457 0.24 277.023)" }, - "800": { value: "oklch(0.398 0.195 277.366)" }, - "900": { value: "oklch(0.359 0.144 278.697)" }, - "950": { value: "oklch(0.257 0.09 281.288)" }, - }, - violet: { - "50": { value: "oklch(0.969 0.016 293.756)" }, - "100": { value: "oklch(0.943 0.029 294.588)" }, - "200": { value: "oklch(0.894 0.057 293.283)" }, - "300": { value: "oklch(0.811 0.111 293.571)" }, - "400": { value: "oklch(0.702 0.183 293.541)" }, - "500": { value: "oklch(0.606 0.25 292.717)" }, - "600": { value: "oklch(0.541 0.281 293.009)" }, - "700": { value: "oklch(0.491 0.27 292.581)" }, - "800": { value: "oklch(0.432 0.232 292.759)" }, - "900": { value: "oklch(0.38 0.189 293.745)" }, - "950": { value: "oklch(0.283 0.141 291.089)" }, - }, - purple: { - "50": { value: "oklch(0.977 0.014 308.299)" }, - "100": { value: "oklch(0.946 0.033 307.174)" }, - "200": { value: "oklch(0.902 0.063 306.703)" }, - "300": { value: "oklch(0.827 0.119 306.383)" }, - "400": { value: "oklch(0.714 0.203 305.504)" }, - "500": { value: "oklch(0.627 0.265 303.9)" }, - "600": { value: "oklch(0.558 0.288 302.321)" }, - "700": { value: "oklch(0.496 0.265 301.924)" }, - "800": { value: "oklch(0.438 0.218 303.724)" }, - "900": { value: "oklch(0.381 0.176 304.987)" }, - "950": { value: "oklch(0.291 0.149 302.717)" }, - }, - fuchsia: { - "50": { value: "oklch(0.977 0.017 320.058)" }, - "100": { value: "oklch(0.952 0.037 318.852)" }, - "200": { value: "oklch(0.903 0.076 319.62)" }, - "300": { value: "oklch(0.833 0.145 321.434)" }, - "400": { value: "oklch(0.74 0.238 322.16)" }, - "500": { value: "oklch(0.667 0.295 322.15)" }, - "600": { value: "oklch(0.591 0.293 322.896)" }, - "700": { value: "oklch(0.518 0.253 323.949)" }, - "800": { value: "oklch(0.452 0.211 324.591)" }, - "900": { value: "oklch(0.401 0.17 325.612)" }, - "950": { value: "oklch(0.293 0.136 325.661)" }, - }, - pink: { - "50": { value: "oklch(0.971 0.014 343.198)" }, - "100": { value: "oklch(0.948 0.028 342.258)" }, - "200": { value: "oklch(0.899 0.061 343.231)" }, - "300": { value: "oklch(0.823 0.12 346.018)" }, - "400": { value: "oklch(0.718 0.202 349.761)" }, - "500": { value: "oklch(0.656 0.241 354.308)" }, - "600": { value: "oklch(0.592 0.249 0.584)" }, - "700": { value: "oklch(0.525 0.223 3.958)" }, - "800": { value: "oklch(0.459 0.187 3.815)" }, - "900": { value: "oklch(0.408 0.153 2.432)" }, - "950": { value: "oklch(0.284 0.109 3.907)" }, - }, - rose: { - "50": { value: "oklch(0.969 0.015 12.422)" }, - "100": { value: "oklch(0.941 0.03 12.58)" }, - "200": { value: "oklch(0.892 0.058 10.001)" }, - "300": { value: "oklch(0.81 0.117 11.638)" }, - "400": { value: "oklch(0.712 0.194 13.428)" }, - "500": { value: "oklch(0.645 0.246 16.439)" }, - "600": { value: "oklch(0.586 0.253 17.585)" }, - "700": { value: "oklch(0.514 0.222 16.935)" }, - "800": { value: "oklch(0.455 0.188 13.697)" }, - "900": { value: "oklch(0.41 0.159 10.272)" }, - "950": { value: "oklch(0.271 0.105 12.094)" }, - }, - slate: { - "50": { value: "oklch(0.984 0.003 247.858)" }, - "100": { value: "oklch(0.968 0.007 247.896)" }, - "200": { value: "oklch(0.929 0.013 255.508)" }, - "300": { value: "oklch(0.869 0.022 252.894)" }, - "400": { value: "oklch(0.704 0.04 256.788)" }, - "500": { value: "oklch(0.554 0.046 257.417)" }, - "600": { value: "oklch(0.446 0.043 257.281)" }, - "700": { value: "oklch(0.372 0.044 257.287)" }, - "800": { value: "oklch(0.279 0.041 260.031)" }, - "900": { value: "oklch(0.208 0.042 265.755)" }, - "950": { value: "oklch(0.129 0.042 264.695)" }, - }, - zinc: { - "50": { value: "oklch(0.985 0 0)" }, - "100": { value: "oklch(0.967 0.001 286.375)" }, - "200": { value: "oklch(0.92 0.004 286.32)" }, - "300": { value: "oklch(0.871 0.006 286.286)" }, - "400": { value: "oklch(0.705 0.015 286.067)" }, - "500": { value: "oklch(0.552 0.016 285.938)" }, - "600": { value: "oklch(0.442 0.017 285.786)" }, - "700": { value: "oklch(0.37 0.013 285.805)" }, - "800": { value: "oklch(0.274 0.006 286.033)" }, - "900": { value: "oklch(0.21 0.006 285.885)" }, - "950": { value: "oklch(0.141 0.005 285.823)" }, - }, - neutral: { - "50": { value: "oklch(0.985 0 0)" }, - "100": { value: "oklch(0.97 0 0)" }, - "200": { value: "oklch(0.922 0 0)" }, - "300": { value: "oklch(0.87 0 0)" }, - "400": { value: "oklch(0.708 0 0)" }, - "500": { value: "oklch(0.556 0 0)" }, - "600": { value: "oklch(0.439 0 0)" }, - "700": { value: "oklch(0.371 0 0)" }, - "800": { value: "oklch(0.269 0 0)" }, - "900": { value: "oklch(0.205 0 0)" }, - "950": { value: "oklch(0.145 0 0)" }, - }, - stone: { - "50": { value: "oklch(0.985 0.001 106.423)" }, - "100": { value: "oklch(0.97 0.001 106.424)" }, - "200": { value: "oklch(0.923 0.003 48.717)" }, - "300": { value: "oklch(0.869 0.005 56.366)" }, - "400": { value: "oklch(0.709 0.01 56.259)" }, - "500": { value: "oklch(0.553 0.013 58.071)" }, - "600": { value: "oklch(0.444 0.011 73.639)" }, - "700": { value: "oklch(0.374 0.01 67.558)" }, - "800": { value: "oklch(0.268 0.007 34.298)" }, - "900": { value: "oklch(0.216 0.006 56.043)" }, - "950": { value: "oklch(0.147 0.004 49.25)" }, + orange: { + "50": { value: "oklch(0.982 0.013 83.915)" }, + "100": { value: "oklch(0.961 0.033 82.320)" }, + "200": { value: "oklch(0.918 0.065 79.975)" }, + "300": { value: "oklch(0.857 0.118 76.815)" }, + "400": { value: "oklch(0.7492 0.1439 62.081)" }, // Original: oklch(0.774 0.186 71.555) + "500": { value: "oklch(0.6462 0.1979 43.792)" }, // Original: oklch(0.705 0.213 47.604) + "600": { value: "oklch(0.5902 0.198 35.93)" }, // Original: oklch(0.632 0.214 41.185) + "700": { value: "oklch(0.553 0.184 41.777)" }, + "800": { value: "oklch(0.469 0.144 45.164)" }, + "900": { value: "oklch(0.414 0.110 48.717)" }, + "950": { value: "oklch(0.271 0.069 52.345)" }, + }, + amber: { + "50": { value: "oklch(0.987 0.022 95.277)" }, + "100": { value: "oklch(0.962 0.059 95.617)" }, + "200": { value: "oklch(0.924 0.12 95.746)" }, + "300": { value: "oklch(0.879 0.169 91.605)" }, + "400": { value: "oklch(0.828 0.189 84.429)" }, + "500": { value: "oklch(0.769 0.188 70.08)" }, + "600": { value: "oklch(0.666 0.179 58.318)" }, + "700": { value: "oklch(0.555 0.163 48.998)" }, + "800": { value: "oklch(0.473 0.137 46.201)" }, + "900": { value: "oklch(0.414 0.112 45.904)" }, + "950": { value: "oklch(0.279 0.077 45.635)" }, + }, + yellow: { + "50": { value: "oklch(0.987 0.026 102.212)" }, + "100": { value: "oklch(0.973 0.071 103.193)" }, + "200": { value: "oklch(0.945 0.129 101.54)" }, + "300": { value: "oklch(0.905 0.182 98.111)" }, + "400": { value: "oklch(0.852 0.199 91.936)" }, + "500": { value: "oklch(0.795 0.184 86.047)" }, + "600": { value: "oklch(0.681 0.162 75.834)" }, + "700": { value: "oklch(0.554 0.135 66.442)" }, + "800": { value: "oklch(0.476 0.114 61.907)" }, + "900": { value: "oklch(0.421 0.095 57.708)" }, + "950": { value: "oklch(0.286 0.066 53.813)" }, + }, + lime: { + "50": { value: "oklch(0.986 0.031 120.757)" }, + "100": { value: "oklch(0.967 0.067 122.328)" }, + "200": { value: "oklch(0.938 0.127 124.321)" }, + "300": { value: "oklch(0.897 0.196 126.665)" }, + "400": { value: "oklch(0.841 0.238 128.85)" }, + "500": { value: "oklch(0.768 0.233 130.85)" }, + "600": { value: "oklch(0.648 0.2 131.684)" }, + "700": { value: "oklch(0.532 0.157 131.589)" }, + "800": { value: "oklch(0.453 0.124 130.933)" }, + "900": { value: "oklch(0.405 0.101 131.063)" }, + "950": { value: "oklch(0.274 0.072 132.109)" }, + }, + green: { + // Values modified from original Tailwind to improve contrast in Chakra UI + "50": { value: "oklch(0.982 0.018 155.826)" }, + "100": { value: "oklch(0.962 0.044 156.743)" }, + "200": { value: "oklch(0.925 0.084 155.995)" }, + "300": { value: "oklch(0.75 0.18 153.0)" }, // Original: oklch(0.871 0.15 154.449) + "400": { value: "oklch(0.625 0.209 150.0)" }, // Original: oklch(0.792 0.209 151.711) + "500": { value: "oklch(0.528 0.219 149.579)" }, // Original: oklch(0.723 0.219 149.579) + "600": { value: "oklch(0.47 0.20 149.0)" }, // Original: oklch(0.627 0.194 149.214) + "700": { value: "oklch(0.40 0.16 149.5)" }, // Original: oklch(0.527 0.154 150.069) + "800": { value: "oklch(0.448 0.119 151.328)" }, + "900": { value: "oklch(0.393 0.095 152.535)" }, + "950": { value: "oklch(0.266 0.065 152.934)" }, + }, + emerald: { + "50": { value: "oklch(0.979 0.021 166.113)" }, + "100": { value: "oklch(0.95 0.052 163.051)" }, + "200": { value: "oklch(0.905 0.093 164.15)" }, + "300": { value: "oklch(0.845 0.143 164.978)" }, + "400": { value: "oklch(0.765 0.177 163.223)" }, + "500": { value: "oklch(0.696 0.17 162.48)" }, + "600": { value: "oklch(0.596 0.145 163.225)" }, + "700": { value: "oklch(0.508 0.118 165.612)" }, + "800": { value: "oklch(0.432 0.095 166.913)" }, + "900": { value: "oklch(0.378 0.077 168.94)" }, + "950": { value: "oklch(0.262 0.051 172.552)" }, + }, + teal: { + "50": { value: "oklch(0.984 0.014 180.72)" }, + "100": { value: "oklch(0.953 0.051 180.801)" }, + "200": { value: "oklch(0.91 0.096 180.426)" }, + "300": { value: "oklch(0.855 0.138 181.071)" }, + "400": { value: "oklch(0.777 0.152 181.912)" }, + "500": { value: "oklch(0.704 0.14 182.503)" }, + "600": { value: "oklch(0.6 0.118 184.704)" }, + "700": { value: "oklch(0.511 0.096 186.391)" }, + "800": { value: "oklch(0.437 0.078 188.216)" }, + "900": { value: "oklch(0.386 0.063 188.416)" }, + "950": { value: "oklch(0.277 0.046 192.524)" }, + }, + cyan: { + "50": { value: "oklch(0.984 0.019 200.873)" }, + "100": { value: "oklch(0.956 0.045 203.388)" }, + "200": { value: "oklch(0.917 0.08 205.041)" }, + "300": { value: "oklch(0.865 0.127 207.078)" }, + "400": { value: "oklch(0.789 0.154 211.53)" }, + "500": { value: "oklch(0.715 0.143 215.221)" }, + "600": { value: "oklch(0.609 0.126 221.723)" }, + "700": { value: "oklch(0.52 0.105 223.128)" }, + "800": { value: "oklch(0.45 0.085 224.283)" }, + "900": { value: "oklch(0.398 0.07 227.392)" }, + "950": { value: "oklch(0.302 0.056 229.695)" }, + }, + sky: { + "50": { value: "oklch(0.977 0.013 236.62)" }, + "100": { value: "oklch(0.951 0.026 236.824)" }, + "200": { value: "oklch(0.901 0.058 230.902)" }, + "300": { value: "oklch(0.828 0.111 230.318)" }, + "400": { value: "oklch(0.746 0.16 232.661)" }, + "500": { value: "oklch(0.685 0.169 237.323)" }, + "600": { value: "oklch(0.588 0.158 241.966)" }, + "700": { value: "oklch(0.5 0.134 242.749)" }, + "800": { value: "oklch(0.443 0.11 240.79)" }, + "900": { value: "oklch(0.391 0.09 240.876)" }, + "950": { value: "oklch(0.293 0.066 243.157)" }, + }, + blue: { + "50": { value: "oklch(0.97 0.014 254.604)" }, + "100": { value: "oklch(0.932 0.032 255.585)" }, + "200": { value: "oklch(0.882 0.059 254.128)" }, + "300": { value: "oklch(0.809 0.105 251.813)" }, + "400": { value: "oklch(0.707 0.165 254.624)" }, + "500": { value: "oklch(0.623 0.214 259.815)" }, + "600": { value: "oklch(0.546 0.245 262.881)" }, + "700": { value: "oklch(0.488 0.243 264.376)" }, + "800": { value: "oklch(0.424 0.199 265.638)" }, + "900": { value: "oklch(0.379 0.146 265.522)" }, + "950": { value: "oklch(0.282 0.091 267.935)" }, + }, + indigo: { + "50": { value: "oklch(0.962 0.018 272.314)" }, + "100": { value: "oklch(0.93 0.034 272.788)" }, + "200": { value: "oklch(0.87 0.065 274.039)" }, + "300": { value: "oklch(0.785 0.115 274.713)" }, + "400": { value: "oklch(0.673 0.182 276.935)" }, + "500": { value: "oklch(0.585 0.233 277.117)" }, + "600": { value: "oklch(0.511 0.262 276.966)" }, + "700": { value: "oklch(0.457 0.24 277.023)" }, + "800": { value: "oklch(0.398 0.195 277.366)" }, + "900": { value: "oklch(0.359 0.144 278.697)" }, + "950": { value: "oklch(0.257 0.09 281.288)" }, + }, + violet: { + "50": { value: "oklch(0.969 0.016 293.756)" }, + "100": { value: "oklch(0.943 0.029 294.588)" }, + "200": { value: "oklch(0.894 0.057 293.283)" }, + "300": { value: "oklch(0.811 0.111 293.571)" }, + "400": { value: "oklch(0.702 0.183 293.541)" }, + "500": { value: "oklch(0.606 0.25 292.717)" }, + "600": { value: "oklch(0.541 0.281 293.009)" }, + "700": { value: "oklch(0.491 0.27 292.581)" }, + "800": { value: "oklch(0.432 0.232 292.759)" }, + "900": { value: "oklch(0.38 0.189 293.745)" }, + "950": { value: "oklch(0.283 0.141 291.089)" }, + }, + purple: { + "50": { value: "oklch(0.977 0.014 308.299)" }, + "100": { value: "oklch(0.946 0.033 307.174)" }, + "200": { value: "oklch(0.902 0.063 306.703)" }, + "300": { value: "oklch(0.827 0.119 306.383)" }, + "400": { value: "oklch(0.714 0.203 305.504)" }, + "500": { value: "oklch(0.627 0.265 303.9)" }, + "600": { value: "oklch(0.558 0.288 302.321)" }, + "700": { value: "oklch(0.496 0.265 301.924)" }, + "800": { value: "oklch(0.438 0.218 303.724)" }, + "900": { value: "oklch(0.381 0.176 304.987)" }, + "950": { value: "oklch(0.291 0.149 302.717)" }, + }, + fuchsia: { + "50": { value: "oklch(0.977 0.017 320.058)" }, + "100": { value: "oklch(0.952 0.037 318.852)" }, + "200": { value: "oklch(0.903 0.076 319.62)" }, + "300": { value: "oklch(0.833 0.145 321.434)" }, + "400": { value: "oklch(0.74 0.238 322.16)" }, + "500": { value: "oklch(0.667 0.295 322.15)" }, + "600": { value: "oklch(0.591 0.293 322.896)" }, + "700": { value: "oklch(0.518 0.253 323.949)" }, + "800": { value: "oklch(0.452 0.211 324.591)" }, + "900": { value: "oklch(0.401 0.17 325.612)" }, + "950": { value: "oklch(0.293 0.136 325.661)" }, + }, + pink: { + "50": { value: "oklch(0.971 0.014 343.198)" }, + "100": { value: "oklch(0.948 0.028 342.258)" }, + "200": { value: "oklch(0.899 0.061 343.231)" }, + "300": { value: "oklch(0.823 0.12 346.018)" }, + "400": { value: "oklch(0.718 0.202 349.761)" }, + "500": { value: "oklch(0.656 0.241 354.308)" }, + "600": { value: "oklch(0.592 0.249 0.584)" }, + "700": { value: "oklch(0.525 0.223 3.958)" }, + "800": { value: "oklch(0.459 0.187 3.815)" }, + "900": { value: "oklch(0.408 0.153 2.432)" }, + "950": { value: "oklch(0.284 0.109 3.907)" }, + }, + rose: { + "50": { value: "oklch(0.969 0.015 12.422)" }, + "100": { value: "oklch(0.941 0.03 12.58)" }, + "200": { value: "oklch(0.892 0.058 10.001)" }, + "300": { value: "oklch(0.81 0.117 11.638)" }, + "400": { value: "oklch(0.712 0.194 13.428)" }, + "500": { value: "oklch(0.645 0.246 16.439)" }, + "600": { value: "oklch(0.586 0.253 17.585)" }, + "700": { value: "oklch(0.514 0.222 16.935)" }, + "800": { value: "oklch(0.455 0.188 13.697)" }, + "900": { value: "oklch(0.41 0.159 10.272)" }, + "950": { value: "oklch(0.271 0.105 12.094)" }, + }, + slate: { + "50": { value: "oklch(0.984 0.003 247.858)" }, + "100": { value: "oklch(0.968 0.007 247.896)" }, + "200": { value: "oklch(0.929 0.013 255.508)" }, + "300": { value: "oklch(0.869 0.022 252.894)" }, + "400": { value: "oklch(0.704 0.04 256.788)" }, + "500": { value: "oklch(0.554 0.046 257.417)" }, + "600": { value: "oklch(0.446 0.043 257.281)" }, + "700": { value: "oklch(0.372 0.044 257.287)" }, + "800": { value: "oklch(0.279 0.041 260.031)" }, + "900": { value: "oklch(0.208 0.042 265.755)" }, + "950": { value: "oklch(0.129 0.042 264.695)" }, + }, + zinc: { + "50": { value: "oklch(0.985 0 0)" }, + "100": { value: "oklch(0.967 0.001 286.375)" }, + "200": { value: "oklch(0.92 0.004 286.32)" }, + "300": { value: "oklch(0.871 0.006 286.286)" }, + "400": { value: "oklch(0.705 0.015 286.067)" }, + "500": { value: "oklch(0.552 0.016 285.938)" }, + "600": { value: "oklch(0.442 0.017 285.786)" }, + "700": { value: "oklch(0.37 0.013 285.805)" }, + "800": { value: "oklch(0.274 0.006 286.033)" }, + "900": { value: "oklch(0.21 0.006 285.885)" }, + "950": { value: "oklch(0.141 0.005 285.823)" }, + }, + neutral: { + "50": { value: "oklch(0.985 0 0)" }, + "100": { value: "oklch(0.97 0 0)" }, + "200": { value: "oklch(0.922 0 0)" }, + "300": { value: "oklch(0.87 0 0)" }, + "400": { value: "oklch(0.708 0 0)" }, + "500": { value: "oklch(0.556 0 0)" }, + "600": { value: "oklch(0.439 0 0)" }, + "700": { value: "oklch(0.371 0 0)" }, + "800": { value: "oklch(0.269 0 0)" }, + "900": { value: "oklch(0.205 0 0)" }, + "950": { value: "oklch(0.145 0 0)" }, + }, + stone: { + "50": { value: "oklch(0.985 0.001 106.423)" }, + "100": { value: "oklch(0.97 0.001 106.424)" }, + "200": { value: "oklch(0.923 0.003 48.717)" }, + "300": { value: "oklch(0.869 0.005 56.366)" }, + "400": { value: "oklch(0.709 0.01 56.259)" }, + "500": { value: "oklch(0.553 0.013 58.071)" }, + "600": { value: "oklch(0.444 0.011 73.639)" }, + "700": { value: "oklch(0.374 0.01 67.558)" }, + "800": { value: "oklch(0.268 0.007 34.298)" }, + "900": { value: "oklch(0.216 0.006 56.043)" }, + "950": { value: "oklch(0.147 0.004 49.25)" }, + }, }, }, - }, - semanticTokens: { - colors: { - // Brand colors for consistent theming - brand: generateSemanticTokens("brand"), - // GENERIC STATE - danger: generateSemanticTokens("red"), - info: generateSemanticTokens("blue"), - warning: generateSemanticTokens("amber"), - error: generateSemanticTokens("red"), - // AIRFLOW TASK STATE - active: generateSemanticTokens("blue"), - success: generateSemanticTokens("green"), - failed: generateSemanticTokens("red"), - queued: generateSemanticTokens("stone"), - skipped: generateSemanticTokens("pink"), - up_for_reschedule: generateSemanticTokens("sky"), - up_for_retry: generateSemanticTokens("yellow"), - upstream_failed: generateSemanticTokens("orange"), - running: generateSemanticTokens("cyan"), - restarting: generateSemanticTokens("violet"), - deferred: generateSemanticTokens("purple"), - scheduled: generateSemanticTokens("zinc"), - none: generateSemanticTokens("gray"), - removed: generateSemanticTokens("slate"), - // TAILWIND 4.0 COLORS - red: generateSemanticTokens("red"), - orange: generateSemanticTokens("orange"), - amber: generateSemanticTokens("amber"), - yellow: generateSemanticTokens("yellow"), - lime: generateSemanticTokens("lime"), - green: generateSemanticTokens("green"), - emerald: generateSemanticTokens("emerald"), - teal: generateSemanticTokens("teal"), - cyan: generateSemanticTokens("cyan"), - sky: generateSemanticTokens("sky"), - blue: generateSemanticTokens("blue"), - indigo: generateSemanticTokens("indigo"), - violet: generateSemanticTokens("violet"), - purple: generateSemanticTokens("purple"), - fuchsia: generateSemanticTokens("fuchsia"), - pink: generateSemanticTokens("pink"), - rose: generateSemanticTokens("rose"), - slate: generateSemanticTokens("slate"), - gray: generateSemanticTokens("gray"), - zinc: generateSemanticTokens("zinc"), - neutral: generateSemanticTokens("neutral"), - stone: generateSemanticTokens("stone"), + semanticTokens: { + colors: { + // Brand colors for consistent theming + brand: generateSemanticTokens("brand"), + // GENERIC STATE + danger: generateSemanticTokens("red"), + info: generateSemanticTokens("blue"), + warning: generateSemanticTokens("amber"), + error: generateSemanticTokens("red"), + // AIRFLOW TASK STATE + active: generateSemanticTokens("blue"), + success: generateSemanticTokens("green"), + failed: generateSemanticTokens("red"), + queued: generateSemanticTokens("stone"), + skipped: generateSemanticTokens("pink"), + up_for_reschedule: generateSemanticTokens("sky"), + up_for_retry: generateSemanticTokens("yellow"), + upstream_failed: generateSemanticTokens("orange"), + running: generateSemanticTokens("cyan"), + restarting: generateSemanticTokens("violet"), + deferred: generateSemanticTokens("purple"), + scheduled: generateSemanticTokens("zinc"), + none: generateSemanticTokens("gray"), + removed: generateSemanticTokens("slate"), + // TAILWIND 4.0 COLORS + red: generateSemanticTokens("red"), + orange: generateSemanticTokens("orange"), + amber: generateSemanticTokens("amber"), + yellow: generateSemanticTokens("yellow"), + lime: generateSemanticTokens("lime"), + green: generateSemanticTokens("green"), + emerald: generateSemanticTokens("emerald"), + teal: generateSemanticTokens("teal"), + cyan: generateSemanticTokens("cyan"), + sky: generateSemanticTokens("sky"), + blue: generateSemanticTokens("blue"), + indigo: generateSemanticTokens("indigo"), + violet: generateSemanticTokens("violet"), + purple: generateSemanticTokens("purple"), + fuchsia: generateSemanticTokens("fuchsia"), + pink: generateSemanticTokens("pink"), + rose: generateSemanticTokens("rose"), + slate: generateSemanticTokens("slate"), + gray: generateSemanticTokens("gray"), + zinc: generateSemanticTokens("zinc"), + neutral: generateSemanticTokens("neutral"), + stone: generateSemanticTokens("stone"), + }, }, }, - }, -}); + }); -export const system = createSystem(defaultConfig, customConfig); + return createSystem(defaultConfig, customConfig); +}; // Utility function to resolve CSS variables to their computed values // See: https://github.com/chakra-ui/panda/discussions/2200 diff --git a/airflow-core/src/airflow/ui/src/utils/generatePalette.ts b/airflow-core/src/airflow/ui/src/utils/generatePalette.ts new file mode 100644 index 0000000000000..a3c6be2573a93 --- /dev/null +++ b/airflow-core/src/airflow/ui/src/utils/generatePalette.ts @@ -0,0 +1,50 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { oklch } from "culori"; + +export type Palette = Record; + +export const generatePalette = (hex: string): Palette | undefined => { + if (!/^#[\da-f]{6}$/iu.test(hex)) { + return undefined; + } + + const base = oklch(hex); + + if (!base) { + return undefined; + } + + const { c: chroma = 0, h: hue = 0 } = base; + + const lightnessSteps = [0.97, 0.95, 0.89, 0.82, 0.71, 0.6, 0.48, 0.36, 0.27, 0.18, 0.15]; + + const keys = ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900", "950"]; + + const palette: Palette = {}; + + keys.forEach((key, position) => { + const lightness = lightnessSteps[position]; + const color = { value: `oklch(${lightness} ${chroma} ${hue})` }; + + palette[key] = color; + }); + + return palette; +}; From 5057bbdd0f94b6f309c739b76acf42dcada810b2 Mon Sep 17 00:00:00 2001 From: Zinkue <104169193+Zinkue@users.noreply.github.com> Date: Sun, 19 Oct 2025 11:28:27 +0200 Subject: [PATCH 4/6] Improve palette generator and add unit tests --- .../src/airflow/config_templates/config.yml | 2 +- .../ui/src/utils/generatePalette.test.ts | 117 ++++++++++++++++++ .../airflow/ui/src/utils/generatePalette.ts | 46 ++++++- 3 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 airflow-core/src/airflow/ui/src/utils/generatePalette.test.ts diff --git a/airflow-core/src/airflow/config_templates/config.yml b/airflow-core/src/airflow/config_templates/config.yml index 6712e646a2c45..452e6115403bd 100644 --- a/airflow-core/src/airflow/config_templates/config.yml +++ b/airflow-core/src/airflow/config_templates/config.yml @@ -1363,7 +1363,7 @@ api: theme: description: | Creates and sets a custom color palette for the side/navbar based on a color. - It expects a hex color code. If the value is not provided UI will use default theme. + It expects a hex six-digit form. If the value is not provided UI will use default theme. version_added: ~ type: string example: "#dce7f5" diff --git a/airflow-core/src/airflow/ui/src/utils/generatePalette.test.ts b/airflow-core/src/airflow/ui/src/utils/generatePalette.test.ts new file mode 100644 index 0000000000000..8c7b5120ff35a --- /dev/null +++ b/airflow-core/src/airflow/ui/src/utils/generatePalette.test.ts @@ -0,0 +1,117 @@ +/*! + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { describe, it, expect } from "vitest"; + +import { + roundTo3rdDecimal, + quadraticLagrangeInterpolatingPolynomial, + generatePalette, +} from "./generatePalette"; + +describe("roundTo3rdDecimal", () => { + const roundTestCases = [ + [0, 0], + [1.5, 1.5], + [9.8456, 9.846], + [215_415.098_704_36, 215_415.099], + [-15.4564, -15.456], + [-8.9265, -8.926], + ]; + + it.each(roundTestCases)("round to 3rd decimal %d", (number, expected) => { + expect(roundTo3rdDecimal(number)).toBe(expected); + }); +}); + +describe("quadraticLagrangeInterpolatingPolynomial", () => { + it("interpolate three points", () => { + // f(x) = 2x^2 - 5x + 1 + const point0: [number, number] = [0, 1]; + const point1: [number, number] = [3, 4]; + const point2: [number, number] = [5, 26]; + + // f(2) + expect(quadraticLagrangeInterpolatingPolynomial(point0, point1, point2)(2)).toBe(-1); + }); + + it("order of points does not matter", () => { + // f(x) = x^2 + const point0: [number, number] = [-2, 4]; + const point1: [number, number] = [1, 1]; + const point2: [number, number] = [3, 9]; + + // f(2) + expect(quadraticLagrangeInterpolatingPolynomial(point1, point0, point2)(2)).toBe(4); + }); +}); + +describe("generatePalette", () => { + const whiteBlackPalette = { + "50": { value: "oklch(0.97 0 0)" }, + "100": { value: "oklch(0.932 0 0)" }, + "200": { value: "oklch(0.857 0 0)" }, + "300": { value: "oklch(0.781 0 0)" }, + "400": { value: "oklch(0.706 0 0)" }, + "500": { value: "oklch(0.63 0 0)" }, + "600": { value: "oklch(0.554 0 0)" }, + "700": { value: "oklch(0.479 0 0)" }, + "800": { value: "oklch(0.403 0 0)" }, + "900": { value: "oklch(0.328 0 0)" }, + "950": { value: "oklch(0.29 0 0)" }, + }; + + const paletteTestCase = [ + { + color: "#ffffff", + palette: whiteBlackPalette, + }, + { + color: "#000000", + palette: whiteBlackPalette, + }, + { + color: "#cdd5d2", + palette: { + "50": { value: "oklch(0.97 0.005 171.759)" }, + "100": { value: "oklch(0.932 0.006 171.759)" }, + "200": { value: "oklch(0.857 0.008 171.759)" }, + "300": { value: "oklch(0.781 0.009 171.759)" }, + "400": { value: "oklch(0.706 0.01 171.759)" }, + "500": { value: "oklch(0.63 0.01 171.759)" }, + "600": { value: "oklch(0.554 0.01 171.759)" }, + "700": { value: "oklch(0.479 0.009 171.759)" }, + "800": { value: "oklch(0.403 0.008 171.759)" }, + "900": { value: "oklch(0.328 0.006 171.759)" }, + "950": { value: "oklch(0.29 0.005 171.759)" }, + }, + }, + ]; + + it("wrong hex", () => { + expect(generatePalette("#ttgh12")).toBe(undefined); + }); + + it("no six-digit form hex ", () => { + expect(generatePalette("#f12")).toBe(undefined); + }); + + it.each(paletteTestCase)("generate palette for $color", ({ color, palette }) => { + expect(generatePalette(color)).toStrictEqual(palette); + }); +}); diff --git a/airflow-core/src/airflow/ui/src/utils/generatePalette.ts b/airflow-core/src/airflow/ui/src/utils/generatePalette.ts index a3c6be2573a93..673137d5792d8 100644 --- a/airflow-core/src/airflow/ui/src/utils/generatePalette.ts +++ b/airflow-core/src/airflow/ui/src/utils/generatePalette.ts @@ -20,6 +20,31 @@ import { oklch } from "culori"; export type Palette = Record; +export const roundTo3rdDecimal = (number: number) => { + const factor = 10 ** 3; + + return Math.round((number + Number.EPSILON) * factor) / factor; +}; + +export const quadraticLagrangeInterpolatingPolynomial = ( + point0: [number, number], + point1: [number, number], + point2: [number, number], +) => { + // For mathematical background see https://en.wikipedia.org/wiki/Lagrange_polynomial + const base0 = (value: number) => + ((value - point1[0]) / (point0[0] - point1[0])) * ((value - point2[0]) / (point0[0] - point2[0])); + const base1 = (value: number) => + ((value - point0[0]) / (point1[0] - point0[0])) * ((value - point2[0]) / (point1[0] - point2[0])); + const base2 = (value: number) => + ((value - point1[0]) / (point2[0] - point1[0])) * ((value - point0[0]) / (point2[0] - point0[0])); + + const linearCombinationBasis = (value: number) => + base0(value) * point0[1] + base1(value) * point1[1] + base2(value) * point2[1]; + + return linearCombinationBasis; +}; + export const generatePalette = (hex: string): Palette | undefined => { if (!/^#[\da-f]{6}$/iu.test(hex)) { return undefined; @@ -31,19 +56,30 @@ export const generatePalette = (hex: string): Palette | undefined => { return undefined; } - const { c: chroma = 0, h: hue = 0 } = base; + let { c: chroma = 0, h: hue = 0 } = base; + + chroma = roundTo3rdDecimal(chroma); + hue = roundTo3rdDecimal(hue); + + const keys = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950]; - const lightnessSteps = [0.97, 0.95, 0.89, 0.82, 0.71, 0.6, 0.48, 0.36, 0.27, 0.18, 0.15]; + const lightnessSteps = [0.97, 0.932, 0.857, 0.781, 0.706, 0.63, 0.554, 0.479, 0.403, 0.328, 0.29]; - const keys = ["50", "100", "200", "300", "400", "500", "600", "700", "800", "900", "950"]; + const chroma50 = chroma < 0.013 ? roundTo3rdDecimal(chroma / 2) : 0.013; + const chroma950 = chroma < 0.048 ? roundTo3rdDecimal(chroma / 2) : 0.048; + const chromaSteps = + chroma === 0 + ? () => chroma + : quadraticLagrangeInterpolatingPolynomial([50, chroma50], [500, chroma], [950, chroma950]); const palette: Palette = {}; keys.forEach((key, position) => { const lightness = lightnessSteps[position]; - const color = { value: `oklch(${lightness} ${chroma} ${hue})` }; + const newChroma = roundTo3rdDecimal(chromaSteps(key)); + const color = { value: `oklch(${lightness} ${newChroma} ${hue})` }; - palette[key] = color; + palette[key.toString()] = color; }); return palette; From 32e533aa59d493ba36003b5a09f37ccc53974cbc Mon Sep 17 00:00:00 2001 From: Zinkue <104169193+Zinkue@users.noreply.github.com> Date: Sun, 19 Oct 2025 13:01:26 +0200 Subject: [PATCH 5/6] Add UI documentation --- airflow-core/docs/howto/customize-ui.rst | 48 ++++++++++++++++++ .../exmaple_theme_configuration_dark_mode.png | Bin 0 -> 50438 bytes ...exmaple_theme_configuration_light_mode.png | Bin 0 -> 49534 bytes 3 files changed, 48 insertions(+) create mode 100644 airflow-core/docs/img/change-theme/exmaple_theme_configuration_dark_mode.png create mode 100644 airflow-core/docs/img/change-theme/exmaple_theme_configuration_light_mode.png diff --git a/airflow-core/docs/howto/customize-ui.rst b/airflow-core/docs/howto/customize-ui.rst index 3681554f8aee8..557a5ae67d98d 100644 --- a/airflow-core/docs/howto/customize-ui.rst +++ b/airflow-core/docs/howto/customize-ui.rst @@ -61,6 +61,54 @@ After .. image:: ../img/change-site-title/example_instance_name_configuration.png +Customizing side/navbar color +----------------------------- + +We can provide a color to generate and apply a custom color palette for the UI's side/navbar. + +The color is used as the base for generating a cohesive theme that adapts text, backgrounds, and accent colors automatically. + +.. important:: + + - The color must be provided as a six-digit hexadecimal value in the form ``#RRGGBB`` + - Invalid or missing values the theme to the built-in default color scheme. + +.. note:: + + Both pure white ``#ffffff`` and pure black ``#000000`` will generate the same color palette (grayscale). + They have no hue or color saturation. Their only difference is brightness, not color tone. + +To make this change, simply: + +1. Add the configuration option of ``theme`` under the ``[api]`` section inside ``airflow.cfg``: + +.. code-block:: + + [api] + + theme = "#ff0000" + + +2. Alternatively, you can set a custom title using the environment variable: + +.. code-block:: + + AIRFLOW__API__THEME = "#ff0000" + + +Screenshots +^^^^^^^^^^^ + +Light Mode +"""""""""" + +.. image:: ../img/change-theme/exmaple_theme_configuration_light_mode.png + +Dark Mode +""""""""" + +.. image:: ../img/change-theme/exmaple_theme_configuration_dark_mode.png + | Adding Dashboard Alert Messages diff --git a/airflow-core/docs/img/change-theme/exmaple_theme_configuration_dark_mode.png b/airflow-core/docs/img/change-theme/exmaple_theme_configuration_dark_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..52db2fce0a4e3189b357c94557d34ae2dfd68b69 GIT binary patch literal 50438 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 literal 0 HcmV?d00001 diff --git a/airflow-core/docs/img/change-theme/exmaple_theme_configuration_light_mode.png b/airflow-core/docs/img/change-theme/exmaple_theme_configuration_light_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..b31ad03571f8b07be9a28b4889a9c0d9ca34db95 GIT binary patch literal 49534 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 Date: Tue, 21 Oct 2025 22:14:36 +0200 Subject: [PATCH 6/6] Update spelling_wordlist.txt --- docs/spelling_wordlist.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/spelling_wordlist.txt b/docs/spelling_wordlist.txt index ec25fe54498b6..77895acb45d9a 100644 --- a/docs/spelling_wordlist.txt +++ b/docs/spelling_wordlist.txt @@ -787,6 +787,7 @@ gpu gpus Grafana graphviz +grayscale greenlet Groupalia groupId