Skip to content

chore(clerk-js): Add API Keys component descriptors #6095

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 113 commits into from
Jun 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
cbee2b1
chore: set initial files for new component
wobsoriano May 5, 2025
c5c254d
chore: add resources and test methods
wobsoriano May 6, 2025
a1dfa60
chore(clerk-js): Remove Clerk.commerce (#5846)
brkalow May 6, 2025
cb1961e
chore: add simple table with calls to fapi
wobsoriano May 6, 2025
44cfd15
chore: use built in components
wobsoriano May 6, 2025
3a6d206
chore: add fake form
wobsoriano May 7, 2025
e4d26a5
chore: fix bad rebase
wobsoriano May 7, 2025
6a914c5
chore: fix bad rebase
wobsoriano May 7, 2025
beb0a44
chore: add create api key func
wobsoriano May 7, 2025
7294f7e
chore: add prop types and improve fetching
wobsoriano May 7, 2025
b2ff5a4
chore: add React component
wobsoriano May 7, 2025
83789d0
chore: accept props
wobsoriano May 7, 2025
de59b53
chore: add copy button functionality
wobsoriano May 7, 2025
3b4c715
chore: fetch secret on clipboard copy
wobsoriano May 7, 2025
b15610e
chore: add api key revokation
wobsoriano May 7, 2025
a0feb7a
chore: set minimum fields
wobsoriano May 8, 2025
a8a4f2f
chore: add pagination and improve form
wobsoriano May 8, 2025
ae65149
chore: try refetch
wobsoriano May 8, 2025
4b25f0f
chore: fix revalidation and more styling
wobsoriano May 9, 2025
69925f7
chore: rename component to <ApiKeys />
wobsoriano May 9, 2025
8de8219
chore: add expiration field
wobsoriano May 9, 2025
7c7e3e0
chore: add api keys component or user and org profile
wobsoriano May 9, 2025
f19825c
chore: add missing org profile sidebar nav
wobsoriano May 9, 2025
fb78ddc
chore: clean up props
wobsoriano May 9, 2025
0b2712c
chore: clean up props
wobsoriano May 9, 2025
ece97b3
chore: add api key secret fetcher and clean up components
wobsoriano May 13, 2025
bdecb55
chore: adjust table heading widths
wobsoriano May 13, 2025
1e338ec
chore: improve secret fetching
wobsoriano May 13, 2025
277b98c
chore: improve secret fetching
wobsoriano May 13, 2025
5faa5cf
chore: add locales
wobsoriano May 13, 2025
4377046
chore: action locales
wobsoriano May 13, 2025
137860c
chore: add locales to api keys page in user and org profile
wobsoriano May 14, 2025
5523b1a
chore: switch to swr for fetching
wobsoriano May 15, 2025
944ec76
chore: clean up fetchers and mutations
wobsoriano May 15, 2025
af99cab
chore: add initial error handling
wobsoriano May 15, 2025
b5c92e6
chore: add footer
wobsoriano May 16, 2025
0ee39fc
chore: add save button locale
wobsoriano May 16, 2025
57bf204
chore: fix close form btn
wobsoriano May 16, 2025
00d6d0b
chore: use description field and add custom expiration
wobsoriano May 16, 2025
f49a918
chore: add last used field
wobsoriano May 16, 2025
8ff06fe
chore: remove unused function
wobsoriano May 17, 2025
0f05f25
chore: add card width
wobsoriano May 17, 2025
7266d96
chore: add card width
wobsoriano May 17, 2025
6708873
chore: add custom page locales
wobsoriano May 19, 2025
6143e08
chore: rename component to APIKeys
wobsoriano May 19, 2025
bc0670a
Update packages/clerk-js/src/ui/components/ApiKeys/ApiKeysTable.tsx
wobsoriano May 20, 2025
2bdc6ff
Update packages/clerk-js/src/ui/components/ApiKeys/ApiKeysTable.tsx
wobsoriano May 20, 2025
2a0f715
Update packages/clerk-js/src/ui/components/ApiKeys/ApiKeysTable.tsx
wobsoriano May 20, 2025
0692f77
Update packages/clerk-js/src/ui/components/ApiKeys/ApiKeysTable.tsx
wobsoriano May 20, 2025
92c4c1d
Update packages/clerk-js/src/ui/components/ApiKeys/ApiKeysTable.tsx
wobsoriano May 20, 2025
75bc440
chore: adjustments to fetch calls
wobsoriano May 20, 2025
171a72b
chore: apply design suggestions
wobsoriano May 20, 2025
f520d87
chore: remove extra margin
wobsoriano May 20, 2025
14fa49b
chore: introduce revoke confirm dialog
wobsoriano May 23, 2025
44a3fe7
chore: make form and table responsive
wobsoriano May 23, 2025
c45b106
chore: clean up name casing
wobsoriano May 23, 2025
d0b4f05
chore: export APIKeys in nextjs
wobsoriano May 23, 2025
0b6de03
chore: fix merge conflicts
wobsoriano May 23, 2025
ee41a27
chore: add changeset
wobsoriano May 23, 2025
2b8096b
chore: update code icon
wobsoriano May 24, 2025
3375760
Update packages/clerk-js/src/ui/components/ApiKeys/ApiKeys.tsx
wobsoriano May 28, 2025
cd50d3e
chore: adjustments to table padding
wobsoriano May 28, 2025
d705977
chore: prevent layout shift in date input and segmented control buttons
wobsoriano May 28, 2025
0130c63
chore: move segmented control styling to root
wobsoriano May 28, 2025
6d25929
chore(clerk-js,types): Conditionally render API Keys page based on en…
wobsoriano May 30, 2025
163ff71
chore: remove unused component
wobsoriano May 30, 2025
2e38987
fix types
wobsoriano May 30, 2025
3cbf876
fix types
wobsoriano May 30, 2025
398cbfb
chore: update changesets
wobsoriano May 30, 2025
26c11b8
chore: fix snapshot tests
wobsoriano May 30, 2025
518dbbb
chore: fix react-router snapshot tests
wobsoriano May 30, 2025
4aea430
chore: fix chrome-extension snapshot tests
wobsoriano May 30, 2025
aa0adf6
chore: fix typedoc tests
wobsoriano May 30, 2025
c23d4b0
Update ApiKeysTable.tsx
wobsoriano Jun 2, 2025
8d09a9f
Update packages/localizations/src/de-DE.ts
wobsoriano Jun 3, 2025
6857961
Update packages/localizations/src/de-DE.ts
wobsoriano Jun 3, 2025
3380f9a
Update packages/localizations/src/de-DE.ts
wobsoriano Jun 3, 2025
bdef2fe
Update packages/localizations/src/de-DE.ts
wobsoriano Jun 3, 2025
aa69753
Update packages/localizations/src/de-DE.ts
wobsoriano Jun 3, 2025
87926e4
Update .changeset/ninety-candles-sleep.md
wobsoriano Jun 3, 2025
28894eb
Update .changeset/fluffy-numbers-stick.md
wobsoriano Jun 3, 2025
aac35e7
Apply suggestions from code review
wobsoriano Jun 3, 2025
3f7b3b2
fix: pass correct subject when used inside pages
wobsoriano Jun 3, 2025
d54ea6c
chore: update bundlewatch config
wobsoriano Jun 3, 2025
f0efd21
remove barrel files
wobsoriano Jun 3, 2025
24cb76d
chore: avoid barrel files
wobsoriano Jun 3, 2025
7a52029
Merge branch 'main' into rob/robo-20-manage-api-keys
wobsoriano Jun 5, 2025
062b2fe
fix incorrect merge
wobsoriano Jun 5, 2025
a996bbc
mark methods as experimental
wobsoriano Jun 5, 2025
666c0cb
adjust bundle size
wobsoriano Jun 5, 2025
bb96131
Merge branch 'main' into rob/robo-20-manage-api-keys
wobsoriano Jun 6, 2025
58b72f2
Merge branch 'main' into rob/robo-20-manage-api-keys
wobsoriano Jun 8, 2025
b180828
chore(clerk-js): Move API Keys methods to its own module (#6089)
wobsoriano Jun 8, 2025
2f87215
chore: localize time ago
wobsoriano Jun 10, 2025
e1e5b22
Merge branch 'main' into rob/robo-20-manage-api-keys
wobsoriano Jun 10, 2025
49643a4
chore: fix environment snapshot test
wobsoriano Jun 10, 2025
7874acc
chore: bundlewatch adjustment
wobsoriano Jun 10, 2025
44b06ca
Revert locale files to main except en-US and de-DE; keep customizations
wobsoriano Jun 10, 2025
d13edad
chore: add element descriptors to allow modifying APIkeys component
wobsoriano Jun 10, 2025
df7ed68
Merge remote-tracking branch 'origin/main' into rob/api-keys-element-…
wobsoriano Jun 17, 2025
756944a
merge conflicts
wobsoriano Jun 17, 2025
30ddfd2
fix merge conflicts
wobsoriano Jun 17, 2025
7a7ffd9
chore: add top level modal descriptor
wobsoriano Jun 17, 2025
b9b994f
chore: add changeset
wobsoriano Jun 17, 2025
32676a3
chore: adjust bundlewatch config
wobsoriano Jun 17, 2025
c398ad6
chore: adjust bundlewatch config
wobsoriano Jun 17, 2025
2f574c8
chore: remove custom ids
wobsoriano Jun 17, 2025
c17db98
chore: add element descritor to search box
wobsoriano Jun 17, 2025
f5f553a
chore: add table head, body and row default descriptors
wobsoriano Jun 17, 2025
98481c0
chore: remove unused descriptors
wobsoriano Jun 17, 2025
d85540a
Merge branch 'main' into rob/api-keys-element-descriptors
wobsoriano Jun 18, 2025
ccb6b2c
chore: add default descriptors to cells
wobsoriano Jun 18, 2025
8e38cd6
chore: adjust bundlewatch config
wobsoriano Jun 18, 2025
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
6 changes: 6 additions & 0 deletions .changeset/chilly-pears-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@clerk/clerk-js": patch
"@clerk/types": patch
---

Add element descriptors to `<APIKeys />` component
2 changes: 1 addition & 1 deletion packages/clerk-js/bundlewatch.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{ "path": "./dist/clerk.browser.js", "maxSize": "70.16KB" },
{ "path": "./dist/clerk.legacy.browser.js", "maxSize": "113KB" },
{ "path": "./dist/clerk.headless*.js", "maxSize": "53.06KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "108.4KB" },
{ "path": "./dist/ui-common*.js", "maxSize": "108.54KB" },
{ "path": "./dist/vendors*.js", "maxSize": "40.2KB" },
{ "path": "./dist/coinbase*.js", "maxSize": "38KB" },
{ "path": "./dist/createorganization*.js", "maxSize": "5KB" },
Expand Down
19 changes: 17 additions & 2 deletions packages/clerk-js/src/ui/components/ApiKeys/ApiKeys.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,17 @@ import { lazy, useState } from 'react';
import useSWRMutation from 'swr/mutation';

import { useApiKeysContext, withCoreUserGuard } from '@/ui/contexts';
import { Box, Button, Col, Flex, Flow, Icon, localizationKeys, useLocalizations } from '@/ui/customizables';
import {
Box,
Button,
Col,
descriptors,
Flex,
Flow,
Icon,
localizationKeys,
useLocalizations,
} from '@/ui/customizables';
import { Action } from '@/ui/elements/Action';
import { useCardState, withCardStateProvider } from '@/ui/elements/contexts';
import { InputWithIcon } from '@/ui/elements/InputWithIcon';
Expand Down Expand Up @@ -81,6 +91,7 @@ export const APIKeysPage = ({ subject, perPage, revokeModalRoot }: APIKeysPagePr
<Col
gap={4}
sx={{ width: '100%' }}
elementDescriptor={descriptors.apiKeys}
>
<Action.Root>
<Flex
Expand All @@ -93,8 +104,9 @@ export const APIKeysPage = ({ subject, perPage, revokeModalRoot }: APIKeysPagePr
alignItems: 'stretch',
},
}}
elementDescriptor={descriptors.apiKeysHeader}
>
<Box>
<Box elementDescriptor={descriptors.apiKeysSearchBox}>
<InputWithIcon
placeholder={t(localizationKeys('apiKeys.action__search'))}
leftIcon={<Icon icon={MagnifyingGlass} />}
Expand All @@ -103,6 +115,7 @@ export const APIKeysPage = ({ subject, perPage, revokeModalRoot }: APIKeysPagePr
setSearch(e.target.value);
setPage(1);
}}
elementDescriptor={descriptors.apiKeysSearchInput}
/>
</Box>
<Action.Trigger
Expand All @@ -112,6 +125,7 @@ export const APIKeysPage = ({ subject, perPage, revokeModalRoot }: APIKeysPagePr
<Button
variant='solid'
localizationKey={localizationKeys('apiKeys.action__add')}
elementDescriptor={descriptors.apiKeysAddButton}
/>
</Action.Trigger>
</Flex>
Expand All @@ -130,6 +144,7 @@ export const APIKeysPage = ({ subject, perPage, revokeModalRoot }: APIKeysPagePr
rows={apiKeys}
isLoading={isLoading}
onRevoke={handleRevoke}
elementDescriptor={descriptors.apiKeysTable}
/>
{itemCount > (perPage ?? 5) && (
<Pagination
Expand Down
10 changes: 9 additions & 1 deletion packages/clerk-js/src/ui/components/ApiKeys/ApiKeysTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
Thead,
Tr,
} from '@/ui/customizables';
import type { ElementDescriptor } from '@/ui/customizables/elementDescriptors';
import { ThreeDotsMenu } from '@/ui/elements/ThreeDotsMenu';
import { useClipboard } from '@/ui/hooks';
import { Check, ClipboardOutline, Eye, EyeSlash } from '@/ui/icons';
Expand Down Expand Up @@ -50,6 +51,7 @@ const CopySecretButton = ({ apiKeyID }: { apiKeyID: string }) => {
aria-label={hasCopied ? 'Copied API key to clipboard' : 'Copy API key'}
onClick={() => setEnabled(true)}
focusRing={false}
elementDescriptor={descriptors.apiKeysCopyButton}
>
<Icon
size='sm'
Expand Down Expand Up @@ -92,6 +94,7 @@ const SecretInputWithToggle = ({ apiKeyID }: { apiKeyID: string }) => {
})}
focusRing={false}
aria-label={'Show key'}
elementDescriptor={descriptors.apiKeysRevealButton}
onClick={() => setRevealed(!revealed)}
>
<Icon
Expand All @@ -107,14 +110,19 @@ export const ApiKeysTable = ({
rows,
isLoading,
onRevoke,
elementDescriptor,
}: {
rows: APIKeyResource[];
isLoading: boolean;
onRevoke: (id: string, name: string) => void;
elementDescriptor?: ElementDescriptor;
}) => {
return (
<Flex sx={t => ({ width: '100%', [mqu.sm]: { overflowX: 'auto', padding: t.space.$0x25 } })}>
<Table sx={t => ({ background: t.colors.$colorBackground })}>
<Table
sx={t => ({ background: t.colors.$colorBackground })}
elementDescriptor={elementDescriptor}
>
<Thead>
<Tr>
<Th>Name</Th>
Expand Down
15 changes: 12 additions & 3 deletions packages/clerk-js/src/ui/components/ApiKeys/CreateApiKeyForm.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState } from 'react';

import { Box, Button, Col, Flex, FormLabel, localizationKeys, Text } from '@/ui/customizables';
import { Box, Button, Col, descriptors, Flex, FormLabel, localizationKeys, Text } from '@/ui/customizables';
import { useActionContext } from '@/ui/elements/Action/ActionRoot';
import { Form } from '@/ui/elements/Form';
import { FormButtons } from '@/ui/elements/FormButtons';
Expand Down Expand Up @@ -97,14 +97,21 @@ export const CreateApiKeyForm = ({ onCreate, isSubmitting }: CreateApiKeyFormPro
<FormContainer
headerTitle={localizationKeys('apiKeys.formTitle')}
headerSubtitle={localizationKeys('apiKeys.formHint')}
elementDescriptor={descriptors.apiKeysCreateForm}
>
<Form.Root onSubmit={handleSubmit}>
<Form.ControlRow elementId={nameField.id}>
<Form.ControlRow
elementId={nameField.id}
elementDescriptor={descriptors.apiKeysCreateFormNameInput}
>
<Form.PlainInput {...nameField.props} />
</Form.ControlRow>
{showAdvanced && (
<>
<Form.ControlRow elementId={descriptionField.id}>
<Form.ControlRow
elementId={descriptionField.id}
elementDescriptor={descriptors.apiKeysCreateFormDescriptionInput}
>
<Form.PlainInput {...descriptionField.props} />
</Form.ControlRow>
<Flex
Expand Down Expand Up @@ -155,6 +162,7 @@ export const CreateApiKeyForm = ({ onCreate, isSubmitting }: CreateApiKeyFormPro
<Form.ControlRow
elementId={expirationDateField.id}
sx={{ flex: 3 }}
elementDescriptor={descriptors.apiKeysCreateFormExpirationInput}
>
<Form.PlainInput
type='date'
Expand Down Expand Up @@ -190,6 +198,7 @@ export const CreateApiKeyForm = ({ onCreate, isSubmitting }: CreateApiKeyFormPro
isDisabled={!canSubmit}
onReset={closeCardFn}
isLoading={isSubmitting}
elementDescriptor={descriptors.apiKeysCreateFormSubmitButton}
/>
</Flex>
</Form.Root>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { useClerk } from '@clerk/shared/react';
import { useSWRConfig } from 'swr';

import { descriptors } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { Form } from '@/ui/elements/Form';
import { FormButtons } from '@/ui/elements/FormButtons';
Expand Down Expand Up @@ -37,6 +38,7 @@ export const RevokeAPIKeyConfirmationModal = ({

await clerk.apiKeys.revoke({ apiKeyID: apiKeyId });
const cacheKey = { key: 'api-keys', subject };

void mutate(cacheKey);
onClose();
};
Expand Down Expand Up @@ -79,7 +81,10 @@ export const RevokeAPIKeyConfirmationModal = ({
: {},
]}
>
<Card.Root role='alertdialog'>
<Card.Root
role='alertdialog'
elementDescriptor={descriptors.apiKeysRevokeModal}
>
<Card.Content
sx={t => ({
textAlign: 'left',
Expand All @@ -91,14 +96,18 @@ export const RevokeAPIKeyConfirmationModal = ({
headerSubtitle={localizationKeys('apiKeys.revokeConfirmation.formHint')}
>
<Form.Root onSubmit={handleSubmit}>
<Form.ControlRow elementId={revokeField.id}>
<Form.ControlRow
elementId={revokeField.id}
elementDescriptor={descriptors.apiKeysRevokeModalInput}
>
<Form.PlainInput {...revokeField.props} />
</Form.ControlRow>
<FormButtons
submitLabel={localizationKeys('apiKeys.revokeConfirmation.formButtonPrimary__revoke')}
colorScheme='danger'
isDisabled={!canSubmit}
onReset={onClose}
elementDescriptor={descriptors.apiKeysRevokeModalSubmitButton}
/>
</Form.Root>
</FormContainer>
Expand Down
1 change: 0 additions & 1 deletion packages/clerk-js/src/ui/components/ApiKeys/useApiKeys.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ export const useApiKeys = ({ subject, perPage = 5 }: { subject: string; perPage?
key: 'api-keys',
subject,
};

const { data: apiKeys, isLoading, mutate } = useSWR(cacheKey, () => clerk.apiKeys.getAll({ subject }));
const [search, setSearch] = useState('');
const filteredApiKeys = (apiKeys ?? []).filter(key => key.name.toLowerCase().includes(search.toLowerCase()));
Expand Down
21 changes: 21 additions & 0 deletions packages/clerk-js/src/ui/customizables/elementDescriptors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,10 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([
'tabListContainer',

'tableHead',
'tableBody',
'tableRow',
'tableHeaderCell',
'tableBodyCell',

'paginationButton',
'paginationButtonIcon',
Expand Down Expand Up @@ -458,6 +462,23 @@ export const APPEARANCE_KEYS = containsAllElementsConfigKeys([
'notificationBadge',
'buttonArrowIcon',
'spinner',

'apiKeys',
'apiKeysHeader',
'apiKeysSearchBox',
'apiKeysSearchInput',
'apiKeysAddButton',
'apiKeysTable',
'apiKeysCopyButton',
'apiKeysRevealButton',
'apiKeysCreateForm',
'apiKeysCreateFormNameInput',
'apiKeysCreateFormDescriptionInput',
'apiKeysCreateFormExpirationInput',
'apiKeysCreateFormSubmitButton',
'apiKeysRevokeModal',
'apiKeysRevokeModalInput',
'apiKeysRevokeModalSubmitButton',
] as const).map(camelize) as (keyof ElementsConfig)[];

type TargettableClassname<K extends keyof ElementsConfig> = `${typeof CLASS_PREFIX}${K}`;
Expand Down
14 changes: 9 additions & 5 deletions packages/clerk-js/src/ui/customizables/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,15 @@ export const NotificationBadge = makeCustomizable(makeLocalizable(sanitizeDomPro
});

export const Table = makeCustomizable(sanitizeDomProps(Primitives.Table), { defaultDescriptor: descriptors.table });
export const Thead = makeCustomizable(sanitizeDomProps(Primitives.Thead));
export const Tbody = makeCustomizable(sanitizeDomProps(Primitives.Tbody));
export const Tr = makeCustomizable(sanitizeDomProps(Primitives.Tr));
export const Th = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Th)));
export const Td = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Td)));
export const Thead = makeCustomizable(sanitizeDomProps(Primitives.Thead), { defaultDescriptor: descriptors.tableHead });
export const Tbody = makeCustomizable(sanitizeDomProps(Primitives.Tbody), { defaultDescriptor: descriptors.tableBody });
export const Tr = makeCustomizable(sanitizeDomProps(Primitives.Tr), { defaultDescriptor: descriptors.tableRow });
export const Th = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Th)), {
defaultDescriptor: descriptors.tableHeaderCell,
});
export const Td = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Td)), {
defaultDescriptor: descriptors.tableBodyCell,
});

export const Dl = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Dl)));
export const Dd = makeCustomizable(makeLocalizable(sanitizeDomProps(Primitives.Dd)));
Expand Down
21 changes: 21 additions & 0 deletions packages/types/src/appearance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,10 @@ export type ElementsConfig = {
tabListContainer: WithOptions;

tableHead: WithOptions;
tableBody: WithOptions;
tableRow: WithOptions;
tableHeaderCell: WithOptions;
tableBodyCell: WithOptions;

paginationButton: WithOptions;
paginationButtonIcon: WithOptions;
Expand Down Expand Up @@ -586,6 +590,23 @@ export type ElementsConfig = {
notificationBadge: WithOptions;
buttonArrowIcon: WithOptions;
spinner: WithOptions;

apiKeys: WithOptions;
apiKeysHeader: WithOptions;
apiKeysSearchBox: WithOptions;
apiKeysSearchInput: WithOptions;
apiKeysAddButton: WithOptions;
apiKeysTable: WithOptions;
apiKeysCopyButton: WithOptions<string>;
apiKeysRevealButton: WithOptions<string>;
apiKeysCreateForm: WithOptions;
apiKeysCreateFormNameInput: WithOptions;
apiKeysCreateFormDescriptionInput: WithOptions;
apiKeysCreateFormExpirationInput: WithOptions;
apiKeysCreateFormSubmitButton: WithOptions;
apiKeysRevokeModal: WithOptions;
apiKeysRevokeModalInput: WithOptions;
apiKeysRevokeModalSubmitButton: WithOptions;
};

export type Elements = {
Expand Down