Release v0.11.3

This commit is contained in:
Danila Poyarkov 2026-04-08 16:05:47 +03:00
parent 28272ebda0
commit a20d170956
18 changed files with 76 additions and 30 deletions

View file

@ -2,6 +2,8 @@
## Unreleased
## 0.11.3 — 2026-04-08
### Fixes
- Show actionable install errors in the chat panel when a required local AI CLI is missing

View file

@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "OpenPencil",
"version": "0.11.2",
"version": "0.11.3",
"identifier": "net.dannote.open-pencil",
"build": {
"beforeDevCommand": "bun run dev",

View file

@ -1,7 +1,7 @@
{
"name": "open-pencil-app",
"private": true,
"version": "0.11.2",
"version": "0.11.3",
"license": "MIT",
"type": "module",
"workspaces": [

View file

@ -1,6 +1,6 @@
{
"name": "@open-pencil/cli",
"version": "0.11.2",
"version": "0.11.3",
"license": "MIT",
"type": "module",
"bin": {

View file

@ -1,6 +1,6 @@
{
"name": "@open-pencil/core",
"version": "0.11.2",
"version": "0.11.3",
"license": "MIT",
"type": "module",
"sideEffects": false,

View file

@ -1,6 +1,6 @@
{
"name": "@open-pencil/mcp",
"version": "0.11.2",
"version": "0.11.3",
"license": "MIT",
"type": "module",
"main": "./dist/server.js",

View file

@ -1,6 +1,6 @@
{
"name": "@open-pencil/vue",
"version": "0.11.2",
"version": "0.11.3",
"license": "MIT",
"type": "module",
"exports": {

View file

@ -1,17 +1,12 @@
import { ref } from 'vue'
import { useEditor } from '@open-pencil/vue/context/editorContext'
import { useI18n } from '@open-pencil/vue/i18n'
import type { SceneNode, Stroke } from '@open-pencil/core'
type StrokeSides = 'ALL' | 'TOP' | 'BOTTOM' | 'LEFT' | 'RIGHT' | 'CUSTOM'
const ALIGN_OPTIONS: { value: Stroke['align']; label: string }[] = [
{ value: 'INSIDE', label: 'Inside' },
{ value: 'CENTER', label: 'Center' },
{ value: 'OUTSIDE', label: 'Outside' }
]
const SIDE_OPTIONS: { value: StrokeSides; label: string }[] = [
{ value: 'ALL', label: 'All' },
{ value: 'TOP', label: 'Top' },
@ -38,7 +33,13 @@ const DEFAULT_STROKE: Stroke = {
*/
export function useStrokeControls() {
const store = useEditor()
const { panels } = useI18n()
const sideMenuOpen = ref(false)
const alignOptions = [
{ value: 'INSIDE' as const, label: panels.value.strokeAlignInside },
{ value: 'CENTER' as const, label: panels.value.strokeAlignCenter },
{ value: 'OUTSIDE' as const, label: panels.value.strokeAlignOutside }
]
function updateAlign(align: Stroke['align'], activeNode: SceneNode) {
const strokes = activeNode.strokes.map((s) => ({ ...s, align }))
@ -134,7 +135,7 @@ export function useStrokeControls() {
}
return {
alignOptions: ALIGN_OPTIONS,
alignOptions,
sideOptions: SIDE_OPTIONS,
borderSides: BORDER_SIDES,
sideMenuOpen,

View file

@ -135,6 +135,12 @@ export const panelMessages = i18n('panels', {
mixedStrokesHelp: 'Click + to replace mixed strokes',
mixedEffectsHelp: 'Click + to replace mixed effects',
strokeSides: 'Stroke sides',
strokeAlignInside: 'Inside',
strokeAlignCenter: 'Center',
strokeAlignOutside: 'Outside',
exportPreview: 'Preview',
exportRenderingPreview: 'Rendering preview…',
createVariable: 'Create variable',
mixed: 'Mixed',
layersCount: params('{count} layers'),
goToMainComponent: 'Go to Main Component',

View file

@ -154,7 +154,13 @@
"sizingHugShort": "Inhalt",
"sizingFillShort": "Füllen",
"sizingFillFr": "Füllen (fr)",
"sizingFixedPx": "Fest (px)"
"sizingFixedPx": "Fest (px)",
"strokeAlignInside": "Innen",
"strokeAlignCenter": "Mitte",
"strokeAlignOutside": "Außen",
"exportPreview": "Vorschau",
"exportRenderingPreview": "Vorschau wird gerendert…",
"createVariable": "Variable erstellen"
},
"pages": {
"newPage": "Neue Seite",

View file

@ -154,7 +154,13 @@
"sizingHugShort": "Ajust.",
"sizingFillShort": "Llenar",
"sizingFillFr": "Rellenar (fr)",
"sizingFixedPx": "Fijo (px)"
"sizingFixedPx": "Fijo (px)",
"strokeAlignInside": "Interior",
"strokeAlignCenter": "Centro",
"strokeAlignOutside": "Exterior",
"exportPreview": "Vista previa",
"exportRenderingPreview": "Renderizando vista previa…",
"createVariable": "Crear variable"
},
"pages": {
"newPage": "Nueva página",

View file

@ -154,7 +154,13 @@
"sizingHugShort": "Ajust.",
"sizingFillShort": "Remp.",
"sizingFillFr": "Remplir (fr)",
"sizingFixedPx": "Fixe (px)"
"sizingFixedPx": "Fixe (px)",
"strokeAlignInside": "Intérieur",
"strokeAlignCenter": "Centré",
"strokeAlignOutside": "Extérieur",
"exportPreview": "Aperçu",
"exportRenderingPreview": "Rendu de laperçu…",
"createVariable": "Créer une variable"
},
"pages": {
"newPage": "Nouvelle page",

View file

@ -154,7 +154,13 @@
"sizingHugShort": "Adatt.",
"sizingFillShort": "Riemp.",
"sizingFillFr": "Riempi (fr)",
"sizingFixedPx": "Fisso (px)"
"sizingFixedPx": "Fisso (px)",
"strokeAlignInside": "Interno",
"strokeAlignCenter": "Centro",
"strokeAlignOutside": "Esterno",
"exportPreview": "Anteprima",
"exportRenderingPreview": "Rendering anteprima…",
"createVariable": "Crea variabile"
},
"pages": {
"newPage": "Nuova pagina",

View file

@ -154,7 +154,13 @@
"sizingHugShort": "Dopas.",
"sizingFillShort": "Wypełn.",
"sizingFillFr": "Wypełnij (fr)",
"sizingFixedPx": "Stały (px)"
"sizingFixedPx": "Stały (px)",
"strokeAlignInside": "Wewnętrzny",
"strokeAlignCenter": "Wyśrodkowany",
"strokeAlignOutside": "Zewnętrzny",
"exportPreview": "Podgląd",
"exportRenderingPreview": "Renderowanie podglądu…",
"createVariable": "Utwórz zmienną"
},
"pages": {
"newPage": "Nowa strona",

View file

@ -154,7 +154,13 @@
"sizingHugShort": "Содерж.",
"sizingFillShort": "Запол.",
"sizingFillFr": "Заполнить (fr)",
"sizingFixedPx": "Фиксированный (px)"
"sizingFixedPx": "Фиксированный (px)",
"strokeAlignInside": "Внутри",
"strokeAlignCenter": "По центру",
"strokeAlignOutside": "Снаружи",
"exportPreview": "Предпросмотр",
"exportRenderingPreview": "Рендеринг предпросмотра…",
"createVariable": "Создать переменную"
},
"pages": {
"newPage": "Новая страница",

View file

@ -130,12 +130,8 @@
"image": "图片",
"stops": "色标",
"addStop": "添加色标",
"alignLeft": "左对齐",
"alignCenter": "居中",
"alignRight": "右对齐",
"alignTop": "顶部对齐",
"alignMiddle": "垂直居中",
"alignBottom": "底部对齐",
"clipContent": "裁剪内容",
"colorFormatRgb": "RGB",
"colorFormatHsl": "HSL",
@ -154,11 +150,16 @@
"rows": "行",
"sizingFixed": "固定",
"sizingHug": "适应内容",
"sizingFill": "填充",
"sizingHugShort": "适应",
"sizingFillShort": "填充",
"sizingFillFr": "填充 (fr)",
"sizingFixedPx": "固定 (px)"
"sizingFixedPx": "固定 (px)",
"strokeAlignInside": "内部",
"strokeAlignCenter": "居中",
"strokeAlignOutside": "外部",
"exportPreview": "预览",
"exportRenderingPreview": "正在渲染预览…",
"createVariable": "创建变量"
},
"pages": {
"newPage": "新建页面",

View file

@ -35,7 +35,7 @@ const variableTypeIcons: Record<string, Component> = {
BOOLEAN: IconToggleLeft
}
const { dialogs } = useI18n()
const { dialogs, panels } = useI18n()
const ctx = useVariablesEditor({
colorInput: ColorInput,
@ -203,7 +203,7 @@ const ctx = useVariablesEditor({
@click="ctx.addVariable"
>
<icon-lucide-plus class="size-3.5" />
Create variable
{{ panels.createVariable }}
</button>
</TabsContent>
</TabsRoot>

View file

@ -166,7 +166,7 @@ onScopeDispose(() => {
:disabled="exporting"
@click="doExport"
>
Export {{ activeName }}
{{ panels.export }} {{ activeName }}
</button>
<button
@ -177,7 +177,7 @@ onScopeDispose(() => {
>
<icon-lucide-chevron-down v-if="showPreview" class="size-3" />
<icon-lucide-chevron-right v-else class="size-3" />
Preview
{{ panels.exportPreview }}
</button>
<div v-if="showPreview && previewUrl" class="mt-1 overflow-hidden rounded border border-border">
@ -194,7 +194,7 @@ onScopeDispose(() => {
v-else-if="showPreview"
class="mt-1 rounded border border-border px-3 py-2 text-[11px] text-muted"
>
Rendering preview
{{ panels.exportRenderingPreview }}
</div>
</div>
</template>