Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

Mizu (水) is a FileMaker theme and add-on by Proof+Geist, inspired by Material Design and IBM Carbon. It targets FileMaker 19+ and ships as a `.fmaddon` archive with a companion `.fmp12` helper file.

## Build Process

The build is a hybrid manual/scripted process — theme changes happen inside FileMaker, then XML is cleaned up and packaged:

1. Update theme in FileMaker (foundations-dev file)
2. Update version in `mizu_theme::__versionString` and `FMAddonTemplate_Version` on `__FMdAddonTemplate_Metadata` layout
3. Export via "Generate Add-on" in FileMaker (outputs to `~/Library/Application Support/FileMaker/Extensions/AddonModules`)
4. Copy `proof_mizu_theme/` folder to project root
5. Clean up extraneous XML (see below)
6. Build the archive: `source build.sh`

### Build Command

```
source build.sh
```

Requires `xar` utility. Creates `proof_mizu_theme.fmaddon` from the `proof_mizu_theme/` directory.

### XML Cleanup After Export

FileMaker generates duplicate objects that must be manually removed. Use VSCode compare against `previous/` versions to detect diffs. Key fixes:

- **Portals layout**: Remove 2 extra buttons in Portal UUID `47F1ED16-...`, set membercount to 5
- **Tabs layout**: Remove 3 duplicate button bar buttons in SlidePanel UUID `B2C37ECE-...`, set membercount to 14
- **List layout**: Remove 2 extra objects in Portal, set membercount to 3

See `build-how-to.md` for exact XPaths and UUIDs.

### Testing

1. Uninstall existing mizu add-on in FileMaker
2. Delete `.fmaddon` file and `proof_mizu_theme/` from FileMaker's `Extensions/AddonModules` directory
3. Double-click the new `.fmaddon` to install
4. Create a new FileMaker file, add the add-on, verify no duplicate buttons on Portal/List/Tabs layouts

## Architecture

This is an XML/JSON-based theme definition, not a traditional code project.

### Key Files

- **`proof_mizu_theme/template.xml`** — Main theme definition (~7,000 lines). Contains structure definitions (FieldCatalog, LayoutCatalog with 13 layouts) and literal content in CDATA sections. **Do not modify CDATA sections** — it breaks XML folding and risks corrupting the file.
- **`proof_mizu_theme/info.json`** — Core metadata (GUID, version, supported clients)
- **`proof_mizu_theme/info_[lang].json`** + **`[lang].xml`** + **`records_[lang].xml`** — Localized strings for 11 languages (en, de, es, fr, it, ja, ko, nl, pt, sv, zh)
- **`proof_mizu_helper.fmp12`** — Companion helper file (binary, Git LFS tracked)
- **`previous/`** — Previous template.xml versions kept for diff comparison during builds

### Binary Files

`.fmp12`, `.fmaddon`, and `.zip` files are tracked via Git LFS (configured in `.gitattributes`).
9 changes: 9 additions & 0 deletions build-shadcn.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#! /bin/bash
if xar -h &> /dev/null
then
echo "xar could not be found"
else

xar -cf proof_shadcn_theme.fmaddon proof_shadcn_theme/
echo 'build succesful'
fi
3 changes: 3 additions & 0 deletions proof_shadcn_theme.fmaddon
Git LFS file not shown
98 changes: 98 additions & 0 deletions proof_shadcn_theme/de.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@

<DynamicTemplateString>
<StringID>com.fmi.basedirectory.CB285A0FD66A28850057FEB1F4A82D17</StringID>
<SourceText>Mizu/</SourceText>
<TargetText>Mizu/</TargetText>
<Comment>com.fmi.basedirectory.Mizu/</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.A72664F13DDFEACC5F6AAC99DE88BC03</StringID>
<SourceText>__FMAddonTemplate_Metadata</SourceText>
<TargetText>__FMAddonTemplate_Metadata</TargetText>
<Comment>com.fmi.basetable.__FMAddonTemplate_Metadata</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::1A6F6D8A5D201F2A21420B43C5345AE0</StringID>
<SourceText>__FMAddonTemplate_Version</SourceText>
<TargetText>__FMAddonTemplate_Version</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Version</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::3DF4202D460A0197901676D33510E2A9</StringID>
<SourceText>__FMAddonTemplate_GUID</SourceText>
<TargetText>__FMAddonTemplate_GUID</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_GUID</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::4C401D80F095E4875C589E7F30613788</StringID>
<SourceText>__FMAddonTemplate_PreviewImage</SourceText>
<TargetText>__FMAddonTemplate_PreviewImage</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_PreviewImage</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::58C8AA9702E724A8E8528A4EFD8E39BC</StringID>
<SourceText>__FMAddonTemplate_Icon</SourceText>
<TargetText>__FMAddonTemplate_Icon</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Icon</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::5A65B734A19B7A9D40A8E233BCECC32B</StringID>
<SourceText>__FMAddonTemplate_Desc</SourceText>
<TargetText>__FMAddonTemplate_Desc</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Desc</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::9C2DB678CD3FAB550FD3E0896225AC19</StringID>
<SourceText>__FMAddonTemplate_Clients</SourceText>
<TargetText>__FMAddonTemplate_Clients</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Clients</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::B0F082A2B4B8CD0DD4CC13D936B12D82</StringID>
<SourceText>__FMAddonTemplate_Attribution</SourceText>
<TargetText>__FMAddonTemplate_Attribution</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Attribution</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::BF67E2BFE93D889A4BB3ACAEF0833675</StringID>
<SourceText>__FMAddonTemplate_URL</SourceText>
<TargetText>__FMAddonTemplate_URL</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_URL</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::C3705CECC929CE96E6BCD1628F27214E</StringID>
<SourceText>__FMAddonTemplate_Title</SourceText>
<TargetText>__FMAddonTemplate_Title</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Title</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::DFF29DF31A6BCD82433020A5B2096A06</StringID>
<SourceText>__FMAddonTemplate_Category</SourceText>
<TargetText>__FMAddonTemplate_Category</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Category</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.calculation.text.E06123D571693687770B1259FAD99B28</StringID>
<SourceText>Proof Add-on Module</SourceText>
<TargetText>Proof Add-on Module</TargetText>
<Comment>com.fmi.calculation.text.Proof Add-on Module</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.tableoccurrence.A72664F13DDFEACC5F6AAC99DE88BC03</StringID>
<SourceText>__FMAddonTemplate_Metadata</SourceText>
<TargetText>__FMAddonTemplate_Metadata</TargetText>
<Comment>com.fmi.tableoccurrence.__FMAddonTemplate_Metadata</Comment>
</DynamicTemplateString>
98 changes: 98 additions & 0 deletions proof_shadcn_theme/en.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@

<DynamicTemplateString>
<StringID>com.fmi.basedirectory.CB285A0FD66A28850057FEB1F4A82D17</StringID>
<SourceText>Mizu/</SourceText>
<TargetText>Mizu/</TargetText>
<Comment>com.fmi.basedirectory.Mizu/</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.A72664F13DDFEACC5F6AAC99DE88BC03</StringID>
<SourceText>__FMAddonTemplate_Metadata</SourceText>
<TargetText>__FMAddonTemplate_Metadata</TargetText>
<Comment>com.fmi.basetable.__FMAddonTemplate_Metadata</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::1A6F6D8A5D201F2A21420B43C5345AE0</StringID>
<SourceText>__FMAddonTemplate_Version</SourceText>
<TargetText>__FMAddonTemplate_Version</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Version</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::3DF4202D460A0197901676D33510E2A9</StringID>
<SourceText>__FMAddonTemplate_GUID</SourceText>
<TargetText>__FMAddonTemplate_GUID</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_GUID</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::4C401D80F095E4875C589E7F30613788</StringID>
<SourceText>__FMAddonTemplate_PreviewImage</SourceText>
<TargetText>__FMAddonTemplate_PreviewImage</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_PreviewImage</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::58C8AA9702E724A8E8528A4EFD8E39BC</StringID>
<SourceText>__FMAddonTemplate_Icon</SourceText>
<TargetText>__FMAddonTemplate_Icon</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Icon</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::5A65B734A19B7A9D40A8E233BCECC32B</StringID>
<SourceText>__FMAddonTemplate_Desc</SourceText>
<TargetText>__FMAddonTemplate_Desc</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Desc</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::9C2DB678CD3FAB550FD3E0896225AC19</StringID>
<SourceText>__FMAddonTemplate_Clients</SourceText>
<TargetText>__FMAddonTemplate_Clients</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Clients</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::B0F082A2B4B8CD0DD4CC13D936B12D82</StringID>
<SourceText>__FMAddonTemplate_Attribution</SourceText>
<TargetText>__FMAddonTemplate_Attribution</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Attribution</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::BF67E2BFE93D889A4BB3ACAEF0833675</StringID>
<SourceText>__FMAddonTemplate_URL</SourceText>
<TargetText>__FMAddonTemplate_URL</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_URL</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::C3705CECC929CE96E6BCD1628F27214E</StringID>
<SourceText>__FMAddonTemplate_Title</SourceText>
<TargetText>__FMAddonTemplate_Title</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Title</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::DFF29DF31A6BCD82433020A5B2096A06</StringID>
<SourceText>__FMAddonTemplate_Category</SourceText>
<TargetText>__FMAddonTemplate_Category</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Category</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.calculation.text.E06123D571693687770B1259FAD99B28</StringID>
<SourceText>Proof Add-on Module</SourceText>
<TargetText>Proof Add-on Module</TargetText>
<Comment>com.fmi.calculation.text.Proof Add-on Module</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.tableoccurrence.A72664F13DDFEACC5F6AAC99DE88BC03</StringID>
<SourceText>__FMAddonTemplate_Metadata</SourceText>
<TargetText>__FMAddonTemplate_Metadata</TargetText>
<Comment>com.fmi.tableoccurrence.__FMAddonTemplate_Metadata</Comment>
</DynamicTemplateString>
98 changes: 98 additions & 0 deletions proof_shadcn_theme/es.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@

<DynamicTemplateString>
<StringID>com.fmi.basedirectory.CB285A0FD66A28850057FEB1F4A82D17</StringID>
<SourceText>Mizu/</SourceText>
<TargetText>Mizu/</TargetText>
<Comment>com.fmi.basedirectory.Mizu/</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.A72664F13DDFEACC5F6AAC99DE88BC03</StringID>
<SourceText>__FMAddonTemplate_Metadata</SourceText>
<TargetText>__FMAddonTemplate_Metadata</TargetText>
<Comment>com.fmi.basetable.__FMAddonTemplate_Metadata</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::1A6F6D8A5D201F2A21420B43C5345AE0</StringID>
<SourceText>__FMAddonTemplate_Version</SourceText>
<TargetText>__FMAddonTemplate_Version</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Version</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::3DF4202D460A0197901676D33510E2A9</StringID>
<SourceText>__FMAddonTemplate_GUID</SourceText>
<TargetText>__FMAddonTemplate_GUID</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_GUID</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::4C401D80F095E4875C589E7F30613788</StringID>
<SourceText>__FMAddonTemplate_PreviewImage</SourceText>
<TargetText>__FMAddonTemplate_PreviewImage</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_PreviewImage</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::58C8AA9702E724A8E8528A4EFD8E39BC</StringID>
<SourceText>__FMAddonTemplate_Icon</SourceText>
<TargetText>__FMAddonTemplate_Icon</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Icon</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::5A65B734A19B7A9D40A8E233BCECC32B</StringID>
<SourceText>__FMAddonTemplate_Desc</SourceText>
<TargetText>__FMAddonTemplate_Desc</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Desc</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::9C2DB678CD3FAB550FD3E0896225AC19</StringID>
<SourceText>__FMAddonTemplate_Clients</SourceText>
<TargetText>__FMAddonTemplate_Clients</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Clients</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::B0F082A2B4B8CD0DD4CC13D936B12D82</StringID>
<SourceText>__FMAddonTemplate_Attribution</SourceText>
<TargetText>__FMAddonTemplate_Attribution</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Attribution</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::BF67E2BFE93D889A4BB3ACAEF0833675</StringID>
<SourceText>__FMAddonTemplate_URL</SourceText>
<TargetText>__FMAddonTemplate_URL</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_URL</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::C3705CECC929CE96E6BCD1628F27214E</StringID>
<SourceText>__FMAddonTemplate_Title</SourceText>
<TargetText>__FMAddonTemplate_Title</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Title</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.basetable.field.__FMAddonTemplate_Metadata::DFF29DF31A6BCD82433020A5B2096A06</StringID>
<SourceText>__FMAddonTemplate_Category</SourceText>
<TargetText>__FMAddonTemplate_Category</TargetText>
<Comment>com.fmi.basetable.field.__FMAddonTemplate_Metadata::__FMAddonTemplate_Category</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.calculation.text.E06123D571693687770B1259FAD99B28</StringID>
<SourceText>Proof Add-on Module</SourceText>
<TargetText>Proof Add-on Module</TargetText>
<Comment>com.fmi.calculation.text.Proof Add-on Module</Comment>
</DynamicTemplateString>

<DynamicTemplateString>
<StringID>com.fmi.tableoccurrence.A72664F13DDFEACC5F6AAC99DE88BC03</StringID>
<SourceText>__FMAddonTemplate_Metadata</SourceText>
<TargetText>__FMAddonTemplate_Metadata</TargetText>
<Comment>com.fmi.tableoccurrence.__FMAddonTemplate_Metadata</Comment>
</DynamicTemplateString>
Loading