mirror of
https://github.com/h3pdesign/Neon-Vision-Editor
synced 2026-04-21 13:27:16 +00:00
chore(release): prepare v0.4.26 release docs
This commit is contained in:
parent
7f30aaa956
commit
ce975eb07f
4 changed files with 117 additions and 76 deletions
11
CHANGELOG.md
11
CHANGELOG.md
|
|
@ -4,6 +4,17 @@ All notable changes to **Neon Vision Editor** are documented in this file.
|
|||
|
||||
The format follows *Keep a Changelog*. Versions use semantic versioning with prerelease tags.
|
||||
|
||||
## [v0.4.26] - 2026-02-18
|
||||
|
||||
### Added
|
||||
- TODO
|
||||
|
||||
### Improved
|
||||
- TODO
|
||||
|
||||
### Fixed
|
||||
- TODO
|
||||
|
||||
## [v0.4.25] - 2026-02-18
|
||||
|
||||
### Added
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@
|
|||
CODE_SIGNING_ALLOWED = YES;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 265;
|
||||
CURRENT_PROJECT_VERSION = 266;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = CS727NF72U;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
|
|
@ -439,7 +439,7 @@
|
|||
CODE_SIGNING_ALLOWED = YES;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 265;
|
||||
CURRENT_PROJECT_VERSION = 266;
|
||||
DEAD_CODE_STRIPPING = YES;
|
||||
DEVELOPMENT_TEAM = CS727NF72U;
|
||||
ENABLE_APP_SANDBOX = YES;
|
||||
|
|
|
|||
|
|
@ -98,38 +98,53 @@ struct FindReplacePanel: View {
|
|||
var onReplace: () -> Void
|
||||
var onReplaceAll: () -> Void
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.accessibilityReduceTransparency) private var reduceTransparency
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
@AppStorage("EnableTranslucentWindow") private var translucentWindow: Bool = false
|
||||
@AppStorage("SettingsLiquidGlassEnabled") private var liquidGlassEnabled: Bool = true
|
||||
@FocusState private var findFieldFocused: Bool
|
||||
|
||||
private var shouldUsePanelGlass: Bool {
|
||||
translucentWindow && liquidGlassEnabled && !reduceTransparency
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("Find & Replace").font(.headline)
|
||||
LabeledContent("Find") {
|
||||
TextField("Search text", text: $findQuery)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.focused($findFieldFocused)
|
||||
.onSubmit { onFindNext() }
|
||||
}
|
||||
LabeledContent("Replace") {
|
||||
TextField("Replacement", text: $replaceQuery)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
}
|
||||
Toggle("Use Regex", isOn: $useRegex)
|
||||
Toggle("Case Sensitive", isOn: $caseSensitive)
|
||||
if !statusMessage.isEmpty {
|
||||
Text(statusMessage)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
HStack {
|
||||
Button("Find Next") { onFindNext() }
|
||||
Button("Replace") { onReplace() }.disabled(findQuery.isEmpty)
|
||||
Button("Replace All") { onReplaceAll() }.disabled(findQuery.isEmpty)
|
||||
Spacer()
|
||||
Button("Close") { dismiss() }
|
||||
GlassSurface(
|
||||
enabled: shouldUsePanelGlass,
|
||||
material: colorScheme == .dark ? .regularMaterial : .ultraThinMaterial,
|
||||
fallbackColor: Color.secondary.opacity(0.12),
|
||||
shape: .rounded(14)
|
||||
) {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("Find & Replace").font(.headline)
|
||||
LabeledContent("Find") {
|
||||
TextField("Search text", text: $findQuery)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
.focused($findFieldFocused)
|
||||
.onSubmit { onFindNext() }
|
||||
}
|
||||
LabeledContent("Replace") {
|
||||
TextField("Replacement", text: $replaceQuery)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
}
|
||||
Toggle("Use Regex", isOn: $useRegex)
|
||||
Toggle("Case Sensitive", isOn: $caseSensitive)
|
||||
if !statusMessage.isEmpty {
|
||||
Text(statusMessage)
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
HStack {
|
||||
Button("Find Next") { onFindNext() }
|
||||
Button("Replace") { onReplace() }.disabled(findQuery.isEmpty)
|
||||
Button("Replace All") { onReplaceAll() }.disabled(findQuery.isEmpty)
|
||||
Spacer()
|
||||
Button("Close") { dismiss() }
|
||||
}
|
||||
}
|
||||
.padding(16)
|
||||
.frame(minWidth: 380)
|
||||
}
|
||||
.padding(16)
|
||||
.frame(minWidth: 380)
|
||||
.onAppear {
|
||||
findFieldFocused = true
|
||||
}
|
||||
|
|
@ -147,42 +162,57 @@ struct QuickFileSwitcherPanel: View {
|
|||
let items: [Item]
|
||||
let onSelect: (Item) -> Void
|
||||
@Environment(\.dismiss) private var dismiss
|
||||
@Environment(\.accessibilityReduceTransparency) private var reduceTransparency
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
@AppStorage("EnableTranslucentWindow") private var translucentWindow: Bool = false
|
||||
@AppStorage("SettingsLiquidGlassEnabled") private var liquidGlassEnabled: Bool = true
|
||||
|
||||
private var shouldUsePanelGlass: Bool {
|
||||
translucentWindow && liquidGlassEnabled && !reduceTransparency
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("Quick Open")
|
||||
.font(.headline)
|
||||
TextField("Search files and tabs", text: $query)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
GlassSurface(
|
||||
enabled: shouldUsePanelGlass,
|
||||
material: colorScheme == .dark ? .regularMaterial : .ultraThinMaterial,
|
||||
fallbackColor: Color.secondary.opacity(0.12),
|
||||
shape: .rounded(14)
|
||||
) {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text("Quick Open")
|
||||
.font(.headline)
|
||||
TextField("Search files and tabs", text: $query)
|
||||
.textFieldStyle(.roundedBorder)
|
||||
|
||||
List(items) { item in
|
||||
Button {
|
||||
onSelect(item)
|
||||
dismiss()
|
||||
} label: {
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text(item.title)
|
||||
.lineLimit(1)
|
||||
Text(item.subtitle)
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
.lineLimit(1)
|
||||
List(items) { item in
|
||||
Button {
|
||||
onSelect(item)
|
||||
dismiss()
|
||||
} label: {
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text(item.title)
|
||||
.lineLimit(1)
|
||||
Text(item.subtitle)
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
.lineLimit(1)
|
||||
}
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
}
|
||||
.listStyle(.plain)
|
||||
.listStyle(.plain)
|
||||
|
||||
HStack {
|
||||
Text("\(items.count) results")
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
Spacer()
|
||||
Button("Close") { dismiss() }
|
||||
HStack {
|
||||
Text("\(items.count) results")
|
||||
.font(.caption)
|
||||
.foregroundStyle(.secondary)
|
||||
Spacer()
|
||||
Button("Close") { dismiss() }
|
||||
}
|
||||
}
|
||||
.padding(16)
|
||||
.frame(minWidth: 520, minHeight: 380)
|
||||
}
|
||||
.padding(16)
|
||||
.frame(minWidth: 520, minHeight: 380)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -221,12 +251,11 @@ struct WelcomeTourView: View {
|
|||
private let pages: [TourPage] = [
|
||||
TourPage(
|
||||
title: "What’s New in This Release",
|
||||
subtitle: "Major changes since v0.4.24:",
|
||||
subtitle: "Major changes since v0.4.25:",
|
||||
bullets: [
|
||||
"Added completion/signpost instrumentation (`os_signpost`) for inline completion, syntax highlighting, and file save paths to support performance profiling.",
|
||||
"Improved inline code completion responsiveness with trigger-aware scheduling, adaptive debounce, and short-lived context caching.",
|
||||
"Improved editor rendering performance with coalesced highlight refreshes and reduced heavy-feature work on very large documents.",
|
||||
"Fixed redundant save writes by skipping unchanged file content saves via content fingerprinting."
|
||||
"TODO",
|
||||
"TODO",
|
||||
"TODO"
|
||||
],
|
||||
iconName: "sparkles.rectangle.stack",
|
||||
colors: [Color(red: 0.40, green: 0.28, blue: 0.90), Color(red: 0.96, green: 0.46, blue: 0.55)],
|
||||
|
|
@ -294,7 +323,8 @@ struct WelcomeTourView: View {
|
|||
subtitle: "Every button, plus the quickest way to reach it.",
|
||||
bullets: [
|
||||
"Shortcuts are shown where available",
|
||||
"iPad hardware-keyboard shortcuts are shown where supported; no shortcut? the toolbar is the fastest path"
|
||||
"iPad hardware-keyboard shortcuts are shown where supported; no shortcut? the toolbar is the fastest path",
|
||||
"iOS quick start: open files first, use the `...` menu for all secondary actions, and optionally enable the bottom action bar in Settings → Editor"
|
||||
],
|
||||
iconName: "slider.horizontal.3",
|
||||
colors: [Color(red: 0.36, green: 0.32, blue: 0.92), Color(red: 0.92, green: 0.49, blue: 0.64)],
|
||||
|
|
@ -311,7 +341,9 @@ struct WelcomeTourView: View {
|
|||
ToolbarItemInfo(title: "Toggle Sidebar", description: "Toggle Sidebar", shortcutMac: "Cmd+Opt+S", shortcutPad: "Cmd+Opt+S", iconName: "sidebar.left"),
|
||||
ToolbarItemInfo(title: "Project Sidebar", description: "Toggle Project Structure Sidebar", shortcutMac: "None", shortcutPad: "None", iconName: "sidebar.right"),
|
||||
ToolbarItemInfo(title: "Line Wrap", description: "Enable Wrap / Disable Wrap", shortcutMac: "Cmd+Opt+L", shortcutPad: "Cmd+Opt+L", iconName: "text.justify"),
|
||||
ToolbarItemInfo(title: "Clear Editor", description: "Clear Editor", shortcutMac: "None", shortcutPad: "None", iconName: "trash")
|
||||
ToolbarItemInfo(title: "Clear Editor", description: "Clear Editor", shortcutMac: "None", shortcutPad: "None", iconName: "trash"),
|
||||
ToolbarItemInfo(title: "More Actions", description: "Open the three-dot menu for secondary actions", shortcutMac: "None", shortcutPad: "None", iconName: "ellipsis.circle"),
|
||||
ToolbarItemInfo(title: "Bottom Action Bar", description: "Optional iOS quick actions row (Settings → Editor)", shortcutMac: "None", shortcutPad: "None", iconName: "rectangle.bottomthird.inset.filled")
|
||||
]
|
||||
)
|
||||
]
|
||||
|
|
|
|||
22
README.md
22
README.md
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
|
||||
> Status: **active release**
|
||||
> Latest release: **v0.4.25**
|
||||
> Latest release: **v0.4.26**
|
||||
> Platform target: **macOS 26 (Tahoe)** compatible with **macOS Sequoia**
|
||||
> Apple Silicon: tested / Intel: not tested
|
||||
|
||||
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
Prebuilt binaries are available on [GitHub Releases](https://github.com/h3pdesign/Neon-Vision-Editor/releases).
|
||||
|
||||
- Latest release: **v0.4.25**
|
||||
- Latest release: **v0.4.26**
|
||||
- Apple AppStore [On the AppStore](https://apps.apple.com/de/app/neon-vision-editor/id6758950965)
|
||||
- TestFlight beta: [Join here](https://testflight.apple.com/join/YWB2fGAP)
|
||||
- Architecture: Apple Silicon (Intel not tested)
|
||||
|
|
@ -128,6 +128,12 @@ If macOS blocks first launch:
|
|||
|
||||
## Changelog
|
||||
|
||||
### v0.4.26 (summary)
|
||||
|
||||
- TODO
|
||||
- TODO
|
||||
- TODO
|
||||
|
||||
### v0.4.25 (summary)
|
||||
|
||||
- Added completion/signpost instrumentation (`os_signpost`) for inline completion, syntax highlighting, and file save paths to support performance profiling.
|
||||
|
|
@ -143,14 +149,6 @@ If macOS blocks first launch:
|
|||
- Improved iOS top toolbar action order by placing Open File first for faster access.
|
||||
- Fixed iOS toolbar overflow behavior to keep a single working three-dot overflow menu and preserve hidden actions.
|
||||
|
||||
### v0.4.23 (summary)
|
||||
|
||||
- Added optional support-purchase content to Welcome Tour page 2, including live StoreKit price and direct purchase action.
|
||||
- Improved welcome-tour flow by moving Toolbar Map to the final page and updating toolbar shortcut hints for iPad hardware keyboards.
|
||||
- Improved Settings editor-layout readability by left-aligning Editor tab section headers, controls, and helper text into a consistent single-column layout.
|
||||
- Fixed Settings support UI to remove restore-purchase actions where restore flow is not supported in current settings workflow.
|
||||
- Fixed Refresh Price behavior to re-evaluate StoreKit availability before refreshing product metadata.
|
||||
|
||||
Full release history: [`CHANGELOG.md`](CHANGELOG.md)
|
||||
|
||||
## Known Limitations
|
||||
|
|
@ -170,12 +168,12 @@ Full release history: [`CHANGELOG.md`](CHANGELOG.md)
|
|||
|
||||
## Release Integrity
|
||||
|
||||
- Tag: `v0.4.25`
|
||||
- Tag: `v0.4.26`
|
||||
- Tagged commit: `1c31306`
|
||||
- Verify local tag target:
|
||||
|
||||
```bash
|
||||
git rev-parse --verify v0.4.25
|
||||
git rev-parse --verify v0.4.26
|
||||
```
|
||||
|
||||
- Verify downloaded artifact checksum locally:
|
||||
|
|
|
|||
Loading…
Reference in a new issue