diff --git a/backend/app/api/dto/paste_dto.py b/backend/app/api/dto/paste_dto.py
index 32aeab4..133beda 100644
--- a/backend/app/api/dto/paste_dto.py
+++ b/backend/app/api/dto/paste_dto.py
@@ -28,7 +28,8 @@ class CreatePaste(BaseModel):
max_length=config.MAX_CONTENT_LENGTH,
description="The content of the paste",
)
- content_language: PasteContentLanguage = Field(
+ content_language: str = Field(
+ min_length=1,
description="The language of the content",
default=PasteContentLanguage.plain_text,
examples=[PasteContentLanguage.plain_text],
@@ -63,8 +64,9 @@ class EditPaste(BaseModel):
max_length=config.MAX_CONTENT_LENGTH,
description="The content of the paste",
)
- content_language: PasteContentLanguage | None = Field(
+ content_language: str | None = Field(
None,
+ min_length=1,
description="The language of the content",
examples=[PasteContentLanguage.plain_text],
)
@@ -88,7 +90,7 @@ class PasteResponse(BaseModel):
content: str | None = Field(
description="The content of the paste, possible null if the content couldnt be read.",
)
- content_language: PasteContentLanguage = Field(
+ content_language: str | None = Field(
description="The language of the content",
)
expires_at: datetime | None = Field(
diff --git a/backend/app/services/paste_service.py b/backend/app/services/paste_service.py
index 01358df..410d865 100644
--- a/backend/app/services/paste_service.py
+++ b/backend/app/services/paste_service.py
@@ -242,7 +242,7 @@ async def get_paste_by_id(self, paste_id: UUID4) -> PasteResponse | None:
id=result.id,
title=result.title,
content=content,
- content_language=PasteContentLanguage(result.content_language),
+ content_language=result.content_language,
created_at=result.created_at,
expires_at=result.expires_at,
last_updated_at=result.last_updated_at,
@@ -288,7 +288,7 @@ async def edit_paste(self, paste_id: UUID4, edit_paste: EditPaste, edit_token: s
if edit_paste.title is not None: # Using ellipsis as sentinel for "not provided"
result.title = edit_paste.title
if edit_paste.content_language is not None:
- result.content_language = edit_paste.content_language.value
+ result.content_language = edit_paste.content_language
if edit_paste.is_expires_at_set():
result.expires_at = edit_paste.expires_at
@@ -328,7 +328,7 @@ async def edit_paste(self, paste_id: UUID4, edit_paste: EditPaste, edit_token: s
id=result.id,
title=result.title,
content=content,
- content_language=PasteContentLanguage(result.content_language),
+ content_language=result.content_language,
expires_at=result.expires_at,
created_at=result.created_at,
last_updated_at=result.last_updated_at,
@@ -417,7 +417,7 @@ async def create_paste(self, paste: CreatePaste, user_data: UserMetaData) -> Pas
id=paste_id,
title=paste.title,
content_path=paste_path,
- content_language=paste.content_language.value,
+ content_language=paste.content_language,
expires_at=paste.expires_at,
creator_ip=str(user_data.ip),
creator_user_agent=user_data.user_agent,
@@ -444,7 +444,7 @@ async def create_paste(self, paste: CreatePaste, user_data: UserMetaData) -> Pas
id=entity.id,
title=entity.title,
content=paste.content,
- content_language=PasteContentLanguage(entity.content_language),
+ content_language=entity.content_language,
created_at=entity.created_at,
last_updated_at=entity.last_updated_at,
expires_at=entity.expires_at,
diff --git a/frontend/.env.example b/frontend/.env.example
index 1441749..5ff4cf8 100644
--- a/frontend/.env.example
+++ b/frontend/.env.example
@@ -1,3 +1,6 @@
# Backend API config
API_URL=http://localhost:8000
ORIGIN=http://localhost:3000 # prevent cross-site post req forbidden from frontend because node can't resolve it's origin
+
+# frontend config
+PUBLIC_CONTENT_CHARACTER_LIMIT=100000
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
index 7cf3dd6..4494477 100644
--- a/frontend/Dockerfile
+++ b/frontend/Dockerfile
@@ -2,6 +2,13 @@ FROM node:20-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
ENV CI=true
+RUN apt-get update && apt-get install -y \
+ fontconfig \
+ fonts-dejavu-core \
+ --no-install-recommends \
+ && fc-cache -f \
+ && rm -rf /var/lib/apt/lists/*
+
# enable corepacks for automatic package manager installation. Keeps things simple
RUN corepack enable
COPY . /app
@@ -21,6 +28,15 @@ RUN pnpm prune --prod
# We don't want to include artifacts etc. so include only build output
FROM node:20-slim AS prod
+
+# add fontconfig and base fonts for sharp SVG rendering - this is for code preview gen
+RUN apt-get update && apt-get install -y \
+ fontconfig \
+ fonts-dejavu-core \
+ --no-install-recommends \
+ && fc-cache -f \
+ && rm -rf /var/lib/apt/lists/*
+
WORKDIR /app
COPY --from=build /app/node_modules node_modules
COPY --from=build /app/dist dist
diff --git a/frontend/src/lib/assets/fonts/CascadiaCode-VariableFont_wght.ttf b/frontend/src/lib/assets/fonts/CascadiaCode-VariableFont_wght.ttf
new file mode 100644
index 0000000..27e0058
Binary files /dev/null and b/frontend/src/lib/assets/fonts/CascadiaCode-VariableFont_wght.ttf differ
diff --git a/frontend/src/lib/components/code-editor.svelte b/frontend/src/lib/components/code-editor.svelte
index 3fbeb13..9e6cc16 100644
--- a/frontend/src/lib/components/code-editor.svelte
+++ b/frontend/src/lib/components/code-editor.svelte
@@ -1,12 +1,12 @@
+