All checks were successful
CI - Build and Push / Build and Push Docker Image (push) Successful in 18s
feat: implement EditorTheme for consistent styling across editor components feat: define types for blog-related operations including image uploads and post creation feat: create DropdownColorPicker component for color selection in blog editor feat: implement ImageResizer component for resizing images in the blog editor feat: add export and import functionality for blog posts in JSON format feat: update main application routes to include CreatePost page feat: enhance Blog page with a button to navigate to CreatePost feat: implement CreatePost page with title, cover image upload, and content editor
156 lines
5.9 KiB
CSS
156 lines
5.9 KiB
CSS
.toolbar {
|
|
display: flex;
|
|
background: #fff;
|
|
padding: 8px;
|
|
border-top-left-radius: 8px;
|
|
border-top-right-radius: 8px;
|
|
vertical-align: middle;
|
|
border-bottom: 1px solid #e0e0e0;
|
|
gap: 4px;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
}
|
|
|
|
.toolbar button {
|
|
border: 0;
|
|
display: flex;
|
|
background: none;
|
|
border-radius: 4px;
|
|
padding: 6px;
|
|
cursor: pointer;
|
|
vertical-align: middle;
|
|
align-items: center;
|
|
justify-content: center;
|
|
transition: background-color 0.2s;
|
|
}
|
|
|
|
.toolbar button:hover:not([disabled]) {
|
|
background-color: #f0f0f0;
|
|
}
|
|
|
|
.toolbar button:disabled {
|
|
cursor: not-allowed;
|
|
opacity: 0.3;
|
|
}
|
|
|
|
.toolbar button.active {
|
|
background-color: rgba(24, 144, 255, 0.1);
|
|
}
|
|
|
|
.toolbar-item {
|
|
border: 0;
|
|
display: flex;
|
|
background: none;
|
|
border-radius: 4px;
|
|
padding: 6px;
|
|
cursor: pointer;
|
|
vertical-align: middle;
|
|
flex-shrink: 0;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.toolbar-item.spaced {
|
|
margin-right: 2px;
|
|
}
|
|
|
|
.toolbar-item.block-controls {
|
|
background: none;
|
|
border: 1px solid #d0d0d0;
|
|
border-radius: 4px;
|
|
padding: 4px 8px;
|
|
font-size: 14px;
|
|
cursor: pointer;
|
|
min-width: 80px;
|
|
}
|
|
|
|
.toolbar-item i.format {
|
|
background-size: contain;
|
|
display: inline-block;
|
|
height: 18px;
|
|
width: 18px;
|
|
vertical-align: -0.25em;
|
|
opacity: 0.7;
|
|
}
|
|
|
|
.toolbar-item.active i.format,
|
|
.toolbar-item:hover:not([disabled]) i.format {
|
|
opacity: 1;
|
|
}
|
|
|
|
.divider {
|
|
width: 1px;
|
|
background-color: #e0e0e0;
|
|
margin: 0 4px;
|
|
height: 24px;
|
|
}
|
|
|
|
i.format.undo {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 7v6h6"/><path d="M21 17a9 9 0 00-9-9 9 9 0 00-6 2.3L3 13"/></svg>');
|
|
}
|
|
|
|
i.format.redo {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 7v6h-6"/><path d="M3 17a9 9 0 019-9 9 9 0 016 2.3l3 2.7"/></svg>');
|
|
}
|
|
|
|
i.format.bold {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"/><path d="M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z"/></svg>');
|
|
}
|
|
|
|
i.format.italic {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="19" y1="4" x2="10" y2="4"/><line x1="14" y1="20" x2="5" y2="20"/><line x1="15" y1="4" x2="9" y2="20"/></svg>');
|
|
}
|
|
|
|
i.format.underline {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3"/><line x1="4" y1="21" x2="20" y2="21"/></svg>');
|
|
}
|
|
|
|
i.format.strikethrough {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M17.3 5.3c-.94-.94-2.2-1.3-3.3-1.3H10a4 4 0 0 0 0 8"/><path d="M14 12a4 4 0 0 1 0 8h-4"/><line x1="4" y1="12" x2="20" y2="12"/></svg>');
|
|
}
|
|
|
|
i.format.code {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>');
|
|
}
|
|
|
|
i.icon.font-color {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 20h16"/><path d="m6 16 6-12 6 12"/><path d="M8 12h8"/></svg>');
|
|
display: inline-block;
|
|
height: 18px;
|
|
width: 18px;
|
|
background-size: contain;
|
|
}
|
|
|
|
i.icon.bg-color {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 14c0-2.5-2-4-4-4H8c-2 0-4 1.5-4 4v6h16v-6Z"/><path d="M4 14V6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8"/></svg>');
|
|
display: inline-block;
|
|
height: 18px;
|
|
width: 18px;
|
|
background-size: contain;
|
|
}
|
|
|
|
i.format.left-align {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="15" y2="12"/><line x1="3" y1="18" x2="18" y2="18"/></svg>');
|
|
}
|
|
|
|
i.format.center-align {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="6" y1="12" x2="18" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>');
|
|
}
|
|
|
|
i.format.right-align {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="9" y1="12" x2="21" y2="12"/><line x1="6" y1="18" x2="21" y2="18"/></svg>');
|
|
}
|
|
|
|
i.format.justify-align {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>');
|
|
}
|
|
|
|
i.format.import {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>');
|
|
}
|
|
|
|
i.format.export {
|
|
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>');
|
|
}
|
|
|