Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
9675d51
feat(dave): Add summary support components and react-spring as new deps.
brunomenezes Feb 5, 2026
357c386
feat(dave): Add application summary page. Include page Story.
brunomenezes Feb 5, 2026
d22979c
refactor(dave): Adjust link generation for hierarchy and other parts.
brunomenezes Feb 5, 2026
a9c692e
refactor: Extend Spoiler in the ui-theme with defaults.
brunomenezes Feb 6, 2026
e982dda
refactor: remove negative offset for the hierarchy and make page-titl…
brunomenezes Feb 6, 2026
28b71b6
refactor: Reuse QueryPagination in the OutputsList component.
brunomenezes Feb 6, 2026
48159bc
refactor: Safer divisions and clear logic for hiding the content.
brunomenezes Feb 6, 2026
a9d974f
refactor: Use theme icon sizes.
brunomenezes Feb 6, 2026
f20c629
fix: Missing commitments that cause unwanted message to display.
brunomenezes Feb 6, 2026
c353fd1
refactor: Storybook to sync dark/light mode between toolbar and the U…
brunomenezes Feb 6, 2026
8cd61ac
chore: Ignore the generated content on prettier checks.
brunomenezes Feb 6, 2026
ef240c9
feat: Add connection logic and dependencies.
brunomenezes Feb 11, 2026
ce1a37c
refactor: Move wallet providet to be inside data-provider, keeping si…
brunomenezes Feb 11, 2026
f263d8e
feat: Add connection-provider to Providers component and removing wal…
brunomenezes Feb 11, 2026
0ffddd5
feat: Add settings-menu and implement custom-connect-button to keep d…
brunomenezes Feb 11, 2026
f1bbd60
refactor: Keep default padding if there is no balance to display
brunomenezes Feb 11, 2026
6d7f4da
feat: Add hooks to help check configuration and node-information outs…
brunomenezes Feb 11, 2026
26b9232
refactor: System connection creation before connection-provider renders.
brunomenezes Feb 11, 2026
25a980a
chore: Enable mock and add a default node-rpc-url on chromatic GA.
brunomenezes Feb 11, 2026
ee407cc
refactor: Replace use of app-config with selected-connection to set p…
brunomenezes Feb 12, 2026
407c510
feat: Add connection-modal, manage and create forms initial implement…
brunomenezes Feb 12, 2026
940ba77
feat: On connection switch force a re-render by using react-key prope…
brunomenezes Feb 12, 2026
0ccd01c
refactor: sort connection by timestamp after set_connections action.
brunomenezes Feb 12, 2026
66cb270
feat: display connected node at the top. After connect scroll to the …
brunomenezes Feb 12, 2026
83f613d
refactor: Include system-connection in the connections list. Optional…
brunomenezes Feb 12, 2026
4b2b2dd
refactor: Move connection-modal declaration to be before data-provider.
brunomenezes Feb 13, 2026
fd68198
refactor: Simplify connection-state data structures and move function…
brunomenezes Feb 13, 2026
e0ded69
feat: Add set-preferred connection, conn-creation validation and cust…
brunomenezes Feb 13, 2026
08e1d9a
feat: Improve chain configuration to seamless wallet connection.
brunomenezes Feb 14, 2026
364e5c4
feat: Add callback for post action on-connection-save. Switch back to…
brunomenezes Feb 14, 2026
ef101ed
feat: Notify the user of possible problems with DevNet connection.
brunomenezes Feb 14, 2026
3e41b39
refactor: Use pure viem-public-client to check chain-rpc endpoint.
brunomenezes Feb 14, 2026
ee8069a
refactor: Change the use of Activity react component to have free sta…
brunomenezes Feb 14, 2026
ad7808a
feat: Add app connectivity status with rollups-node in the connection…
brunomenezes Feb 16, 2026
be41027
feat: On startup notify user of unhealthy selected connection.
brunomenezes Feb 16, 2026
9d96332
feat: On startup without a selected connection display the connection…
brunomenezes Feb 16, 2026
34a2956
refactor: replace connection info in the settings and manage views.
brunomenezes Feb 19, 2026
893598f
chore: Add story for connection-settings. Visualise the selected conn…
brunomenezes Feb 23, 2026
5688afa
chore: improve a11y for settings menu.
brunomenezes Mar 2, 2026
7393c6a
feat(dave): Add summary support components and react-spring as new deps.
brunomenezes Feb 5, 2026
1e46e48
refactor: Create repository common info to share between features.
brunomenezes Feb 18, 2026
8a99391
chore: upgrade mantine and add dependencies for Specifications port.
brunomenezes Feb 18, 2026
f183159
feat: Add specification port with adjustments.
brunomenezes Feb 18, 2026
5904ab5
chore: Add jotai provider for specifications.
brunomenezes Feb 19, 2026
87336e8
feat: Add specification list route, container and path-builder.
brunomenezes Feb 19, 2026
0a3f144
feat: Add new specification route, container, page and path-builder.
brunomenezes Feb 19, 2026
a1ab750
feat: Add edit specification route, container, page and path-builder.
brunomenezes Feb 19, 2026
5df93b8
feat: Add new page-links component and add to the app header.
brunomenezes Feb 19, 2026
d61be0e
refactor: Use path-builder to generate href to navigate.
brunomenezes Feb 19, 2026
5d3a945
chore: bump nextJS version.
brunomenezes Feb 24, 2026
acda9be
feat: Add decoded option and input payload decoding
brunomenezes Feb 24, 2026
61fb564
feat: Add voucher output ABI decoding.
brunomenezes Feb 25, 2026
89fe9df
fix: Move Atom reader to be inside the promise resolve to always get …
brunomenezes Feb 25, 2026
0ed3fa5
chore: Remove generated next-env file.
brunomenezes Feb 25, 2026
27bdab4
feat: Add burger-button to access navbar on small devices.
brunomenezes Feb 25, 2026
6101d4d
chore: upgrade verce/sdk and turbo to latest versions.
brunomenezes Feb 26, 2026
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
4 changes: 3 additions & 1 deletion .github/workflows/chromatic.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ on: push
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
NEXT_PUBLIC_CARTESI_NODE_RPC_URL: http://127.0.0.1:10011/rpc
NEXT_PUBLIC_MOCK_ENABLED: true
jobs:
chromatic-deployment:
runs-on: ubuntu-latest
Expand Down
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ node_modules
.storybook
graphql
contracts.ts
**/src/generated/**
**/rollups-wagmi/src/index.tsx
1 change: 1 addition & 0 deletions apps/dave/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ src/generated
*.njsproj
*.sln
*.sw?
next-env.d.ts

*storybook.log
storybook-static
87 changes: 69 additions & 18 deletions apps/dave/.storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { MantineProvider } from "@mantine/core";
import { useMantineColorScheme } from "@mantine/core";
import "@mantine/core/styles.css";
import { Notifications } from "@mantine/notifications";
import type { Preview, StoryContext, StoryFn } from "@storybook/nextjs";
import { ReactNode, useCallback, useEffect, useState } from "react";
import { UPDATE_GLOBALS } from "storybook/internal/core-events";
import { addons, useGlobals } from 'storybook/preview-api';
import Layout from "../src/components/layout/Layout";
import { Providers } from '../src/providers/Providers';
import theme from "../src/providers/theme";
import './global.css';

try {
Expand All @@ -17,6 +18,8 @@ try {
console.info((error as Error).message)
}

type Globals = ReturnType<typeof useGlobals>[0]

const withLayout = (StoryFn: StoryFn, context: StoryContext) => {
const { title } = context;
const [sectionType] = title.split("/");
Expand All @@ -27,22 +30,70 @@ const withLayout = (StoryFn: StoryFn, context: StoryContext) => {
return <>{StoryFn(context.args, context)}</>;
};

const withProviders = (StoryFn: StoryFn, context: StoryContext) => {
return <Providers>{StoryFn(context.args, context)}</Providers>
const withProviders = (StoryFn: StoryFn, context: StoryContext) => {
return (
<Providers>
<ColorSchemeWrapper context={context}>
{StoryFn(context.args, context)}
</ColorSchemeWrapper>
</Providers>
)
}

const withMantine = (StoryFn: StoryFn, context: StoryContext) => {
const currentBg = context.globals.backgrounds?.value ?? "light";
const channel = addons.getChannel();

return (
<MantineProvider forceColorScheme={currentBg} theme={theme}>
<Notifications />
{StoryFn(context.args, context)}
</MantineProvider>
);
};
const generateNewBackgroundEvt = (colorScheme: unknown) => ({globals: { backgrounds: {value: colorScheme, grid: false}}})

// eslint-disable-next-line react-refresh/only-export-components
function ColorSchemeWrapper({ children, context}: { children: ReactNode, context: StoryContext }) {
const { colorScheme, setColorScheme } = useMantineColorScheme();
const [latestGlobalsBg, setLatestGlobalBg] = useState<string | undefined>(colorScheme);

const handleColorScheme = useCallback(({ globals }: { globals: Globals }) => {
const bgValue = globals.backgrounds?.value
const newMode = bgValue ?? 'light';
if(newMode !== colorScheme) {
setColorScheme(newMode);
setLatestGlobalBg(newMode);
} else if (newMode !== latestGlobalsBg) {
setLatestGlobalBg(newMode)
}
// update the handler function every time both variables change
// as the handler is outside of React's detection. We want
// to make sure the handler works with fresh values.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [colorScheme, latestGlobalsBg]);


useEffect(() => {
// Only when on story mode i.e. not on autodocs view.
// Due to the many re-renders until its finished. That cause slow but infinite loops.
if(context.viewMode === 'story') {
// on-mount emit single event to sync whatever is the default color-scheme on mantine
channel.emit(UPDATE_GLOBALS, generateNewBackgroundEvt(colorScheme))
}
}, [])

useEffect(() => {
channel.on(UPDATE_GLOBALS, handleColorScheme);
return () => {
// unsubscribe to subscribe again with fresher handler.
channel.off(UPDATE_GLOBALS, handleColorScheme);
}
}, [handleColorScheme]);

useEffect(() => {
if(colorScheme !== latestGlobalsBg) {
channel.emit(UPDATE_GLOBALS, generateNewBackgroundEvt(colorScheme));
}
}, [colorScheme, latestGlobalsBg])



return <>{children}</>;
}

const preview: Preview = {
const preview: Preview = {
initialGlobals: {
backgrounds: { value: "light" },
},
Expand All @@ -64,10 +115,10 @@ const preview: Preview = {
},
},
decorators: [
// Order matters. So layout decorator first. Fn calling is router(mantine(layout))
withLayout,
// Order matters. So layout decorator first. Fn calling is providers(layout(Story))
withLayout,
withProviders,
withMantine,

],
};

Expand Down
3 changes: 3 additions & 0 deletions apps/dave/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ import globals from "globals";
/** @type {import("eslint").Linter.Config[]} */
export default [
...reactInternal,
// ...nextJsConfig,

{ ignores: ["coverage/**", ".turbo/**", "public/**", ".next/**"] },
{
files: ["**/*.{ts,tsx}"],
languageOptions: {
Expand Down
11 changes: 11 additions & 0 deletions apps/dave/mantine.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,20 @@ type ExtendedCustomColors =
| core.DefaultMantineColor;
declare module "@mantine/core" {
export { core };

/**
* Making it optional as default values to the
* declared interface members are added in the theme.
*/
export interface SpoilerProps extends core.SpoilerProps {
hideLabel?: core.SpoilerProps["hideLabel"];
showLabel?: core.SpoilerProps["showLabel"];
}
export interface MantineThemeOther {
lgIconSize: number;
mdIconSize: number;
smIconSize: number;
xsIconSize: number;
zIndexXS: number;
zIndexSM: number;
zIndexMD: number;
Expand Down
6 changes: 0 additions & 6 deletions apps/dave/next-env.d.ts

This file was deleted.

21 changes: 15 additions & 6 deletions apps/dave/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"version": "0.0.0",
"type": "module",
"scripts": {
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
"clean": "rm -rf .turbo && rm -rf .next && rm -rf node_modules && rm -rf dist && rm -rf src/generated",
"dev": "next dev",
"build": "next build",
"start": "next start",
Expand All @@ -19,25 +19,33 @@
"dependencies": {
"@cartesi/viem": "2.0.0-alpha.26",
"@cartesi/wagmi": "2.0.0-alpha.30",
"@mantine/core": "^8.3.13",
"@mantine/form": "^8.3.13",
"@mantine/hooks": "^8.3.13",
"@mantine/notifications": "^8.3.13",
"@mantine/code-highlight": "^8.3.15",
"@mantine/core": "^8.3.15",
"@mantine/form": "^8.3.15",
"@mantine/hooks": "^8.3.15",
"@mantine/notifications": "^8.3.15",
"@rainbow-me/rainbowkit": "^2.2.10",
"@raugfer/jazzicon": "^1.0.6",
"@react-spring/web": "^10.0.1",
"@shazow/whatsabi": "^0.14.1",
"@tabler/icons-react": "^3.35.0",
"@tanstack/react-query": "catalog:",
"@vercel/analytics": "^1.6.1",
"abitype": "1.2.3",
"date-fns": "^4.1.0",
"dexie": "^4.0.11",
"humanize-duration": "^3.33.2",
"next": "^16.1.5",
"jotai": "^2.12.5",
"next": "^16.1.6",
"pretty-ms": "^8",
"ramda": "^0.32.0",
"ramda-adjunct": "^5.1.0",
"react": "catalog:",
"react-dom": "catalog:",
"react-icons": "^5.5.0",
"react-jazzicon": "^1",
"semver": "^7.7.4",
"uuid": "^11.1.0",
"viem": "catalog:",
"wagmi": "catalog:"
},
Expand All @@ -53,6 +61,7 @@
"@types/ramda": "^0.31.1",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@types/semver": "^7.7.1",
"@wagmi/cli": "^2.1.2",
"eslint": "catalog:",
"eslint-config-cartesi": "workspace:*",
Expand Down
6 changes: 6 additions & 0 deletions apps/dave/src/app/apps/[application]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { ApplicationSummaryContainer } from "../../../containers/ApplicationSummaryContainer";

export default async function Page(props: PageProps<"/apps/[application]">) {
const { application } = await props.params;
return <ApplicationSummaryContainer application={application} />;
}
2 changes: 2 additions & 0 deletions apps/dave/src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { ColorSchemeScript, mantineHtmlProps } from "@mantine/core";
import "@mantine/core/styles.css";
// prettier-ignore code-highlight styles must be imported after the core.
import "@mantine/code-highlight/styles.css";
import "@mantine/notifications/styles.css";
import { Analytics } from "@vercel/analytics/react";
import type { FC, ReactNode } from "react";
Expand Down
14 changes: 14 additions & 0 deletions apps/dave/src/app/specifications/edit/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Metadata } from "next";
import { EditSpecificationContainer } from "../../../../containers/EditSpecificationContainer";

export const metadata: Metadata = {
title: "Edit Specifications",
};

export default async function Page(
props: PageProps<"/specifications/edit/[id]">,
) {
const params = await props.params;

return <EditSpecificationContainer id={params.id} />;
}
10 changes: 10 additions & 0 deletions apps/dave/src/app/specifications/new/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import { NewSpecificationContainer } from "../../../containers/NewSpecificationContainer";

export const metadata: Metadata = {
title: "New Specification",
};

export default function Page() {
return <NewSpecificationContainer />;
}
10 changes: 10 additions & 0 deletions apps/dave/src/app/specifications/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import { SpecificationsContainer } from "../../containers/SpecificationsContainer";

export const metadata: Metadata = {
title: "Specifications",
};

export default function Page() {
return <SpecificationsContainer />;
}
28 changes: 28 additions & 0 deletions apps/dave/src/components/CenteredText.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import {
Card,
Center,
Text,
type CardProps,
type TextProps,
} from "@mantine/core";
import type { FC } from "react";

interface CenteredTextProps {
text: string;
cardProps?: CardProps;
textProps?: TextProps;
}

const CenteredText: FC<CenteredTextProps> = (props) => {
return (
<Card shadow="md" {...props.cardProps}>
<Center>
<Text c="dimmed" size="xl" tt="uppercase" {...props.textProps}>
{props.text}
</Text>
</Center>
</Card>
);
};

export default CenteredText;
Loading
Loading