85a0f1df1c
Reduces some noise in the index.css file and adds a comment why it was done in the first place.
141 lines
4.6 KiB
JavaScript
141 lines
4.6 KiB
JavaScript
import {readFileSync} from 'node:fs';
|
|
import {env} from 'node:process';
|
|
import {parse} from 'postcss';
|
|
import plugin from 'tailwindcss/plugin.js';
|
|
|
|
const isProduction = env.NODE_ENV !== 'development';
|
|
|
|
function extractRootVars(css) {
|
|
const root = parse(css);
|
|
const vars = new Set();
|
|
root.walkRules((rule) => {
|
|
if (rule.selector !== ':root') return;
|
|
rule.each((decl) => {
|
|
if (decl.value && decl.prop.startsWith('--')) {
|
|
vars.add(decl.prop.substring(2));
|
|
}
|
|
});
|
|
});
|
|
return Array.from(vars);
|
|
}
|
|
|
|
const vars = extractRootVars([
|
|
readFileSync(new URL('web_src/css/themes/theme-gitea-light.css', import.meta.url), 'utf8'),
|
|
readFileSync(new URL('web_src/css/themes/theme-gitea-dark.css', import.meta.url), 'utf8'),
|
|
].join('\n'));
|
|
|
|
export default {
|
|
prefix: 'tw-',
|
|
important: true, // the frameworks are mixed together, so tailwind needs to override other framework's styles
|
|
content: [
|
|
isProduction && '!./templates/devtest/**/*',
|
|
isProduction && '!./web_src/js/standalone/devtest.js',
|
|
'!./templates/swagger/v1_json.tmpl',
|
|
'!./templates/user/auth/oidc_wellknown.tmpl',
|
|
'./templates/**/*.tmpl',
|
|
'./web_src/js/**/*.{js,vue}',
|
|
// explicitly list Go files that contain tailwind classes
|
|
'models/avatars/avatar.go',
|
|
'modules/markup/file_preview.go',
|
|
'modules/markup/sanitizer.go',
|
|
'services/auth/source/oauth2/*.go',
|
|
'routers/web/repo/{view,blame,issue_content_history}.go',
|
|
].filter(Boolean),
|
|
blocklist: [
|
|
// classes that don't work without CSS variables from "@tailwind base" which we don't use
|
|
'transform', 'shadow', 'ring', 'blur', 'grayscale', 'invert', '!invert', 'filter', '!filter',
|
|
'backdrop-filter',
|
|
// we use double-class tw-hidden defined in web_src/css/helpers.css for increased specificity
|
|
'hidden',
|
|
],
|
|
theme: {
|
|
colors: {
|
|
// make `tw-bg-red` etc work with our CSS variables
|
|
...Object.fromEntries(vars.filter((prop) => prop.startsWith('color-')).map((prop) => {
|
|
const color = prop.substring(6);
|
|
return [color, `var(--color-${color})`];
|
|
})),
|
|
inherit: 'inherit',
|
|
current: 'currentcolor',
|
|
transparent: 'transparent',
|
|
},
|
|
borderRadius: {
|
|
'none': '0',
|
|
'sm': '2px',
|
|
'DEFAULT': 'var(--border-radius)', // 4px
|
|
'md': 'var(--border-radius-medium)', // 6px
|
|
'lg': '8px',
|
|
'xl': '12px',
|
|
'2xl': '16px',
|
|
'3xl': '24px',
|
|
'full': 'var(--border-radius-full)',
|
|
},
|
|
fontFamily: {
|
|
sans: 'var(--fonts-regular)',
|
|
mono: 'var(--fonts-monospace)',
|
|
},
|
|
fontWeight: {
|
|
light: 'var(--font-weight-light)',
|
|
normal: 'var(--font-weight-normal)',
|
|
medium: 'var(--font-weight-medium)',
|
|
semibold: 'var(--font-weight-semibold)',
|
|
bold: 'var(--font-weight-bold)',
|
|
},
|
|
fontSize: { // not using `rem` units because our root is currently 14px
|
|
'xs': '12px',
|
|
'sm': '14px',
|
|
'base': '16px',
|
|
'lg': '18px',
|
|
'xl': '20px',
|
|
'2xl': '24px',
|
|
'3xl': '30px',
|
|
'4xl': '36px',
|
|
'5xl': '48px',
|
|
'6xl': '60px',
|
|
'7xl': '72px',
|
|
'8xl': '96px',
|
|
'9xl': '128px',
|
|
...Object.fromEntries(Array.from({length: 100}, (_, i) => {
|
|
return [`${i}`, `${i === 0 ? '0' : `${i}px`}`];
|
|
})),
|
|
},
|
|
},
|
|
plugins: [
|
|
plugin(({addUtilities}) => {
|
|
// base variables required for transform utilities
|
|
// added as utilities since base is not imported
|
|
// note: required when using tailwind's transform classes
|
|
addUtilities({
|
|
'.transform-reset': {
|
|
'--tw-translate-x': 0,
|
|
'--tw-translate-y': 0,
|
|
'--tw-rotate': 0,
|
|
'--tw-skew-x': 0,
|
|
'--tw-skew-y': 0,
|
|
'--tw-scale-x': '1',
|
|
'--tw-scale-y': '1',
|
|
},
|
|
});
|
|
}),
|
|
plugin(({addUtilities}) => {
|
|
addUtilities({
|
|
// tw-hidden must win all other "display: xxx !important" classes to get the chance to "hide" an element.
|
|
// do not use:
|
|
// * "[hidden]" attribute: it's too weak, can not be applied to an element with "display: flex"
|
|
// * ".hidden" class: it has been polluted by Fomantic UI in many cases
|
|
// * inline style="display: none": it's difficult to tweak
|
|
// * jQuery's show/hide/toggle: it can not show/hide elements with "display: xxx !important"
|
|
// only use:
|
|
// * this ".tw-hidden" class
|
|
// * showElem/hideElem/toggleElem functions in "utils/dom.js"
|
|
'.hidden.hidden': {
|
|
'display': 'none',
|
|
},
|
|
// proposed class from https://github.com/tailwindlabs/tailwindcss/pull/12128
|
|
'.break-anywhere': {
|
|
'overflow-wrap': 'anywhere',
|
|
},
|
|
});
|
|
}),
|
|
],
|
|
};
|