mirror of
https://github.com/supabase/supabase.git
synced 2026-10-05 09:25:06 +03:00
feat: add last9 log drain (#42391)
- adds last9 log drain to the UI (flagged) - updates API Types ## To test - go to last9 - create project - select oltp - grab creds - go to log drains - create last9 log drain - paste creds - after a few minutes last9 should start showing supabase logs like this <img width="2042" height="1632" alt="CleanShot 2026-02-05 at 13 17 19@2x" src="https://github.com/user-attachments/assets/9abc34f7-58ea-431c-9b56-5448fc9e76fd" /> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Last9 observability integration: new log drain destination with region selection, credentials UI, feature-flag gating, and icon * Just-in-time (JIT) access configuration at the project level * Plan features API to retrieve plan-specific feature configurations * **Improvements** * Backend/provider support expanded to include Last9 and OTLP * Telemetry events updated to include Last9 and OTLP destinations * Credit redemption response updated; preview endpoint removed <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
1 parent
1be4ef5d27
commit
e8162fee08
11 files changed
+409
-120
No files matched your search
@@ -10,22 +10,23 @@ import { useForm } from 'react-hook-form'
|
||||
import { toast } from 'sonner'
|
||||
import {
|
||||
Button,
|
||||
cn,
|
||||
Form_Shadcn_,
|
||||
FormControl_Shadcn_,
|
||||
FormField_Shadcn_,
|
||||
FormItem_Shadcn_,
|
||||
FormLabel_Shadcn_,
|
||||
FormMessage_Shadcn_,
|
||||
Form_Shadcn_,
|
||||
Input_Shadcn_,
|
||||
RadioGroupCard,
|
||||
RadioGroupCardItem,
|
||||
Select_Shadcn_,
|
||||
SelectContent_Shadcn_,
|
||||
SelectGroup_Shadcn_,
|
||||
SelectItem_Shadcn_,
|
||||
SelectLabel_Shadcn_,
|
||||
SelectTrigger_Shadcn_,
|
||||
SelectValue_Shadcn_,
|
||||
Select_Shadcn_,
|
||||
Sheet,
|
||||
SheetContent,
|
||||
SheetFooter,
|
||||
@@ -33,14 +34,18 @@ import {
|
||||
SheetSection,
|
||||
SheetTitle,
|
||||
Switch,
|
||||
cn,
|
||||
} from 'ui'
|
||||
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
|
||||
import { InfoTooltip } from 'ui-patterns/info-tooltip'
|
||||
import { z } from 'zod'
|
||||
|
||||
import { urlRegex } from '../Auth/Auth.constants'
|
||||
import { DATADOG_REGIONS, LOG_DRAIN_TYPES, LogDrainType } from './LogDrains.constants'
|
||||
import {
|
||||
DATADOG_REGIONS,
|
||||
LAST9_REGIONS,
|
||||
LOG_DRAIN_TYPES,
|
||||
LogDrainType,
|
||||
} from './LogDrains.constants'
|
||||
|
||||
const FORM_ID = 'log-drain-destination-form'
|
||||
|
||||
@@ -112,6 +117,15 @@ const formUnion = z.discriminatedUnion('type', [
|
||||
api_token: z.string().min(1, { message: 'API token is required' }),
|
||||
dataset_name: z.string().min(1, { message: 'Dataset name is required' }),
|
||||
}),
|
||||
z.object({
|
||||
type: z.literal('last9'),
|
||||
region: z.string().min(1, { message: 'Region is required' }),
|
||||
username: z.string().min(1, { message: 'Username is required' }),
|
||||
password: z.string().min(1, { message: 'Password is required' }),
|
||||
}),
|
||||
z.object({
|
||||
type: z.literal('otlp'),
|
||||
}),
|
||||
])
|
||||
|
||||
const formSchema = z
|
||||
@@ -183,6 +197,7 @@ export function LogDrainDestinationSheetForm({
|
||||
const sentryEnabled = useFlag('SentryLogDrain')
|
||||
const s3Enabled = useFlag('S3logdrain')
|
||||
const axiomEnabled = useFlag('axiomLogDrain')
|
||||
const last9Enabled = useFlag('Last9LogDrain')
|
||||
|
||||
const { ref } = useParams()
|
||||
const { data: logDrains } = useLogDrainsQuery({
|
||||
@@ -328,9 +343,7 @@ export function LogDrainDestinationSheetForm({
|
||||
<Select_Shadcn_
|
||||
defaultValue={defaultType}
|
||||
value={form.getValues('type')}
|
||||
onValueChange={(v: Exclude<LogDrainType, 'axiom'>) =>
|
||||
form.setValue('type', v)
|
||||
}
|
||||
onValueChange={(v: LogDrainType) => form.setValue('type', v)}
|
||||
>
|
||||
<SelectTrigger_Shadcn_>
|
||||
{LOG_DRAIN_TYPES.find((t) => t.value === type)?.name}
|
||||
@@ -340,6 +353,7 @@ export function LogDrainDestinationSheetForm({
|
||||
if (t.value === 'sentry') return sentryEnabled
|
||||
if (t.value === 's3') return s3Enabled
|
||||
if (t.value === 'axiom') return axiomEnabled
|
||||
if (t.value === 'last9') return last9Enabled
|
||||
return true
|
||||
}).map((type) => (
|
||||
<SelectItem_Shadcn_
|
||||
@@ -592,6 +606,60 @@ export function LogDrainDestinationSheetForm({
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{type === 'last9' && (
|
||||
<div className="grid gap-4 px-content">
|
||||
<FormField_Shadcn_
|
||||
name="region"
|
||||
control={form.control}
|
||||
render={({ field }) => (
|
||||
<FormItemLayout
|
||||
layout="horizontal"
|
||||
label={'Region'}
|
||||
description={
|
||||
<p>
|
||||
The Last9 region to send logs to. Credentials can be obtained from the
|
||||
Last9 OTEL integration panel.
|
||||
</p>
|
||||
}
|
||||
>
|
||||
<FormControl_Shadcn_>
|
||||
<Select_Shadcn_ value={field.value} onValueChange={field.onChange}>
|
||||
<SelectTrigger_Shadcn_ className="col-span-3">
|
||||
<SelectValue_Shadcn_ placeholder="Select a region" />
|
||||
</SelectTrigger_Shadcn_>
|
||||
<SelectContent_Shadcn_>
|
||||
<SelectGroup_Shadcn_>
|
||||
<SelectLabel_Shadcn_>Region</SelectLabel_Shadcn_>
|
||||
{LAST9_REGIONS.map((reg) => (
|
||||
<SelectItem_Shadcn_ key={reg.value} value={reg.value}>
|
||||
{reg.label}
|
||||
</SelectItem_Shadcn_>
|
||||
))}
|
||||
</SelectGroup_Shadcn_>
|
||||
</SelectContent_Shadcn_>
|
||||
</Select_Shadcn_>
|
||||
</FormControl_Shadcn_>
|
||||
</FormItemLayout>
|
||||
)}
|
||||
/>
|
||||
<LogDrainFormItem
|
||||
type="text"
|
||||
value="username"
|
||||
label="Username"
|
||||
placeholder="username"
|
||||
formControl={form.control}
|
||||
description="Username for authentication from Last9 OTEL integration."
|
||||
/>
|
||||
<LogDrainFormItem
|
||||
type="password"
|
||||
value="password"
|
||||
label="Password"
|
||||
placeholder="••••••••••••••••"
|
||||
formControl={form.control}
|
||||
description="Password for authentication from Last9 OTEL integration."
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<FormMessage_Shadcn_ />
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { components } from 'api-types'
|
||||
import { Datadog, Grafana, Sentry } from 'icons'
|
||||
import { Axiom } from 'icons'
|
||||
import { Axiom, Datadog, Grafana, Last9, Sentry } from 'icons'
|
||||
import { BracesIcon, Cloud } from 'lucide-react'
|
||||
|
||||
const iconProps = {
|
||||
@@ -51,6 +50,12 @@ export const LOG_DRAIN_TYPES = [
|
||||
'Axiom is a data platform designed to efficiently collect, store, and analyze event and telemetry data at massive scale.',
|
||||
icon: <Axiom {...iconProps} fill="currentColor" strokeWidth={0} />,
|
||||
},
|
||||
{
|
||||
value: 'last9',
|
||||
name: 'Last9',
|
||||
description: 'Last9 is an observability platform for monitoring and telemetry data',
|
||||
icon: <Last9 {...iconProps} fill="currentColor" strokeWidth={0} />,
|
||||
},
|
||||
] as const
|
||||
|
||||
export const LOG_DRAIN_SOURCE_VALUES = LOG_DRAIN_TYPES.map((source) => source.value)
|
||||
@@ -86,6 +91,17 @@ export const DATADOG_REGIONS = [
|
||||
},
|
||||
] as const
|
||||
|
||||
export const LAST9_REGIONS = [
|
||||
{
|
||||
label: 'US West 1',
|
||||
value: 'US-WEST-1',
|
||||
},
|
||||
{
|
||||
label: 'AP South 1',
|
||||
value: 'AP-SOUTH-1',
|
||||
},
|
||||
] as const
|
||||
|
||||
export type LogDrainDatadogConfig = {
|
||||
api_key: string
|
||||
region: string
|
||||
|
||||
@@ -5,11 +5,12 @@ import { LogDrainData, useLogDrainsQuery } from 'data/log-drains/log-drains-quer
|
||||
import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements'
|
||||
import { useTrack } from 'lib/telemetry/track'
|
||||
import { MoreHorizontal, Pencil, TrashIcon } from 'lucide-react'
|
||||
import React, { cloneElement, useState } from 'react'
|
||||
import { cloneElement, useState } from 'react'
|
||||
import { toast } from 'sonner'
|
||||
import {
|
||||
Button,
|
||||
Card,
|
||||
cn,
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
@@ -20,7 +21,6 @@ import {
|
||||
TableHead,
|
||||
TableHeader,
|
||||
TableRow,
|
||||
cn,
|
||||
} from 'ui'
|
||||
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
|
||||
import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader'
|
||||
@@ -58,6 +58,7 @@ export function LogDrains({
|
||||
const sentryEnabled = useFlag('SentryLogDrain')
|
||||
const s3Enabled = useFlag('S3logdrain')
|
||||
const axiomEnabled = useFlag('axiomLogDrain')
|
||||
const last9Enabled = useFlag('Last9LogDrain')
|
||||
const hasLogDrains = !!logDrains?.length
|
||||
|
||||
const { mutate: deleteLogDrain } = useDeleteLogDrainMutation({
|
||||
@@ -96,6 +97,7 @@ export function LogDrains({
|
||||
if (t.value === 'sentry') return sentryEnabled
|
||||
if (t.value === 's3') return s3Enabled
|
||||
if (t.value === 'axiom') return axiomEnabled
|
||||
if (t.value === 'last9') return last9Enabled
|
||||
return true
|
||||
}).map((src) => (
|
||||
<LogDrainsCard
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
||||
import { IS_PLATFORM, useParams } from 'common'
|
||||
import { useFlag } from 'common'
|
||||
import { IS_PLATFORM, useFlag, useParams } from 'common'
|
||||
import { LogDrainDestinationSheetForm } from 'components/interfaces/LogDrains/LogDrainDestinationSheetForm'
|
||||
import { LogDrains } from 'components/interfaces/LogDrains/LogDrains'
|
||||
import { LOG_DRAIN_TYPES, LogDrainType } from 'components/interfaces/LogDrains/LogDrains.constants'
|
||||
@@ -19,8 +18,7 @@ import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements'
|
||||
import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions'
|
||||
import { DOCS_URL } from 'lib/constants'
|
||||
import { ChevronDown } from 'lucide-react'
|
||||
import { useState } from 'react'
|
||||
import { cloneElement } from 'react'
|
||||
import { cloneElement, useState } from 'react'
|
||||
import { toast } from 'sonner'
|
||||
import type { NextPageWithLayout } from 'types'
|
||||
import {
|
||||
@@ -54,6 +52,7 @@ const LogDrainsSettings: NextPageWithLayout = () => {
|
||||
const sentryEnabled = useFlag('SentryLogDrain')
|
||||
const s3Enabled = useFlag('S3logdrain')
|
||||
const axiomEnabled = useFlag('axiomLogDrain')
|
||||
const last9Enabled = useFlag('Last9LogDrain')
|
||||
|
||||
const { data: logDrains } = useLogDrainsQuery(
|
||||
{ ref },
|
||||
@@ -111,8 +110,8 @@ const LogDrainsSettings: NextPageWithLayout = () => {
|
||||
setOpen(v)
|
||||
}}
|
||||
defaultValues={{
|
||||
type: selectedLogDrain?.type || 'webhook',
|
||||
...selectedLogDrain,
|
||||
type: selectedLogDrain?.type ? selectedLogDrain.type : 'webhook',
|
||||
}}
|
||||
isLoading={isLoading}
|
||||
onSubmit={({ name, description, type, ...values }) => {
|
||||
@@ -220,6 +219,7 @@ const LogDrainsSettings: NextPageWithLayout = () => {
|
||||
if (t.value === 'sentry') return sentryEnabled
|
||||
if (t.value === 's3') return s3Enabled
|
||||
if (t.value === 'axiom') return axiomEnabled
|
||||
if (t.value === 'last9') return last9Enabled
|
||||
return true
|
||||
}).map((drainType) => (
|
||||
<DropdownMenuItem
|
||||
|
||||
Vendored
+126
-21
@@ -1482,6 +1482,24 @@ export interface paths {
|
||||
patch?: never
|
||||
trace?: never
|
||||
}
|
||||
'/v1/projects/{ref}/jit-access': {
|
||||
parameters: {
|
||||
query?: never
|
||||
header?: never
|
||||
path?: never
|
||||
cookie?: never
|
||||
}
|
||||
/** [Beta] Get project's just-in-time access configuration. */
|
||||
get: operations['v1-get-jit-access-config']
|
||||
/** [Beta] Update project's just-in-time access configuration. */
|
||||
put: operations['v1-update-jit-access-config']
|
||||
post?: never
|
||||
delete?: never
|
||||
options?: never
|
||||
head?: never
|
||||
patch?: never
|
||||
trace?: never
|
||||
}
|
||||
'/v1/projects/{ref}/network-bans': {
|
||||
parameters: {
|
||||
query?: never
|
||||
@@ -2876,6 +2894,10 @@ export interface components {
|
||||
}
|
||||
updated_at?: string
|
||||
}
|
||||
JitAccessRequestRequest: {
|
||||
/** @enum {string} */
|
||||
state: 'enabled' | 'disabled' | 'unavailable'
|
||||
}
|
||||
JitAccessResponse: {
|
||||
/** Format: uuid */
|
||||
user_id: string
|
||||
@@ -5285,27 +5307,6 @@ export interface operations {
|
||||
'application/json': components['schemas']['V1OrganizationMemberResponse'][]
|
||||
}
|
||||
}
|
||||
/** @description Unauthorized */
|
||||
401: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Forbidden action */
|
||||
403: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Rate limit exceeded */
|
||||
429: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
}
|
||||
}
|
||||
'v1-get-organization-project-claim': {
|
||||
@@ -10419,6 +10420,110 @@ export interface operations {
|
||||
}
|
||||
}
|
||||
}
|
||||
'v1-get-jit-access-config': {
|
||||
parameters: {
|
||||
query?: never
|
||||
header?: never
|
||||
path: {
|
||||
/** @description Project ref */
|
||||
ref: string
|
||||
}
|
||||
cookie?: never
|
||||
}
|
||||
requestBody?: never
|
||||
responses: {
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content: {
|
||||
'application/json': components['schemas']['JitAccessResponse']
|
||||
}
|
||||
}
|
||||
/** @description Unauthorized */
|
||||
401: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Forbidden action */
|
||||
403: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Rate limit exceeded */
|
||||
429: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Failed to retrieve project's JIT access config */
|
||||
500: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
}
|
||||
}
|
||||
'v1-update-jit-access-config': {
|
||||
parameters: {
|
||||
query?: never
|
||||
header?: never
|
||||
path: {
|
||||
/** @description Project ref */
|
||||
ref: string
|
||||
}
|
||||
cookie?: never
|
||||
}
|
||||
requestBody: {
|
||||
content: {
|
||||
'application/json': components['schemas']['JitAccessRequestRequest']
|
||||
}
|
||||
}
|
||||
responses: {
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content: {
|
||||
'application/json': components['schemas']['JitAccessResponse']
|
||||
}
|
||||
}
|
||||
/** @description Unauthorized */
|
||||
401: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Forbidden action */
|
||||
403: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Rate limit exceeded */
|
||||
429: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Failed to update project's just-in-time access configuration. */
|
||||
500: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
}
|
||||
}
|
||||
'v1-delete-network-bans': {
|
||||
parameters: {
|
||||
query?: never
|
||||
|
||||
+128
-83
@@ -951,23 +951,6 @@ export interface paths {
|
||||
patch?: never
|
||||
trace?: never
|
||||
}
|
||||
'/platform/organizations/{slug}/billing/credits/preview-code': {
|
||||
parameters: {
|
||||
query?: never
|
||||
header?: never
|
||||
path?: never
|
||||
cookie?: never
|
||||
}
|
||||
get?: never
|
||||
put?: never
|
||||
/** Previews a code redemption */
|
||||
post: operations['OrgCreditsController_previewCode']
|
||||
delete?: never
|
||||
options?: never
|
||||
head?: never
|
||||
patch?: never
|
||||
trace?: never
|
||||
}
|
||||
'/platform/organizations/{slug}/billing/credits/redeem': {
|
||||
parameters: {
|
||||
query?: never
|
||||
@@ -1946,6 +1929,26 @@ export interface paths {
|
||||
patch?: never
|
||||
trace?: never
|
||||
}
|
||||
'/platform/plans/features': {
|
||||
parameters: {
|
||||
query?: never
|
||||
header?: never
|
||||
path?: never
|
||||
cookie?: never
|
||||
}
|
||||
/**
|
||||
* Get feature configurations for all plans
|
||||
* @description Returns feature configurations for customer-facing plans (Free, Pro, Team, Enterprise). Use the featureKey query parameter to get a specific feature, or omit it to get all features.
|
||||
*/
|
||||
get: operations['PlanFeaturesController_getPlanFeatures']
|
||||
put?: never
|
||||
post?: never
|
||||
delete?: never
|
||||
options?: never
|
||||
head?: never
|
||||
patch?: never
|
||||
trace?: never
|
||||
}
|
||||
'/platform/profile': {
|
||||
parameters: {
|
||||
query?: never
|
||||
@@ -4849,6 +4852,8 @@ export interface components {
|
||||
| 'sentry'
|
||||
| 's3'
|
||||
| 'axiom'
|
||||
| 'last9'
|
||||
| 'otlp'
|
||||
}
|
||||
CreateBucketIndexBody: {
|
||||
/** @enum {string} */
|
||||
@@ -5518,8 +5523,12 @@ export interface components {
|
||||
| 'auth_signing_keys_write'
|
||||
| 'backups_read'
|
||||
| 'backups_write'
|
||||
| 'branching_development_create'
|
||||
| 'branching_development_delete'
|
||||
| 'branching_development_read'
|
||||
| 'branching_development_write'
|
||||
| 'branching_production_create'
|
||||
| 'branching_production_delete'
|
||||
| 'branching_production_read'
|
||||
| 'branching_production_write'
|
||||
| 'custom_domain_read'
|
||||
@@ -5552,6 +5561,8 @@ export interface components {
|
||||
| 'edge_functions_secrets_write'
|
||||
| 'infra_add_ons_read'
|
||||
| 'infra_add_ons_write'
|
||||
| 'infra_disk_config_read'
|
||||
| 'infra_disk_config_write'
|
||||
| 'infra_read_replicas_read'
|
||||
| 'infra_read_replicas_write'
|
||||
| 'project_snippets_read'
|
||||
@@ -5758,12 +5769,6 @@ export interface components {
|
||||
source: string
|
||||
teamId?: string
|
||||
}
|
||||
CreditRedemptionPreviewResponse: {
|
||||
amount_cents: number
|
||||
/** Format: date-time */
|
||||
credits_expire_at: string | null
|
||||
validity_days: number | null
|
||||
}
|
||||
CreditRedemptionRequest: {
|
||||
code: string
|
||||
}
|
||||
@@ -5771,7 +5776,7 @@ export interface components {
|
||||
amount_cents: number
|
||||
/** Format: date-time */
|
||||
credits_expire_at: string | null
|
||||
validity_days: number | null
|
||||
credits_expiry_days: number | null
|
||||
}
|
||||
CreditsTopUpRequest: {
|
||||
address?: {
|
||||
@@ -6999,6 +7004,8 @@ export interface components {
|
||||
| 'sentry'
|
||||
| 's3'
|
||||
| 'axiom'
|
||||
| 'last9'
|
||||
| 'otlp'
|
||||
user_id: number
|
||||
}
|
||||
LFEndpoint: {
|
||||
@@ -7734,6 +7741,28 @@ export interface components {
|
||||
PgbouncerStatusResponse: {
|
||||
active: boolean
|
||||
}
|
||||
PlanFeaturesResponse: {
|
||||
[key: string]: {
|
||||
[key: string]: {
|
||||
config:
|
||||
| {
|
||||
enabled: boolean
|
||||
}
|
||||
| {
|
||||
enabled: boolean
|
||||
unit: string
|
||||
unlimited: boolean
|
||||
value: number
|
||||
}
|
||||
| {
|
||||
enabled: boolean
|
||||
set: string[]
|
||||
}
|
||||
/** @enum {string} */
|
||||
type: 'boolean' | 'numeric' | 'set'
|
||||
}
|
||||
}
|
||||
}
|
||||
PlansResponse: {
|
||||
plans: {
|
||||
/** @enum {string} */
|
||||
@@ -9651,6 +9680,8 @@ export interface components {
|
||||
| 'sentry'
|
||||
| 's3'
|
||||
| 'axiom'
|
||||
| 'last9'
|
||||
| 'otlp'
|
||||
}
|
||||
UpdateCollectionBody: {
|
||||
name: string
|
||||
@@ -13372,61 +13403,6 @@ export interface operations {
|
||||
}
|
||||
}
|
||||
}
|
||||
OrgCreditsController_previewCode: {
|
||||
parameters: {
|
||||
query?: never
|
||||
header?: never
|
||||
path: {
|
||||
/** @description Organization slug */
|
||||
slug: string
|
||||
}
|
||||
cookie?: never
|
||||
}
|
||||
requestBody: {
|
||||
content: {
|
||||
'application/json': components['schemas']['CreditRedemptionRequest']
|
||||
}
|
||||
}
|
||||
responses: {
|
||||
/** @description Credit code details. */
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content: {
|
||||
'application/json': components['schemas']['CreditRedemptionPreviewResponse']
|
||||
}
|
||||
}
|
||||
/** @description Unauthorized */
|
||||
401: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Forbidden action */
|
||||
403: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Rate limit exceeded */
|
||||
429: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
/** @description Failed to preview redemption code */
|
||||
500: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content?: never
|
||||
}
|
||||
}
|
||||
}
|
||||
OrgCreditsController_redeemCode: {
|
||||
parameters: {
|
||||
query?: never
|
||||
@@ -13444,7 +13420,7 @@ export interface operations {
|
||||
}
|
||||
responses: {
|
||||
/** @description Credit code redeemed successfully. */
|
||||
200: {
|
||||
201: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
@@ -17063,6 +17039,72 @@ export interface operations {
|
||||
}
|
||||
}
|
||||
}
|
||||
PlanFeaturesController_getPlanFeatures: {
|
||||
parameters: {
|
||||
query?: {
|
||||
featureKey?:
|
||||
| 'instances.compute_update_available_sizes'
|
||||
| 'instances.read_replicas'
|
||||
| 'instances.disk_modifications'
|
||||
| 'replication.etl'
|
||||
| 'storage.max_file_size'
|
||||
| 'storage.image_transformations'
|
||||
| 'storage.vector_buckets'
|
||||
| 'storage.iceberg_catalog'
|
||||
| 'security.audit_logs_days'
|
||||
| 'security.questionnaire'
|
||||
| 'security.soc2_report'
|
||||
| 'security.private_link'
|
||||
| 'security.enforce_mfa'
|
||||
| 'log.retention_days'
|
||||
| 'custom_domain'
|
||||
| 'vanity_subdomain'
|
||||
| 'ipv4'
|
||||
| 'pitr.available_variants'
|
||||
| 'log_drains'
|
||||
| 'branching_limit'
|
||||
| 'branching_persistent'
|
||||
| 'auth.mfa_phone'
|
||||
| 'auth.mfa_web_authn'
|
||||
| 'auth.mfa_enhanced_security'
|
||||
| 'auth.hooks'
|
||||
| 'auth.platform.sso'
|
||||
| 'auth.custom_jwt_template'
|
||||
| 'auth.saml_2'
|
||||
| 'auth.user_sessions'
|
||||
| 'auth.leaked_password_protection'
|
||||
| 'auth.advanced_auth_settings'
|
||||
| 'backup.retention_days'
|
||||
| 'function.max_count'
|
||||
| 'function.size_limit_mb'
|
||||
| 'realtime.max_concurrent_users'
|
||||
| 'realtime.max_events_per_second'
|
||||
| 'realtime.max_joins_per_second'
|
||||
| 'realtime.max_channels_per_client'
|
||||
| 'realtime.max_bytes_per_second'
|
||||
| 'realtime.max_presence_events_per_second'
|
||||
| 'realtime.max_payload_size_in_kb'
|
||||
| 'project_scoped_roles'
|
||||
| 'security.member_roles'
|
||||
| 'project_pausing'
|
||||
| 'project_cloning'
|
||||
}
|
||||
header?: never
|
||||
path?: never
|
||||
cookie?: never
|
||||
}
|
||||
requestBody?: never
|
||||
responses: {
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown
|
||||
}
|
||||
content: {
|
||||
'application/json': components['schemas']['PlanFeaturesResponse']
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ProfileController_getProfile: {
|
||||
parameters: {
|
||||
query?: never
|
||||
@@ -18241,7 +18283,7 @@ export interface operations {
|
||||
path: {
|
||||
/** @description Project ref */
|
||||
ref: string
|
||||
/** @description Log drains token */
|
||||
/** @description Log drains identifier */
|
||||
token: string
|
||||
}
|
||||
cookie?: never
|
||||
@@ -18297,7 +18339,7 @@ export interface operations {
|
||||
path: {
|
||||
/** @description Project ref */
|
||||
ref: string
|
||||
/** @description Log drains token */
|
||||
/** @description Log drains identifier */
|
||||
token: string
|
||||
}
|
||||
cookie?: never
|
||||
@@ -26230,7 +26272,10 @@ export interface operations {
|
||||
}
|
||||
TelemetryFeatureFlagsController_callFeatureFlag: {
|
||||
parameters: {
|
||||
query?: never
|
||||
query?: {
|
||||
organization_slug?: string
|
||||
project_ref?: string
|
||||
}
|
||||
header?: never
|
||||
path?: never
|
||||
cookie?: never
|
||||
|
||||
@@ -2367,6 +2367,8 @@ export interface LogDrainSaveButtonClickedEvent {
|
||||
| 'sentry'
|
||||
| 's3'
|
||||
| 'axiom'
|
||||
| 'last9'
|
||||
| 'otlp'
|
||||
}
|
||||
groups: TelemetryGroups
|
||||
}
|
||||
@@ -2395,6 +2397,8 @@ export interface LogDrainConfirmButtonSubmittedEvent {
|
||||
| 'sentry'
|
||||
| 's3'
|
||||
| 'axiom'
|
||||
| 'last9'
|
||||
| 'otlp'
|
||||
}
|
||||
groups: TelemetryGroups
|
||||
}
|
||||
|
||||
@@ -184,6 +184,16 @@ export const Index: Record<string, any> = [
|
||||
svg: "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"1\">\n <path\n d=\"M17.2661 3.23254V10.7325M13.5161 6.98291L21.0161 6.98291M11.0391 16.9508C11.0391 19.1752 9.23585 20.9784 7.01147 20.9784C4.7871 20.9784 2.98389 19.1752 2.98389 16.9508C2.98389 14.7264 4.7871 12.9232 7.01147 12.9232C9.23585 12.9232 11.0391 14.7264 11.0391 16.9508ZM21.0161 19.8568V14.3568C21.0161 13.8045 20.5684 13.3568 20.0161 13.3568H14.5161C13.9638 13.3568 13.5161 13.8045 13.5161 14.3568V19.8568C13.5161 20.4091 13.9638 20.8568 14.5161 20.8568H20.0161C20.5684 20.8568 21.0161 20.4091 21.0161 19.8568ZM4.26221 10.7325H9.76221C10.3145 10.7325 10.7622 10.2848 10.7622 9.73254V4.23254C10.7622 3.68026 10.3145 3.23254 9.76221 3.23254H4.26221C3.70992 3.23254 3.26221 3.68026 3.26221 4.23254V9.73254C3.26221 10.2848 3.70992 10.7325 4.26221 10.7325Z\" />\n</svg>",
|
||||
jsx: "import { Integrations } from \"icons\"\n <Integrations/>\n "
|
||||
},
|
||||
{
|
||||
name: "last9",
|
||||
componentName: "Last9",
|
||||
deprecated: false,
|
||||
raw: "import createSupabaseIcon from '../createSupabaseIcon';\n\n/**\n * @component @name Last9\n * @description Supabase SVG icon component, renders SVG Element with children.\n *\n * @preview \n *\n * @param {Object} props - Supabase icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Last9 = createSupabaseIcon('Last9', [\n [\n 'path',\n {\n 'fill-rule': 'evenodd',\n 'clip-rule': 'evenodd',\n d: 'M23.9431 13.1737L22.7487 13.0575C22.7826 12.709 22.8 12.3552 22.8 11.9971C22.8 11.6389 22.7826 11.28Line truncated
|
||||
component: React.lazy(() => import('icons/src/icons/last9')),
|
||||
import: "import { Last9 } from 'icons'",
|
||||
svg: "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M23.9431 13.1737L22.7487 13.0575C22.7826 12.709 22.8 12.3552 22.8 11.9971C22.8 11.6389 22.7826 11.2852 22.7487 10.9366L23.9431 10.8204C23.9807 11.2075 24 11.6 24 11.9971C24 12.3941 23.9807 12.7866 23.9431 13.1737ZM23.4862 8.5125L22.3378 8.8604C22.131 8.17807 21.8585 7.52413 21.5273 6.90588L22.5852 6.3393C22.9532 7.02642 23.2563 7.75356 23.4862 8.5125ZM21.2765 4.38423L20.3493 5.14603C19.9 4.59913 19.398 4.09711 18.851 3.64777L19.6129 2.72059C20.2201 3.21954 20.7775 3.7696 21.2765 4.38423ZM17.6577 1.41188L17.0912 2.4697C16.4729 2.13857 15.819 1.86601 15.1366 1.65928L15.4846 0.510829C16.2435 0.74076 16.9706 1.04384 17.6577 1.41188ZM13.1767 0.0540262L13.0604 1.24839C12.7119 1.21446 12.3581 1.19707 12 1.19707C11.6419 1.19707 11.2881 1.21446 10.9396 1.24839L10.8233 0.0540263C11.2104 0.0163507 11.603 -0.00292969 12 -0.00292969C12.397 -0.00292969 12.7895 0.0163507 13.1767 0.0540262ZM8.51538 0.510829L8.86332 1.65928C8.181 1.86601 7.52706 2.13857 6.90882 2.4697L6.34224 1.41188C7.02936 1.04384 7.7565 0.74076 8.51538 0.510829ZM4.38716 2.72059L5.14895 3.64777C4.60207 4.09711 4.10004 4.59913 3.6507 5.14603L2.72352 4.38423C3.22247 3.7696 3.77253 3.21954 4.38716 2.72059ZM1.41481 6.3393L2.47263 6.90588C2.14151 7.52413 1.86895 8.17807 1.6622 8.8604L0.513793 8.5125C0.743688 7.75356 1.04677 7.02642 1.41481 6.3393ZM0.0569559 10.8204C0.0192803 11.2075 0 11.6 0 11.9971C0 12.3941 0.0192804 12.7866 0.056956 13.1737L1.25131 13.0575C1.21739 12.709 1.2 12.3552 1.2 11.9971C1.2 11.6389 1.21739 11.2852 1.25131 10.9366L0.0569559 10.8204ZM0.513794 15.4817L1.6622 15.1337C1.86895 15.816 2.14151 16.4699 2.47263 17.0882L1.41481 17.6547C1.04677 16.9676 0.743688 16.2405 0.513794 15.4817ZM2.72352 19.6098L3.6507 18.848C4.10004 19.3949 4.60207 19.8969 5.14895 20.3463L4.38716 21.2735C3.77253 20.7745 3.22247 20.2245 2.72352 19.6098ZM6.34224 22.5821L6.90882 21.5243C7.52706 21.8555 8.181 22.128 8.86332 22.3347L8.51538 23.4832C7.7565 23.2533 7.02936 22.9502 6.34224 22.5821ZM10.8233 23.9401L10.9396 22.7457C11.2881 22.7797 11.6419 22.797 12 22.797C12.3581 22.797 12.7119 22.7797 13.0604 22.7457L13.1767 23.9401C12.7895 23.9778 12.397 23.9971 12 23.9971C11.603 23.9971 11.2104 23.9778 10.8233 23.9401ZM15.4846 23.4832L15.1366 22.3347C15.819 22.128 16.4729 21.8555 17.0912 21.5243L17.6577 22.5821C16.9706 22.9502 16.2435 23.2533 15.4846 23.4832ZM19.6129 21.2735L18.851 20.3463C19.398 19.8969 19.9 19.3949 20.3493 18.848L21.2765 19.6098C20.7775 20.2245 20.2201 20.7745 19.6129 21.2735ZM22.5852 17.6547L21.5273 17.0882C21.8585 16.4699 22.131 15.816 22.3378 15.1337L23.4862 15.4817C23.2563 16.2405 22.9532 16.9676 22.5852 17.6547Z\" fill=\"currentColor\"/>\n<path d=\"M7.2 9.66642C7.2 12.3994 9.07812 14.293 11.7242 14.293C12.1222 14.293 12.4992 14.2237 12.8483 14.1335L9.38532 19.1971H12.4224L15.7318 14.3277C16.9605 12.5104 17.554 11.1023 17.568 9.60402C17.575 6.552 15.1732 4.79707 12.3316 4.79707C9.3504 4.79707 7.2 6.74622 7.2 9.66642ZM10.1044 9.56238C10.1044 8.1543 11.026 7.14156 12.3456 7.14156C13.6721 7.14156 14.6077 8.1543 14.6077 9.57624C14.6077 10.9843 13.6721 11.9832 12.3456 11.9832C11.026 11.9832 10.1044 10.9843 10.1044 9.56238Z\" fill=\"currentColor\"/>\n</svg>\n",
|
||||
jsx: "import { Last9 } from \"icons\"\n <Last9/>\n "
|
||||
},
|
||||
{
|
||||
name: "logs",
|
||||
componentName: "Logs",
|
||||
|
||||
@@ -16,6 +16,7 @@ export { default as Graphql } from './graphql';
|
||||
export { default as Home } from './home';
|
||||
export { default as InsertCode } from './insert-code';
|
||||
export { default as Integrations } from './integrations';
|
||||
export { default as Last9 } from './last9';
|
||||
export { default as Logs } from './logs';
|
||||
export { default as Postgres } from './postgres';
|
||||
export { default as Realtime } from './realtime';
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import createSupabaseIcon from '../createSupabaseIcon';
|
||||
|
||||
/**
|
||||
* @component @name Last9
|
||||
* @description Supabase SVG icon component, renders SVG Element with children.
|
||||
*
|
||||
* @preview 
|
||||
*
|
||||
* @param {Object} props - Supabase icons props and any valid SVG attribute
|
||||
* @returns {JSX.Element} JSX Element
|
||||
*
|
||||
*/
|
||||
const Last9 = createSupabaseIcon('Last9', [
|
||||
[
|
||||
'path',
|
||||
{
|
||||
'fill-rule': 'evenodd',
|
||||
'clip-rule': 'evenodd',
|
||||
d: 'M23.9431 13.1737L22.7487 13.0575C22.7826 12.709 22.8 12.3552 22.8 11.9971C22.8 11.6389 22.7826 11.2852 22.7487 10.9366L23.9431 10.8204C23.9807 11.2075 24 11.6 24 11.9971C24 12.3941 23.9807 12.7866 23.9431 13.1737ZM23.4862 8.5125L22.3378 8.8604C22.131 8.17807 21.8585 7.52413 21.5273 6.90588L22.5852 6.3393C22.9532 7.02642 23.2563 7.75356 23.4862 8.5125ZM21.2765 4.38423L20.3493 5.14603C19.9 4.59913 19.398 4.09711 18.851 3.64777L19.6129 2.72059C20.2201 3.21954 20.7775 3.7696 21.2765 4.38423ZM17.6577 1.41188L17.0912 2.4697C16.4729 2.13857 15.819 1.86601 15.1366 1.65928L15.4846 0.510829C16.2435 0.74076 16.9706 1.04384 17.6577 1.41188ZM13.1767 0.0540262L13.0604 1.24839C12.7119 1.21446 12.3581 1.19707 12 1.19707C11.6419 1.19707 11.2881 1.21446 10.9396 1.24839L10.8233 0.0540263C11.2104 0.0163507 11.603 -0.00292969 12 -0.00292969C12.397 -0.00292969 12.7895 0.0163507 13.1767 0.0540262ZM8.51538 0.510829L8.86332 1.65928C8.181 1.86601 7.52706 2.13857 6.90882 2.4697L6.34224 1.41188C7.02936 1.04384 7.7565 0.74076 8.51538 0.510829ZM4.38716 2.72059L5.14895 3.64777C4.60207 4.09711 4.10004 4.59913 3.6507 5.14603L2.72352 4.38423C3.22247 3.7696 3.77253 3.21954 4.38716 2.72059ZM1.41481 6.3393L2.47263 6.90588C2.14151 7.52413 1.86895 8.17807 1.6622 8.8604L0.513793 8.5125C0.743688 7.75356 1.04677 7.02642 1.41481 6.3393ZM0.0569559 10.8204C0.0192803 11.2075 0 11.6 0 11.9971C0 12.3941 0.0192804 12.7866 0.056956 13.1737L1.25131 13.0575C1.21739 12.709 1.2 12.3552 1.2 11.9971C1.2 11.6389 1.21739 11.2852 1.25131 10.9366L0.0569559 10.8204ZM0.513794 15.4817L1.6622 15.1337C1.86895 15.816 2.14151 16.4699 2.47263 17.0882L1.41481 17.6547C1.04677 16.9676 0.743688 16.2405 0.513794 15.4817ZM2.72352 19.6098L3.6507 18.848C4.10004 19.3949 4.60207 19.8969 5.14895 20.3463L4.38716 21.2735C3.77253 20.7745 3.22247 20.2245 2.72352 19.6098ZM6.34224 22.5821L6.90882 21.5243C7.52706 21.8555 8.181 22.128 8.86332 22.3347L8.51538 23.4832C7.7565 23.2533 7.02936 22.9502 6.34224 22.5821ZM10.8233 23.9401L10.9396 22.7457C11.2881 22.7797 11.6419 22.797 12 22.797C12.3581 22.797 12.7119 22.7797 13.0604 22.7457L13.1767 23.9401C12.7895 23.9778 12.397 23.9971 12 23.9971C11.603 23.9971 11.2104 23.9778 10.8233 23.9401ZM15.4846 23.4832L15.1366 22.3347C15.819 22.128 16.4729 21.8555 17.0912 21.5243L17.6577 22.5821C16.9706 22.9502 16.2435 23.2533 15.4846 23.4832ZM19.6129 21.2735L18.851 20.3463C19.398 19.8969 19.9 19.3949 20.3493 18.848L21.2765 19.6098C20.7775 20.2245 20.2201 20.7745 19.6129 21.2735ZM22.5852 17.6547L21.5273 17.0882C21.8585 16.4699 22.131 15.816 22.3378 15.1337L23.4862 15.4817C23.2563 16.2405 22.9532 16.9676 22.5852 17.6547Z',
|
||||
fill: 'currentColor',
|
||||
key: '1bcx6p',
|
||||
},
|
||||
],
|
||||
[
|
||||
'path',
|
||||
{
|
||||
d: 'M7.2 9.66642C7.2 12.3994 9.07812 14.293 11.7242 14.293C12.1222 14.293 12.4992 14.2237 12.8483 14.1335L9.38532 19.1971H12.4224L15.7318 14.3277C16.9605 12.5104 17.554 11.1023 17.568 9.60402C17.575 6.552 15.1732 4.79707 12.3316 4.79707C9.3504 4.79707 7.2 6.74622 7.2 9.66642ZM10.1044 9.56238C10.1044 8.1543 11.026 7.14156 12.3456 7.14156C13.6721 7.14156 14.6077 8.1543 14.6077 9.57624C14.6077 10.9843 13.6721 11.9832 12.3456 11.9832C11.026 11.9832 10.1044 10.9843 10.1044 9.56238Z',
|
||||
fill: 'currentColor',
|
||||
key: '1vyu7g',
|
||||
},
|
||||
],
|
||||
]);
|
||||
|
||||
export default Last9;
|
||||
@@ -0,0 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M23.9431 13.1737L22.7487 13.0575C22.7826 12.709 22.8 12.3552 22.8 11.9971C22.8 11.6389 22.7826 11.2852 22.7487 10.9366L23.9431 10.8204C23.9807 11.2075 24 11.6 24 11.9971C24 12.3941 23.9807 12.7866 23.9431 13.1737ZM23.4862 8.5125L22.3378 8.8604C22.131 8.17807 21.8585 7.52413 21.5273 6.90588L22.5852 6.3393C22.9532 7.02642 23.2563 7.75356 23.4862 8.5125ZM21.2765 4.38423L20.3493 5.14603C19.9 4.59913 19.398 4.09711 18.851 3.64777L19.6129 2.72059C20.2201 3.21954 20.7775 3.7696 21.2765 4.38423ZM17.6577 1.41188L17.0912 2.4697C16.4729 2.13857 15.819 1.86601 15.1366 1.65928L15.4846 0.510829C16.2435 0.74076 16.9706 1.04384 17.6577 1.41188ZM13.1767 0.0540262L13.0604 1.24839C12.7119 1.21446 12.3581 1.19707 12 1.19707C11.6419 1.19707 11.2881 1.21446 10.9396 1.24839L10.8233 0.0540263C11.2104 0.0163507 11.603 -0.00292969 12 -0.00292969C12.397 -0.00292969 12.7895 0.0163507 13.1767 0.0540262ZM8.51538 0.510829L8.86332 1.65928C8.181 1.86601 7.52706 2.13857 6.90882 2.4697L6.34224 1.41188C7.02936 1.04384 7.7565 0.74076 8.51538 0.510829ZM4.38716 2.72059L5.14895 3.64777C4.60207 4.09711 4.10004 4.59913 3.6507 5.14603L2.72352 4.38423C3.22247 3.7696 3.77253 3.21954 4.38716 2.72059ZM1.41481 6.3393L2.47263 6.90588C2.14151 7.52413 1.86895 8.17807 1.6622 8.8604L0.513793 8.5125C0.743688 7.75356 1.04677 7.02642 1.41481 6.3393ZM0.0569559 10.8204C0.0192803 11.2075 0 11.6 0 11.9971C0 12.3941 0.0192804 12.7866 0.056956 13.1737L1.25131 13.0575C1.21739 12.709 1.2 12.3552 1.2 11.9971C1.2 11.6389 1.21739 11.2852 1.25131 10.9366L0.0569559 10.8204ZM0.513794 15.4817L1.6622 15.1337C1.86895 15.816 2.14151 16.4699 2.47263 17.0882L1.41481 17.6547C1.04677 16.9676 0.743688 16.2405 0.513794 15.4817ZM2.72352 19.6098L3.6507 18.848C4.10004 19.3949 4.60207 19.8969 5.14895 20.3463L4.38716 21.2735C3.77253 20.7745 3.22247 20.2245 2.72352 19.6098ZM6.34224 22.5821L6.90882 21.5243C7.52706 21.8555 8.181 22.128 8.86332 22.3347L8.51538 23.4832C7.7565 23.2533 7.02936 22.9502 6.34224 22.5821ZM10.8233 23.9401L10.9396 22.7457C11.2881 22.7797 11.6419 22.797 12 22.797C12.3581 22.797 12.7119 22.7797 13.0604 22.7457L13.1767 23.9401C12.7895 23.9778 12.397 23.9971 12 23.9971C11.603 23.9971 11.2104 23.9778 10.8233 23.9401ZM15.4846 23.4832L15.1366 22.3347C15.819 22.128 16.4729 21.8555 17.0912 21.5243L17.6577 22.5821C16.9706 22.9502 16.2435 23.2533 15.4846 23.4832ZM19.6129 21.2735L18.851 20.3463C19.398 19.8969 19.9 19.3949 20.3493 18.848L21.2765 19.6098C20.7775 20.2245 20.2201 20.7745 19.6129 21.2735ZM22.5852 17.6547L21.5273 17.0882C21.8585 16.4699 22.131 15.816 22.3378 15.1337L23.4862 15.4817C23.2563 16.2405 22.9532 16.9676 22.5852 17.6547Z" fill="currentColor"/>
|
||||
<path d="M7.2 9.66642C7.2 12.3994 9.07812 14.293 11.7242 14.293C12.1222 14.293 12.4992 14.2237 12.8483 14.1335L9.38532 19.1971H12.4224L15.7318 14.3277C16.9605 12.5104 17.554 11.1023 17.568 9.60402C17.575 6.552 15.1732 4.79707 12.3316 4.79707C9.3504 4.79707 7.2 6.74622 7.2 9.66642ZM10.1044 9.56238C10.1044 8.1543 11.026 7.14156 12.3456 7.14156C13.6721 7.14156 14.6077 8.1543 14.6077 9.57624C14.6077 10.9843 13.6721 11.9832 12.3456 11.9832C11.026 11.9832 10.1044 10.9843 10.1044 9.56238Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
Reference in new issue
Block a user