Skip to content

Commit 8c164a4

Browse files
committed
Ship an installable release archive, citation metadata and a thumbnail
The repo has never published a release, so installing the theme meant cloning it, development toolchain included. Three additions close that: - .github/workflows/release.yml builds the archive on a v* tag. It checks the tag against config/theme.ini and package.json, that the committed build artifacts are current, and that the zip contains everything Omeka loads and none of the tooling used to develop it. - .gitattributes gains export-ignore for the npm/gulp/Playwright toolchain, the test trees and the agent working notes, so `git archive` and GitHub's generated source zips carry only the theme itself. - theme.jpg is the admin theme-picker thumbnail Omeka reads from /themes/<id>/theme.jpg. There was none, so the picker rendered a broken image. Captured from the live English site. The archive is built with --prefix=IWAC-theme/ deliberately: the theme directory name is the Omeka S theme id, and both live sites are configured against "IWAC-theme". An archive unpacking to any other name reads as a different theme and orphans their theme setting. CITATION.cff validates against citation-file-format 1.2.0 and credits Freedom as the fork origin. .github/social-preview.png is the repository social card, uploaded through repository settings (no API for it).
1 parent 1b30b27 commit 8c164a4

5 files changed

Lines changed: 209 additions & 8 deletions

File tree

.gitattributes

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,68 @@
1-
/.gitattributes export-ignore
2-
/.github/ export-ignore
3-
/.gitignore export-ignore
4-
/.editorconfig export-ignore
1+
# ---------------------------------------------------------------------------
2+
# Release archives (`git archive`, and GitHub's generated source zips/tarballs)
3+
#
4+
# An Omeka S theme is installed by unzipping into `themes/`, so the archive is
5+
# the product: everything left in it lands on a production server. Keep it to
6+
# what Omeka actually loads — templates, helpers, compiled assets, compiled
7+
# translations, config, licence, docs — and strip the whole development
8+
# toolchain. Verify after any change with:
9+
#
10+
# git archive --prefix=IWAC-theme/ -o t.zip HEAD && unzip -l t.zip
11+
# ---------------------------------------------------------------------------
12+
13+
# Git and CI plumbing
14+
/.gitattributes export-ignore
15+
/.gitignore export-ignore
16+
/.github/ export-ignore
17+
/.editorconfig export-ignore
18+
19+
# Node build toolchain — the theme ships compiled CSS, never builds on the server
20+
/package.json export-ignore
21+
/package-lock.json export-ignore
22+
/gulpfile.js export-ignore
23+
/.nvmrc export-ignore
24+
/scripts/ export-ignore
25+
26+
# Tests and fixtures
27+
/test/ export-ignore
28+
/test-support/ export-ignore
29+
/e2e/ export-ignore
30+
/playwright.config.js export-ignore
31+
32+
# Agent and contributor working notes
33+
/CLAUDE.md export-ignore
34+
/.impeccable.md export-ignore
35+
/.agents/ export-ignore
36+
/.claude/ export-ignore
37+
/ROADMAP.md export-ignore
38+
39+
# Point-in-time internal review, superseded by docs/DESIGN-SYSTEM.md
40+
/docs/DESIGN-REVIEW-2026-06.md export-ignore
41+
42+
# Gettext sources — only the compiled .mo is loaded at runtime
543
/language/*.pot export-ignore
6-
/language/*.po export-ignore
44+
/language/*.po export-ignore
745

46+
# ---------------------------------------------------------------------------
847
# Generated artifacts — collapse in diffs/PR review
48+
# ---------------------------------------------------------------------------
949
/asset/css/style.css linguist-generated
10-
/tokens.json linguist-generated
11-
/language/fr.mo linguist-generated
50+
/tokens.json linguist-generated
51+
/language/fr.mo linguist-generated
52+
53+
# ---------------------------------------------------------------------------
54+
# Line endings and binary safety
55+
# ---------------------------------------------------------------------------
1256

1357
# Keep gettext source catalogs deterministic across platforms.
14-
/language/*.po text eol=lf
58+
/language/*.po text eol=lf
1559
/language/*.pot text eol=lf
60+
61+
# Never newline-translate binaries, whatever core.autocrlf is set to locally.
62+
*.mo binary
63+
*.jpg binary
64+
*.jpeg binary
65+
*.png binary
66+
*.webp binary
67+
*.gif binary
68+
*.ico binary

.github/social-preview.png

493 KB
Loading

.github/workflows/release.yml

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
name: Release
2+
3+
# Publishes the installable theme archive. Tag and push to trigger:
4+
#
5+
# git tag v2.9.5 && git push origin v2.9.5
6+
#
7+
on:
8+
push:
9+
tags: ['v*']
10+
workflow_dispatch:
11+
inputs:
12+
tag:
13+
description: 'Existing tag to (re)build the release asset for, e.g. v2.9.5'
14+
required: true
15+
16+
permissions:
17+
contents: write
18+
19+
jobs:
20+
release:
21+
name: Build and publish installable archive
22+
runs-on: ubuntu-latest
23+
steps:
24+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
25+
with:
26+
ref: ${{ github.event.inputs.tag || github.ref }}
27+
fetch-depth: 0
28+
29+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
30+
with:
31+
node-version: 24.18.1
32+
cache: npm
33+
34+
- name: Resolve tag and version
35+
id: v
36+
run: |
37+
TAG="${{ github.event.inputs.tag || github.ref_name }}"
38+
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
39+
echo "version=${TAG#v}" >> "$GITHUB_OUTPUT"
40+
41+
# The theme directory name is the Omeka S theme id. Sites at islam.zmo.de
42+
# are configured against "IWAC-theme", so the archive must extract to a
43+
# directory of exactly that name or an in-place upgrade orphans them.
44+
- name: Version must match config/theme.ini and package.json
45+
run: |
46+
INI=$(sed -n 's/^version *= *"\(.*\)"/\1/p' config/theme.ini)
47+
PKG=$(node -p "require('./package.json').version")
48+
echo "tag=${{ steps.v.outputs.version }} theme.ini=$INI package.json=$PKG"
49+
test "$INI" = "${{ steps.v.outputs.version }}" || { echo "::error::config/theme.ini says $INI"; exit 1; }
50+
test "$PKG" = "${{ steps.v.outputs.version }}" || { echo "::error::package.json says $PKG"; exit 1; }
51+
52+
- run: npm ci
53+
54+
- name: Committed build artifacts must be current
55+
run: |
56+
npm run build
57+
git diff --exit-code
58+
59+
- name: Build installable archive
60+
id: zip
61+
run: |
62+
NAME="IWAC-theme-${{ steps.v.outputs.tag }}.zip"
63+
git archive --format=zip --prefix=IWAC-theme/ -o "$NAME" HEAD
64+
echo "name=$NAME" >> "$GITHUB_OUTPUT"
65+
66+
- name: Archive must be installable and free of dev tooling
67+
run: |
68+
NAME="${{ steps.zip.outputs.name }}"
69+
unzip -Z1 "$NAME" > /tmp/list
70+
71+
# Everything Omeka needs to load the theme.
72+
for f in config/theme.ini theme.jpg asset/css/style.css language/fr.mo \
73+
view/layout/layout.phtml helper/BrowseLayout.php LICENSE README.md; do
74+
grep -qx "IWAC-theme/$f" /tmp/list || { echo "::error::missing $f"; exit 1; }
75+
done
76+
77+
# Nothing that only exists to develop it.
78+
if grep -nEi 'IWAC-theme/(package(-lock)?\.json|gulpfile\.js|playwright\.config\.js|\.nvmrc|\.editorconfig|scripts/|test/|test-support/|e2e/|CLAUDE\.md|\.impeccable\.md|\.agents/|\.claude/|ROADMAP\.md|\.github/|language/.*\.pot?$)' /tmp/list; then
79+
echo "::error::development files leaked into the release archive — check .gitattributes export-ignore"
80+
exit 1
81+
fi
82+
83+
echo "$(wc -l < /tmp/list) files, $(du -h "$NAME" | cut -f1)"
84+
85+
- name: Publish release
86+
env:
87+
GH_TOKEN: ${{ github.token }}
88+
run: |
89+
TAG="${{ steps.v.outputs.tag }}"
90+
NAME="${{ steps.zip.outputs.name }}"
91+
if gh release view "$TAG" >/dev/null 2>&1; then
92+
gh release upload "$TAG" "$NAME" --clobber
93+
else
94+
gh release create "$TAG" "$NAME" --title "$TAG" --generate-notes
95+
fi

CITATION.cff

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
cff-version: 1.2.0
2+
title: "IWAC Theme: An Omeka S Theme for the Islam West Africa Collection"
3+
message: >-
4+
If you use this theme, or reuse its design system, please cite it
5+
using the metadata in this file.
6+
type: software
7+
authors:
8+
- given-names: Frédérick
9+
family-names: Madore
10+
orcid: "https://orcid.org/0000-0003-0959-2092"
11+
affiliation: University of Bayreuth
12+
repository-code: "https://github.com/fmadore/IWAC-theme"
13+
url: "https://islam.zmo.de/s/westafrica/"
14+
abstract: >-
15+
An Omeka S 4.2+ theme built for the Islam West Africa Collection
16+
(IWAC), an open-access archive of press articles, Islamic
17+
publications, archival documents and audiovisual records on Muslim
18+
public life in Benin, Burkina Faso, Côte d'Ivoire, Niger, Nigeria and
19+
Togo, hosted at Leibniz-Zentrum Moderner Orient (ZMO), Berlin. The
20+
theme implements a bilingual (English/French) "press archive" design
21+
register with an OKLCH design-token system derived from a single
22+
admin-set brand seed, a light/dark mode toggle, a per-site installable
23+
web app manifest, and WCAG 2.1 AA accessibility. Its design tokens are
24+
the single source of truth for the sibling IwacSearch and
25+
IwacVisualizations modules, which consume them via a generated
26+
tokens.json contract.
27+
keywords:
28+
- Omeka S
29+
- theme
30+
- digital humanities
31+
- digital archives
32+
- West Africa
33+
- Islam
34+
- design system
35+
- design tokens
36+
- accessibility
37+
- multilingual
38+
license: GPL-3.0-or-later
39+
version: 2.9.5
40+
date-released: "2026-08-05"
41+
references:
42+
- type: software
43+
title: Freedom
44+
abstract: >-
45+
The Omeka S theme that IWAC Theme was forked from in 2024, and has
46+
since diverged substantially from.
47+
authors:
48+
- name: Corporation for Digital Scholarship
49+
- given-names: Nelson
50+
family-names: Amaya
51+
repository-code: "https://github.com/omeka-s-themes/freedom"
52+
license: GPL-3.0-or-later
53+
version: 1.1.0

theme.jpg

210 KB
Loading

0 commit comments

Comments
 (0)