diff --git a/AGENTS.md b/AGENTS.md index 3ced140..efb0ab8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -66,3 +66,23 @@ records. Preserve existing source ownership and historical records. ## Validation Run actionlint for workflow changes and test a pinned workflow from a consumer. + +## Code Review Rules + +### Shared policy and ownership + +- Flag shared policy that fixes a package-specific version, platform window or + toolchain outside the owning package. Safe path: derive variable values from + caller configuration and state only the shared invariant here. + +### Workflow compatibility + +- Flag a reusable workflow interface change without a compatible caller path + and consuming-repository evidence. Safe path: validate the pinned workflow + in a caller and document the adoption requirements. + +### Claims and release integrity + +- Flag an acceptance or release claim without evidence for the identified + source, or instructions that could replace an immutable published identity. + Safe path: report the actual validation state and follow `VERSIONING.md`. diff --git a/Brand/Avatar/Bird.svg b/Brand/Avatar/Bird.svg new file mode 100644 index 0000000..7b64c0f --- /dev/null +++ b/Brand/Avatar/Bird.svg @@ -0,0 +1,4 @@ + + diff --git a/Brand/Avatar/Dots.svg b/Brand/Avatar/Dots.svg new file mode 100644 index 0000000..cb9eb3e --- /dev/null +++ b/Brand/Avatar/Dots.svg @@ -0,0 +1 @@ + diff --git a/Brand/Avatar/README.md b/Brand/Avatar/README.md new file mode 100644 index 0000000..4f0f90d --- /dev/null +++ b/Brand/Avatar/README.md @@ -0,0 +1,17 @@ +# Organization avatar sources + +[DESIGN.md](../../DESIGN.md#iconography) owns the background, layer order, +and material settings. `Bird.svg` and `Dots.svg` are flat source layers for +Icon Composer; native effects and masks are applied during generation. + +The Swift bird is supplied brand artwork from +[Swift.org](https://www.swift.org/assets/images/swift.svg), positioned on a +transparent canvas. Swift and the Swift logo are trademarks of Apple Inc. +The dot field, native material treatment, and organization palette belong +to this avatar composition. This artwork is not used as a package glyph or +as a generic icon skill example. + +Generate the `swift-library` app entry with `apple-app-icon-design`, review +all native appearances and the web set, and verify drift before replacing +delivered assets. Repository README and documentation logos use the separate +framework-style entry in the same design document. diff --git a/DESIGN.md b/DESIGN.md index c02e94c..2f49f2a 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -137,9 +137,11 @@ social cards. ## Shapes -Icons are rounded squares with a corner radius of 0.19 of the side, drawn at -an isometric angle with a vertical squash of 0.75 and a stack depth of 0.36 -of the icon width. Terminal windows have 10 px corners; cards are square. +Repository icons use continuous corners at an isometric angle, with a +vertical squash of 0.75 and a stack depth of 0.36 of the icon width. The +framework icon generator owns the shared corner geometry. Native avatar +masks come from Icon Composer. Terminal windows have 10 px corners; cards +are square. ## Components @@ -157,23 +159,54 @@ of the icon width. Terminal windows have 10 px corners; cards are square. marks along the face axes (rotation 0). - Do derive banner and social preview art from the icons, never redraw them. - Don't use Apple system fonts, SF Symbols, or other restricted glyph sets. -- Don't include, modify, or imitate another company's or project's logo. +- Repository glyphs are original. The organization's supplied Swift bird is + limited to its avatar; its source ownership is recorded in + [Brand/Avatar/README.md](Brand/Avatar/README.md). - Don't put text inside icons or banners. ## Iconography -Each entry renders one repository icon at 1024 px. Fields follow the -generator's icon specification; colors are OKLCH. Regenerate an icon after -changing its entry and replace the repository's `Logo.svg` and `Logo.png`. +Entries under `icons` render repository logos at 1024 px with +`apple-framework-icon-design`. Colors are OKLCH. Regenerate after changing +an entry and replace the owning repository’s `Logo.svg` and `Logo.png`. + +The `app_icons` entry supplies `apple-app-icon-design` with the organization +avatar’s background, material groups, and source layers. Its dot field uses +Primary Light over Primary, and the bird receives native relief and lighting. +The avatar and repository logo serve different surfaces. All native +appearances and web sizes derive from these layers and this entry. ```json { "icons": { + "swift-userdefault": { + "hue": 10, + "face_colors": [ + "oklch(0.72 0.18 8)", + "oklch(0.64 0.21 14)" + ], + "band_colors": [ + "oklch(0.58 0.21 18)", + "oklch(0.67 0.2 10)", + "oklch(0.8 0.11 2)" + ], + "glyph": "toggle", + "texture": "dots", + "glyph_rotation": -45 + }, "swift-library": { "hue": 40, "bands": 4, - "face_colors": ["oklch(0.78 0.16 62)", "oklch(0.62 0.23 30)"], - "band_colors": ["oklch(0.6 0.23 28)", "oklch(0.66 0.21 38)", "oklch(0.74 0.18 52)", "oklch(0.83 0.14 68)"], + "face_colors": [ + "oklch(0.78 0.16 62)", + "oklch(0.62 0.23 30)" + ], + "band_colors": [ + "oklch(0.6 0.23 28)", + "oklch(0.66 0.21 38)", + "oklch(0.74 0.18 52)", + "oklch(0.83 0.14 68)" + ], "glyph": "tiles", "texture": "dots", "glyph_rotation": 0 @@ -181,13 +214,44 @@ changing its entry and replace the repository's `Logo.svg` and `Logo.png`. "swift-benchmark": { "hue": 40, "texture": "grid", - "face_colors": ["oklch(0.82 0.14 52)", "oklch(0.68 0.19 34)"], - "band_colors": ["oklch(0.66 0.18 33)", "oklch(0.5 0.012 50)", "oklch(0.37 0.01 50)"], + "face_colors": [ + "oklch(0.82 0.14 52)", + "oklch(0.68 0.19 34)" + ], + "band_colors": [ + "oklch(0.66 0.18 33)", + "oklch(0.5 0.012 50)", + "oklch(0.37 0.01 50)" + ], "objects": [ - {"kind": "cube", "x": 0.04, "y": 0.3, "s": 0.07, "h": 0.14}, - {"kind": "cube", "x": 0.04, "y": 0.1, "s": 0.07, "h": 0.24}, - {"kind": "cube", "x": 0.04, "y": -0.1, "s": 0.07, "h": 0.36}, - {"kind": "cube", "x": 0.04, "y": -0.3, "s": 0.07, "h": 0.5} + { + "kind": "cube", + "x": 0.04, + "y": 0.3, + "s": 0.07, + "h": 0.14 + }, + { + "kind": "cube", + "x": 0.04, + "y": 0.1, + "s": 0.07, + "h": 0.24 + }, + { + "kind": "cube", + "x": 0.04, + "y": -0.1, + "s": 0.07, + "h": 0.36 + }, + { + "kind": "cube", + "x": 0.04, + "y": -0.3, + "s": 0.07, + "h": 0.5 + } ] }, "swift-package-template": { @@ -207,6 +271,34 @@ changing its entry and replace the repository's `Logo.svg` and `Logo.png`. "texture": "dots", "glyph_rotation": -45 }, + "swift-appstoreconnect": { + "hue": 106, + "mode": "deepen", + "bands": 3, + "texture": "dots", + "glyph_rotation": -45, + "glyph_scale": 0.32, + "custom_glyph": { + "style": "stroke", + "width": 0.15, + "d": "M-0.38 -0.48 H0.16 Q0.58 -0.48 0.58 -0.06 V0.36 M-0.62 -0.26 V0.10 Q-0.62 0.50 -0.22 0.50 H0.16", + "rects": [ + [ + -0.88, + -0.82, + 0.58, + 0.58 + ], + [ + 0.28, + 0.2, + 0.58, + 0.58 + ] + ], + "round": 0.12 + } + }, "swift-semver": { "hue": 128, "mode": "deepen", @@ -222,18 +314,25 @@ changing its entry and replace the repository's `Logo.svg` and `Logo.png`. "glyph_hue": 160, "texture": "lines", "texture_opacity": 0.15, - "face_colors": ["oklch(0.42 0.07 168)", "oklch(0.27 0.05 172)"], - "band_colors": ["oklch(0.36 0.07 170)", "oklch(0.5 0.11 166)", "oklch(0.66 0.14 162)", "oklch(0.82 0.15 158)"], + "face_colors": [ + "oklch(0.42 0.07 168)", + "oklch(0.27 0.05 172)" + ], + "band_colors": [ + "oklch(0.36 0.07 170)", + "oklch(0.5 0.11 166)", + "oklch(0.66 0.14 162)", + "oklch(0.82 0.15 158)" + ], "glyph_rotation": -45 }, - "swift-codex": { - "hue": 272, + "swift-gyb": { + "hue": 195, + "mode": "deepen", "bands": 3, - "glyph": "prompt", - "texture": "constellation", - "glyph_rotation": -45, - "face_colors": ["oklch(0.8 0.11 290)", "oklch(0.6 0.19 272)"], - "band_colors": ["oklch(0.64 0.17 272)", "oklch(0.72 0.14 282)", "oklch(0.81 0.1 292)"] + "glyph": "braces", + "texture": "lines", + "glyph_rotation": -45 }, "swift-data-writable": { "hue": 232, @@ -243,41 +342,132 @@ changing its entry and replace the repository's `Logo.svg` and `Logo.png`. "texture": "grid", "glyph_rotation": -45 }, - "swift-gyb": { - "hue": 195, - "mode": "deepen", + "skills": { + "hue": 260, + "face_colors": [ + "oklch(0.4 0.01 260)", + "oklch(0.33 0.01 260)" + ], + "neutral_bands": "glow", "bands": 3, - "glyph": "braces", - "texture": "lines", + "glyph": "spark", + "glyph_hue": 92, + "texture": "constellation", "glyph_rotation": -45 }, + "swift-codex": { + "hue": 272, + "bands": 3, + "glyph": "prompt", + "texture": "constellation", + "glyph_rotation": -45, + "face_colors": [ + "oklch(0.8 0.11 290)", + "oklch(0.6 0.19 272)" + ], + "band_colors": [ + "oklch(0.64 0.17 272)", + "oklch(0.72 0.14 282)", + "oklch(0.81 0.1 292)" + ] + }, + "swift-json-schema": { + "hue": 292, + "mode": "glow", + "bands": 3, + "texture": "grid", + "texture_opacity": 0.16, + "face_colors": [ + "oklch(0.47 0.16 295)", + "oklch(0.34 0.13 290)" + ], + "band_colors": [ + "oklch(0.42 0.16 292)", + "oklch(0.57 0.19 292)", + "oklch(0.73 0.14 292)" + ], + "glyph_rotation": -45, + "glyph_scale": 0.32, + "custom_glyph": { + "style": "stroke", + "width": 0.16, + "d": "M-0.44 -0.76 H-0.62 Q-0.78 -0.76 -0.78 -0.52 V-0.22 Q-0.78 0 -0.98 0 Q-0.78 0 -0.78 0.22 V0.52 Q-0.78 0.76 -0.62 0.76 H-0.44 M0.44 -0.76 H0.62 Q0.78 -0.76 0.78 -0.52 V-0.22 Q0.78 0 0.98 0 Q0.78 0 0.78 0.22 V0.52 Q0.78 0.76 0.62 0.76 H0.44", + "extra": "M-0.28 0.02 L-0.06 0.24 L0.34 -0.24" + } + }, "swift-redux": { "hue": 312, - "face_colors": ["oklch(1 0 0)", "oklch(0.95 0.004 312)"], - "band_colors": ["oklch(0.92 0.004 312)", "oklch(0.66 0.15 316)", "oklch(0.57 0.15 306)"], + "face_colors": [ + "oklch(1 0 0)", + "oklch(0.95 0.004 312)" + ], + "band_colors": [ + "oklch(0.92 0.004 312)", + "oklch(0.66 0.15 316)", + "oklch(0.57 0.15 306)" + ], "glyph": "loop3", "glyph_rotation": -45, "glyph_color": "oklch(0.6 0.18 314)", "glyph_side": "oklch(0.46 0.15 308)", "texture": "none" }, - "swift-userdefault": { - "hue": 10, - "face_colors": ["oklch(0.72 0.18 8)", "oklch(0.64 0.21 14)"], - "band_colors": ["oklch(0.58 0.21 18)", "oklch(0.67 0.2 10)", "oklch(0.8 0.11 2)"], - "glyph": "toggle", - "texture": "dots", - "glyph_rotation": -45 - }, - "skills": { - "hue": 260, - "face_colors": ["oklch(0.4 0.01 260)", "oklch(0.33 0.01 260)"], - "neutral_bands": "glow", + "swift-pdf": { + "hue": 338, + "mode": "deepen", "bands": 3, - "glyph": "spark", - "glyph_hue": 92, - "texture": "constellation", - "glyph_rotation": -45 + "texture": "lines", + "glyph_rotation": -45, + "glyph_scale": 0.33, + "drift": 0, + "vivid": 1.1, + "custom_glyph": { + "style": "stroke", + "width": 0.14, + "d": "M-0.58 -0.86 H0.22 L0.60 -0.48 V0.86 H-0.58 Z M0.22 -0.86 V-0.48 H0.60 M-0.32 -0.10 H0.34 M-0.32 0.20 H0.34 M-0.32 0.50 H0.10" + } + } + }, + "app_icons": { + "swift-library": { + "background": "#f12e1d", + "gradient": true, + "groups": [ + { + "name": "Warm dot field", + "layers": [ + { + "source": "Brand/Avatar/Dots.svg", + "name": "Dots" + } + ], + "shadow": { + "kind": "neutral", + "opacity": 0 + }, + "translucency": { + "enabled": false, + "value": 0 + } + }, + { + "name": "Swift bird", + "layers": [ + { + "source": "Brand/Avatar/Bird.svg", + "name": "Bird" + } + ], + "shadow": { + "kind": "neutral", + "opacity": 0.5 + }, + "translucency": { + "enabled": false, + "value": 0 + } + } + ] } } } @@ -298,3 +488,49 @@ the color comes from the icon hue: | 115 to 185 | `green` | | 185 to 265 | `blue` | | 265 to 330 | `purple` | + +## Website + +The project catalog gives the icon family space to carry the color. Page +surfaces, navigation, borders, and typography stay neutral. The homepage uses +a 128 px organization app icon above its name and purpose, followed by grouped +project cards. Repository names, descriptions, versions, documentation links, +and installation commands remain the primary content. + +### Typography and layout + +- Self-host the unmodified Inter 4.1 variable WOFF2 with its SIL Open Font + License. Use optical sizing, regular body copy, and semibold headings. +- Limit the main content to 1120 px. Use a two-column catalog with 20 px gaps; + below 760 px use one column and 20 px page margins. +- The hero heading scales from 44 to 72 px. Card headings use 21 px, body copy + 15 px, and supplementary labels at least 12 px. Installation commands use a + system monospace face and horizontal overflow within their own region. +- Cards use a 20 px corner radius, a subtle border, and a solid surface. Their + repository icon is 64 px. Avoid extra decorative artwork around the family. +- Navigation stays on one line. Put license, contributors, and versioning links + in the footer; the header links to contributing and GitHub. + +### Appearance tokens + +Use the system color preference with CSS. Clipboard copying is the only +JavaScript behavior. Content and installation commands remain available +without JavaScript or clipboard permission. + +| Role | Light | Dark | +| --- | --- | --- | +| Canvas | `#fbfbfd` | `#141417` | +| Card | `#ffffff` | `#1d1d21` | +| Command background | `#f0f0f3` | `#28282d` | +| Main text | `#1d1d1f` | `#f5f5f7` | +| Secondary text | `#424245` | `#d1d1d7` | +| Supplementary text | `#606068` | `#aaaab3` | +| Decorative border | `#d9d9df` | `#393940` | +| Control border | `#76767c` | `#82828c` | +| Focus ring | `#005cc5` | `#8eb8ff` | + +Text must meet WCAG AA contrast against its actual background. Controls retain +visible keyboard focus, copy outcomes are announced through a status region, +and motion respects reduced-motion preferences. Check the homepage, +contributing page, and error page at desktop, intermediate, and mobile widths +in both appearances before publishing. diff --git a/Documentation/Assets/Logo.png b/Documentation/Assets/Logo.png index 7922df5..b47aa53 100644 Binary files a/Documentation/Assets/Logo.png and b/Documentation/Assets/Logo.png differ diff --git a/Documentation/Assets/Logo.svg b/Documentation/Assets/Logo.svg index e315f4e..0773d97 100644 --- a/Documentation/Assets/Logo.svg +++ b/Documentation/Assets/Logo.svg @@ -1 +1 @@ - + diff --git a/profile/Assets/Logo.svg b/profile/Assets/Logo.svg index e315f4e..0773d97 100644 --- a/profile/Assets/Logo.svg +++ b/profile/Assets/Logo.svg @@ -1 +1 @@ - +