mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Make styling less brittle by not relying on static HTML-element structures with CSS-rules
Co-authored-by: Janne Savolainen <janne.savolainen@live.fi> Signed-off-by: Iku-turso <mikko.aspiala@gmail.com>
This commit is contained in:
parent
329e251aa1
commit
f7e250ea85
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.HorizontalLine {
|
||||||
|
margin-top: 40px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
|
||||||
|
height: 1px;
|
||||||
|
border-top: thin solid var(--hrColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
.Small {
|
||||||
|
margin-top: 20px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||||
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||||
|
*/
|
||||||
|
import React from "react";
|
||||||
|
import styles from "./horizontal-line.module.scss";
|
||||||
|
import { cssNames } from "../../../../renderer/utils";
|
||||||
|
|
||||||
|
export const HorizontalLine = ({ small } = { small: false }) => (
|
||||||
|
<div
|
||||||
|
className={cssNames({
|
||||||
|
[styles.HorizontalLine]: true,
|
||||||
|
[styles.Small]: small,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
||||||
import React from "react";
|
|
||||||
import { getPreferencePage } from "../../get-preference-page";
|
import { getPreferencePage } from "../../get-preference-page";
|
||||||
|
import { HorizontalLine } from "../../horizontal-line/horizontal-line";
|
||||||
|
|
||||||
const applicationPreferencePageInjectable = getInjectable({
|
const applicationPreferencePageInjectable = getInjectable({
|
||||||
id: "application-preference-page",
|
id: "application-preference-page",
|
||||||
@ -16,7 +16,7 @@ const applicationPreferencePageInjectable = getInjectable({
|
|||||||
parentId: "application-tab",
|
parentId: "application-tab",
|
||||||
orderNumber: 0,
|
orderNumber: 0,
|
||||||
Component: getPreferencePage("Application"),
|
Component: getPreferencePage("Application"),
|
||||||
childrenSeparator: () => <hr />,
|
childrenSeparator: HorizontalLine,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
injectionToken: preferenceItemInjectionToken,
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
|||||||
@ -37,8 +37,6 @@ const NonInjectedKubectlDownloadMirror = observer(({ userStore }: Dependencies)
|
|||||||
themeName="lens"
|
themeName="lens"
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
));
|
));
|
||||||
|
|
||||||
export const KubectlDownloadMirror = withInjectables<Dependencies>(
|
export const KubectlDownloadMirror = withInjectables<Dependencies>(
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
import { getInjectable } from "@ogre-tools/injectable";
|
import { getInjectable } from "@ogre-tools/injectable";
|
||||||
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
||||||
import React from "react";
|
|
||||||
import { getPreferencePage } from "../../get-preference-page";
|
import { getPreferencePage } from "../../get-preference-page";
|
||||||
|
import { HorizontalLine } from "../../horizontal-line/horizontal-line";
|
||||||
|
|
||||||
const kubernetesPreferencePageInjectable = getInjectable({
|
const kubernetesPreferencePageInjectable = getInjectable({
|
||||||
id: "kubernetes-preference-page",
|
id: "kubernetes-preference-page",
|
||||||
@ -16,7 +16,7 @@ const kubernetesPreferencePageInjectable = getInjectable({
|
|||||||
parentId: "kubernetes-tab",
|
parentId: "kubernetes-tab",
|
||||||
orderNumber: 0,
|
orderNumber: 0,
|
||||||
Component: getPreferencePage("Kubernetes"),
|
Component: getPreferencePage("Kubernetes"),
|
||||||
childrenSeparator: () => <hr />,
|
childrenSeparator: HorizontalLine,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
injectionToken: preferenceItemInjectionToken,
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
import type { IComputedValue } from "mobx";
|
import type { IComputedValue } from "mobx";
|
||||||
import { computed } from "mobx";
|
import { computed } from "mobx";
|
||||||
import React from "react";
|
import { HorizontalLine } from "../horizontal-line/horizontal-line";
|
||||||
|
|
||||||
export interface PreferenceTabsRoot {
|
export interface PreferenceTabsRoot {
|
||||||
kind: "preference-tabs-root";
|
kind: "preference-tabs-root";
|
||||||
@ -19,5 +19,5 @@ export const preferenceTabsRoot: PreferenceTabsRoot = {
|
|||||||
id: "preference-tabs",
|
id: "preference-tabs",
|
||||||
parentId: undefined,
|
parentId: undefined,
|
||||||
isShown: computed(() => true as const),
|
isShown: computed(() => true as const),
|
||||||
childrenSeparator: () => <hr />,
|
childrenSeparator: HorizontalLine,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable";
|
|||||||
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
import { preferenceItemInjectionToken } from "../preference-item-injection-token";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { getPreferencePage } from "../../get-preference-page";
|
import { getPreferencePage } from "../../get-preference-page";
|
||||||
|
import { HorizontalLine } from "../../horizontal-line/horizontal-line";
|
||||||
|
|
||||||
const proxyPreferencePageInjectable = getInjectable({
|
const proxyPreferencePageInjectable = getInjectable({
|
||||||
id: "proxy-preference-page",
|
id: "proxy-preference-page",
|
||||||
@ -16,7 +17,7 @@ const proxyPreferencePageInjectable = getInjectable({
|
|||||||
parentId: "proxy-tab",
|
parentId: "proxy-tab",
|
||||||
orderNumber: 0,
|
orderNumber: 0,
|
||||||
Component: getPreferencePage("Proxy"),
|
Component: getPreferencePage("Proxy"),
|
||||||
childrenSeparator: () => <hr className="small" />,
|
childrenSeparator: () => <HorizontalLine small />,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
injectionToken: preferenceItemInjectionToken,
|
injectionToken: preferenceItemInjectionToken,
|
||||||
|
|||||||
@ -15,16 +15,15 @@ import type { IComputedValue } from "mobx";
|
|||||||
import { Map } from "../../../renderer/components/map/map";
|
import { Map } from "../../../renderer/components/map/map";
|
||||||
import { observer } from "mobx-react";
|
import { observer } from "mobx-react";
|
||||||
import { PreferencesNavigation } from "./preference-navigation/preferences-navigation";
|
import { PreferencesNavigation } from "./preference-navigation/preferences-navigation";
|
||||||
|
import Gutter from "../../../renderer/components/gutter/gutter";
|
||||||
|
|
||||||
interface Dependencies {
|
interface Dependencies {
|
||||||
closePreferences: () => void;
|
closePreferences: () => void;
|
||||||
pageComposite: IComputedValue<Composite<PreferenceTab> | undefined>;
|
pageComposite: IComputedValue<Composite<PreferenceTab> | undefined>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const NonInjectedPreferences = observer(({
|
const NonInjectedPreferences = observer(
|
||||||
closePreferences,
|
({ closePreferences, pageComposite }: Dependencies) => {
|
||||||
pageComposite,
|
|
||||||
}: Dependencies) => {
|
|
||||||
const composite = pageComposite.get();
|
const composite = pageComposite.get();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -47,7 +46,8 @@ const NonInjectedPreferences = observer(({
|
|||||||
)}
|
)}
|
||||||
</SettingLayout>
|
</SettingLayout>
|
||||||
);
|
);
|
||||||
});
|
},
|
||||||
|
);
|
||||||
|
|
||||||
const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
||||||
const value = composite.value;
|
const value = composite.value;
|
||||||
@ -56,7 +56,10 @@ const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
|||||||
case "group": {
|
case "group": {
|
||||||
return (
|
return (
|
||||||
<section id={value.id}>
|
<section id={value.id}>
|
||||||
<Map items={composite.children} getSeparator={value.childrenSeparator}>
|
<Map
|
||||||
|
items={composite.children}
|
||||||
|
getSeparator={value.childrenSeparator || DefaultSeparator}
|
||||||
|
>
|
||||||
{toPreferenceItemHierarchy}
|
{toPreferenceItemHierarchy}
|
||||||
</Map>
|
</Map>
|
||||||
</section>
|
</section>
|
||||||
@ -69,7 +72,10 @@ const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
|||||||
return (
|
return (
|
||||||
<div data-preference-item-test={composite.id}>
|
<div data-preference-item-test={composite.id}>
|
||||||
<Component>
|
<Component>
|
||||||
<Map items={composite.children} getSeparator={value.childrenSeparator}>
|
<Map
|
||||||
|
items={composite.children}
|
||||||
|
getSeparator={value.childrenSeparator}
|
||||||
|
>
|
||||||
{toPreferenceItemHierarchy}
|
{toPreferenceItemHierarchy}
|
||||||
</Map>
|
</Map>
|
||||||
</Component>
|
</Component>
|
||||||
@ -83,7 +89,10 @@ const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Component item={value}>
|
<Component item={value}>
|
||||||
<Map items={composite.children} getSeparator={value.childrenSeparator}>
|
<Map
|
||||||
|
items={composite.children}
|
||||||
|
getSeparator={value.childrenSeparator || DefaultSeparator}
|
||||||
|
>
|
||||||
{toPreferenceItemHierarchy}
|
{toPreferenceItemHierarchy}
|
||||||
</Map>
|
</Map>
|
||||||
</Component>
|
</Component>
|
||||||
@ -94,11 +103,7 @@ const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
|||||||
|
|
||||||
// eslint-disable-next-line no-fallthrough
|
// eslint-disable-next-line no-fallthrough
|
||||||
case "tab": {
|
case "tab": {
|
||||||
return (
|
return <Map items={composite.children}>{toPreferenceItemHierarchy}</Map>;
|
||||||
<Map items={composite.children}>
|
|
||||||
{toPreferenceItemHierarchy}
|
|
||||||
</Map>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
@ -109,7 +114,9 @@ const toPreferenceItemHierarchy = (composite: Composite<PreferenceTypes>) => {
|
|||||||
// Note: this code is unreachable, it is here to make ts not complain about
|
// Note: this code is unreachable, it is here to make ts not complain about
|
||||||
// _exhaustiveCheck not being used.
|
// _exhaustiveCheck not being used.
|
||||||
// See: https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking
|
// See: https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking
|
||||||
throw new Error(`Tried to create preferences, but foreign item was encountered: ${_exhaustiveCheck} ${value}`);
|
throw new Error(
|
||||||
|
`Tried to create preferences, but foreign item was encountered: ${_exhaustiveCheck} ${value}`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -126,3 +133,4 @@ export const Preferences = withInjectables<Dependencies>(
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const DefaultSeparator = () => <Gutter size="xl" />;
|
||||||
|
|||||||
@ -12,3 +12,4 @@ $baseline: 8px;
|
|||||||
|
|
||||||
@include gutterSize('sm', 2 * $baseline);
|
@include gutterSize('sm', 2 * $baseline);
|
||||||
@include gutterSize('md', 3 * $baseline);
|
@include gutterSize('md', 3 * $baseline);
|
||||||
|
@include gutterSize('xl', 5 * $baseline);
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import { cssNames } from "../../utils";
|
|||||||
import styles from "./gutter.module.scss";
|
import styles from "./gutter.module.scss";
|
||||||
|
|
||||||
interface GutterProps {
|
interface GutterProps {
|
||||||
size?: "sm" | "md";
|
size?: "sm" | "md" | "xl";
|
||||||
}
|
}
|
||||||
|
|
||||||
const Gutter = ({ size = "md" }: GutterProps) => {
|
const Gutter = ({ size = "md" }: GutterProps) => {
|
||||||
|
|||||||
@ -121,14 +121,6 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
&:not(:first-of-type) {
|
|
||||||
margin-top: 40px;
|
|
||||||
|
|
||||||
&.small {
|
|
||||||
margin-top: 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2 {
|
h1, h2 {
|
||||||
color: var(--textColorAccent);
|
color: var(--textColorAccent);
|
||||||
}
|
}
|
||||||
@ -167,15 +159,14 @@
|
|||||||
|
|
||||||
hr {
|
hr {
|
||||||
margin-top: 40px;
|
margin-top: 40px;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border-top: thin solid var(--hrColor);
|
border-top: thin solid var(--hrColor);
|
||||||
|
|
||||||
&.small {
|
&.small {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
}
|
margin-bottom: 20px;
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
display: none;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user