diff --git a/CHANGELOG.md b/CHANGELOG.md index c5a5385bde4..87c84becdd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,45 @@ All notable changes to cmux are documented here. +## Ivrix [1.0.0] - 2026-07-28 + +Ivrix is a Hebrew-first fork of cmux. This release rebases the fork onto the +latest upstream cmux (1919 commits) and makes right-to-left text genuinely +usable in a terminal. + +### Added +- **Right-to-left rendering.** Hebrew rows are mirrored and right-anchored, per + UAX #9. The direction is resolved per row, so Latin rows are untouched. +- **RTL/LTR toggle** in the window titlebar, applied to live terminals without a + restart. +- **Bidi-aware cursor.** The cursor is placed by visual position, so it sits + beside the Hebrew it follows instead of at its logical column. +- **Mirrored glyphs (UAX #9 rule L4).** A mirrorable character on a + right-to-left row renders as its counterpart, so a prompt chevron points into + the text and brackets face the right way. All 428 pairs come from the Unicode + Character Database. +- **Direction-aware arrow keys.** On a mirrored row the horizontal arrows follow + the text, including word-wise (alt) and line-wise (cmd) movement, which are + keybindings rather than encoded keys. Pane-focus shortcuts are deliberately + left alone, since panes follow the physical screen. Latin rows behave exactly + as before. +- **Twelve Hebrew faces**, selectable from Settings > Terminal and applied + without a restart: Noto Sans Hebrew, Miriam Libre, Alef, Heebo, Assistant, IBM + Plex Sans Hebrew, Rubik, Varela Round, Frank Ruhl Libre, David Libre, Secular + One and Cousine. +- **Cmd+Z** undoes the last edit on the line being typed. + +### Notes +- A terminal gives every Hebrew letter one cell, and every Hebrew face measured + varies 18-25% in advance width across the alphabet, which reads as broken + spacing. Each bundled face is therefore normalised to a uniform 0.600em + advance by `scripts/make-hebrew-font.py`, so choosing one changes letterforms + only and never the grid. Combining marks keep their zero advance. +- Cmd+Z sends readline's undo, so it undoes an edit on the current line. It + cannot un-run a submitted command and does not affect terminal output. +- Cmd+Z is a ghostty keybind and is not yet remappable from Settings. + + ## [0.64.20] - 2026-07-19 ### Added diff --git a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/TerminalCatalogSection.swift b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/TerminalCatalogSection.swift index bc9b0ba3e37..ab72de774ab 100644 --- a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/TerminalCatalogSection.swift +++ b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/TerminalCatalogSection.swift @@ -37,6 +37,13 @@ public struct TerminalCatalogSection: SettingCatalogSection { userDefaultsKey: "terminal.showScrollBar" ) + /// Hebrew fallback face for the terminal. + public let hebrewFont = DefaultsKey( + id: HebrewFontFace.settingsPath, + defaultValue: HebrewFontFace.defaultFace, + userDefaultsKey: HebrewFontFace.settingsPath + ) + public let copyOnSelect = DefaultsKey( id: "terminal.copyOnSelect", defaultValue: false, diff --git a/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/HebrewFontFace.swift b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/HebrewFontFace.swift new file mode 100644 index 00000000000..e93013610d3 --- /dev/null +++ b/Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/HebrewFontFace.swift @@ -0,0 +1,63 @@ +import Foundation + +/// Hebrew fallback face used by the terminal (Ivrix). +/// +/// Every option is the same source family put through +/// `scripts/make-hebrew-font.py`: subset to Hebrew and normalised to a uniform +/// 0.600em advance matching the Latin cell. Switching therefore changes +/// letterforms only, never the terminal grid. +public enum HebrewFontFace: String, CaseIterable, Sendable, SettingCodable { + case noto + case miriam + case alef + case heebo + case assistant + case plex + case rubik + case varela + case frankRuhl + case david + case secular + case cousine + + public static let defaultFace: HebrewFontFace = .noto + + /// Settings path and `UserDefaults` key for the selected face. + public static let settingsPath = "terminal.hebrewFont" + + /// Bundled family name, as written into the font's name table. + public var familyName: String { + switch self { + case .noto: return "Ivrix He Noto" + case .miriam: return "Ivrix He Miriam" + case .alef: return "Ivrix He Alef" + case .heebo: return "Ivrix He Heebo" + case .assistant: return "Ivrix He Assistant" + case .plex: return "Ivrix He Plex" + case .rubik: return "Ivrix He Rubik" + case .varela: return "Ivrix He Varela" + case .frankRuhl: return "Ivrix He FrankRuhl" + case .david: return "Ivrix He David" + case .secular: return "Ivrix He Secular" + case .cousine: return "Ivrix He Cousine" + } + } + + /// Upstream face name. Proper nouns, so these are not localized. + public var displayName: String { + switch self { + case .noto: return "Noto Sans Hebrew" + case .miriam: return "Miriam Libre" + case .alef: return "Alef" + case .heebo: return "Heebo" + case .assistant: return "Assistant" + case .plex: return "IBM Plex Sans Hebrew" + case .rubik: return "Rubik" + case .varela: return "Varela Round" + case .frankRuhl: return "Frank Ruhl Libre" + case .david: return "David Libre" + case .secular: return "Secular One" + case .cousine: return "Cousine" + } + } +} diff --git a/Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift b/Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift index 410497794eb..6065b914960 100644 --- a/Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift +++ b/Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift @@ -23,6 +23,7 @@ public struct TerminalSection: View { @State private var sessionContentAlignment: DefaultsValueModel @State private var scrollBar: DefaultsValueModel @State private var copyOnSelect: DefaultsValueModel + @State private var hebrewFont: DefaultsValueModel @State private var autoResume: DefaultsValueModel @State private var hibernation: DefaultsValueModel @State private var idleSeconds: DefaultsValueModel @@ -49,6 +50,7 @@ public struct TerminalSection: View { _sessionContentAlignment = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.sessionContentAlignment)) _scrollBar = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.showScrollBar)) _copyOnSelect = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.copyOnSelect)) + _hebrewFont = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.hebrewFont)) _autoResume = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.autoResumeAgentSessions)) _hibernation = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.agentHibernationEnabled)) _idleSeconds = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.agentHibernationIdleSeconds)) @@ -77,6 +79,7 @@ public struct TerminalSection: View { sessionContentAlignment, scrollBar, copyOnSelect, + hebrewFont, autoResume, hibernation, idleSeconds, @@ -310,6 +313,32 @@ public struct TerminalSection: View { .accessibilityIdentifier("SettingsSessionContentAlignmentPicker") } SettingsCardDivider() + SettingsCardRow( + configurationReview: .json(HebrewFontFace.settingsPath), + String(localized: "settings.terminal.hebrewFont", defaultValue: "Hebrew Font"), + subtitle: String( + localized: "settings.terminal.hebrewFont.subtitle", + defaultValue: "Face used for Hebrew text. Every option is normalised to the Latin cell width, so this changes letterforms only." + ), + controlWidth: 250 + ) { + Picker( + "", + selection: Binding( + get: { hebrewFont.current }, + set: { hebrewFont.set($0) } + ) + ) { + ForEach(HebrewFontFace.allCases, id: \.self) { face in + Text(face.displayName).tag(face) + } + } + .labelsHidden() + .pickerStyle(.menu) + .frame(width: 210) + .accessibilityIdentifier("SettingsHebrewFontPicker") + } + SettingsCardDivider() SettingsCardRow( configurationReview: .json("terminal.scrollSpeed"), String(localized: "settings.terminal.scrollSpeed", defaultValue: "Scroll Speed"), diff --git a/README.md b/README.md index ee93a7899fc..f1a5d785eea 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,79 @@ -

cmux

-

A Ghostty-based macOS terminal with vertical tabs and notifications for AI coding agents

+

Ivrix

+

A macOS terminal that actually gets Hebrew right.

+

Real right-to-left (RTL) and bidirectional (BiDi) text support, built on Ghostty.
+A fork of cmux.

+ +

מסוף (טרמינל) ל־macOS עם תמיכה אמיתית בעברית ובכתיבה מימין לשמאל

- - Download cmux for macOS + + Download Ivrix for macOS

- English | 日本語 | Tiếng Việt | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | ភាសាខ្មែរ | Українська + Latest release + macOS universal + Notarized by Apple

-

- X / Twitter - Discord - GitHub stars -

+## Why Ivrix + +Terminal emulators are built left-to-right. Hebrew and Arabic mostly "work" in the +sense that the characters appear, but the moment you actually edit a line the +illusion breaks: the cursor lands somewhere else, arrow keys move the wrong way, +and the prompt arrow points away from your text. + +Ivrix fixes that layer properly, following the Unicode bidirectional algorithm +([UAX #9](https://unicode.org/reports/tr9/)): + +- **Right-to-left rendering.** Hebrew lines are mirrored and right-anchored. The + direction is resolved **per line**, so English lines are untouched and mixed + Hebrew/English content behaves correctly in both. +- **RTL/LTR toggle** in the titlebar, applied to open terminals without a restart. +- **A cursor that follows the text.** Placed by visual position, so it sits beside + the Hebrew it belongs to instead of stranded at the left edge. +- **Mirrored glyphs (UAX #9 rule L4).** On a Hebrew line the prompt chevron points + into the text and brackets face the right way. All 428 mirror pairs come from the + Unicode Character Database. +- **Direction-aware arrow keys.** On a Hebrew line the arrows follow the text, + including word-wise (⌥) and line-wise (⌘) movement. On English lines they behave + exactly as always. +- **Twelve Hebrew fonts** built in, switchable live from *Settings → Terminal → + Hebrew Font*. + +### Hebrew fonts that fit the grid + +A terminal gives every Hebrew letter exactly one cell, and every Hebrew typeface we +measured varies **18–25%** in advance width across the alphabet. Dropping one in +as-is leaves ragged gaps between letters. Every bundled face is normalised to a +uniform cell width, so switching changes letterforms only and never the grid. +Nikud keep zero width and stack on the letter instead of taking a cell of their own. + +Included: Noto Sans Hebrew (default), Miriam Libre, Alef, Heebo, Assistant, IBM Plex +Sans Hebrew, Rubik, Varela Round, Frank Ruhl Libre, David Libre, Secular One and +Cousine. + +## Install + +[**Download the latest release**](https://github.com/DananzMolt/Ivrix/releases/latest), +open the DMG and drag Ivrix to Applications. + +Signed and notarized by Apple, so it opens without a Gatekeeper warning. Universal +binary — Apple Silicon and Intel. + +## Everything else, from cmux + +Ivrix is a fork of [cmux](https://github.com/manaflow-ai/cmux) and inherits all of +it: vertical tabs, notification rings for AI coding agents, splits, workspaces, the +browser pane and the CLI. The upstream feature tour follows below.

- cmux screenshot + English | 日本語 | Tiếng Việt | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | ភាសាខ្មែរ | Українська

- ▶ Demo video · The Zen of cmux + Ivrix screenshot

## Features @@ -93,7 +144,11 @@ Sidebar shows git branch, linked PR status/number, working directory, listening - **Keyboard shortcuts** — [Extensive shortcuts](https://cmux.com/docs/keyboard-shortcuts) for workspaces, splits, browser, and more - **Open source** — Free and GPL-licensed -## Install +## Installing upstream cmux + +The links in this section install **cmux**, not Ivrix. For Ivrix, use the +[Ivrix release](https://github.com/DananzMolt/Ivrix/releases/latest) linked at the +top of this page. ### DMG (recommended) @@ -445,3 +500,19 @@ for portions for which Manaflow controls the necessary rights. They do not relicense third-party material or outside contributions for which Manaflow lacks a separate grant. See [LICENSE](LICENSE) for the exact scope and contact [founders@manaflow.com](mailto:founders@manaflow.com) for details. + +--- + +## About + +**Ivrix** is a Hebrew terminal for macOS: a right-to-left (RTL) terminal emulator with +full bidirectional text (BiDi) support, Hebrew fonts, and a bidi-aware cursor and +keyboard navigation. It is a fork of [cmux](https://github.com/manaflow-ai/cmux), +which is built on [Ghostty](https://ghostty.org). + +If you searched for a Hebrew terminal, an RTL terminal for Mac, Hebrew support in +iTerm/Terminal.app/Ghostty, or תמיכה בעברית בטרמינל — this is what Ivrix is for. + +Upstream cmux is by [manaflow-ai](https://github.com/manaflow-ai/cmux); Ghostty is by +[Mitchell Hashimoto](https://ghostty.org). Bundled Hebrew fonts ship under the SIL +Open Font License with their original attribution. diff --git a/Resources/Fonts/IvrixHeAlef-Bold.ttf b/Resources/Fonts/IvrixHeAlef-Bold.ttf new file mode 100644 index 00000000000..e171ebeec28 Binary files /dev/null and b/Resources/Fonts/IvrixHeAlef-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeAlef-BoldItalic.ttf b/Resources/Fonts/IvrixHeAlef-BoldItalic.ttf new file mode 100644 index 00000000000..4548dc6a809 Binary files /dev/null and b/Resources/Fonts/IvrixHeAlef-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeAlef-Italic.ttf b/Resources/Fonts/IvrixHeAlef-Italic.ttf new file mode 100644 index 00000000000..1b7a1967664 Binary files /dev/null and b/Resources/Fonts/IvrixHeAlef-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeAlef-Regular.ttf b/Resources/Fonts/IvrixHeAlef-Regular.ttf new file mode 100644 index 00000000000..7caed4b962c Binary files /dev/null and b/Resources/Fonts/IvrixHeAlef-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeAssistant-Bold.ttf b/Resources/Fonts/IvrixHeAssistant-Bold.ttf new file mode 100644 index 00000000000..0c943ca8712 Binary files /dev/null and b/Resources/Fonts/IvrixHeAssistant-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeAssistant-BoldItalic.ttf b/Resources/Fonts/IvrixHeAssistant-BoldItalic.ttf new file mode 100644 index 00000000000..0badcc33339 Binary files /dev/null and b/Resources/Fonts/IvrixHeAssistant-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeAssistant-Italic.ttf b/Resources/Fonts/IvrixHeAssistant-Italic.ttf new file mode 100644 index 00000000000..abd736f760b Binary files /dev/null and b/Resources/Fonts/IvrixHeAssistant-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeAssistant-Regular.ttf b/Resources/Fonts/IvrixHeAssistant-Regular.ttf new file mode 100644 index 00000000000..d30efc7e323 Binary files /dev/null and b/Resources/Fonts/IvrixHeAssistant-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeCousine-Regular.ttf b/Resources/Fonts/IvrixHeCousine-Regular.ttf new file mode 100644 index 00000000000..53fc32fbd70 Binary files /dev/null and b/Resources/Fonts/IvrixHeCousine-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeDavid-Regular.ttf b/Resources/Fonts/IvrixHeDavid-Regular.ttf new file mode 100644 index 00000000000..e36d3f0ca8e Binary files /dev/null and b/Resources/Fonts/IvrixHeDavid-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeFrankRuhl-Bold.ttf b/Resources/Fonts/IvrixHeFrankRuhl-Bold.ttf new file mode 100644 index 00000000000..baaf8995e31 Binary files /dev/null and b/Resources/Fonts/IvrixHeFrankRuhl-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeFrankRuhl-BoldItalic.ttf b/Resources/Fonts/IvrixHeFrankRuhl-BoldItalic.ttf new file mode 100644 index 00000000000..4d2b2d7ce90 Binary files /dev/null and b/Resources/Fonts/IvrixHeFrankRuhl-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeFrankRuhl-Italic.ttf b/Resources/Fonts/IvrixHeFrankRuhl-Italic.ttf new file mode 100644 index 00000000000..011146ad8c1 Binary files /dev/null and b/Resources/Fonts/IvrixHeFrankRuhl-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeFrankRuhl-Regular.ttf b/Resources/Fonts/IvrixHeFrankRuhl-Regular.ttf new file mode 100644 index 00000000000..c0cc16a8eee Binary files /dev/null and b/Resources/Fonts/IvrixHeFrankRuhl-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeHeebo-Bold.ttf b/Resources/Fonts/IvrixHeHeebo-Bold.ttf new file mode 100644 index 00000000000..200082669a0 Binary files /dev/null and b/Resources/Fonts/IvrixHeHeebo-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeHeebo-BoldItalic.ttf b/Resources/Fonts/IvrixHeHeebo-BoldItalic.ttf new file mode 100644 index 00000000000..140aa825d79 Binary files /dev/null and b/Resources/Fonts/IvrixHeHeebo-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeHeebo-Italic.ttf b/Resources/Fonts/IvrixHeHeebo-Italic.ttf new file mode 100644 index 00000000000..7e5373f4711 Binary files /dev/null and b/Resources/Fonts/IvrixHeHeebo-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeHeebo-Regular.ttf b/Resources/Fonts/IvrixHeHeebo-Regular.ttf new file mode 100644 index 00000000000..8f59e5ef81e Binary files /dev/null and b/Resources/Fonts/IvrixHeHeebo-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeMiriam-Bold.ttf b/Resources/Fonts/IvrixHeMiriam-Bold.ttf new file mode 100644 index 00000000000..8dc66c1eb59 Binary files /dev/null and b/Resources/Fonts/IvrixHeMiriam-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeMiriam-BoldItalic.ttf b/Resources/Fonts/IvrixHeMiriam-BoldItalic.ttf new file mode 100644 index 00000000000..37beb75e7c1 Binary files /dev/null and b/Resources/Fonts/IvrixHeMiriam-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeMiriam-Italic.ttf b/Resources/Fonts/IvrixHeMiriam-Italic.ttf new file mode 100644 index 00000000000..cb7597b3a93 Binary files /dev/null and b/Resources/Fonts/IvrixHeMiriam-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeMiriam-Regular.ttf b/Resources/Fonts/IvrixHeMiriam-Regular.ttf new file mode 100644 index 00000000000..3d74cf85195 Binary files /dev/null and b/Resources/Fonts/IvrixHeMiriam-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeNoto-Bold.ttf b/Resources/Fonts/IvrixHeNoto-Bold.ttf new file mode 100644 index 00000000000..03e7c70ad80 Binary files /dev/null and b/Resources/Fonts/IvrixHeNoto-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeNoto-BoldItalic.ttf b/Resources/Fonts/IvrixHeNoto-BoldItalic.ttf new file mode 100644 index 00000000000..5a2fb4069fe Binary files /dev/null and b/Resources/Fonts/IvrixHeNoto-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeNoto-Italic.ttf b/Resources/Fonts/IvrixHeNoto-Italic.ttf new file mode 100644 index 00000000000..867f65d26a3 Binary files /dev/null and b/Resources/Fonts/IvrixHeNoto-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeNoto-Regular.ttf b/Resources/Fonts/IvrixHeNoto-Regular.ttf new file mode 100644 index 00000000000..2a9dbe860cc Binary files /dev/null and b/Resources/Fonts/IvrixHeNoto-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHePlex-Bold.ttf b/Resources/Fonts/IvrixHePlex-Bold.ttf new file mode 100644 index 00000000000..f1cb79443df Binary files /dev/null and b/Resources/Fonts/IvrixHePlex-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHePlex-BoldItalic.ttf b/Resources/Fonts/IvrixHePlex-BoldItalic.ttf new file mode 100644 index 00000000000..a5b0044af5b Binary files /dev/null and b/Resources/Fonts/IvrixHePlex-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHePlex-Italic.ttf b/Resources/Fonts/IvrixHePlex-Italic.ttf new file mode 100644 index 00000000000..14f851f886b Binary files /dev/null and b/Resources/Fonts/IvrixHePlex-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHePlex-Regular.ttf b/Resources/Fonts/IvrixHePlex-Regular.ttf new file mode 100644 index 00000000000..e4450a5dfce Binary files /dev/null and b/Resources/Fonts/IvrixHePlex-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeRubik-Bold.ttf b/Resources/Fonts/IvrixHeRubik-Bold.ttf new file mode 100644 index 00000000000..1787053a052 Binary files /dev/null and b/Resources/Fonts/IvrixHeRubik-Bold.ttf differ diff --git a/Resources/Fonts/IvrixHeRubik-BoldItalic.ttf b/Resources/Fonts/IvrixHeRubik-BoldItalic.ttf new file mode 100644 index 00000000000..b707321d7c7 Binary files /dev/null and b/Resources/Fonts/IvrixHeRubik-BoldItalic.ttf differ diff --git a/Resources/Fonts/IvrixHeRubik-Italic.ttf b/Resources/Fonts/IvrixHeRubik-Italic.ttf new file mode 100644 index 00000000000..5e7c9f7a9ac Binary files /dev/null and b/Resources/Fonts/IvrixHeRubik-Italic.ttf differ diff --git a/Resources/Fonts/IvrixHeRubik-Regular.ttf b/Resources/Fonts/IvrixHeRubik-Regular.ttf new file mode 100644 index 00000000000..1b61305b876 Binary files /dev/null and b/Resources/Fonts/IvrixHeRubik-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeSecular-Regular.ttf b/Resources/Fonts/IvrixHeSecular-Regular.ttf new file mode 100644 index 00000000000..5eb396428c9 Binary files /dev/null and b/Resources/Fonts/IvrixHeSecular-Regular.ttf differ diff --git a/Resources/Fonts/IvrixHeVarela-Regular.ttf b/Resources/Fonts/IvrixHeVarela-Regular.ttf new file mode 100644 index 00000000000..19223045736 Binary files /dev/null and b/Resources/Fonts/IvrixHeVarela-Regular.ttf differ diff --git a/Resources/Fonts/MiriamMonoCLM-Bold.ttf b/Resources/Fonts/MiriamMonoCLM-Bold.ttf deleted file mode 100644 index 6b75cb61064..00000000000 Binary files a/Resources/Fonts/MiriamMonoCLM-Bold.ttf and /dev/null differ diff --git a/Resources/Fonts/MiriamMonoCLM-BoldOblique.ttf b/Resources/Fonts/MiriamMonoCLM-BoldOblique.ttf deleted file mode 100644 index 3d28f4c655d..00000000000 Binary files a/Resources/Fonts/MiriamMonoCLM-BoldOblique.ttf and /dev/null differ diff --git a/Resources/Fonts/MiriamMonoCLM-Book.ttf b/Resources/Fonts/MiriamMonoCLM-Book.ttf deleted file mode 100644 index ccdff90d699..00000000000 Binary files a/Resources/Fonts/MiriamMonoCLM-Book.ttf and /dev/null differ diff --git a/Resources/Fonts/MiriamMonoCLM-BookOblique.ttf b/Resources/Fonts/MiriamMonoCLM-BookOblique.ttf deleted file mode 100644 index 135d632a785..00000000000 Binary files a/Resources/Fonts/MiriamMonoCLM-BookOblique.ttf and /dev/null differ diff --git a/Resources/Fonts/OFL-IvrixHeAlef.txt b/Resources/Fonts/OFL-IvrixHeAlef.txt new file mode 100644 index 00000000000..383b8aad061 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeAlef.txt @@ -0,0 +1,94 @@ +Copyright (c) 2012, HaGilda & Mushon Zer-Aviv (), +with Reserved Font Name Alef. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeAssistant.txt b/Resources/Fonts/OFL-IvrixHeAssistant.txt new file mode 100644 index 00000000000..c8f36f791b6 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeAssistant.txt @@ -0,0 +1,95 @@ +Copyright 2020 The Assistant Project Authors (https://github.com/hafontia/Assistant). +Copyright 2010 The Source Sans Pro Authors (https://github.com/adobe-fonts/source-sans-pro), with Reserved Font Name 'Source'. +Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeCousine.txt b/Resources/Fonts/OFL-IvrixHeCousine.txt new file mode 100644 index 00000000000..08e54ce12f9 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeCousine.txt @@ -0,0 +1,93 @@ +Copyright 2026 The Cousine Project Authors (https://github.com/googlefonts/cousine) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/Resources/Fonts/OFL-IvrixHeDavid.txt b/Resources/Fonts/OFL-IvrixHeDavid.txt new file mode 100644 index 00000000000..ce66729f65c --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeDavid.txt @@ -0,0 +1,93 @@ +Copyright 2016 The David Libre Project Authors (https://github.com/meirsadan/david-libre), with reserved font name "Hadash", "Gentium" and 'SIL'. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org/ + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/Resources/Fonts/OFL-IvrixHeFrankRuhl.txt b/Resources/Fonts/OFL-IvrixHeFrankRuhl.txt new file mode 100644 index 00000000000..ff7a2393c2b --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeFrankRuhl.txt @@ -0,0 +1,105 @@ +Copyright 2015 The Frank Ruhl Libre Project Authors (https://github.com/fontef/frankruhllibre) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. +© 2022 GitHub, Inc. +Terms +Privacy +Security +Status +Docs +Contact GitHub +Pricing +API +Training +Blog +About diff --git a/Resources/Fonts/OFL-IvrixHeHeebo.txt b/Resources/Fonts/OFL-IvrixHeHeebo.txt new file mode 100644 index 00000000000..42305439730 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeHeebo.txt @@ -0,0 +1,93 @@ +Copyright 2014 The Heebo Project Authors (https://github.com/OdedEzer/heebo) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeMiriam.txt b/Resources/Fonts/OFL-IvrixHeMiriam.txt new file mode 100644 index 00000000000..2f460fc0b71 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeMiriam.txt @@ -0,0 +1,93 @@ +Copyright 2023 The Miriam Libre Project Authors (https://github.com/simoncozens/Miriam-Libre/) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeNoto.txt b/Resources/Fonts/OFL-IvrixHeNoto.txt new file mode 100644 index 00000000000..56662b62437 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeNoto.txt @@ -0,0 +1,93 @@ +Copyright 2022 The Noto Project Authors (https://github.com/notofonts/hebrew) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHePlex.txt b/Resources/Fonts/OFL-IvrixHePlex.txt new file mode 100644 index 00000000000..01497cc60dc --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHePlex.txt @@ -0,0 +1,93 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeRubik.txt b/Resources/Fonts/OFL-IvrixHeRubik.txt new file mode 100644 index 00000000000..03af63b5339 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeRubik.txt @@ -0,0 +1,93 @@ +Copyright 2015 The Rubik Project Authors (https://github.com/googlefonts/rubik) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeSecular.txt b/Resources/Fonts/OFL-IvrixHeSecular.txt new file mode 100644 index 00000000000..f9d68ef4b78 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeSecular.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Secular One Project Authors (https://github.com/googlefonts/secular) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/Resources/Fonts/OFL-IvrixHeVarela.txt b/Resources/Fonts/OFL-IvrixHeVarela.txt new file mode 100644 index 00000000000..300cd6a8ac5 --- /dev/null +++ b/Resources/Fonts/OFL-IvrixHeVarela.txt @@ -0,0 +1,93 @@ +Copyright 2023 The Varela Round Project Authors (https://github.com/alefalefalef/Varela-Round-Hebrew/), with Reserved Font Names 'Varela' and ‘Varela Round’. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/Resources/Localizable.xcstrings b/Resources/Localizable.xcstrings index 2f501af53c9..aeadfdb41dc 100644 --- a/Resources/Localizable.xcstrings +++ b/Resources/Localizable.xcstrings @@ -186639,6 +186639,38 @@ } } }, + "settings.terminal.hebrewFont": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Hebrew Font" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ヘブライ語フォント" + } + } + } + }, + "settings.terminal.hebrewFont.subtitle": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Face used for Hebrew text. Every option is normalised to the Latin cell width, so this changes letterforms only." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ヘブライ語テキストに使用する書体。すべての選択肢はラテン文字のセル幅に合わせて正規化されているため、字形のみが変わります。" + } + } + } + }, "settings.terminal.memoryGuardrail": { "extractionState": "manual", "localizations": { diff --git a/Sources/App/WorkspaceRuntimeSettings.swift b/Sources/App/WorkspaceRuntimeSettings.swift index fec27d9e7c3..0fe60256bc4 100644 --- a/Sources/App/WorkspaceRuntimeSettings.swift +++ b/Sources/App/WorkspaceRuntimeSettings.swift @@ -1,3 +1,4 @@ +import CmuxSettings import Darwin import Foundation enum WorkspaceTitlebarSettings { @@ -244,6 +245,45 @@ enum TerminalTextDirectionSettings { } } +/// Hebrew fallback face (Ivrix). The face list lives in CmuxSettings so the +/// settings window and the terminal agree on one definition; this wrapper adds +/// the ghostty config line and the change notification that makes live +/// surfaces reload. +enum TerminalHebrewFontSettings { + typealias Face = HebrewFontFace + + static let fontKey = HebrewFontFace.settingsPath + static let didChangeNotification = Notification.Name("cmux.terminalHebrewFontSettingsDidChange") + + static let defaultFace: Face = .defaultFace + + static func face(defaults: UserDefaults = .standard) -> Face { + Face(rawValue: defaults.string(forKey: fontKey) ?? "") ?? defaultFace + } + + /// Ghostty config line naming the Hebrew fallback. Always emitted so a + /// reload switches a surface that was previously on another face. + static func ghosttyConfigContents(defaults: UserDefaults = .standard) -> String { + "font-family = \(face(defaults: defaults).familyName)" + } + + static func setFace( + _ face: Face, + defaults: UserDefaults = .standard, + notificationCenter: NotificationCenter = .default + ) { + let old = self.face(defaults: defaults) + defaults.set(face.rawValue, forKey: fontKey) + if old != face { + notifyDidChange(notificationCenter: notificationCenter) + } + } + + static func notifyDidChange(notificationCenter: NotificationCenter = .default) { + notificationCenter.post(name: didChangeNotification, object: nil) + } +} + enum TerminalManagedGhosttySettings { static func ghosttyConfigContents(defaults: UserDefaults = .standard, emitsCopyOnSelectFalse: Bool = true) -> String? { let lines = [ diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index e38fe3d2ba1..1a1650fcc47 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -651,6 +651,9 @@ class GhosttyApp { startUptime: ProcessInfo.processInfo.systemUptime ) private var appObservers: [NSObjectProtocol] = [] + /// Hebrew face this surface last configured, so a defaults change that + /// leaves it alone does not trigger a needless font-grid rebuild. + private var appliedHebrewFont: TerminalHebrewFontSettings.Face = TerminalHebrewFontSettings.defaultFace private var bellAudioSound: NSSound? private var backgroundEventCounter: UInt64 = 0 private var defaultBackgroundUpdateScope: GhosttyDefaultBackgroundUpdateScope = .unscoped @@ -1087,6 +1090,32 @@ class GhosttyApp { self?.reloadConfiguration(source: "settings.terminal.textDirection") }) + appObservers.append(NotificationCenter.default.addObserver( + forName: TerminalHebrewFontSettings.didChangeNotification, + object: nil, + queue: .main + ) { [weak self] _ in + self?.reloadConfiguration(source: "settings.terminal.hebrewFont") + }) + + // The settings window writes UserDefaults through its own store rather + // than the managed-defaults path that posts the notification above, so + // watch the defaults directly too. didChangeNotification fires for any + // key, hence the comparison against the face already applied - without + // it every unrelated settings write would rebuild the font grid. + appliedHebrewFont = TerminalHebrewFontSettings.face() + appObservers.append(NotificationCenter.default.addObserver( + forName: UserDefaults.didChangeNotification, + object: nil, + queue: .main + ) { [weak self] _ in + guard let self else { return } + let face = TerminalHebrewFontSettings.face() + guard face != self.appliedHebrewFont else { return } + self.appliedHebrewFont = face + self.reloadConfiguration(source: "settings.terminal.hebrewFont") + }) + #endif } @@ -1232,14 +1261,36 @@ class GhosttyApp { loadRealUserGhosttyConfig(config, preferredColorScheme: preferredColorScheme, themeColorScheme: themeColorScheme) #endif loadCJKFontFallbackIfNeeded(config) - // Ivrix Hebrew/BIDI defaults: bidi rendering on, bundled Latin + - // Hebrew monospace fonts, slight thickening for Hebrew readability, and - // the current print direction (ltr/rtl, toggled from the toolbar). + // Ivrix Hebrew/BIDI defaults: bidi rendering on, bundled Latin mono + + // Hebrew fallback, slight thickening for readability, and the current + // print direction (ltr/rtl, toggled from the toolbar). + // + // Ivrix Mono He is the Hebrew fallback: Secular One subset to Hebrew + // and set to a uniform 0.600em advance. Built by + // scripts/make-hebrew-font.py, which scales each weight by whichever + // limit binds first - the target letter height, or the maximum ink + // width that keeps the widest letter inside the cell. + // + // Secular One is a single-weight display face, so only Regular ships + // and ghostty synthesises bold and italic from it. Shipping a "Bold" + // with the same outlines would suppress that synthesis and leave no + // visual bold at all. + // + // The terminal gives every Hebrew letter one cell, so a proportional + // face gaps badly: advances vary 18-25% across the alphabet in every + // Hebrew face measured, and a narrow letter such as yod can advance + // 0.213em inside a 0.600em cell, leaving a third of it empty. Uniform + // advances are a requirement here, not a preference. + // + // Miriam Mono CLM was uniform but drew Hebrew at 0.482em, under Maple + // Mono's 0.550em Latin x-height, so it read smaller than the + // surrounding lowercase. Normalising a proportional face gives both: + // an even rhythm and a letter height that matches the Latin. loadInlineGhosttyConfig( """ bidi = true font-family = Maple Mono NF - font-family = Miriam Mono CLM + \(TerminalHebrewFontSettings.ghosttyConfigContents()) font-thicken = true \(TerminalTextDirectionSettings.ghosttyConfigContents()) """, @@ -1342,6 +1393,22 @@ class GhosttyApp { prefix: "cmux-owned-keybind-overrides", logLabel: "cmux-owned keybind overrides" ) + + // Cmd+Z undoes the last edit on the line being typed, by sending + // readline's undo (Ctrl+_, 0x1f). Shells and readline-style TUIs act + // on it; anything that ignores 0x1f does nothing, which is the same as + // the unbound behaviour it replaces. + // + // This undoes an *edit*, not a command: nothing can un-run something + // already submitted, and it does not touch terminal output. + loadInlineGhosttyConfig( + """ + keybind = super+z=text:\\x1f + """, + into: config, + prefix: "cmux-undo-keybind", + logLabel: "cmux undo keybind" + ) } /// Unbinds Ghostty's built-in `super+1…8 = goto_tab` / `super+9 = last_tab` diff --git a/Sources/KeyboardShortcutSettingsFileStore.swift b/Sources/KeyboardShortcutSettingsFileStore.swift index c5d524f3701..e484f1450a8 100644 --- a/Sources/KeyboardShortcutSettingsFileStore.swift +++ b/Sources/KeyboardShortcutSettingsFileStore.swift @@ -1629,6 +1629,10 @@ final class CmuxSettingsFileStore { TerminalCopyOnSelectSettings.notifyDidChange(notificationCenter: notificationCenter) } + if change.defaultsKey == TerminalHebrewFontSettings.fontKey { + TerminalHebrewFontSettings.notifyDidChange(notificationCenter: notificationCenter) + } + if change.defaultsKey == AgentSessionAutoResumeSettings.autoResumeAgentSessionsKey { agentSessionAutoResumeDidChange = true } diff --git a/Sources/SettingsNavigation.swift b/Sources/SettingsNavigation.swift index 01b48692a9f..dfb8a71b340 100644 --- a/Sources/SettingsNavigation.swift +++ b/Sources/SettingsNavigation.swift @@ -383,6 +383,7 @@ enum SettingsSearchIndex { setting(.terminal, "session-content-width", String(localized: "settings.terminal.sessionContentWidth", defaultValue: "Session Content Width"), "terminal.sessionContentMaxWidth terminal agent chat max width readable line length narrow wide"), setting(.terminal, "session-content-alignment", String(localized: "settings.terminal.sessionContentAlignment", defaultValue: "Session Content Alignment"), "terminal.sessionContentAlignment left center right align terminal agent chat"), setting(.terminal, "copy-on-select", String(localized: "settings.terminal.copyOnSelect", defaultValue: "Copy on Selection"), "terminal.copyOnSelect clipboard selection mouse double click triple click"), + setting(.terminal, "hebrew-font", String(localized: "settings.terminal.hebrewFont", defaultValue: "Hebrew Font"), "terminal.hebrewFont hebrew font face typeface rtl bidi noto miriam alef heebo assistant plex rubik varela frank ruhl david secular cousine"), setting(.terminal, "tab-bar-font-size", String(localized: "settings.terminal.tabBarFontSize", defaultValue: "Tab Bar Font Size"), "font size text scale terminal browser pane tab title surface-tab-bar-font-size"), setting(.terminal, "agent-auto-resume", String(localized: "settings.terminal.agentAutoResume", defaultValue: "Resume Agent Sessions on Reopen"), "terminal.autoResumeAgentSessions auto resume restore reopen relaunch quit sessions agents claude code codex opencode rovo dev rovodev toggle"), setting(.terminal, "agent-hibernation", String(localized: "settings.terminal.agentHibernation", defaultValue: "Agent Hibernation"), "terminal.agentHibernation idle hibernate suspend background agents claude code codex opencode live terminals"), @@ -558,6 +559,7 @@ enum SettingsSearchIndex { "terminal.textBoxDefaultSubmitAction": settingID(for: .textBox, idSuffix: "default-submit-action"), "terminal.textBoxMaxLines": settingID(for: .textBox, idSuffix: "textbox-max-lines"), "terminal.copyOnSelect": settingID(for: .terminal, idSuffix: "copy-on-select"), + "terminal.hebrewFont": settingID(for: .terminal, idSuffix: "hebrew-font"), "terminal.sessionContentMaxWidth": settingID(for: .terminal, idSuffix: "session-content-width"), "terminal.sessionContentAlignment": settingID(for: .terminal, idSuffix: "session-content-alignment"), "terminal.autoResumeAgentSessions": settingID(for: .terminal, idSuffix: "agent-auto-resume"), diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 8d8f208e65e..d0402f68a75 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -925,6 +925,7 @@ struct cmuxApp: App { } } Divider() + Divider() splitCommandButton(title: String(localized: "menu.view.nextSurface", defaultValue: "Next Surface"), shortcut: menuShortcut(for: .nextSurface)) { activeTabManager.selectNextSurface() } diff --git a/cmux.xcodeproj/project.pbxproj b/cmux.xcodeproj/project.pbxproj index 0611169dbc6..f6aef7b7685 100644 --- a/cmux.xcodeproj/project.pbxproj +++ b/cmux.xcodeproj/project.pbxproj @@ -1038,6 +1038,7 @@ C0DE71B10000000000000001 /* AppDelegate+AgentChatNotifications.swift in Sources 8582A1000000000000000002 /* KimiResumeReviewRegressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8582A1000000000000000001 /* KimiResumeReviewRegressionTests.swift */; }; 87C609D63F03597AC12C8B0A /* LastSurfaceClosePreferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2EE0C080FF0FCCE8A8CA930 /* LastSurfaceClosePreferenceTests.swift */; }; A11CE0060000000000000001 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = A11CE0050000000000000001 /* LICENSE */; }; + FBFA0000000000000000F002 /* Fonts in Resources */ = {isa = PBXBuildFile; fileRef = FBFA0000000000000000F001 /* Fonts */; }; DA7A10CA710E000000000003 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = DA7A10CA710E000000000001 /* Localizable.xcstrings */; }; 53750022A0B1C2D3E4F50022 /* MacAuthComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53750023A0B1C2D3E4F50023 /* MacAuthComposition.swift */; }; D1F0A00600000000000000C1 /* MacPairedMacBackupBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F0A00600000000000000C2 /* MacPairedMacBackupBody.swift */; }; @@ -2346,6 +2347,7 @@ C0DE71B10000000000000001 /* AppDelegate+AgentChatNotifications.swift in Sources A11CE0030000000000000001 /* AboutLicenseContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutLicenseContent.swift; sourceTree = ""; }; A11CE0020000000000000001 /* AboutLicensesResourceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutLicensesResourceTests.swift; sourceTree = ""; }; A9E010000000000000000006 /* agent-session-react */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "agent-session-react"; sourceTree = ""; }; + FBFA0000000000000000F001 /* Fonts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Fonts; sourceTree = ""; }; A9E010000000000000000007 /* agent-session-solid */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "agent-session-solid"; sourceTree = ""; }; C7AF10000000000000000006 /* AgentChatArtifactGalleryBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "AgentChatArtifactGalleryBuilder.swift"; sourceTree = ""; }; C7AF10000000000000000002 /* AgentChatArtifactIndex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "AgentChatArtifactIndex.swift"; sourceTree = ""; }; @@ -4650,6 +4652,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = A9D9000000000000000F0016 /* markdown-viewer */, A9E010000000000000000006 /* agent-session-react */, A9E010000000000000000007 /* agent-session-solid */, + FBFA0000000000000000F001 /* Fonts */, A5001622 /* cmux.sdef */, ); @@ -7207,6 +7210,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = A5001100 /* Assets.xcassets in Resources */, A5001623 /* cmux.sdef in Resources */, FEED0A00000000000000F007 /* feed-tui in Resources */, + FBFA0000000000000000F002 /* Fonts in Resources */, DA7A10CA710E000000000004 /* InfoPlist.xcstrings in Resources */, A11CE0060000000000000001 /* LICENSE in Resources */, DA7A10CA710E000000000003 /* Localizable.xcstrings in Resources */, diff --git a/ghostty b/ghostty index 1ac5659c0eb..f7479c6295a 160000 --- a/ghostty +++ b/ghostty @@ -1 +1 @@ -Subproject commit 1ac5659c0eb2a14637abf648df004b6603d49f10 +Subproject commit f7479c6295af17b37c1f3299fa9133c0a652876e diff --git a/scripts/build-ivrix.sh b/scripts/build-ivrix.sh index b9cbe134285..2380f861bb4 100755 --- a/scripts/build-ivrix.sh +++ b/scripts/build-ivrix.sh @@ -55,6 +55,8 @@ PLIST="$APP/Contents/Info.plist" echo "==> [3/6] Bundling fonts into Resources/Fonts" mkdir -p "$APP/Contents/Resources/Fonts" cp -f Resources/Fonts/*.ttf "$APP/Contents/Resources/Fonts/" +# The OFL requires its text to ship alongside the fonts it covers. +cp -f Resources/Fonts/*.txt "$APP/Contents/Resources/Fonts/" 2>/dev/null || true echo "==> [4/6] Ad-hoc signing (minimal entitlements, deep)" # Plain ad-hoc (no hardened runtime — not notarizing; avoids launch friction). diff --git a/scripts/make-hebrew-font.py b/scripts/make-hebrew-font.py new file mode 100755 index 00000000000..dde583b4568 --- /dev/null +++ b/scripts/make-hebrew-font.py @@ -0,0 +1,252 @@ +#!/usr/bin/env python3 +"""Build the Ivrix Mono He Hebrew fallback from a proportional source face. + +A terminal gives every Hebrew letter exactly one cell, so a proportional face +gaps badly: advances vary 18-25% across the alphabet in every Hebrew font +measured, and a narrow letter such as yod can advance 0.213em inside a 0.600em +cell. This normalises a source face to a uniform advance so the row keeps an +even rhythm. + +What it does per style: + + 1. Subsets to the Hebrew block (Maple Mono owns Latin, so nothing else is + needed and the files drop from ~200KB to ~20KB). + 2. Scales by whichever limit binds first - the target letter height, or the + maximum ink width that keeps the widest letter inside the cell. Fitting + is measured AFTER any shear, because shearing widens glyphs and sizing on + the upright form overflows the cell for oblique styles. + 3. Centres every spacing glyph on a uniform advance. Combining marks (nikud) + keep their zero advance so they stack on the base letter instead of + consuming a cell. + 4. Renames the family and records the origin and modification in the name + table, as the OFL requires for a derivative. + +Usage: + scripts/make-hebrew-font.py \ + --regular /path/NotoSansHebrew[wdth,wght].ttf \ + --bold /path/NotoSansHebrew[wdth,wght].ttf \ + --license /path/OFL.txt \ + --credit "Copyright ... (Noto Sans Hebrew)." \ + --out Resources/Fonts + +Variable sources are instantiated at wght 400/700 automatically. +""" + +import argparse +import math +import os +import sys + +from fontTools.ttLib import TTFont +from fontTools import subset +from fontTools.varLib import instancer +from fontTools.pens.ttGlyphPen import TTGlyphPen +from fontTools.pens.transformPen import TransformPen +from fontTools.pens.boundsPen import BoundsPen +from fontTools.pens.recordingPen import DecomposingRecordingPen +from fontTools.misc.transform import Transform + +CELL_EM = 0.600 # Maple Mono NF advance, i.e. the terminal cell width +HEBREW = range(0x0590, 0x0600) +LETTERS = range(0x05D0, 0x05EB) + + +def load_static(path, weight): + """Load `path`, instantiating a variable font at `weight`.""" + f = TTFont(path) + if "fvar" in f: + axes = {a.axisTag: a for a in f["fvar"].axes} + loc = {} + if "wght" in axes: + a = axes["wght"] + loc["wght"] = min(max(weight, a.minValue), a.maxValue) + for tag, a in axes.items(): + if tag != "wght": + loc[tag] = a.defaultValue + f = instancer.instantiateVariableFont(f, loc, updateFontNames=False, inplace=False) + tmp = "/tmp/_ivrix_instance.ttf" + f.save(tmp) + f = TTFont(tmp) + return f + + +def set_name(font, nid, value): + for rec in font["name"].names: + if rec.nameID == nid: + rec.string = value + + +def build(src, style, weight, italic, fs_selection, args): + opts = subset.Options() + opts.name_IDs = ["*"] + opts.name_legacy = True + opts.name_languages = ["*"] + opts.notdef_outline = True + opts.layout_features = ["*"] + opts.glyph_names = True + opts.drop_tables = ["meta", "FFTM"] + + inst = load_static(src, weight) + inst.save("/tmp/_ivrix_src.ttf") + f = subset.load_font("/tmp/_ivrix_src.ttf", opts) + sub = subset.Subsetter(options=opts) + sub.populate(unicodes=list(HEBREW) + [0x20, 0x200E, 0x200F]) + sub.subset(f) + + upm = f["head"].unitsPerEm + cell = int(CELL_EM * upm) + glyphs = f.getGlyphSet() + glyf = f["glyf"] + hmtx = f["hmtx"] + cmap = f.getBestCmap() + + present = [cmap[c] for c in LETTERS if c in cmap] + if len(present) < 27: + sys.exit(f"ERROR: {src} covers only {len(present)}/27 Hebrew letters") + + slant = math.tan(math.radians(args.slant)) if italic else 0.0 + + def measure(scale): + t = Transform(scale, 0, slant * scale, scale, 0, 0) + heights, widths = [], [] + for gn in present: + rec = DecomposingRecordingPen(glyphs) + glyphs[gn].draw(rec) + bp = BoundsPen(glyphs) + rec.replay(TransformPen(bp, t)) + if bp.bounds: + heights.append((bp.bounds[3] - bp.bounds[1]) / upm) + widths.append((bp.bounds[2] - bp.bounds[0]) / upm) + return sum(heights) / len(heights), max(widths) + + # Converge on the largest scale satisfying both limits. Measured after the + # shear, since shearing widens glyphs. + scale = 1.0 + for _ in range(8): + h, w = measure(scale) + limit = min(args.target_height / h, args.max_ink / w) + if abs(limit - 1.0) < 0.001: + break + scale *= limit + + base = Transform(scale, 0, slant * scale, scale, 0, 0) + for cp, gn in list(cmap.items()): + if cp not in HEBREW: + continue + zero_width = hmtx[gn][0] == 0 # combining mark + rec = DecomposingRecordingPen(glyphs) + glyphs[gn].draw(rec) + bp = BoundsPen(glyphs) + glyphs[gn].draw(bp) + if not bp.bounds: + if not zero_width: + hmtx[gn] = (cell, hmtx[gn][1]) + continue + mb = BoundsPen(glyphs) + rec.replay(TransformPen(mb, base)) + x0, _, x1, _ = mb.bounds + width = x1 - x0 + tx = 0 if zero_width else (cell - width) / 2 - x0 + pen = TTGlyphPen(glyphs) + rec.replay(TransformPen(pen, Transform(1, 0, 0, 1, tx, 0).transform(base))) + glyf[gn] = pen.glyph() + glyf[gn].recalcBounds(glyf) + if not zero_width: + hmtx[gn] = (cell, int((cell - width) / 2)) + + note = ", synthetic oblique." if italic else "." + set_name(f, 0, f"{args.credit} Modified for Ivrix: subset to Hebrew, " + f"uniform {CELL_EM:.3f}em advance{note}") + set_name(f, 1, args.family) + set_name(f, 2, style) + set_name(f, 4, f"{args.family} {style}") + set_name(f, 6, f"{args.family.replace(' ', '')}-{style.replace(' ', '')}") + set_name(f, 16, args.family) + set_name(f, 17, style) + f["OS/2"].usWeightClass = weight + f["OS/2"].fsSelection = (f["OS/2"].fsSelection & ~0b1100001) | fs_selection + f["post"].isFixedPitch = 1 + f["OS/2"].panose.bProportion = 9 + if italic: + f["post"].italicAngle = -float(args.slant) + f["head"].macStyle |= 0b10 + if weight == 700: + f["head"].macStyle |= 0b1 + + out = os.path.join(args.out, f"{args.family.replace(' ', '')}-{style.replace(' ', '')}.ttf") + f.save(out) + + # Report what actually landed, so a bad fit is visible rather than silent. + v = TTFont(out) + vc, vh, vg = v.getBestCmap(), v["hmtx"], v.getGlyphSet() + vupm = v["head"].unitsPerEm + advances = {vh[vc[c]][0] for c in LETTERS if c in vc} + marks = {vh[vc[c]][0] for c in range(0x0591, 0x05BE) if c in vc} + inks, heights = [], [] + for c in LETTERS: + bp = BoundsPen(vg) + vg[vc[c]].draw(bp) + if bp.bounds: + inks.append((bp.bounds[2] - bp.bounds[0]) / vupm) + heights.append((bp.bounds[3] - bp.bounds[1]) / vupm) + status = "OK" if max(inks) <= CELL_EM else "OVERFLOW" + print(f" {os.path.basename(out):28} scale={scale:.3f} h={sum(heights)/len(heights):.3f}em " + f"ink={max(inks):.3f}em adv={advances} marks={marks or '{none}'} {status}") + if status != "OK": + sys.exit("ERROR: glyphs overflow the cell; lower --max-ink") + + +def main(): + p = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + p.add_argument("--regular", required=True, help="source face for regular/italic") + p.add_argument("--bold", help="source face for bold (defaults to --regular)") + p.add_argument("--license", required=True, help="OFL text to ship alongside") + p.add_argument("--credit", required=True, help="upstream copyright line") + p.add_argument("--family", default="Ivrix Mono He") + p.add_argument("--out", default="Resources/Fonts") + p.add_argument("--target-height", type=float, default=0.572, + help="desired Hebrew letter height in em") + p.add_argument("--max-ink", type=float, default=0.595, + help="maximum ink width in em; must stay under the 0.600em cell") + p.add_argument("--slant", type=float, default=12.0, + help="oblique angle in degrees for synthesised italics") + p.add_argument("--regular-only", action="store_true", + help="build only the Regular face. Use for single-weight " + "sources: ghostty synthesises bold and italic when the " + "family lacks them, whereas shipping a 'Bold' with the " + "same outlines suppresses that and leaves no visual bold") + args = p.parse_args() + + if args.max_ink > CELL_EM: + sys.exit(f"ERROR: --max-ink {args.max_ink} exceeds the {CELL_EM} cell") + bold_src = args.bold or args.regular + os.makedirs(args.out, exist_ok=True) + + styles = [(args.regular, "Regular", 400, False, 0b1000000)] + if not args.regular_only: + styles += [ + (bold_src, "Bold", 700, False, 0b0100000), + (args.regular, "Italic", 400, True, 0b0000001), + (bold_src, "Bold Italic", 700, True, 0b0100001), + ] + else: + # Drop any faces left from a previous build, or the stale Bold would + # still be found and synthesis would never kick in. + for style in ("Bold", "Italic", "BoldItalic"): + stale = os.path.join(args.out, f"{args.family.replace(' ', '')}-{style}.ttf") + if os.path.exists(stale): + os.remove(stale) + print(f" removed stale {os.path.basename(stale)} (will be synthesised)") + + for src, style, weight, italic, fs in styles: + build(src, style, weight, italic, fs, args) + + dest = os.path.join(args.out, f"OFL-{args.family.replace(' ', '')}.txt") + with open(args.license) as fh, open(dest, "w") as out: + out.write(fh.read()) + print(f" {os.path.basename(dest):28} license shipped alongside") + + +if __name__ == "__main__": + main() diff --git a/scripts/package-ivrix-dmg.sh b/scripts/package-ivrix-dmg.sh new file mode 100755 index 00000000000..1f0503f194c --- /dev/null +++ b/scripts/package-ivrix-dmg.sh @@ -0,0 +1,124 @@ +#!/usr/bin/env bash +# Package the locally built Ivrix.app into a notarized, stapled DMG. +# +# Unlike scripts/notarize-ivrix.sh (which pulls the ad-hoc zip from a GitHub +# release), this works on the app this checkout just built, so you can ship a +# DMG straight from a branch. +# +# Pipeline: +# 1. Re-sign the staged app with Developer ID + hardened runtime, inside-out. +# 2. Notarize the app and staple its ticket. +# 3. Build a DMG with an /Applications drop target. +# 4. Sign, notarize and staple the DMG itself. +# +# Both the app and the DMG are notarized: stapling the app means it launches +# cleanly even when copied out of the DMG, and notarizing the DMG means the +# disk image opens without a Gatekeeper prompt. +# +# Usage: +# scripts/package-ivrix-dmg.sh # uses /tmp/ivrix-stage/Ivrix.app +# APP=/path/to/Ivrix.app scripts/package-ivrix-dmg.sh +# NOTARY_PROFILE=ivrix SIGN_IDENTITY="Developer ID Application: ..." scripts/package-ivrix-dmg.sh +set -euo pipefail + +REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +ENTITLEMENTS="$REPO/scripts/ivrix.entitlements" +HELPER_ENTITLEMENTS="$REPO/cmux-helper.entitlements" +APP="${APP:-/tmp/ivrix-stage/Ivrix.app}" +WORK="${TMPDIR:-/tmp}/ivrix-dmg" +DESKTOP="$HOME/Desktop" +DMG="$DESKTOP/Ivrix.dmg" +VOLNAME="Ivrix" + +test -d "$APP" || { echo "ERROR: $APP missing — run scripts/build-ivrix.sh first" >&2; exit 1; } +test -f "$ENTITLEMENTS" || { echo "ERROR: $ENTITLEMENTS missing" >&2; exit 1; } +test -f "$HELPER_ENTITLEMENTS" || { echo "ERROR: $HELPER_ENTITLEMENTS missing" >&2; exit 1; } + +# --- identity --- +SIGN_IDENTITY="${SIGN_IDENTITY:-}" +if [[ -z "$SIGN_IDENTITY" ]]; then + SIGN_IDENTITY="$(security find-identity -v -p codesigning 2>/dev/null \ + | grep -o 'Developer ID Application: [^"]*' | head -1)" +fi +test -n "$SIGN_IDENTITY" || { echo "ERROR: no 'Developer ID Application' identity. Set SIGN_IDENTITY=..." >&2; exit 1; } +echo "==> signing identity: $SIGN_IDENTITY" + +# --- notary profile --- +NOTARY_PROFILE="${NOTARY_PROFILE:-}" +if [[ -z "$NOTARY_PROFILE" ]]; then + for p in ivrix cmux notary AC_PASSWORD; do + if xcrun notarytool history --keychain-profile "$p" >/dev/null 2>&1; then NOTARY_PROFILE="$p"; break; fi + done +fi +test -n "$NOTARY_PROFILE" || { echo "ERROR: no working notarytool keychain profile. Set NOTARY_PROFILE=..." >&2; exit 1; } +echo "==> notary profile: $NOTARY_PROFILE" + +rm -rf "$WORK"; mkdir -p "$WORK" +STAGE="$WORK/stage" +mkdir -p "$STAGE" +cp -R "$APP" "$STAGE/Ivrix.app" +APP="$STAGE/Ivrix.app" + +# --- 1. re-sign Developer ID + hardened runtime (inside-out) --- +# A single `codesign --deep` does NOT sign nested executables under +# Contents/Resources/bin, so notarization rejects them as unsigned. +echo "==> [1/6] re-signing (Developer ID + hardened runtime, inside-out)" +COMMON=(--force --options runtime --timestamp --sign "$SIGN_IDENTITY") + +for helper in "$APP/Contents/Resources/bin"/*; do + [[ -f "$helper" ]] || continue + echo " helper: $(basename "$helper")" + codesign "${COMMON[@]}" --entitlements "$HELPER_ENTITLEMENTS" "$helper" +done + +if [[ -d "$APP/Contents/PlugIns" ]]; then + while IFS= read -r -d '' plugin; do + echo " plugin: $(basename "$plugin")" + codesign "${COMMON[@]}" --deep "$plugin" + done < <(find "$APP/Contents/PlugIns" -mindepth 1 -maxdepth 1 -print0) +fi + +if [[ -d "$APP/Contents/Frameworks" ]]; then + while IFS= read -r -d '' framework; do + echo " framework: $(basename "$framework")" + codesign "${COMMON[@]}" --deep "$framework" + done < <(find "$APP/Contents/Frameworks" -mindepth 1 -maxdepth 1 -print0) +fi + +echo " main bundle: Ivrix.app" +codesign "${COMMON[@]}" --entitlements "$ENTITLEMENTS" "$APP" +codesign --verify --deep --strict --verbose=2 "$APP" 2>&1 | tail -2 + +# --- 2. notarize the app --- +echo "==> [2/6] notarizing app (this can take minutes)" +ditto -c -k --keepParent "$APP" "$WORK/Ivrix-app.zip" +xcrun notarytool submit "$WORK/Ivrix-app.zip" --keychain-profile "$NOTARY_PROFILE" --wait + +echo "==> [3/6] stapling app" +xcrun stapler staple "$APP" +xcrun stapler validate "$APP" + +# --- 4. build the DMG --- +echo "==> [4/6] building DMG" +SRCDIR="$WORK/dmgsrc" +rm -rf "$SRCDIR"; mkdir -p "$SRCDIR" +cp -R "$APP" "$SRCDIR/Ivrix.app" +ln -s /Applications "$SRCDIR/Applications" +rm -f "$DMG" +hdiutil create -volname "$VOLNAME" -srcfolder "$SRCDIR" -ov -format UDZO -quiet "$DMG" + +echo "==> [5/6] signing DMG" +codesign --force --timestamp --sign "$SIGN_IDENTITY" "$DMG" + +# --- 6. notarize + staple the DMG --- +echo "==> [6/6] notarizing DMG (this can take minutes)" +xcrun notarytool submit "$DMG" --keychain-profile "$NOTARY_PROFILE" --wait +xcrun stapler staple "$DMG" +xcrun stapler validate "$DMG" + +echo +echo "==> verification" +spctl -a -vvv --type exec "$APP" 2>&1 | tail -3 || true +spctl -a -vvv --type open --context context:primary-signature "$DMG" 2>&1 | tail -3 || true +ls -lh "$DMG" +echo "DONE: $DMG (notarized + stapled; app inside is stapled too)"