startx 1.0.2 → 1.0.4

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 (148) hide show
  1. package/.dockerignore +4 -0
  2. package/apps/cli/src/commands/index.ts +1 -1
  3. package/apps/cli/src/commands/{common → test}/test.ts +4 -2
  4. package/apps/cli/tsconfig.json +0 -1
  5. package/apps/core-server/Dockerfile +5 -4
  6. package/apps/core-server/package.json +1 -1
  7. package/apps/core-server/tsconfig.json +1 -1
  8. package/apps/queue-worker/package.json +1 -1
  9. package/apps/queue-worker/tsconfig.json +1 -1
  10. package/apps/startx-cli/dist/index.mjs +68 -53
  11. package/apps/startx-cli/src/commands/package.ts +453 -0
  12. package/apps/startx-cli/src/configs/scripts.ts +18 -2
  13. package/apps/startx-cli/src/index.ts +2 -4
  14. package/apps/startx-cli/src/types.ts +2 -4
  15. package/apps/startx-cli/src/utils/inquirer.ts +8 -1
  16. package/apps/web-client/.dockerignore +4 -0
  17. package/apps/web-client/app/app.css +1 -0
  18. package/apps/web-client/app/components.json +23 -0
  19. package/apps/web-client/app/config/auth/auth-state.ts +59 -0
  20. package/apps/web-client/app/config/axios-client.ts +87 -0
  21. package/apps/web-client/app/config/env.ts +5 -0
  22. package/apps/web-client/app/entry.client.tsx +7 -0
  23. package/apps/web-client/app/eslint.config.ts +4 -0
  24. package/apps/web-client/app/root.tsx +77 -0
  25. package/apps/web-client/app/routes/home.tsx +12 -0
  26. package/apps/web-client/app/routes.ts +3 -0
  27. package/apps/web-client/eslint.config.ts +4 -0
  28. package/apps/web-client/package.json +55 -0
  29. package/apps/web-client/react-router.config.ts +7 -0
  30. package/apps/web-client/tsconfig.json +22 -0
  31. package/apps/web-client/vite-env.d.ts +8 -0
  32. package/apps/web-client/vite.config.ts +30 -0
  33. package/biome.json +5 -0
  34. package/configs/eslint-config/eslint.config.ts +1 -0
  35. package/configs/eslint-config/src/configs/base.ts +2 -1
  36. package/configs/eslint-config/src/configs/frontend.ts +1 -1
  37. package/configs/eslint-config/tsconfig.json +1 -1
  38. package/configs/typescript-config/tsconfig.frontend.json +1 -1
  39. package/configs/vitest-config/tsconfig.json +1 -1
  40. package/package.json +1 -1
  41. package/packages/@db/drizzle/tsconfig.json +1 -1
  42. package/packages/@db/sqlite/tsconfig.json +1 -1
  43. package/packages/@repo/env/package.json +1 -2
  44. package/packages/@repo/env/src/utils.ts +17 -11
  45. package/packages/@repo/env/tsconfig.json +1 -1
  46. package/packages/@repo/lib/package.json +3 -1
  47. package/packages/@repo/lib/src/session-module/i-session.ts +108 -0
  48. package/packages/@repo/lib/src/session-module/index.ts +8 -111
  49. package/packages/@repo/lib/src/session-module/redis-session.ts +44 -0
  50. package/packages/@repo/lib/tsconfig.json +0 -1
  51. package/packages/@repo/logger/package.json +0 -1
  52. package/packages/@repo/logger/tsconfig.json +1 -1
  53. package/packages/@repo/mail/tsconfig.json +1 -1
  54. package/packages/@repo/redis/tsconfig.json +1 -1
  55. package/packages/aix/package.json +2 -0
  56. package/packages/aix/src/providers/ai-interface.ts +4 -4
  57. package/packages/aix/src/providers/bedrock/bedrock.ts +261 -0
  58. package/packages/aix/src/providers/default-models.ts +65 -0
  59. package/packages/aix/src/providers/openai/openai.ts +2 -2
  60. package/packages/aix/src/providers/providers.ts +11 -0
  61. package/packages/aix/src/providers/types.ts +1 -1
  62. package/packages/{constants → common}/package.json +4 -2
  63. package/packages/{constants/src/index.ts → common/src/constants.ts} +0 -5
  64. package/packages/common/src/types/users.ts +10 -0
  65. package/packages/{constants → common}/tsconfig.json +0 -3
  66. package/packages/ui/components.json +15 -8
  67. package/packages/ui/package.json +24 -36
  68. package/packages/ui/src/api/axios/i-client.ts +40 -0
  69. package/packages/ui/src/api/index.ts +6 -0
  70. package/packages/ui/src/api/query-provider.tsx +34 -0
  71. package/packages/ui/src/api/use-api/api-builder.ts +139 -0
  72. package/packages/ui/src/api/use-api/api-helpers.ts +165 -0
  73. package/packages/ui/src/api/use-api/api-types.ts +138 -0
  74. package/packages/ui/src/api/use-api/query-factory.ts +66 -0
  75. package/packages/ui/src/api/use-api/react-query/types.ts +64 -0
  76. package/packages/ui/src/api/use-api/react-query/use-api-client.ts +56 -0
  77. package/packages/ui/src/api/use-api/react-query/use-api.ts +297 -0
  78. package/packages/ui/src/components/custom/form-wrapper.tsx +113 -160
  79. package/packages/ui/src/components/custom/grid-component.tsx +4 -4
  80. package/packages/ui/src/components/custom/hover-tool.tsx +1 -1
  81. package/packages/ui/src/components/custom/image-picker.tsx +18 -20
  82. package/packages/ui/src/components/custom/no-content.tsx +6 -16
  83. package/packages/ui/src/components/custom/page-section.tsx +14 -17
  84. package/packages/ui/src/components/custom/simple-popover.tsx +5 -9
  85. package/packages/ui/src/components/custom/theme-provider.tsx +117 -42
  86. package/packages/ui/src/components/custom/typography.tsx +20 -22
  87. package/packages/ui/src/components/extensions/timeline.tsx +100 -0
  88. package/packages/ui/src/components/ui/alert-dialog.tsx +46 -108
  89. package/packages/ui/src/components/ui/avatar.tsx +79 -42
  90. package/packages/ui/src/components/ui/badge.tsx +29 -34
  91. package/packages/ui/src/components/ui/breadcrumb.tsx +65 -81
  92. package/packages/ui/src/components/ui/button.tsx +80 -80
  93. package/packages/ui/src/components/ui/card.tsx +48 -69
  94. package/packages/ui/src/components/ui/carousel.tsx +184 -211
  95. package/packages/ui/src/components/ui/checkbox.tsx +21 -24
  96. package/packages/ui/src/components/ui/command.tsx +121 -102
  97. package/packages/ui/src/components/ui/dialog.tsx +45 -32
  98. package/packages/ui/src/components/ui/dropdown-menu.tsx +45 -33
  99. package/packages/ui/src/components/ui/field.tsx +218 -0
  100. package/packages/ui/src/components/ui/form.tsx +63 -76
  101. package/packages/ui/src/components/ui/input-group.tsx +137 -0
  102. package/packages/ui/src/components/ui/input-otp.tsx +60 -50
  103. package/packages/ui/src/components/ui/input.tsx +16 -15
  104. package/packages/ui/src/components/ui/label.tsx +14 -17
  105. package/packages/ui/src/components/ui/multiple-select.tsx +22 -33
  106. package/packages/ui/src/components/ui/popover.tsx +20 -8
  107. package/packages/ui/src/components/ui/select.tsx +33 -34
  108. package/packages/ui/src/components/ui/separator.tsx +8 -8
  109. package/packages/ui/src/components/ui/sheet.tsx +32 -59
  110. package/packages/ui/src/components/ui/sidebar.tsx +654 -0
  111. package/packages/ui/src/components/ui/skeleton.tsx +2 -8
  112. package/packages/ui/src/components/ui/sonner.tsx +39 -0
  113. package/packages/ui/src/components/ui/spinner.tsx +6 -13
  114. package/packages/ui/src/components/ui/switch.tsx +15 -10
  115. package/packages/ui/src/components/ui/table.tsx +48 -89
  116. package/packages/ui/src/components/ui/tabs.tsx +37 -15
  117. package/packages/ui/src/components/ui/textarea.tsx +13 -13
  118. package/packages/ui/src/components/ui/tooltip.tsx +37 -23
  119. package/packages/ui/src/{components/hooks → hooks}/event/use-click.tsx +6 -10
  120. package/packages/ui/src/hooks/time/use-timer.tsx +51 -0
  121. package/packages/ui/src/hooks/use-media-query.tsx +19 -0
  122. package/packages/ui/src/hooks/use-mobile.tsx +17 -0
  123. package/packages/ui/src/{components/hooks → hooks}/use-update-effect.tsx +2 -2
  124. package/packages/ui/src/lib/utils.ts +113 -0
  125. package/packages/ui/src/styles/globals.css +314 -0
  126. package/packages/ui/src/styles/tailwind.css +89 -0
  127. package/packages/ui/tsconfig.json +7 -9
  128. package/pnpm-workspace.yaml +74 -64
  129. package/packages/ui/postcss.config.mjs +0 -9
  130. package/packages/ui/src/components/extensions/carousel.tsx +0 -392
  131. package/packages/ui/src/components/hooks/time/useTimer.tsx +0 -51
  132. package/packages/ui/src/components/hooks/use-media-query.tsx +0 -19
  133. package/packages/ui/src/components/lib/utils.ts +0 -242
  134. package/packages/ui/src/components/ui/timeline.tsx +0 -118
  135. package/packages/ui/src/components/util/n-formattor.ts +0 -22
  136. package/packages/ui/src/components/util/storage.ts +0 -37
  137. package/packages/ui/src/globals.css +0 -87
  138. package/packages/ui/tailwind.config.ts +0 -94
  139. /package/packages/{constants → common}/eslint.config.ts +0 -0
  140. /package/packages/{constants → common}/src/api.ts +0 -0
  141. /package/packages/{constants → common}/src/time.ts +0 -0
  142. /package/packages/{constants → common}/vitest.config.ts +0 -0
  143. /package/packages/ui/src/{components/hooks/time/useDebounce.tsx → hooks/time/use-debounce.tsx} +0 -0
  144. /package/packages/ui/src/{components/hooks/time/useInterval.tsx → hooks/time/use-interval.tsx} +0 -0
  145. /package/packages/ui/src/{components/hooks/time/useTimeout.tsx → hooks/time/use-timeout.tsx} +0 -0
  146. /package/packages/ui/src/{components/hooks → hooks}/use-persistent-storage.tsx +0 -0
  147. /package/packages/ui/src/{components/hooks → hooks}/use-window-dimension.tsx +0 -0
  148. /package/packages/ui/src/{components/sonner.tsx → sonner.ts} +0 -0
@@ -0,0 +1,113 @@
1
+ import { type ClassValue, clsx } from "clsx";
2
+ import {
3
+ differenceInDays,
4
+ differenceInYears,
5
+ format,
6
+ formatDistance,
7
+ isThisWeek,
8
+ isToday,
9
+ isYesterday,
10
+ parseISO,
11
+ } from "date-fns";
12
+ import { twMerge } from "tailwind-merge";
13
+
14
+ export function cn(...inputs: ClassValue[]) {
15
+ return twMerge(clsx(inputs));
16
+ }
17
+ export class FormUtils {
18
+ static getFormData(object: Record<string, any>): FormData {
19
+ const formData = new FormData();
20
+ Object.entries(object).forEach(([key, value]) => {
21
+ if (value === undefined || value === null) return;
22
+
23
+ if (value instanceof Blob || value instanceof File) {
24
+ formData.append(key, value);
25
+ } else if (value instanceof FileList || (Array.isArray(value) && value[0] instanceof File)) {
26
+ Array.from(value as File[]).forEach(file => formData.append(key, file));
27
+ } else if (typeof value === "string") {
28
+ formData.append(key, value);
29
+ } else {
30
+ formData.append(key, JSON.stringify(value));
31
+ }
32
+ });
33
+ return formData;
34
+ }
35
+ }
36
+
37
+ export class UrlUtils {
38
+ static switchPath(pathname: string, tab: string): string {
39
+ const fragments = pathname.split("/").filter(Boolean);
40
+ fragments[2] = tab;
41
+ return `/${fragments.join("/")}`;
42
+ }
43
+
44
+ static isValidUrl(url: string): boolean {
45
+ try {
46
+ return new URL(url).origin !== "null";
47
+ } catch {
48
+ return false;
49
+ }
50
+ }
51
+ }
52
+
53
+ export class DateUtils {
54
+ static getRelativeDate(date?: string | Date, includeTime = true): string {
55
+ if (!date) return "";
56
+ const d = new Date(date);
57
+ const now = new Date();
58
+
59
+ if (isToday(d)) return includeTime ? format(d, "h:mm a") : "today";
60
+ if (isYesterday(d)) return "yesterday";
61
+ if (isThisWeek(d) && differenceInDays(now, d) <= 7) return format(d, "EEEE");
62
+
63
+ return format(d, "dd/MM/yy");
64
+ }
65
+
66
+ static getRelativeDateWithTime(date?: string | Date): string {
67
+ if (!date) return "";
68
+ return formatDistance(new Date(date), new Date(), { addSuffix: true });
69
+ }
70
+
71
+ static getRelativeProDate(dateString: string): string {
72
+ try {
73
+ const date = parseISO(dateString);
74
+ const formatStr = differenceInYears(new Date(), date) >= 1 ? "dd MMM yyyy, h:mm a" : "dd MMM, h:mm a";
75
+ return format(date, formatStr);
76
+ } catch (error) {
77
+ console.error("Error formatting date:", error);
78
+ return "";
79
+ }
80
+ }
81
+ }
82
+
83
+ export class FormatUtils {
84
+ static numberWithKMB(num: number): string {
85
+ return new Intl.NumberFormat("en-US", {
86
+ notation: "compact",
87
+ minimumSignificantDigits: 1,
88
+ maximumSignificantDigits: 3,
89
+ }).format(num);
90
+ }
91
+
92
+ static currencyToNumber(formattedCurrency: string): number {
93
+ const numericString = formattedCurrency.replace(/[^0-9.-]+/g, "");
94
+ const parsedNumber = Number.parseFloat(numericString);
95
+ if (isNaN(parsedNumber)) throw new Error("Invalid currency format");
96
+ return parsedNumber;
97
+ }
98
+
99
+ static createLabels(e: string): string {
100
+ return e
101
+ .replaceAll("_", " ")
102
+ .replace(/\b\w/g, char => char.toUpperCase())
103
+ .trim();
104
+ }
105
+ }
106
+
107
+ export class ValidationUtils {
108
+ static isValidId(str: string): boolean {
109
+ return /^[a-f0-9]{24}$/i.test(str);
110
+ }
111
+ }
112
+
113
+ export { cva, type VariantProps } from "class-variance-authority";
@@ -0,0 +1,314 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "./tailwind.css";
4
+
5
+ @plugin "@tailwindcss/typography";
6
+
7
+ @import "@fontsource-variable/inter";
8
+ @import "@fontsource-variable/eb-garamond";
9
+
10
+ @custom-variant dark (&:is(.dark *));
11
+ @source "../../../apps/**/*.{ts,tsx}";
12
+ @source "../../../components/**/*.{ts,tsx}";
13
+ @source "../**/*.{ts,tsx}";
14
+
15
+ /* =====================================================
16
+ 🌞 LIGHT MODE (Base & Default Blue Theme)
17
+ ===================================================== */
18
+ :root {
19
+ --background: oklch(1 0 0);
20
+ --foreground: oklch(0.145 0.008 326);
21
+ --card: oklch(1 0 0);
22
+ --card-foreground: oklch(0.145 0.008 326);
23
+ --popover: oklch(1 0 0);
24
+ --popover-foreground: oklch(0.145 0.008 326);
25
+ --secondary: oklch(0.967 0.001 286.375);
26
+ --secondary-foreground: oklch(0.21 0.006 285.885);
27
+ --muted: oklch(0.96 0.003 325.6);
28
+ --muted-foreground: oklch(0.542 0.034 322.5);
29
+ --destructive: oklch(0.577 0.245 27.325);
30
+ --border: oklch(0.922 0.005 325.62);
31
+ --input: oklch(0.922 0.005 325.62);
32
+
33
+ /* Default Theme: Blue */
34
+ --primary: oklch(0.52 0.105 223.128);
35
+ --primary-foreground: oklch(0.984 0.019 200.873);
36
+ --accent: oklch(0.96 0.003 325.6);
37
+ --accent-foreground: oklch(0.212 0.019 322.12);
38
+ --ring: oklch(0.711 0.019 323.02);
39
+
40
+ --chart-1: oklch(0.81 0.117 11.638);
41
+ --chart-2: oklch(0.645 0.246 16.439);
42
+ --chart-3: oklch(0.586 0.253 17.585);
43
+ --chart-4: oklch(0.514 0.222 16.935);
44
+ --chart-5: oklch(0.455 0.188 13.697);
45
+ --radius: 0.875rem;
46
+
47
+ --sidebar: oklch(0.985 0 0);
48
+ --sidebar-foreground: oklch(0.145 0.008 326);
49
+ --sidebar-primary: oklch(0.609 0.126 221.723);
50
+ --sidebar-primary-foreground: oklch(0.984 0.019 200.873);
51
+ --sidebar-accent: oklch(0.96 0.003 325.6);
52
+ --sidebar-accent-foreground: oklch(0.212 0.019 322.12);
53
+ --sidebar-border: oklch(0.922 0.005 325.62);
54
+ --sidebar-ring: oklch(0.711 0.019 323.02);
55
+ }
56
+
57
+ /* =====================================================
58
+ 🌑 DARK MODE (Base & Default Blue Theme)
59
+ ===================================================== */
60
+ .dark {
61
+ --background: oklch(0.145 0.008 326);
62
+ --foreground: oklch(0.985 0 0);
63
+ --card: oklch(0.212 0.019 322.12);
64
+ --card-foreground: oklch(0.985 0 0);
65
+ --popover: oklch(0.212 0.019 322.12);
66
+ --popover-foreground: oklch(0.985 0 0);
67
+ --secondary: oklch(0.274 0.006 286.033);
68
+ --secondary-foreground: oklch(0.985 0 0);
69
+ --muted: oklch(0.263 0.024 320.12);
70
+ --muted-foreground: oklch(0.711 0.019 323.02);
71
+ --destructive: oklch(0.704 0.191 22.216);
72
+ --border: oklch(1 0 0 / 10%);
73
+ --input: oklch(1 0 0 / 15%);
74
+
75
+ /* Default Theme: Blue */
76
+ --primary: oklch(0.45 0.085 224.283);
77
+ --primary-foreground: oklch(0.984 0.019 200.873);
78
+ --accent: oklch(0.263 0.024 320.12);
79
+ --accent-foreground: oklch(0.985 0 0);
80
+ --ring: oklch(0.542 0.034 322.5);
81
+
82
+ --chart-1: oklch(0.81 0.117 11.638);
83
+ --chart-2: oklch(0.645 0.246 16.439);
84
+ --chart-3: oklch(0.586 0.253 17.585);
85
+ --chart-4: oklch(0.514 0.222 16.935);
86
+ --chart-5: oklch(0.455 0.188 13.697);
87
+
88
+ --sidebar: oklch(0.212 0.019 322.12);
89
+ --sidebar-foreground: oklch(0.985 0 0);
90
+ --sidebar-primary: oklch(0.715 0.143 215.221);
91
+ --sidebar-primary-foreground: oklch(0.302 0.056 229.695);
92
+ --sidebar-accent: oklch(0.263 0.024 320.12);
93
+ --sidebar-accent-foreground: oklch(0.985 0 0);
94
+ --sidebar-border: oklch(1 0 0 / 10%);
95
+ --sidebar-ring: oklch(0.542 0.034 322.5);
96
+ }
97
+
98
+ /* =====================================================
99
+ 🎨 THEME VARIANTS (Overrides for both Light & Dark)
100
+ ===================================================== */
101
+
102
+ [data-theme="orange"] {
103
+ --primary: #ea580c;
104
+ --primary-foreground: #ffffff;
105
+ --ring: #ea580c;
106
+ --accent: color-mix(in oklab, #ea580c 15%, transparent);
107
+ --accent-foreground: #ea580c;
108
+ }
109
+
110
+ [data-theme="purple"] {
111
+ --primary: #7c3aed;
112
+ --primary-foreground: #ffffff;
113
+ --ring: #7c3aed;
114
+ --accent: color-mix(in oklab, #7c3aed 15%, transparent);
115
+ --accent-foreground: #7c3aed;
116
+ }
117
+
118
+ [data-theme="emerald"] {
119
+ --primary: #059669;
120
+ --primary-foreground: #ffffff;
121
+ --ring: #059669;
122
+ --accent: color-mix(in oklab, #059669 15%, transparent);
123
+ --accent-foreground: #059669;
124
+ }
125
+
126
+ [data-theme="rose"] {
127
+ --primary: #e11d48;
128
+ --primary-foreground: #ffffff;
129
+ --ring: #e11d48;
130
+ --accent: color-mix(in oklab, #e11d48 15%, transparent);
131
+ --accent-foreground: #e11d48;
132
+ }
133
+
134
+ [data-theme="amber"] {
135
+ --primary: #d97706;
136
+ --primary-foreground: #ffffff;
137
+ --ring: #d97706;
138
+ --accent: color-mix(in oklab, #d97706 15%, transparent);
139
+ --accent-foreground: #d97706;
140
+ }
141
+
142
+ [data-theme="brick"] {
143
+ --primary: #b91c1c;
144
+ --primary-foreground: #ffffff;
145
+ --ring: #b91c1c;
146
+ --accent: color-mix(in oklab, #b91c1c 15%, transparent);
147
+ --accent-foreground: #b91c1c;
148
+ }
149
+ [data-theme="blue"] {
150
+ --primary: #4169e1;
151
+ --primary-foreground: #ffffff;
152
+ --ring: #4169e1;
153
+ --accent: color-mix(in oklab, #4169e1 15%, transparent);
154
+ --accent-foreground: #4169e1;
155
+ }
156
+ [data-theme="rust"] {
157
+ --primary: #c2410c;
158
+ --primary-foreground: #ffffff;
159
+ --ring: #c2410c;
160
+ --accent: color-mix(in oklab, #c2410c 15%, transparent);
161
+ --accent-foreground: #c2410c;
162
+ }
163
+
164
+ [data-theme="cyan"] {
165
+ --primary: #0891b2;
166
+ --primary-foreground: #ffffff;
167
+ --ring: #0891b2;
168
+ --accent: color-mix(in oklab, #0891b2 15%, transparent);
169
+ --accent-foreground: #0891b2;
170
+ }
171
+
172
+ [data-theme="indigo"] {
173
+ --primary: #4f46e5;
174
+ --primary-foreground: #ffffff;
175
+ --ring: #4f46e5;
176
+ --accent: color-mix(in oklab, #4f46e5 15%, transparent);
177
+ --accent-foreground: #4f46e5;
178
+ }
179
+ .dark[data-theme="indigo"] {
180
+ --primary: #6366f1;
181
+ --primary-foreground: #ffffff;
182
+ --ring: #6366f1;
183
+ --accent: color-mix(in oklab, #6366f1 20%, transparent);
184
+ --accent-foreground: #818cf8;
185
+ }
186
+ /* =====================================================
187
+ 🛠️ TAILWIND V4 VARIABLE MAPPING
188
+ ===================================================== */
189
+ @theme inline {
190
+ --color-background: var(--background);
191
+ --color-foreground: var(--foreground);
192
+ --color-card: var(--card);
193
+ --color-card-foreground: var(--card-foreground);
194
+ --color-popover: var(--popover);
195
+ --color-popover-foreground: var(--popover-foreground);
196
+ --color-primary: var(--primary);
197
+ --color-primary-foreground: var(--primary-foreground);
198
+ --color-secondary: var(--secondary);
199
+ --color-secondary-foreground: var(--secondary-foreground);
200
+ --color-muted: var(--muted);
201
+ --color-muted-foreground: var(--muted-foreground);
202
+ --color-accent: var(--accent);
203
+ --color-accent-foreground: var(--accent-foreground);
204
+ --color-destructive: var(--destructive);
205
+ --color-border: var(--border);
206
+ --color-input: var(--input);
207
+ --color-ring: var(--ring);
208
+
209
+ --color-chart-1: var(--chart-1);
210
+ --color-chart-2: var(--chart-2);
211
+ --color-chart-3: var(--chart-3);
212
+ --color-chart-4: var(--chart-4);
213
+ --color-chart-5: var(--chart-5);
214
+
215
+ --radius-sm: calc(var(--radius) * 0.6);
216
+ --radius-md: calc(var(--radius) * 0.8);
217
+ --radius-lg: var(--radius);
218
+ --radius-xl: calc(var(--radius) * 1.4);
219
+ --radius-2xl: calc(var(--radius) * 1.8);
220
+ --radius-3xl: calc(var(--radius) * 2.2);
221
+ --radius-4xl: calc(var(--radius) * 2.6);
222
+
223
+ --color-sidebar: var(--sidebar);
224
+ --color-sidebar-foreground: var(--sidebar-foreground);
225
+ --color-sidebar-primary: var(--sidebar-primary);
226
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
227
+ --color-sidebar-accent: var(--sidebar-accent);
228
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
229
+ --color-sidebar-border: var(--sidebar-border);
230
+ --color-sidebar-ring: var(--sidebar-ring);
231
+
232
+ --font-sans: "Inter Variable", sans-serif;
233
+ --font-heading: "EB Garamond Variable", serif;
234
+ }
235
+
236
+ /* =====================================================
237
+ 🧱 BASE STYLES & RESETS
238
+ ===================================================== */
239
+ @layer base {
240
+ * {
241
+ @apply border-border outline-ring/50;
242
+ }
243
+ body {
244
+ @apply bg-background text-foreground;
245
+ }
246
+ button:not(:disabled),
247
+ [role="button"]:not(:disabled) {
248
+ cursor: pointer;
249
+ }
250
+
251
+ /* Autofill resets to prevent white backgrounds in dark mode */
252
+ input:-webkit-autofill,
253
+ input:-webkit-autofill:hover,
254
+ input:-webkit-autofill:focus,
255
+ input:-webkit-autofill:active,
256
+ textarea:-webkit-autofill,
257
+ textarea:-webkit-autofill:hover,
258
+ textarea:-webkit-autofill:focus,
259
+ textarea:-webkit-autofill:active {
260
+ -webkit-box-shadow: 0 0 0 1000px transparent inset !important;
261
+ box-shadow: 0 0 0 1000px transparent inset !important;
262
+ -webkit-text-fill-color: var(--foreground) !important;
263
+ caret-color: var(--foreground) !important;
264
+ transition: background-color 9999s ease-in-out 0s !important;
265
+ }
266
+
267
+ .dark input:-webkit-autofill,
268
+ .dark input:-webkit-autofill:hover,
269
+ .dark input:-webkit-autofill:focus,
270
+ .dark input:-webkit-autofill:active,
271
+ .dark textarea:-webkit-autofill,
272
+ .dark textarea:-webkit-autofill:hover,
273
+ .dark textarea:-webkit-autofill:focus,
274
+ .dark textarea:-webkit-autofill:active {
275
+ -webkit-text-fill-color: var(--foreground) !important;
276
+ caret-color: var(--foreground) !important;
277
+ }
278
+ }
279
+
280
+ /* =====================================================
281
+ ✨ ANIMATED BORDER UTILITY
282
+ ===================================================== */
283
+ @property --qc-border-angle {
284
+ syntax: "<angle>";
285
+ initial-value: 0deg;
286
+ inherits: false;
287
+ }
288
+
289
+ @keyframes qc-border-spin {
290
+ to {
291
+ --qc-border-angle: 360deg;
292
+ }
293
+ }
294
+
295
+ .qc-animated-border {
296
+ position: relative;
297
+ border: 1px solid var(--border);
298
+ background:
299
+ linear-gradient(var(--card), var(--card)) padding-box,
300
+ conic-gradient(
301
+ from var(--qc-border-angle),
302
+ transparent 0deg,
303
+ transparent 300deg,
304
+ var(--primary) 330deg,
305
+ transparent 360deg
306
+ )
307
+ border-box;
308
+ background-clip: padding-box, border-box;
309
+ }
310
+
311
+ .qc-animated-border:hover {
312
+ border-color: transparent;
313
+ animation: qc-border-spin 4.8s linear infinite;
314
+ }
@@ -0,0 +1,89 @@
1
+ @theme inline {
2
+ @keyframes accordion-down {
3
+ from {
4
+ height: 0;
5
+ }
6
+ to {
7
+ height: var(--radix-accordion-content-height, var(--accordion-panel-height, auto));
8
+ }
9
+ }
10
+
11
+ @keyframes accordion-up {
12
+ from {
13
+ height: var(--radix-accordion-content-height, var(--accordion-panel-height, auto));
14
+ }
15
+ to {
16
+ height: 0;
17
+ }
18
+ }
19
+ }
20
+
21
+ /* Custom variants */
22
+ @custom-variant data-open {
23
+ &:where([data-state="open"]),
24
+ &:where([data-open]:not([data-open="false"])) {
25
+ @slot;
26
+ }
27
+ }
28
+
29
+ @custom-variant data-closed {
30
+ &:where([data-state="closed"]),
31
+ &:where([data-closed]:not([data-closed="false"])) {
32
+ @slot;
33
+ }
34
+ }
35
+
36
+ @custom-variant data-checked {
37
+ &:where([data-state="checked"]),
38
+ &:where([data-checked]:not([data-checked="false"])) {
39
+ @slot;
40
+ }
41
+ }
42
+
43
+ @custom-variant data-unchecked {
44
+ &:where([data-state="unchecked"]),
45
+ &:where([data-unchecked]:not([data-unchecked="false"])) {
46
+ @slot;
47
+ }
48
+ }
49
+
50
+ @custom-variant data-selected {
51
+ &:where([data-selected="true"]) {
52
+ @slot;
53
+ }
54
+ }
55
+
56
+ @custom-variant data-disabled {
57
+ &:where([data-disabled="true"]),
58
+ &:where([data-disabled]:not([data-disabled="false"])) {
59
+ @slot;
60
+ }
61
+ }
62
+
63
+ @custom-variant data-active {
64
+ &:where([data-state="active"]),
65
+ &:where([data-active]:not([data-active="false"])) {
66
+ @slot;
67
+ }
68
+ }
69
+
70
+ @custom-variant data-horizontal {
71
+ &:where([data-orientation="horizontal"]) {
72
+ @slot;
73
+ }
74
+ }
75
+
76
+ @custom-variant data-vertical {
77
+ &:where([data-orientation="vertical"]) {
78
+ @slot;
79
+ }
80
+ }
81
+
82
+ @utility no-scrollbar {
83
+ -ms-overflow-style: none;
84
+ scrollbar-width: none;
85
+
86
+ &::-webkit-scrollbar {
87
+ display: none;
88
+ }
89
+ }
@@ -2,17 +2,15 @@
2
2
  "extends": "typescript-config/tsconfig.frontend.json",
3
3
  "compilerOptions": {
4
4
  "strict": true,
5
- "baseUrl": ".",
5
+ "skipLibCheck": true,
6
+ "jsx": "react-jsx",
7
+ "noEmit": true,
8
+ // "baseUrl": ".",
6
9
  "paths": {
7
- "@/*": ["./src/*"]
10
+ "@repo/ui/*": ["./src/*"]
8
11
  }
9
12
  },
10
13
 
11
- "include": [
12
- "src/**/*",
13
- "tailwind.config.ts",
14
- "stylelint.config.mjs",
15
- "eslint.config.ts",
16
- "postcss.config.mjs"
17
- ]
14
+ "include": ["."],
15
+ "exclude": ["node_modules", "dist"]
18
16
  }