diff --git a/app/pages/project/instances/instance/InstancePage.tsx b/app/pages/project/instances/instance/InstancePage.tsx index 890062f7ec..f36c8c289c 100644 --- a/app/pages/project/instances/instance/InstancePage.tsx +++ b/app/pages/project/instances/instance/InstancePage.tsx @@ -144,9 +144,7 @@ export function InstancePage() { - - {ExternalIpsFromInstanceName({ value: true })} - + {ExternalIpsFromInstanceName({ value: true })} diff --git a/app/pages/project/instances/instance/tabs/NetworkingTab.tsx b/app/pages/project/instances/instance/tabs/NetworkingTab.tsx index 1a08115bd5..62983f15dc 100644 --- a/app/pages/project/instances/instance/tabs/NetworkingTab.tsx +++ b/app/pages/project/instances/instance/tabs/NetworkingTab.tsx @@ -21,6 +21,7 @@ import { useQueryTable, type MenuAction } from '@oxide/table' import { Badge, Button, + CopyToClipboard, EmptyMessage, Networking24Icon, Spinner, @@ -101,7 +102,13 @@ export function ExternalIpsFromInstanceName({ value: primary }: { value: boolean )) - return {primary ? ips : <>—} + return ( +
+ {primary ? ips : <>—} + {/* If there's exactly one IP here, render a copy to clipboard button */} + {data?.items.length === 1 && } +
+ ) } NetworkingTab.loader = async ({ params }: LoaderFunctionArgs) => { diff --git a/libs/ui/lib/copy-to-clipboard/CopyToClipboard.tsx b/libs/ui/lib/copy-to-clipboard/CopyToClipboard.tsx index c521346eaf..2979d73629 100644 --- a/libs/ui/lib/copy-to-clipboard/CopyToClipboard.tsx +++ b/libs/ui/lib/copy-to-clipboard/CopyToClipboard.tsx @@ -6,9 +6,11 @@ * Copyright Oxide Computer Company */ +import { animated, config, useTransition } from '@react-spring/web' +import cn from 'classnames' import { useState } from 'react' -import { Clipboard16Icon, Success12Icon, useTimeout } from '@oxide/ui' +import { Copy12Icon, Success12Icon, useTimeout } from '@oxide/ui' export const CopyToClipboard = ({ ariaLabel = 'Click to copy this text', @@ -27,18 +29,35 @@ export const CopyToClipboard = ({ }) } + const transitions = useTransition(hasCopied, { + from: { opacity: 0, transform: 'scale(0.8)' }, + enter: { opacity: 1, transform: 'scale(1)' }, + leave: { opacity: 0, transform: 'scale(0.8)' }, + config: config.stiff, + trail: 100, + initial: null, + }) + return ( ) } diff --git a/package-lock.json b/package-lock.json index 24ded399aa..54b05e76a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@floating-ui/react": "^0.26.4", "@headlessui/react": "^1.7.17", - "@oxide/design-system": "^1.2.9", + "@oxide/design-system": "^1.2.10", "@oxide/identicon": "0.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6", @@ -2543,9 +2543,9 @@ "dev": true }, "node_modules/@oxide/design-system": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-1.2.9.tgz", - "integrity": "sha512-uLKLFEmr7DTYXqTVhI1rdTRHR2x2tkkEGC2o2gzTse6fqvRxoKGAMhlWt2rMJMCI0hxgUIYuYPCaWO6/6smNBA==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-1.2.10.tgz", + "integrity": "sha512-L7KhX2rRYy/+QDnc7yW5ie/5IzmX+gCB8R6+zSjt7f+Za9oRkLHecw47KLUWr5lOTgJM4QaJubrlD0nUYb0cJw==", "dependencies": { "@figma-export/output-components-as-svgr": "^4.7.0", "@floating-ui/react": "^0.25.1", @@ -23098,9 +23098,9 @@ "dev": true }, "@oxide/design-system": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-1.2.9.tgz", - "integrity": "sha512-uLKLFEmr7DTYXqTVhI1rdTRHR2x2tkkEGC2o2gzTse6fqvRxoKGAMhlWt2rMJMCI0hxgUIYuYPCaWO6/6smNBA==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@oxide/design-system/-/design-system-1.2.10.tgz", + "integrity": "sha512-L7KhX2rRYy/+QDnc7yW5ie/5IzmX+gCB8R6+zSjt7f+Za9oRkLHecw47KLUWr5lOTgJM4QaJubrlD0nUYb0cJw==", "requires": { "@figma-export/output-components-as-svgr": "^4.7.0", "@floating-ui/react": "^0.25.1", diff --git a/package.json b/package.json index e89b7671e7..a3a98d812f 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "dependencies": { "@floating-ui/react": "^0.26.4", "@headlessui/react": "^1.7.17", - "@oxide/design-system": "^1.2.9", + "@oxide/design-system": "^1.2.10", "@oxide/identicon": "0.0.4", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-dropdown-menu": "^2.0.6",