From e8162fee0897d201a4658b7fc363c13ad5834262 Mon Sep 17 00:00:00 2001 From: Jordi Enric <37541088+jordienr@users.noreply.github.com> Date: Fri, 6 Feb 2026 15:17:07 +0100 Subject: [PATCH] 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 CleanShot 2026-02-05 at 13 17
19@2x ## 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 --- .../LogDrainDestinationSheetForm.tsx | 82 ++++++- .../LogDrains/LogDrains.constants.tsx | 20 +- .../interfaces/LogDrains/LogDrains.tsx | 6 +- .../project/[ref]/settings/log-drains.tsx | 10 +- packages/api-types/types/api.d.ts | 147 ++++++++++-- packages/api-types/types/platform.d.ts | 211 +++++++++++------- packages/common/telemetry-constants.ts | 4 + packages/icons/__registry__/index.tsx | 10 + packages/icons/src/icons/index.ts | 1 + packages/icons/src/icons/last9.ts | 34 +++ packages/icons/src/raw-icons/last9.svg | 4 + 11 files changed, 409 insertions(+), 120 deletions(-) create mode 100644 packages/icons/src/icons/last9.ts create mode 100644 packages/icons/src/raw-icons/last9.svg diff --git a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx index dbaf733022e..d44db9b5e40 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrainDestinationSheetForm.tsx @@ -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({ ) => - form.setValue('type', v) - } + onValueChange={(v: LogDrainType) => form.setValue('type', v)} > {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) => ( )} + {type === 'last9' && ( +
+ ( + + The Last9 region to send logs to. Credentials can be obtained from the + Last9 OTEL integration panel. +

+ } + > + + + + + + + + Region + {LAST9_REGIONS.map((reg) => ( + + {reg.label} + + ))} + + + + +
+ )} + /> + + +
+ )} diff --git a/apps/studio/components/interfaces/LogDrains/LogDrains.constants.tsx b/apps/studio/components/interfaces/LogDrains/LogDrains.constants.tsx index d7c05de2f75..10c361b915a 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrains.constants.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrains.constants.tsx @@ -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: , }, + { + value: 'last9', + name: 'Last9', + description: 'Last9 is an observability platform for monitoring and telemetry data', + icon: , + }, ] 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 diff --git a/apps/studio/components/interfaces/LogDrains/LogDrains.tsx b/apps/studio/components/interfaces/LogDrains/LogDrains.tsx index 66e47bbf43c..f9eb7436d21 100644 --- a/apps/studio/components/interfaces/LogDrains/LogDrains.tsx +++ b/apps/studio/components/interfaces/LogDrains/LogDrains.tsx @@ -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) => ( { 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) => ( = [ svg: "\n \n", jsx: "import { Integrations } from \"icons\"\n \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 ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIzLjk0MzEgMTMuMTczN0wyMi43NDg3IDEzLjA1NzVDMjIuNzgyNiAxMi43MDkgMjIuOCAxMi4zNTUyIDIyLjggMTEuOTk3MUMyMi44IDExLjYzODkgMjIuNzgyNiAxMS4yODUyIDIyLjc0ODcgMTAuOTM2NkwyMy45NDMxIDEwLjgyMDRDMjMuOTgwNyAxMS4yMDc1IDI0IDExLjYgMjQgMTEuOTk3MUMyNCAxMi4zOTQxIDIzLjk4MDcgMTIuNzg2NiAyMy45NDMxIDEzLjE3MzdaTTIzLjQ4NjIgOC41MTI1TDIyLjMzNzggOC44NjA0QzIyLjEzMSA4LjE3ODA3IDIxLjg1ODUgNy41MjQxMyAyMS41MjczIDYuOTA1ODhMMjIuNTg1MiA2LjMzOTNDMjIuOTUzMiA3LjAyNjQyIDIzLjI1NjMgNy43NTM1NiAyMy40ODYyIDguNTEyNVpNMjEuMjc2NSA0LjM4NDIzTDIwLjM0OTMgNS4xNDYwM0MxOS45IDQuNTk5MTMgMTkuMzk4IDQuMDk3MTEgMTguODUxIDMuNjQ3NzdMMTkuNjEyOSAyLjcyMDU5QzIwLjIyMDEgMy4yMTk1NCAyMC43Nzc1IDMuNzY5NiAyMS4yNzY1IDQuMzg0MjNaTTE3LjY1NzcgMS40MTE4OEwxNy4wOTEyIDIuNDY5N0MxNi40NzI5IDIuMTM4NTcgMTUuODE5IDEuODY2MDEgMTUuMTM2NiAxLjY1OTI4TDE1LjQ4NDYgMC41MTA4MjlDMTYuMjQzNSAwLjc0MDc2IDE2Ljk3MDYgMS4wNDM4NCAxNy42NTc3IDEuNDExODhaTTEzLjE3NjcgMC4wNTQwMjYyTDEzLjA2MDQgMS4yNDgzOUMxMi43MTE5IDEuMjE0NDYgMTIuMzU4MSAxLjE5NzA3IDEyIDEuMTk3MDdDMTEuNjQxOSAxLjE5NzA3IDExLjI4ODEgMS4yMTQ0NiAxMC45Mzk2IDEuMjQ4MzlMMTAuODIzMyAwLjA1NDAyNjNDMTEuMjEwNCAwLjAxNjM1MDcgMTEuNjAzIC0wLjAwMjkyOTY5IDEyIC0wLjAwMjkyOTY5QzEyLjM5NyAtMC4wMDI5Mjk2OSAxMi43ODk1IDAuMDE2MzUwNyAxMy4xNzY3IDAuMDU0MDI2MlpNOC41MTUzOCAwLjUxMDgyOUw4Ljg2MzMyIDEuNjU5MjhDOC4xODEgMS44NjYwMSA3LjUyNzA2IDIuMTM4NTcgNi45MDg4MiAyLjQ2OTdMNi4zNDIyNCAxLjQxMTg4QzcuMDI5MzYgMS4wNDM4NCA3Ljc1NjUgMC43NDA3NiA4LjUxNTM4IDAuNTEwODI5Wk00LjM4NzE2IDIuNzIwNTlMNS4xNDg5NSAzLjY0Nzc3QzQuNjAyMDcgNC4wOTcxMSA0LjEwMDA0IDQuNTk5MTMgMy42NTA3IDUuMTQ2MDNMMi43MjM1MiA0LjM4NDIzQzMuMjIyNDcgMy43Njk2IDMuNzcyNTMgMy4yMTk1NCA0LjM4NzE2IDIuNzIwNTlaTTEuNDE0ODEgNi4zMzkzTDIuNDcyNjMgNi45MDU4OEMyLjE0MTUxIDcuNTI0MTMgMS44Njg5NSA4LjE3ODA3IDEuNjYyMiA4Ljg2MDRMMC41MTM3OTMgOC41MTI1QzAuNzQzNjg4IDcuNzUzNTYgMS4wNDY3NyA3LjAyNjQyIDEuNDE0ODEgNi4zMzkzWk0wLjA1Njk1NTkgMTAuODIwNEMwLjAxOTI4MDMgMTEuMjA3NSAwIDExLjYgMCAxMS45OTcxQzAgMTIuMzk0MSAwLjAxOTI4MDQgMTIuNzg2NiAwLjA1Njk1NiAxMy4xNzM3TDEuMjUxMzEgMTMuMDU3NUMxLjIxNzM5IDEyLjcwOSAxLjIgMTIuMzU1MiAxLjIgMTEuOTk3MUMxLjIgMTEuNjM4OSAxLjIxNzM5IDExLjI4NTIgMS4yNTEzMSAxMC45MzY2TDAuMDU2OTU1OSAxMC44MjA0Wk0wLjUxMzc5NCAxNS40ODE3TDEuNjYyMiAxNS4xMzM3QzEuODY4OTUgMTUuODE2IDIuMTQxNTEgMTYuNDY5OSAyLjQ3MjYzIDE3LjA4ODJMMS40MTQ4MSAxNy42NTQ3QzEuMDQ2NzcgMTYuOTY3NiAwLjc0MzY4OCAxNi4yNDA1IDAuNTEzNzk0IDE1LjQ4MTdaTTIuNzIzNTIgMTkuNjA5OEwzLjY1MDcgMTguODQ4QzQuMTAwMDQgMTkuMzk0OSA0LjYwMjA3IDE5Ljg5NjkgNS4xNDg5NSAyMC4zNDYzTDQuMzg3MTYgMjEuMjczNUMzLjc3MjUzIDIwLjc3NDUgMy4yMjI0NyAyMC4yMjQ1IDIuNzIzNTIgMTkuNjA5OFpNNi4zNDIyNCAyMi41ODIxTDYuOTA4ODIgMjEuNTI0M0M3LjUyNzA2IDIxLjg1NTUgOC4xODEgMjIuMTI4IDguODYzMzIgMjIuMzM0N0w4LjUxNTM4IDIzLjQ4MzJDNy43NTY1IDIzLjI1MzMgNy4wMjkzNiAyMi45NTAyIDYuMzQyMjQgMjIuNTgyMVpNMTAuODIzMyAyMy45NDAxTDEwLjkzOTYgMjIuNzQ1N0MxMS4yODgxIDIyLjc3OTcgMTEuNjQxOSAyMi43OTcgMTIgMjIuNzk3QzEyLjM1ODEgMjIuNzk3IDEyLjcxMTkgMjIuNzc5NyAxMy4wNjA0IDIyLjc0NTdMMTMuMTc2NyAyMy45NDAxQzEyLjc4OTUgMjMuOTc3OCAxMi4zOTcgMjMuOTk3MSAxMiAyMy45OTcxQzExLjYwMyAyMy45OTcxIDExLjIxMDQgMjMuOTc3OCAxMC44MjMzIDIzLjk0MDFaTTE1LjQ4NDYgMjMuNDgzMkwxNS4xMzY2IDIyLjMzNDdDMTUuODE5IDIyLjEyOCAxNi40NzI5IDIxLjg1NTUgMTcuMDkxMiAyMS41MjQzTDE3LjY1NzcgMjIuNTgyMUMxNi45NzA2IDIyLjk1MDIgMTYuMjQzNSAyMy4yNTMzIDE1LjQ4NDYgMjMuNDgzMlpNMTkuNjEyOSAyMS4yNzM1TDE4Ljg1MSAyMC4zNDYzQzE5LjM5OCAxOS44OTY5IDE5LjkgMTkuMzk0OSAyMC4zNDkzIDE4Ljg0OEwyMS4yNzY1IDE5LjYwOThDMjAuNzc3NSAyMC4yMjQ1IDIwLjIyMDEgMjAuNzc0NSAxOS42MTI5IDIxLjI3MzVaTTIyLjU4NTIgMTcuNjU0N0wyMS41MjczIDE3LjA4ODJDMjEuODU4NSAxNi40Njk5IDIyLjEzMSAxNS44MTYgMjIuMzM3OCAxNS4xMzM3TDIzLjQ4NjIgMTUuNDgxN0MyMy4yNTYzIDE2LjI0MDUgMjIuOTUzMiAxNi45Njc2IDIyLjU4NTIgMTcuNjU0N1oiIGZpbGw9ImN1cnJlbnRDb2xvciIvPgo8cGF0aCBkPSJNNy4yIDkuNjY2NDJDNy4yIDEyLjM5OTQgOS4wNzgxMiAxNC4yOTMgMTEuNzI0MiAxNC4yOTNDMTIuMTIyMiAxNC4yOTMgMTIuNDk5MiAxNC4yMjM3IDEyLjg0ODMgMTQuMTMzNUw5LjM4NTMyIDE5LjE5NzFIMTIuNDIyNEwxNS43MzE4IDE0LjMyNzdDMTYuOTYwNSAxMi41MTA0IDE3LjU1NCAxMS4xMDIzIDE3LjU2OCA5LjYwNDAyQzE3LjU3NSA2LjU1MiAxNS4xNzMyIDQuNzk3MDcgMTIuMzMxNiA0Ljc5NzA3QzkuMzUwNCA0Ljc5NzA3IDcuMiA2Ljc0NjIyIDcuMiA5LjY2NjQyWk0xMC4xMDQ0IDkuNTYyMzhDMTAuMTA0NCA4LjE1NDMgMTEuMDI2IDcuMTQxNTYgMTIuMzQ1NiA3LjE0MTU2QzEzLjY3MjEgNy4xNDE1NiAxNC42MDc3IDguMTU0MyAxNC42MDc3IDkuNTc2MjRDMTQuNjA3NyAxMC45ODQzIDEzLjY3MjEgMTEuOTgzMiAxMi4zNDU2IDExLjk4MzJDMTEuMDI2IDExLjk4MzIgMTAuMTA0NCAxMC45ODQzIDEwLjEwNDQgOS41NjIzOFoiIGZpbGw9ImN1cnJlbnRDb2xvciIvPgo8L3N2Zz4K)\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.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',\n fill: 'currentColor',\n key: '1bcx6p',\n },\n ],\n [\n 'path',\n {\n 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',\n fill: 'currentColor',\n key: '1vyu7g',\n },\n ],\n]);\n\nexport default Last9;\n", + component: React.lazy(() => import('icons/src/icons/last9')), + import: "import { Last9 } from 'icons'", + svg: "\n\n\n\n", + jsx: "import { Last9 } from \"icons\"\n \n " +}, { name: "logs", componentName: "Logs", diff --git a/packages/icons/src/icons/index.ts b/packages/icons/src/icons/index.ts index 4c8bca21ba9..1f3dcfd5392 100644 --- a/packages/icons/src/icons/index.ts +++ b/packages/icons/src/icons/index.ts @@ -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'; diff --git a/packages/icons/src/icons/last9.ts b/packages/icons/src/icons/last9.ts new file mode 100644 index 00000000000..079a554139a --- /dev/null +++ b/packages/icons/src/icons/last9.ts @@ -0,0 +1,34 @@ +import createSupabaseIcon from '../createSupabaseIcon'; + +/** + * @component @name Last9 + * @description Supabase SVG icon component, renders SVG Element with children. + * + * @preview ![img](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIzLjk0MzEgMTMuMTczN0wyMi43NDg3IDEzLjA1NzVDMjIuNzgyNiAxMi43MDkgMjIuOCAxMi4zNTUyIDIyLjggMTEuOTk3MUMyMi44IDExLjYzODkgMjIuNzgyNiAxMS4yODUyIDIyLjc0ODcgMTAuOTM2NkwyMy45NDMxIDEwLjgyMDRDMjMuOTgwNyAxMS4yMDc1IDI0IDExLjYgMjQgMTEuOTk3MUMyNCAxMi4zOTQxIDIzLjk4MDcgMTIuNzg2NiAyMy45NDMxIDEzLjE3MzdaTTIzLjQ4NjIgOC41MTI1TDIyLjMzNzggOC44NjA0QzIyLjEzMSA4LjE3ODA3IDIxLjg1ODUgNy41MjQxMyAyMS41MjczIDYuOTA1ODhMMjIuNTg1MiA2LjMzOTNDMjIuOTUzMiA3LjAyNjQyIDIzLjI1NjMgNy43NTM1NiAyMy40ODYyIDguNTEyNVpNMjEuMjc2NSA0LjM4NDIzTDIwLjM0OTMgNS4xNDYwM0MxOS45IDQuNTk5MTMgMTkuMzk4IDQuMDk3MTEgMTguODUxIDMuNjQ3NzdMMTkuNjEyOSAyLjcyMDU5QzIwLjIyMDEgMy4yMTk1NCAyMC43Nzc1IDMuNzY5NiAyMS4yNzY1IDQuMzg0MjNaTTE3LjY1NzcgMS40MTE4OEwxNy4wOTEyIDIuNDY5N0MxNi40NzI5IDIuMTM4NTcgMTUuODE5IDEuODY2MDEgMTUuMTM2NiAxLjY1OTI4TDE1LjQ4NDYgMC41MTA4MjlDMTYuMjQzNSAwLjc0MDc2IDE2Ljk3MDYgMS4wNDM4NCAxNy42NTc3IDEuNDExODhaTTEzLjE3NjcgMC4wNTQwMjYyTDEzLjA2MDQgMS4yNDgzOUMxMi43MTE5IDEuMjE0NDYgMTIuMzU4MSAxLjE5NzA3IDEyIDEuMTk3MDdDMTEuNjQxOSAxLjE5NzA3IDExLjI4ODEgMS4yMTQ0NiAxMC45Mzk2IDEuMjQ4MzlMMTAuODIzMyAwLjA1NDAyNjNDMTEuMjEwNCAwLjAxNjM1MDcgMTEuNjAzIC0wLjAwMjkyOTY5IDEyIC0wLjAwMjkyOTY5QzEyLjM5NyAtMC4wMDI5Mjk2OSAxMi43ODk1IDAuMDE2MzUwNyAxMy4xNzY3IDAuMDU0MDI2MlpNOC41MTUzOCAwLjUxMDgyOUw4Ljg2MzMyIDEuNjU5MjhDOC4xODEgMS44NjYwMSA3LjUyNzA2IDIuMTM4NTcgNi45MDg4MiAyLjQ2OTdMNi4zNDIyNCAxLjQxMTg4QzcuMDI5MzYgMS4wNDM4NCA3Ljc1NjUgMC43NDA3NiA4LjUxNTM4IDAuNTEwODI5Wk00LjM4NzE2IDIuNzIwNTlMNS4xNDg5NSAzLjY0Nzc3QzQuNjAyMDcgNC4wOTcxMSA0LjEwMDA0IDQuNTk5MTMgMy42NTA3IDUuMTQ2MDNMMi43MjM1MiA0LjM4NDIzQzMuMjIyNDcgMy43Njk2IDMuNzcyNTMgMy4yMTk1NCA0LjM4NzE2IDIuNzIwNTlaTTEuNDE0ODEgNi4zMzkzTDIuNDcyNjMgNi45MDU4OEMyLjE0MTUxIDcuNTI0MTMgMS44Njg5NSA4LjE3ODA3IDEuNjYyMiA4Ljg2MDRMMC41MTM3OTMgOC41MTI1QzAuNzQzNjg4IDcuNzUzNTYgMS4wNDY3NyA3LjAyNjQyIDEuNDE0ODEgNi4zMzkzWk0wLjA1Njk1NTkgMTAuODIwNEMwLjAxOTI4MDMgMTEuMjA3NSAwIDExLjYgMCAxMS45OTcxQzAgMTIuMzk0MSAwLjAxOTI4MDQgMTIuNzg2NiAwLjA1Njk1NiAxMy4xNzM3TDEuMjUxMzEgMTMuMDU3NUMxLjIxNzM5IDEyLjcwOSAxLjIgMTIuMzU1MiAxLjIgMTEuOTk3MUMxLjIgMTEuNjM4OSAxLjIxNzM5IDExLjI4NTIgMS4yNTEzMSAxMC45MzY2TDAuMDU2OTU1OSAxMC44MjA0Wk0wLjUxMzc5NCAxNS40ODE3TDEuNjYyMiAxNS4xMzM3QzEuODY4OTUgMTUuODE2IDIuMTQxNTEgMTYuNDY5OSAyLjQ3MjYzIDE3LjA4ODJMMS40MTQ4MSAxNy42NTQ3QzEuMDQ2NzcgMTYuOTY3NiAwLjc0MzY4OCAxNi4yNDA1IDAuNTEzNzk0IDE1LjQ4MTdaTTIuNzIzNTIgMTkuNjA5OEwzLjY1MDcgMTguODQ4QzQuMTAwMDQgMTkuMzk0OSA0LjYwMjA3IDE5Ljg5NjkgNS4xNDg5NSAyMC4zNDYzTDQuMzg3MTYgMjEuMjczNUMzLjc3MjUzIDIwLjc3NDUgMy4yMjI0NyAyMC4yMjQ1IDIuNzIzNTIgMTkuNjA5OFpNNi4zNDIyNCAyMi41ODIxTDYuOTA4ODIgMjEuNTI0M0M3LjUyNzA2IDIxLjg1NTUgOC4xODEgMjIuMTI4IDguODYzMzIgMjIuMzM0N0w4LjUxNTM4IDIzLjQ4MzJDNy43NTY1IDIzLjI1MzMgNy4wMjkzNiAyMi45NTAyIDYuMzQyMjQgMjIuNTgyMVpNMTAuODIzMyAyMy45NDAxTDEwLjkzOTYgMjIuNzQ1N0MxMS4yODgxIDIyLjc3OTcgMTEuNjQxOSAyMi43OTcgMTIgMjIuNzk3QzEyLjM1ODEgMjIuNzk3IDEyLjcxMTkgMjIuNzc5NyAxMy4wNjA0IDIyLjc0NTdMMTMuMTc2NyAyMy45NDAxQzEyLjc4OTUgMjMuOTc3OCAxMi4zOTcgMjMuOTk3MSAxMiAyMy45OTcxQzExLjYwMyAyMy45OTcxIDExLjIxMDQgMjMuOTc3OCAxMC44MjMzIDIzLjk0MDFaTTE1LjQ4NDYgMjMuNDgzMkwxNS4xMzY2IDIyLjMzNDdDMTUuODE5IDIyLjEyOCAxNi40NzI5IDIxLjg1NTUgMTcuMDkxMiAyMS41MjQzTDE3LjY1NzcgMjIuNTgyMUMxNi45NzA2IDIyLjk1MDIgMTYuMjQzNSAyMy4yNTMzIDE1LjQ4NDYgMjMuNDgzMlpNMTkuNjEyOSAyMS4yNzM1TDE4Ljg1MSAyMC4zNDYzQzE5LjM5OCAxOS44OTY5IDE5LjkgMTkuMzk0OSAyMC4zNDkzIDE4Ljg0OEwyMS4yNzY1IDE5LjYwOThDMjAuNzc3NSAyMC4yMjQ1IDIwLjIyMDEgMjAuNzc0NSAxOS42MTI5IDIxLjI3MzVaTTIyLjU4NTIgMTcuNjU0N0wyMS41MjczIDE3LjA4ODJDMjEuODU4NSAxNi40Njk5IDIyLjEzMSAxNS44MTYgMjIuMzM3OCAxNS4xMzM3TDIzLjQ4NjIgMTUuNDgxN0MyMy4yNTYzIDE2LjI0MDUgMjIuOTUzMiAxNi45Njc2IDIyLjU4NTIgMTcuNjU0N1oiIGZpbGw9ImN1cnJlbnRDb2xvciIvPgo8cGF0aCBkPSJNNy4yIDkuNjY2NDJDNy4yIDEyLjM5OTQgOS4wNzgxMiAxNC4yOTMgMTEuNzI0MiAxNC4yOTNDMTIuMTIyMiAxNC4yOTMgMTIuNDk5MiAxNC4yMjM3IDEyLjg0ODMgMTQuMTMzNUw5LjM4NTMyIDE5LjE5NzFIMTIuNDIyNEwxNS43MzE4IDE0LjMyNzdDMTYuOTYwNSAxMi41MTA0IDE3LjU1NCAxMS4xMDIzIDE3LjU2OCA5LjYwNDAyQzE3LjU3NSA2LjU1MiAxNS4xNzMyIDQuNzk3MDcgMTIuMzMxNiA0Ljc5NzA3QzkuMzUwNCA0Ljc5NzA3IDcuMiA2Ljc0NjIyIDcuMiA5LjY2NjQyWk0xMC4xMDQ0IDkuNTYyMzhDMTAuMTA0NCA4LjE1NDMgMTEuMDI2IDcuMTQxNTYgMTIuMzQ1NiA3LjE0MTU2QzEzLjY3MjEgNy4xNDE1NiAxNC42MDc3IDguMTU0MyAxNC42MDc3IDkuNTc2MjRDMTQuNjA3NyAxMC45ODQzIDEzLjY3MjEgMTEuOTgzMiAxMi4zNDU2IDExLjk4MzJDMTEuMDI2IDExLjk4MzIgMTAuMTA0NCAxMC45ODQzIDEwLjEwNDQgOS41NjIzOFoiIGZpbGw9ImN1cnJlbnRDb2xvciIvPgo8L3N2Zz4K) + * + * @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; diff --git a/packages/icons/src/raw-icons/last9.svg b/packages/icons/src/raw-icons/last9.svg new file mode 100644 index 00000000000..bf2addc1001 --- /dev/null +++ b/packages/icons/src/raw-icons/last9.svg @@ -0,0 +1,4 @@ + + + +