@crystallize/design-system 0.0.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/index.css +1362 -633
  3. package/dist/index.d.ts +171 -25
  4. package/dist/index.js +1124 -390
  5. package/dist/index.mjs +1108 -389
  6. package/package.json +47 -27
  7. package/readme.md +9 -0
  8. package/src/Tokens.stories.tsx +18 -0
  9. package/src/action-menu/ActionMenu.stories.tsx +3 -1
  10. package/src/action-menu/action-item.tsx +2 -10
  11. package/src/action-menu/action-menu.css +38 -0
  12. package/src/action-menu/action-menu.tsx +4 -13
  13. package/src/action-menu/index.tsx +2 -0
  14. package/src/avatar/Avatar.stories.tsx +20 -0
  15. package/src/avatar/avatar.css +23 -0
  16. package/src/avatar/avatar.tsx +34 -0
  17. package/src/avatar/get-initials.ts +5 -0
  18. package/src/avatar/index.ts +1 -0
  19. package/src/button/Button.stories.tsx +64 -22
  20. package/src/button/button.css +116 -0
  21. package/src/button/button.tsx +119 -33
  22. package/src/button/index.ts +1 -1
  23. package/src/card/card.css +7 -0
  24. package/src/card/card.stories.tsx +2 -2
  25. package/src/card/card.tsx +6 -4
  26. package/src/card/index.ts +2 -0
  27. package/src/checkbox/checkbox.css +30 -0
  28. package/src/checkbox/checkbox.stories.tsx +62 -0
  29. package/src/checkbox/checkbox.tsx +28 -0
  30. package/src/checkbox/index.ts +1 -0
  31. package/src/colors/Colors.stories.tsx +127 -0
  32. package/src/colors/color-defaults.json +15 -0
  33. package/src/colors/color-pairing.json +12 -0
  34. package/src/colors/colors.json +158 -0
  35. package/src/colors/index.ts +1 -0
  36. package/src/colors/old-to-new.txt +19 -0
  37. package/src/colors/types.ts +29 -0
  38. package/src/dialog/Dialog.stories.tsx +9 -6
  39. package/src/dialog/confirm-dialog.tsx +5 -2
  40. package/src/dialog/dialog.css +27 -0
  41. package/src/dialog/dialog.tsx +23 -25
  42. package/src/dialog/types.ts +4 -1
  43. package/src/dropdown-menu/DropdownMenu.stories.tsx +6 -15
  44. package/src/dropdown-menu/dropdown-menu-item.tsx +3 -12
  45. package/src/dropdown-menu/dropdown-menu-label.tsx +2 -9
  46. package/src/dropdown-menu/dropdown-menu-root.tsx +9 -5
  47. package/src/dropdown-menu/dropdown-menu.css +20 -0
  48. package/src/dropdown-menu/index.ts +2 -0
  49. package/src/icon-button/IconButton.stories.tsx +9 -6
  50. package/src/icon-button/icon-button.css +40 -0
  51. package/src/icon-button/icon-button.tsx +14 -22
  52. package/src/iconography/Icon.stories.tsx +47 -0
  53. package/src/{icons → iconography}/arrow.tsx +0 -0
  54. package/src/iconography/atom.tsx +59 -0
  55. package/src/{icons → iconography}/cancel.tsx +0 -0
  56. package/src/iconography/copy.tsx +24 -0
  57. package/src/iconography/crystal.tsx +93 -0
  58. package/src/iconography/edit.tsx +30 -0
  59. package/src/iconography/error.tsx +40 -0
  60. package/src/{icons → iconography}/glasses.tsx +0 -0
  61. package/src/{icons → iconography}/graphQL.tsx +0 -0
  62. package/src/{icons → iconography}/index.ts +10 -2
  63. package/src/iconography/info.tsx +41 -0
  64. package/src/{icons → iconography}/nail-polish.tsx +0 -0
  65. package/src/iconography/particle.tsx +88 -0
  66. package/src/iconography/triangle.tsx +27 -0
  67. package/src/iconography/warning.tsx +51 -0
  68. package/src/index.css +11 -0
  69. package/src/index.ts +23 -1
  70. package/src/inline-radio/index.ts +1 -0
  71. package/src/inline-radio/inline-radio.css +20 -0
  72. package/src/inline-radio/inline-radio.stories.tsx +62 -0
  73. package/src/inline-radio/inline-radio.tsx +26 -0
  74. package/src/input/Input.stories.tsx +26 -0
  75. package/src/input/index.ts +1 -0
  76. package/src/input/input.css +7 -0
  77. package/src/input/input.tsx +20 -0
  78. package/src/input-with-label/InputWithLabel.stories.tsx +98 -0
  79. package/src/input-with-label/index.ts +3 -0
  80. package/src/input-with-label/input-with-label.css +35 -0
  81. package/src/input-with-label/input-with-label.tsx +59 -0
  82. package/src/label/index.ts +1 -0
  83. package/src/label/label.css +3 -0
  84. package/src/label/label.stories.tsx +19 -0
  85. package/src/label/label.tsx +13 -0
  86. package/src/progress/Progress.stories.tsx +26 -0
  87. package/src/progress/index.ts +1 -0
  88. package/src/progress/progress.css +7 -0
  89. package/src/progress/progress.tsx +17 -0
  90. package/src/radio/index.ts +1 -0
  91. package/src/radio/radio.css +20 -0
  92. package/src/radio/radio.stories.tsx +142 -0
  93. package/src/radio/radio.tsx +19 -0
  94. package/src/select/index.ts +1 -0
  95. package/src/select/select-item.tsx +18 -0
  96. package/src/select/select-root.tsx +34 -0
  97. package/src/select/select.css +28 -0
  98. package/src/select/select.stories.tsx +74 -0
  99. package/src/select/select.ts +9 -0
  100. package/src/spinner/Spinner.stories.tsx +19 -0
  101. package/src/spinner/index.tsx +48 -0
  102. package/src/spinner/spinner.css +11 -0
  103. package/tailwind.config.cjs +51 -0
  104. package/src/button copy/ButtonCopy.stories.tsx +0 -86
  105. package/src/button copy/button.tsx +0 -61
  106. package/src/button copy/index.ts +0 -3
  107. package/src/colors/Colors.stories.mdx +0 -33
  108. package/src/icons/Iconography.stories.mdx +0 -45
  109. package/src/icons/dots.tsx +0 -24
  110. package/src/icons/error.tsx +0 -50
  111. package/src/icons/info.tsx +0 -53
  112. package/src/icons/warning.tsx +0 -62
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crystallize/design-system",
3
- "version": "0.0.2",
3
+ "version": "1.0.0",
4
4
  "types": "./dist/index.d.ts",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -12,40 +12,54 @@
12
12
  "require": "./dist/index.js",
13
13
  "import": "./dist/index.mjs",
14
14
  "types": "./dist/index.d.ts"
15
+ },
16
+ "./tailwind-config": "./tailwind.config.cjs",
17
+ "./styles.css": {
18
+ "import": "./dist/index.css",
19
+ "require": "./dist/index.css"
15
20
  }
16
21
  },
17
22
  "dependencies": {
23
+ "@radix-ui/react-checkbox": "1.0.1",
18
24
  "@radix-ui/react-dialog": "1.0.2",
19
25
  "@radix-ui/react-dropdown-menu": "2.0.1",
20
- "class-variance-authority": "^0.3.0",
21
- "clsx": "^1.2.1",
26
+ "@radix-ui/react-progress": "^1.0.1",
27
+ "@radix-ui/react-radio-group": "1.1.0",
28
+ "@radix-ui/react-select": "1.1.2",
29
+ "class-variance-authority": "^0.4.0",
30
+ "hex-rgb": "4.3.0",
22
31
  "react": "17.0.1",
23
32
  "react-dom": "17.0.1"
24
33
  },
25
34
  "devDependencies": {
26
- "@mdx-js/react": "^2.1.5",
27
- "@storybook/addon-actions": "7.0.0-alpha.47",
28
- "@storybook/addon-backgrounds": "7.0.0-alpha.47",
29
- "@storybook/addon-docs": "^7.0.0-alpha.47",
30
- "@storybook/addon-essentials": "^7.0.0-alpha.47",
31
- "@storybook/addon-highlight": "7.0.0-alpha.47",
32
- "@storybook/addon-interactions": "^7.0.0-alpha.47",
33
- "@storybook/addon-links": "^7.0.0-alpha.47",
34
- "@storybook/addon-measure": "7.0.0-alpha.47",
35
- "@storybook/addon-outline": "7.0.0-alpha.47",
36
- "@storybook/react": "^7.0.0-alpha.47",
37
- "@storybook/react-vite": "^7.0.0-alpha.47",
35
+ "@mdx-js/react": "^2.2.1",
36
+ "@storybook/addon-actions": "7.0.0-beta.14",
37
+ "@storybook/addon-backgrounds": "7.0.0-beta.14",
38
+ "@storybook/addon-docs": "7.0.0-beta.14",
39
+ "@storybook/addon-essentials": "7.0.0-beta.14",
40
+ "@storybook/addon-highlight": "7.0.0-beta.14",
41
+ "@storybook/addon-interactions": "7.0.0-beta.14",
42
+ "@storybook/addon-links": "7.0.0-beta.14",
43
+ "@storybook/addon-measure": "7.0.0-beta.14",
44
+ "@storybook/addon-outline": "7.0.0-beta.14",
45
+ "@storybook/addons": "^6.5.15",
46
+ "@storybook/react": "7.0.0-beta.14",
47
+ "@storybook/react-vite": "7.0.0-beta.14",
38
48
  "@storybook/testing-library": "^0.0.13",
49
+ "@storybook/theming": "7.0.0-beta.14",
39
50
  "@types/react": "17.0.1",
40
51
  "@types/react-dom": "17.0.1",
41
- "@vitejs/plugin-react": "^2.2.0",
42
- "postcss": "^8.4.18",
43
- "storybook": "^7.0.0-alpha.47",
44
- "tailwindcss": "^3.2.1",
52
+ "@vitejs/plugin-react": "^3.0.1",
53
+ "concurrently": "^7.6.0",
54
+ "postcss": "^8.4.21",
55
+ "storybook": "7.0.0-beta.14",
56
+ "storybook-addon-designs": "^6.3.1",
57
+ "storybook-dark-mode": "^2.0.5",
58
+ "tailwindcss": "^3.2.4",
45
59
  "tsconfig": "0.0.0",
46
- "tsup": "^6.3.0",
47
- "typescript": "^4.8.4",
48
- "vite": "^3.2.2"
60
+ "tsup": "^6.5.0",
61
+ "typescript": "^4.9.4",
62
+ "vite": "^4.0.4"
49
63
  },
50
64
  "keywords": [
51
65
  "react",
@@ -62,12 +76,18 @@
62
76
  "files": [
63
77
  "dist",
64
78
  "src",
65
- "CHANGELOG.md"
79
+ "CHANGELOG.md",
80
+ "readme.md",
81
+ "tailwind.config.cjs"
66
82
  ],
67
83
  "scripts": {
68
- "build": "tsup src/index.ts --format esm,cjs --dts",
69
- "build-storybook": "storybook build",
70
- "storybook": "storybook dev -p 6006 --no-open",
71
- "dev": "tsup src/index.ts --format esm --dts --watch"
84
+ "build:storybook": "storybook build -s public",
85
+ "build:tw": "tailwindcss --content ./src/**/*.tsx,!./src/**/*.stories.tsx -c ./tailwind.config.cjs -i src/index.css -o dist/index.css --minify",
86
+ "build:tsup": "tsup src/index.ts --format esm,cjs --dts",
87
+ "build": "pnpm build:tw && pnpm build:tsup && pnpm build:storybook",
88
+ "dev:tw": "tailwindcss --content ./src/**/*.tsx,!./src/**/*.stories.tsx -c ./tailwind.config.cjs -i src/index.css -o dist/index.css --watch & tsup src/index.ts --format esm --dts --watch",
89
+ "dev:tsup": "tsup src/index.ts --format esm --dts --watch",
90
+ "dev:storybook": "storybook dev -p 6006 --no-open -s public",
91
+ "dev": "concurrently \"npm:dev:*\""
72
92
  }
73
93
  }
package/readme.md ADDED
@@ -0,0 +1,9 @@
1
+ # @crystallize/design-system
2
+
3
+ Buttons, colors and all the other visual primitives from Crystallize
4
+
5
+ [Changelog](https://unpkg.com/@crystallize/design-system/CHANGELOG.md)
6
+
7
+ ## Documentation
8
+ [https://design-system.crystallize.com](https://design-system.crystallize.com)
9
+
@@ -0,0 +1,18 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { tokens } from '.';
3
+
4
+ function DisplayTokens() {
5
+ return <pre>{JSON.stringify(tokens, null, 2)}</pre>;
6
+ }
7
+
8
+ const meta: Meta<typeof DisplayTokens> = {
9
+ title: 'Tokens',
10
+ component: DisplayTokens,
11
+ argTypes: {},
12
+ };
13
+
14
+ export default meta;
15
+
16
+ type Story = StoryObj<typeof DisplayTokens>;
17
+
18
+ export const Default: Story = {};
@@ -17,7 +17,9 @@ export const Default: Story = {
17
17
  render: () => (
18
18
  <ActionMenu>
19
19
  <ActionMenu.Item onSelect={() => console.warn('Download')}>Download</ActionMenu.Item>
20
- <ActionMenu.Item onSelect={() => console.warn('Delete')}>Delete</ActionMenu.Item>
20
+ <ActionMenu.Item className="danger" onSelect={() => console.warn('Delete')}>
21
+ Delete
22
+ </ActionMenu.Item>
21
23
  </ActionMenu>
22
24
  ),
23
25
  };
@@ -1,4 +1,4 @@
1
- import clsx from 'clsx';
1
+ import { cx } from 'class-variance-authority';
2
2
  import type { HTMLAttributes } from 'react';
3
3
 
4
4
  import { DropdownMenu } from '../dropdown-menu';
@@ -9,15 +9,7 @@ type ItemProps = HTMLAttributes<HTMLLIElement> & {
9
9
 
10
10
  export function Item({ children, className, onSelect }: ItemProps) {
11
11
  return (
12
- <DropdownMenu.Item
13
- onClick={onSelect}
14
- className={clsx(
15
- 'items-center text-density cursor-pointer flex font-sans font-medium text-sm gap-2 py-2.5 px-5',
16
- 'hover:bg-[#f4f4f4]',
17
- '[&.danger]:text-error',
18
- className,
19
- )}
20
- >
12
+ <DropdownMenu.Item onClick={onSelect} className={cx(className, 'c-action-menu-item')}>
21
13
  {children}
22
14
  </DropdownMenu.Item>
23
15
  );
@@ -0,0 +1,38 @@
1
+ .c-action-menu {
2
+ @apply flex h-8 w-8 rotate-0 cursor-pointer flex-col items-center justify-center gap-[2px] rounded-md border-none bg-transparent p-1 -outline-offset-1 transition;
3
+ &-dot {
4
+ @apply h-[4px] w-[4px] rounded-full bg-gray;
5
+ }
6
+ &[data-state='open'],
7
+ [aria-expanded='true'] {
8
+ @apply flex-row gap-[3px];
9
+ }
10
+ &:focus-visible {
11
+ @apply outline outline-1 outline-inherit;
12
+ outline-color: currentColor;
13
+ }
14
+
15
+ &:not(:disabled):hover {
16
+ @apply gap-[3px] bg-gray-100-800 outline outline-1 outline-purple-200-700;
17
+ }
18
+
19
+ &:not(:disabled):active {
20
+ @apply scale-95 bg-purple-100-800;
21
+ }
22
+ }
23
+
24
+ .c-action-menu-item {
25
+ @apply flex cursor-pointer items-center gap-2 py-2.5 px-5 font-sans text-sm font-medium text-gray;
26
+
27
+ &:hover {
28
+ @apply bg-gray-50-900;
29
+ }
30
+
31
+ &:focus {
32
+ @apply bg-gray-50-900 outline-none;
33
+ }
34
+
35
+ &.danger {
36
+ @apply text-pink-600-300;
37
+ }
38
+ }
@@ -1,8 +1,6 @@
1
- import clsx from 'clsx';
2
1
  import type { ReactNode } from 'react';
3
2
 
4
3
  import { DropdownMenu } from '../dropdown-menu';
5
- import { Icon } from '../icons';
6
4
 
7
5
  import { Item } from './action-item';
8
6
 
@@ -14,18 +12,11 @@ type ActionMenuProps = {
14
12
  export function ActionMenu({ children, tabIndex }: ActionMenuProps) {
15
13
  return (
16
14
  <DropdownMenu.Root content={children} alignContent="center">
17
- <button
18
- tabIndex={tabIndex}
19
- type="button"
20
- className={clsx(
21
- 'items-center bg-transparent rounded-full border-none cursor-pointer flex justify-center p-1',
22
- 'hover:bg-gray-6 focus:bg-gray-6 focus:outline-offset-2 focus:outline focus:outline-1 focus:outline-glacier focus-visible:outline-offset-2 focus-visible:outline focus-visible:outline-1 focus-visible:outline-glacier',
23
- 'active:scale-95',
24
- )}
25
- aria-label="more options"
26
- >
15
+ <button tabIndex={tabIndex} type="button" className="c-action-menu" aria-label="more options">
27
16
  <span className="sr-only">Open more options</span>
28
- <Icon.Dots />
17
+ <span className="c-action-menu-dot"></span>
18
+ <span className="c-action-menu-dot"></span>
19
+ <span className="c-action-menu-dot"></span>
29
20
  </button>
30
21
  </DropdownMenu.Root>
31
22
  );
@@ -1 +1,3 @@
1
+ import './action-menu.css';
2
+
1
3
  export { ActionMenu } from './action-menu';
@@ -0,0 +1,20 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import { Avatar } from '.';
4
+
5
+ const meta: Meta<typeof Avatar> = {
6
+ title: 'Components/Avatar',
7
+ component: Avatar,
8
+ argTypes: {},
9
+ };
10
+
11
+ export default meta;
12
+
13
+ type Story = StoryObj<typeof Avatar>;
14
+
15
+ export const Default: Story = {
16
+ args: {
17
+ name: 'Crystallize Team',
18
+ size: 'md',
19
+ },
20
+ };
@@ -0,0 +1,23 @@
1
+ .c-avatar {
2
+ @apply flex items-center justify-center rounded-full border border-solid border-cyan-800-100 bg-cyan-200-700 text-cyan-800-100;
3
+ }
4
+
5
+ .c-avatar-initials {
6
+ @apply font-bold leading-none tracking-tight;
7
+ }
8
+
9
+ .c-avatar-md {
10
+ @apply h-7 w-7 text-xs;
11
+ }
12
+
13
+ .c-avatar-lg {
14
+ @apply h-9 w-9 text-sm;
15
+ }
16
+
17
+ .c-avatar-xl {
18
+ @apply h-12 w-12 text-base;
19
+ }
20
+
21
+ .c-avatar-2xl {
22
+ @apply h-16 w-16 text-xl;
23
+ }
@@ -0,0 +1,34 @@
1
+ import { forwardRef } from 'react';
2
+ import { cva, VariantProps } from 'class-variance-authority';
3
+
4
+ import { getInitials } from './get-initials';
5
+ import './avatar.css';
6
+
7
+ const avatarClassName = cva(['c-avatar'], {
8
+ variants: {
9
+ size: {
10
+ md: 'c-avatar-md',
11
+ lg: 'c-avatar-lg',
12
+ xl: 'c-avatar-xl',
13
+ '2xl': 'c-avatar-2xl',
14
+ },
15
+ },
16
+ defaultVariants: {
17
+ size: 'md',
18
+ },
19
+ });
20
+
21
+ type AvatarProps = React.ComponentPropsWithRef<'div'> &
22
+ VariantProps<typeof avatarClassName> & {
23
+ name: string;
24
+ };
25
+
26
+ export const Avatar = forwardRef<HTMLDivElement, AvatarProps>(({ name, size, className, ...delegated }, ref) => {
27
+ return (
28
+ <div ref={ref} {...delegated} title={name} className={avatarClassName({ size, className })}>
29
+ <span className="c-avatar-initials">{getInitials(name)}</span>
30
+ </div>
31
+ );
32
+ });
33
+
34
+ Avatar.displayName = 'Avatar';
@@ -0,0 +1,5 @@
1
+ export const getInitials = (name: string) => {
2
+ const [first, second] = name.split(' ');
3
+ const initials = `${first?.charAt(0) ?? ''}${second?.charAt(0) ?? ''}`;
4
+ return initials.toUpperCase();
5
+ };
@@ -0,0 +1 @@
1
+ export { Avatar } from './avatar';
@@ -4,60 +4,102 @@ import { Button } from '.';
4
4
  const meta: Meta<typeof Button> = {
5
5
  title: 'Components/Button',
6
6
  component: Button,
7
- argTypes: {},
7
+ argTypes: {
8
+ variant: {
9
+ defaultValue: 'default',
10
+ },
11
+ intent: {
12
+ defaultValue: 'default',
13
+ },
14
+ size: {
15
+ defaultValue: 'sm',
16
+ },
17
+ },
8
18
  };
9
19
 
10
20
  export default meta;
11
21
  type Story = StoryObj<typeof Button>;
12
22
 
13
- const variants = ['primary', 'secondary', 'secondary-dark', 'danger'] as const;
14
- const sizes = ['xs', 'sm', 'md', 'lg', 'xl'] as const;
23
+ const variants = ['default', 'elevate'] as const;
24
+ const intent = ['default', 'action', 'danger'] as const;
25
+ const sizes = ['xs', 'sm', 'md', 'lg'] as const;
15
26
 
16
27
  export const AllButton: Story = {
17
28
  name: 'All Buttons',
18
29
  render: () => {
19
30
  return (
20
- <div className="grid grid-cols-5 gap-6 justify-items-center">
21
- {sizes.map(size => {
22
- return variants.map((variant, idx) => (
23
- <>
24
- {idx === 0 && <span className="place-self-start text-slate-500">{size}</span>}
25
- <Button variant={variant} size={size}>
26
- Click me
27
- </Button>
28
- </>
29
- ));
30
- })}
31
+ <div>
32
+ <div className="grid grid-cols-6 justify-items-center gap-6">
33
+ {sizes.map(size =>
34
+ variants.map(variant =>
35
+ intent.map(intent => (
36
+ <Button variant={variant} size={size} intent={intent} status="loading">
37
+ Button
38
+ </Button>
39
+ )),
40
+ ),
41
+ )}
42
+ </div>
31
43
  </div>
32
44
  );
33
45
  },
34
46
  };
35
47
 
36
- export const Primary: Story = {
48
+ export const Default: Story = {
49
+ args: {
50
+ intent: 'default',
51
+ variant: 'default',
52
+ children: 'Button',
53
+ },
54
+ };
55
+
56
+ export const Elevate: Story = {
37
57
  args: {
38
- variant: 'primary',
58
+ intent: 'default',
59
+ variant: 'elevate',
39
60
  children: 'Button',
40
61
  },
41
62
  };
42
63
 
43
- export const Secondary: Story = {
64
+ export const Action: Story = {
44
65
  args: {
45
- variant: 'secondary',
66
+ intent: 'action',
67
+ variant: 'default',
46
68
  children: 'Button',
47
69
  },
48
70
  };
49
71
 
50
72
  export const Danger: Story = {
51
73
  args: {
52
- variant: 'danger',
74
+ intent: 'danger',
75
+ variant: 'default',
76
+ children: 'Button',
77
+ },
78
+ };
79
+
80
+ export const Prepend: Story = {
81
+ args: {
82
+ intent: 'default',
83
+ variant: 'default',
84
+ children: 'Button',
85
+ prepend: '🤓',
86
+ },
87
+ };
88
+
89
+ export const Append: Story = {
90
+ args: {
91
+ intent: 'default',
92
+ variant: 'default',
53
93
  children: 'Button',
94
+ append: '🤓',
54
95
  },
55
96
  };
56
97
 
57
- export const Disabled: Story = {
98
+ export const IsLoading: Story = {
58
99
  args: {
59
- variant: 'primary',
100
+ intent: 'default',
101
+ variant: 'default',
60
102
  children: 'Button',
61
- disabled: true,
103
+ status: 'loading',
62
104
  },
63
105
  };
@@ -0,0 +1,116 @@
1
+ .c-btn {
2
+ @apply inline-grid cursor-pointer grid-flow-col items-center gap-2 whitespace-nowrap rounded border-none bg-transparent font-sans font-semibold text-gray no-underline -outline-offset-1;
3
+
4
+ &:focus-visible {
5
+ @apply outline outline-1 outline-inherit;
6
+ outline-color: currentColor;
7
+ }
8
+
9
+ &:disabled {
10
+ @apply cursor-default text-gray-300-600;
11
+ }
12
+
13
+ &__prepend,
14
+ &__append {
15
+ @apply flex items-center;
16
+ }
17
+
18
+ &__prepend {
19
+ @apply -ml-2;
20
+ }
21
+ &__append {
22
+ @apply -mr-2;
23
+ }
24
+
25
+ &__loading-spinner {
26
+ @apply absolute left-1 flex items-center justify-center;
27
+ }
28
+ }
29
+
30
+ .c-btn {
31
+ &,
32
+ .c-btn__loading-spinner {
33
+ @apply bg-purple-50-900;
34
+ }
35
+
36
+ &:not(:disabled):hover {
37
+ @apply outline outline-1 outline-purple-200-700;
38
+ }
39
+
40
+ &:not(:disabled):active {
41
+ @apply bg-purple-100-800;
42
+ }
43
+ }
44
+
45
+ .c-btn-loading {
46
+ @apply relative;
47
+
48
+ .c-btn__prepend,
49
+ .c-btn__append {
50
+ @apply opacity-0 transition-opacity;
51
+ }
52
+ }
53
+
54
+ .c-btn-elevate {
55
+ @apply shadow;
56
+
57
+ &,
58
+ .c-btn__loading-spinner {
59
+ @apply bg-elevate;
60
+ }
61
+
62
+ &:not(:disabled):hover {
63
+ @apply outline-gray-100-800;
64
+ }
65
+
66
+ &:not(:disabled):active {
67
+ @apply bg-purple-50-900;
68
+ }
69
+ }
70
+
71
+ .c-btn-action {
72
+ &,
73
+ .c-btn__loading-spinner {
74
+ @apply bg-cyan-100-800;
75
+ }
76
+
77
+ &:not(:disabled):hover {
78
+ @apply outline outline-1 outline-cyan-300-600;
79
+ }
80
+
81
+ &:not(:disabled):active {
82
+ @apply bg-cyan-200-700;
83
+ }
84
+ }
85
+
86
+ .c-btn-danger {
87
+ @apply text-pink-600-300;
88
+
89
+ &:not(:disabled):hover {
90
+ @apply outline-pink-300-600;
91
+ }
92
+ }
93
+
94
+ .c-btn-xs {
95
+ @apply h-6 py-2 px-4;
96
+
97
+ .c-btn__loading-spinner {
98
+ @apply left-[3px];
99
+ }
100
+ }
101
+
102
+ .c-btn-sm {
103
+ @apply h-9 px-6 text-sm;
104
+ }
105
+
106
+ .c-btn-md {
107
+ @apply h-11 px-8 text-base;
108
+ }
109
+
110
+ .c-btn-lg {
111
+ @apply h-14 px-10 text-lg;
112
+
113
+ .c-btn__loading-spinner {
114
+ @apply left-2;
115
+ }
116
+ }