diff --git a/README.md b/README.md index 5e971dc4..76fed1d6 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,13 @@  ·  Roadmap to 1.0

+ + + + + FileKit is supported by the Kotlin Foundation Grants Program. Read the announcement. + + ## Installation diff --git a/brand/README.md b/brand/README.md index a6d46e16..6eb1a2dd 100644 --- a/brand/README.md +++ b/brand/README.md @@ -15,8 +15,9 @@ npm run render -- sample # only the sample app icons and logos npm run preview # serve the sources to tweak them live in a browser ``` -`npm run preview` prints two URLs: the brand board (every export and the palette on one page) and the live -hero (`src/hero.html`). The hero fills the browser window, so resizing the window previews other formats. +`npm run preview` prints three URLs: the brand board (every export and the palette on one page), the live +hero (`src/hero.html`) and the grant banner (`src/banner.html`, configured under `banner` in `palette.json`). +The hero fills the browser window, so resizing the window previews other formats. Add `?seed=3.6` to the hero URL to try another background composition without editing any file. Rendering runs locally only; CI does not build these assets. @@ -28,6 +29,8 @@ Rendering runs locally only; CI does not build these assets. | README hero | `brand/exports/readme-hero.webp` | 1920×960, rounded corners | | GitHub social preview | `brand/exports/social-preview.jpg` | 1280×640, upload in the repo settings | | Docs hero | `docs/brand/hero.webp` | 1920×1080, rounded corners | +| README grant banner | `brand/exports/grant-banner-{dark,light}.webp` | 1920×240, rounded corners, with the call to action | +| Docs grant banner | `docs/brand/grant-banner-{dark,light}.webp` | 1920×240 | | Open Graph image | `docs/brand/og.jpg` | 1200×630 | | Logo for light backgrounds | `docs/brand/logo-light.svg` | mark + wordmark, outlined | | Logo for dark backgrounds | `docs/brand/logo-dark.svg` | mark + wordmark, outlined | diff --git a/brand/exports/grant-banner-dark.webp b/brand/exports/grant-banner-dark.webp new file mode 100644 index 00000000..88110aa5 Binary files /dev/null and b/brand/exports/grant-banner-dark.webp differ diff --git a/brand/exports/grant-banner-light.webp b/brand/exports/grant-banner-light.webp new file mode 100644 index 00000000..dfe923d3 Binary files /dev/null and b/brand/exports/grant-banner-light.webp differ diff --git a/brand/palette.json b/brand/palette.json index 59f93d11..1fb3f8e8 100644 --- a/brand/palette.json +++ b/brand/palette.json @@ -62,5 +62,39 @@ "grain": 0, "focus": 0.5 } + }, + "banner": { + "seed": 9.1, + "pieces": 90, + "background": { + "dark": { + "grain": 0.06, + "focus": 0.45 + }, + "light": { + "grain": 0.05, + "focus": -0.5 + } + }, + "text": { + "dark": "#FFF1D0", + "light": "#0F5A36" + }, + "confetti": { + "dark": [ + "#F2D37A", + "#FFF1D0", + "#FFFFFF", + "#3DBA6E", + "#E3C266" + ], + "light": [ + "#0F5A36", + "#2E9A5C", + "#E7C25E", + "#FFFFFF", + "#D8B24C" + ] + } } } diff --git a/brand/render.mjs b/brand/render.mjs index 8179486c..be2b698a 100644 --- a/brand/render.mjs +++ b/brand/render.mjs @@ -5,7 +5,7 @@ // npm run render -- sample # only the sample app icons // npm run preview # serve the sources to tweak them live in a browser // -// Raster images are screenshots of src/hero.html taken by headless Chromium (Playwright). +// Raster images are screenshots of src/hero.html and src/banner.html taken by headless Chromium (Playwright). // SVG logos are generated from src/mark.js and the outlines of Inter Bold Italic (opentype.js). // App icons are screenshots of src/icon.html; .icns and .ico files are assembled from those PNGs. @@ -30,6 +30,12 @@ const HEROES = [ { file: 'docs/brand/hero.webp', width: 1920, height: 1080, theme: 'dark', rounded: true }, { file: 'docs/brand/og.jpg', width: 1200, height: 630, theme: 'dark' }, ]; + +// Grant banner (src/banner.html), in both themes. The README one is a link, so it carries its call to action. +const BANNERS = ['dark', 'light'].flatMap((theme) => [ + { file: `brand/exports/grant-banner-${theme}.webp`, width: 1920, height: 240, theme, rounded: true, cta: true }, + { file: `docs/brand/grant-banner-${theme}.webp`, width: 1920, height: 240, theme }, +]); const QUALITY = 0.92; // --------------------------------------------------------------------------------------------- @@ -135,6 +141,7 @@ if (process.argv[2] === '--preview') { const { base } = await serve(4173); console.log(`Brand board: ${base}/brand/src/board.html`); console.log(`Live hero: ${base}/brand/src/hero.html (resize the window to try formats, add ?seed=3.6 to try a composition)`); + console.log(`Grant banner: ${base}/brand/src/banner.html?cta=1 (add &theme=light or &seed=3.6)`); console.log('Ctrl+C to stop.'); } else { await render(process.argv[2]); @@ -149,7 +156,7 @@ async function render(filter) { console.log('wrote', svg.file); } - const heroes = HEROES.filter((h) => wanted(h.file)); + const heroes = [...HEROES, ...BANNERS].filter((h) => wanted(h.file)); const icons = ICONS.filter((i) => wanted(i.file)); if (heroes.length === 0 && icons.length === 0) return; const { server, base } = await serve(); @@ -158,7 +165,8 @@ async function render(filter) { for (const hero of heroes) { const page = await browser.newPage({ viewport: { width: hero.width, height: hero.height } }); page.on('pageerror', (e) => console.error(hero.file, e.message)); - await page.goto(`${base}/brand/src/hero.html?theme=${hero.theme}&rounded=${hero.rounded ? 1 : 0}`); + const source = BANNERS.includes(hero) ? 'banner' : 'hero'; + await page.goto(`${base}/brand/src/${source}.html?theme=${hero.theme}&rounded=${hero.rounded ? 1 : 0}&cta=${hero.cta ? 1 : 0}`); await page.waitForSelector('body[data-ready]'); await mkdir(dirname(join(REPO, hero.file)), { recursive: true }); if (hero.file.endsWith('.jpg')) { diff --git a/brand/src/banner.html b/brand/src/banner.html new file mode 100644 index 00000000..cbb9674e --- /dev/null +++ b/brand/src/banner.html @@ -0,0 +1,98 @@ + + + + + + + + +
+ +
+
+
Supported by the Kotlin Foundation Grants Program
+ +
+
+ + + diff --git a/brand/src/board.html b/brand/src/board.html index 5591b008..8dae711a 100644 --- a/brand/src/board.html +++ b/brand/src/board.html @@ -25,6 +25,8 @@

Social preview · brand/exports/social-preview.jpg — OG image · docs/bran

Docs hero · docs/brand/hero.webp

+

Grant banner · brand/exports/grant-banner-{dark,light}.webp

+

Logos · docs/brand/logo-{light,dark}.svg — favicon · docs/brand/favicon.svg

diff --git a/docs/brand/grant-banner-dark.webp b/docs/brand/grant-banner-dark.webp new file mode 100644 index 00000000..fbb01e05 Binary files /dev/null and b/docs/brand/grant-banner-dark.webp differ diff --git a/docs/brand/grant-banner-light.webp b/docs/brand/grant-banner-light.webp new file mode 100644 index 00000000..123806b5 Binary files /dev/null and b/docs/brand/grant-banner-light.webp differ diff --git a/docs/docs.json b/docs/docs.json index 3bde7b35..537668d6 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -12,6 +12,10 @@ "dark": "#1A7F4B" }, "favicon": "/brand/favicon.svg", + "banner": { + "content": "🎉 FileKit is supported by the Kotlin Foundation Grants Program. [Read the announcement](https://kotlinfoundation.org/news/grants-program-winners-26/)", + "dismissible": true + }, "navigation": { "groups": [ { diff --git a/docs/introduction.mdx b/docs/introduction.mdx index dab095a9..0382ad7a 100644 --- a/docs/introduction.mdx +++ b/docs/introduction.mdx @@ -5,6 +5,7 @@ description: Pick, save, read, and write files with one Kotlin Multiplatform API og:title: FileKit --- +import { GrantBanner } from '/snippets/grant-banner.jsx' import { QuoteGrid, QuoteCard } from '/snippets/quote-card.jsx' import { UsedBy } from '/snippets/used-by.jsx' @@ -19,6 +20,8 @@ import { UsedBy } from '/snippets/used-by.jsx' **FileKit is the file layer for Kotlin Multiplatform.** Open native file, photo, directory, and camera pickers, save and share files, and read or write them through a single `PlatformFile` type. The same code runs on Android, iOS, macOS, desktop JVM (Windows, macOS, Linux), Linux and Windows native, JS, and Wasm, and FileKit Core also runs on watchOS. + + ## FileKit in 30 seconds Let the user pick a photo, then show it or read its bytes. diff --git a/docs/roadmap.mdx b/docs/roadmap.mdx index 4f4ac7e2..e0dfd799 100644 --- a/docs/roadmap.mdx +++ b/docs/roadmap.mdx @@ -3,8 +3,12 @@ title: 'Roadmap to 1.0' description: 'Where FileKit is heading, what 1.0 will guarantee, and how you can help' --- +import { grantPostUrl } from '/snippets/grant-banner.jsx' + FileKit is already used in production on Android, iOS, desktop and the web. The goal of 1.0 is not a big list of new features. It is a **promise**: a reviewed public API, clear compatibility guarantees, predictable behavior across platforms, and documentation that tells you exactly what to expect. +FileKit is supported by the Kotlin Foundation Grants Program. The grant supports the work toward 1.0 described on this page. + **Target: FileKit 1.0 in Q1 2027.** This is a best-effort target, not a fixed date. The order of the steps below matters more than the calendar, and this page is updated as work lands. diff --git a/docs/snippets/grant-banner.jsx b/docs/snippets/grant-banner.jsx new file mode 100644 index 00000000..8a444c88 --- /dev/null +++ b/docs/snippets/grant-banner.jsx @@ -0,0 +1,29 @@ +/** + * Grant banner for the docs: the brand strip, then a short line linking to the announcement. + * The images follow the docs light/dark theme (rendered by brand/render.mjs). + * + * Usage: + * import { GrantBanner, grantPostUrl } from "/snippets/grant-banner.jsx" + * + * + */ +export const grantPostUrl = "https://kotlinfoundation.org/news/grants-program-winners-26/" + +export const GrantBanner = () => { + const alt = "FileKit is supported by the Kotlin Foundation Grants Program" + return ( + + {alt} + {alt} +

+ The grant supports the work toward FileKit 1.0.{" "} + + Read the announcement → + +

+
+ ) +}