Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
18e4ad2
chore: add shadcn input-group components (#44282)
djhi Mar 31, 2026
7259d10
Fixes Typo in Spend Cap Modal (#44319)
TheOtherBrian1 Mar 31, 2026
c9d7d86
Joshen/fe 2899 migrate wrappers integration to new UI (#44349)
joshenlim Mar 31, 2026
8e10546
chore: Clean up the flag for enabling Github integration on free plan…
ivasilov Mar 31, 2026
6b57d5f
fix(studio): fix infinite pagination loop in queue messages (#44292)
oniani1 Mar 31, 2026
d5454ee
Fix create s3 access keys (#44388)
joshenlim Mar 31, 2026
8364ffb
chore(studio): remove privacy policy update notification banner (#44380)
pamelachia Mar 31, 2026
2461767
fix inputs width and spacing (#44387)
djhi Mar 31, 2026
d80d064
fix: Dont fetch databases and migrations for coming up projects (#44383)
kamilogorek Mar 31, 2026
fe858e0
chore: migrate vault new secret form to react-hook-form (#44389)
djhi Mar 31, 2026
62dbdee
fix: invalid react-hook-form usage (#44391)
djhi Mar 31, 2026
fabf65f
allow empty string in saml metadata url (#44392)
Ellba Mar 31, 2026
55e0b34
fix(studio): add option to treat empty CSV cells as NULL on import (#…
usamanadeemdeveloper Mar 31, 2026
fc65261
feat: pg_partman support for Queues through dashboard (#44359)
awaseem Mar 31, 2026
c689e91
fix(observability): guard pg_stat_statements queries against missing …
jordienr Mar 31, 2026
23f90cc
fix: remove plan checks from SSO Config Query (#44394)
ignaciodob Mar 31, 2026
1f4cdc4
fix(oauth-custom-providers): use host endpoint for listing providers …
cemalkilic Mar 31, 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
22 changes: 22 additions & 0 deletions apps/design-system/__registry__/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,28 @@ export const Index: Record<string, any> = {
subcategory: "undefined",
chunks: []
},
"data-input-with-reveal-copy-editable": {
name: "data-input-with-reveal-copy-editable",
type: "components:example",
registryDependencies: ["data-input"],
component: React.lazy(() => import("@/registry/default/example/data-input-with-reveal-copy-editable")),
source: "",
files: ["registry/default/example/data-input-with-reveal-copy-editable.tsx"],
category: "undefined",
subcategory: "undefined",
chunks: []
},
"data-input-with-reveal-copy-editable-empty": {
name: "data-input-with-reveal-copy-editable-empty",
type: "components:example",
registryDependencies: ["data-input"],
component: React.lazy(() => import("@/registry/default/example/data-input-with-reveal-copy-editable-empty")),
source: "",
files: ["registry/default/example/data-input-with-reveal-copy-editable-empty.tsx"],
category: "undefined",
subcategory: "undefined",
chunks: []
},
"date-picker-demo": {
name: "date-picker-demo",
type: "components:example",
Expand Down
4 changes: 4 additions & 0 deletions apps/design-system/content/docs/fragments/data-input.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@ Inputs with sensitive values can be both revealed _and_ copied, but only in succ

<ComponentPreview name="data-input-with-reveal-copy" peekCode wide />

Inputs can be edited without revealing their value.

<ComponentPreview name="data-input-with-reveal-copy-editable" peekCode wide />

You can also partially truncate the value by overriding the placeholder value.

Consider if the value needs to be revealed in the first place, as only copying is sufficient in most cases.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Input } from 'ui-patterns/DataInputs/Input'

export default function DataInputWithRevealCopy() {
return <Input containerClassName="w-full max-w-sm" reveal copy />
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Input } from 'ui-patterns/DataInputs/Input'

export default function DataInputWithRevealCopy() {
return <Input containerClassName="w-full max-w-sm" reveal copy defaultValue="1234567890" />
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,14 @@ import {
FormControl_Shadcn_,
FormField_Shadcn_,
Input_Shadcn_,
InputGroup,
InputGroupAddon,
InputGroupInput,
InputGroupText,
InputGroupTextarea,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
PrePostTab,
RadioGroupStacked,
RadioGroupStackedItem,
Select_Shadcn_,
Expand Down Expand Up @@ -219,9 +223,12 @@ export default function FormPatternsPageLayout() {
description="Input with additional unit label"
>
<FormControl_Shadcn_>
<PrePostTab postTab="MB" className="w-full">
<Input_Shadcn_ {...field} type="number" min={5} max={30} />
</PrePostTab>
<InputGroup>
<InputGroupInput {...field} type="number" min={5} max={30} />
<InputGroupAddon align="inline-end">
<InputGroupText className="font-mono">MB</InputGroupText>
</InputGroupAddon>
</InputGroup>
</FormControl_Shadcn_>
</FormItemLayout>
)}
Expand Down Expand Up @@ -252,6 +259,35 @@ export default function FormPatternsPageLayout() {
/>
</CardContent>

{/* Textarea with addon */}
<CardContent>
<FormField_Shadcn_
control={form.control}
name="description"
render={({ field }) => (
<FormItemLayout
layout="flex-row-reverse"
label="Textarea"
description="Multi-line text input for longer content with addon"
>
<FormControl_Shadcn_>
<InputGroup>
<InputGroupTextarea
{...field}
rows={4}
placeholder="Enter multi-line text"
className="resize-none"
/>
<InputGroupAddon align="block-end">
<InputGroupText>120 characters left</InputGroupText>
</InputGroupAddon>
</InputGroup>
</FormControl_Shadcn_>
</FormItemLayout>
)}
/>
</CardContent>

{/* Icon Upload */}
<CardContent>
<FormField_Shadcn_
Expand Down Expand Up @@ -622,7 +658,7 @@ export default function FormPatternsPageLayout() {
<PopoverTrigger_Shadcn_ asChild>
<Button
type="outline"
className="w-full justify-start text-left font-normal px-3 py-4"
className="bg-control w-full justify-start text-left font-normal px-3 py-4"
icon={<CalendarIcon className="h-4 w-4" />}
>
{field.value ? format(field.value, 'PPP') : 'Pick a date'}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@ import {
FormControl_Shadcn_,
FormField_Shadcn_,
Input_Shadcn_,
InputGroup,
InputGroupAddon,
InputGroupInput,
InputGroupText,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
PrePostTab,
RadioGroupStacked,
RadioGroupStackedItem,
Select_Shadcn_,
Expand Down Expand Up @@ -233,9 +236,12 @@ export default function FormPatternsSidePanel() {
description="Input with additional unit label"
>
<FormControl_Shadcn_ className="col-span-6">
<PrePostTab postTab="MB" className="w-full">
<Input_Shadcn_ {...field} type="number" min={5} max={30} />
</PrePostTab>
<InputGroup>
<InputGroupInput {...field} type="number" min={5} max={30} />
<InputGroupAddon align="inline-end">
<InputGroupText>MB</InputGroupText>
</InputGroupAddon>
</InputGroup>
</FormControl_Shadcn_>
</FormItemLayout>
)}
Expand Down Expand Up @@ -653,7 +659,7 @@ export default function FormPatternsSidePanel() {
<PopoverTrigger_Shadcn_ asChild>
<Button
type="outline"
className="w-full justify-start text-left font-normal px-3 py-4"
className="bg-control w-full justify-start text-left font-normal px-3 py-4"
icon={<CalendarIcon className="h-4 w-4" />}
>
{field.value ? format(field.value, 'PPP') : 'Pick a date'}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ import {
Form_Shadcn_,
FormControl_Shadcn_,
FormField_Shadcn_,
Input_Shadcn_,
PrePostTab,
InputGroup,
InputGroupAddon,
InputGroupInput,
InputGroupText,
Switch,
} from 'ui'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
Expand Down Expand Up @@ -125,9 +127,12 @@ export default function PageLayoutSettings() {
description="Time interval where the same refresh token can be used multiple times to request for an access token. Recommendation: 10 seconds."
>
<FormControl_Shadcn_>
<PrePostTab postTab="seconds">
<Input_Shadcn_ type="number" min={0} {...field} />
</PrePostTab>
<InputGroup>
<InputGroupAddon align="inline-end">
<InputGroupText>seconds</InputGroupText>
</InputGroupAddon>
<InputGroupInput type="number" min={0} {...field} />
</InputGroup>
</FormControl_Shadcn_>
</FormItemLayout>
)}
Expand Down Expand Up @@ -196,9 +201,14 @@ export default function PageLayoutSettings() {
>
<div className="flex items-center">
<FormControl_Shadcn_>
<PrePostTab postTab={<HoursOrNeverText value={field.value || 0} />}>
<Input_Shadcn_ type="number" min={0} {...field} />
</PrePostTab>
<InputGroup>
<InputGroupAddon align="inline-end">
<InputGroupText>
<HoursOrNeverText value={field.value || 0} />
</InputGroupText>
</InputGroupAddon>
<InputGroupInput type="number" min={0} {...field} />
</InputGroup>
</FormControl_Shadcn_>
</div>
</FormItemLayout>
Expand All @@ -218,9 +228,14 @@ export default function PageLayoutSettings() {
>
<div className="flex items-center">
<FormControl_Shadcn_>
<PrePostTab postTab={<HoursOrNeverText value={field.value || 0} />}>
<Input_Shadcn_ type="number" {...field} />
</PrePostTab>
<InputGroup>
<InputGroupAddon align="inline-end">
<InputGroupText>
<HoursOrNeverText value={field.value || 0} />
</InputGroupText>
</InputGroupAddon>
<InputGroupInput type="number" {...field} />
</InputGroup>
</FormControl_Shadcn_>
</div>
</FormItemLayout>
Expand Down
12 changes: 12 additions & 0 deletions apps/design-system/registry/examples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,18 @@ export const examples: Registry = [
registryDependencies: ['data-input'],
files: ['example/data-input-with-reveal-copy.tsx'],
},
{
name: 'data-input-with-reveal-copy-editable',
type: 'components:example',
registryDependencies: ['data-input'],
files: ['example/data-input-with-reveal-copy-editable.tsx'],
},
{
name: 'data-input-with-reveal-copy-editable-empty',
type: 'components:example',
registryDependencies: ['data-input'],
files: ['example/data-input-with-reveal-copy-editable-empty.tsx'],
},
{
name: 'date-picker-demo',
type: 'components:example',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import { zodResolver } from '@hookform/resolvers/zod'
import { useConsentState } from 'common'
import { LOCAL_STORAGE_KEYS } from 'common/constants/local-storage'
import { ButtonTooltip } from 'components/ui/ButtonTooltip'
import { InlineLink } from 'components/ui/InlineLink'
import { useSendResetMutation } from 'data/telemetry/send-reset-mutation'
import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage'
import { X } from 'lucide-react'
import { useForm } from 'react-hook-form'
import { toast } from 'sonner'
import { Card, CardContent, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Switch } from 'ui'
import { Admonition } from 'ui-patterns/admonition'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import {
PageSection,
Expand All @@ -21,40 +15,6 @@ import {
} from 'ui-patterns/PageSection'
import * as z from 'zod'

export const PrivacyUpdateBanner = () => {
const [privacyUpdateAcknowledged, setPrivacyUpdateAcknowledged] = useLocalStorageQuery(
LOCAL_STORAGE_KEYS.PRIVACY_NOTICE_ACKNOWLEDGED,
false
)

if (privacyUpdateAcknowledged) return null

return (
<Admonition
type="note"
title="Updates to our privacy policy"
description={
<>
We’ve clarified how we use analytics, cookies, and advertising tools in our{' '}
<InlineLink href="https://supabase.com/privacy">privacy policy</InlineLink>, effective
March 16, 2026. By continuing to use Supabase, you agree to the updated terms.{' '}
<InlineLink href="mailto:privacy@supabase.com">Contact us</InlineLink> with any
questions.{' '}
</>
}
className="mb-10 relative"
>
<ButtonTooltip
type="text"
icon={<X />}
className="absolute top-2 right-2 px-1"
onClick={() => setPrivacyUpdateAcknowledged(true)}
tooltip={{ content: { side: 'bottom', text: 'Dismiss' } }}
/>
</Admonition>
)
}

const AnalyticsSchema = z.object({
telemetryEnabled: z.boolean(),
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import {
FormControl_Shadcn_,
FormField_Shadcn_,
Input_Shadcn_,
InputGroup,
InputGroupAddon,
InputGroupInput,
Popover_Shadcn_,
PopoverContent_Shadcn_,
PopoverTrigger_Shadcn_,
PrePostTab,
Select_Shadcn_,
SelectContent_Shadcn_,
SelectItem_Shadcn_,
Expand Down Expand Up @@ -157,37 +159,8 @@ const FormField = ({
}
>
<FormControl_Shadcn_ className="col-span-6">
{properties.units ? (
<PrePostTab
postTab={
<ReactMarkdown unwrapDisallowed disallowedElements={['p']}>
{properties.units}
</ReactMarkdown>
}
className="w-full"
>
{properties.isSecret ? (
<DataInput
{...field}
type={properties.isSecret ? 'password' : 'text'}
id={name}
size="small"
copy
reveal
/>
) : (
<Input_Shadcn_ {...field} id={name} />
)}
</PrePostTab>
) : properties.isSecret ? (
<DataInput
{...field}
type={properties.isSecret ? 'password' : 'text'}
id={name}
size="small"
copy
reveal
/>
{properties.isSecret ? (
<DataInput {...field} id={name} size="small" copy reveal />
) : (
<Input_Shadcn_ {...field} id={name} />
)}
Expand Down Expand Up @@ -255,21 +228,19 @@ const FormField = ({
>
<FormControl_Shadcn_ className="col-span-6">
{properties.units ? (
<PrePostTab
postTab={
<InputGroup>
<InputGroupAddon align="inline-end">
<ReactMarkdown unwrapDisallowed disallowedElements={['p']}>
{properties.units}
</ReactMarkdown>
}
className="w-full"
>
<Input_Shadcn_
</InputGroupAddon>
<InputGroupInput
{...field}
id={name}
type="number"
onChange={(e) => field.onChange(Number(e.target.value))}
/>
</PrePostTab>
</InputGroup>
) : (
<Input_Shadcn_
{...field}
Expand Down
Loading
Loading