@chesapeake/stack 0.1.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 (82) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +190 -0
  3. package/README.md +440 -0
  4. package/components/ui/avatar.tsx +87 -0
  5. package/components/ui/badge.tsx +49 -0
  6. package/components/ui/badgeVariants.ts +26 -0
  7. package/components/ui/button-group.tsx +67 -0
  8. package/components/ui/button.tsx +70 -0
  9. package/components/ui/buttonGroupVariants.ts +23 -0
  10. package/components/ui/buttonVariants.ts +38 -0
  11. package/components/ui/calendar.tsx +220 -0
  12. package/components/ui/card.tsx +162 -0
  13. package/components/ui/dialog.tsx +290 -0
  14. package/components/ui/drawer.tsx +227 -0
  15. package/components/ui/dropdown-menu.tsx +260 -0
  16. package/components/ui/index.ts +86 -0
  17. package/components/ui/input.tsx +59 -0
  18. package/components/ui/label.tsx +47 -0
  19. package/components/ui/location-input.md +194 -0
  20. package/components/ui/location-input.tsx +384 -0
  21. package/components/ui/popover.tsx +110 -0
  22. package/components/ui/select.tsx +306 -0
  23. package/components/ui/separator.tsx +50 -0
  24. package/components/ui/sonner-api.ts +8 -0
  25. package/components/ui/sonner.tsx +69 -0
  26. package/components/ui/textarea.tsx +53 -0
  27. package/components/ui/tooltip.tsx +125 -0
  28. package/components/ux/ActivityAnimation.tsx +135 -0
  29. package/components/ux/EmptyState.tsx +22 -0
  30. package/components/ux/FeedbackDrawer.tsx +141 -0
  31. package/components/ux/FireAnimation.tsx +189 -0
  32. package/components/ux/FriendList.tsx +111 -0
  33. package/components/ux/FriendRequestList.tsx +104 -0
  34. package/components/ux/GifSearch.tsx +264 -0
  35. package/components/ux/ImageUpload.tsx +829 -0
  36. package/components/ux/SelectedUsersList.tsx +91 -0
  37. package/components/ux/StandardLayout/PageLayout.tsx +107 -0
  38. package/components/ux/StandardLayout/ProfilePage.tsx +452 -0
  39. package/components/ux/StandardLayout/StandardLayout.tsx +345 -0
  40. package/components/ux/StandardLayout/index.ts +22 -0
  41. package/components/ux/TutorialCarousel.tsx +128 -0
  42. package/components/ux/UserSearch.tsx +324 -0
  43. package/components/ux/UserSelector.tsx +116 -0
  44. package/components/ux/auth/AuthSelector.tsx +154 -0
  45. package/components/ux/auth/MultiAuthProvider.tsx +196 -0
  46. package/components/ux/auth/README.md +317 -0
  47. package/components/ux/auth/context.ts +46 -0
  48. package/components/ux/auth/github/AuthCallback.tsx +177 -0
  49. package/components/ux/auth/github/AuthProvider.tsx +111 -0
  50. package/components/ux/auth/github/README.md +208 -0
  51. package/components/ux/auth/github/client.ts +127 -0
  52. package/components/ux/auth/github/config.ts +68 -0
  53. package/components/ux/auth/github/context.ts +34 -0
  54. package/components/ux/auth/github/default-client.ts +74 -0
  55. package/components/ux/auth/github/index.ts +43 -0
  56. package/components/ux/auth/github/types.ts +44 -0
  57. package/components/ux/auth/github/useGitHubAuth.ts +16 -0
  58. package/components/ux/auth/google/AuthCallback.tsx +170 -0
  59. package/components/ux/auth/google/AuthProvider.tsx +108 -0
  60. package/components/ux/auth/google/README.md +450 -0
  61. package/components/ux/auth/google/client.ts +109 -0
  62. package/components/ux/auth/google/config.ts +65 -0
  63. package/components/ux/auth/google/context.ts +34 -0
  64. package/components/ux/auth/google/default-client.ts +69 -0
  65. package/components/ux/auth/google/index.ts +43 -0
  66. package/components/ux/auth/google/types.ts +42 -0
  67. package/components/ux/auth/google/useGoogleAuth.ts +16 -0
  68. package/components/ux/auth/index.ts +72 -0
  69. package/components/ux/auth/useAuth.ts +16 -0
  70. package/components/ux/index.ts +46 -0
  71. package/components/ux/theme-provider-context.ts +20 -0
  72. package/components/ux/theme-provider.tsx +114 -0
  73. package/components/ux/useTheme.ts +42 -0
  74. package/index.ts +29 -0
  75. package/lib/utils.ts +57 -0
  76. package/package.json +170 -0
  77. package/styles/base.css +38 -0
  78. package/styles/components.css +54 -0
  79. package/styles/index.css +7 -0
  80. package/styles/tokens.css +189 -0
  81. package/tailwind.preset.ts +169 -0
  82. package/types/user.ts +69 -0
package/package.json ADDED
@@ -0,0 +1,170 @@
1
+ {
2
+ "name": "@chesapeake/stack",
3
+ "version": "0.1.0",
4
+ "description": "A simple, reusable React component library and design system built on shadcn/ui with Tailwind CSS",
5
+ "type": "module",
6
+ "packageManager": "npm@10.2.0",
7
+ "license": "Apache-2.0",
8
+ "author": "Chesapeake Computing <chris@chesapeake.dev>",
9
+ "keywords": [
10
+ "react",
11
+ "components",
12
+ "ui",
13
+ "design-system",
14
+ "tailwindcss",
15
+ "shadcn",
16
+ "typescript"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/chesapeake-computing/stack.git"
24
+ },
25
+ "homepage": "https://github.com/chesapeake-computing/stack#readme",
26
+ "bugs": {
27
+ "url": "https://github.com/chesapeake-computing/stack/issues"
28
+ },
29
+ "files": [
30
+ "components",
31
+ "lib",
32
+ "styles",
33
+ "types",
34
+ "index.ts",
35
+ "tailwind.preset.ts",
36
+ "README.md",
37
+ "LICENSE",
38
+ "CHANGELOG.md"
39
+ ],
40
+ "main": "./index.ts",
41
+ "types": "./index.ts",
42
+ "scripts": {
43
+ "dev": "vite",
44
+ "build": "vite build",
45
+ "preview": "vite preview",
46
+ "lint": "eslint .",
47
+ "lint:fix": "eslint . --fix",
48
+ "typecheck": "tsc -b --noEmit",
49
+ "fmt": "prettier --write .",
50
+ "fmt:check": "prettier --check .",
51
+ "prepublishOnly": "npm run lint && npm run typecheck"
52
+ },
53
+ "exports": {
54
+ ".": "./index.ts",
55
+ "./components/ui": "./components/ui/index.ts",
56
+ "./components/ui/button": "./components/ui/button.tsx",
57
+ "./components/ui/avatar": "./components/ui/avatar.tsx",
58
+ "./components/ui/badge": "./components/ui/badge.tsx",
59
+ "./components/ui/badgeVariants": "./components/ui/badgeVariants.ts",
60
+ "./components/ui/button-group": "./components/ui/button-group.tsx",
61
+ "./components/ui/buttonGroupVariants": "./components/ui/buttonGroupVariants.ts",
62
+ "./components/ui/buttonVariants": "./components/ui/buttonVariants.ts",
63
+ "./components/ui/calendar": "./components/ui/calendar.tsx",
64
+ "./components/ui/card": "./components/ui/card.tsx",
65
+ "./components/ui/dialog": "./components/ui/dialog.tsx",
66
+ "./components/ui/drawer": "./components/ui/drawer.tsx",
67
+ "./components/ui/dropdown-menu": "./components/ui/dropdown-menu.tsx",
68
+ "./components/ui/input": "./components/ui/input.tsx",
69
+ "./components/ui/label": "./components/ui/label.tsx",
70
+ "./components/ui/location-input": "./components/ui/location-input.tsx",
71
+ "./components/ui/popover": "./components/ui/popover.tsx",
72
+ "./components/ui/select": "./components/ui/select.tsx",
73
+ "./components/ui/separator": "./components/ui/separator.tsx",
74
+ "./components/ui/sonner": "./components/ui/sonner.tsx",
75
+ "./components/ui/sonner-api": "./components/ui/sonner-api.ts",
76
+ "./components/ui/textarea": "./components/ui/textarea.tsx",
77
+ "./components/ui/tooltip": "./components/ui/tooltip.tsx",
78
+ "./components/ux": "./components/ux/index.ts",
79
+ "./components/ux/ActivityAnimation": "./components/ux/ActivityAnimation.tsx",
80
+ "./components/ux/FireAnimation": "./components/ux/FireAnimation.tsx",
81
+ "./components/ux/GifSearch": "./components/ux/GifSearch.tsx",
82
+ "./components/ux/ImageUpload": "./components/ux/ImageUpload.tsx",
83
+ "./components/ux/PageLayout": "./components/ux/PageLayout.tsx",
84
+ "./components/ux/TutorialCarousel": "./components/ux/TutorialCarousel.tsx",
85
+ "./components/ux/theme-provider": "./components/ux/theme-provider.tsx",
86
+ "./components/ux/useTheme": "./components/ux/useTheme.ts",
87
+ "./components/ux/FeedbackDrawer": "./components/ux/FeedbackDrawer.tsx",
88
+ "./components/ux/auth": "./components/ux/auth/index.ts",
89
+ "./components/ux/auth/google": "./components/ux/auth/google/index.ts",
90
+ "./components/ux/auth/google/client": "./components/ux/auth/google/client.ts",
91
+ "./components/ux/auth/google/default-client": "./components/ux/auth/google/default-client.ts",
92
+ "./components/ux/auth/google/AuthProvider": "./components/ux/auth/google/AuthProvider.tsx",
93
+ "./components/ux/auth/google/AuthCallback": "./components/ux/auth/google/AuthCallback.tsx",
94
+ "./components/ux/auth/google/types": "./components/ux/auth/google/types.ts",
95
+ "./components/ux/auth/github": "./components/ux/auth/github/index.ts",
96
+ "./components/ux/auth/github/client": "./components/ux/auth/github/client.ts",
97
+ "./components/ux/auth/github/default-client": "./components/ux/auth/github/default-client.ts",
98
+ "./components/ux/auth/github/AuthProvider": "./components/ux/auth/github/AuthProvider.tsx",
99
+ "./components/ux/auth/github/AuthCallback": "./components/ux/auth/github/AuthCallback.tsx",
100
+ "./components/ux/auth/github/types": "./components/ux/auth/github/types.ts",
101
+ "./lib/utils": "./lib/utils.ts",
102
+ "./types/user": "./types/user.ts",
103
+ "./styles": "./styles/index.css",
104
+ "./tailwind.preset": "./tailwind.preset.ts",
105
+ "./eslint.config": "./eslint.config.js",
106
+ "./prettier.config": "./prettier.config.js"
107
+ },
108
+ "dependencies": {
109
+ "@radix-ui/react-avatar": "^1.1.10",
110
+ "@radix-ui/react-checkbox": "^1.1.1",
111
+ "@radix-ui/react-dialog": "^1.1.15",
112
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
113
+ "@radix-ui/react-label": "^2.1.7",
114
+ "@radix-ui/react-popover": "^1.1.15",
115
+ "@radix-ui/react-select": "^2.2.6",
116
+ "@radix-ui/react-separator": "^1.1.8",
117
+ "@radix-ui/react-slot": "^1.2.4",
118
+ "@radix-ui/react-tooltip": "^1.2.8",
119
+ "class-variance-authority": "^0.7.0",
120
+ "clsx": "^2.0.0",
121
+ "date-fns": "^4.1.0",
122
+ "lucide-react": "^0.400.0",
123
+ "sonner": "^1.7.4",
124
+ "tailwind-merge": "^2.0.0"
125
+ },
126
+ "devDependencies": {
127
+ "@eslint/js": "^9.21.0",
128
+ "@tailwindcss/vite": "^4.1.3",
129
+ "@types/node": "^22.14.0",
130
+ "@types/react": "^19.0.10",
131
+ "@types/react-dom": "^19.0.4",
132
+ "@vitejs/plugin-react": "^5.1.2",
133
+ "eslint": "^9.21.0",
134
+ "eslint-plugin-react-hooks": "^5.1.0",
135
+ "eslint-plugin-react-refresh": "^0.4.19",
136
+ "globals": "^15.15.0",
137
+ "prettier": "^3.5.3",
138
+ "typescript": "~5.7.2",
139
+ "typescript-eslint": "^8.24.1",
140
+ "vite": "^7.3.1"
141
+ },
142
+ "peerDependencies": {
143
+ "react": "^19.0.0",
144
+ "react-day-picker": "^9.11.1",
145
+ "react-dom": "^19.0.0",
146
+ "tailwindcss": "^4.1.0",
147
+ "tw-animate-css": "^1.2.0",
148
+ "vaul": "^1.1.2"
149
+ },
150
+ "peerDependenciesMeta": {
151
+ "tailwindcss": {
152
+ "optional": false
153
+ },
154
+ "tw-animate-css": {
155
+ "optional": false
156
+ },
157
+ "react-day-picker": {
158
+ "optional": false
159
+ },
160
+ "vaul": {
161
+ "optional": false
162
+ },
163
+ "react": {
164
+ "optional": false
165
+ },
166
+ "react-dom": {
167
+ "optional": false
168
+ }
169
+ }
170
+ }
@@ -0,0 +1,38 @@
1
+ /* Chesapeake Base Styles */
2
+ @layer base {
3
+ * {
4
+ @apply border-border outline-ring/50;
5
+ }
6
+ body {
7
+ @apply bg-background text-foreground;
8
+ font-family: var(--font-sans);
9
+ }
10
+ code,
11
+ pre {
12
+ font-family: var(--font-mono);
13
+ }
14
+ }
15
+
16
+ /* iOS Safe Area Utilities */
17
+ @layer utilities {
18
+ .pt-safe {
19
+ padding-top: env(safe-area-inset-top);
20
+ }
21
+
22
+ .pb-safe {
23
+ padding-bottom: env(safe-area-inset-bottom);
24
+ }
25
+
26
+ .pl-safe {
27
+ padding-left: env(safe-area-inset-left);
28
+ }
29
+
30
+ .pr-safe {
31
+ padding-right: env(safe-area-inset-right);
32
+ }
33
+
34
+ .h-screen {
35
+ height: 100vh;
36
+ height: 100dvh;
37
+ }
38
+ }
@@ -0,0 +1,54 @@
1
+ /* Chesapeake Component Styles */
2
+ /* Add any component-specific styles here that can't be handled by Tailwind */
3
+
4
+ /* Example: Custom animations or complex styles */
5
+ @keyframes slideInFromTop {
6
+ from {
7
+ transform: translateY(-100%);
8
+ opacity: 0;
9
+ }
10
+ to {
11
+ transform: translateY(0);
12
+ opacity: 1;
13
+ }
14
+ }
15
+
16
+ .animate-slide-in-from-top {
17
+ animation: slideInFromTop 0.3s ease-out;
18
+ }
19
+
20
+ /* Particle float animation for ActivityAnimation component */
21
+ @keyframes particle-float-opacity {
22
+ 0%,
23
+ 100% {
24
+ opacity: 0.3;
25
+ }
26
+ 50% {
27
+ opacity: 0.8;
28
+ }
29
+ }
30
+
31
+ /* Fire flicker animation for FireAnimation component */
32
+ @keyframes fire-flicker {
33
+ 0%,
34
+ 100% {
35
+ opacity: 0.8;
36
+ transform: scaleY(1) scaleX(1);
37
+ }
38
+ 25% {
39
+ opacity: 0.7;
40
+ transform: scaleY(1.1) scaleX(0.95);
41
+ }
42
+ 50% {
43
+ opacity: 0.8;
44
+ transform: scaleY(0.95) scaleX(1.05);
45
+ }
46
+ 75% {
47
+ opacity: 0.9;
48
+ transform: scaleY(1.05) scaleX(0.98);
49
+ }
50
+ }
51
+
52
+ .animate-fire-flicker {
53
+ animation: fire-flicker 1.5s ease-in-out infinite;
54
+ }
@@ -0,0 +1,7 @@
1
+ /* Chesapeake Shared Styles */
2
+ @import "tailwindcss";
3
+
4
+ /* Design tokens and base styles */
5
+ @import "./tokens.css";
6
+ @import "./base.css";
7
+ @import "./components.css";
@@ -0,0 +1,189 @@
1
+ /* Chesapeake Design Tokens - Base Theme */
2
+ /* Projects can override these variables in their own CSS files after importing @chesapeake/stack/styles */
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ /* Base theme variables */
7
+ :root {
8
+ --background: oklch(0.9399 0.0203 345.6985);
9
+ --foreground: oklch(0.4712 0 0);
10
+ --card: oklch(0.9498 0.05 86.8891);
11
+ --card-foreground: oklch(0.4712 0 0);
12
+ --popover: oklch(1 0 0);
13
+ --popover-foreground: oklch(0.4712 0 0);
14
+ --primary: oklch(0.6209 0.1801 348.1385);
15
+ --primary-foreground: oklch(1 0 0);
16
+ --secondary: oklch(0.8095 0.0694 198.1863);
17
+ --secondary-foreground: oklch(0.3211 0 0);
18
+ --muted: oklch(0.88 0.0504 212.0952);
19
+ --muted-foreground: oklch(0.5795 0 0);
20
+ --accent: oklch(0.9195 0.0801 87.667);
21
+ --accent-foreground: oklch(0.3211 0 0);
22
+ --destructive: oklch(0.7091 0.1697 21.9551);
23
+ --destructive-foreground: oklch(1 0 0);
24
+ --border: oklch(0.6209 0.1801 348.1385);
25
+ --input: oklch(0.9189 0 0);
26
+ --ring: oklch(0.7002 0.1597 350.7532);
27
+ --chart-1: oklch(0.7002 0.1597 350.7532);
28
+ --chart-2: oklch(0.8189 0.0799 212.0892);
29
+ --chart-3: oklch(0.9195 0.0801 87.667);
30
+ --chart-4: oklch(0.7998 0.111 348.1791);
31
+ --chart-5: oklch(0.6197 0.1899 353.9091);
32
+ --sidebar: oklch(0.914 0.0424 343.0913);
33
+ --sidebar-foreground: oklch(0.3211 0 0);
34
+ --sidebar-primary: oklch(0.6559 0.2118 354.3084);
35
+ --sidebar-primary-foreground: oklch(1 0 0);
36
+ --sidebar-accent: oklch(0.8228 0.1095 346.0184);
37
+ --sidebar-accent-foreground: oklch(0.3211 0 0);
38
+ --sidebar-border: oklch(0.9464 0.0327 307.1745);
39
+ --sidebar-ring: oklch(0.6559 0.2118 354.3084);
40
+ --font-sans: Poppins, sans-serif;
41
+ --font-serif: Lora, serif;
42
+ --font-mono: "Fira Code", monospace;
43
+ --radius: 0.4rem;
44
+ --shadow-x: 3px;
45
+ --shadow-y: 3px;
46
+ --shadow-blur: 0px;
47
+ --shadow-spread: 0px;
48
+ --shadow-opacity: 1;
49
+ --shadow-color: hsl(325.78 58.18% 56.86% / 0.5);
50
+ --shadow-2xs: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 0.5);
51
+ --shadow-xs: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 0.5);
52
+ --shadow-sm:
53
+ 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1),
54
+ 3px 1px 2px -1px hsl(325.78 58.18% 56.86% / 1);
55
+ --shadow:
56
+ 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1),
57
+ 3px 1px 2px -1px hsl(325.78 58.18% 56.86% / 1);
58
+ --shadow-md:
59
+ 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1),
60
+ 3px 2px 4px -1px hsl(325.78 58.18% 56.86% / 1);
61
+ --shadow-lg:
62
+ 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1),
63
+ 3px 4px 6px -1px hsl(325.78 58.18% 56.86% / 1);
64
+ --shadow-xl:
65
+ 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 1),
66
+ 3px 8px 10px -1px hsl(325.78 58.18% 56.86% / 1);
67
+ --shadow-2xl: 3px 3px 0px 0px hsl(325.78 58.18% 56.86% / 2.5);
68
+ --tracking-normal: 0em;
69
+ --spacing: 0.25rem;
70
+ }
71
+
72
+ .dark {
73
+ --background: oklch(0.2497 0.0305 234.1628);
74
+ --foreground: oklch(0.9306 0.0197 349.0785);
75
+ --card: oklch(0.2902 0.0299 233.5352);
76
+ --card-foreground: oklch(0.9306 0.0197 349.0785);
77
+ --popover: oklch(0.2902 0.0299 233.5352);
78
+ --popover-foreground: oklch(0.9306 0.0197 349.0785);
79
+ --primary: oklch(0.9195 0.0801 87.667);
80
+ --primary-foreground: oklch(0.2497 0.0305 234.1628);
81
+ --secondary: oklch(0.7794 0.0803 4.133);
82
+ --secondary-foreground: oklch(0.2497 0.0305 234.1628);
83
+ --muted: oklch(0.2713 0.0086 255.578);
84
+ --muted-foreground: oklch(0.7794 0.0803 4.133);
85
+ --accent: oklch(0.6699 0.0988 356.9762);
86
+ --accent-foreground: oklch(0.9306 0.0197 349.0785);
87
+ --destructive: oklch(0.6702 0.1806 350.3599);
88
+ --destructive-foreground: oklch(0.2497 0.0305 234.1628);
89
+ --border: oklch(0.3907 0.0399 242.2181);
90
+ --input: oklch(0.3093 0.0305 232.0027);
91
+ --ring: oklch(0.6998 0.0896 201.8672);
92
+ --chart-1: oklch(0.6998 0.0896 201.8672);
93
+ --chart-2: oklch(0.7794 0.0803 4.133);
94
+ --chart-3: oklch(0.6699 0.0988 356.9762);
95
+ --chart-4: oklch(0.4408 0.0702 217.0848);
96
+ --chart-5: oklch(0.2713 0.0086 255.578);
97
+ --sidebar: oklch(0.2303 0.027 235.9743);
98
+ --sidebar-foreground: oklch(0.967 0.0029 264.5419);
99
+ --sidebar-primary: oklch(0.6559 0.2118 354.3084);
100
+ --sidebar-primary-foreground: oklch(1 0 0);
101
+ --sidebar-accent: oklch(0.8228 0.1095 346.0184);
102
+ --sidebar-accent-foreground: oklch(0.2781 0.0296 256.848);
103
+ --sidebar-border: oklch(0.3729 0.0306 259.7328);
104
+ --sidebar-ring: oklch(0.6559 0.2118 354.3084);
105
+ --font-sans: Poppins, sans-serif;
106
+ --font-serif: Lora, serif;
107
+ --font-mono: "Fira Code", monospace;
108
+ --radius: 0.4rem;
109
+ --shadow-x: 3px;
110
+ --shadow-y: 3px;
111
+ --shadow-blur: 0px;
112
+ --shadow-spread: 0px;
113
+ --shadow-opacity: 1;
114
+ --shadow-color: #324859;
115
+ --shadow-2xs: 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 0.5);
116
+ --shadow-xs: 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 0.5);
117
+ --shadow-sm:
118
+ 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 1),
119
+ 3px 1px 2px -1px hsl(206.1538 28.0576% 27.2549% / 1);
120
+ --shadow:
121
+ 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 1),
122
+ 3px 1px 2px -1px hsl(206.1538 28.0576% 27.2549% / 1);
123
+ --shadow-md:
124
+ 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 1),
125
+ 3px 2px 4px -1px hsl(206.1538 28.0576% 27.2549% / 1);
126
+ --shadow-lg:
127
+ 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 1),
128
+ 3px 4px 6px -1px hsl(206.1538 28.0576% 27.2549% / 1);
129
+ --shadow-xl:
130
+ 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 1),
131
+ 3px 8px 10px -1px hsl(206.1538 28.0576% 27.2549% / 1);
132
+ --shadow-2xl: 3px 3px 0px 0px hsl(206.1538 28.0576% 27.2549% / 2.5);
133
+ --tracking-normal: 0em;
134
+ --spacing: 0.25rem;
135
+ }
136
+
137
+ /* Tailwind v4 theme integration */
138
+ @theme inline {
139
+ --color-background: var(--background);
140
+ --color-foreground: var(--foreground);
141
+ --color-card: var(--card);
142
+ --color-card-foreground: var(--card-foreground);
143
+ --color-popover: var(--popover);
144
+ --color-popover-foreground: var(--popover-foreground);
145
+ --color-primary: var(--primary);
146
+ --color-primary-foreground: var(--primary-foreground);
147
+ --color-secondary: var(--secondary);
148
+ --color-secondary-foreground: var(--secondary-foreground);
149
+ --color-muted: var(--muted);
150
+ --color-muted-foreground: var(--muted-foreground);
151
+ --color-accent: var(--accent);
152
+ --color-accent-foreground: var(--accent-foreground);
153
+ --color-destructive: var(--destructive);
154
+ --color-destructive-foreground: var(--destructive-foreground);
155
+ --color-border: var(--border);
156
+ --color-input: var(--input);
157
+ --color-ring: var(--ring);
158
+ --color-chart-1: var(--chart-1);
159
+ --color-chart-2: var(--chart-2);
160
+ --color-chart-3: var(--chart-3);
161
+ --color-chart-4: var(--chart-4);
162
+ --color-chart-5: var(--chart-5);
163
+ --color-sidebar: var(--sidebar);
164
+ --color-sidebar-foreground: var(--sidebar-foreground);
165
+ --color-sidebar-primary: var(--sidebar-primary);
166
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
167
+ --color-sidebar-accent: var(--sidebar-accent);
168
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
169
+ --color-sidebar-border: var(--sidebar-border);
170
+ --color-sidebar-ring: var(--sidebar-ring);
171
+
172
+ --font-sans: var(--font-sans);
173
+ --font-mono: var(--font-mono);
174
+ --font-serif: var(--font-serif);
175
+
176
+ --radius-sm: calc(var(--radius) - 4px);
177
+ --radius-md: calc(var(--radius) - 2px);
178
+ --radius-lg: var(--radius);
179
+ --radius-xl: calc(var(--radius) + 4px);
180
+
181
+ --shadow-2xs: var(--shadow-2xs);
182
+ --shadow-xs: var(--shadow-xs);
183
+ --shadow-sm: var(--shadow-sm);
184
+ --shadow: var(--shadow);
185
+ --shadow-md: var(--shadow-md);
186
+ --shadow-lg: var(--shadow-lg);
187
+ --shadow-xl: var(--shadow-xl);
188
+ --shadow-2xl: var(--shadow-2xl);
189
+ }
@@ -0,0 +1,169 @@
1
+ // Copyright 2026 Chesapeake Computing
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Config } from "tailwindcss";
5
+
6
+ const config: Config = {
7
+ content: [],
8
+ theme: {
9
+ extend: {
10
+ colors: {
11
+ border: "var(--border)",
12
+ input: "var(--input)",
13
+ ring: "var(--ring)",
14
+ background: "var(--background)",
15
+ foreground: "var(--foreground)",
16
+ primary: {
17
+ DEFAULT: "var(--primary)",
18
+ foreground: "var(--primary-foreground)",
19
+ },
20
+ secondary: {
21
+ DEFAULT: "var(--secondary)",
22
+ foreground: "var(--secondary-foreground)",
23
+ },
24
+ destructive: {
25
+ DEFAULT: "var(--destructive)",
26
+ foreground: "var(--destructive-foreground)",
27
+ },
28
+ muted: {
29
+ DEFAULT: "var(--muted)",
30
+ foreground: "var(--muted-foreground)",
31
+ },
32
+ accent: {
33
+ DEFAULT: "var(--accent)",
34
+ foreground: "var(--accent-foreground)",
35
+ },
36
+ popover: {
37
+ DEFAULT: "var(--popover)",
38
+ foreground: "var(--popover-foreground)",
39
+ },
40
+ card: {
41
+ DEFAULT: "var(--card)",
42
+ foreground: "var(--card-foreground)",
43
+ },
44
+ chart: {
45
+ "1": "var(--chart-1)",
46
+ "2": "var(--chart-2)",
47
+ "3": "var(--chart-3)",
48
+ "4": "var(--chart-4)",
49
+ "5": "var(--chart-5)",
50
+ },
51
+ sidebar: {
52
+ DEFAULT: "var(--sidebar)",
53
+ foreground: "var(--sidebar-foreground)",
54
+ primary: "var(--sidebar-primary)",
55
+ "primary-foreground": "var(--sidebar-primary-foreground)",
56
+ accent: "var(--sidebar-accent)",
57
+ "accent-foreground": "var(--sidebar-accent-foreground)",
58
+ border: "var(--sidebar-border)",
59
+ ring: "var(--sidebar-ring)",
60
+ },
61
+ },
62
+ borderRadius: {
63
+ lg: "var(--radius)",
64
+ md: "calc(var(--radius) - 2px)",
65
+ sm: "calc(var(--radius) - 4px)",
66
+ xl: "calc(var(--radius) + 4px)",
67
+ },
68
+ keyframes: {
69
+ "accordion-down": {
70
+ from: { height: "0" },
71
+ to: { height: "var(--radix-accordion-content-height)" },
72
+ },
73
+ "accordion-up": {
74
+ from: { height: "var(--radix-accordion-content-height)" },
75
+ to: { height: "0" },
76
+ },
77
+ "fade-in": {
78
+ from: { opacity: "0" },
79
+ to: { opacity: "1" },
80
+ },
81
+ "fade-out": {
82
+ from: { opacity: "1" },
83
+ to: { opacity: "0" },
84
+ },
85
+ "slide-in-from-top": {
86
+ "0%": {
87
+ transform: "translateY(-100%)",
88
+ },
89
+ "100%": {
90
+ transform: "translateY(0)",
91
+ },
92
+ },
93
+ "slide-in-from-bottom": {
94
+ "0%": {
95
+ transform: "translateY(100%)",
96
+ },
97
+ "100%": {
98
+ transform: "translateY(0)",
99
+ },
100
+ },
101
+ "slide-in-from-left": {
102
+ "0%": {
103
+ transform: "translateX(-100%)",
104
+ },
105
+ "100%": {
106
+ transform: "translateX(0)",
107
+ },
108
+ },
109
+ "slide-in-from-right": {
110
+ "0%": {
111
+ transform: "translateX(100%)",
112
+ },
113
+ "100%": {
114
+ transform: "translateX(0)",
115
+ },
116
+ },
117
+ "slide-out-to-top": {
118
+ "0%": {
119
+ transform: "translateY(0)",
120
+ },
121
+ "100%": {
122
+ transform: "translateY(-100%)",
123
+ },
124
+ },
125
+ "slide-out-to-bottom": {
126
+ "0%": {
127
+ transform: "translateY(0)",
128
+ },
129
+ "100%": {
130
+ transform: "translateY(100%)",
131
+ },
132
+ },
133
+ "slide-out-to-left": {
134
+ "0%": {
135
+ transform: "translateX(0)",
136
+ },
137
+ "100%": {
138
+ transform: "translateX(-100%)",
139
+ },
140
+ },
141
+ "slide-out-to-right": {
142
+ "0%": {
143
+ transform: "translateX(0)",
144
+ },
145
+ "100%": {
146
+ transform: "translateX(100%)",
147
+ },
148
+ },
149
+ },
150
+ animation: {
151
+ "accordion-down": "accordion-down 0.2s ease-out",
152
+ "accordion-up": "accordion-up 0.2s ease-out",
153
+ "fade-in": "fade-in 0.2s ease-out",
154
+ "fade-out": "fade-out 0.2s ease-out",
155
+ "slide-in-from-top": "slide-in-from-top 0.2s ease-out",
156
+ "slide-in-from-bottom": "slide-in-from-bottom 0.2s ease-out",
157
+ "slide-in-from-left": "slide-in-from-left 0.2s ease-out",
158
+ "slide-in-from-right": "slide-in-from-right 0.2s ease-out",
159
+ "slide-out-to-top": "slide-out-to-top 0.2s ease-out",
160
+ "slide-out-to-bottom": "slide-out-to-bottom 0.2s ease-out",
161
+ "slide-out-to-left": "slide-out-to-left 0.2s ease-out",
162
+ "slide-out-to-right": "slide-out-to-right 0.2s ease-out",
163
+ },
164
+ },
165
+ },
166
+ plugins: [],
167
+ };
168
+
169
+ export default config;