Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(meter): Add Meter component #7401

Merged
merged 69 commits into from
Aug 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
f177d1b
feat(meter): Add Meter component
macandcheese Aug 1, 2023
9d12aa3
Clean up
macandcheese Aug 1, 2023
33c9a7e
Clean up
macandcheese Aug 1, 2023
35d24d4
Clean up story
macandcheese Aug 1, 2023
8a19819
Clean up story
macandcheese Aug 1, 2023
75827c6
Add readme file
macandcheese Aug 1, 2023
d0d7c73
Update properties
macandcheese Aug 1, 2023
760674f
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 1, 2023
a416e54
Update meter kind function
macandcheese Aug 1, 2023
940d629
Update label styles
macandcheese Aug 1, 2023
2ebf1b6
Pr feedback
macandcheese Aug 1, 2023
e140057
Pr feedback
macandcheese Aug 1, 2023
ede16cf
Pr feedback
macandcheese Aug 2, 2023
a4a156f
Pr feedback
macandcheese Aug 2, 2023
982c8c4
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 2, 2023
6eb4407
Pr feedback
macandcheese Aug 2, 2023
b052ee4
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 2, 2023
19c5483
Pr feedback
macandcheese Aug 2, 2023
e94da07
Pr feedback
macandcheese Aug 2, 2023
e1d82b5
Add t9n support
macandcheese Aug 3, 2023
3d9a60a
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 3, 2023
2f2dc32
Pr feedback
macandcheese Aug 3, 2023
abe8bd5
Clean up
macandcheese Aug 3, 2023
71a86eb
Update label positioning
macandcheese Aug 4, 2023
4c227a7
Update label positioning
macandcheese Aug 4, 2023
e4181d6
WIP - Prevent overlapping labels
macandcheese Aug 4, 2023
833b440
Update stories
macandcheese Aug 4, 2023
35fc201
Update stories
macandcheese Aug 4, 2023
420b07c
Update stories
macandcheese Aug 4, 2023
7769dbe
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 8, 2023
655d1d4
Refactor, dock value label, prevent range label overlapping
macandcheese Aug 8, 2023
809d34a
Clean up
macandcheese Aug 8, 2023
3cd3db3
Clean up
macandcheese Aug 8, 2023
af11019
Clean up
macandcheese Aug 8, 2023
d8bb390
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 8, 2023
d99639c
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 8, 2023
0e3193e
Clean up
macandcheese Aug 8, 2023
1713d7d
Update stories
macandcheese Aug 9, 2023
c9017d2
Update stories
macandcheese Aug 9, 2023
05c210a
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 9, 2023
acd55dd
Clean up
macandcheese Aug 9, 2023
6b9d308
Clean up
macandcheese Aug 9, 2023
afa5fec
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 11, 2023
19d9e61
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 12, 2023
9c26285
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 15, 2023
519c3be
Update demo
macandcheese Aug 16, 2023
efe3dd8
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 17, 2023
3e5ed8d
Restore removed translations
macandcheese Aug 17, 2023
08e67b5
Pr feedback
macandcheese Aug 17, 2023
fdfbd92
Pr feedback
macandcheese Aug 17, 2023
269b600
Pr feedback
macandcheese Aug 17, 2023
ef89774
Pr feedback
macandcheese Aug 18, 2023
a386123
Pr feedback
macandcheese Aug 18, 2023
2dd0644
Pr feedback
macandcheese Aug 18, 2023
2712c41
Pr feedback
macandcheese Aug 18, 2023
53bdd4e
Pr feedback
macandcheese Aug 18, 2023
d70a159
Pr feedback
macandcheese Aug 18, 2023
f26f4dd
Pr feedback
macandcheese Aug 18, 2023
58ab1bd
Pr feedback
macandcheese Aug 18, 2023
4f4c3ba
Clean up
macandcheese Aug 18, 2023
dc4c13f
Pr feedback
macandcheese Aug 18, 2023
7426b5e
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 18, 2023
b451209
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 19, 2023
e134cbf
Clean up
macandcheese Aug 19, 2023
9b01421
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 22, 2023
668ad6a
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 22, 2023
d9040c9
Merge branch 'main' into macandcheese/2249-new-component-meter
macandcheese Aug 22, 2023
6aa4c0e
Pr feedback
macandcheese Aug 22, 2023
55a8fe6
Clean up
macandcheese Aug 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/calcite-components/.storybook/preview-head.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@
max-width: 100%;
}

calcite-meter {
width: 450px;
max-width: 100%;
}

calcite-tabs,
calcite-progress {
width: 900px;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type MeterLabelType = "percent" | "units";
166 changes: 166 additions & 0 deletions packages/calcite-components/src/components/meter/meter.e2e.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import { newE2EPage } from "@stencil/core/testing";
import { html } from "../../../support/formatting";
import { accessible, renders, hidden, defaults, reflects } from "../../tests/commonTests";

describe("calcite-meter", () => {
describe("renders", () => {
renders("calcite-meter", { display: "flex" });
});

describe("defaults", () => {
defaults("calcite-meter", [
{
propertyName: "appearance",
defaultValue: "outline-fill",
},
{
propertyName: "disabled",
defaultValue: false,
},
{
propertyName: "fillType",
defaultValue: "range",
},
{
propertyName: "groupSeparator",
defaultValue: false,
},
{
propertyName: "max",
defaultValue: 100,
},
{
propertyName: "min",
defaultValue: 0,
},
{
propertyName: "rangeLabelType",
defaultValue: "percent",
},
{
propertyName: "scale",
defaultValue: "m",
},
{
propertyName: "unitLabel",
defaultValue: "",
},
{
propertyName: "valueLabel",
defaultValue: false,
},
{
propertyName: "valueLabelType",
defaultValue: "percent",
},
]);
});

describe("reflects", () => {
reflects("calcite-meter", [
{
propertyName: "appearance",
value: "outline-fill",
},
{
propertyName: "fillType",
value: "range",
},
{
propertyName: "max",
value: 100,
},
{
propertyName: "min",
value: 0,
},
{
propertyName: "rangeLabelType",
value: "percent",
},
{
propertyName: "scale",
value: "m",
},
{
propertyName: "valueLabelType",
value: "percent",
},
]);
});

describe("hidden", () => {
hidden("calcite-meter");
});

describe("accessible", () => {
accessible(`<calcite-meter label="A great meter"></calcite-meter>`);
});

describe("correctly sets range and value properties", () => {
it("correctly sets range and value properties if not present", async () => {
const page = await newE2EPage({
html: html`<calcite-meter />`,
});
const meter = await page.find(`calcite-meter`);
page.waitForChanges();
expect(await meter.getProperty("min")).toBe(0);
expect(await meter.getProperty("max")).toBe(100);
expect(await meter.getProperty("low")).toBe(0);
expect(await meter.getProperty("high")).toBe(100);
expect(await meter.getProperty("value")).toBe(0);
});

it("correctly sets range and value properties if not present and non-default min / max set", async () => {
const page = await newE2EPage({
html: html`<calcite-meter min="2000" max="10000" />`,
});
const meter = await page.find(`calcite-meter`);
page.waitForChanges();
expect(await meter.getProperty("min")).toBe(2000);
expect(await meter.getProperty("max")).toBe(10000);
expect(await meter.getProperty("low")).toBe(2000);
expect(await meter.getProperty("high")).toBe(10000);
expect(await meter.getProperty("value")).toBe(2000);
});

it("correctly adjusts out of range low and high", async () => {
const page = await newE2EPage({
html: html`<calcite-meter min="10" low="200" high="30" max="25" />`,
});
const meter = await page.find(`calcite-meter`);
page.waitForChanges();
expect(await meter.getProperty("min")).toBe(10);
expect(await meter.getProperty("max")).toBe(25);
expect(await meter.getProperty("low")).toBe(10);
expect(await meter.getProperty("high")).toBe(25);
expect(await meter.getProperty("value")).toBe(10);
});

it("correctly adjusts out of range low and high - b", async () => {
const page = await newE2EPage({
html: html`<calcite-meter min="10" low="15" high="5" max="25" />`,
});
const meter = await page.find(`calcite-meter`);
page.waitForChanges();
expect(await meter.getProperty("min")).toBe(10);
expect(await meter.getProperty("max")).toBe(25);
expect(await meter.getProperty("low")).toBe(10);
expect(await meter.getProperty("high")).toBe(25);
expect(await meter.getProperty("value")).toBe(10);
});

it("correctly leaves out of range value", async () => {
const page = await newE2EPage({
html: html`<calcite-meter value="210" min="10" low="200" high="30" max="25" />`,
});
const meter = await page.find(`calcite-meter`);
page.waitForChanges();
expect(await meter.getProperty("min")).toBe(10);
expect(await meter.getProperty("max")).toBe(25);
expect(await meter.getProperty("low")).toBe(10);
expect(await meter.getProperty("high")).toBe(25);
expect(await meter.getProperty("value")).toBe(210);
});
});
});
120 changes: 120 additions & 0 deletions packages/calcite-components/src/components/meter/meter.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
@include base-component();
@include disabled();

:host {
@apply flex;
--calcite-meter-space-internal: theme("spacing[0.5]");
--calcite-meter-height-internal: theme("spacing.4");
--calcite-meter-font-size-internal: var(--calcite-font-size--1);
}

:host([scale="s"]) {
--calcite-meter-height-internal: theme("spacing.3");
--calcite-meter-font-size-internal: var(--calcite-font-size--2);
}

:host([scale="l"]) {
--calcite-meter-height-internal: theme("spacing.6");
--calcite-meter-font-size-internal: var(--calcite-font-size-0);
}

.container {
@apply flex relative items-center w-full m-0;
block-size: var(--calcite-meter-height-internal);
background-color: var(--calcite-ui-foreground-2);
border: 1px solid var(--calcite-ui-border-3);
border-radius: var(--calcite-meter-height-internal);
}

.solid {
border: 1px solid var(--calcite-ui-foreground-3);
background-color: var(--calcite-ui-foreground-3);
}

.outline {
@apply bg-transparent;
}

.value-visible {
margin-block-start: theme("spacing.6");
}

.steps-visible {
margin-block-end: theme("spacing.6");
}

.step-line {
@apply block absolute inset-y-0;
inline-size: var(--calcite-meter-space-internal);
background-color: var(--calcite-ui-border-3);
}

.label {
@apply absolute;
font-size: var(--calcite-meter-font-size-internal);
}

.label-hidden {
@apply invisible opacity-0;
}

.label-value {
inset-block-end: calc(100% + 0.5em);
font-weight: var(--calcite-font-weight-bold);
color: var(--calcite-ui-text-1);
}

.label-range {
@apply text-color-3;
inset-block-start: calc(100% + 0.5em);
}

.unit-label {
@apply text-color-3 font-medium;
}

.label-value .unit-label {
@apply text-color-2 font-bold;
}

.fill {
@apply block absolute duration-150 ease-in-out bg-brand z-default;
inset-inline-start: var(--calcite-meter-space-internal);
inset-block: var(--calcite-meter-space-internal);
border-radius: var(--calcite-meter-height-internal);
max-inline-size: calc(100% - (var(--calcite-meter-space-internal) * 2));
min-inline-size: calc(var(--calcite-meter-height-internal) - (var(--calcite-meter-space-internal) * 2));
transition-property: inline-size, background-color, box-shadow;
}

.fill-danger {
background-color: var(--calcite-ui-danger);
}

.fill-success {
background-color: var(--calcite-ui-success);
}

.fill-warning {
background-color: var(--calcite-ui-warning);
}

.solid .fill {
inset-block: 0;
inset-inline-start: 0;
max-inline-size: 100%;
min-inline-size: calc(var(--calcite-meter-height-internal));
box-shadow: 0 0 0 1px var(--calcite-ui-brand);
}

.solid .fill-danger {
box-shadow: 0 0 0 1px var(--calcite-ui-danger);
}

.solid .fill-success {
box-shadow: 0 0 0 1px var(--calcite-ui-success);
}

.solid .fill-warning {
box-shadow: 0 0 0 1px var(--calcite-ui-warning);
}
Loading