refactor: move studio to frontends workspace
- Move studio from root to frontends/studio/ - Add owner-tools frontend for live blog admin UI - Add shared ui component library - Set up npm workspaces for frontends - Add enhanced code block extension for editor Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
c662e41b97
commit
bef5dd4437
108 changed files with 8650 additions and 441 deletions
212
frontends/studio/uno.config.ts
Normal file
212
frontends/studio/uno.config.ts
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
import { defineConfig, presetWind4, presetIcons, presetTypography } from 'unocss'
|
||||
import { theme, shortcuts } from '@writekit/ui/uno.config'
|
||||
|
||||
export default defineConfig({
|
||||
presets: [
|
||||
presetWind4(),
|
||||
presetTypography({
|
||||
cssExtend: {
|
||||
':not(pre) > code': {
|
||||
'font-family': '"SF Mono", "Fira Code", Consolas, monospace',
|
||||
'font-size': '0.875em',
|
||||
'background': '#fafafa',
|
||||
'padding': '0.175rem 0.375rem',
|
||||
'border-radius': '0.25rem',
|
||||
},
|
||||
'p': {
|
||||
'margin': '1.25rem 0',
|
||||
'line-height': '1.7',
|
||||
},
|
||||
'h1': {
|
||||
'margin-top': '0',
|
||||
'margin-bottom': '1.25rem',
|
||||
'font-size': '2rem',
|
||||
'font-weight': '700',
|
||||
'letter-spacing': '-0.025em',
|
||||
'line-height': '1.2',
|
||||
},
|
||||
'h2': {
|
||||
'margin-top': '2.5rem',
|
||||
'margin-bottom': '1.25rem',
|
||||
'font-size': '1.5rem',
|
||||
'font-weight': '650',
|
||||
'letter-spacing': '-0.02em',
|
||||
'line-height': '1.3',
|
||||
},
|
||||
'h3': {
|
||||
'margin-top': '2rem',
|
||||
'margin-bottom': '1rem',
|
||||
'font-size': '1.25rem',
|
||||
'font-weight': '600',
|
||||
'letter-spacing': '-0.015em',
|
||||
'line-height': '1.35',
|
||||
},
|
||||
'h4': {
|
||||
'margin-top': '1.625rem',
|
||||
'margin-bottom': '0.8rem',
|
||||
'font-size': '1.0625rem',
|
||||
'font-weight': '600',
|
||||
'letter-spacing': '-0.01em',
|
||||
},
|
||||
'ul': {
|
||||
'list-style-type': 'disc',
|
||||
'margin': '1.25rem 0',
|
||||
'padding-left': '1.375rem',
|
||||
},
|
||||
'ol': {
|
||||
'list-style-type': 'decimal',
|
||||
'margin': '1.25rem 0',
|
||||
'padding-left': '1.375rem',
|
||||
},
|
||||
'li': {
|
||||
'margin': '0.5rem 0',
|
||||
'padding-left': '0.25rem',
|
||||
},
|
||||
'li::marker': {
|
||||
'color': '#71717a',
|
||||
},
|
||||
'a': {
|
||||
'color': '#2563eb',
|
||||
'text-decoration': 'underline',
|
||||
'text-underline-offset': '2px',
|
||||
'text-decoration-color': 'rgba(37, 99, 235, 0.4)',
|
||||
},
|
||||
'a:hover': {
|
||||
'text-decoration-color': '#2563eb',
|
||||
},
|
||||
'pre': {
|
||||
'margin': '1.75rem 0',
|
||||
'padding': '1.125rem 1.25rem',
|
||||
'background': '#fafafa',
|
||||
'border': '1px solid #e4e4e7',
|
||||
'border-radius': '0.375rem',
|
||||
'overflow-x': 'auto',
|
||||
'font-family': '"SF Mono", "Fira Code", Consolas, monospace',
|
||||
'font-size': '0.875rem',
|
||||
'line-height': '1.6',
|
||||
},
|
||||
'pre code': {
|
||||
'background': 'transparent',
|
||||
'padding': '0',
|
||||
'font-size': 'inherit',
|
||||
},
|
||||
'blockquote': {
|
||||
'margin': '1.75rem 0',
|
||||
'padding': '0 0 0 1.25rem',
|
||||
'border-left': '2px solid #e4e4e7',
|
||||
'color': '#71717a',
|
||||
'font-style': 'normal',
|
||||
},
|
||||
'blockquote p': {
|
||||
'margin': '0',
|
||||
},
|
||||
'hr': {
|
||||
'border': 'none',
|
||||
'border-top': '1px solid #e4e4e7',
|
||||
'margin': '2.5rem 0',
|
||||
},
|
||||
'img': {
|
||||
'max-width': '100%',
|
||||
'height': 'auto',
|
||||
'border-radius': '0.375rem',
|
||||
'margin': '1.75rem 0',
|
||||
},
|
||||
'table': {
|
||||
'width': '100%',
|
||||
'margin': '1.75rem 0',
|
||||
'border-collapse': 'collapse',
|
||||
'font-size': '0.9375rem',
|
||||
},
|
||||
'th': {
|
||||
'padding': '0.625rem 0.75rem',
|
||||
'border': '1px solid #e4e4e7',
|
||||
'text-align': 'left',
|
||||
'background': '#fafafa',
|
||||
'font-weight': '600',
|
||||
},
|
||||
'td': {
|
||||
'padding': '0.625rem 0.75rem',
|
||||
'border': '1px solid #e4e4e7',
|
||||
'text-align': 'left',
|
||||
},
|
||||
'strong': {
|
||||
'font-weight': '600',
|
||||
},
|
||||
},
|
||||
}),
|
||||
presetIcons({
|
||||
scale: 1.2,
|
||||
cdn: 'https://esm.sh/',
|
||||
extraProperties: {
|
||||
'display': 'inline-block',
|
||||
'vertical-align': 'middle',
|
||||
},
|
||||
}),
|
||||
],
|
||||
rules: [
|
||||
['animate-shimmer', { animation: 'shimmer 1.5s ease-in-out infinite' }],
|
||||
],
|
||||
preflights: [
|
||||
{
|
||||
getCSS: () => `
|
||||
@keyframes shimmer {
|
||||
0% { opacity: 1; }
|
||||
50% { opacity: 0.5; }
|
||||
100% { opacity: 1; }
|
||||
}
|
||||
@keyframes fade-in {
|
||||
from { opacity: 0; transform: translateY(4px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
/* ProseMirror editor placeholder */
|
||||
.ProseMirror p.is-editor-empty:first-child::before {
|
||||
color: #a3a3a3;
|
||||
content: attr(data-placeholder);
|
||||
float: left;
|
||||
height: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Task list styling */
|
||||
.prose ul[data-type="taskList"] {
|
||||
list-style: none;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.prose ul[data-type="taskList"] li {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.prose ul[data-type="taskList"] li > label {
|
||||
flex-shrink: 0;
|
||||
user-select: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 1.5em;
|
||||
}
|
||||
|
||||
.prose ul[data-type="taskList"] li > label input[type="checkbox"] {
|
||||
cursor: pointer;
|
||||
accent-color: #10b981;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.prose ul[data-type="taskList"] li > div {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* Code block syntax highlighting */
|
||||
.prose pre .hljs {
|
||||
background: transparent;
|
||||
}
|
||||
`,
|
||||
},
|
||||
],
|
||||
theme,
|
||||
shortcuts,
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue