@fernir2/saas-kit-cli 0.1.22 → 0.1.24

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 (96) hide show
  1. package/base-repo/app-constants/aliases.cjs.js +1 -1
  2. package/base-repo/app-constants/aliases.js +1 -1
  3. package/cli/README.md +101 -0
  4. package/cli/bin/index.ts +357 -0
  5. package/cli/drizzle.config.ts +12 -0
  6. package/cli/eslint.config.js +10 -0
  7. package/cli/global-setup.ts +25 -0
  8. package/cli/next.config.js +55 -0
  9. package/cli/npm-commands/gen-meta/index.ts +3 -0
  10. package/cli/npm-commands/gen-schema/index.ts +5 -0
  11. package/cli/npm-commands/migrate-db/index.ts +5 -0
  12. package/cli/npm-commands/migrate-db/migrate-db.ts +15 -0
  13. package/cli/npm-commands/seed-db/index.ts +5 -0
  14. package/cli/npm-commands/seed-db/seed-db.ts +15 -0
  15. package/cli/package-template.json +61 -0
  16. package/cli/playwright.config.ts +34 -0
  17. package/cli/postcss.config.mjs +9 -0
  18. package/cli/src/app/favicon.ico +0 -0
  19. package/cli/src/app/globals.css +163 -0
  20. package/cli/src/app/layout.tsx +44 -0
  21. package/cli/src/app/page.tsx +9 -0
  22. package/cli/src/app/styles/common.css +74 -0
  23. package/cli/src/app/styles/rich-text-editor.css +130 -0
  24. package/cli/tailwind.config.ts +13 -0
  25. package/cli/tsconfig.json +65 -0
  26. package/cli/tsconfig.server.json +14 -0
  27. package/level2/cli/create-saas-kit-app/bin/index.cjs.js +4 -4
  28. package/level2/cli/create-saas-kit-app/bin/index.js +3 -3
  29. package/level2/fd-toolbox/api/api-client.cjs.js +1 -1
  30. package/level2/fd-toolbox/api/api-client.js +1 -1
  31. package/level2/fd-toolbox/api/api-path-names.cjs.js +2 -2
  32. package/level2/fd-toolbox/api/api-paths.cjs.js +1 -1
  33. package/level2/fd-toolbox/api/api-paths.js +1 -1
  34. package/level2/fd-toolbox/api/base-api.cjs.js +1 -1
  35. package/level2/fd-toolbox/api/base-api.js +1 -1
  36. package/level2/fd-toolbox/auth/login-states.cjs.js +1 -1
  37. package/level2/fd-toolbox/auth/login-states.js +1 -1
  38. package/level2/fd-toolbox/auth/session-storage.cjs.js +1 -1
  39. package/level2/fd-toolbox/auth/session-storage.js +1 -1
  40. package/level2/fd-toolbox/auth/tokens.cjs.js +1 -1
  41. package/level2/fd-toolbox/auth/tokens.js +1 -1
  42. package/level2/fd-toolbox/constants/constants.cjs.js +1 -1
  43. package/level2/fd-toolbox/constants/constants.js +1 -1
  44. package/level2/fd-toolbox/enums/enums.cjs.js +1 -1
  45. package/level2/fd-toolbox/enums/enums.js +1 -1
  46. package/level2/fd-toolbox/errors/error-handler.cjs.js +1 -1
  47. package/level2/fd-toolbox/errors/error-handler.js +1 -1
  48. package/level2/fd-toolbox/errors/errors.cjs.js +1 -1
  49. package/level2/fd-toolbox/errors/errors.js +1 -1
  50. package/level2/fd-toolbox/errors/problem-details.cjs.js +1 -1
  51. package/level2/fd-toolbox/errors/problem-details.js +1 -1
  52. package/level2/fd-toolbox/functions/value-checking-functions.cjs.js +1 -1
  53. package/level2/fd-toolbox/functions/value-checking-functions.js +1 -1
  54. package/level2/fd-toolbox/http/url/urls.cjs.js +1 -1
  55. package/level2/fd-toolbox/http/url/urls.js +1 -1
  56. package/level2/fd-toolbox/infra/env-config.cjs.js +2 -2
  57. package/level2/fd-toolbox/infra/env-config.js +2 -2
  58. package/level2/fd-toolbox/infra/env-functions.cjs.js +1 -1
  59. package/level2/fd-toolbox/infra/env-functions.js +1 -1
  60. package/level2/fd-toolbox/infra/env-schema.cjs.js +2 -2
  61. package/level2/fd-toolbox/infra/env-schema.js +2 -2
  62. package/level2/fd-toolbox/infra/env-store.cjs.js +1 -1
  63. package/level2/fd-toolbox/infra/env-store.js +1 -1
  64. package/level2/fd-toolbox/lib/environments.cjs.js +1 -1
  65. package/level2/fd-toolbox/lib/environments.js +1 -1
  66. package/level2/fd-toolbox/lib/utils.cjs.js +1 -1
  67. package/level2/fd-toolbox/lib/utils.js +1 -1
  68. package/level2/fd-toolbox/local-storage/local-storage.cjs.js +1 -1
  69. package/level2/fd-toolbox/local-storage/local-storage.js +1 -1
  70. package/level2/fd-toolbox/logging/loggers.cjs.js +1 -1
  71. package/level2/fd-toolbox/logging/loggers.js +1 -1
  72. package/level2/fd-toolbox/notifications.cjs.js +2 -2
  73. package/level2/fd-toolbox/notifications.js +2 -2
  74. package/level2/fd-toolbox/odata/odata-constants.cjs.js +1 -1
  75. package/level2/fd-toolbox/odata/odata-constants.js +1 -1
  76. package/level2/fd-toolbox/odata/odatas.cjs.js +1 -1
  77. package/level2/fd-toolbox/odata/odatas.js +1 -1
  78. package/level2/fd-toolbox/odata/services/odata-filters.cjs.js +1 -1
  79. package/level2/fd-toolbox/odata/services/odata-filters.js +1 -1
  80. package/level2/fd-toolbox/paths/paths-names.cjs.js +2 -2
  81. package/level2/fd-toolbox/paths/paths-names.js +1 -1
  82. package/level2/fd-toolbox/routing/login-routers.cjs.js +1 -1
  83. package/level2/fd-toolbox/routing/login-routers.js +1 -1
  84. package/level2/fd-toolbox/routing/paths.cjs.js +1 -1
  85. package/level2/fd-toolbox/routing/paths.js +1 -1
  86. package/level2/fd-toolbox/strings/strings-constants.cjs.js +1 -1
  87. package/level2/fd-toolbox/strings/strings-constants.js +1 -1
  88. package/level2/fd-toolbox/strings/strings.cjs.js +1 -1
  89. package/level2/fd-toolbox/strings/strings.js +1 -1
  90. package/level2/fd-toolbox/types/ensure-type.cjs.js +1 -1
  91. package/level2/fd-toolbox/types/ensure-type.js +1 -1
  92. package/level2/fd-toolbox-core/core/name-of.cjs.js +1 -1
  93. package/level2/fd-toolbox-core/core/name-of.js +1 -1
  94. package/level2/fd-toolbox-core/types/resource-with-id.cjs.js +1 -1
  95. package/level2/fd-toolbox-core/types/resource-with-id.js +1 -1
  96. package/package.json +1 -1
@@ -0,0 +1,61 @@
1
+ {
2
+ "version": "0.1.0",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "npx tsx --tsconfig tsconfig.server.json server.ts",
7
+ "build": "next build && tsc --project tsconfig.server.json",
8
+ "lint": "eslint -c eslint.config.js",
9
+ "gen-schema": "npx tsx tools/npm-commands/gen-schema/index.ts",
10
+ "gen-meta": "npx tsx tools/npm-commands/gen-meta/index.ts",
11
+ "init-db": "npm run migrate-db && npm run seed-db",
12
+ "setup": "npm run gen-meta && npm run gen-schema && npm run init-db",
13
+ "start": "npm run setup && npm run dev",
14
+ "prod": "npm run setup && npm run build && npx tsx server.ts",
15
+ "migrate-db": "npx tsx tools/npm-commands/migrate-db/index.ts",
16
+ "seed-db": "npx tsx tools/npm-commands/seed-db/index.ts"
17
+ },
18
+ "dependencies": {
19
+ "@fernir2/saas-kit": "0.0.150",
20
+ "@node-rs/argon2": "2.0.2",
21
+ "drizzle-orm": "0.41.0",
22
+ "eslint-plugin-github": "6.0.0",
23
+ "eslint-plugin-import": "2.32.0",
24
+ "eslint-plugin-sonarjs": "3.0.5",
25
+ "geist": "1.3.1",
26
+ "next": "15.4.5",
27
+ "quill": "2.0.3",
28
+ "react": "18",
29
+ "react-dom": "18",
30
+ "socket.io-client": "4.8.1",
31
+ "tailwindcss-animate": "1.0.7"
32
+ },
33
+ "devDependencies": {
34
+ "playwright": "1.52.0",
35
+ "@eslint/eslintrc": "3.3.1",
36
+ "@eslint/js": "9.35.0",
37
+ "@types/node": "24.5.1",
38
+ "@types/react": "18",
39
+ "@types/react-dom": "18",
40
+ "@typescript-eslint/eslint-plugin": "8.43.0",
41
+ "@typescript-eslint/eslint-plugin-tslint": "7.0.2",
42
+ "@typescript-eslint/parser": "8.43.0",
43
+ "drizzle-kit": "0.28.1",
44
+ "eslint": "9.35.0",
45
+ "eslint-config-next": "15.5.2",
46
+ "eslint-config-prettier": "9.1.0",
47
+ "eslint-plugin-react": "7.37.5",
48
+ "eslint-plugin-react-compiler": "19.1.0-rc.2",
49
+ "eslint-plugin-react-hooks": "5.2.0",
50
+ "eslint-plugin-react-refresh": "0.4.20",
51
+ "eslint-plugin-tailwindcss": "3.18.2",
52
+ "husky": "9.1.7",
53
+ "postcss": "8",
54
+ "prettier": "3.6.2",
55
+ "prettier-plugin-tailwindcss": "0.6.14",
56
+ "tailwindcss": "3.4.1",
57
+ "tsx": "4.19.1",
58
+ "typescript": "5.9.2",
59
+ "esbuild": "0.19.12"
60
+ }
61
+ }
@@ -0,0 +1,34 @@
1
+ import { defineConfig, devices } from "playwright/test";
2
+ import { getDotenvConfig } from "@fernir2/saas-kit";
3
+
4
+ getDotenvConfig();
5
+
6
+ const baseUrl = "http://localhost:8080/";
7
+
8
+ export default defineConfig({
9
+ timeout: 120000,
10
+ testDir: "test/",
11
+ fullyParallel: true,
12
+ globalSetup: "./global-setup.ts",
13
+ workers: undefined,
14
+ reporter: "html",
15
+ use: {
16
+ baseURL: baseUrl,
17
+ trace: "on-first-retry",
18
+ },
19
+ projects: [
20
+ {
21
+ name: "chromium",
22
+ use: { ...devices["Desktop Chrome"] },
23
+ },
24
+ ],
25
+ webServer: {
26
+ command: "npm run prod",
27
+ url: baseUrl,
28
+ reuseExistingServer: true,
29
+ timeout: 120000,
30
+ env: {
31
+ NODE_ENV: "test",
32
+ },
33
+ },
34
+ });
@@ -0,0 +1,9 @@
1
+ /** @type {import('postcss-load-config').Config} */
2
+ const config = {
3
+ plugins: {
4
+ tailwindcss: {},
5
+ autoprefixer: {},
6
+ },
7
+ };
8
+
9
+ export default config;
Binary file
@@ -0,0 +1,163 @@
1
+ @import "../../packages/level2/client/styles/common.css";
2
+ @import "quill/dist/quill.snow.css";
3
+ @import "../../packages/level2/client/styles/rich-text-editor.css";
4
+
5
+ @tailwind base;
6
+ @tailwind components;
7
+ @tailwind utilities;
8
+
9
+ @layer base {
10
+ :root {
11
+ --background: 0 0% 100%;
12
+ --foreground: 222.2 84% 4.9%;
13
+ --card: 0 0% 100%;
14
+ --card-foreground: 222.2 84% 4.9%;
15
+ --popover: 0 0% 100%;
16
+ --popover-foreground: 222.2 84% 4.9%;
17
+ --primary: 222.2 47.4% 11.2%;
18
+ --primary-foreground: 210 40% 98%;
19
+ --secondary: 210 40% 96.1%;
20
+ --secondary-foreground: 222.2 47.4% 11.2%;
21
+ --muted: 210 40% 96.1%;
22
+ --muted-foreground: 215.4 16.3% 46.9%;
23
+ --accent: 210 40% 96.1%;
24
+ --accent-foreground: 222.2 47.4% 11.2%;
25
+ --destructive: 0 84.2% 60.2%;
26
+ --destructive-foreground: 210 40% 98%;
27
+ --border: 214.3 31.8% 91.4%;
28
+ --input: 214.3 31.8% 91.4%;
29
+ --ring: 222.2 84% 4.9%;
30
+ --radius: 0.5rem;
31
+
32
+ --chart-1: 12 76% 61%;
33
+ --chart-2: 173 58% 39%;
34
+ --chart-3: 197 37% 24%;
35
+ --chart-4: 43 74% 66%;
36
+ --chart-5: 27 87% 67%;
37
+
38
+ --fd-accent: 190, 100%, 34%; /* accent-600 */
39
+ --fd-accent-light: 172, 100%, 37%; /* accent-100 */
40
+
41
+ --fd-tertiary-50: 216, 33%, 97%;
42
+ --fd-tertiary-200: 206, 35%, 86%;
43
+ --fd-tertiary-600: 206, 38%, 39%;
44
+ --fd-tertiary-700: 208, 38%, 32%;
45
+ --fd-tertiary-900: 208, 31%, 24%;
46
+ --fd-green-accent: 120, 100%, 34%;
47
+
48
+ --fd-shadow: 0, 0%, 0%, 0.25;
49
+
50
+ --fd-toolbar: var(--fd-tertiary-900);
51
+ --fd-toolbar-input: var(--fd-tertiary-700);
52
+ --fd-toolbar-hover: var(--fd-tertiary-700);
53
+ --fd-toolbar-keys: var(--fd-tertiary-200);
54
+ --fd-toolbar-placeholder: var(--fd-tertiary-50);
55
+ --fd-toolbar-shadow: var(--fd-shadow);
56
+ --fd-toolbar-separators: var(--fd-tertiary-600);
57
+ --fd-sidebar-icons: var(--fd-tertiary-50);
58
+ --fd-toolbar-icons: var(--fd-tertiary-50);
59
+ --fd-toolbar-border: var(--fd-tertiary-700);
60
+ --fd-toolbar-button: var(--fd-tertiary-600);
61
+
62
+ --subtle-400: 210, 10%, 65%;
63
+ --subtle-500: 220, 9%, 46%;
64
+ --subtle-700: 220, 20%, 27%;
65
+
66
+ --fd-enum-default-color: 0, 0%, 92%;
67
+ --fd-enum-color-1: 200, 50%, 87%;
68
+ --fd-enum-color-2: 120, 35%, 87%;
69
+ --fd-enum-color-3: 340, 61%, 91%;
70
+ --fd-enum-color-4: 19, 45%, 88%;
71
+ --fd-enum-color-5: 340, 61%, 91%;
72
+ --fd-enum-color-6: 9, 90%, 91%;
73
+ --fd-enum-color-7: 283, 44%, 90%;
74
+ --fd-enum-color-8: 9, 90%, 91%;
75
+ --fd-enum-color-9: 200, 50%, 87%;
76
+ --fd-enum-color-10: 38, 87%, 90%;
77
+ --fd-enum-color-11: 283, 44%, 90%;
78
+ --fd-enum-color-12: 283, 44%, 90%;
79
+ --fd-enum-color-13: 340, 61%, 91%;
80
+ --fd-enum-color-14: 283, 44%, 90%;
81
+ --fd-enum-color-15: 38, 87%, 90%;
82
+ --fd-enum-color-16: 0, 0%, 92%;
83
+ --fd-enum-color-17: 9, 90%, 91%;
84
+ --fd-enum-color-18: 19, 45%, 88%;
85
+ }
86
+
87
+ .dark {
88
+ --background: 222.2 84% 4.9%;
89
+ --foreground: 210 40% 98%;
90
+ --card: 222.2 84% 4.9%;
91
+ --card-foreground: 210 40% 98%;
92
+ --popover: 222.2 84% 4.9%;
93
+ --popover-foreground: 210 40% 98%;
94
+ --primary: 210 40% 98%;
95
+ --primary-foreground: 222.2 47.4% 11.2%;
96
+ --secondary: 217.2 32.6% 17.5%;
97
+ --secondary-foreground: 210 40% 98%;
98
+ --muted: 217.2 32.6% 17.5%;
99
+ --muted-foreground: 215 20.2% 65.1%;
100
+ --accent: 217.2 32.6% 17.5%;
101
+ --accent-foreground: 210 40% 98%;
102
+ --destructive: 0 62.8% 30.6%;
103
+ --destructive-foreground: 210 40% 98%;
104
+ --border: 217.2 32.6% 17.5%;
105
+ --input: 217.2 32.6% 17.5%;
106
+ --ring: 212.7 26.8% 83.9;
107
+
108
+ --radius: 0.5rem;
109
+
110
+ --fd-accent: 190, 100%, 34%; /* accent-600 */
111
+ --fd-accent-light: 172, 100%, 37%; /* accent-100 */
112
+
113
+ --fd-tertiary-50: 216, 33%, 97%;
114
+ --fd-tertiary-200: 206, 35%, 86%;
115
+ --fd-tertiary-600: 206, 38%, 39%;
116
+ --fd-tertiary-700: 208, 38%, 32%;
117
+ --fd-tertiary-900: 208, 31%, 24%;
118
+
119
+ --fd-shadow: 0, 0%, 0%, 0.25;
120
+
121
+ --fd-toolbar: var(--fd-tertiary-900);
122
+ --fd-toolbar-input: var(--fd-tertiary-700);
123
+ --fd-toolbar-hover: var(--fd-tertiary-700);
124
+ --fd-toolbar-keys: var(--fd-tertiary-200);
125
+ --fd-toolbar-placeholder: var(--fd-tertiary-50);
126
+ --fd-toolbar-shadow: var(--fd-shadow);
127
+ --fd-toolbar-separators: var(--fd-tertiary-600);
128
+ --fd-sidebar-icons: var(--fd-tertiary-50);
129
+ --fd-toolbar-icons: var(--fd-tertiary-50);
130
+ --fd-toolbar-border: var(--fd-tertiary-700);
131
+ --fd-toolbar-button: var(--fd-tertiary-600);
132
+
133
+ --subtle-400: 210, 10%, 65%;
134
+ --subtle-500: 220, 9%, 46%;
135
+ --subtle-700: 220, 20%, 27%;
136
+
137
+ --chart-1: 220 70% 50%;
138
+ --chart-2: 160 60% 45%;
139
+ --chart-3: 30 80% 55%;
140
+ --chart-4: 280 65% 60%;
141
+ --chart-5: 340 75% 55%;
142
+
143
+ --fd-enum-default-color: 0, 0%, 22%;
144
+ --fd-enum-color-1: 219, 43%, 30%;
145
+ --fd-enum-color-2: 152, 37%, 27%;
146
+ --fd-enum-color-3: 328, 37%, 30%;
147
+ --fd-enum-color-4: 27, 63%, 32%;
148
+ --fd-enum-color-5: 328, 37%, 30%;
149
+ --fd-enum-color-6: 10, 40%, 31%;
150
+ --fd-enum-color-7: 268, 38%, 29%;
151
+ --fd-enum-color-8: 10, 40%, 31%;
152
+ --fd-enum-color-9: 219, 43%, 30%;
153
+ --fd-enum-color-10: 37, 56%, 36%;
154
+ --fd-enum-color-11: 268, 38%, 29%;
155
+ --fd-enum-color-12: 268, 38%, 29%;
156
+ --fd-enum-color-13: 328, 37%, 30%;
157
+ --fd-enum-color-14: 268, 38%, 29%;
158
+ --fd-enum-color-15: 37, 56%, 36%;
159
+ --fd-enum-color-16: 0, 0%, 35%;
160
+ --fd-enum-color-17: 10, 40%, 31%;
161
+ --fd-enum-color-18: 27, 63%, 32%;
162
+ }
163
+ }
@@ -0,0 +1,44 @@
1
+ import { FdHtmlMetadata } from "@meta/client/framework";
2
+ import { GeistSans } from "geist/font/sans";
3
+ import "src/app/globals.css";
4
+ import { cn } from "@fd-toolbox/lib/utils";
5
+ import Favicon from "src/app/favicon.ico";
6
+ import { FdToaster } from "@fd-component-toolbox/toaster/FdToaster";
7
+ import { ReactNode } from "react";
8
+ import { FdProviders } from "@client/components/providers/FdProviders";
9
+ import { setSidebarResourceNames } from "@fd-app-toolbox/layout/sidebar/sidebar-resource-names-cache";
10
+ import { defaultGlobalConfig } from "@meta/providers/global-provider/default-config";
11
+ import { setMultiListEditResourceConfigs } from "@/app/config/multi-list-config";
12
+ import { setResourceListConfigs } from "@packages/level2/client/pages/view-page/resource-list-configs";
13
+ import { setEditResourceConfigs } from "@packages/level2/meta/edit-resource/config/fd-edit-resource-configs";
14
+
15
+ export const metadata: FdHtmlMetadata = {
16
+ title: "SaaS Kit",
17
+ icons: [{ rel: "icon", url: Favicon.src }],
18
+ };
19
+
20
+ export default async function RootLayout({ children }: { children: ReactNode }) {
21
+ const sidebarResourceNames: string[] = [];
22
+
23
+ setSidebarResourceNames(sidebarResourceNames);
24
+ await setMultiListEditResourceConfigs();
25
+ await setResourceListConfigs();
26
+ setEditResourceConfigs();
27
+
28
+ return (
29
+ <html lang="en">
30
+ <body className={cn(GeistSans.className, "h-screen text-sm")}>
31
+ <div className="flex h-full flex-col">
32
+ <FdProviders
33
+ globalConfig={{
34
+ ...defaultGlobalConfig,
35
+ }}
36
+ >
37
+ {children}
38
+ </FdProviders>
39
+ </div>
40
+ <FdToaster />
41
+ </body>
42
+ </html>
43
+ );
44
+ }
@@ -0,0 +1,9 @@
1
+ import { fdRedirect } from "@fd-toolbox/server/framework";
2
+ import { getResourceListUrl } from "@meta/services/meta-navigations";
3
+ import { resourceNames } from "@fd-toolbox/resources/resource-names";
4
+
5
+ export default function Home() {
6
+ const afterLoginUrl = getResourceListUrl(resourceNames.contact);
7
+
8
+ fdRedirect(afterLoginUrl);
9
+ }
@@ -0,0 +1,74 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ * {
7
+ @apply border-border;
8
+ }
9
+ body {
10
+ @apply bg-background text-foreground;
11
+ }
12
+ }
13
+
14
+ @supports not (-webkit-appearance: none) {
15
+ * {
16
+ scrollbar-width: thin;
17
+ scrollbar-color: hsl(var(--fd-toolbar)) hsl(var(--background));
18
+ }
19
+ }
20
+
21
+ @supports (-webkit-appearance: none) {
22
+ *::-webkit-scrollbar {
23
+ width: 15px;
24
+ height: 15px;
25
+ }
26
+
27
+ *::-webkit-scrollbar-track {
28
+ background: hsl(var(--background));
29
+ }
30
+
31
+ *::-webkit-scrollbar-thumb {
32
+ width: 9px;
33
+ height: 9px;
34
+ background: hsl(var(--fd-toolbar));
35
+ border-radius: var(--radius);
36
+ border: 3px solid hsl(var(--background));
37
+ }
38
+
39
+ *::-webkit-scrollbar-thumb:hover {
40
+ background: hsl(var(--fd-toolbar-hover));
41
+ }
42
+
43
+ *::-webkit-scrollbar-button {
44
+ display: none;
45
+ }
46
+ }
47
+
48
+ .scrollbar-hidden {
49
+ -ms-overflow-style: none;
50
+ scrollbar-width: none;
51
+ }
52
+
53
+ @media (max-width: 426px) {
54
+ html,
55
+ body {
56
+ overflow: auto;
57
+ -ms-overflow-style: none;
58
+ scrollbar-width: none;
59
+ }
60
+
61
+ body::-webkit-scrollbar,
62
+ body *::-webkit-scrollbar {
63
+ display: none;
64
+ }
65
+ }
66
+
67
+ @layer base {
68
+ input:-webkit-autofill,
69
+ input:-webkit-autofill:hover,
70
+ input:-webkit-autofill:focus {
71
+ -webkit-box-shadow: 0 0 0px 1000px hsl(var(--background)) inset;
72
+ -webkit-text-fill-color: hsl(var(--foreground));
73
+ }
74
+ }
@@ -0,0 +1,130 @@
1
+ div.ql-toolbar.ql-snow {
2
+ padding: 0.5rem 0.75rem;
3
+ border-top-right-radius: var(--radius);
4
+ border-top-left-radius: var(--radius);
5
+ border: 1px solid hsl(var(--border));
6
+ }
7
+
8
+ .ql-toolbar.ql-snow .ql-picker-label {
9
+ padding-left: 0;
10
+ border: none;
11
+ }
12
+
13
+ .ql-toolbar.ql-snow .ql-picker-label::before {
14
+ font-family: "__GeistSans_3a0388", serif;
15
+ }
16
+
17
+ .ql-editor {
18
+ font-size: 14px;
19
+ padding: 10px 12px;
20
+ }
21
+
22
+ div.ql-container.ql-snow {
23
+ height: max-content;
24
+ border: 1px solid hsl(var(--border));
25
+ border-bottom-right-radius: var(--radius);
26
+ border-bottom-left-radius: var(--radius);
27
+ }
28
+
29
+ .ql-tooltip {
30
+ display: none;
31
+ }
32
+
33
+ .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
34
+ z-index: 11;
35
+ }
36
+
37
+ .ql-picker-label,
38
+ .ql-picker-label .ql-stroke {
39
+ color: hsl(var(--popover-foreground));
40
+ stroke: hsl(var(--popover-foreground));
41
+ fill: hsl(var(--popover-foreground));
42
+ }
43
+
44
+ .ql-toolbar .ql-formats button {
45
+ color: hsl(var(--popover-foreground));
46
+ }
47
+
48
+ .ql-toolbar .ql-formats button .ql-stroke {
49
+ stroke: hsl(var(--popover-foreground));
50
+ }
51
+
52
+ .ql-toolbar .ql-formats button .ql-fill {
53
+ fill: hsl(var(--popover-foreground));
54
+ }
55
+
56
+ .ql-toolbar .ql-active,
57
+ .ql-toolbar .ql-active .ql-stroke,
58
+ .ql-toolbar .ql-active .ql-fill {
59
+ color: hsl(var(--popover-foreground));
60
+ fill: none;
61
+ stroke: none;
62
+ }
63
+
64
+ .ql-snow .ql-picker {
65
+ font-weight: 400;
66
+ }
67
+
68
+ .ql-editor.ql-blank::before {
69
+ left: 12px;
70
+ right: 12px;
71
+ color: hsl(var(--muted-foreground));
72
+ }
73
+
74
+ .ql-toolbar .ql-formats button:hover .ql-stroke,
75
+ .ql-toolbar .ql-picker .ql-picker-label:hover .ql-stroke,
76
+ .ql-toolbar .ql-picker .ql-picker-label.ql-active .ql-stroke,
77
+ .ql-toolbar .ql-formats button.ql-active .ql-stroke {
78
+ stroke: hsl(var(--foreground));
79
+ stroke-width: 2;
80
+ }
81
+
82
+ .ql-toolbar .ql-formats button:hover .ql-fill,
83
+ .ql-toolbar .ql-formats button.ql-active .ql-fill {
84
+ fill: hsl(var(--foreground));
85
+ }
86
+
87
+ .ql-toolbar .ql-picker .ql-picker-label:hover::before,
88
+ .ql-toolbar .ql-picker .ql-picker-label.ql-active::before,
89
+ .ql-picker .ql-picker-options .ql-picker-item.ql-selected::before {
90
+ color: hsl(var(--foreground));
91
+ font-weight: 600;
92
+ }
93
+
94
+ .ql-snow .ql-picker-options .ql-picker-item:hover {
95
+ border-radius: 0.375rem;
96
+ background: hsl(var(--muted) / 0.5);
97
+ }
98
+
99
+ .ql-toolbar .ql-formats button .ql-stroke,
100
+ .ql-toolbar .ql-picker .ql-picker-label .ql-stroke {
101
+ stroke: hsl(var(--foreground));
102
+ stroke-width: 1.2;
103
+ }
104
+
105
+ .ql-toolbar .ql-formats button .ql-fill {
106
+ fill: hsl(var(--foreground));
107
+ }
108
+
109
+ .ql-toolbar .ql-picker .ql-picker-label::before,
110
+ .ql-picker .ql-picker-options .ql-picker-item::before {
111
+ color: hsl(var(--foreground));
112
+ font-weight: 400;
113
+ }
114
+
115
+ .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
116
+ min-width: 12rem;
117
+ z-index: 50;
118
+ margin-right: 1rem;
119
+ border-radius: 0.375rem;
120
+ background-color: hsl(var(--background));
121
+ border: 1px solid hsl(var(--border));
122
+ box-shadow: 0rem 0rem 0.1rem 0.01rem hsl(var(--fd-toolbar-shadow));
123
+ outline: none;
124
+ pointer-events: auto;
125
+ }
126
+
127
+ .ql-snow .ql-picker-options .ql-picker-item {
128
+ width: 100%;
129
+ padding: 0.5rem 0.75rem;
130
+ }
@@ -0,0 +1,13 @@
1
+ import { getTailwindConfig } from "@fernir2/saas-kit";
2
+
3
+ const config = getTailwindConfig();
4
+
5
+ config.content = [
6
+ "./pages/**/*.{ts,tsx}",
7
+ "./components/**/*.{ts,tsx}",
8
+ "./app/**/*.{ts,tsx}",
9
+ "./src/**/*.{ts,tsx}",
10
+ "./node_modules/@fernir2/saas-kit/src/**/*.{js,ts,jsx,tsx}",
11
+ ];
12
+
13
+ export default config;
@@ -0,0 +1,65 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2023",
4
+ "experimentalDecorators": true,
5
+ "emitDecoratorMetadata": true,
6
+ "lib": ["ES2023", "dom", "dom.iterable"],
7
+ "allowJs": true,
8
+ "skipLibCheck": true,
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+
12
+ "module": "esnext",
13
+ "moduleResolution": "bundler",
14
+
15
+ "resolveJsonModule": true,
16
+ "isolatedModules": true,
17
+ "jsx": "preserve",
18
+ "incremental": true,
19
+ "plugins": [{ "name": "next" }],
20
+
21
+ "baseUrl": "./",
22
+ "preserveSymlinks": false,
23
+ "paths": {
24
+ "@/*": ["./src/*"],
25
+ "@cli/*": ["./cli/*"],
26
+ "@adders/*": ["./adders/*"],
27
+ "@server/*": ["./server/*"],
28
+ "@schemas/*": ["./generated/*"],
29
+ "@npm-commands/*": ["./npm-commands/*"],
30
+ "@root/*": ["./*"]
31
+ },
32
+
33
+ "forceConsistentCasingInFileNames": true,
34
+ "noFallthroughCasesInSwitch": true,
35
+ "sourceMap": true,
36
+ "importHelpers": true,
37
+ "noEmitHelpers": true,
38
+ "downlevelIteration": true,
39
+ "pretty": true,
40
+ "noUnusedLocals": true,
41
+ "noUnusedParameters": true,
42
+ "noPropertyAccessFromIndexSignature": true,
43
+ "noImplicitOverride": true,
44
+ "useUnknownInCatchVariables": true,
45
+
46
+ "noEmit": false,
47
+ "declaration": true,
48
+ "declarationDir": "./build/package/types",
49
+ "rootDir": "./",
50
+ "outDir": "./build/package/types-output",
51
+ "noEmitOnError": true
52
+ },
53
+ "include": [
54
+ "src",
55
+ "cli",
56
+ "server",
57
+ "adders",
58
+ "generated",
59
+ "next-env.d.ts",
60
+ "global.d.ts",
61
+ ".next/types/**/*.ts",
62
+ "playwright.config.ts"
63
+ ],
64
+ "exclude": ["node_modules", "dist", "build", ".next", "coverage"]
65
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "module": "es2022",
5
+ "moduleResolution": "bundler",
6
+ "outDir": "dist",
7
+ "lib": ["ES2022", "dom"],
8
+ "target": "ES2022",
9
+ "isolatedModules": false,
10
+ "noEmit": false,
11
+ "strict": true
12
+ },
13
+ "include": ["server.ts"]
14
+ }