diff --git a/CHANGELOG.md b/CHANGELOG.md index a875fa42..35293318 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,19 @@ and this project adheres to ### Added +### Changed + +### Removed + +### Fixed + +## [1.7.4] - 2026-11-03 + +### Added + - Open a block by its height, also at `/block/` [#26] - Add a switch to show provisioners with no stake [#63] -### Changed - ### Removed - Remove the token pages, which only showed sample data [#90] @@ -24,7 +32,6 @@ and this project adheres to - Show the explorer's own page for a page that isn't there - Say an account address isn't valid, rather than that the network couldn't be read [#30] - Round the average gas price to two decimals [#71] -- Make success text on badges easier to read on the light page [#18] - Change the network dot when the node stops answering [#19] ## [1.7.3] - 2026-11-03 @@ -444,7 +451,6 @@ dusk-network/rusk#3925: https://github.com/dusk-network/rusk/issues/3925 dusk-network/rusk#3930: https://github.com/dusk-network/rusk/issues/3930 dusk-network/rusk#3931: https://github.com/dusk-network/rusk/issues/3931 dusk-network/rusk#3985: https://github.com/dusk-network/rusk/issues/3985 -[#18]: https://github.com/dusk-network/explorer/issues/18 [#19]: https://github.com/dusk-network/explorer/issues/19 [#26]: https://github.com/dusk-network/explorer/issues/26 [#30]: https://github.com/dusk-network/explorer/issues/30 @@ -457,6 +463,7 @@ dusk-network/rusk#3985: https://github.com/dusk-network/rusk/issues/3985 [Unreleased]: https://github.com/dusk-network/explorer/tree/main +[1.7.4]: https://github.com/dusk-network/explorer/tree/explorer-v1.7.4 [1.7.3]: https://github.com/dusk-network/explorer/tree/explorer-v1.7.3 [1.7.2]: https://github.com/dusk-network/explorer/tree/explorer-v1.7.2 [1.7.1]: https://github.com/dusk-network/explorer/tree/explorer-v1.7.1 diff --git a/package-lock.json b/package-lock.json index 94bee6b1..f721fbd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "explorer", - "version": "1.7.3", + "version": "1.7.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "explorer", - "version": "1.7.3", + "version": "1.7.4", "license": "MPL-2.0", "dependencies": { "@dusk-network/app-core": "0.5.0", diff --git a/package.json b/package.json index 731db96d..3936bb04 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "typecheck:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch --fail-on-warnings" }, "type": "module", - "version": "1.7.3", + "version": "1.7.4", "overrides": { "cookie": "0.7.2" }, diff --git a/src/lib/components/__tests__/AppSource.spec.js b/src/lib/components/__tests__/AppSource.spec.js deleted file mode 100644 index 85dbd5cf..00000000 --- a/src/lib/components/__tests__/AppSource.spec.js +++ /dev/null @@ -1,115 +0,0 @@ -import { afterEach, describe, expect, it } from "vitest"; -import { cleanup, render } from "@testing-library/svelte"; -import { ownPairs } from "lamb"; -import { base } from "$app/paths"; - -import { AppSource } from ".."; - -/** @type {(container: HTMLElement) => HTMLSourceElement} */ -const getSourceElementIn = (container) => - /** @type {HTMLSourceElement} */ (container.querySelector("source")); - -describe("AppSource", () => { - const commonProps = { - "data-foo": "bar", - height: "600", - type: "image/jpeg", - width: "800", - }; - - afterEach(cleanup); - - describe("src attribute", () => { - const baseProps = { - ...commonProps, - src: "/images/some-image.jpg", - }; - - it("should render a source element forwarding all attributes but with the base path prepended to the `src` if it's an absolute URL", async () => { - const { container, rerender } = render(AppSource, baseProps); - const source = getSourceElementIn(container); - - ownPairs(commonProps).forEach(([key, value]) => { - expect(source).toHaveAttribute(key, value); - }); - - expect(source).toHaveAttribute("src", `${base}${baseProps.src}`); - - await rerender({ ...baseProps, src: "/" }); - - expect(getSourceElementIn(container)).toHaveAttribute("src", `${base}/`); - }); - - it("shouldn't touch a `src` with a relative path", () => { - const src = "images/some-image.jpg"; - const { container } = render(AppSource, { ...baseProps, src }); - - expect(getSourceElementIn(container)).toHaveAttribute("src", src); - }); - - it("shoudn't touch a `src` with an external URL", () => { - const src = "http://example.com/some-image.jpg"; - const { container } = render(AppSource, { ...baseProps, src }); - - expect(getSourceElementIn(container)).toHaveAttribute("src", src); - }); - }); - - describe("srcset attribute", () => { - it("should render a source element forwarding all attributes but with the base path prepended to absolute URLs in the `srcset`", async () => { - const props = { - ...commonProps, - srcset: "/images/some-image.jpg 1.5x", - }; - const { container, rerender } = render(AppSource, props); - const source = getSourceElementIn(container); - - ownPairs(commonProps).forEach(([key, value]) => { - expect(source).toHaveAttribute(key, value); - }); - - expect(source).toHaveAttribute("srcset", `${base}${props.srcset}`); - - await rerender({ ...props, srcset: "/images/some-image.jpg" }); - - expect(getSourceElementIn(container)).toHaveAttribute( - "srcset", - `${base}/images/some-image.jpg` - ); - - await rerender({ ...props, srcset: "/ 1.5x" }); - - expect(getSourceElementIn(container)).toHaveAttribute( - "srcset", - `${base}/ 1.5x` - ); - }); - - it("should be able to handle multiple values in the srcset", () => { - const props = { - ...commonProps, - srcset: "/images/some-image.jpg 1.5x, /foo.jpg, /bar/baz.jpg 300w", - }; - const { container } = render(AppSource, props); - - expect(getSourceElementIn(container)).toHaveAttribute( - "srcset", - `${base}/images/some-image.jpg 1.5x, ${base}/foo.jpg, ${base}/bar/baz.jpg 300w` - ); - }); - - it("shouldn't touch elements with relative or absolute URLs in the srcset", () => { - const props = { - ...commonProps, - srcset: - "/images/some-image.jpg 1.5x, http://example.com/foo.jpg, bar/baz.jpg 300w", - }; - const { container } = render(AppSource, props); - - expect(getSourceElementIn(container)).toHaveAttribute( - "srcset", - `${base}/images/some-image.jpg 1.5x, http://example.com/foo.jpg, bar/baz.jpg 300w` - ); - }); - }); -}); diff --git a/src/lib/components/__tests__/TransactionStatus.spec.js b/src/lib/components/__tests__/TransactionStatus.spec.js deleted file mode 100644 index 1291fea4..00000000 --- a/src/lib/components/__tests__/TransactionStatus.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; -import { cleanup, render } from "@testing-library/svelte"; - -import { TransactionStatus } from ".."; - -describe("TransactionStatus", () => { - const baseProps = { - errorMessage: "", - }; - const baseOptions = { - props: baseProps, - target: document.body, - }; - - afterEach(cleanup); - - it("should say Completed or Failed, as the wallets do", () => { - const { container, rerender } = render(TransactionStatus, baseOptions); - - expect(container.firstElementChild).toHaveTextContent(/^Completed$/); - - rerender({ errorMessage: "Panic" }); - - return vi.waitFor(() => - expect(container.firstElementChild).toHaveTextContent(/^Failed$/) - ); - }); - - it("should say why it failed in a tooltip when asked to, and only then", () => { - const tooltipOf = (/** @type {Record} */ props) => { - cleanup(); - - return render(TransactionStatus, { - ...baseOptions, - props: { ...baseProps, ...props }, - }).container.firstElementChild?.getAttribute("data-tooltip-text"); - }; - - expect(tooltipOf({ errorMessage: "Panic", showErrorTooltip: true })).toBe( - "Panic" - ); - expect(tooltipOf({ errorMessage: "Panic" })).toBeNull(); - expect(tooltipOf({ showErrorTooltip: true })).toBeNull(); - }); -}); diff --git a/src/lib/components/app-source/AppSource.svelte b/src/lib/components/app-source/AppSource.svelte deleted file mode 100644 index d7901ac5..00000000 --- a/src/lib/components/app-source/AppSource.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/src/lib/components/index.js b/src/lib/components/index.js index 760c44e3..af67d1b4 100644 --- a/src/lib/components/index.js +++ b/src/lib/components/index.js @@ -2,7 +2,6 @@ export { default as AccountOverview } from "./account-overview/AccountOverview.s export { default as AppAnchor } from "./app-anchor/AppAnchor.svelte"; export { default as AppAnchorButton } from "./app-anchor-button/AppAnchorButton.svelte"; export { default as AppImage } from "./app-image/AppImage.svelte"; -export { default as AppSource } from "./app-source/AppSource.svelte"; export { default as BlockDetails } from "./block-details/BlockDetails.svelte"; export { default as BlocksCard } from "./blocks-card/BlocksCard.svelte"; export { default as BlocksList } from "./blocks-list/BlocksList.svelte"; @@ -32,5 +31,4 @@ export { default as TransactionsList } from "./transactions-list/TransactionsLis export { default as TransactionsTable } from "./transactions-table/TransactionsTable.svelte"; export { default as OverviewPanelDetailsItem } from "./overview-panel-details-item/OverviewPanelDetailsItem.svelte"; export { default as TransactionType } from "./transaction-type/TransactionType.svelte"; -export { default as TransactionStatus } from "./transaction-status/TransactionStatus.svelte"; export { default as WorldMap } from "./world-map/WorldMap.svelte"; diff --git a/src/lib/components/table/Table.css b/src/lib/components/table/Table.css index 8888f6cb..ec254b71 100644 --- a/src/lib/components/table/Table.css +++ b/src/lib/components/table/Table.css @@ -51,7 +51,3 @@ .table__body .table__row:hover { background-color: var(--calm-s1); } - -.table__data-cell .dusk-badge { - font-size: 0.75rem; -} diff --git a/src/lib/components/transaction-status/TransactionStatus.css b/src/lib/components/transaction-status/TransactionStatus.css deleted file mode 100644 index 55e99ca1..00000000 --- a/src/lib/components/transaction-status/TransactionStatus.css +++ /dev/null @@ -1,3 +0,0 @@ -.transaction-status[data-tooltip-id] { - cursor: help; -} diff --git a/src/lib/components/transaction-status/TransactionStatus.svelte b/src/lib/components/transaction-status/TransactionStatus.svelte deleted file mode 100644 index f1f4fb47..00000000 --- a/src/lib/components/transaction-status/TransactionStatus.svelte +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/src/lib/dusk/components/__tests__/Badge.spec.js b/src/lib/dusk/components/__tests__/Badge.spec.js deleted file mode 100644 index 5625db1f..00000000 --- a/src/lib/dusk/components/__tests__/Badge.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -import { afterEach, describe, expect, it } from "vitest"; -import { cleanup, render } from "@testing-library/svelte"; - -import { Badge } from ".."; - -describe("Badge", () => { - const baseProps = { - text: "Badge", - }; - - afterEach(cleanup); - - it("should only display a string 10 characters long", () => { - const props = { - ...baseProps, - maxlength: 10, - text: "ABCDEFGHIJK", - }; - const { container } = render(Badge, { ...props }); - expect(container.firstElementChild?.textContent?.length).toBe(10); - }); -}); diff --git a/src/lib/dusk/components/__tests__/Select.spec.js b/src/lib/dusk/components/__tests__/Select.spec.js deleted file mode 100644 index 808e8168..00000000 --- a/src/lib/dusk/components/__tests__/Select.spec.js +++ /dev/null @@ -1,36 +0,0 @@ -import { afterEach, describe, expect, it, vi } from "vitest"; -import { cleanup, fireEvent, render, screen } from "@testing-library/svelte"; - -import { Select } from "../"; - -const stringOptions = ["one", "two", "three", "four"]; - -describe("Select", () => { - const baseProps = { - options: stringOptions, - }; - afterEach(cleanup); - - it("should accept a change event handler", async () => { - const changeHandler = vi.fn(); - const props = { - ...baseProps, - "data-testid": "my-select", - value: "two", - }; - render(Select, { - events: { change: changeHandler }, - props, - }); - - /** @type {HTMLSelectElement} */ - const select = screen.getByTestId("my-select"); - const target = select.querySelector("option[value='four']"); - - await fireEvent.change(select, { target }); - - expect(changeHandler).toHaveBeenCalledTimes(1); - expect(changeHandler).toHaveBeenCalledWith(expect.any(Event)); - expect(select.value).toBe("four"); - }); -}); diff --git a/src/lib/dusk/components/badge/Badge.css b/src/lib/dusk/components/badge/Badge.css deleted file mode 100644 index bae2f198..00000000 --- a/src/lib/dusk/components/badge/Badge.css +++ /dev/null @@ -1,39 +0,0 @@ -/* A quiet chip: status words carry their colour on a neutral ground. */ -.dusk-badge { - display: inline-flex; - align-items: center; - justify-content: center; - padding: 0.3em 0.75em; - border: 0 none; - border-radius: 999px; - background-color: var(--calm-s2); - color: var(--calm-muted); - font-family: inherit; - font-size: 0.8125em; - font-weight: 500; - letter-spacing: 0; - line-height: 1.2; - text-align: center; - text-transform: none; -} - -.dusk-badge--variant-neutral { - color: var(--calm-text); -} - -.dusk-badge--variant-alt { - background-color: var(--calm-pill); - color: var(--calm-on-pill); -} - -.dusk-badge--variant-warning { - color: var(--calm-pending); -} - -.dusk-badge--variant-error { - color: var(--calm-danger); -} - -.dusk-badge--variant-success { - color: var(--calm-online-text); -} diff --git a/src/lib/dusk/components/badge/Badge.svelte b/src/lib/dusk/components/badge/Badge.svelte deleted file mode 100644 index 0dbfdd39..00000000 --- a/src/lib/dusk/components/badge/Badge.svelte +++ /dev/null @@ -1,23 +0,0 @@ - - -{text.substring(0, maxlength)} diff --git a/src/lib/dusk/components/dusk.components.d.ts b/src/lib/dusk/components/dusk.components.d.ts index ce5be37d..3f341f03 100644 --- a/src/lib/dusk/components/dusk.components.d.ts +++ b/src/lib/dusk/components/dusk.components.d.ts @@ -1,13 +1,9 @@ -type BadgeVariant = "neutral" | "success" | "warning" | "error" | "alt"; - type BannerVariant = "info" | "warning" | "error"; type ButtonSize = "default" | "small"; type ButtonVariant = "primary" | "secondary" | "tertiary"; -type GroupedSelectOptions = Record; - type IconProp = { path: string; position?: "after" | "before"; @@ -25,12 +21,6 @@ type NavListItem = { link: string; }; -type SelectOption = { - disabled?: boolean; - label?: string; - value: string; -}; - type TextboxTypes = | "email" | "hidden" diff --git a/src/lib/dusk/components/index.js b/src/lib/dusk/components/index.js index 81c95727..7c71bb9a 100644 --- a/src/lib/dusk/components/index.js +++ b/src/lib/dusk/components/index.js @@ -1,7 +1,6 @@ export { default as Anchor } from "./anchor/Anchor.svelte"; export { default as AnchorButton } from "./anchor-button/AnchorButton.svelte"; export { default as Banner } from "./banner/Banner.svelte"; -export { default as Badge } from "./badge/Badge.svelte"; export { default as Button } from "./button/Button.svelte"; export { default as Card } from "./card/Card.svelte"; export { default as CopyButton } from "./copy-button/CopyButton.svelte"; @@ -10,7 +9,6 @@ export { default as NavList } from "./nav-list/NavList.svelte"; export { default as ProgressBar } from "./progress-bar/ProgressBar.svelte"; export { default as Rerender } from "./rerender/Rerender.svelte"; export { default as RelativeTime } from "./relative-time/RelativeTime.svelte"; -export { default as Select } from "./select/Select.svelte"; export { default as Switch } from "./switch/Switch.svelte"; export { default as Textbox } from "./textbox/Textbox.svelte"; export { default as Throbber } from "./throbber/Throbber.svelte"; diff --git a/src/lib/dusk/components/select/Options.svelte b/src/lib/dusk/components/select/Options.svelte deleted file mode 100644 index cc5ea600..00000000 --- a/src/lib/dusk/components/select/Options.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - - -{#each options as option (isString(option) ? option : option.value)} - -{/each} diff --git a/src/lib/dusk/components/select/Select.css b/src/lib/dusk/components/select/Select.css deleted file mode 100644 index 4d5b618e..00000000 --- a/src/lib/dusk/components/select/Select.css +++ /dev/null @@ -1,47 +0,0 @@ -.dusk-select { - display: inline-block; - appearance: none; - font-family: inherit; - font-size: var(--control-font-size); - letter-spacing: 0; - padding: 0.625em 0.875em; - padding-right: 2.25em; - background-color: var(--non-button-control-bg-color); - border-color: var(--calm-line2); - border-radius: 0.75rem; - border-style: solid; - border-width: var(--control-border-size); - background-position: - calc(100% - 1.4em) 50%, - calc(100% - 1em) 50%; - background-size: - 0.4em 0.4em, - 0.4em 0.4em; - background-repeat: no-repeat; - background-image: - linear-gradient( - 45deg, - transparent 50%, - var(--non-button-control-text-color) 50% - ), - linear-gradient( - 135deg, - var(--non-button-control-text-color) 50%, - transparent 50% - ); -} - -.dusk-select, -.dusk-select option { - color: var(--non-button-control-text-color); -} - -.dusk-select:disabled { - opacity: 0.58; -} - -.dusk-select:enabled:focus-visible { - border-color: var(--calm-focus); - box-shadow: 0 0 0 2px var(--calm-focus-ring); - outline: 0 none; -} diff --git a/src/lib/dusk/components/select/Select.svelte b/src/lib/dusk/components/select/Select.svelte deleted file mode 100644 index 4ff1da58..00000000 --- a/src/lib/dusk/components/select/Select.svelte +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/style/duskit-bridge.css b/src/style/duskit-bridge.css index 902c0bdf..b7779682 100644 --- a/src/style/duskit-bridge.css +++ b/src/style/duskit-bridge.css @@ -98,9 +98,6 @@ --success-color-variant-dark: var(--calm-online); --warning-color: var(--calm-pending); --warning-color-variant-dark: var(--calm-pending); - --badge-error-color: var(--calm-danger); - --badge-success-color: var(--calm-online); - --badge-warning-color: var(--calm-pending); --on-background-color: var(--calm-text); --on-primary-color: var(--calm-on-pill);