{ "$schema": "https://ui.shadcn.com/schema/registry.json", "name": "venlyfinance", "homepage": "https://github.com/Venly/venly-settlement-sdk/tree/main/ui", "items": [ { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "venly-tokens", "type": "registry:item", "title": "Venly design tokens", "description": "The white-label contract: every colour, radius, type size, density and spacing value the kit reads. A reskin edits this file and nothing else.", "files": [ { "path": "registry/styles/tokens.css", "type": "registry:file", "target": "~/components/venly/styles/tokens.css" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "money", "type": "registry:lib", "title": "Money rendering", "description": "Tabular figures, trailing currency code at 0.6x, true minus, debits never red, em-dash empty values.", "registryDependencies": [ "@venlyfinance/venly-tokens" ], "files": [ { "path": "registry/lib/money.tsx", "type": "registry:lib", "target": "~/components/venly/lib/money.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "status-pill", "type": "registry:component", "title": "Status pill", "description": "Word plus glyph on every state so status survives greyscale; tinted background, 4px data-value rectangle.", "registryDependencies": [ "@venlyfinance/venly-tokens" ], "files": [ { "path": "registry/components/status-pill.tsx", "type": "registry:component", "target": "~/components/venly/components/status-pill.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "data-table", "type": "registry:component", "title": "Data table", "description": "The ledger register: token-driven row pitch, hairline-only header, right-aligned tabular money, em-dash empties, no zebra, no shadow.", "registryDependencies": [ "@venlyfinance/venly-tokens" ], "files": [ { "path": "registry/components/data-table.tsx", "type": "registry:component", "target": "~/components/venly/components/data-table.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "timeline", "type": "registry:component", "title": "Vertical timeline", "description": "Three-axis state story: solid past, dotted future, donut current; terminal failure is never a green check.", "registryDependencies": [ "@venlyfinance/venly-tokens" ], "files": [ { "path": "registry/components/timeline.tsx", "type": "registry:component", "target": "~/components/venly/components/timeline.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "balance-card", "type": "registry:component", "title": "Balance card", "description": "The available/reserved composition: available is the only figure above the rule; reserved demoted by position and scale, padlocked when unspendable.", "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money" ], "files": [ { "path": "registry/components/balance-card.tsx", "type": "registry:component", "target": "~/components/venly/components/balance-card.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "side-panel", "type": "registry:component", "title": "Side panel", "description": "Record detail beside the table, never a navigation: scrimless, the amount is the hero, arrow-key row stepping.", "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money" ], "files": [ { "path": "registry/components/side-panel.tsx", "type": "registry:component", "target": "~/components/venly/components/side-panel.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "field-list", "type": "registry:component", "title": "Field list with copy", "description": "The receive surface: bare values, per-field copy naming the field, amber Required pill, '(not required)' variants instead of vanishing rows.", "registryDependencies": [ "@venlyfinance/venly-tokens" ], "files": [ { "path": "registry/components/field-list.tsx", "type": "registry:component", "target": "~/components/venly/components/field-list.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "arithmetic-ladder", "type": "registry:component", "title": "Arithmetic ladder", "description": "Transfer review: literal operators in the gutter, working before the answer, tint-band total, uncertainty attached to the number.", "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money" ], "files": [ { "path": "registry/components/arithmetic-ladder.tsx", "type": "registry:component", "target": "~/components/venly/components/arithmetic-ladder.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "auth", "type": "registry:block", "title": "Auth block", "description": "Sign-in, two-factor challenge and sign-up over a bring-your-own-auth adapter: the Venly APIs authenticate machines, not people, so these forms render YOUR identity layer. Ships a zero-credential mock adapter with a deterministic 2FA path.", "dependencies": [ "@radix-ui/react-one-time-password-field@^0.1.16" ], "registryDependencies": [ "@venlyfinance/venly-tokens" ], "files": [ { "path": "registry/blocks/auth.tsx", "type": "registry:component", "target": "~/components/venly/blocks/auth.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "team", "type": "registry:block", "title": "Team block", "description": "Member list, invites and role control over the same bring-your-own-auth boundary: status as word plus glyph, row-level role controls, self-actions disabled with the reason, and a mock invite that mints a link instead of claiming an email went out.", "dependencies": [ "@radix-ui/react-dialog@^1.1.23" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/data-table", "@venlyfinance/status-pill", "@venlyfinance/auth" ], "files": [ { "path": "registry/blocks/team.tsx", "type": "registry:component", "target": "~/components/venly/blocks/team.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "onboarding", "type": "registry:block", "title": "Onboarding block", "description": "Company details in, an application status out: creates the organisation and its account through the real operations, renders the verification status verbatim with a humane waiting state, decline-with-review, and a restricted-mode banner.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/status-pill", "@venlyfinance/timeline", "@venlyfinance/field-list" ], "files": [ { "path": "registry/blocks/onboarding.tsx", "type": "registry:component", "target": "~/components/venly/blocks/onboarding.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "bank-accounts", "type": "registry:block", "title": "Bank accounts block", "description": "The whitelisting surface withdrawals depend on: your company's own accounts (never third-party payees), seven account-type variants asking exactly the fields each requires, identifier re-entry against transcription slips, and verification status rendered verbatim.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/data-table", "@venlyfinance/status-pill" ], "files": [ { "path": "registry/blocks/bank-accounts.tsx", "type": "registry:component", "target": "~/components/venly/blocks/bank-accounts.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "withdraw", "type": "registry:block", "title": "Withdraw block", "description": "Fiat out to your own verified bank account, rendered truthfully: destination picker that disables unverified accounts with the reason, a fee quote in the unit you typed, four-eyes approval that renders the rule instead of the error, deposit instructions with the mandatory reference, and an event timeline with actors and absolute timestamps.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money", "@venlyfinance/data-table", "@venlyfinance/status-pill", "@venlyfinance/timeline", "@venlyfinance/field-list", "@venlyfinance/arithmetic-ladder", "@venlyfinance/bank-accounts" ], "files": [ { "path": "registry/blocks/withdraw.tsx", "type": "registry:component", "target": "~/components/venly/blocks/withdraw.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "receive", "type": "registry:block", "title": "Receive block", "description": "Bank details a payer's finance team actually reads: mandatory payment-reference enforcement, warning above the fields, copy that names the field.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money", "@venlyfinance/field-list" ], "files": [ { "path": "registry/blocks/receive.tsx", "type": "registry:component", "target": "~/components/venly/blocks/receive.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "send", "type": "registry:block", "title": "Send block", "description": "Stage-then-confirm rendered: form, arithmetic-ladder review, a commit button that restates the amount, single execution on a pinned idempotency key, status timeline.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money", "@venlyfinance/arithmetic-ladder", "@venlyfinance/timeline" ], "files": [ { "path": "registry/blocks/send.tsx", "type": "registry:component", "target": "~/components/venly/blocks/send.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "activity", "type": "registry:block", "title": "Activity block", "description": "One feed over both money rails: the account's transfers interleaved with the company's withdrawals and add-money requests, a labelled Scope column, three bands (In progress / Completed / Didn't complete), live-synced detail panels, unified CSV export, and arrow-key row stepping. Mount UnifiedActivityBlock for the full feed, or ActivityBlock for a transfers-only ledger.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money", "@venlyfinance/data-table", "@venlyfinance/status-pill", "@venlyfinance/side-panel", "@venlyfinance/timeline", "@venlyfinance/field-list", "@venlyfinance/withdraw" ], "files": [ { "path": "registry/blocks/activity.tsx", "type": "registry:component", "target": "~/components/venly/blocks/activity.tsx" } ] }, { "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "balances", "type": "registry:block", "title": "Balances block", "description": "The home surface on the real wallet balance source: available/reserved hero per asset, segmented bar behind the two-bucket threshold, per-asset table, and masking that covers every figure including the chrome miniature.", "dependencies": [ "@venlyfinance/react@^0.2.0", "@venlyfinance/sdk@^0.3.0", "@tanstack/react-query@^5.0.0" ], "registryDependencies": [ "@venlyfinance/venly-tokens", "@venlyfinance/money", "@venlyfinance/balance-card", "@venlyfinance/data-table" ], "files": [ { "path": "registry/blocks/balances.tsx", "type": "registry:component", "target": "~/components/venly/blocks/balances.tsx" } ] } ] }