create-crm-tmp 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 (187) hide show
  1. package/bin/create-crm-tmp.js +93 -0
  2. package/package.json +25 -0
  3. package/template/.prettierignore +33 -0
  4. package/template/.prettierrc.json +25 -0
  5. package/template/README.md +173 -0
  6. package/template/eslint.config.mjs +18 -0
  7. package/template/exemple-contacts.csv +11 -0
  8. package/template/next.config.ts +8 -0
  9. package/template/package.json +64 -0
  10. package/template/postcss.config.mjs +7 -0
  11. package/template/prisma/migrations/20251126144728_init/migration.sql +78 -0
  12. package/template/prisma/migrations/20251126155204_add_user_roles/migration.sql +5 -0
  13. package/template/prisma/migrations/20251128095126_add_company_info/migration.sql +19 -0
  14. package/template/prisma/migrations/20251128123321_add_smtp_config/migration.sql +22 -0
  15. package/template/prisma/migrations/20251128132303_add_status/migration.sql +23 -0
  16. package/template/prisma/migrations/20251201102207_add_user_active/migration.sql +75 -0
  17. package/template/prisma/migrations/20251201105507_add_email_signature/migration.sql +2 -0
  18. package/template/prisma/migrations/20251201151122_add_tasks/migration.sql +45 -0
  19. package/template/prisma/migrations/20251202111854_add_task_reminder/migration.sql +2 -0
  20. package/template/prisma/migrations/20251202135859_add_google_meet_integration/migration.sql +27 -0
  21. package/template/prisma/migrations/20251203103317_add_meta_lead_integration/migration.sql +20 -0
  22. package/template/prisma/migrations/20251203104002_add_google_ads_integration/migration.sql +18 -0
  23. package/template/prisma/migrations/20251203112122_add_google_sheet_integration/migration.sql +32 -0
  24. package/template/prisma/migrations/20251203153853_allow_multiple_integration_configs/migration.sql +20 -0
  25. package/template/prisma/migrations/20251205141705_update_user_roles/migration.sql +12 -0
  26. package/template/prisma/migrations/20251205150000_add_commercial_and_telepro_assignment/migration.sql +21 -0
  27. package/template/prisma/migrations/20251205160000_add_interaction_logging/migration.sql +11 -0
  28. package/template/prisma/migrations/20251208090314_add_automatic_interaction_types/migration.sql +12 -0
  29. package/template/prisma/migrations/20251208094843_mg/migration.sql +14 -0
  30. package/template/prisma/migrations/20251208100000_add_company_support/migration.sql +14 -0
  31. package/template/prisma/migrations/20251208110000_add_templates/migration.sql +26 -0
  32. package/template/prisma/migrations/20251208141304_add_video_conference_task_type/migration.sql +2 -0
  33. package/template/prisma/migrations/20251209104759_add_internal_note_to_task/migration.sql +2 -0
  34. package/template/prisma/migrations/20251209134803_add_company_field/migration.sql +2 -0
  35. package/template/prisma/migrations/20251209150000_rename_company_to_company_name/migration.sql +3 -0
  36. package/template/prisma/migrations/20251209150016_add_email_tracking/migration.sql +21 -0
  37. package/template/prisma/migrations/20251209155908_add_notify_contact_to_task/migration.sql +2 -0
  38. package/template/prisma/migrations/20251210110019_add_appointment_types/migration.sql +10 -0
  39. package/template/prisma/migrations/20251210113928_add_contact_files/migration.sql +26 -0
  40. package/template/prisma/migrations/20251212132339_add_custom_roles/migration.sql +24 -0
  41. package/template/prisma/migrations/20251215104448_add_file_interaction_types/migration.sql +11 -0
  42. package/template/prisma/migrations/20251215145616_add_closing_reasons/migration.sql +12 -0
  43. package/template/prisma/migrations/20251216140850_add_log_users/migration.sql +25 -0
  44. package/template/prisma/migrations/20251216151000_rename_perdu_to_ferme/migration.sql +8 -0
  45. package/template/prisma/migrations/20251216162318_add_column_mappings_to_google_sheet/migration.sql +2 -0
  46. package/template/prisma/migrations/20251216185127_add_workflows/migration.sql +80 -0
  47. package/template/prisma/migrations/20251216192237_add_scheduled_workflow_actions/migration.sql +32 -0
  48. package/template/prisma/migrations/migration_lock.toml +3 -0
  49. package/template/prisma/schema.prisma +582 -0
  50. package/template/prisma.config.ts +14 -0
  51. package/template/src/app/(auth)/invite/[token]/page.tsx +200 -0
  52. package/template/src/app/(auth)/layout.tsx +3 -0
  53. package/template/src/app/(auth)/reset-password/complete/page.tsx +213 -0
  54. package/template/src/app/(auth)/reset-password/page.tsx +146 -0
  55. package/template/src/app/(auth)/reset-password/verify/page.tsx +183 -0
  56. package/template/src/app/(auth)/signin/page.tsx +166 -0
  57. package/template/src/app/(dashboard)/agenda/page.tsx +3051 -0
  58. package/template/src/app/(dashboard)/automatisation/[id]/page.tsx +24 -0
  59. package/template/src/app/(dashboard)/automatisation/_components/workflow-editor.tsx +905 -0
  60. package/template/src/app/(dashboard)/automatisation/new/page.tsx +20 -0
  61. package/template/src/app/(dashboard)/automatisation/page.tsx +337 -0
  62. package/template/src/app/(dashboard)/closing/page.tsx +1052 -0
  63. package/template/src/app/(dashboard)/contacts/[id]/page.tsx +6028 -0
  64. package/template/src/app/(dashboard)/contacts/page.tsx +3713 -0
  65. package/template/src/app/(dashboard)/dashboard/page.tsx +186 -0
  66. package/template/src/app/(dashboard)/layout.tsx +30 -0
  67. package/template/src/app/(dashboard)/settings/page.tsx +4070 -0
  68. package/template/src/app/(dashboard)/templates/page.tsx +567 -0
  69. package/template/src/app/(dashboard)/users/list/page.tsx +507 -0
  70. package/template/src/app/(dashboard)/users/page.tsx +457 -0
  71. package/template/src/app/(dashboard)/users/permissions/page.tsx +181 -0
  72. package/template/src/app/(dashboard)/users/roles/page.tsx +434 -0
  73. package/template/src/app/api/audit-logs/route.ts +57 -0
  74. package/template/src/app/api/auth/[...all]/route.ts +4 -0
  75. package/template/src/app/api/auth/check-active/route.ts +31 -0
  76. package/template/src/app/api/auth/google/callback/route.ts +94 -0
  77. package/template/src/app/api/auth/google/disconnect/route.ts +32 -0
  78. package/template/src/app/api/auth/google/route.ts +34 -0
  79. package/template/src/app/api/auth/google/status/route.ts +32 -0
  80. package/template/src/app/api/closing-reasons/route.ts +27 -0
  81. package/template/src/app/api/contacts/[id]/files/[fileId]/route.ts +94 -0
  82. package/template/src/app/api/contacts/[id]/files/route.ts +269 -0
  83. package/template/src/app/api/contacts/[id]/interactions/[interactionId]/route.ts +91 -0
  84. package/template/src/app/api/contacts/[id]/interactions/route.ts +103 -0
  85. package/template/src/app/api/contacts/[id]/meet/route.ts +296 -0
  86. package/template/src/app/api/contacts/[id]/route.ts +322 -0
  87. package/template/src/app/api/contacts/[id]/send-email/route.ts +254 -0
  88. package/template/src/app/api/contacts/export/route.ts +270 -0
  89. package/template/src/app/api/contacts/import/route.ts +381 -0
  90. package/template/src/app/api/contacts/route.ts +283 -0
  91. package/template/src/app/api/dashboard/stats/route.ts +299 -0
  92. package/template/src/app/api/email/track/[id]/route.ts +68 -0
  93. package/template/src/app/api/integrations/google-sheet/sync/route.ts +526 -0
  94. package/template/src/app/api/invite/complete/route.ts +88 -0
  95. package/template/src/app/api/invite/validate/route.ts +55 -0
  96. package/template/src/app/api/reminders/route.ts +95 -0
  97. package/template/src/app/api/reset-password/complete/route.ts +73 -0
  98. package/template/src/app/api/reset-password/request/route.ts +84 -0
  99. package/template/src/app/api/reset-password/validate/route.ts +49 -0
  100. package/template/src/app/api/reset-password/verify/route.ts +74 -0
  101. package/template/src/app/api/roles/[id]/route.ts +183 -0
  102. package/template/src/app/api/roles/route.ts +140 -0
  103. package/template/src/app/api/send/route.ts +282 -0
  104. package/template/src/app/api/settings/change-password/route.ts +95 -0
  105. package/template/src/app/api/settings/closing-reasons/[id]/route.ts +84 -0
  106. package/template/src/app/api/settings/closing-reasons/route.ts +74 -0
  107. package/template/src/app/api/settings/company/route.ts +121 -0
  108. package/template/src/app/api/settings/google-ads/[id]/route.ts +117 -0
  109. package/template/src/app/api/settings/google-ads/route.ts +122 -0
  110. package/template/src/app/api/settings/google-sheet/[id]/route.ts +230 -0
  111. package/template/src/app/api/settings/google-sheet/auto-map/route.ts +196 -0
  112. package/template/src/app/api/settings/google-sheet/route.ts +254 -0
  113. package/template/src/app/api/settings/meta-leads/[id]/route.ts +123 -0
  114. package/template/src/app/api/settings/meta-leads/route.ts +132 -0
  115. package/template/src/app/api/settings/profile/route.ts +42 -0
  116. package/template/src/app/api/settings/smtp/route.ts +130 -0
  117. package/template/src/app/api/settings/smtp/test/route.ts +121 -0
  118. package/template/src/app/api/settings/statuses/[id]/route.ts +101 -0
  119. package/template/src/app/api/settings/statuses/route.ts +83 -0
  120. package/template/src/app/api/statuses/route.ts +25 -0
  121. package/template/src/app/api/tasks/[id]/attendees/route.ts +76 -0
  122. package/template/src/app/api/tasks/[id]/route.ts +728 -0
  123. package/template/src/app/api/tasks/meet/route.ts +240 -0
  124. package/template/src/app/api/tasks/route.ts +417 -0
  125. package/template/src/app/api/templates/[id]/route.ts +140 -0
  126. package/template/src/app/api/templates/route.ts +91 -0
  127. package/template/src/app/api/users/[id]/route.ts +168 -0
  128. package/template/src/app/api/users/list/route.ts +45 -0
  129. package/template/src/app/api/users/me/route.ts +48 -0
  130. package/template/src/app/api/users/route.ts +250 -0
  131. package/template/src/app/api/webhooks/google-ads/route.ts +208 -0
  132. package/template/src/app/api/webhooks/meta-leads/route.ts +258 -0
  133. package/template/src/app/api/workflows/[id]/route.ts +192 -0
  134. package/template/src/app/api/workflows/process/route.ts +293 -0
  135. package/template/src/app/api/workflows/route.ts +124 -0
  136. package/template/src/app/favicon.ico +0 -0
  137. package/template/src/app/globals.css +1416 -0
  138. package/template/src/app/layout.tsx +31 -0
  139. package/template/src/app/page.tsx +32 -0
  140. package/template/src/components/dashboard/activity-chart.tsx +67 -0
  141. package/template/src/components/dashboard/contacts-chart.tsx +63 -0
  142. package/template/src/components/dashboard/recent-activity.tsx +164 -0
  143. package/template/src/components/dashboard/sales-analytics-chart.tsx +81 -0
  144. package/template/src/components/dashboard/stat-card.tsx +61 -0
  145. package/template/src/components/dashboard/status-distribution-chart.tsx +45 -0
  146. package/template/src/components/dashboard/tasks-pie-chart.tsx +88 -0
  147. package/template/src/components/dashboard/top-contacts-list.tsx +129 -0
  148. package/template/src/components/dashboard/upcoming-tasks-list.tsx +126 -0
  149. package/template/src/components/editor.tsx +856 -0
  150. package/template/src/components/email-template.tsx +35 -0
  151. package/template/src/components/header.tsx +320 -0
  152. package/template/src/components/invitation-email-template.tsx +79 -0
  153. package/template/src/components/meet-cancellation-email-template.tsx +120 -0
  154. package/template/src/components/meet-confirmation-email-template.tsx +156 -0
  155. package/template/src/components/meet-update-email-template.tsx +209 -0
  156. package/template/src/components/page-header.tsx +61 -0
  157. package/template/src/components/reset-password-email-template.tsx +79 -0
  158. package/template/src/components/sidebar.tsx +294 -0
  159. package/template/src/components/skeleton.tsx +380 -0
  160. package/template/src/components/ui/commands.tsx +396 -0
  161. package/template/src/components/ui/components.tsx +150 -0
  162. package/template/src/components/ui/theme.tsx +5 -0
  163. package/template/src/components/view-as-banner.tsx +45 -0
  164. package/template/src/components/view-as-modal.tsx +186 -0
  165. package/template/src/contexts/mobile-menu-context.tsx +31 -0
  166. package/template/src/contexts/sidebar-context.tsx +107 -0
  167. package/template/src/contexts/task-reminder-context.tsx +239 -0
  168. package/template/src/contexts/view-as-context.tsx +84 -0
  169. package/template/src/hooks/use-user-role.ts +82 -0
  170. package/template/src/lib/audit-log.ts +45 -0
  171. package/template/src/lib/auth-client.ts +16 -0
  172. package/template/src/lib/auth.ts +35 -0
  173. package/template/src/lib/check-permission.ts +193 -0
  174. package/template/src/lib/contact-duplicate.ts +112 -0
  175. package/template/src/lib/contact-interactions.ts +371 -0
  176. package/template/src/lib/encryption.ts +99 -0
  177. package/template/src/lib/google-calendar.ts +300 -0
  178. package/template/src/lib/google-drive.ts +372 -0
  179. package/template/src/lib/permissions.ts +412 -0
  180. package/template/src/lib/prisma.ts +32 -0
  181. package/template/src/lib/roles.ts +120 -0
  182. package/template/src/lib/template-variables.ts +76 -0
  183. package/template/src/lib/utils.ts +46 -0
  184. package/template/src/lib/workflow-executor.ts +482 -0
  185. package/template/src/proxy.ts +91 -0
  186. package/template/tsconfig.json +34 -0
  187. package/template/vercel.json +8 -0
@@ -0,0 +1,1416 @@
1
+ @import 'tailwindcss';
2
+
3
+ :root {
4
+ --background: #ffffff;
5
+ --foreground: #171717;
6
+ }
7
+
8
+ @theme inline {
9
+ --color-background: var(--background);
10
+ --color-foreground: var(--foreground);
11
+ --font-sans: var(--font-geist-sans);
12
+ --font-mono: var(--font-geist-mono);
13
+ }
14
+
15
+ body {
16
+ background: var(--background);
17
+ color: var(--foreground);
18
+ font-family: Arial, Helvetica, sans-serif;
19
+ }
20
+
21
+ /* LexKit Editor - Clean Framework-Agnostic Styles */
22
+
23
+ /* CSS Variables for Theme - Framework Agnostic */
24
+ .lexkit-editor-wrapper[data-editor-theme='light'] {
25
+ --lexkit-bg: #ffffff;
26
+ --lexkit-fg: #0f172a;
27
+ --lexkit-border: #e2e8f0;
28
+ --lexkit-border-hover: #cbd5e1;
29
+ --lexkit-border-active: #94a3b8;
30
+ --lexkit-accent: #0f172a;
31
+ --lexkit-accent-hover: #1e293b;
32
+ --lexkit-shadow: rgba(0, 0, 0, 0.08);
33
+ --lexkit-muted: #f8fafc;
34
+ --lexkit-muted-fg: #64748b;
35
+ }
36
+
37
+ /* Dark Mode - Framework Agnostic */
38
+ [data-theme='dark'],
39
+ .dark,
40
+ .lexkit-editor-wrapper[data-editor-theme='dark'] {
41
+ --lexkit-bg: #0a0a0a;
42
+ --lexkit-fg: #ededed;
43
+ --lexkit-border: #262626;
44
+ --lexkit-border-hover: #404040;
45
+ --lexkit-border-active: #525252;
46
+ --lexkit-accent: #ededed;
47
+ --lexkit-accent-hover: #d4d4d8;
48
+ --lexkit-shadow: rgba(0, 0, 0, 0.5);
49
+ --lexkit-muted: #171717;
50
+ --lexkit-muted-fg: #a3a3a3;
51
+ }
52
+
53
+ /* Editor Wrapper */
54
+ .lexkit-editor-wrapper {
55
+ border: 1px solid var(--lexkit-border);
56
+ border-radius: 8px;
57
+ background-color: var(--lexkit-bg);
58
+ overflow: hidden;
59
+ display: flex;
60
+ flex-direction: column;
61
+ }
62
+
63
+ /* Editor Header - contains toolbar and tabs */
64
+ .lexkit-editor-header {
65
+ background-color: var(--lexkit-muted);
66
+ border-bottom: 1px solid var(--lexkit-border);
67
+ }
68
+
69
+ /* Mode Tabs */
70
+ .lexkit-mode-tabs {
71
+ display: flex;
72
+ border-bottom: 1px solid var(--lexkit-border);
73
+ }
74
+
75
+ .lexkit-mode-tab {
76
+ padding: 10px 20px;
77
+ background: none;
78
+ border: none;
79
+ cursor: pointer;
80
+ color: var(--lexkit-muted-fg);
81
+ font-size: 14px;
82
+ font-weight: 500;
83
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
84
+ border-bottom: 2px solid transparent;
85
+ position: relative;
86
+ }
87
+
88
+ .lexkit-mode-tab:hover {
89
+ color: var(--lexkit-fg);
90
+ background-color: var(--lexkit-muted);
91
+ }
92
+
93
+ .lexkit-mode-tab.active {
94
+ color: var(--lexkit-accent);
95
+ border-bottom-color: var(--lexkit-accent);
96
+ background-color: rgba(15, 23, 42, 0.05);
97
+ }
98
+
99
+ /* Toolbar */
100
+ .lexkit-toolbar {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 4px;
104
+ padding: 8px;
105
+ flex-wrap: wrap;
106
+ min-height: 48px;
107
+ }
108
+
109
+ /* Toolbar Sections */
110
+ .lexkit-toolbar-section {
111
+ display: flex;
112
+ align-items: center;
113
+ gap: 2px;
114
+ padding: 0 4px;
115
+ }
116
+
117
+ .lexkit-toolbar-section:not(:last-child) {
118
+ border-right: 1px solid var(--lexkit-border);
119
+ }
120
+
121
+ /* Toolbar Button Base */
122
+ .lexkit-toolbar-button {
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ width: 36px;
127
+ height: 36px;
128
+ border: 1px solid transparent;
129
+ border-radius: 6px;
130
+ background-color: transparent;
131
+ color: var(--lexkit-fg);
132
+ cursor: pointer;
133
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
134
+ font-size: 16px;
135
+ position: relative;
136
+ overflow: hidden;
137
+ }
138
+
139
+ .lexkit-toolbar-button::before {
140
+ content: '';
141
+ position: absolute;
142
+ inset: 0;
143
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
144
+ opacity: 0;
145
+ transition: opacity 0.2s ease;
146
+ }
147
+
148
+ .lexkit-toolbar-button:hover {
149
+ background-color: var(--lexkit-muted);
150
+ border-color: var(--lexkit-border-hover);
151
+ transform: translateY(-1px);
152
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
153
+ }
154
+
155
+ .lexkit-toolbar-button:hover::before {
156
+ opacity: 1;
157
+ }
158
+
159
+ .lexkit-toolbar-button:active {
160
+ transform: translateY(0) scale(0.98);
161
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
162
+ }
163
+
164
+ .lexkit-toolbar-button.active {
165
+ background-color: var(--lexkit-accent);
166
+ border-color: var(--lexkit-accent);
167
+ color: var(--lexkit-bg);
168
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
169
+ }
170
+
171
+ .lexkit-toolbar-button.active::before {
172
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.1) 100%);
173
+ opacity: 1;
174
+ }
175
+
176
+ .lexkit-toolbar-button:disabled {
177
+ opacity: 0.5;
178
+ cursor: not-allowed;
179
+ transform: none;
180
+ box-shadow: none;
181
+ }
182
+
183
+ .lexkit-toolbar-button:disabled:hover {
184
+ background-color: transparent;
185
+ border-color: transparent;
186
+ transform: none;
187
+ box-shadow: none;
188
+ }
189
+
190
+ .lexkit-toolbar-button:disabled::before {
191
+ opacity: 0;
192
+ }
193
+
194
+ /* Select Dropdown */
195
+ .lexkit-select {
196
+ position: relative;
197
+ display: inline-block;
198
+ }
199
+
200
+ .lexkit-select-trigger {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 6px;
204
+ padding: 8px 12px;
205
+ border: 1px solid var(--lexkit-border);
206
+ border-radius: 6px;
207
+ background-color: var(--lexkit-bg);
208
+ color: var(--lexkit-fg);
209
+ cursor: pointer;
210
+ font-size: 14px;
211
+ min-width: 120px;
212
+ height: 36px;
213
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
214
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
215
+ }
216
+
217
+ .lexkit-select-trigger:hover {
218
+ border-color: var(--lexkit-border-hover);
219
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
220
+ }
221
+
222
+ .lexkit-select-trigger.open {
223
+ border-color: var(--lexkit-accent);
224
+ box-shadow: 0 0 0 3px rgba(15, 23, 42, 0.1);
225
+ }
226
+
227
+ .lexkit-select-dropdown {
228
+ position: absolute;
229
+ top: 100%;
230
+ left: 0;
231
+ right: 0;
232
+ z-index: 50;
233
+ background-color: var(--lexkit-bg);
234
+ border: 1px solid var(--lexkit-border);
235
+ border-radius: 6px;
236
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
237
+ margin-top: 4px;
238
+ max-height: 200px;
239
+ overflow-y: auto;
240
+ }
241
+
242
+ .lexkit-select-option {
243
+ display: block;
244
+ width: 100%;
245
+ padding: 10px 14px;
246
+ border: none;
247
+ background: none;
248
+ color: var(--lexkit-fg);
249
+ cursor: pointer;
250
+ font-size: 14px;
251
+ text-align: left;
252
+ transition: all 0.15s ease;
253
+ }
254
+
255
+ .lexkit-select-option:hover {
256
+ background-color: var(--lexkit-muted);
257
+ }
258
+
259
+ .lexkit-select-option.selected {
260
+ background-color: var(--lexkit-accent);
261
+ color: var(--lexkit-bg);
262
+ font-weight: 500;
263
+ }
264
+
265
+ /* Dropdown Menu for Complex Actions */
266
+ .lexkit-dropdown {
267
+ position: relative;
268
+ display: inline-block;
269
+ }
270
+
271
+ .lexkit-dropdown-content {
272
+ position: absolute;
273
+ top: 100%;
274
+ left: 0;
275
+ z-index: 50;
276
+ background-color: var(--lexkit-bg);
277
+ border: 1px solid var(--lexkit-border);
278
+ border-radius: 4px;
279
+ box-shadow: 0 4px 6px -1px var(--lexkit-shadow);
280
+ margin-top: 2px;
281
+ min-width: 160px;
282
+ padding: 4px 0;
283
+ }
284
+
285
+ .lexkit-dropdown-item {
286
+ display: flex;
287
+ align-items: center;
288
+ gap: 8px;
289
+ width: 100%;
290
+ padding: 8px 12px;
291
+ border: none;
292
+ background: none;
293
+ color: var(--lexkit-fg);
294
+ cursor: pointer;
295
+ font-size: 14px;
296
+ text-align: left;
297
+ transition: background-color 0.15s;
298
+ }
299
+
300
+ .lexkit-dropdown-item:hover {
301
+ background-color: var(--lexkit-muted);
302
+ }
303
+
304
+ /* File Input Styling */
305
+ /* File Input (hidden) */
306
+ .lexkit-file-input {
307
+ position: absolute;
308
+ left: -9999px;
309
+ opacity: 0;
310
+ pointer-events: none;
311
+ }
312
+
313
+ /* Command Palette Styles */
314
+ .lexkit-command-palette-overlay {
315
+ position: fixed;
316
+ top: 0;
317
+ left: 0;
318
+ right: 0;
319
+ bottom: 0;
320
+ background: rgba(0, 0, 0, 0.5);
321
+ display: flex;
322
+ align-items: flex-start;
323
+ justify-content: center;
324
+ padding-top: 20vh;
325
+ z-index: 9999;
326
+ }
327
+
328
+ .lexkit-command-palette {
329
+ background: var(--lexkit-bg);
330
+ border: 1px solid var(--lexkit-border);
331
+ border-radius: 12px;
332
+ box-shadow: 0 12px 48px rgba(0, 0, 0, 0.12);
333
+ width: 640px;
334
+ max-width: 90vw;
335
+ max-height: 60vh;
336
+ display: flex;
337
+ flex-direction: column;
338
+ overflow: hidden;
339
+ }
340
+
341
+ .lexkit-command-palette-header {
342
+ display: flex;
343
+ align-items: center;
344
+ padding: 16px 20px;
345
+ border-bottom: 1px solid var(--lexkit-border);
346
+ gap: 12px;
347
+ }
348
+
349
+ .lexkit-command-palette-icon {
350
+ color: var(--lexkit-muted-fg);
351
+ flex-shrink: 0;
352
+ }
353
+
354
+ .lexkit-command-palette-input {
355
+ flex: 1;
356
+ background: transparent;
357
+ border: none;
358
+ outline: none;
359
+ font-size: 16px;
360
+ color: var(--lexkit-fg);
361
+ font-family: inherit;
362
+ }
363
+
364
+ .lexkit-command-palette-input::placeholder {
365
+ color: var(--lexkit-muted-fg);
366
+ }
367
+
368
+ .lexkit-command-palette-kbd {
369
+ background: var(--lexkit-muted);
370
+ border: 1px solid var(--lexkit-border);
371
+ border-radius: 4px;
372
+ padding: 2px 6px;
373
+ font-size: 11px;
374
+ color: var(--lexkit-muted-fg);
375
+ font-family: monospace;
376
+ }
377
+
378
+ .lexkit-command-palette-list {
379
+ flex: 1;
380
+ overflow-y: auto;
381
+ padding: 8px 0;
382
+ }
383
+
384
+ .lexkit-command-palette-group {
385
+ margin-bottom: 8px;
386
+ }
387
+
388
+ .lexkit-command-palette-group-title {
389
+ padding: 8px 20px 4px;
390
+ font-size: 11px;
391
+ font-weight: 600;
392
+ color: var(--lexkit-muted-fg);
393
+ text-transform: uppercase;
394
+ letter-spacing: 0.5px;
395
+ }
396
+
397
+ .lexkit-command-palette-item {
398
+ display: flex;
399
+ align-items: center;
400
+ padding: 12px 20px;
401
+ cursor: pointer;
402
+ border: none;
403
+ background: none;
404
+ width: 100%;
405
+ text-align: left;
406
+ transition: background-color 0.1s;
407
+ }
408
+
409
+ .lexkit-command-palette-item:hover,
410
+ .lexkit-command-palette-item.selected {
411
+ background: var(--lexkit-muted);
412
+ }
413
+
414
+ .lexkit-command-palette-item-content {
415
+ flex: 1;
416
+ min-width: 0;
417
+ }
418
+
419
+ .lexkit-command-palette-item-title {
420
+ font-size: 14px;
421
+ color: var(--lexkit-fg);
422
+ font-weight: 500;
423
+ margin-bottom: 2px;
424
+ }
425
+
426
+ .lexkit-command-palette-item-description {
427
+ font-size: 12px;
428
+ color: var(--lexkit-muted-fg);
429
+ line-height: 1.4;
430
+ }
431
+
432
+ .lexkit-command-palette-item-shortcut {
433
+ background: var(--lexkit-muted);
434
+ border: 1px solid var(--lexkit-border);
435
+ border-radius: 4px;
436
+ padding: 2px 6px;
437
+ font-size: 10px;
438
+ color: var(--lexkit-muted-fg);
439
+ font-family: monospace;
440
+ margin-left: 12px;
441
+ flex-shrink: 0;
442
+ }
443
+
444
+ .lexkit-command-palette-footer {
445
+ padding: 12px 20px;
446
+ border-top: 1px solid var(--lexkit-border);
447
+ background: var(--lexkit-muted);
448
+ }
449
+
450
+ .lexkit-command-palette-hint {
451
+ font-size: 11px;
452
+ color: var(--lexkit-muted-fg);
453
+ display: flex;
454
+ align-items: center;
455
+ gap: 8px;
456
+ }
457
+
458
+ .lexkit-command-palette-hint kbd {
459
+ background: var(--lexkit-bg);
460
+ border: 1px solid var(--lexkit-border);
461
+ border-radius: 3px;
462
+ padding: 1px 4px;
463
+ font-size: 10px;
464
+ font-family: monospace;
465
+ }
466
+
467
+ .lexkit-command-palette-empty {
468
+ padding: 40px 20px;
469
+ text-align: center;
470
+ color: var(--lexkit-muted-fg);
471
+ font-size: 14px;
472
+ }
473
+
474
+ /* Editor Content */
475
+ .lexkit-editor {
476
+ flex: 1;
477
+ display: flex;
478
+ flex-direction: column;
479
+ min-height: 400px;
480
+ position: relative;
481
+ }
482
+
483
+ .lexkit-content-editable {
484
+ flex: 1;
485
+ padding: 20px;
486
+ outline: none;
487
+ color: var(--lexkit-fg);
488
+ line-height: 1.7;
489
+ font-size: 16px;
490
+ background-color: var(--lexkit-bg);
491
+ transition: background-color 0.2s ease;
492
+ }
493
+
494
+ .lexkit-content-editable:focus {
495
+ outline: none;
496
+ background-color: var(--lexkit-bg);
497
+ }
498
+
499
+ /* HTML Source View */
500
+ .lexkit-html-view {
501
+ flex: 1;
502
+ width: 100%;
503
+ height: 100%;
504
+ padding: 20px;
505
+ border: none;
506
+ outline: none;
507
+ resize: none;
508
+ box-sizing: border-box;
509
+ font-family:
510
+ 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Consolas', 'Courier New', monospace;
511
+ font-size: 14px;
512
+ line-height: 1.6;
513
+ background-color: var(--lexkit-bg);
514
+ color: var(--lexkit-fg);
515
+ border-radius: 0;
516
+ transition: background-color 0.2s ease;
517
+ }
518
+
519
+ /* Placeholder */
520
+ .lexkit-placeholder {
521
+ color: var(--lexkit-muted-fg);
522
+ pointer-events: none;
523
+ position: absolute;
524
+ top: 20px;
525
+ left: 20px;
526
+ font-size: 16px;
527
+ line-height: 1.7;
528
+ z-index: 1;
529
+ }
530
+
531
+ /* Content Styles */
532
+ .lexkit-paragraph {
533
+ margin: 0 0 1em 0;
534
+ }
535
+
536
+ .lexkit-heading-h1 {
537
+ font-size: 2em;
538
+ font-weight: bold;
539
+ margin: 0.67em 0;
540
+ line-height: 1.2;
541
+ }
542
+
543
+ .lexkit-heading-h2 {
544
+ font-size: 1.5em;
545
+ font-weight: bold;
546
+ margin: 0.75em 0;
547
+ line-height: 1.3;
548
+ }
549
+
550
+ .lexkit-heading-h3 {
551
+ font-size: 1.25em;
552
+ font-weight: bold;
553
+ margin: 0.83em 0;
554
+ line-height: 1.4;
555
+ }
556
+
557
+ .lexkit-heading-h4 {
558
+ font-size: 1.125em;
559
+ font-weight: bold;
560
+ margin: 1em 0;
561
+ line-height: 1.4;
562
+ }
563
+
564
+ .lexkit-heading-h5 {
565
+ font-size: 1em;
566
+ font-weight: bold;
567
+ margin: 1em 0;
568
+ line-height: 1.4;
569
+ }
570
+
571
+ .lexkit-heading-h6 {
572
+ font-size: 0.875em;
573
+ font-weight: bold;
574
+ margin: 1em 0;
575
+ line-height: 1.4;
576
+ }
577
+
578
+ .lexkit-list-ul {
579
+ margin: 1em 0;
580
+ padding-left: 2em;
581
+ list-style-type: disc;
582
+ }
583
+
584
+ .lexkit-list-ol {
585
+ margin: 1em 0;
586
+ padding-left: 2em;
587
+ list-style-type: decimal;
588
+ }
589
+
590
+ .lexkit-list-li {
591
+ margin: 0.25em 0;
592
+ }
593
+
594
+ .lexkit-quote {
595
+ margin: 1em 0;
596
+ padding: 1em;
597
+ border-left: 4px solid var(--lexkit-accent);
598
+ background-color: var(--lexkit-muted);
599
+ font-style: italic;
600
+ }
601
+
602
+ .lexkit-text-bold {
603
+ font-weight: bold;
604
+ }
605
+
606
+ .lexkit-text-italic {
607
+ font-style: italic;
608
+ }
609
+
610
+ .lexkit-text-underline {
611
+ text-decoration: underline;
612
+ }
613
+
614
+ .lexkit-text-strikethrough {
615
+ text-decoration: line-through;
616
+ }
617
+
618
+ .lexkit-text-code,
619
+ .lexkit-code-block {
620
+ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
621
+ font-size: 0.875em;
622
+ background-color: var(--lexkit-muted);
623
+ border: 1px solid var(--lexkit-border);
624
+ padding: 0.125em 0.25em;
625
+ border-radius: 4px;
626
+ }
627
+ .lexkit-code-block {
628
+ display: block;
629
+ padding: 12px;
630
+ border-radius: 6px;
631
+ margin: 0 0 1rem 0;
632
+ }
633
+
634
+ .lexkit-link {
635
+ color: var(--lexkit-accent);
636
+ text-decoration: underline;
637
+ }
638
+
639
+ .lexkit-link:hover {
640
+ color: var(--lexkit-accent-hover);
641
+ }
642
+
643
+ /* Image Styles */
644
+ .lexical-image {
645
+ margin: 1em 0;
646
+ display: block;
647
+ position: relative;
648
+ }
649
+
650
+ .lexical-image img {
651
+ max-width: 100%;
652
+ height: auto;
653
+ border-radius: 4px;
654
+ display: block;
655
+ }
656
+
657
+ .lexical-image.align-left {
658
+ float: left;
659
+ margin-right: 1em;
660
+ margin-bottom: 1em;
661
+ }
662
+
663
+ .lexical-image.align-right {
664
+ float: right;
665
+ margin-left: 1em;
666
+ margin-bottom: 1em;
667
+ }
668
+
669
+ .lexical-image.align-center {
670
+ text-align: center;
671
+ margin: 1em auto;
672
+ }
673
+
674
+ .lexical-image.align-center img {
675
+ margin: 0 auto;
676
+ }
677
+
678
+ .lexical-image figcaption {
679
+ margin-top: 0.5em;
680
+ font-size: 0.875em;
681
+ color: var(--lexkit-muted-fg);
682
+ text-align: center;
683
+ font-style: italic;
684
+ }
685
+
686
+ /* Horizontal Rule Styles */
687
+ .lexkit-hr {
688
+ margin: 1.5em 0;
689
+ border: none;
690
+ border-top: 1px solid var(--lexkit-border);
691
+ height: 1px;
692
+ background: none;
693
+ }
694
+
695
+ .lexical-image.align-left figcaption {
696
+ text-align: left;
697
+ }
698
+
699
+ .lexical-image.align-right figcaption {
700
+ text-align: right;
701
+ }
702
+
703
+ .lexical-image.selected {
704
+ outline: 2px solid var(--lexkit-accent);
705
+ outline-offset: 2px;
706
+ }
707
+
708
+ .lexical-image.uploading {
709
+ opacity: 0.6;
710
+ }
711
+
712
+ .lexical-image.uploading::after {
713
+ content: 'Uploading...';
714
+ position: absolute;
715
+ top: 50%;
716
+ left: 50%;
717
+ transform: translate(-50%, -50%);
718
+ background-color: var(--lexkit-bg);
719
+ padding: 8px 12px;
720
+ border-radius: 4px;
721
+ font-size: 14px;
722
+ color: var(--lexkit-fg);
723
+ box-shadow: 0 2px 4px var(--lexkit-shadow);
724
+ }
725
+
726
+ /* Image Resizer */
727
+ .resizer {
728
+ position: absolute;
729
+ width: 8px;
730
+ height: 8px;
731
+ background: var(--lexkit-accent);
732
+ border: 1px solid white;
733
+ border-radius: 50%;
734
+ box-shadow: 0 1px 2px var(--lexkit-shadow);
735
+ }
736
+
737
+ .resizer.ne {
738
+ top: -4px;
739
+ right: -4px;
740
+ cursor: nesw-resize;
741
+ }
742
+
743
+ .resizer.nw {
744
+ top: -4px;
745
+ left: -4px;
746
+ cursor: nwse-resize;
747
+ }
748
+
749
+ .resizer.se {
750
+ bottom: -4px;
751
+ right: -4px;
752
+ cursor: nwse-resize;
753
+ }
754
+
755
+ .resizer.sw {
756
+ bottom: -4px;
757
+ left: -4px;
758
+ cursor: nesw-resize;
759
+ }
760
+
761
+ /* Mobile Responsive */
762
+ @media (max-width: 768px) {
763
+ .lexkit-toolbar {
764
+ padding: 6px;
765
+ gap: 4px;
766
+ }
767
+
768
+ .lexkit-toolbar-section {
769
+ margin-right: 6px;
770
+ padding-right: 6px;
771
+ }
772
+
773
+ .lexkit-toolbar-button {
774
+ width: 32px;
775
+ height: 32px;
776
+ font-size: 14px;
777
+ }
778
+
779
+ .lexkit-content-editable {
780
+ padding: 16px;
781
+ font-size: 16px; /* Prevent zoom on iOS */
782
+ }
783
+
784
+ .lexkit-placeholder {
785
+ top: 16px;
786
+ left: 16px;
787
+ }
788
+ }
789
+
790
+ /* ===== DRAGGABLE BLOCK EXTENSION STYLES ===== */
791
+
792
+ /* Button Stack Container */
793
+ .lexkit-drag-button-stack {
794
+ position: absolute;
795
+ z-index: 9999;
796
+ display: flex;
797
+ flex-direction: column;
798
+ gap: 6px;
799
+ align-items: center;
800
+ pointer-events: auto;
801
+ opacity: 0;
802
+ animation: fade-in-up 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
803
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
804
+ }
805
+
806
+ /* Base Drag Button Styles */
807
+ .lexkit-drag-button {
808
+ width: 24px;
809
+ height: 24px;
810
+ background: linear-gradient(135deg, var(--lexkit-bg) 0%, var(--lexkit-muted) 100%);
811
+ border: 1px solid var(--lexkit-border);
812
+ border-radius: 8px;
813
+ cursor: pointer;
814
+ display: flex;
815
+ align-items: center;
816
+ justify-content: center;
817
+ color: var(--lexkit-muted-fg);
818
+ font-size: 14px;
819
+ font-weight: 600;
820
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
821
+ box-shadow:
822
+ 0 2px 8px var(--lexkit-shadow),
823
+ 0 1px 3px rgba(0, 0, 0, 0.04),
824
+ inset 0 1px 0 rgba(255, 255, 255, 0.5);
825
+ backdrop-filter: blur(8px);
826
+ position: relative;
827
+ overflow: hidden;
828
+ }
829
+
830
+ .lexkit-drag-button::before {
831
+ content: '';
832
+ position: absolute;
833
+ inset: 0;
834
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%);
835
+ opacity: 0;
836
+ transition: opacity 0.2s ease;
837
+ border-radius: inherit;
838
+ }
839
+
840
+ .lexkit-drag-button:hover {
841
+ transform: scale(1.05);
842
+ box-shadow:
843
+ 0 6px 20px var(--lexkit-shadow),
844
+ 0 3px 10px rgba(0, 0, 0, 0.08),
845
+ inset 0 1px 0 rgba(255, 255, 255, 0.7);
846
+ border-color: var(--lexkit-border-hover);
847
+ color: var(--lexkit-accent);
848
+ }
849
+
850
+ .lexkit-drag-button:hover::before {
851
+ opacity: 1;
852
+ }
853
+
854
+ .lexkit-drag-button:active {
855
+ transform: scale(0.95);
856
+ box-shadow:
857
+ 0 1px 4px rgba(0, 0, 0, 0.1),
858
+ inset 0 1px 0 rgba(255, 255, 255, 0.3);
859
+ }
860
+
861
+ /* Drag Handle - Modern Grip Icon */
862
+ .lexkit-drag-handle {
863
+ background: linear-gradient(135deg, var(--lexkit-bg) 0%, var(--lexkit-muted) 100%) !important;
864
+ backdrop-filter: blur(12px) !important;
865
+ border: 1px solid var(--lexkit-border) !important;
866
+ box-shadow:
867
+ 0 4px 16px var(--lexkit-shadow),
868
+ 0 2px 8px rgba(0, 0, 0, 0.04),
869
+ inset 0 1px 0 rgba(255, 255, 255, 0.6) !important;
870
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1) !important;
871
+ cursor: grab !important;
872
+ }
873
+
874
+ .lexkit-drag-handle:hover {
875
+ transform: scale(1.08) !important;
876
+ box-shadow:
877
+ 0 8px 32px var(--lexkit-shadow),
878
+ 0 4px 16px rgba(0, 0, 0, 0.08),
879
+ inset 0 1px 0 rgba(255, 255, 255, 0.8) !important;
880
+ border-color: var(--lexkit-border-hover) !important;
881
+ }
882
+
883
+ .lexkit-drag-handle:active,
884
+ .lexkit-drag-handle-active {
885
+ background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%) !important;
886
+ border-color: #1d4ed8 !important;
887
+ color: white !important;
888
+ transform: scale(1.05) rotate(5deg) !important;
889
+ box-shadow:
890
+ 0 12px 40px rgba(59, 130, 246, 0.4),
891
+ 0 6px 20px rgba(0, 0, 0, 0.15) !important;
892
+ cursor: grabbing !important;
893
+ }
894
+
895
+ /* Move Up/Down Buttons */
896
+ .lexkit-move-up,
897
+ .lexkit-move-down {
898
+ background: linear-gradient(135deg, var(--lexkit-bg) 0%, var(--lexkit-muted) 100%) !important;
899
+ backdrop-filter: blur(8px) !important;
900
+ border: 1px solid var(--lexkit-border) !important;
901
+ box-shadow:
902
+ 0 2px 8px var(--lexkit-shadow),
903
+ 0 1px 3px rgba(0, 0, 0, 0.04),
904
+ inset 0 1px 0 rgba(255, 255, 255, 0.5) !important;
905
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;
906
+ }
907
+
908
+ .lexkit-move-up:hover,
909
+ .lexkit-move-down:hover {
910
+ background: linear-gradient(135deg, var(--lexkit-muted) 0%, var(--lexkit-bg) 100%) !important;
911
+ border-color: var(--lexkit-border-hover) !important;
912
+ color: var(--lexkit-accent) !important;
913
+ box-shadow:
914
+ 0 6px 20px var(--lexkit-shadow),
915
+ 0 3px 10px rgba(0, 0, 0, 0.08),
916
+ inset 0 1px 0 rgba(255, 255, 255, 0.7) !important;
917
+ }
918
+
919
+ .lexkit-move-up:active,
920
+ .lexkit-move-down:active {
921
+ transform: scale(0.95) !important;
922
+ box-shadow:
923
+ 0 1px 4px rgba(0, 0, 0, 0.1),
924
+ inset 0 1px 0 rgba(255, 255, 255, 0.3) !important;
925
+ }
926
+
927
+ /* Drop Indicator - Modern Animated Design */
928
+ .lexkit-drop-indicator {
929
+ background: linear-gradient(90deg, #3b82f6 0%, #1d4ed8 50%, #3b82f6 100%) !important;
930
+ box-shadow:
931
+ 0 0 24px rgba(59, 130, 246, 0.6),
932
+ 0 0 48px rgba(59, 130, 246, 0.3),
933
+ 0 0 96px rgba(59, 130, 246, 0.1) !important;
934
+ animation: drop-indicator-pulse 1.5s ease-in-out infinite !important;
935
+ backdrop-filter: blur(4px) !important;
936
+ }
937
+
938
+ /* Block Dragging State */
939
+ .lexkit-block-dragging {
940
+ opacity: 0.6 !important;
941
+ transform: rotate(2deg) scale(0.98) !important;
942
+ box-shadow:
943
+ 0 20px 40px rgba(0, 0, 0, 0.15),
944
+ 0 10px 20px rgba(0, 0, 0, 0.1) !important;
945
+ border-radius: 8px !important;
946
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
947
+ }
948
+
949
+ /* Drag Handle Area - Subtle Background */
950
+ .drag-handle-area {
951
+ background: radial-gradient(circle, rgba(59, 130, 246, 0.06) 0%, transparent 70%) !important;
952
+ border-radius: 16px !important;
953
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1) !important;
954
+ animation: subtle-area-glow 3s ease-in-out infinite !important;
955
+ }
956
+
957
+ /* ===== ANIMATIONS ===== */
958
+
959
+ @keyframes fade-in-up {
960
+ 0% {
961
+ opacity: 0;
962
+ transform: translateY(8px) scale(0.95);
963
+ }
964
+ 100% {
965
+ opacity: 1;
966
+ transform: translateY(0) scale(1);
967
+ }
968
+ }
969
+
970
+ @keyframes subtle-area-glow {
971
+ 0%,
972
+ 100% {
973
+ opacity: 0.4;
974
+ transform: scale(1);
975
+ }
976
+ 50% {
977
+ opacity: 0.7;
978
+ transform: scale(1.02);
979
+ }
980
+ }
981
+
982
+ @keyframes drag-handle-bounce {
983
+ 0% {
984
+ transform: scale(0.8) rotate(-10deg);
985
+ opacity: 0;
986
+ }
987
+ 50% {
988
+ transform: scale(1.05) rotate(2deg);
989
+ opacity: 0.8;
990
+ }
991
+ 100% {
992
+ transform: scale(1) rotate(0deg);
993
+ opacity: 1;
994
+ }
995
+ }
996
+
997
+ @keyframes button-hover-lift {
998
+ 0% {
999
+ transform: translateY(0) scale(1);
1000
+ }
1001
+ 100% {
1002
+ transform: translateY(-2px) scale(1.05);
1003
+ }
1004
+ }
1005
+
1006
+ @keyframes button-press {
1007
+ 0% {
1008
+ transform: translateY(-2px) scale(1.05);
1009
+ }
1010
+ 100% {
1011
+ transform: translateY(0) scale(0.98);
1012
+ }
1013
+ }
1014
+
1015
+ /* ===== DARK MODE SUPPORT ===== */
1016
+
1017
+ [data-theme='dark'] .lexkit-drag-handle,
1018
+ .dark .lexkit-drag-handle {
1019
+ background: linear-gradient(135deg, var(--lexkit-bg) 0%, var(--lexkit-muted) 100%) !important;
1020
+ border-color: var(--lexkit-border) !important;
1021
+ color: var(--lexkit-fg) !important;
1022
+ }
1023
+
1024
+ [data-theme='dark'] .lexkit-move-up,
1025
+ [data-theme='dark'] .lexkit-move-down,
1026
+ .dark .lexkit-move-up,
1027
+ .dark .lexkit-move-down {
1028
+ background: linear-gradient(135deg, var(--lexkit-bg) 0%, var(--lexkit-muted) 100%) !important;
1029
+ border-color: var(--lexkit-border) !important;
1030
+ color: var(--lexkit-fg) !important;
1031
+ }
1032
+
1033
+ [data-theme='dark'] .lexkit-move-up:hover,
1034
+ [data-theme='dark'] .lexkit-move-down:hover,
1035
+ .dark .lexkit-move-up:hover,
1036
+ .dark .lexkit-move-down:hover {
1037
+ background: linear-gradient(135deg, var(--lexkit-muted) 0%, var(--lexkit-bg) 100%) !important;
1038
+ border-color: var(--lexkit-border-hover) !important;
1039
+ color: var(--lexkit-accent) !important;
1040
+ } /* HTML Embed Styles - Modern and Clean */
1041
+ .html-embed-wrapper {
1042
+ position: relative;
1043
+ border: 1px solid var(--lexkit-border);
1044
+ border-radius: 12px;
1045
+ margin: 16px 0;
1046
+ overflow: hidden;
1047
+ background: var(--lexkit-bg);
1048
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
1049
+ transition: all 0.2s ease;
1050
+ }
1051
+
1052
+ .html-embed-wrapper:hover {
1053
+ border-color: var(--lexkit-border-hover);
1054
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
1055
+ }
1056
+
1057
+ .html-embed-preview {
1058
+ position: relative;
1059
+ min-height: 80px;
1060
+ padding: 16px;
1061
+ background: var(--lexkit-bg);
1062
+ border-bottom: 1px solid var(--lexkit-border);
1063
+ }
1064
+
1065
+ .html-embed-content {
1066
+ padding: 16px;
1067
+ min-height: 60px;
1068
+ background: var(--lexkit-bg);
1069
+ color: var(--lexkit-fg);
1070
+ font-size: 14px;
1071
+ line-height: 1.6;
1072
+ border-radius: 8px;
1073
+ background: var(--lexkit-muted);
1074
+ }
1075
+
1076
+ .html-embed-editor {
1077
+ position: relative;
1078
+ min-height: 140px;
1079
+ background: var(--lexkit-bg);
1080
+ }
1081
+
1082
+ .html-embed-textarea {
1083
+ width: 100%;
1084
+ min-height: 140px;
1085
+ padding: 16px;
1086
+ border: none;
1087
+ outline: none;
1088
+ resize: vertical;
1089
+ font-family:
1090
+ 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Consolas', 'Courier New', monospace;
1091
+ font-size: 13px;
1092
+ line-height: 1.6;
1093
+ background: var(--lexkit-bg);
1094
+ color: var(--lexkit-fg);
1095
+ box-sizing: border-box;
1096
+ border-radius: 8px;
1097
+ }
1098
+
1099
+ .html-embed-textarea::placeholder {
1100
+ color: var(--lexkit-muted-fg);
1101
+ }
1102
+
1103
+ .html-embed-toggle {
1104
+ position: absolute;
1105
+ top: 12px;
1106
+ right: 12px;
1107
+ background: var(--lexkit-accent);
1108
+ color: var(--lexkit-bg);
1109
+ border: none;
1110
+ border-radius: 8px;
1111
+ padding: 8px 12px;
1112
+ cursor: pointer;
1113
+ font-size: 12px;
1114
+ font-weight: 600;
1115
+ transition: all 0.2s ease;
1116
+ z-index: 10;
1117
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
1118
+ }
1119
+
1120
+ .html-embed-toggle:hover {
1121
+ background: var(--lexkit-accent-hover);
1122
+ transform: translateY(-1px);
1123
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1124
+ }
1125
+
1126
+ .html-embed-toggle:focus {
1127
+ outline: 2px solid var(--lexkit-accent);
1128
+ outline-offset: 2px;
1129
+ }
1130
+
1131
+ /* Visual indicator */
1132
+ .html-embed-wrapper::before {
1133
+ content: 'HTML';
1134
+ position: absolute;
1135
+ top: 0;
1136
+ left: 16px;
1137
+ background: linear-gradient(135deg, var(--lexkit-accent) 0%, var(--lexkit-accent-hover) 100%);
1138
+ color: var(--lexkit-bg);
1139
+ padding: 4px 12px;
1140
+ border-radius: 0 0 8px 8px;
1141
+ font-size: 11px;
1142
+ font-weight: 700;
1143
+ letter-spacing: 0.5px;
1144
+ z-index: 5;
1145
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1146
+ }
1147
+
1148
+ /* Dialog Overlay */
1149
+ .lexkit-dialog-overlay {
1150
+ position: fixed;
1151
+ inset: 0;
1152
+ background-color: rgba(0, 0, 0, 0.5);
1153
+ display: flex;
1154
+ align-items: center;
1155
+ justify-content: center;
1156
+ z-index: 1000;
1157
+ }
1158
+
1159
+ /* Dialog */
1160
+ .lexkit-dialog {
1161
+ background-color: var(--lexkit-bg);
1162
+ border-radius: 8px;
1163
+ box-shadow:
1164
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1),
1165
+ 0 10px 10px -5px rgba(0, 0, 0, 0.04);
1166
+ min-width: 400px;
1167
+ max-width: 500px;
1168
+ max-height: 90vh;
1169
+ overflow: hidden;
1170
+ }
1171
+
1172
+ /* Dialog Header */
1173
+ .lexkit-dialog-header {
1174
+ display: flex;
1175
+ align-items: center;
1176
+ justify-content: space-between;
1177
+ padding: 16px 20px;
1178
+ border-bottom: 1px solid var(--lexkit-border);
1179
+ }
1180
+
1181
+ .lexkit-dialog-title {
1182
+ margin: 0;
1183
+ font-size: 18px;
1184
+ font-weight: 600;
1185
+ color: var(--lexkit-fg);
1186
+ }
1187
+
1188
+ .lexkit-dialog-close {
1189
+ background: none;
1190
+ border: none;
1191
+ color: var(--lexkit-muted-fg);
1192
+ cursor: pointer;
1193
+ padding: 4px;
1194
+ border-radius: 4px;
1195
+ transition: all 0.2s ease;
1196
+ }
1197
+
1198
+ .lexkit-dialog-close:hover {
1199
+ background-color: var(--lexkit-muted);
1200
+ color: var(--lexkit-fg);
1201
+ }
1202
+
1203
+ /* Dialog Content */
1204
+ .lexkit-dialog-content {
1205
+ padding: 20px;
1206
+ }
1207
+
1208
+ /* Table Dialog */
1209
+ .lexkit-table-dialog {
1210
+ display: flex;
1211
+ flex-direction: column;
1212
+ gap: 16px;
1213
+ }
1214
+
1215
+ .lexkit-form-group {
1216
+ display: flex;
1217
+ flex-direction: column;
1218
+ gap: 6px;
1219
+ }
1220
+
1221
+ .lexkit-form-group label {
1222
+ font-size: 14px;
1223
+ font-weight: 500;
1224
+ color: var(--lexkit-fg);
1225
+ }
1226
+
1227
+ .lexkit-input {
1228
+ padding: 8px 12px;
1229
+ border: 1px solid var(--lexkit-border);
1230
+ border-radius: 6px;
1231
+ background-color: var(--lexkit-bg);
1232
+ color: var(--lexkit-fg);
1233
+ font-size: 14px;
1234
+ transition: border-color 0.2s ease;
1235
+ }
1236
+
1237
+ .lexkit-input:focus {
1238
+ outline: none;
1239
+ border-color: var(--lexkit-accent);
1240
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
1241
+ }
1242
+
1243
+ .lexkit-checkbox-label {
1244
+ display: flex;
1245
+ align-items: center;
1246
+ gap: 8px;
1247
+ font-size: 14px;
1248
+ color: var(--lexkit-fg);
1249
+ cursor: pointer;
1250
+ }
1251
+
1252
+ .lexkit-checkbox {
1253
+ width: 16px;
1254
+ height: 16px;
1255
+ accent-color: var(--lexkit-accent);
1256
+ }
1257
+
1258
+ .lexkit-dialog-actions {
1259
+ display: flex;
1260
+ justify-content: flex-end;
1261
+ gap: 12px;
1262
+ margin-top: 8px;
1263
+ }
1264
+
1265
+ .lexkit-button-primary,
1266
+ .lexkit-button-secondary {
1267
+ padding: 8px 16px;
1268
+ border-radius: 6px;
1269
+ font-size: 14px;
1270
+ font-weight: 500;
1271
+ cursor: pointer;
1272
+ transition: all 0.2s ease;
1273
+ border: 1px solid;
1274
+ }
1275
+
1276
+ .lexkit-button-primary {
1277
+ background-color: var(--lexkit-accent);
1278
+ border-color: var(--lexkit-accent);
1279
+ color: var(--lexkit-bg);
1280
+ }
1281
+
1282
+ .lexkit-button-primary:hover {
1283
+ background-color: var(--lexkit-accent-hover);
1284
+ border-color: var(--lexkit-accent-hover);
1285
+ }
1286
+
1287
+ .lexkit-button-secondary {
1288
+ background-color: transparent;
1289
+ border-color: var(--lexkit-border);
1290
+ color: var(--lexkit-fg);
1291
+ }
1292
+
1293
+ .lexkit-button-secondary:hover {
1294
+ background-color: var(--lexkit-muted);
1295
+ border-color: var(--lexkit-border-hover);
1296
+ }
1297
+
1298
+ /* Table selection styles */
1299
+ table[data-lexical-table-selection] {
1300
+ box-shadow: 0 0 0 2px var(--lexkit-accent);
1301
+ }
1302
+
1303
+ table td[data-lexical-table-cell-selection] {
1304
+ background-color: rgba(59, 130, 246, 0.1);
1305
+ }
1306
+
1307
+ /* Lexical Table Theme Classes */
1308
+ .lexkit-table {
1309
+ border-collapse: collapse;
1310
+ width: 100%;
1311
+ margin: 16px 0;
1312
+ border: 1px solid var(--lexkit-border);
1313
+ border-radius: 6px;
1314
+ overflow: hidden;
1315
+ }
1316
+
1317
+ .lexkit-table-cell {
1318
+ border: 1px solid var(--lexkit-border);
1319
+ padding: 8px 12px;
1320
+ text-align: left;
1321
+ min-width: 80px;
1322
+ position: relative;
1323
+ background-color: var(--lexkit-bg);
1324
+ color: var(--lexkit-fg);
1325
+ }
1326
+
1327
+ .lexkit-table-cell-header {
1328
+ background-color: var(--lexkit-muted);
1329
+ font-weight: 600;
1330
+ color: var(--lexkit-fg);
1331
+ border: 1px solid var(--lexkit-border);
1332
+ padding: 8px 12px;
1333
+ text-align: left;
1334
+ min-width: 80px;
1335
+ position: relative;
1336
+ }
1337
+
1338
+ .lexkit-table-cell:focus,
1339
+ .lexkit-table-cell-header:focus {
1340
+ outline: 2px solid var(--lexkit-accent);
1341
+ outline-offset: -2px;
1342
+ }
1343
+
1344
+ /* Table Context Menu */
1345
+ .table-context-menu {
1346
+ position: fixed;
1347
+ background: var(--lexkit-bg);
1348
+ border: 1px solid var(--lexkit-border);
1349
+ border-radius: 6px;
1350
+ box-shadow: 0 4px 12px var(--lexkit-shadow);
1351
+ z-index: 1000;
1352
+ min-width: 160px;
1353
+ padding: 4px 0;
1354
+ font-size: 14px;
1355
+ }
1356
+
1357
+ .table-context-menu > div {
1358
+ padding: 8px 16px;
1359
+ cursor: pointer;
1360
+ user-select: none;
1361
+ transition: background-color 0.15s ease;
1362
+ }
1363
+
1364
+ .table-context-menu > div:hover {
1365
+ background-color: var(--lexkit-muted);
1366
+ }
1367
+
1368
+ .table-context-menu > div:not(:last-child) {
1369
+ border-bottom: 1px solid var(--lexkit-border);
1370
+ }
1371
+
1372
+ /* Draggable Block Animations */
1373
+ @keyframes pulse {
1374
+ 0%,
1375
+ 100% {
1376
+ opacity: 1;
1377
+ }
1378
+ 50% {
1379
+ opacity: 0.6;
1380
+ }
1381
+ }
1382
+
1383
+ /* Floating Toolbar */
1384
+ .lexkit-floating-toolbar {
1385
+ display: flex;
1386
+ align-items: center;
1387
+ gap: 2px;
1388
+ padding: 6px;
1389
+ background-color: var(--lexkit-bg);
1390
+ border: 1px solid var(--lexkit-border);
1391
+ border-radius: 8px;
1392
+ box-shadow: 0 8px 32px var(--lexkit-shadow);
1393
+ backdrop-filter: blur(12px);
1394
+ position: absolute;
1395
+ z-index: 9999;
1396
+ pointer-events: auto;
1397
+ animation: lexkit-floating-toolbar-appear 0.15s cubic-bezier(0.4, 0, 0.2, 1);
1398
+ }
1399
+
1400
+ .lexkit-floating-toolbar-separator {
1401
+ width: 1px;
1402
+ height: 20px;
1403
+ background-color: var(--lexkit-border);
1404
+ margin: 0 4px;
1405
+ }
1406
+
1407
+ @keyframes lexkit-floating-toolbar-appear {
1408
+ from {
1409
+ opacity: 0;
1410
+ transform: translateX(-50%) scale(0.9);
1411
+ }
1412
+ to {
1413
+ opacity: 1;
1414
+ transform: translateX(-50%) scale(1);
1415
+ }
1416
+ }