diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/.gitignore b/apps/sarah-s-app-tue-aug-25-10-32-30-am/.gitignore new file mode 100644 index 0000000..6dde684 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/.gitignore @@ -0,0 +1,28 @@ +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Environment variables +.env +.env.local +.env.*.local diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/AGENTS.md b/apps/sarah-s-app-tue-aug-25-10-32-30-am/AGENTS.md new file mode 100644 index 0000000..f958e1a --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/AGENTS.md @@ -0,0 +1,28 @@ +# sarah-s-app-tue-aug-25-10-32-30-am + +This app is part of a Datadog Apps workspace. Shared guidance — including layout, dependencies, testing policy, and how changes ship — lives at the workspace root; read it before assuming anything not covered below. + +## Read relevant guides +- Embedded app context / routing / storage: ../../docs/agents/runtime-context.md +- Backend functions (*.backend.ts): ../../docs/agents/backend-functions.md +- Local dev / auth / build / upload: ../../docs/agents/build-upload-auth.md +- CI/CD (GitHub Actions deploy workflow): ../../docs/agents/cicd.md +- Data access (DDSQL vs. Action Catalog, Connections, datastores): ../../docs/agents/data.md +- Triggering or polling Workflow Automation from a backend function: ../../docs/agents/workflow-automation.md +- Upgrading `@datadog/vite-plugin` or `@datadog/action-catalog`: ../../docs/agents/upgrading.md +- Workspace overview (layout, dependencies, testing, shipping/CI): ../../AGENTS.md + +## This app +- This app owns its unique `apps.identifier` in `./vite.config.ts` — never share or copy it. +- Run locally: `npm run dev -w apps/sarah-s-app-tue-aug-25-10-32-30-am` (from the workspace root) or `npm run dev` (from this directory). +- Upload: `npm run upload -w apps/sarah-s-app-tue-aug-25-10-32-30-am`. + +## Testing + +Storybook stories are not required for this app right now — skip them unless explicitly asked. Playwright is still encouraged for browser validation when available, especially for visual/design changes. Validate with `npm run dev`, `npm run build`, and `npm run typecheck`/`npm run lint`. + +## Rules +- Keep secret-dependent work and privileged API calls in backend functions. +- Never hardcode API keys, app keys, or OAuth tokens. +- Prefer the generated npm scripts; this workspace uses npm. +- For any workspace, dependency, lockfile, or pull-request change, follow `Required lockfile gate before opening or updating a PR` in ../../AGENTS.md. That root section is the source of truth; do not create an app-local lockfile. diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/CLAUDE.md b/apps/sarah-s-app-tue-aug-25-10-32-30-am/CLAUDE.md new file mode 100644 index 0000000..43c994c --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/CLAUDE.md @@ -0,0 +1 @@ +@AGENTS.md diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/datadog-app.config.json b/apps/sarah-s-app-tue-aug-25-10-32-30-am/datadog-app.config.json new file mode 100644 index 0000000..9521680 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/datadog-app.config.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://unpkg.com/@datadog/create-apps/dist/datadog-app.config.schema.json", + "datadogSite": "datadoghq.com", + "id": "930c642c-eb62-4cbf-acf0-fd7496aef0f8", + "name": "Barak Rainbow" +} diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/index.html b/apps/sarah-s-app-tue-aug-25-10-32-30-am/index.html new file mode 100644 index 0000000..14a8599 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/index.html @@ -0,0 +1,15 @@ + + + + + + + Barak Rainbow + + + +
+ + + + diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/package.json b/apps/sarah-s-app-tue-aug-25-10-32-30-am/package.json new file mode 100644 index 0000000..744524d --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/package.json @@ -0,0 +1,24 @@ +{ + "name": "sarah-s-app-tue-aug-25-10-32-30-am", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "upload": "DD_APPS_UPLOAD_ASSETS=1 vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint:fix": "eslint . --ext ts,tsx --fix", + "preview": "vite preview", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@datadog/action-catalog": "^0.0.3", + "@datadog/druids": "^0.0.7", + "@tanstack/react-query": "^5.101.2", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "optionalDependencies": { + "@napi-rs/keyring": "^1.3.0" + } +} diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/public/favicon.ico b/apps/sarah-s-app-tue-aug-25-10-32-30-am/public/favicon.ico new file mode 100644 index 0000000..e04da3e Binary files /dev/null and b/apps/sarah-s-app-tue-aug-25-10-32-30-am/public/favicon.ico differ diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/App.css b/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/App.css new file mode 100644 index 0000000..f60d9e5 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/App.css @@ -0,0 +1,143 @@ +.barak-app { + min-height: 100vh; + background: + radial-gradient(circle at 15% 20%, rgba(255, 255, 255, 0.95), transparent 30%), + linear-gradient(135deg, #f7fbff 0%, #fff8f1 45%, #f5fff9 100%); +} + +.barak-stage { + position: relative; + display: grid; + min-height: min(720px, calc(100vh - 48px)); + overflow: hidden; + place-items: center; + border: 1px solid rgba(30, 41, 59, 0.12); + border-radius: 8px; + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(255, 255, 255, 0.78)), + linear-gradient(120deg, rgba(240, 77, 94, 0.22), rgba(46, 196, 182, 0.18)); + box-shadow: 0 24px 80px rgba(15, 23, 42, 0.12); +} + +.rainbow-sky { + position: absolute; + inset: clamp(24px, 6vw, 72px) 50% auto auto; + width: min(680px, 86vw); + aspect-ratio: 2 / 1; + transform: translateX(50%); +} + +.rainbow-arc { + position: absolute; + inset: 0; + border: clamp(14px, 3vw, 30px) solid currentColor; + border-bottom: 0; + border-radius: 999px 999px 0 0; +} + +.rainbow-arc-red { + color: #f04d5e; +} + +.rainbow-arc-orange { + inset: 9% 9% 0; + color: #ff9f1c; +} + +.rainbow-arc-yellow { + inset: 18% 18% 0; + color: #ffd166; +} + +.rainbow-arc-green { + inset: 27% 27% 0; + color: #2ec4b6; +} + +.rainbow-arc-blue { + inset: 36% 36% 0; + color: #2f80ed; +} + +.rainbow-arc-violet { + inset: 45% 45% 0; + color: #8a5cf6; +} + +.barak-copy { + position: relative; + z-index: 1; + width: min(760px, 100%); + margin-top: clamp(120px, 22vw, 220px); + text-align: center; +} + +.eyebrow { + margin: 0 0 12px; + color: #4f46e5; + letter-spacing: 0; + text-transform: uppercase; +} + +.barak-title { + margin: 0; + color: transparent; + font-size: 11rem; + font-weight: 900; + letter-spacing: 0; + line-height: 0.9; + background: linear-gradient(90deg, #f04d5e, #ff9f1c, #ffd166, #2ec4b6, #2f80ed, #8a5cf6); + background-clip: text; + -webkit-background-clip: text; + text-shadow: 0 18px 46px rgba(15, 23, 42, 0.12); +} + +.barak-subtitle { + max-width: 560px; + margin: 20px auto 0; + color: #334155; +} + +.rainbow-palette { + position: relative; + z-index: 1; + display: grid; + width: min(820px, 100%); + grid-template-columns: repeat(6, minmax(0, 1fr)); + gap: 10px; + margin-top: clamp(36px, 6vw, 72px); +} + +.palette-band { + display: flex; + min-width: 0; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 8px; + border: 1px solid rgba(15, 23, 42, 0.1); + border-radius: 8px; + background: rgba(255, 255, 255, 0.74); +} + +.palette-swatch { + width: 14px; + height: 14px; + flex: 0 0 auto; + border-radius: 50%; + box-shadow: inset 0 0 0 1px rgba(15, 23, 42, 0.12); +} + +@media (max-width: 720px) { + .barak-stage { + min-height: calc(100vh - 32px); + } + + .barak-title { + font-size: 5rem; + } + + .rainbow-palette { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/App.tsx b/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/App.tsx new file mode 100644 index 0000000..f8abce0 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/App.tsx @@ -0,0 +1,64 @@ +import { Grid } from '@datadog/druids/layout/Grid'; +import { GridItem } from '@datadog/druids/layout/GridItem'; +import { Spacing } from '@datadog/druids/layout/Spacing'; +import { Text } from '@datadog/druids/typography/Text'; + +import './App.css'; + +const rainbowBands = [ + { name: 'Red', value: '#f04d5e' }, + { name: 'Orange', value: '#ff9f1c' }, + { name: 'Yellow', value: '#ffd166' }, + { name: 'Green', value: '#2ec4b6' }, + { name: 'Blue', value: '#2f80ed' }, + { name: 'Violet', value: '#8a5cf6' }, +]; + +function App() { + return ( + + + + + + + + + Rainbow mode + + + Barak + + + A bright, color-forward space built around one name. + + + +
+ {rainbowBands.map((band) => ( +
+ + + {band.name} + +
+ ))} +
+
+
+
+
+ ); +} + +export default App; diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/main.tsx b/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/main.tsx new file mode 100644 index 0000000..8f2c295 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/src/main.tsx @@ -0,0 +1,24 @@ +import '@datadog/druids/styles.css'; + +import { DruidsEnvironment } from '@datadog/druids/layout/DruidsEnvironment'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +import App from './App'; + +const queryClient = new QueryClient(); +const appRoot = document.getElementById('app'); +if (appRoot) { + createRoot(appRoot).render( + + + + + + + , + ); +} else { + console.error('Missing #app div for createRoot.'); +} diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/tsconfig.json b/apps/sarah-s-app-tue-aug-25-10-32-30-am/tsconfig.json new file mode 100644 index 0000000..a0b4351 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [ + "src" + ] +} diff --git a/apps/sarah-s-app-tue-aug-25-10-32-30-am/vite.config.ts b/apps/sarah-s-app-tue-aug-25-10-32-30-am/vite.config.ts new file mode 100644 index 0000000..b7554e1 --- /dev/null +++ b/apps/sarah-s-app-tue-aug-25-10-32-30-am/vite.config.ts @@ -0,0 +1,58 @@ +import { datadogVitePlugin } from '@datadog/vite-plugin'; +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +import rootManifest from '../../package.json'; +import { version } from './package.json'; +import datadogAppConfig from './datadog-app.config.json'; + +const hasDatadogApiKeys = Boolean( + (process.env.DD_API_KEY || process.env.DATADOG_API_KEY) && + (process.env.DD_APP_KEY || process.env.DATADOG_APP_KEY), +); +const datadogSite = process.env.DD_SITE || process.env.DATADOG_SITE || datadogAppConfig.datadogSite; + +if (!process.env.DD_SITE && !process.env.DATADOG_SITE) { + process.env.DD_SITE = datadogSite; +} + +export default defineConfig({ + base: './', + build: { + sourcemap: true, + }, + plugins: [ + react(), + datadogVitePlugin({ + logLevel: 'debug', + auth: { + site: datadogSite || rootManifest.datadogApps?.site, + apiKey: process.env.DD_API_KEY, + appKey: process.env.DD_APP_KEY, + }, + apps: { + enable: true, + name: datadogAppConfig.name, + description: 'A bright rainbow experience for Barak.', + authOverrides: { + method: hasDatadogApiKeys ? 'apiKey' : 'oauth', + }, + identifier: '930c642c-eb62-4cbf-acf0-fd7496aef0f8', + }, + errorTracking: { + enable: hasDatadogApiKeys, + sourcemaps: { + minifiedPathPrefix: '/', + releaseVersion: version, + service: datadogAppConfig.name, + }, + }, + metadata: { + name: datadogAppConfig.name, + }, + metrics: { + enable: hasDatadogApiKeys, + }, + }), + ], +}); diff --git a/package-lock.json b/package-lock.json index de7e825..a793e21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,19 @@ "@napi-rs/keyring": "^1.3.0" } }, + "apps/sarah-s-app-tue-aug-25-10-32-30-am": { + "version": "0.0.1", + "dependencies": { + "@datadog/action-catalog": "^0.0.3", + "@datadog/druids": "^0.0.7", + "@tanstack/react-query": "^5.101.2", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "optionalDependencies": { + "@napi-rs/keyring": "^1.3.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -75,6 +88,7 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -256,6 +270,7 @@ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.29.8" }, @@ -319,6 +334,7 @@ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", @@ -338,6 +354,7 @@ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" @@ -1475,6 +1492,7 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1958,6 +1976,7 @@ "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -1975,6 +1994,7 @@ "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -2025,6 +2045,7 @@ "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.67.0", "@typescript-eslint/types": "8.67.0", @@ -2250,6 +2271,7 @@ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2370,6 +2392,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", @@ -2591,6 +2614,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3799,6 +3823,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -3811,6 +3836,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -3952,6 +3978,10 @@ "dev": true, "license": "MIT" }, + "node_modules/sarah-s-app-tue-aug-25-10-32-30-am": { + "resolved": "apps/sarah-s-app-tue-aug-25-10-32-30-am", + "link": true + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -4139,6 +4169,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4224,6 +4255,7 @@ "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", @@ -4361,6 +4393,7 @@ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" }