@buildbase/sdk 0.0.54 → 0.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +8 -4
- package/CHANGELOG.md +55 -0
- package/LICENSE +21 -0
- package/README.md +294 -47
- package/dist/css/styles.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +367 -88
- package/dist/index.mjs +1 -1
- package/dist/mcp/index.cjs +1 -1
- package/dist/mcp/index.d.ts +332 -16
- package/dist/mcp/index.mjs +1 -1
- package/dist/react/chunks/SettingsDialog-CvoDs5eM.cjs +2 -0
- package/dist/react/chunks/SettingsDialog-VaOW2jtS.mjs +2 -0
- package/dist/react/chunks/SubscriptionDialog-8CagFA_V.cjs +2 -0
- package/dist/react/chunks/SubscriptionDialog-C5EgpXE0.mjs +2 -0
- package/dist/react/chunks/ar-CGbuXEeR.cjs +2 -0
- package/dist/react/chunks/ar-DnShbYvQ.mjs +2 -0
- package/dist/react/chunks/de-C3iuiLAz.mjs +2 -0
- package/dist/react/chunks/de-a1mX2rR4.cjs +2 -0
- package/dist/react/chunks/es-D4T7YE7x.cjs +2 -0
- package/dist/react/chunks/es-u9vKMeaX.mjs +2 -0
- package/dist/react/chunks/fr-Bnnz2yJZ.cjs +2 -0
- package/dist/react/chunks/fr-DjgpP202.mjs +2 -0
- package/dist/react/chunks/hi-B8Mjr8rU.cjs +2 -0
- package/dist/react/chunks/hi-Cu_9iCjb.mjs +2 -0
- package/dist/react/chunks/ja-B0eCVKdZ.cjs +2 -0
- package/dist/react/chunks/ja-DfJ5WUrG.mjs +2 -0
- package/dist/react/chunks/react-BBY-Vuzr.cjs +2 -0
- package/dist/react/chunks/react-CvU8uS25.mjs +2 -0
- package/dist/react/chunks/zh-BnPZ0j4w.cjs +2 -0
- package/dist/react/chunks/zh-JjoMmHmK.mjs +2 -0
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.ts +728 -142
- package/dist/react/index.mjs +1 -1
- package/docs/ARCHITECTURE.md +419 -0
- package/docs/ERROR_CODES.md +96 -0
- package/docs/MCP-AND-AGENT-READINESS.md +893 -0
- package/docs/THEMING.md +67 -0
- package/docs/UI-CONFIG.md +207 -0
- package/package.json +14 -3
- package/dist/react/chunks/SettingsDialog-B28WJsAr.cjs +0 -2
- package/dist/react/chunks/SettingsDialog-blhppbNm.mjs +0 -2
- package/dist/react/chunks/SubscriptionDialog-BTWVX3cH.mjs +0 -2
- package/dist/react/chunks/SubscriptionDialog-QKmwvJU1.cjs +0 -2
- package/dist/react/chunks/ar-1Z1MOGAP.mjs +0 -2
- package/dist/react/chunks/ar-VGzBv3AZ.cjs +0 -2
- package/dist/react/chunks/de-BjdDg60Y.cjs +0 -2
- package/dist/react/chunks/de-CXUItplO.mjs +0 -2
- package/dist/react/chunks/es-BBPsSZUp.cjs +0 -2
- package/dist/react/chunks/es-BTbzVutz.mjs +0 -2
- package/dist/react/chunks/fr-Cax48X_S.cjs +0 -2
- package/dist/react/chunks/fr-DPMeOQu3.mjs +0 -2
- package/dist/react/chunks/hi-BJqvpG6d.cjs +0 -2
- package/dist/react/chunks/hi-JfJx-LV7.mjs +0 -2
- package/dist/react/chunks/ja-CDGtLzTk.mjs +0 -2
- package/dist/react/chunks/ja-DvVyj5xX.cjs +0 -2
- package/dist/react/chunks/react-6QJCOE-D.cjs +0 -2
- package/dist/react/chunks/react-CC6T7Zky.mjs +0 -2
- package/dist/react/chunks/zh-BAcqxkxk.cjs +0 -2
- package/dist/react/chunks/zh-BNZ2Ooe8.mjs +0 -2
package/docs/THEMING.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Theming the SDK UI
|
|
2
|
+
|
|
3
|
+
All SDK components — settings screens, dialogs, banners, empty states, sidebar — are styled exclusively through CSS custom properties. To match your brand, override the variables; no component forks or `!important` hacks needed.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
The SDK stylesheet (`@buildbase/sdk/css/styles.css`) defines a default light theme on `:root` and a dark theme on `.dark`. Every color in the UI resolves from these variables, so overriding them re-skins everything at once.
|
|
8
|
+
|
|
9
|
+
Values are **HSL triplets without the `hsl()` wrapper** (shadcn/ui convention), which lets the SDK derive tints — e.g. success banners use `hsl(var(--success) / 0.1)` for their background automatically.
|
|
10
|
+
|
|
11
|
+
## Override example
|
|
12
|
+
|
|
13
|
+
Load your overrides after the SDK stylesheet:
|
|
14
|
+
|
|
15
|
+
```css
|
|
16
|
+
:root {
|
|
17
|
+
/* Brand */
|
|
18
|
+
--primary: 262 83% 58%; /* your brand color — buttons, active nav, focus */
|
|
19
|
+
--primary-foreground: 0 0% 100%;
|
|
20
|
+
--radius: 0.75rem; /* corner rounding across all components */
|
|
21
|
+
|
|
22
|
+
/* Surfaces & text */
|
|
23
|
+
--background: 0 0% 100%;
|
|
24
|
+
--foreground: 240 10% 4%;
|
|
25
|
+
--muted: 240 5% 96%; /* subtle fills: loading bars, table headers */
|
|
26
|
+
--muted-foreground: 240 4% 46%; /* secondary text, hints, labels */
|
|
27
|
+
--border: 240 6% 90%;
|
|
28
|
+
|
|
29
|
+
/* Status colors — banners, badges, progress bars */
|
|
30
|
+
--destructive: 0 84% 60%; /* errors, danger zone, overage */
|
|
31
|
+
--success: 142 72% 29%; /* success banners, paid badges, checkmarks */
|
|
32
|
+
--warning: 26 90% 37%; /* warnings, expiring credits, near-limit */
|
|
33
|
+
--info: 224 76% 48%; /* info notices, selected plans, usage bars */
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Full variable reference
|
|
38
|
+
|
|
39
|
+
| Variable | Used for |
|
|
40
|
+
| -------------------------------------------- | ----------------------------------------------- |
|
|
41
|
+
| `--background` / `--foreground` | Page surface and main text |
|
|
42
|
+
| `--card` / `--card-foreground` | Card surfaces |
|
|
43
|
+
| `--popover` / `--popover-foreground` | Dropdowns, popovers |
|
|
44
|
+
| `--primary` / `--primary-foreground` | Buttons, active sidebar item, selected states |
|
|
45
|
+
| `--secondary` / `--secondary-foreground` | Secondary buttons |
|
|
46
|
+
| `--muted` / `--muted-foreground` | Subtle fills, secondary text, disabled states |
|
|
47
|
+
| `--accent` / `--accent-foreground` | Hover highlights |
|
|
48
|
+
| `--destructive` / `--destructive-foreground` | Errors, delete actions, overage indicators |
|
|
49
|
+
| `--success` / `--success-foreground` | Success banners, active/paid badges |
|
|
50
|
+
| `--warning` / `--warning-foreground` | Warnings, permission notices, near-limit states |
|
|
51
|
+
| `--info` / `--info-foreground` | Info notices, plan highlights, usage bars |
|
|
52
|
+
| `--border` / `--input` / `--ring` | Borders, input outlines, focus rings |
|
|
53
|
+
| `--radius` | Border radius scale (lg/md/sm derive from it) |
|
|
54
|
+
|
|
55
|
+
## Dark mode
|
|
56
|
+
|
|
57
|
+
Add the `.dark` class to a root element and override the same variables under `.dark { … }`. The SDK ships dark defaults for every variable.
|
|
58
|
+
|
|
59
|
+
## Components that work without the stylesheet
|
|
60
|
+
|
|
61
|
+
`FullScreenLoader` and the `ErrorBoundary` fallback use inline styles so they render correctly before/without CSS loading. They still read the variables (with hard-coded fallbacks), so brand overrides apply to them too once your CSS is present.
|
|
62
|
+
|
|
63
|
+
## Rules for SDK contributors
|
|
64
|
+
|
|
65
|
+
- Never use Tailwind palette classes (`gray-*`, `blue-*`, `red-*`, `green-*`, `amber-*`, `slate-*`, `bg-white`, `text-white`) in components — they bypass theming. Use the semantic tokens above.
|
|
66
|
+
- Soft status fills are alpha tints of the token: `bg-success/10` (background), `border-success/20` (border), `text-success` (text).
|
|
67
|
+
- CI-check locally: `grep -rE '(bg|text|border|divide)-[a-z]+-[0-9]{2,3}|bg-white|text-white|#[0-9a-fA-F]{3,6}' src/components src/providers --include='*.tsx'` should return nothing (the pattern catches every Tailwind palette shade and raw hex).
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# UI Configuration (`ui` prop)
|
|
2
|
+
|
|
3
|
+
Control which parts of the SDK UI are shown and override individual UI strings — without forking components or abusing the permission system.
|
|
4
|
+
|
|
5
|
+
Everything is driven by a single optional `ui` prop on `SaaSOSProvider`:
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
<SaaSOSProvider serverUrl="..." version="v1" orgId="..." ui={{ ... }}>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Principles
|
|
12
|
+
|
|
13
|
+
1. **Everything defaults to visible.** The `ui` prop is never required; an empty or missing config means current behavior. Only an explicit `false` hides something.
|
|
14
|
+
2. **Config can only hide, never force-show.** A visible flag never bypasses platform permissions — a user without `WORKSPACE_BILLING_VIEW` won't see the Subscription section no matter what the config says. Permissions remain the security floor.
|
|
15
|
+
3. **One decision, one call.** Internally every gated surface resolves through `useUIVisibility()`, which combines the config flag and the permission check in a single call. Your own components can use the same hook.
|
|
16
|
+
|
|
17
|
+
## How visibility is decided
|
|
18
|
+
|
|
19
|
+
A piece of SDK UI is shown when **all** of these pass:
|
|
20
|
+
|
|
21
|
+
| Layer | Source | Example |
|
|
22
|
+
| ------------------- | ------------------------------------- | -------------------------------------------- |
|
|
23
|
+
| Implementor config | `ui` prop (this doc) | `settings.sections.credits !== false` |
|
|
24
|
+
| Platform permission | user's role, resolved per workspace | `can(Permission.WORKSPACE_BILLING_VIEW)` |
|
|
25
|
+
| Workspace mode | server settings (`personal/platform`) | personal mode hides Users/Permissions/Danger |
|
|
26
|
+
| Server settings | org settings from the backend | `settings.workspace.showSwitcher` |
|
|
27
|
+
|
|
28
|
+
## Settings dialog sections
|
|
29
|
+
|
|
30
|
+
`ui.settings.sections` hides whole sections of the workspace settings dialog. Keys match the `SettingsScreen` values:
|
|
31
|
+
|
|
32
|
+
`profile` · `security` · `connected-agents` · `general` · `users` · `subscription` · `usage` · `credits` · `features` · `notifications` · `permissions` · `danger`
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
ui={{
|
|
36
|
+
settings: {
|
|
37
|
+
sections: { credits: false, notifications: false, 'connected-agents': false },
|
|
38
|
+
},
|
|
39
|
+
}}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Hiding a section removes it from the sidebar (a fully-empty group collapses, including its header), and makes the screen unreachable via deep links, `defaultSection`, or the settings-manager — the dialog falls back to the first enabled section. If every section is hidden, the dialog renders nothing.
|
|
43
|
+
|
|
44
|
+
## Per-screen toggles
|
|
45
|
+
|
|
46
|
+
Fine-grained switches inside each settings screen. All default to `true`.
|
|
47
|
+
|
|
48
|
+
| Config key | Hides |
|
|
49
|
+
| ------------------------------------- | ------------------------------------------------------------------------ |
|
|
50
|
+
| `settings.profile.language` | Language dropdown |
|
|
51
|
+
| `settings.profile.country` | Country dropdown |
|
|
52
|
+
| `settings.profile.currency` | Currency dropdown |
|
|
53
|
+
| `settings.profile.timezone` | Timezone dropdown |
|
|
54
|
+
| `settings.security.passkeyRename` | Rename action on passkey rows |
|
|
55
|
+
| `settings.security.passkeyDelete` | Delete action on passkey rows |
|
|
56
|
+
| `settings.general.nameEdit` | Workspace name field |
|
|
57
|
+
| `settings.general.iconEditor` | Emoji/image icon editor |
|
|
58
|
+
| `settings.users.invite` | Invite-member form |
|
|
59
|
+
| `settings.users.roleChange` | Per-member role selector |
|
|
60
|
+
| `settings.users.remove` | Remove-member button |
|
|
61
|
+
| `settings.users.seatPricing` | Seat usage card + extra-seat cost warnings |
|
|
62
|
+
| `settings.subscription.changePlan` | Every plan-picker entry point (change plan, view plans, upgrade banners) |
|
|
63
|
+
| `settings.subscription.cancel` | Cancel-subscription button (Resume stays available) |
|
|
64
|
+
| `settings.subscription.managePayment` | Stripe billing-portal button |
|
|
65
|
+
| `settings.subscription.invoicesTab` | Invoices tab (tab bar collapses; past-due "view invoices" links too) |
|
|
66
|
+
| `settings.subscription.planDetails` | Features/limits/quotas breakdown on the plan card |
|
|
67
|
+
| `settings.credits.buyButton` | Buy-credits button + packages dialog |
|
|
68
|
+
| `settings.credits.transactions` | Recent-transactions list |
|
|
69
|
+
| `settings.notifications.push` | Browser push-notification block |
|
|
70
|
+
| `settings.notifications.emailToggles` | Per-event email preference column |
|
|
71
|
+
| `settings.notifications.pushToggles` | Per-event push preference column |
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
ui={{
|
|
75
|
+
settings: {
|
|
76
|
+
subscription: { cancel: false, invoicesTab: false },
|
|
77
|
+
users: { invite: false, seatPricing: false },
|
|
78
|
+
},
|
|
79
|
+
}}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Workspace switcher
|
|
83
|
+
|
|
84
|
+
Client-side switcher control, ANDed with the server settings (`showSwitcher`, `canCreateWorkspace`):
|
|
85
|
+
|
|
86
|
+
| Config key | Hides |
|
|
87
|
+
| -------------------------------- | -------------------------------------------- |
|
|
88
|
+
| `workspaceSwitcher.show` | The switcher dialog (trigger opens settings) |
|
|
89
|
+
| `workspaceSwitcher.createButton` | "Create workspace" button |
|
|
90
|
+
| `workspaceSwitcher.planBadge` | Subscription-plan badge on workspace rows |
|
|
91
|
+
| `workspaceSwitcher.memberCount` | Member count on workspace rows |
|
|
92
|
+
|
|
93
|
+
## Behavior
|
|
94
|
+
|
|
95
|
+
| Config key | Effect |
|
|
96
|
+
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
97
|
+
| `behavior.autoOpenPlanDialog` | `false` disables the automatic plan-picker popup when a workspace has no subscription. Explicit `selectPlan` deep links (e.g. from `PricingPage`) still open it. |
|
|
98
|
+
| `behavior.trialEndingDays` | Global default threshold for `<WhenTrialEnding>` (default 3). A `daysThreshold` prop still wins per usage. |
|
|
99
|
+
|
|
100
|
+
## String overrides (`messages`)
|
|
101
|
+
|
|
102
|
+
Override any SDK UI string per key — deep-merged over the active locale bundle. Ideal for rebranding terms without forking the 8 locale files:
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
ui={{
|
|
106
|
+
messages: {
|
|
107
|
+
settings: { sidebar: { credits: 'Tokens', subscription: 'Billing' } },
|
|
108
|
+
credits: { buyCredits: 'Buy Tokens' },
|
|
109
|
+
},
|
|
110
|
+
}}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- Keys/shape mirror `SDKMessages` (see `src/i18n/types.ts`); the type is `PartialSDKMessages`.
|
|
114
|
+
- Overrides apply on top of whichever locale is active.
|
|
115
|
+
- Missing keys in a locale (or in your overrides) fall back to English before falling back to the raw key.
|
|
116
|
+
|
|
117
|
+
## Error boundary
|
|
118
|
+
|
|
119
|
+
The top-level error boundary renders even when the i18n layer has crashed, so its strings are plain values, not translation keys:
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
ui={{ errorBoundary: { title: 'Oops, something broke', retryLabel: 'Retry' } }}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Date formats
|
|
126
|
+
|
|
127
|
+
`ui.formats.date` takes `Intl.DateTimeFormatOptions` and applies to dates the SDK renders (passkey activity, connected-agent grants). Default: `{ dateStyle: 'medium' }`.
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
ui={{ formats: { date: { dateStyle: 'short' } } }}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Per-dialog override
|
|
134
|
+
|
|
135
|
+
`WorkspaceSettingsDialog` accepts its own `ui` prop, deep-merged over the provider-global config — so one app can render differently-configured dialogs:
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
// Global config hides credits everywhere…
|
|
139
|
+
<SaaSOSProvider ui={{ settings: { sections: { credits: false } } }}>
|
|
140
|
+
|
|
141
|
+
// …but this admin-only dialog shows everything except Danger
|
|
142
|
+
<WorkspaceSettingsDialog
|
|
143
|
+
workspace={ws}
|
|
144
|
+
ui={{ settings: { sections: { credits: true, danger: false } } }}
|
|
145
|
+
/>
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Using the same gating in your own UI
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
import { useUIVisibility, useUIConfig, Permission } from '@buildbase/sdk/react';
|
|
152
|
+
|
|
153
|
+
function MembersPanel() {
|
|
154
|
+
const { visible } = useUIVisibility();
|
|
155
|
+
|
|
156
|
+
// Config flag AND permission — one line decides show/hide
|
|
157
|
+
if (!visible(ui => ui.settings?.users?.invite, Permission.WORKSPACE_MEMBERS_INVITE)) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
return <InviteForm />;
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
- `visible(select, permission?)` — `true` unless the selected flag is explicitly `false`, and (when given) the permission check passes. Works with app permissions too: `visible(ui => ui.settings?.sections?.usage, 'reports:view')`.
|
|
165
|
+
- `useUIConfig()` — the raw `ui` object when you only need config values (e.g. `formats`, `behavior`).
|
|
166
|
+
- `mergeUIConfig(base, override)` — the deep-merge used for per-dialog overrides, exported for custom composition.
|
|
167
|
+
|
|
168
|
+
## Recipes
|
|
169
|
+
|
|
170
|
+
**Single-tenant app (no workspaces UX):**
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
ui={{
|
|
174
|
+
workspaceSwitcher: { show: false, createButton: false },
|
|
175
|
+
settings: { sections: { users: false, permissions: false, danger: false } },
|
|
176
|
+
}}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Billing handled outside the SDK:**
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
ui={{
|
|
183
|
+
settings: { sections: { subscription: false, credits: false, usage: false } },
|
|
184
|
+
behavior: { autoOpenPlanDialog: false },
|
|
185
|
+
}}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**White-label rename:**
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
ui={{
|
|
192
|
+
messages: { settings: { sidebar: { credits: 'Tokens' }, titles: { credits: 'Tokens' } } },
|
|
193
|
+
errorBoundary: { title: 'Something went wrong at Acme' },
|
|
194
|
+
}}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Read-only member view (UI-level; permissions still enforce server-side):**
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
ui={{
|
|
201
|
+
settings: {
|
|
202
|
+
users: { invite: false, roleChange: false, remove: false },
|
|
203
|
+
general: { nameEdit: false, iconEditor: false },
|
|
204
|
+
security: { passkeyRename: false, passkeyDelete: false },
|
|
205
|
+
},
|
|
206
|
+
}}
|
|
207
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buildbase/sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.56",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "A SDK for Buildbase",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -57,7 +57,12 @@
|
|
|
57
57
|
"dist",
|
|
58
58
|
"README.md",
|
|
59
59
|
"AGENTS.md",
|
|
60
|
-
"CHANGELOG.md"
|
|
60
|
+
"CHANGELOG.md",
|
|
61
|
+
"docs/ARCHITECTURE.md",
|
|
62
|
+
"docs/ERROR_CODES.md",
|
|
63
|
+
"docs/MCP-AND-AGENT-READINESS.md",
|
|
64
|
+
"docs/THEMING.md",
|
|
65
|
+
"docs/UI-CONFIG.md"
|
|
61
66
|
],
|
|
62
67
|
"sideEffects": [
|
|
63
68
|
"**/*.css"
|
|
@@ -78,8 +83,9 @@
|
|
|
78
83
|
"yalc:remove": "yalc remove",
|
|
79
84
|
"format": "prettier --write . --plugin=prettier-plugin-organize-imports",
|
|
80
85
|
"format:check": "prettier --check . --plugin=prettier-plugin-organize-imports",
|
|
81
|
-
"lint": "npm run lint:types && npm run lint:tokens",
|
|
86
|
+
"lint": "npm run lint:types && npm run lint:tokens && npm run lint:i18n",
|
|
82
87
|
"lint:types": "tsc --noEmit",
|
|
88
|
+
"lint:i18n": "node scripts/check-i18n.mjs",
|
|
83
89
|
"lint:tokens": "grep -rEn '(bg|text|border|divide|ring|outline|from|via|to|fill|stroke|shadow|ring-offset)-(gray|slate|red|green|emerald|amber|yellow|blue|purple|pink|indigo|violet|orange|teal|cyan|lime|rose|fuchsia|sky|stone|zinc|neutral)-[0-9]+|bg-white|text-white|#[0-9a-fA-F]{6}' src/components src/providers --include='*.tsx' && echo 'Hard-coded colors found — use theme tokens (see docs/THEMING.md)' && exit 1 || exit 0",
|
|
84
90
|
"push:sdk": "npm run build && yalc push",
|
|
85
91
|
"watch:push": "nodemon",
|
|
@@ -91,6 +97,7 @@
|
|
|
91
97
|
},
|
|
92
98
|
"dependencies": {
|
|
93
99
|
"@hookform/resolvers": "^5.0.1",
|
|
100
|
+
"@radix-ui/react-accordion": "^1.2.16",
|
|
94
101
|
"@radix-ui/react-alert-dialog": "^1.1.13",
|
|
95
102
|
"@radix-ui/react-avatar": "^1.1.9",
|
|
96
103
|
"@radix-ui/react-dialog": "^1.1.13",
|
|
@@ -165,6 +172,10 @@
|
|
|
165
172
|
"express"
|
|
166
173
|
],
|
|
167
174
|
"author": "Buildbase",
|
|
175
|
+
"homepage": "https://buildbase.app",
|
|
176
|
+
"bugs": {
|
|
177
|
+
"email": "support@buildbase.app"
|
|
178
|
+
},
|
|
168
179
|
"license": "MIT",
|
|
169
180
|
"engines": {
|
|
170
181
|
"node": ">=18.0.0"
|