From 5bb488ccd08579f548329e53fe568bb44317498e Mon Sep 17 00:00:00 2001 From: Sergey Filkin Date: Sat, 18 Apr 2026 14:42:16 +0300 Subject: [PATCH] Release v0.2.2 --- CHANGELOG.md | 8 + Makefile | 8 +- README.md | 55 ++++- VERSION | 2 +- internal/server/handlers.go | 9 +- internal/ui/home.templ | 479 +++++++++++++++++++++++++---------- internal/ui/home_templ.go | 210 +++++----------- internal/ui/icons.templ | 75 ++++++ internal/ui/icons_templ.go | 481 ++++++++++++++++++++++++++++++++++++ internal/ui/layout.templ | 29 +-- internal/ui/layout_templ.go | 23 +- internal/ui/result.templ | 109 ++++---- internal/ui/result_templ.go | 304 +++++++++++++---------- screen.png | Bin 0 -> 96525 bytes scripts/release-build.sh | 100 ++++++++ tailwind.config.js | 38 +-- web/static/src/app.css | 90 +++---- 17 files changed, 1431 insertions(+), 589 deletions(-) create mode 100644 internal/ui/icons.templ create mode 100644 internal/ui/icons_templ.go create mode 100644 screen.png create mode 100755 scripts/release-build.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 918cd7a..0edbb64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file. The format is based on Keep a Changelog, and the project uses Semantic Versioning. +## [0.2.2] - 2026-04-18 + +### Changed + +- Web UI redesigned into a single-column classic layout with tabbed file/text input, updated result card, and API snippet. +- Added a local release build script and Make targets for current-platform and cross-platform release artifacts. +- README updated with the current build, release, and run instructions. + ## [0.2.1] - 2026-04-18 ### Fixed diff --git a/Makefile b/Makefile index 8e2d060..5907251 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ LDFLAGS := -X github.com/fserg/md-to-html/internal/version.Version=$(VERSION) GOBIN := $(shell go env GOPATH)/bin TEMPL := $(GOBIN)/templ -.PHONY: build run test templ tailwind dev docker clean tools +.PHONY: build run test templ tailwind dev docker clean tools release release-all build: go build -ldflags "$(LDFLAGS)" -o bin/md-to-html ./cmd/md-to-html @@ -31,6 +31,12 @@ dev: docker: @echo "docker target will be implemented in phase 6" +release: + ./scripts/release-build.sh + +release-all: + ./scripts/release-build.sh --all + clean: rm -rf bin/ tmp/ web/static/dist/ diff --git a/README.md b/README.md index 51428ea..d2c38b8 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ # md-to-html -Сервис конвертации Markdown в самодостаточный HTML. Полностью офлайн, без обращений к внешним API. +Сервис конвертации Markdown в самодостаточный HTML. Конвертация выполняется локально, без внешних API. -Текущая версия: `0.2.1` (Go + goldmark + templUI) +![Превью интерфейса](screen.png) + +Текущая версия: `0.2.2` (Go + goldmark + templUI) ## Возможности - GFM + footnote + emoji + подсветка кода через chroma. -- Якоря в заголовках с ASCII-транслитом: `## Установка` → `#ustanovka`. +- Web UI на `http://localhost:8080/` с загрузкой файла или вставкой текста, HTMX-обновлением результата и одноразовыми ссылками на preview/download. - CLI: `md-to-html cli file.md`. -- HTTP API: `POST /convert` совместим с `v0.1.x`. -- Web UI на `http://localhost:8080/` с inline-preview в sandbox iframe и одноразовыми ссылками на preview/download. +- HTTP API: `POST /convert`, совместим с `v0.1.x`. +- Якоря в заголовках с ASCII-транслитом: `## Установка` → `#ustanovka`. ## Запуск через Docker @@ -18,12 +20,22 @@ docker run --rm -p 8080:8080 ghcr.io/fserg/md-to-html:latest ``` -## Локальная разработка - -Требования: Go 1.23+, `templ` CLI, Node.js для dev-режима Tailwind или standalone `tailwindcss`. +## Быстрый старт ```bash go install github.com/a-h/templ/cmd/templ@v0.3.1001 +npm install +make build +./bin/md-to-html serve +``` + +## Локальная разработка + +Требования: Go 1.24+, Node.js, `templ` CLI. + +```bash +go install github.com/a-h/templ/cmd/templ@v0.3.1001 +npm install make tailwind make build ./bin/md-to-html serve @@ -35,6 +47,33 @@ make build make dev ``` +## Релизная сборка + +Локальный release-билд для текущей платформы: + +```bash +make release +``` + +Скрипт: +- генерирует `templ`-код +- собирает Tailwind bundle +- прогоняет `go test ./...` +- собирает release-бинарь с версией из `VERSION` +- кладёт артефакты в `dist/` + +Проверка готового release-билда: + +```bash +./dist/md-to-html-$(go env GOOS)-$(go env GOARCH) serve +``` + +Сборка всех release-таргетов как в CI: + +```bash +make release-all +``` + ## CLI ```bash diff --git a/VERSION b/VERSION index 0c62199..ee1372d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.1 +0.2.2 diff --git a/internal/server/handlers.go b/internal/server/handlers.go index 820daa4..e502f3f 100644 --- a/internal/server/handlers.go +++ b/internal/server/handlers.go @@ -11,6 +11,7 @@ import ( "net/http" "path/filepath" "strings" + "time" "github.com/fserg/md-to-html/internal/converter" "github.com/fserg/md-to-html/internal/ui" @@ -79,6 +80,7 @@ func (s *Server) handleHome(w http.ResponseWriter, r *http.Request) { } func (s *Server) handleUIConvert(w http.ResponseWriter, r *http.Request) { + startedAt := time.Now() r.Body = http.MaxBytesReader(w, r.Body, s.cfg.MaxRequestBytes) if err := r.ParseMultipartForm(s.cfg.MaxRequestBytes); err != nil { s.renderUIError(w, r, http.StatusRequestEntityTooLarge, "Слишком большой файл или ошибка формы") @@ -100,10 +102,15 @@ func (s *Server) handleUIConvert(w http.ResponseWriter, r *http.Request) { previewID := s.store.Put(result.HTML, "text/html; charset=utf-8", filename) downloadID := s.store.Put(result.HTML, "text/html; charset=utf-8", filename) + lineCount := bytes.Count(result.HTML, []byte("\n")) + 1 + elapsedMs := int(time.Since(startedAt).Milliseconds()) + if elapsedMs < 1 { + elapsedMs = 1 + } w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(http.StatusOK) - _ = ui.Result(previewID, downloadID, string(result.HTML), filename).Render(r.Context(), w) + _ = ui.Result(previewID, downloadID, string(result.HTML), filename, len(result.HTML), lineCount, elapsedMs).Render(r.Context(), w) } func (s *Server) handlePreview(w http.ResponseWriter, r *http.Request) { diff --git a/internal/ui/home.templ b/internal/ui/home.templ index 27469e3..f0f854c 100644 --- a/internal/ui/home.templ +++ b/internal/ui/home.templ @@ -1,158 +1,371 @@ package ui -import ( - "github.com/fserg/md-to-html/internal/ui/components/button" - "github.com/fserg/md-to-html/internal/ui/components/card" -) - templ Home() { - @Layout("Markdown → HTML") { -
-
-
-
- Go migration - goldmark + templUI + @Layout("Markdown → standalone HTML") { +
+
+

Markdown → standalone HTML

+

+ Загрузите .md файл или вставьте Markdown-текст. Результат — готовый самодостаточный HTML со встроенными стилями. +

+
+ +
+ + +
+
+
+ + +
-
-

- Markdown → HTML без внешних зависимостей в результирующем документе. -

-

- Загрузите `.md`-файл или вставьте текст вручную. Сервис отдаст автономный HTML, одноразовое превью и отдельную ссылку на скачивание. -

-
-
-
-
-
Самодостаточный HTML
-

Результат открывается локально без CDN и без сетевых вызовов.

-
-
-
Одноразовые ссылки
-

Preview и download живут до первого открытия или максимум один час.

-
-
-
Русский интерфейс
-

Форма ориентирована на быстрый ручной прогон документации и заметок.

-
-
-
-
- @card.Card(card.Props{Class: "section-card overflow-hidden"}) { - @card.Header(card.HeaderProps{Class: "space-y-2 border-b border-border/70 pb-6"}) { -
Конвертация
- @card.Title(card.TitleProps{Class: "text-2xl font-semibold tracking-tight text-foreground"}) { - Выберите источник Markdown - } - @card.Description(card.DescriptionProps{Class: "max-w-xl text-sm leading-6 text-muted-foreground"}) { - Форма отправляется через HTMX на `POST /ui/convert`, а результат подменяется прямо в блоке ниже. - } - } - @card.Content(card.ContentProps{Class: "space-y-5"}) { - -
-
Источник
-
- - -
-
-
- + +
+
+ + + - + + +
+ +
+

+ Конвертация использует публичный GitHub API +

+
+ + +
+
+
+ + +
+ +
+
+
+ API + + POST /convert + +
+ +
+ +
$ curl -X POST http://localhost:8000/convert \
+  -H 'Content-Type: application/json' \
+  -d '{"markdown":"# Hello"}'
+ } } diff --git a/internal/ui/home_templ.go b/internal/ui/home_templ.go index ed576d6..d47911a 100644 --- a/internal/ui/home_templ.go +++ b/internal/ui/home_templ.go @@ -8,11 +8,6 @@ package ui import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import ( - "github.com/fserg/md-to-html/internal/ui/components/button" - "github.com/fserg/md-to-html/internal/ui/components/card" -) - func Home() templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context @@ -46,162 +41,77 @@ func Home() templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
Go migration goldmark + templUI

Markdown → HTML без внешних зависимостей в результирующем документе.

Загрузите `.md`-файл или вставьте текст вручную. Сервис отдаст автономный HTML, одноразовое превью и отдельную ссылку на скачивание.

Самодостаточный HTML

Результат открывается локально без CDN и без сетевых вызовов.

Одноразовые ссылки

Preview и download живут до первого открытия или максимум один час.

Русский интерфейс

Форма ориентирована на быстрый ручной прогон документации и заметок.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "

Markdown → standalone HTML

Загрузите .md файл или вставьте Markdown-текст. Результат — готовый самодостаточный HTML со встроенными стилями.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "Загрузить файл
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = FileIcon("size-4").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "
README.md
3.4 KB · изменён только что
0 символов

") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = InfoIcon("size-3.5").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "Поддерживается CommonMark + GFM

Конвертация использует публичный GitHub API

API POST /convert
$ curl -X POST http://localhost:8000/convert \\ -H 'Content-Type: application/json' \\ -d '{\"markdown\":\"# Hello\"}'
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } return nil }) - templ_7745c5c3_Err = Layout("Markdown → HTML").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + templ_7745c5c3_Err = Layout("Markdown → standalone HTML").Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/internal/ui/icons.templ b/internal/ui/icons.templ new file mode 100644 index 0000000..82c8373 --- /dev/null +++ b/internal/ui/icons.templ @@ -0,0 +1,75 @@ +package ui + +templ UploadIcon(class string) { + +} + +templ FileIcon(class string) { + +} + +templ AlignLeftIcon(class string) { + +} + +templ ArrowRightIcon(class string) { + +} + +templ InfoIcon(class string) { + +} + +templ CloseIcon(class string) { + +} + +templ CheckIcon(class string) { + +} + +templ DownloadIcon(class string) { + +} + +templ CopyIcon(class string) { + +} + +templ ExternalLinkIcon(class string) { + +} diff --git a/internal/ui/icons_templ.go b/internal/ui/icons_templ.go new file mode 100644 index 0000000..46975bc --- /dev/null +++ b/internal/ui/icons_templ.go @@ -0,0 +1,481 @@ +// Code generated by templ - DO NOT EDIT. + +// templ: version: v0.3.1001 +package ui + +//lint:file-ignore SA4006 This context is only used if a nested component is present. + +import "github.com/a-h/templ" +import templruntime "github.com/a-h/templ/runtime" + +func UploadIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var1 := templ.GetChildren(ctx) + if templ_7745c5c3_Var1 == nil { + templ_7745c5c3_Var1 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var2 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var2...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func FileIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var4 := templ.GetChildren(ctx) + if templ_7745c5c3_Var4 == nil { + templ_7745c5c3_Var4 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var5 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var5...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func AlignLeftIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var7 := templ.GetChildren(ctx) + if templ_7745c5c3_Var7 == nil { + templ_7745c5c3_Var7 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var8 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var8...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func ArrowRightIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var10 := templ.GetChildren(ctx) + if templ_7745c5c3_Var10 == nil { + templ_7745c5c3_Var10 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var11 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var11...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func InfoIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var13 := templ.GetChildren(ctx) + if templ_7745c5c3_Var13 == nil { + templ_7745c5c3_Var13 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var14 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var14...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 9, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func CloseIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var16 := templ.GetChildren(ctx) + if templ_7745c5c3_Var16 == nil { + templ_7745c5c3_Var16 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var17 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var17...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 11, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func CheckIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var19 := templ.GetChildren(ctx) + if templ_7745c5c3_Var19 == nil { + templ_7745c5c3_Var19 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var20 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var20...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 13, "") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func DownloadIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var22 := templ.GetChildren(ctx) + if templ_7745c5c3_Var22 == nil { + templ_7745c5c3_Var22 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var23 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var23...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func CopyIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var25 := templ.GetChildren(ctx) + if templ_7745c5c3_Var25 == nil { + templ_7745c5c3_Var25 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var26 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var26...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 17, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +func ExternalLinkIcon(class string) templ.Component { + return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { + templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context + if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { + return templ_7745c5c3_CtxErr + } + templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) + if !templ_7745c5c3_IsBuffer { + defer func() { + templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) + if templ_7745c5c3_Err == nil { + templ_7745c5c3_Err = templ_7745c5c3_BufErr + } + }() + } + ctx = templ.InitializeContext(ctx) + templ_7745c5c3_Var28 := templ.GetChildren(ctx) + if templ_7745c5c3_Var28 == nil { + templ_7745c5c3_Var28 = templ.NopComponent + } + ctx = templ.ClearChildren(ctx) + var templ_7745c5c3_Var29 = []any{class} + templ_7745c5c3_Err = templ.RenderCSSItems(ctx, templ_7745c5c3_Buffer, templ_7745c5c3_Var29...) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 19, " ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + return nil + }) +} + +var _ = templruntime.GeneratedTemplate diff --git a/internal/ui/layout.templ b/internal/ui/layout.templ index 91c214f..08f9473 100644 --- a/internal/ui/layout.templ +++ b/internal/ui/layout.templ @@ -1,28 +1,23 @@ package ui -import "github.com/fserg/md-to-html/internal/version" - templ Layout(title string) { - - - { title } + + + { title } · md-to-html - + + + + - -
-
-
- { children... } -
-
-
- Markdown → HTML · v{ version.Version } -
-
+ + { children... } } diff --git a/internal/ui/layout_templ.go b/internal/ui/layout_templ.go index f5104f2..13673c0 100644 --- a/internal/ui/layout_templ.go +++ b/internal/ui/layout_templ.go @@ -8,8 +8,6 @@ package ui import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import "github.com/fserg/md-to-html/internal/version" - func Layout(title string) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context @@ -31,20 +29,20 @@ func Layout(title string) templ.Component { templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "<!doctype html><html lang=\"ru\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } var templ_7745c5c3_Var2 string templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/layout.templ`, Line: 11, Col: 17} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/layout.templ`, Line: 9, Col: 17} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, " · md-to-html") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -52,20 +50,7 @@ func Layout(title string) templ.Component { if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
Markdown → HTML · v") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var3 string - templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(version.Version) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/layout.templ`, Line: 23, Col: 44} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } diff --git a/internal/ui/result.templ b/internal/ui/result.templ index 20c0e41..0a24f7a 100644 --- a/internal/ui/result.templ +++ b/internal/ui/result.templ @@ -1,56 +1,71 @@ package ui -import ( - "github.com/fserg/md-to-html/internal/ui/components/button" - "github.com/fserg/md-to-html/internal/ui/components/card" -) +import "fmt" -templ Result(previewID, downloadID string, fullHTML string, filename string) { - @card.Card(card.Props{Class: "section-card border-primary/20 bg-background/90"}) { - @card.Content(card.ContentProps{Class: "space-y-4"}) { -
- @button.Button(button.Props{ - Href: "/preview/" + previewID, - Target: "_blank", - Class: "rounded-2xl bg-primary px-4 py-2.5 text-sm font-semibold text-primary-foreground hover:bg-primary/90", - Variant: button.VariantDefault, - }) { - Открыть превью - } - @button.Button(button.Props{ - Href: "/download/" + downloadID, - Class: "rounded-2xl border border-border bg-card px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-muted/60", - Variant: button.VariantOutline, - }) { - Скачать HTML - } - Файл: { filename } -
-

- Ссылки одноразовые: после первого успешного открытия соответствующий UUID удаляется из preview-store. -

-
- - - i - Inline-превью в изолированном iframe - - -
- +templ Result(previewID, downloadID, fullHTML, filename string, sizeBytes int, lineCount int, elapsedMs int) { +
+
+
+
+ @CheckIcon("size-4")
-
- } - } +
+
Готово — { filename }
+
+ { formatResultMeta(sizeBytes, lineCount, elapsedMs) } +
+
+ + standalone + + + + Открыть превью + +
+ + @DownloadIcon("size-4") + Скачать HTML + + + + @ExternalLinkIcon("size-4") + Открыть в новой вкладке + +
+ + } templ Error(msg string) { -
- { msg } +
+
+ { msg } +
} + +func formatResultMeta(sizeBytes int, lineCount int, elapsedMs int) string { + kilobytes := float64(sizeBytes) / 1024 + seconds := float64(elapsedMs) / 1000 + if seconds < 0.1 { + seconds = 0.1 + } + return fmt.Sprintf("%.1f KB · %d строки · сгенерирован %.1f сек назад", kilobytes, lineCount, seconds) +} diff --git a/internal/ui/result_templ.go b/internal/ui/result_templ.go index d2d6458..a28888a 100644 --- a/internal/ui/result_templ.go +++ b/internal/ui/result_templ.go @@ -8,12 +8,9 @@ package ui import "github.com/a-h/templ" import templruntime "github.com/a-h/templ/runtime" -import ( - "github.com/fserg/md-to-html/internal/ui/components/button" - "github.com/fserg/md-to-html/internal/ui/components/card" -) +import "fmt" -func Result(previewID, downloadID string, fullHTML string, filename string) templ.Component { +func Result(previewID, downloadID, fullHTML, filename string, sizeBytes int, lineCount int, elapsedMs int) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil { @@ -34,126 +31,156 @@ func Result(previewID, downloadID string, fullHTML string, filename string) temp templ_7745c5c3_Var1 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Var2 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var3 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Var4 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "Открыть превью") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return nil - }) - templ_7745c5c3_Err = button.Button(button.Props{ - Href: "/preview/" + previewID, - Target: "_blank", - Class: "rounded-2xl bg-primary px-4 py-2.5 text-sm font-semibold text-primary-foreground hover:bg-primary/90", - Variant: button.VariantDefault, - }).Render(templ.WithChildren(ctx, templ_7745c5c3_Var4), templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Var5 := templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { - templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context - templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W) - if !templ_7745c5c3_IsBuffer { - defer func() { - templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer) - if templ_7745c5c3_Err == nil { - templ_7745c5c3_Err = templ_7745c5c3_BufErr - } - }() - } - ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "Скачать HTML") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return nil - }) - templ_7745c5c3_Err = button.Button(button.Props{ - Href: "/download/" + downloadID, - Class: "rounded-2xl border border-border bg-card px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-muted/60", - Variant: button.VariantOutline, - }).Render(templ.WithChildren(ctx, templ_7745c5c3_Var5), templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "Файл: ") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - var templ_7745c5c3_Var6 string - templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs(filename) - if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/result.templ`, Line: 27, Col: 110} - } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6)) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 5, "

Ссылки одноразовые: после первого успешного открытия соответствующий UUID удаляется из preview-store.

i Inline-превью в изолированном iframe
") - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return nil - }) - templ_7745c5c3_Err = card.Content(card.ContentProps{Class: "space-y-4"}).Render(templ.WithChildren(ctx, templ_7745c5c3_Var3), templ_7745c5c3_Buffer) - if templ_7745c5c3_Err != nil { - return templ_7745c5c3_Err - } - return nil - }) - templ_7745c5c3_Err = card.Card(card.Props{Class: "section-card border-primary/20 bg-background/90"}).Render(templ.WithChildren(ctx, templ_7745c5c3_Var2), templ_7745c5c3_Buffer) + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = CheckIcon("size-4").Render(ctx, templ_7745c5c3_Buffer) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 2, "
Готово — ") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var2 string + templ_7745c5c3_Var2, templ_7745c5c3_Err = templ.JoinStringErrs(filename) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/result.templ`, Line: 13, Col: 90} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var2)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 3, "
") + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + var templ_7745c5c3_Var3 string + templ_7745c5c3_Var3, templ_7745c5c3_Err = templ.JoinStringErrs(formatResultMeta(sizeBytes, lineCount, elapsedMs)) + if templ_7745c5c3_Err != nil { + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/result.templ`, Line: 15, Col: 57} + } + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var3)) + if templ_7745c5c3_Err != nil { + return templ_7745c5c3_Err + } + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 4, "
standalone
Открыть превью
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -177,25 +204,25 @@ func Error(msg string) templ.Component { }() } ctx = templ.InitializeContext(ctx) - templ_7745c5c3_Var8 := templ.GetChildren(ctx) - if templ_7745c5c3_Var8 == nil { - templ_7745c5c3_Var8 = templ.NopComponent + templ_7745c5c3_Var11 := templ.GetChildren(ctx) + if templ_7745c5c3_Var11 == nil { + templ_7745c5c3_Var11 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 7, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - var templ_7745c5c3_Var9 string - templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(msg) + var templ_7745c5c3_Var12 string + templ_7745c5c3_Var12, templ_7745c5c3_Err = templ.JoinStringErrs(msg) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/result.templ`, Line: 54, Col: 7} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `internal/ui/result.templ`, Line: 59, Col: 8} } - _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) + _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var12)) if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 8, "
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 16, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -203,4 +230,13 @@ func Error(msg string) templ.Component { }) } +func formatResultMeta(sizeBytes int, lineCount int, elapsedMs int) string { + kilobytes := float64(sizeBytes) / 1024 + seconds := float64(elapsedMs) / 1000 + if seconds < 0.1 { + seconds = 0.1 + } + return fmt.Sprintf("%.1f KB · %d строки · сгенерирован %.1f сек назад", kilobytes, lineCount, seconds) +} + var _ = templruntime.GeneratedTemplate diff --git a/screen.png b/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e192f29dc7fe476686437fe904144f8500913a GIT binary patch literal 96525 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�MtDhBR*+x!m8q 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

sC-gc6Q$|BGg;;1&X>Lia} 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 literal 0 HcmV?d00001 diff --git a/scripts/release-build.sh b/scripts/release-build.sh new file mode 100755 index 0000000..996b4d4 --- /dev/null +++ b/scripts/release-build.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash + +set -euo pipefail + +usage() { + cat <<'EOF' +Usage: + ./scripts/release-build.sh + ./scripts/release-build.sh --all + +Options: + --all Build all release targets used in CI: + linux/amd64, linux/arm64, darwin/arm64 +EOF +} + +mode="current" +if [[ $# -gt 1 ]]; then + usage + exit 2 +fi +if [[ $# -eq 1 ]]; then + case "$1" in + --all) + mode="all" + ;; + -h|--help) + usage + exit 0 + ;; + *) + usage + exit 2 + ;; + esac +fi + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_root="$(cd "${script_dir}/.." && pwd)" + +cd "${repo_root}" + +version="$(tr -d '[:space:]' < VERSION)" +if [[ -z "${version}" ]]; then + echo "VERSION is empty" >&2 + exit 1 +fi + +ldflags="-s -w -X github.com/fserg/md-to-html/internal/version.Version=${version}" +dist_dir="${repo_root}/dist" +mkdir -p "${dist_dir}" "${repo_root}/web/static/dist" + +echo "==> Generating templ code" +go run github.com/a-h/templ/cmd/templ@v0.3.1001 generate ./... + +echo "==> Building Tailwind bundle" +npx tailwindcss -c tailwind.config.js -i web/static/src/app.css -o web/static/dist/app.css --minify + +echo "==> Running tests" +go test ./... + +targets=() +if [[ "${mode}" == "all" ]]; then + targets+=("linux amd64") + targets+=("linux arm64") + targets+=("darwin arm64") +else + current_goos="$(go env GOOS)" + current_goarch="$(go env GOARCH)" + targets+=("${current_goos} ${current_goarch}") +fi + +artifacts=() +for target in "${targets[@]}"; do + read -r goos goarch <<<"${target}" + output="${dist_dir}/md-to-html-${goos}-${goarch}" + echo "==> Building ${goos}/${goarch}" + CGO_ENABLED=0 GOOS="${goos}" GOARCH="${goarch}" \ + go build -trimpath -ldflags="${ldflags}" -o "${output}" ./cmd/md-to-html + artifacts+=("${output}") +done + +checksum_file="${dist_dir}/SHA256SUMS" +( + cd "${dist_dir}" + shasum -a 256 "${artifacts[@]##${dist_dir}/}" > "${checksum_file}" +) + +echo +echo "Artifacts:" +for artifact in "${artifacts[@]}"; do + echo " ${artifact}" +done +echo " ${checksum_file}" + +if [[ "${mode}" == "current" ]]; then + echo + echo "Run to verify:" + echo " ${artifacts[0]} serve" +fi diff --git a/tailwind.config.js b/tailwind.config.js index dc17457..3054f1a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -7,29 +7,29 @@ module.exports = { theme: { extend: { colors: { - background: "#f5efe2", - foreground: "#221f1a", - card: "#fffdf8", - "card-foreground": "#221f1a", - primary: "#b85c38", - "primary-foreground": "#fffaf4", - secondary: "#ead7b0", - "secondary-foreground": "#3f3528", - muted: "#efe4d2", - "muted-foreground": "#6c6254", - accent: "#d0b38a", - "accent-foreground": "#2e2417", - border: "#d8c6ab", - ring: "#b85c38", - input: "#fffaf4", - destructive: "#b42318", + background: "#ffffff", + foreground: "#0a0a0a", + card: "#ffffff", + "card-foreground": "#0a0a0a", + primary: "#171717", + "primary-foreground": "#fafafa", + secondary: "#f5f5f5", + "secondary-foreground": "#171717", + muted: "#f5f5f5", + "muted-foreground": "#737373", + accent: "#f5f5f5", + "accent-foreground": "#171717", + border: "#e5e5e5", + ring: "#0a0a0a", + input: "#e5e5e5", + destructive: "#dc2626", }, boxShadow: { - xs: "0 1px 2px rgba(34, 31, 26, 0.08)", + xs: "0 1px 2px 0 rgb(0 0 0 / 0.04)", }, fontFamily: { - sans: ["IBM Plex Sans", "Avenir Next", "Segoe UI", "sans-serif"], - mono: ["IBM Plex Mono", "SFMono-Regular", "monospace"], + sans: ["Geist", "ui-sans-serif", "system-ui", "sans-serif"], + mono: ["Geist Mono", "ui-monospace", "Menlo", "monospace"], }, }, }, diff --git a/web/static/src/app.css b/web/static/src/app.css index 43f4f2a..f710b06 100644 --- a/web/static/src/app.css +++ b/web/static/src/app.css @@ -5,83 +5,55 @@ @layer base { :root { color-scheme: light; + --color-background: #ffffff; + --color-foreground: #0a0a0a; + --color-muted: #f5f5f5; + --color-muted-foreground: #737373; + --color-border: #e5e5e5; + --color-input: #e5e5e5; + --color-ring: #0a0a0a; + --color-primary: #171717; + --color-primary-foreground: #fafafa; + --color-secondary: #f5f5f5; + --color-secondary-foreground: #171717; + --color-accent: #f5f5f5; + --color-accent-foreground: #171717; + --color-card: #ffffff; + --color-card-foreground: #0a0a0a; + --color-destructive: #dc2626; } html { - background: - radial-gradient(circle at top left, rgba(234, 215, 176, 0.55), transparent 34rem), - radial-gradient(circle at top right, rgba(184, 92, 56, 0.14), transparent 24rem), - linear-gradient(180deg, #fbf7ef 0%, #f3eadb 100%); + @apply bg-[#fafafa]; } body { - @apply min-h-screen bg-transparent font-sans text-foreground antialiased; - } - - a { - @apply transition-colors; + @apply min-h-screen bg-transparent text-foreground antialiased; } ::selection { - background: rgba(184, 92, 56, 0.18); + background: rgba(23, 23, 23, 0.14); } } @layer components { - .app-shell { - @apply mx-auto max-w-6xl px-4 py-8 sm:px-6 lg:px-8; + .dropzone { + background-image: repeating-linear-gradient( + 45deg, + rgba(245, 245, 245, 0.9) 0 10px, + rgba(255, 255, 255, 0.9) 10px 20px + ); } - .hero-panel { - @apply relative overflow-hidden rounded-[2rem] border border-border/70 bg-card/95 shadow-xl shadow-stone-900/5 backdrop-blur; + .tabs-trigger { + @apply inline-flex h-9 items-center justify-center gap-2 rounded-md px-3 text-xs font-medium text-muted-foreground transition; } - .hero-panel::before { - content: ""; - @apply absolute inset-x-0 top-0 h-40 bg-gradient-to-r from-secondary/80 via-card to-transparent; + .tabs-trigger[data-state="active"] { + @apply bg-background text-foreground shadow-xs; } - .panel-grid { - @apply grid gap-6 lg:grid-cols-[minmax(0,1.1fr)_minmax(21rem,0.9fr)]; - } - - .eyebrow { - @apply inline-flex items-center gap-2 rounded-full border border-border/80 bg-background/90 px-3 py-1 text-xs font-semibold uppercase tracking-[0.24em] text-muted-foreground; - } - - .section-card { - @apply rounded-[1.5rem] border border-border/80 bg-card/90 shadow-lg shadow-stone-900/5; - } - - .field-label { - @apply text-sm font-semibold text-foreground; - } - - .field-hint { - @apply text-sm text-muted-foreground; - } - - .surface-input { - @apply block w-full rounded-2xl border border-border bg-background/95 px-4 py-3 text-sm text-foreground shadow-xs outline-none transition focus:border-primary focus:ring-2 focus:ring-primary/20; - } - - .surface-textarea { - @apply surface-input min-h-[18rem] resize-y font-mono leading-6; - } - - .source-tab { - @apply inline-flex flex-1 cursor-pointer items-center justify-center rounded-2xl px-4 py-3 text-sm font-semibold text-muted-foreground transition; - } - - .source-tab-active { - @apply bg-primary text-primary-foreground shadow-sm; - } - - .source-panel { - @apply rounded-[1.5rem] border border-dashed border-border/80 bg-background/70 p-4; - } - - .result-frame { - @apply mt-3 h-[36rem] w-full rounded-[1.25rem] border border-border bg-white shadow-inner; + .focus-ring { + @apply outline-none focus-visible:ring-2 focus-visible:ring-foreground focus-visible:ring-offset-2 focus-visible:ring-offset-background; } }