Files
Zero/apps/mail/components/create/prosemirror.css
Ahmet Kilinc d6b1c3b243 Release 2 (#351)
* fix: remove tracked node_modules/.bin files

* added to .gitignore

* update compose

* feat: Add AI brain and summary features for email

- Implemented EnableBrain action to subscribe to mail gateway
- Created GetSummary action to retrieve email thread summaries
- Added useSummary hook for fetching summaries
- Introduced mail0_summary database table
- Added Brain button to app sidebar for enabling AI features

* fix: Improve null safety and remove unused imports

- Fixed potential null access in thread-display by checking array first
- Removed unused markAsReadAction import in use-threads hook
- Removed unnecessary cache deletion logic in IndexedDB storage provider
- Removed threadId from ParsedMessage type definition

* fix: Use environment variable for brain gateway URL

- Replace hardcoded mail gateway URL with configurable environment variable
- Improve flexibility and configuration of brain subscription endpoint

* big push for connections and server actions:
- unread count 
- remove `/connect-email` 
- update redirects and callbacks to `/settings/connections` 
- make everything else server actions 
- remove old route.ts files 

* feat: Improve HTML text extraction and email parsing

- Added Cheerio for robust HTML text extraction in extractTextFromHTML
- Enhanced null safety in Google email driver for sender name and subject
- Updated mail list and threads hooks to handle potential undefined values
- Improved text cleaning and handling of edge cases in email parsing

* editor working

* compose and video

* fix: remove t3-oss env

* update max results to 10 per requst

* zero button floating sidebar

* lots of changes:
- removes old mail compose modal
- smaller upload limit
- useReducer on components with lots of state
- image logos for some file types (still more to add)
- resolve comments from previous review

* add logos

* straing to staging

* improvements to create ui (#345)

* made create wider

* send to multiple emails and new ui for 'to' list

* add icons for file upload (#346)

* added icon for figma icon

* added else ifs for other icons

* add file name to the getLogo func

* fix figma if statement

* fix figma

* fix excel

* remove console logs

* fix back to original component

* file icons

* ui tweaks

---------

Co-authored-by: Nizzy <nizabizaher@gmail.com>
Co-authored-by: nizzy <140507264+nizzyabi@users.noreply.github.com>

* fix: sidebar and settings page ui fixes (#348)

* fixes

* define to emails

* rotate on hover logo

* early access count on homepage

* updated readme

---------

Co-authored-by: Sijan Mainali <sijanmainali2@gmail.com>
Co-authored-by: Adam <x_1337@outlook.com>
Co-authored-by: Nizzy <nizabizaher@gmail.com>
Co-authored-by: user12224 <122770437+user12224@users.noreply.github.com>
Co-authored-by: nizzy <140507264+nizzyabi@users.noreply.github.com>
2025-03-01 16:36:17 -05:00

233 lines
6.3 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.ProseMirror {
@apply p-2;
font-size: 1rem;
font-family: 'Inter', sans-serif;
font-weight: 500;
}
.ProseMirror .is-editor-empty:first-child::before {
content: "Write your email here...";
float: left;
color: hsl(var(--muted-foreground));
pointer-events: none;
height: 0;
opacity: 0.5;
}
/* Custom image styles */
.ProseMirror img {
transition: filter 0.1s ease-in-out;
&:hover {
cursor: pointer;
filter: brightness(90%);
}
&.ProseMirror-selectednode {
outline: 3px solid #5abbf7;
filter: brightness(90%);
}
}
.img-placeholder {
position: relative;
&:before {
content: '';
box-sizing: border-box;
position: absolute;
top: 50%;
left: 50%;
width: 36px;
height: 36px;
border-radius: 50%;
border: 3px solid var(--novel-stone-200);
border-top-color: var(--novel-stone-800);
animation: spinning 0.6s linear infinite;
}
}
@keyframes spinning {
to {
transform: rotate(360deg);
}
}
/* Custom TODO list checkboxes shoutout to this awesome tutorial: https://moderncss.dev/pure-css-custom-checkbox-style/ */
ul[data-type='taskList'] li > label {
margin-right: 0.2rem;
user-select: none;
}
@media screen and (max-width: 768px) {
ul[data-type='taskList'] li > label {
margin-right: 0.5rem;
}
}
ul[data-type='taskList'] li > label input[type='checkbox'] {
-webkit-appearance: none;
appearance: none;
background-color: hsl(var(--background));
margin: 0;
cursor: pointer;
width: 1.2em;
height: 1.2em;
position: relative;
top: 5px;
border: 2px solid hsl(var(--border));
margin-right: 0.3rem;
display: grid;
place-content: center;
&:hover {
background-color: hsl(var(--accent));
}
&:active {
background-color: hsl(var(--accent));
}
&::before {
content: '';
width: 0.65em;
height: 0.65em;
transform: scale(0);
transition: 120ms transform ease-in-out;
box-shadow: inset 1em 1em;
transform-origin: center;
clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
}
&:checked::before {
transform: scale(1);
}
}
ul[data-type='taskList'] li[data-checked='true'] > div > p {
color: var(--muted-foreground);
text-decoration: line-through;
text-decoration-thickness: 2px;
}
/* Overwrite tippy-box original max-width */
.tippy-box {
max-width: 400px !important;
}
.ProseMirror:not(.dragging) .ProseMirror-selectednode {
outline: none !important;
background-color: var(--novel-highlight-blue);
transition: background-color 0.2s;
box-shadow: none;
}
.drag-handle {
position: fixed;
opacity: 1;
transition: opacity ease-in 0.2s;
border-radius: 0.25rem;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(0, 0, 0, 0.5)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E");
background-size: calc(0.5em + 0.375rem) calc(0.5em + 0.375rem);
background-repeat: no-repeat;
background-position: center;
width: 1rem;
height: 1rem;
z-index: 50;
cursor: grab;
margin-top: 0.25rem;
margin-left: 0.2rem;
&:hover {
background-color: var(--novel-stone-100);
transition: background-color 0.2s;
}
&:active {
background-color: var(--novel-stone-200);
transition: background-color 0.2s;
cursor: grabbing;
}
&.hide {
opacity: 0;
pointer-events: none;
}
@media screen and (max-width: 600px) {
display: none;
pointer-events: none;
}
}
.dark .drag-handle {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10' style='fill: rgba(255, 255, 255, 0.5)'%3E%3Cpath d='M3,2 C2.44771525,2 2,1.55228475 2,1 C2,0.44771525 2.44771525,0 3,0 C3.55228475,0 4,0.44771525 4,1 C4,1.55228475 3.55228475,2 3,2 Z M3,6 C2.44771525,6 2,5.55228475 2,5 C2,4.44771525 2.44771525,4 3,4 C3.55228475,4 4,4.44771525 4,5 C4,5.55228475 3.55228475,6 3,6 Z M3,10 C2.44771525,10 2,9.55228475 2,9 C2,8.44771525 2.44771525,8 3,8 C3.55228475,8 4,8.44771525 4,9 C4,9.55228475 3.55228475,10 3,10 Z M7,2 C6.44771525,2 6,1.55228475 6,1 C6,0.44771525 6.44771525,0 7,0 C7.55228475,0 8,0.44771525 8,1 C8,1.55228475 7.55228475,2 7,2 Z M7,6 C6.44771525,6 6,5.55228475 6,5 C6,4.44771525 6.44771525,4 7,4 C7.55228475,4 8,4.44771525 8,5 C8,5.55228475 7.55228475,6 7,6 Z M7,10 C6.44771525,10 6,9.55228475 6,9 C6,8.44771525 6.44771525,8 7,8 C7.55228475,8 8,8.44771525 8,9 C8,9.55228475 7.55228475,10 7,10 Z'%3E%3C/path%3E%3C/svg%3E");
}
/* Custom Youtube Video CSS */
iframe {
border: 8px solid #ffd00027;
border-radius: 4px;
min-width: 200px;
min-height: 200px;
display: block;
outline: 0px solid transparent;
}
div[data-youtube-video] > iframe {
cursor: move;
aspect-ratio: 16 / 9;
width: 100%;
}
.ProseMirror-selectednode iframe {
transition: outline 0.15s;
outline: 6px solid #fbbf24;
}
@media only screen and (max-width: 480px) {
div[data-youtube-video] > iframe {
max-height: 50px;
}
}
@media only screen and (max-width: 720px) {
div[data-youtube-video] > iframe {
max-height: 100px;
}
}
/* CSS for bold coloring and highlighting issue*/
span[style] > strong {
color: inherit;
}
mark[style] > strong {
color: inherit;
}
/* Add specific heading styles */
.ProseMirror h1 {
font-size: 1.5rem; /* text-2xl equivalent */
font-weight: bold;
margin-top: 1rem;
margin-bottom: 0.5rem;
}
.ProseMirror h2 {
font-size: 1.25rem; /* text-xl equivalent */
font-weight: bold;
margin-top: 0.75rem;
margin-bottom: 0.5rem;
}
.ProseMirror h3 {
font-size: 1.125rem; /* text-lg equivalent */
font-weight: bold;
margin-top: 0.75rem;
margin-bottom: 0.5rem;
}