Files
triggerdotdev--trigger.dev/apps/webapp/tailwind.config.js
T
Matt Aitken 72f3a4b128 Usage and billing (v3) (#1201)
* v3 subscription endpoints

* Use pnpm linked billing package during development

* Moved v2 billing components into a subfolder

* Select plan using the real data

* Improved v3 plan display

* Use new api response that doesn’t require a Stripe call

* Free flow is working

* Added GitHub modal and verified badge

* Deleted old request v3 access component/route

* Allow setting classes on the Tooltip button

* Paid plans working

* Redirect from select plan if you’ve got v3 enabled

* Loading state improvements

* New admin API endpoint to set concurrency across multiple environments

* When projects are created, conditionally create staging based on the plan

* New billing page working with side menu and stripe portal

* Layout, formatting and some plan state improvements/fixes

* Don’t show the period if you’re on the free plan

* Temporary upgrade callout

* Refactored the platform code so it’s easier to call and doesn’t require a isManagedCloud check

* Send taskIdentifier to OpenMeter

* Side menu

* Upgrade prompts

* More improvements to the app-wide usage indicators

* Early work on usage graphs

* Added the usage bar for v3

* Moved code to presenter and now using defer

* Added the tasks table to usage

* Improved the v3 usage bar if theres’ no usage on a paid plan

* If no run data, still render a graph

* Usage page errors when defered loading fails

* Don’t show the public API key for v3, they’re not used and probably never will be

* Improved the upgrade callout and API keys page layout

* Only show the “reveal all” toggle if you have environment variables in the table

* Replaced Upgrade callout with a more generic InfoPanel component

* better panel width

* Show conditional upgrade prompts based on plan and number of schedules used

* Removed duplicate class

* Wider blank state panels for the scheduled page

* Wider info panel for the env var page

* Blank state now using the info panel

* Platform alerts prompt now using the InfoPanel

* Deploy blank state uses InfoPanel

* Github verified badge padding adjustment

* Improved the layout of the page, some style tweaks, organized imports

* Better default tooltip style

* could be undefined fix

* text fix + style updates

* Changed the billing icon in the side menu

* Billing page layout and style improvements

* plan tooltips don’t use dark variant

* Don’t highlight the plan on the billing page

* Tooltip underlines stand out more

* Fixed padding in the PageTitle

* Tooltips use the correct cursor

* Improved the plan banner on the billing page

* Fixed Header1 inconsistent font weight

* Fixed issue where input field focus states were being clipped

* Fixed large button not having large text size

* Added a link to the Get in touch copy and improved the connect to GitHub modal

* Select plan page uses the MainCenteredContainer

* Better logging from the Loops endpoint because this error finally got hit

* Move the ingestion of compute to the platform

* Reporting usage of invocations moved to the platform

* Get the entitlement before triggering a non-dev task

* Contact us enterprise plan button opens the feedback form

* Removed Github discussions link from the Feedback panel

* Swapped billing icon for credit card

* Show a Unlock staging panel on the env var page

* Updated staging environment colour

* Show a prompt to upgrade to get staging in the new env var modal

* Improved the edit env var modal

* Implement ability to disable org concurrency

* Use common logic for the plans

* Use the billing server to get the schedule limits

* Some schedules page fixes

* More convenient way of getting a limit

* Use the new schedule limit

* Team member limiting

* Made the limit visible on the team page

* Limit alerts

* Added an index for TaskRun.scheduleId

* Remove console.log on schedules page

* Added durations to the run table

* Tabular numbers

* Improved the usage page formatting

* Only admins see the compute column on the run table

* Include the base cost on the usage stats

* Moved the status to the sidebar

* Optional table header tooltip

* Allow InfoIconTooltips to have customizable content styles

* Added a tooltip to the duration header, changed no test to a dash

* Removed all references to signing up to v3 from the docs

* Switched @trigger.dev/billing to @trigger.dev/platform

* Passing up the variant for the InfoIconTooltip

* table tooltip max-width fixed

* Switch to the published @trigger.dev/platform 1.0.11

* v2 usage page title changed to include “v2"

* code theme has a transparent background so it works on any background

* duration columns now grouped together nicely at wide screen size

* Last duration column fills the width properly

* Fix for the per run price being in cents not dollars

* Show the total cost with 8 decimal places

* Show 8 decimal places in the usage graph tooltip

* Moved the UpgradePrompt to the v3 folder

* Prepare to use Shadcns chart helpers

* Much nicer chart

* Small tweaks to the graph

* Fix run table col spans for empty/loading messages

* We don’t need isManagedCloud in createProject

* Hide v3 usage/billing pages if there aren’t v3 projects in your org

* Removed unused tooltipStyle

* Usage bar now says “Included usage” instead of “Tier limit” if you’re paying

* Get the plan/usage data in parallel

* The usage page now has a month dropdown and all data is for that calendar month

* Ensure the passed date is the 1st of the month

* Use the machine presets from the platform package

---------

Co-authored-by: James Ritchie <james@jamesritchie.co.uk>
Co-authored-by: Eric Allam <eallam@icloud.com>
2024-07-08 14:42:19 +01:00

289 lines
6.5 KiB
JavaScript

/** @type {import('tailwindcss').Config} */
const colors = require("tailwindcss/colors");
// V2
const slate = {
450: "#7E8FA6",
500: "#6B7C95",
550: "#586981",
600: "#45566D",
650: "#3C4B62",
750: "#293649",
850: "#1A2434",
900: "#131B2B",
950: "#0E1521",
1000: "#0B1018",
};
const toxic = {
50: "#E3FFE6",
100: "#C8FFCD",
200: "#A9FFAB",
300: "#8AFF96",
400: "#6DFC7B",
500: "#41FF54",
600: "#28F03C",
700: "#2AE03C",
800: "#22D834",
900: "#16CC28",
};
const acid = {
50: "#F9FFD1",
100: "#F6FFB6",
200: "#F3FF99",
300: "#EEFF82",
400: "#E7FF52",
500: "#DAF437",
600: "#C5E118",
700: "#B2CD0A",
800: "#A5BE07",
900: "#9FB802",
};
const midnight = {
...colors.slate,
450: colors.slate[850],
500: colors.slate[650],
550: colors.slate[700],
600: colors.slate[750],
650: colors.slate[800],
750: colors.slate[850],
800: colors.slate[900],
850: "#0E1521",
900: "#0B1018",
};
// V3
const charcoal = {
100: "#E8E9EC",
200: "#D7D9DD",
300: "#B5B8C0",
400: "#878C99",
500: "#5F6570",
600: "#3B3E45",
700: "#272A2E",
750: "#212327",
800: "#1A1B1F",
850: "#15171A",
900: "#121317",
950: "#0D0E12",
1000: "#0B0C0F",
};
const apple = {
100: "#E4FFC9",
200: "#CFFFA0",
300: "#BFFF81",
400: "#AFFF62",
500: "#A8FF53",
600: "#82D134",
700: "#6FB12F",
750: "#5E932A",
800: "#45711A",
850: "#2E4E10",
900: "#20370A",
950: "#152506",
};
const mint = {
50: "#F0FDF4",
100: "#DDFBE6",
200: "#BDF5D0",
300: "#87EBA9",
400: "#4FD97E",
500: "#28BF5C",
600: "#1B9E48",
700: "#197C3C",
800: "#196233",
900: "#16512C",
950: "#062D15",
};
const sun = {
50: "#FDFEE8",
100: "#FDFFC2",
200: "#FFFF89",
300: "#FFF852",
400: "#FDEA12",
500: "#ECCF06",
600: "#CCA302",
700: "#A37505",
800: "#865B0D",
900: "#724B11",
950: "#432705",
};
const lavender = {
50: "##f4f2ff",
100: "#eae8ff",
200: "#d7d4ff",
300: "#bab2ff",
400: "#826dff",
500: "#7655fd",
600: "#6532f5",
700: "#5620e1",
800: "#481abd",
900: "#3d189a",
950: "#230c69",
};
/** Trigger.dev custom palette */
/** Text colors */
const primary = apple[500];
const secondary = lavender[400];
const tertiary = charcoal[700];
const textLink = lavender[400];
const textDimmed = charcoal[400];
const textBright = charcoal[200];
const backgroundBright = charcoal[800];
const backgroundDimmed = charcoal[850];
const gridBright = charcoal[700];
const gridDimmed = charcoal[750];
const success = mint[500];
const pending = colors.blue[500];
const warning = colors.amber[500];
const error = colors.rose[600];
const devEnv = colors.pink[500];
const stagingEnv = colors.amber[400];
const prodEnv = mint[500];
/** Other variables */
const radius = "0.5rem";
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./app/**/*.{ts,jsx,tsx}",
// include packages if not transpiling
"../../packages/**/*.{ts,tsx}",
],
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
fontFamily: {
sans: ["Geist Variable", "Helvetica Neue", "Helvetica", "Arial", "sans-serif"],
mono: ["Geist Mono Variable", "monaco", "Consolas", "Lucida Console", "monospace"],
},
fontSize: {
xxs: [
"0.65rem",
{
lineHeight: "0.75rem",
letterSpacing: "-0.01em",
fontWeight: "500",
},
],
"2sm": [
"0.8125rem",
{
lineHeight: "0.875rem",
letterSpacing: "-0.01em",
fontWeight: "500",
},
],
},
colors: {
charcoal,
apple,
lavender,
mint,
sun,
primary,
secondary,
tertiary,
"text-link": textLink,
"text-dimmed": textDimmed,
"text-bright": textBright,
"background-bright": backgroundBright,
"background-dimmed": backgroundDimmed,
"grid-bright": gridBright,
"grid-dimmed": gridDimmed,
success,
pending,
warning,
error,
dev: devEnv,
staging: stagingEnv,
prod: prodEnv,
},
borderRadius: {
lg: radius,
md: `calc(${radius} - 2px)`,
sm: `calc(${radius} - 4px)`,
},
boxShadow: {
"glow-primary": "0 0 10px 5px rgba(218, 244, 55, 0.2)",
"glow-secondary": "0 0 10px 5px rgba(79, 70, 229, 0.2)",
"glow-pink": "0 0 10px 5px rgba(236, 72, 153, 0.2)",
},
outlineWidth: {
3: "3px",
},
textShadow: {
custom: "1px 1px 1px rgba(0, 0, 0, 0.5)", // Offset-X | Offset-Y | Blur radius | Color
},
keyframes: {
"accordion-down": {
from: { height: 0 },
to: { height: "var(--radix-accordion-content-height)" },
},
"accordion-up": {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: 0 },
},
float: {
"0%": { transform: "translatey(0px)" },
"50%": { transform: "translatey(7px)" },
"100%": { transform: "translatey(0px)" },
},
"tile-move": {
"0%": { "background-position": "0px" },
"100%": { "background-position": "8px" },
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
"tile-scroll": "tile-move 0.5s infinite linear",
},
backgroundImage: {
"gradient-radial": "radial-gradient(closest-side, var(--tw-gradient-stops))",
"gradient-primary": `linear-gradient(90deg, acid-500 0%, toxic-500 100%)`,
"gradient-primary-hover": `linear-gradient(80deg, acid-600 0%, toxic-600 100%)`,
"gradient-secondary": `linear-gradient(90deg, hsl(271 91 65) 0%, hsl(221 83 53) 100%)`,
"gradient-radial-secondary": `radial-gradient(hsl(271 91 65), hsl(221 83 53))`,
},
gridTemplateColumns: {
carousel: "repeat(6, 200px)",
},
screens: {
"lg-height": { raw: "(max-height: 750px)" },
"md-height": { raw: "(max-height: 600px)" },
},
width: {
0.75: "0.1875rem",
},
height: {
0.75: "0.1875rem",
},
},
},
plugins: [
require("@tailwindcss/container-queries"),
require("@tailwindcss/forms"),
require("@tailwindcss/typography"),
require("tailwindcss-animate"),
require("tailwind-scrollbar"),
require("tailwind-scrollbar-hide"),
require("tailwindcss-textshadow"),
],
};