mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 23:25:24 +00:00
fix: keep plugin tailwind variants in core's layer so overrides keep their order
This commit is contained in:
1 parent
4511cc0a42
commit
2f975f433e
3 files changed
+20
-6
No files matched your search
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- `termix-plugin build` puts a plugin's own Tailwind classes in core's utilities layer, so responsive, hover and group variants and `className` overrides on SDK components work. Classes core already ships stay below core's utilities as before. Rebuild a plugin to pick it up
|
- `termix-plugin build` puts a plugin's own Tailwind classes in core's utilities layer, so responsive, hover and group variants and `className` overrides on SDK components work. Plain classes core already ships stay below core's utilities as before, while variants core ships go with the plugin's own so `max-h-56 md:max-h-none` keeps its order. Rebuild a plugin to pick it up
|
||||||
|
|
||||||
## 1.0.3
|
## 1.0.3
|
||||||
|
|
||||||
|
|||||||
@@ -20,16 +20,18 @@ export function classNamesInCss(css) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Splits a plugin's candidates by whether core's own CSS already has them.
|
* Splits a plugin's candidates by whether core's own CSS already has them.
|
||||||
* A class core ships keeps the plugin's copy below core's utilities, so it can
|
* A plain class core ships keeps the plugin's copy below core's utilities, so
|
||||||
* never reorder core's rules. Any other class has no rule in core to fight,
|
* it can never reorder core's rules. Everything else goes in core's utilities
|
||||||
* so it goes in core's utilities layer and overrides the way it would in one
|
* layer: plugin-only classes, and every variant (md:, hover:, ...) even when
|
||||||
* Tailwind build.
|
* core ships it, so `max-h-56 md:max-h-none` is ordered in one build and a
|
||||||
|
* variant still beats core's own base class.
|
||||||
*/
|
*/
|
||||||
export function splitByCoreClasses(candidates, coreClasses) {
|
export function splitByCoreClasses(candidates, coreClasses) {
|
||||||
const shared = [];
|
const shared = [];
|
||||||
const own = [];
|
const own = [];
|
||||||
for (const candidate of candidates) {
|
for (const candidate of candidates) {
|
||||||
(coreClasses.has(candidate) ? shared : own).push(candidate);
|
const plain = !candidate.includes(":");
|
||||||
|
(plain && coreClasses.has(candidate) ? shared : own).push(candidate);
|
||||||
}
|
}
|
||||||
return { shared, own };
|
return { shared, own };
|
||||||
}
|
}
|
||||||
@@ -142,6 +142,18 @@ describe("plugin CSS layers", () => {
|
|||||||
).toEqual({ shared: ["w-28", "hidden"], own: ["md:w-44"] });
|
).toEqual({ shared: ["w-28", "hidden"], own: ["md:w-44"] });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("keeps variants core ships with the plugin's own classes", () => {
|
||||||
|
expect(
|
||||||
|
splitByCoreClasses(
|
||||||
|
["max-h-56", "md:max-h-none", "flex-col", "md:flex-row"],
|
||||||
|
new Set(["md:max-h-none", "flex-col", "md:flex-row"]),
|
||||||
|
),
|
||||||
|
).toEqual({
|
||||||
|
shared: ["flex-col"],
|
||||||
|
own: ["max-h-56", "md:max-h-none", "md:flex-row"],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it("keeps classes core ships below core and the plugin's own beside core's", async () => {
|
it("keeps classes core ships below core and the plugin's own beside core's", async () => {
|
||||||
vi.spyOn(console, "log").mockImplementation(() => {});
|
vi.spyOn(console, "log").mockImplementation(() => {});
|
||||||
// Core's class list comes from scanning this repo, this file included,
|
// Core's class list comes from scanning this repo, this file included,
|
||||||
|
|||||||
Reference in new issue
Block a user