@clubedge/create-clubedge-app 0.42.0 → 0.42.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +11 -11
- package/package.json +3 -3
- package/template/SETUP.md +1 -1
- package/template/apps/api/package.json +1 -1
- package/template/apps/api-fastapi/package.json +1 -1
- package/template/apps/api-fastapi/pyproject.toml +1 -1
- package/template/apps/api-fastapi/uv.lock +1 -1
- package/template/apps/capacitor/assets/logo.svg +1 -0
- package/template/apps/capacitor/package.json +2 -1
- package/template/apps/capacitor/scripts/build.mjs +5 -1
- package/template/apps/capacitor/scripts/icons.mjs +106 -0
- package/template/apps/start/package.json +1 -1
- package/template/apps/start/public/.well-known/logo.svg +1 -1
- package/template/apps/start/public/apple-touch-icon.png +0 -0
- package/template/apps/start/public/favicon.ico +0 -0
- package/template/apps/start/public/favicon.svg +1 -0
- package/template/apps/start/src/components/auth/auth-page.tsx +1 -1
- package/template/apps/start/src/components/dashboard/dashboard-shell.tsx +1 -1
- package/template/apps/start/src/routes/__root.tsx +3 -1
- package/template/apps/start/src/routes/index.tsx +1 -1
- package/template/apps/start/src/routes/login.tsx +1 -1
- package/template/apps/vite/index.html +3 -1
- package/template/apps/vite/package.json +1 -1
- package/template/apps/vite/public/.well-known/logo.svg +1 -1
- package/template/apps/vite/public/apple-touch-icon.png +0 -0
- package/template/apps/vite/public/favicon.ico +0 -0
- package/template/apps/vite/public/favicon.svg +1 -0
- package/template/apps/vite/src/components/branding/clubedge-mark.tsx +5 -1
- package/template/apps/vite/src/components/dashboard/dashboard-shell.tsx +1 -1
- package/template/apps/vite/src/routes/index.tsx +1 -1
- package/template/apps/web/package.json +1 -1
- package/template/apps/web/public/.well-known/logo.svg +1 -1
- package/template/apps/web/src/app/apple-icon.png +0 -0
- package/template/apps/web/src/app/dashboard/_components/dashboard-shell.tsx +1 -1
- package/template/apps/web/src/app/favicon.ico +0 -0
- package/template/apps/web/src/app/icon.svg +1 -0
- package/template/apps/web/src/app/login/_components/auth-page.tsx +1 -1
- package/template/apps/web/src/app/login/page.tsx +1 -1
- package/template/apps/web/src/app/page.tsx +1 -1
- package/template/package.json +1 -1
- package/template/packages/auth/package.json +1 -1
- package/template/packages/auth-appwrite/package.json +1 -1
- package/template/packages/auth-better-auth/package.json +1 -1
- package/template/packages/auth-firebase/package.json +1 -1
- package/template/packages/auth-supabase/package.json +1 -1
- package/template/packages/cache/package.json +1 -1
- package/template/packages/cache-redis/package.json +1 -1
- package/template/packages/contract/package.json +1 -1
- package/template/packages/core/package.json +1 -1
- package/template/packages/db/package.json +1 -1
- package/template/packages/email/package.json +1 -1
- package/template/packages/email-resend/package.json +1 -1
- package/template/packages/email-smtp/package.json +1 -1
- package/template/packages/jobs/package.json +1 -1
- package/template/packages/jobs-bullmq/package.json +1 -1
- package/template/packages/jobs-inngest/package.json +1 -1
- package/template/packages/jobs-pg-boss/package.json +1 -1
- package/template/packages/local-db/package.json +1 -1
- package/template/packages/mobile/package.json +1 -1
- package/template/packages/observability/package.json +1 -1
- package/template/packages/observability-otel/package.json +1 -1
- package/template/packages/observability-sentry/package.json +1 -1
- package/template/packages/payments/package.json +1 -1
- package/template/packages/payments-stripe/package.json +1 -1
- package/template/packages/storage/package.json +1 -1
- package/template/packages/storage-s3/package.json +1 -1
- package/template/packages/storage-supabase/package.json +1 -1
- package/template/packages/ui/package.json +1 -1
- package/template.lock.json +10 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `create-clubedge-app` are documented here.
|
|
4
4
|
|
|
5
|
+
## 0.42.1
|
|
6
|
+
|
|
7
|
+
- Default to Starter `v0.27.1` (#140): new projects carry the Clubedge Starter brand, and their mobile app shows it.
|
|
8
|
+
- Each web app's logo is the new mark, shown whole: the pages no longer round its corners. Each app also has `favicon.ico`, a new `favicon.svg`, and an Apple touch icon.
|
|
9
|
+
- The mobile app shows the logo on its pages. The logo was in a `.well-known` folder, which Android leaves out of an app, so the Vite app now bundles it.
|
|
10
|
+
- The mobile app's icons and splash screens are made from `apps/shell/assets/logo.svg` instead of Capacitor's default.
|
|
11
|
+
- Upgrading: a logo you replaced comes back as a conflict in `logo.svg`, so keep yours. The [Starter's release notes](https://github.com/Clubedge/clubedge-starter/releases/tag/v0.27.1) cover replaced favicons and existing `android/` and `ios/` projects.
|
|
12
|
+
|
|
5
13
|
## 0.42.0
|
|
6
14
|
|
|
7
15
|
- **Mobile apps with Capacitor**: default to Starter `v0.27.0` (#138). `--framework vite --api hono --shell capacitor` (or `--api fastapi`) packages the Vite frontend as an Android and iOS app in `apps/shell` (#135):
|
package/README.md
CHANGED
|
@@ -223,7 +223,7 @@ pnpm dlx @clubedge/create-clubedge-app my-app --yes --no-git --framework tanstac
|
|
|
223
223
|
pnpm dlx @clubedge/create-clubedge-app my-app --ref main
|
|
224
224
|
|
|
225
225
|
# Reproduce a specific Starter release or commit
|
|
226
|
-
pnpm dlx @clubedge/create-clubedge-app my-app --ref v0.27.
|
|
226
|
+
pnpm dlx @clubedge/create-clubedge-app my-app --ref v0.27.1
|
|
227
227
|
pnpm dlx @clubedge/create-clubedge-app my-app --ref <commit-sha>
|
|
228
228
|
|
|
229
229
|
# Test local Starter changes before releasing them
|
|
@@ -242,7 +242,7 @@ pnpm clubedge add email resend payments stripe # several modules as
|
|
|
242
242
|
pnpm clubedge remove storage payments
|
|
243
243
|
pnpm dlx @clubedge/create-clubedge-app add infra local --dry-run
|
|
244
244
|
pnpm dlx @clubedge/create-clubedge-app@latest upgrade # to the newest CLI's Starter release
|
|
245
|
-
pnpm dlx @clubedge/create-clubedge-app upgrade --ref v0.27.
|
|
245
|
+
pnpm dlx @clubedge/create-clubedge-app upgrade --ref v0.27.1 # or a specific tag, branch, or commit
|
|
246
246
|
```
|
|
247
247
|
|
|
248
248
|
The CLI renders the project twice, from the Starter commit and modules recorded in your `package.json` and from the new state, and merges the difference into your project. The new state has other modules for `add` and `remove`, and the newer Starter with the same modules for `upgrade`. Modules a newer Starter introduces start as `none` where possible, so an upgrade never adds a service on its own.
|
|
@@ -358,7 +358,7 @@ docker compose --env-file .env.production run --rm web node /app/migrate.mjs #
|
|
|
358
358
|
docker compose --env-file .env.production up -d # --build builds the images on the server
|
|
359
359
|
```
|
|
360
360
|
|
|
361
|
-
`deploy` prints these steps, with the `IMAGE_PREFIX` of your repository when `origin` is on GitHub. To update, publish a release, then on the server `docker compose --env-file .env.production pull` (or set `TAG` to the new version), run the migrations, and `up -d` again. Running `deploy` again writes the files that are missing and never overwrites one: it keeps a `Caddyfile` or workflow you changed, and says so, and stops when `compose.yaml` differs from the one it writes, so move yours away to get the new one. Compose prefers `compose.yaml` to the Starter's `docker-compose.yml`, so run the local one by name: `docker compose -f docker-compose.yml up --build`, which `pnpm docker:dev` does since Starter v0.27.
|
|
361
|
+
`deploy` prints these steps, with the `IMAGE_PREFIX` of your repository when `origin` is on GitHub. To update, publish a release, then on the server `docker compose --env-file .env.production pull` (or set `TAG` to the new version), run the migrations, and `up -d` again. Running `deploy` again writes the files that are missing and never overwrites one: it keeps a `Caddyfile` or workflow you changed, and says so, and stops when `compose.yaml` differs from the one it writes, so move yours away to get the new one. Compose prefers `compose.yaml` to the Starter's `docker-compose.yml`, so run the local one by name: `docker compose -f docker-compose.yml up --build`, which `pnpm docker:dev` does since Starter v0.27.1.
|
|
362
362
|
|
|
363
363
|
### Client addresses
|
|
364
364
|
|
|
@@ -381,27 +381,27 @@ Projects created with `--infra neon` also have `.github/workflows/preview.yml`,
|
|
|
381
381
|
Each CLI release is tested against one specific Starter release:
|
|
382
382
|
|
|
383
383
|
```text
|
|
384
|
-
create-clubedge-app v0.42.
|
|
384
|
+
create-clubedge-app v0.42.1
|
|
385
385
|
|
|
|
386
386
|
v
|
|
387
|
-
Clubedge Starter v0.27.
|
|
388
|
-
commit
|
|
387
|
+
Clubedge Starter v0.27.1
|
|
388
|
+
commit 997d71d74775352d30dc2bb25017f46ef43f4fd8
|
|
389
389
|
```
|
|
390
390
|
|
|
391
391
|
The current relationship is:
|
|
392
392
|
|
|
393
393
|
| CLI release | Default Starter release | Meaning |
|
|
394
394
|
| --- | --- | --- |
|
|
395
|
-
| `create-clubedge-app@0.42.
|
|
395
|
+
| `create-clubedge-app@0.42.1` | `clubedge-starter@v0.27.1` | The CLI's required, tested default |
|
|
396
396
|
|
|
397
397
|
This means the same CLI version always scaffolds the same Starter revision by default. The CLI does not silently follow Starter `main`.
|
|
398
398
|
|
|
399
|
-
The `v0.27.
|
|
400
|
-
`
|
|
399
|
+
The `v0.27.1` tag is expected to resolve to commit
|
|
400
|
+
`997d71d74775352d30dc2bb25017f46ef43f4fd8`. The CLI verifies this before
|
|
401
401
|
scaffolding with the default reference and fails rather than silently using a
|
|
402
402
|
moved tag.
|
|
403
403
|
|
|
404
|
-
When the Starter changes, its maintainers first publish a new versioned release, such as `v0.27.
|
|
404
|
+
When the Starter changes, its maintainers first publish a new versioned release, such as `v0.27.1`. The CLI is then updated to use that release, all generated-project checks must pass, and a new CLI version is published. This keeps Starter and CLI releases independently versioned while preserving a tested compatibility relationship.
|
|
405
405
|
|
|
406
406
|
Every generated project records its CLI version, Starter repository, Starter ref, Starter commit, framework, and modules in `package.json` and `README.md`.
|
|
407
407
|
|
|
@@ -456,7 +456,7 @@ CI packs the CLI with `npm pack`, scaffolds clean projects from the packed tarba
|
|
|
456
456
|
1. Make and validate changes in `clubedge-starter`.
|
|
457
457
|
2. Run lint, typecheck, unit tests, browser tests, and production build.
|
|
458
458
|
3. Update the Starter package versions.
|
|
459
|
-
4. Commit `main`, create a release tag such as `v0.27.
|
|
459
|
+
4. Commit `main`, create a release tag such as `v0.27.1`, and publish the Starter release.
|
|
460
460
|
|
|
461
461
|
### CLI maintainers
|
|
462
462
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clubedge/create-clubedge-app",
|
|
3
|
-
"version": "0.42.
|
|
3
|
+
"version": "0.42.1",
|
|
4
4
|
"description": "Create React apps from Clubedge Starter with a CLI or local MCP server.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.9.0",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
},
|
|
25
25
|
"clubedge": {
|
|
26
26
|
"starterRepository": "Clubedge/clubedge-starter",
|
|
27
|
-
"starterRef": "v0.27.
|
|
28
|
-
"starterCommit": "
|
|
27
|
+
"starterRef": "v0.27.1",
|
|
28
|
+
"starterCommit": "997d71d74775352d30dc2bb25017f46ef43f4fd8"
|
|
29
29
|
},
|
|
30
30
|
"license": "Apache-2.0",
|
|
31
31
|
"repository": {
|
package/template/SETUP.md
CHANGED
|
@@ -748,7 +748,7 @@ Installed apps keep calling the contract they shipped with, so change `openapi.y
|
|
|
748
748
|
|
|
749
749
|
1. Set your app's id in `apps/shell/capacitor.config.ts`: a reverse-domain name you own, such as `com.yourcompany.app`. It becomes permanent once the Android and iOS projects exist and a store lists the app, so set it before the first build. The app's name comes from `apps/web/src/config/site.json`.
|
|
750
750
|
2. Set `WEB_URL` in `apps/shell/.env.local` to the website's public `https://` address, such as `https://app.example.com`. The build refuses any other: the app sends its session there.
|
|
751
|
-
3. Run `pnpm --filter @clubedge/shell android` (or `ios`). It builds the web app for the app, creates `apps/shell/android` (or `apps/shell/ios`) on the first run, copies the build into it, and opens Android Studio (or Xcode), where you run the app on a device or an emulator. Commit `android/` and `ios/`: from then on they are your app's own, with its icons, permissions, and signing settings.
|
|
751
|
+
3. Run `pnpm --filter @clubedge/shell android` (or `ios`). It builds the web app for the app, creates `apps/shell/android` (or `apps/shell/ios`) on the first run, copies the build into it, and opens Android Studio (or Xcode), where you run the app on a device or an emulator. Commit `android/` and `ios/`: from then on they are your app's own, with its icons, permissions, and signing settings. The first run also makes the app's icons and splash screens from `apps/shell/assets/logo.svg`, the white mark on the brand's blue square, with Capacitor's asset tool (run through npx, so it needs the network then); after changing it, run `pnpm --filter @clubedge/shell icons`, and set the backgrounds to match it at the top of `apps/shell/scripts/icons.mjs`.
|
|
752
752
|
|
|
753
753
|
After changing the web app, `pnpm --filter @clubedge/shell sync` copies a new build into the native projects. Release builds and store listings are made in Android Studio and Xcode, as Capacitor's guides for [Google Play](https://capacitorjs.com/docs/android/deploying-to-google-play) and the [App Store](https://capacitorjs.com/docs/ios/deploying-to-app-store) describe. The project's CI builds a debug APK too; set a `WEB_URL` repository variable so that it calls your website.
|
|
754
754
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 512 512" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><rect width="512" height="512" fill="#2563EB"/><g fill="#FFFFFF"><rect x="138.24" y="138.24" width="67.291" height="67.291" rx="12.617"/><rect x="222.354" y="138.24" width="67.291" height="67.291" rx="12.617"/><rect x="138.24" y="222.354" width="67.291" height="67.291" rx="12.617"/><rect x="138.24" y="306.468" width="67.291" height="67.291" rx="12.617"/><rect x="222.354" y="306.468" width="67.291" height="67.291" rx="12.617"/><circle cx="340.114" cy="171.886" r="33.645"/><circle cx="340.114" cy="340.114" r="33.645"/></g></svg>
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clubedge/capacitor",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.1",
|
|
4
4
|
"private": true,
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"android": "node --env-file-if-exists=.env.local scripts/build.mjs android --open",
|
|
9
|
+
"icons": "node scripts/icons.mjs",
|
|
9
10
|
"ios": "node --env-file-if-exists=.env.local scripts/build.mjs ios --open",
|
|
10
11
|
"sync": "node --env-file-if-exists=.env.local scripts/build.mjs",
|
|
11
12
|
"typecheck": "tsc --noEmit"
|
|
@@ -11,6 +11,7 @@ import { spawnSync } from "node:child_process";
|
|
|
11
11
|
import { existsSync } from "node:fs";
|
|
12
12
|
import { join } from "node:path";
|
|
13
13
|
import { pathToFileURL } from "node:url";
|
|
14
|
+
import { makeIcons } from "./icons.mjs";
|
|
14
15
|
|
|
15
16
|
const shellDirectory = join(import.meta.dirname, "..");
|
|
16
17
|
const webDirectory = join(import.meta.dirname, "../../web");
|
|
@@ -87,7 +88,10 @@ function build(args) {
|
|
|
87
88
|
const capacitor = join(shellDirectory, "node_modules/@capacitor/cli/bin/capacitor");
|
|
88
89
|
for (const platform of targets) {
|
|
89
90
|
// cap add creates the native project and copies the build into it; cap sync updates both.
|
|
90
|
-
|
|
91
|
+
// A new project gets its icons and splash screens from the logo (icons.mjs).
|
|
92
|
+
const created = !exists(platform);
|
|
93
|
+
run(capacitor, [created ? "add" : "sync", platform], { cwd: shellDirectory });
|
|
94
|
+
if (created) makeIcons(platform);
|
|
91
95
|
}
|
|
92
96
|
if (options.includes("--open")) {
|
|
93
97
|
for (const platform of targets) run(capacitor, ["open", platform], { cwd: shellDirectory });
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// The app's icons and splash screens, made from assets/logo.svg by Capacitor's asset tool:
|
|
2
|
+
//
|
|
3
|
+
// node scripts/icons.mjs [android] [ios]
|
|
4
|
+
//
|
|
5
|
+
// build.mjs runs it when it creates a native project; run it again (pnpm icons) after changing
|
|
6
|
+
// the art. Without a platform, it makes them for the native projects that exist. The tool runs
|
|
7
|
+
// through npx at a fixed version, so the project installs nothing for it; it needs the network
|
|
8
|
+
// the first time.
|
|
9
|
+
import { spawnSync } from "node:child_process";
|
|
10
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
11
|
+
import { join, relative } from "node:path";
|
|
12
|
+
import { pathToFileURL } from "node:url";
|
|
13
|
+
|
|
14
|
+
const shellDirectory = join(import.meta.dirname, "..");
|
|
15
|
+
const logoDirectory = join(import.meta.dirname, "../assets");
|
|
16
|
+
const platforms = ["android", "ios"];
|
|
17
|
+
|
|
18
|
+
// assets/logo.svg is the white mark on a full blue square, so the icon's background is the same
|
|
19
|
+
// blue and the icon fills; the splash screens show it as a tile on the app's light and dark
|
|
20
|
+
// backgrounds. Match these to your own art.
|
|
21
|
+
const iconBackground = "#2563eb";
|
|
22
|
+
const splashBackground = "#ffffff";
|
|
23
|
+
const splashBackgroundDark = "#151515";
|
|
24
|
+
|
|
25
|
+
/** The asset tool's arguments for one platform's icons and splash screens. */
|
|
26
|
+
export function iconArguments(platform) {
|
|
27
|
+
return [
|
|
28
|
+
"--yes",
|
|
29
|
+
"@capacitor/assets@3.0.5",
|
|
30
|
+
"generate",
|
|
31
|
+
`--${platform}`,
|
|
32
|
+
"--assetPath",
|
|
33
|
+
relative(shellDirectory, logoDirectory),
|
|
34
|
+
"--iconBackgroundColor",
|
|
35
|
+
iconBackground,
|
|
36
|
+
"--iconBackgroundColorDark",
|
|
37
|
+
iconBackground,
|
|
38
|
+
"--splashBackgroundColor",
|
|
39
|
+
splashBackground,
|
|
40
|
+
"--splashBackgroundColorDark",
|
|
41
|
+
splashBackgroundDark,
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Where each native project keeps its app icons.
|
|
46
|
+
const iconDirectories = {
|
|
47
|
+
android: ["android/app/src/main/res", (name) => name.startsWith("mipmap")],
|
|
48
|
+
ios: ["ios/App/App/Assets.xcassets", (name) => name === "AppIcon.appiconset"],
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/** When the platform's icon files last changed, so a run that wrote none shows. */
|
|
52
|
+
function iconsChangedAt(platform) {
|
|
53
|
+
const [directory, isIconFolder] = iconDirectories[platform];
|
|
54
|
+
const root = join(shellDirectory, directory);
|
|
55
|
+
if (!existsSync(root)) return 0;
|
|
56
|
+
let latest = 0;
|
|
57
|
+
for (const folder of readdirSync(root).filter(isIconFolder)) {
|
|
58
|
+
for (const file of readdirSync(join(root, folder))) {
|
|
59
|
+
latest = Math.max(latest, statSync(join(root, folder, file)).mtimeMs);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return latest;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Makes one platform's icons and splash screens. When it cannot, as offline, the app keeps
|
|
67
|
+
* Capacitor's own: it says so and returns false, rather than stopping a build. The asset tool
|
|
68
|
+
* skips a platform without a native project and still succeeds, so success also means that it
|
|
69
|
+
* wrote the platform's icons.
|
|
70
|
+
*/
|
|
71
|
+
export function makeIcons(platform) {
|
|
72
|
+
if (!existsSync(join(shellDirectory, platform))) {
|
|
73
|
+
console.error(`The app has no ${platform} project yet: run pnpm ${platform} to create it.`);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const before = iconsChangedAt(platform);
|
|
77
|
+
const windows = process.platform === "win32";
|
|
78
|
+
const { status } = spawnSync(windows ? "npx.cmd" : "npx", iconArguments(platform), {
|
|
79
|
+
cwd: shellDirectory,
|
|
80
|
+
stdio: "inherit",
|
|
81
|
+
shell: windows,
|
|
82
|
+
});
|
|
83
|
+
if (status === 0 && iconsChangedAt(platform) > before) return true;
|
|
84
|
+
console.warn(
|
|
85
|
+
`The ${platform} app keeps Capacitor's default icon for now: run pnpm icons to make it from the logo.`,
|
|
86
|
+
);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
91
|
+
const named = process.argv.slice(2);
|
|
92
|
+
const unknown = named.find((arg) => !platforms.includes(arg));
|
|
93
|
+
if (unknown) {
|
|
94
|
+
console.error(`Unknown platform "${unknown}": choose android or ios.`);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
const targets =
|
|
98
|
+
named.length > 0
|
|
99
|
+
? named
|
|
100
|
+
: platforms.filter((platform) => existsSync(join(shellDirectory, platform)));
|
|
101
|
+
if (targets.length === 0) {
|
|
102
|
+
console.error("The app has no native project yet: run pnpm android or pnpm ios to create one.");
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
if (!targets.map(makeIcons).every(Boolean)) process.exit(1);
|
|
106
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><g fill="#2563EB"><rect x="0" y="0" width="16" height="16" rx="3"/><rect x="20" y="0" width="16" height="16" rx="3"/><rect x="0" y="20" width="16" height="16" rx="3"/><rect x="0" y="40" width="16" height="16" rx="3"/><rect x="20" y="40" width="16" height="16" rx="3"/><circle cx="48" cy="8" r="8"/><circle cx="48" cy="48" r="8"/></g></svg>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><g fill="#2563EB"><rect x="2" y="2" width="16" height="16" rx="3"/><rect x="22" y="2" width="16" height="16" rx="3"/><rect x="2" y="22" width="16" height="16" rx="3"/><rect x="2" y="42" width="16" height="16" rx="3"/><rect x="22" y="42" width="16" height="16" rx="3"/><circle cx="50" cy="10" r="8"/><circle cx="50" cy="50" r="8"/></g></svg>
|
|
@@ -24,7 +24,7 @@ export function AuthPage({
|
|
|
24
24
|
className="rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
|
25
25
|
to="/"
|
|
26
26
|
>
|
|
27
|
-
<ClubedgeMark className="size-12
|
|
27
|
+
<ClubedgeMark className="size-12" />
|
|
28
28
|
</Link>
|
|
29
29
|
<div className="grid gap-1.5">
|
|
30
30
|
<h1 className="text-2xl font-semibold tracking-tight">{title}</h1>
|
|
@@ -176,7 +176,7 @@ function Title({ className }: { className?: string }) {
|
|
|
176
176
|
href="#overview"
|
|
177
177
|
className={cn("inline-flex min-w-0 items-center gap-2.5 font-semibold", className)}
|
|
178
178
|
>
|
|
179
|
-
<ClubedgeMark alt="" className="size-6 shrink-0
|
|
179
|
+
<ClubedgeMark alt="" className="size-6 shrink-0" />
|
|
180
180
|
<span className="truncate">{siteConfig.shortName}</span>
|
|
181
181
|
</a>
|
|
182
182
|
);
|
|
@@ -30,7 +30,9 @@ export const Route = createRootRoute({
|
|
|
30
30
|
],
|
|
31
31
|
links: [
|
|
32
32
|
{ rel: "stylesheet", href: appCss },
|
|
33
|
-
{ rel: "icon", href: "/favicon.ico" },
|
|
33
|
+
{ rel: "icon", href: "/favicon.ico", sizes: "48x48" },
|
|
34
|
+
{ rel: "icon", href: "/favicon.svg", type: "image/svg+xml" },
|
|
35
|
+
{ rel: "apple-touch-icon", href: "/apple-touch-icon.png" },
|
|
34
36
|
],
|
|
35
37
|
scripts: [{ children: themeBootstrap }],
|
|
36
38
|
}),
|
|
@@ -64,7 +64,7 @@ function LandingPage() {
|
|
|
64
64
|
className="flex shrink-0 items-center gap-2.5 rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
65
65
|
to="/"
|
|
66
66
|
>
|
|
67
|
-
<ClubedgeMark alt="" className="size-9
|
|
67
|
+
<ClubedgeMark alt="" className="size-9" priority />
|
|
68
68
|
<span className="hidden text-sm font-semibold tracking-tight min-[380px]:inline">
|
|
69
69
|
{siteConfig.name}
|
|
70
70
|
</span>
|
|
@@ -71,7 +71,7 @@ function LoginPage() {
|
|
|
71
71
|
className="rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
|
72
72
|
to="/"
|
|
73
73
|
>
|
|
74
|
-
<ClubedgeMark className="size-12
|
|
74
|
+
<ClubedgeMark className="size-12" />
|
|
75
75
|
</Link>
|
|
76
76
|
<div className="grid gap-1.5">
|
|
77
77
|
<h1 className="text-2xl font-semibold tracking-tight">
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
<!-- vite.config.ts fills in the name and description from src/config/site.json. -->
|
|
8
8
|
<title>%SITE_NAME%</title>
|
|
9
9
|
<meta name="description" content="%SITE_DESCRIPTION%" />
|
|
10
|
-
<link rel="icon" href="/favicon.ico" />
|
|
10
|
+
<link rel="icon" href="/favicon.ico" sizes="48x48" />
|
|
11
|
+
<link rel="icon" href="/favicon.svg" type="image/svg+xml" />
|
|
12
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
11
13
|
<!-- Applies the saved or preferred theme before first paint to avoid a flash. -->
|
|
12
14
|
<script>
|
|
13
15
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><g fill="#2563EB"><rect x="0" y="0" width="16" height="16" rx="3"/><rect x="20" y="0" width="16" height="16" rx="3"/><rect x="0" y="20" width="16" height="16" rx="3"/><rect x="0" y="40" width="16" height="16" rx="3"/><rect x="20" y="40" width="16" height="16" rx="3"/><circle cx="48" cy="8" r="8"/><circle cx="48" cy="48" r="8"/></g></svg>
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><g fill="#2563EB"><rect x="2" y="2" width="16" height="16" rx="3"/><rect x="22" y="2" width="16" height="16" rx="3"/><rect x="2" y="22" width="16" height="16" rx="3"/><rect x="2" y="42" width="16" height="16" rx="3"/><rect x="22" y="42" width="16" height="16" rx="3"/><circle cx="50" cy="10" r="8"/><circle cx="50" cy="50" r="8"/></g></svg>
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// Imported, so the build carries the logo in its own files: a folder whose name starts with a dot,
|
|
2
|
+
// such as .well-known, never reaches the mobile app, since Android leaves those out of an app.
|
|
3
|
+
import logo from "../../../public/.well-known/logo.svg";
|
|
4
|
+
|
|
1
5
|
type ClubedgeMarkProps = {
|
|
2
6
|
alt?: string;
|
|
3
7
|
className?: string;
|
|
@@ -17,7 +21,7 @@ export function ClubedgeMark({
|
|
|
17
21
|
fetchPriority={priority ? "high" : "auto"}
|
|
18
22
|
height={512}
|
|
19
23
|
loading={priority ? "eager" : "lazy"}
|
|
20
|
-
src=
|
|
24
|
+
src={logo}
|
|
21
25
|
width={512}
|
|
22
26
|
/>
|
|
23
27
|
);
|
|
@@ -176,7 +176,7 @@ function Title({ className }: { className?: string }) {
|
|
|
176
176
|
href="#overview"
|
|
177
177
|
className={cn("inline-flex min-w-0 items-center gap-2.5 font-semibold", className)}
|
|
178
178
|
>
|
|
179
|
-
<ClubedgeMark alt="" className="size-6 shrink-0
|
|
179
|
+
<ClubedgeMark alt="" className="size-6 shrink-0" />
|
|
180
180
|
<span className="truncate">{siteConfig.shortName}</span>
|
|
181
181
|
</a>
|
|
182
182
|
);
|
|
@@ -54,7 +54,7 @@ export function LandingPage() {
|
|
|
54
54
|
className="flex shrink-0 items-center gap-2.5 rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
55
55
|
to="/"
|
|
56
56
|
>
|
|
57
|
-
<ClubedgeMark alt="" className="size-9
|
|
57
|
+
<ClubedgeMark alt="" className="size-9" priority />
|
|
58
58
|
<span className="hidden text-sm font-semibold tracking-tight min-[380px]:inline">
|
|
59
59
|
{siteConfig.name}
|
|
60
60
|
</span>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="56" height="56" viewBox="0 0 56 56" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><g fill="#2563EB"><rect x="0" y="0" width="16" height="16" rx="3"/><rect x="20" y="0" width="16" height="16" rx="3"/><rect x="0" y="20" width="16" height="16" rx="3"/><rect x="0" y="40" width="16" height="16" rx="3"/><rect x="20" y="40" width="16" height="16" rx="3"/><circle cx="48" cy="8" r="8"/><circle cx="48" cy="48" r="8"/></g></svg>
|
|
Binary file
|
|
@@ -180,7 +180,7 @@ function Title({ className }: { className?: string }) {
|
|
|
180
180
|
href="#overview"
|
|
181
181
|
className={cn("inline-flex min-w-0 items-center gap-2.5 font-semibold", className)}
|
|
182
182
|
>
|
|
183
|
-
<ClubedgeMark alt="" className="size-6 shrink-0
|
|
183
|
+
<ClubedgeMark alt="" className="size-6 shrink-0" />
|
|
184
184
|
<span className="truncate">{siteConfig.shortName}</span>
|
|
185
185
|
</Link>
|
|
186
186
|
);
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60" role="img" aria-label="Clubedge Starter"><title>Clubedge Starter</title><g fill="#2563EB"><rect x="2" y="2" width="16" height="16" rx="3"/><rect x="22" y="2" width="16" height="16" rx="3"/><rect x="2" y="22" width="16" height="16" rx="3"/><rect x="2" y="42" width="16" height="16" rx="3"/><rect x="22" y="42" width="16" height="16" rx="3"/><circle cx="50" cy="10" r="8"/><circle cx="50" cy="50" r="8"/></g></svg>
|
|
@@ -24,7 +24,7 @@ export function AuthPage({
|
|
|
24
24
|
className="rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
|
25
25
|
href="/"
|
|
26
26
|
>
|
|
27
|
-
<ClubedgeMark className="size-12
|
|
27
|
+
<ClubedgeMark className="size-12" />
|
|
28
28
|
</Link>
|
|
29
29
|
<div className="grid gap-1.5">
|
|
30
30
|
<h1 className="text-2xl font-semibold tracking-tight">{title}</h1>
|
|
@@ -57,7 +57,7 @@ export default async function LoginPage({ searchParams }: LoginPageProps) {
|
|
|
57
57
|
className="rounded-xl outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background"
|
|
58
58
|
href="/"
|
|
59
59
|
>
|
|
60
|
-
<ClubedgeMark className="size-12
|
|
60
|
+
<ClubedgeMark className="size-12" />
|
|
61
61
|
</Link>
|
|
62
62
|
<div className="grid gap-1.5">
|
|
63
63
|
<h1 className="text-2xl font-semibold tracking-tight">
|
|
@@ -60,7 +60,7 @@ export default function LandingPage() {
|
|
|
60
60
|
className="flex shrink-0 items-center gap-2.5 rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
61
61
|
href="/"
|
|
62
62
|
>
|
|
63
|
-
<ClubedgeMark alt="" className="size-9
|
|
63
|
+
<ClubedgeMark alt="" className="size-9" priority />
|
|
64
64
|
<span className="hidden text-sm font-semibold tracking-tight min-[380px]:inline">
|
|
65
65
|
{siteConfig.name}
|
|
66
66
|
</span>
|
package/template/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clubedge/observability",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.1",
|
|
4
4
|
"description": "Observability interface: error reports and spans for @clubedge/core's telemetry hooks, and an in-memory provider for tests.",
|
|
5
5
|
"private": true,
|
|
6
6
|
"license": "Apache-2.0",
|
package/template.lock.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"repository": "Clubedge/clubedge-starter",
|
|
3
|
-
"ref": "v0.27.
|
|
4
|
-
"commit": "
|
|
3
|
+
"ref": "v0.27.1",
|
|
4
|
+
"commit": "997d71d74775352d30dc2bb25017f46ef43f4fd8",
|
|
5
5
|
"files": [
|
|
6
6
|
".dockerignore",
|
|
7
7
|
".env.example",
|
|
@@ -195,10 +195,12 @@
|
|
|
195
195
|
"apps/api/src/tracing.ts",
|
|
196
196
|
"apps/api/tsconfig.json",
|
|
197
197
|
"apps/capacitor/.env.example",
|
|
198
|
+
"apps/capacitor/assets/logo.svg",
|
|
198
199
|
"apps/capacitor/capacitor.config.ts",
|
|
199
200
|
"apps/capacitor/clubedge.stack.json",
|
|
200
201
|
"apps/capacitor/package.json",
|
|
201
202
|
"apps/capacitor/scripts/build.mjs",
|
|
203
|
+
"apps/capacitor/scripts/icons.mjs",
|
|
202
204
|
"apps/capacitor/tsconfig.json",
|
|
203
205
|
"apps/start/.env.example",
|
|
204
206
|
"apps/start/AGENTS.md",
|
|
@@ -208,7 +210,9 @@
|
|
|
208
210
|
"apps/start/netlify.toml",
|
|
209
211
|
"apps/start/package.json",
|
|
210
212
|
"apps/start/public/.well-known/logo.svg",
|
|
213
|
+
"apps/start/public/apple-touch-icon.png",
|
|
211
214
|
"apps/start/public/favicon.ico",
|
|
215
|
+
"apps/start/public/favicon.svg",
|
|
212
216
|
"apps/start/scripts/check-env.ts",
|
|
213
217
|
"apps/start/scripts/check-services.ts",
|
|
214
218
|
"apps/start/src/components/auth/auth-form-controls.tsx",
|
|
@@ -320,7 +324,9 @@
|
|
|
320
324
|
"apps/vite/index.html",
|
|
321
325
|
"apps/vite/package.json",
|
|
322
326
|
"apps/vite/public/.well-known/logo.svg",
|
|
327
|
+
"apps/vite/public/apple-touch-icon.png",
|
|
323
328
|
"apps/vite/public/favicon.ico",
|
|
329
|
+
"apps/vite/public/favicon.svg",
|
|
324
330
|
"apps/vite/server.mjs",
|
|
325
331
|
"apps/vite/src/components/billing/billing-card.tsx",
|
|
326
332
|
"apps/vite/src/components/branding/clubedge-mark.tsx",
|
|
@@ -382,6 +388,7 @@
|
|
|
382
388
|
"apps/web/src/app/api/jobs/run/route.ts",
|
|
383
389
|
"apps/web/src/app/api/ready/route.ts",
|
|
384
390
|
"apps/web/src/app/api/webhooks/payments/route.ts",
|
|
391
|
+
"apps/web/src/app/apple-icon.png",
|
|
385
392
|
"apps/web/src/app/auth/callback/route.ts",
|
|
386
393
|
"apps/web/src/app/dashboard/_components/account-button.tsx",
|
|
387
394
|
"apps/web/src/app/dashboard/_components/billing-actions.ts",
|
|
@@ -395,6 +402,7 @@
|
|
|
395
402
|
"apps/web/src/app/error.tsx",
|
|
396
403
|
"apps/web/src/app/favicon.ico",
|
|
397
404
|
"apps/web/src/app/forgot-password/page.tsx",
|
|
405
|
+
"apps/web/src/app/icon.svg",
|
|
398
406
|
"apps/web/src/app/layout.tsx",
|
|
399
407
|
"apps/web/src/app/login/_components/auth-form-controls.tsx",
|
|
400
408
|
"apps/web/src/app/login/_components/auth-page.tsx",
|