| 1 | # Oficina Sheets for Mac, iPhone and iPad |
| 2 | |
| 3 | Entirely native SwiftUI editors use the same authenticated Go calculation, |
| 4 | formatting, sealed storage and permission paths as the web application. |
| 5 | No embedded browser editor or second formula engine is used. |
| 6 | |
| 7 | Build with Xcode 26.6, Swift 6.2+, and XcodeGen: |
| 8 | |
| 9 | ```sh |
| 10 | native/scripts/build-mac.sh |
| 11 | native/scripts/build-iphone.sh simulator |
| 12 | ``` |
| 13 | |
| 14 | The macOS bundle is `native/build/Oficina Sheets.app`. Simulator products |
| 15 | are under `native/build/ios`. Device builds use `build-iphone.sh device` |
| 16 | and require `OFICINA_DEVELOPMENT_TEAM` and the team's normal signing setup. |
| 17 | Simulator and device builds use separate DerivedData directories. |
| 18 | `OFICINA_SKIP_PROJECT_GENERATION=1` allows the suite runner to generate the |
| 19 | project once before starting parallel builds. |
| 20 | |
| 21 | The shared native transport and Mac packaging tools are pinned to reviewed |
| 22 | revision `a49307c29cf36dff2cf423c3f98b38269ce9a553` of |
| 23 | `https://amadan.net/rastrillo/native`. Both SwiftPM and Xcode resolve that |
| 24 | revision; no sibling development checkout is required. |
| 25 | |
| 26 | Select a cell, then edit its formula bar, double-click, or type while the |
| 27 | Mac grid has keyboard focus. Enter saves and moves down; Tab saves and |
| 28 | moves right; Escape discards the focused cell edit. The range field accepts |
| 29 | addresses such as `A1:C10`. Menus provide copy/paste, clear, fill, formatting, |
| 30 | size controls, functions, history, comments, sharing and workbook transfer. |
| 31 | Sort/filter opens a native table preserving each cell's original reference. |
| 32 | |
| 33 | Network content uses ephemeral transport. Requested exports stream to a private |
| 34 | temporary workbook and are handed to the system file-save picker; the temporary |
| 35 | file is removed on completion, cancellation or failure. Failed value batches |
| 36 | remain available for retry/discard; window close and Quit protect pending |
| 37 | edits. The app does not claim offline editing or sealed local document caches. |
| 38 | |
| 39 | Current web limits remain visible: a single worksheet, a 500-row/200-column |
| 40 | grid window, 500-cell paste limit, first-worksheet XLSX/XLSM import up to |
| 41 | 20 MiB, and no undo for formatting or sizing. Formula evaluation and number |
| 42 | display come from the Go server. Charts, conditional-format rule editing, |
| 43 | structural row/column changes and additional worksheet editing do not exist |
| 44 | in the web baseline and are not represented as finished features here. |
| 45 | |
| 46 | Verification: |
| 47 | |
| 48 | ```sh |
| 49 | swift test --package-path native/apple |
| 50 | go test ./... |
| 51 | ``` |
| 52 | |
| 53 | `SheetsReview` and `SheetsReviewPhone` are separate, unshipped review targets. |
| 54 | Their fixture server uses temporary databases and ordinary authenticated |
| 55 | sessions. Production entry points never contain fixture credentials. |
| 56 | See the native design spec and review records for exercised coverage; |
| 57 | compiling a target alone does not establish editing parity. |
| 58 | |