@featherk/icons 0.14.1 → 0.15.0

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.
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const node_path = require("node:path");
4
4
  const promises = require("node:fs/promises");
5
- const generate = require("./chunks/generate-Bobf_ghm.cjs");
5
+ const fontawesome_catalog = require("./catalog.cjs");
6
+ const generate = require("./chunks/generate-BBurrhLv.cjs");
6
7
  const virtualId = "virtual:featherk/fontawesome";
7
8
  const resolvedId = `\0${virtualId}`;
8
9
  function dependencyKey(file) {
@@ -15,9 +16,10 @@ function featherkFontAwesome(options) {
15
16
  let dependencies = /* @__PURE__ */ new Set();
16
17
  function regenerate() {
17
18
  generation = generate.generateFaIcons({
18
- icons: options.icons,
19
+ keys: options.keys,
19
20
  root,
20
21
  sourceRoot: options.sourceRoot,
22
+ allowPro: options.allowPro,
21
23
  virtualTypesFile: options.virtualTypesFile === false ? void 0 : options.virtualTypesFile ?? "src/featherk-fontawesome.d.ts"
22
24
  }).then((result) => {
23
25
  dependencies = new Set(result.dependencies.map(dependencyKey));
@@ -30,6 +32,15 @@ function featherkFontAwesome(options) {
30
32
  enforce: "pre",
31
33
  async configResolved(config) {
32
34
  root = node_path.resolve(config.root, options.root ?? ".");
35
+ const installCommand = options.keys === void 0 ? void 0 : fontawesome_catalog.getFontAwesomeInstallCommand(options.keys, {
36
+ allowPro: options.allowPro
37
+ });
38
+ if (installCommand) {
39
+ console.info(
40
+ `[featherk-fontawesome] Install selected source packages with:
41
+ ${installCommand}`
42
+ );
43
+ }
33
44
  await regenerate();
34
45
  },
35
46
  async buildStart() {
@@ -1,6 +1,13 @@
1
1
  import type { Plugin } from "vite";
2
2
  import type { FontAwesomeOptions } from "./types";
3
+ /** Configuration for the Font Awesome virtual module plugin. */
3
4
  export interface FontAwesomeViteOptions extends FontAwesomeOptions {
4
5
  virtualTypesFile?: string | false;
5
6
  }
7
+ /**
8
+ * Creates the Vite plugin for `virtual:featherk/fontawesome`.
9
+ *
10
+ * Catalog keys are resolved during Vite config setup, and their license
11
+ * notices are emitted into production builds.
12
+ */
6
13
  export declare function featherkFontAwesome(options: FontAwesomeViteOptions): Plugin;
@@ -1,6 +1,7 @@
1
1
  import { resolve } from "node:path";
2
2
  import { realpath } from "node:fs/promises";
3
- import { g as generateFaIcons } from "./chunks/generate-Bp92GTVi.mjs";
3
+ import { getFontAwesomeInstallCommand } from "./catalog.mjs";
4
+ import { g as generateFaIcons } from "./chunks/generate-Zq9q2YZD.mjs";
4
5
  const virtualId = "virtual:featherk/fontawesome";
5
6
  const resolvedId = `\0${virtualId}`;
6
7
  function dependencyKey(file) {
@@ -13,9 +14,10 @@ function featherkFontAwesome(options) {
13
14
  let dependencies = /* @__PURE__ */ new Set();
14
15
  function regenerate() {
15
16
  generation = generateFaIcons({
16
- icons: options.icons,
17
+ keys: options.keys,
17
18
  root,
18
19
  sourceRoot: options.sourceRoot,
20
+ allowPro: options.allowPro,
19
21
  virtualTypesFile: options.virtualTypesFile === false ? void 0 : options.virtualTypesFile ?? "src/featherk-fontawesome.d.ts"
20
22
  }).then((result) => {
21
23
  dependencies = new Set(result.dependencies.map(dependencyKey));
@@ -28,6 +30,15 @@ function featherkFontAwesome(options) {
28
30
  enforce: "pre",
29
31
  async configResolved(config) {
30
32
  root = resolve(config.root, options.root ?? ".");
33
+ const installCommand = options.keys === void 0 ? void 0 : getFontAwesomeInstallCommand(options.keys, {
34
+ allowPro: options.allowPro
35
+ });
36
+ if (installCommand) {
37
+ console.info(
38
+ `[featherk-fontawesome] Install selected source packages with:
39
+ ${installCommand}`
40
+ );
41
+ }
31
42
  await regenerate();
32
43
  },
33
44
  async buildStart() {
package/docs/ICONS.md CHANGED
@@ -211,4 +211,4 @@
211
211
  |rating_star_selected|switch_left|switch_off|switch_on|switch_right| |
212
212
  <!-- markdownlint-enable MD033-->
213
213
 
214
- > Generated: 2026-10-06T00:13:29.670Z
214
+ > Generated: 2026-10-06T20:52:21.447Z
@@ -1,28 +1,31 @@
1
1
  # Choose Font Awesome Icons and Create a Manifest
2
2
 
3
- This is the UX/Design starting point for choosing the exact Font Awesome variants an application intends to use and recording them in its selection manifest. It covers icon selection, approval, naming, and manifest fields. For integration and build setup, continue to [Font Awesome Build Integration](FontAwesome.md); CLI and non-Vite workflows are in [the CLI supplement](FontAwesomeCLI.md).
3
+ This guide covers how the UX Team designates needed Font Awesome variants, how the FeatherK UX/Design Engineer maintains the published metadata catalog, and how an application selects only the icons it uses. The published catalog is the shared source of truth and contains metadata, not artwork. A consuming app needs only the UX-provided keys; Vite resolves those keys without requiring the app to import or inspect other catalog entries. For integration and build setup, continue to [Font Awesome Build Integration](FontAwesome.md); CLI and non-Vite workflows are in [the CLI supplement](FontAwesomeCLI.md).
4
4
 
5
5
  ## Quick Start
6
6
 
7
- 1. Select the exact catalog icon, family, and style; note whether the variant is Free or Pro.
8
- 2. Agree on the exact release and obtain the required UX and license approvals.
9
- 3. Assign a unique application key and identify the package that supplies the variant and release.
10
- 4. Add or update the selection in the application's manifest and review the full selection set.
7
+ 1. UX identifies the needed icon and intended family/style; confirm whether the variant is Free or Pro.
8
+ 2. The FeatherK UX/Design Engineer confirms the exact identity, release, and source mapping, and assigns a globally unique catalog key.
9
+ 3. The FeatherK UX/Design Engineer adds the variant metadata to the catalog and publishes the `@featherk/icons` update.
10
+ 4. The consuming application's Dev puts only the needed keys in its keys-only manifest and configures the Vite/CLI build; Pro sources still require authorized access and license coverage.
11
11
 
12
12
  The steps below help UX/Design create a precise handoff. Do not assume every icon exists in every family, style, or release.
13
13
 
14
14
  ## Where Each Field Comes From
15
15
 
16
- | Field | Who supplies it | Meaning |
17
- | --------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
18
- | `key` | UX/application convention | Unique application lookup identifier, such as `pro-house-light`; passed to `getFaIcon()` |
19
- | `name` | Font Awesome catalog | Canonical icon name, such as `house`, without the `fa-` CSS prefix |
20
- | `version` | Approved release policy | Exact source-package release, such as `7.0.0`, not `latest`, a range, or the first version that introduced the icon |
21
- | `family` | Selected Font Awesome family | Supported family identifier, such as `classic` or `sharp` |
22
- | `style` | Selected Font Awesome style | Supported style identifier, such as `solid`, `regular`, or `light` |
23
- | `package` | Engineering confirms the source mapping | Exact installed package name or alias that supplies the selected family, style, and version |
16
+ | Catalog field | Who supplies it | Meaning |
17
+ | ------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
18
+ | `key` | UX/Design Engineer | Stable, globally unique lookup key for exactly one catalog variant; supplied to Vite/CLI by the consumer |
19
+ | `name` | Font Awesome catalog | Canonical icon name, such as `house`, without the `fa-` CSS prefix |
20
+ | `version` | UX and release approval | Exact source-package release, such as `7.0.0`, not `latest`, a range, or the first version that introduced the icon |
21
+ | `family` | UX/design selection | Supported family identifier, such as `classic` or `sharp` |
22
+ | `style` | UX/design selection | Supported style identifier, such as `solid`, `regular`, or `light` |
23
+ | `package` | UX/Design Engineer | Exact installed dependency name; may be an npm alias such as `fa-solid-v5` |
24
+ | `registryPackage` | UX/Design Engineer | Canonical npm package name targeted by `package` and checked against installed package metadata |
25
+ | `exportName` | UX/Design Engineer | Exact individual icon export in the source package |
26
+ | `tier` | UX/Design Engineer | `free` or `pro` classification for the exact variant; descriptive only, not proof of entitlement |
24
27
 
25
- The catalog identifies the canonical `name`, `family`, `style`, and Free/Pro availability. UX/Design proposes the application `key` and approved release. Engineering confirms the exact npm package or alias for `package`; Dev installs that package at the manifest's exact `version`. Do not guess package names. A catalog page alone does not establish historical release availability or license entitlement.
28
+ Each catalog key identifies one exact name/version/family/style/package/export variant. Different styles or releases require different keys. Catalog records are maintained and published by FeatherK; consuming applications do not copy these fields into their selection manifest. `tier` describes the Font Awesome product tier only; it does not grant access or establish license coverage. Package availability and Pro entitlement must still be confirmed independently.
26
29
 
27
30
  ## Step 1: Select and Approve the Catalog Variant
28
31
 
@@ -37,7 +40,7 @@ Copied markup can help identify the selection:
37
40
 
38
41
  For this example, the canonical name is `heart`, family is `classic`, and style is `regular`. Confirm those values for the desired release; old CSS names may be compatibility aliases rather than that release's canonical name.
39
42
 
40
- UX should hand off the catalog link, canonical name, approved exact release, family, style, and approval record. Agree on an application key separately. Any package/download entitlement must also be confirmed for Pro.
43
+ UX should hand off the catalog link, canonical name, approved exact release, family, style, and intended appearance. The FeatherK UX/Design Engineer assigns the catalog key and verifies the source mapping. Any package/download entitlement must also be confirmed for Pro.
41
44
 
42
45
  Important distinctions:
43
46
 
@@ -63,47 +66,37 @@ Common Classic package mappings are:
63
66
 
64
67
  The `classic`/`brands` rows show common package mappings. Other families include `sharp`, `duotone`, and `sharp-duotone`; confirm their package names and release availability in the [official package documentation](https://docs.fontawesome.com/web/setup/packages). Do not construct package names by guesswork. Pro+ collections requiring Kits are outside this integration.
65
68
 
66
- For Pro variants, confirm entitlement and release approval with the license owner before adding them. See [Pro licensing and setup](LICENSING.md). Engineering should confirm that the package recorded in the manifest is installed and supplies the requested variant.
69
+ For Pro variants, confirm entitlement and release approval with the license owner before adding them. See [Pro licensing and setup](LICENSING.md). The FeatherK UX/Design Engineer verifies the package mapping in the catalog; consuming-app Dev installs the package for selected keys.
67
70
 
68
- ## Step 3: Write the Complete Manifest Entry
71
+ ## Step 3: Select Keys in the Application Manifest
69
72
 
70
- Add the selection to an `icons` array. The filename is project-owned; this example uses a Free selection manifest:
73
+ The FeatherK catalog holds the complete metadata record. A consuming app lists only the keys it actually uses; it does not repeat icon names, versions, styles, or package mappings. One project-owned keys file can group Free and optional Pro selections:
71
74
 
72
75
  ```json
73
76
  {
74
- "icons": [
75
- {
76
- "key": "heart-outline",
77
- "name": "heart",
78
- "version": "7.0.0",
79
- "family": "classic",
80
- "style": "regular",
81
- "package": "@fortawesome/free-regular-svg-icons"
82
- }
83
- ]
77
+ "free": ["heart-regular"],
78
+ "pro": []
84
79
  }
85
80
  ```
86
81
 
87
- This example records the selected Pro variant. In this repository, Free selections live in `demos/fontawesome.icons.json` and optional licensed selections in `demos/fontawesome.pro.icons.json`; other applications may choose their own manifest filenames.
88
-
89
- The `key` is the application's identifier and does not need to match the canonical `name`. Use a unique key for each distinct selection. For example, the same canonical icon can be selected with different styles or versions as long as each entry has a different key.
82
+ For an optional Pro build, put its requested catalog keys in `pro`. Vite/CLI include those keys only when the app explicitly enables its authorized Pro profile. In this repository the shared key file is `demos/fontawesome.keys.json`.
90
83
 
91
84
  ## Naming and Uniqueness Rules
92
85
 
93
- The generator only requires `key` to be a nonblank string; it does not enforce a casing or punctuation style. For readability, UX/Design should use lowercase kebab-case and choose a stable, descriptive key:
86
+ The catalog requires each `key` to be unique across all published variants. UX/Design Engineer assigns stable, descriptive lowercase kebab-case keys:
94
87
 
95
88
  - Use the canonical icon name as the key when only one variant is selected, such as `rocket`.
96
89
  - Add the style when the application needs multiple variants, such as `heart-regular` or `feather-light`.
97
90
  - Add a version suffix only when multiple releases must coexist, such as `rocket-v5` and `rocket-v6`.
98
- - Do not reuse a key for a different icon identity. If the selected variant changes, review the key and all application references with Engineering.
99
- - Check keys across every manifest enabled together in a build, including combined Free and Pro selections. A key repeated in separate files is still a duplicate when those files are combined.
91
+ - Never reuse a key for a different identity. If the exact variant changes, assign/review a catalog key and update consumers with UX.
92
+ - Use distinct keys for different styles or releases of the same canonical name.
100
93
 
101
- These are UX naming conventions; only blank and duplicate keys are rejected by the generator. The application uses the key for lookup, while `name`, `family`, `style`, `version`, and `package` identify the source artwork.
94
+ Consumers use the UX-provided key for lookup. They do not need to know the other catalog entries or carry source metadata in their app manifest.
102
95
 
103
96
  ## UX/Design Handoff
104
97
 
105
- For each selection, provide the catalog link, canonical name, family, style, exact approved version, application key, Free/Pro status, and package mapping. UX/Design owns the desired variants and manifest change; Engineering confirms that the exact package and release are available and implements the build integration.
98
+ The UX Team designates the desired icon and exact variant and provides its catalog link and intended appearance. The FeatherK UX/Design Engineer maintains the owned custom icon collection and published Font Awesome metadata catalog, assigns the globally unique key, and publishes package updates. For an application build, Dev selects only the needed keys in `vite.config.ts` or the shared keys-only file and owns source-package installation and build integration.
106
99
 
107
- Catalog approval and source availability are separate. If Engineering cannot resolve the requested package, version, or export, do not silently substitute another icon or release. Return to UX/Design and update the approval and manifest together.
100
+ Catalog metadata and source availability or license entitlement are separate. A Pro key requires explicit Pro-profile opt-in and an authorized, exact source package. If the exact package, version, or export cannot be confirmed, fail the build rather than silently substituting another icon or release.
108
101
 
109
102
  After the manifest is ready, continue with [Vite build integration](FontAwesome.md). For Pro selections, review [Pro licensing and setup](LICENSING.md). Non-Vite or pre-typecheck CLI workflows are documented in [the CLI supplement](FontAwesomeCLI.md).
@@ -1,51 +1,35 @@
1
1
  # Font Awesome Build Integration
2
2
 
3
- Font Awesome support is opt-in. To use Font Awesome icons, Dev configures this build workflow to generate Kendo-compatible descriptors from the npm packages named by each manifest's `package` and exact `version` fields. UX/Design owns choosing the desired icon variants and recording them in the manifest; start with [Choose Font Awesome Icons and Create a Manifest](CreateFontAwesomeManifest.md). Consumers using only `getCustomIcon()` do not need this integration. `@featherk/icons` contains no Font Awesome artwork, Free or paid, and does not supply a license or authentication token.
3
+ Font Awesome support is opt-in. `@featherk/icons` publishes one metadata-only catalog of FeatherK-curated Free and Pro variants at `@featherk/icons/fontawesome/catalog`; it contains no Font Awesome artwork and grants no license or access. UX provides globally unique catalog keys. A consuming app lists only keys it uses in its keys-only manifest and configures this workflow to generate Kendo-compatible descriptors from its authorized, installed sources. Consumers using only `getCustomIcon()` do not need this integration; that custom-icon API and registry remain separate.
4
4
 
5
- Once UX/Design has supplied the approved manifest, Dev owns source installation, Vite configuration, validation, and application integration. For licensed sources, see [Pro licensing and setup](LICENSING.md), including optional local profiles, secret handling, GitHub Actions/TeamCity, and consuming applications.
5
+ The FeatherK UX/Design Engineer maintains the published catalog; the UX Team designates requested icons and variants. Consuming-app Dev owns key selection, source installation, Vite configuration, validation, and application integration. For licensed sources, see [Pro licensing and setup](LICENSING.md), including optional local profiles, secret handling, GitHub Actions/TeamCity, and consuming applications.
6
6
 
7
7
  ## Quick Start
8
8
 
9
- 1. UX/Design selects and approves each exact icon variant and records it in the [manifest](CreateFontAwesomeManifest.md); the license owner confirms Pro entitlement and approved release coverage.
9
+ 1. UX designates the needed exact icon variant; the FeatherK UX/Design Engineer maintains its globally unique key and exact metadata in the published catalog. The license owner confirms Pro entitlement and approved release coverage.
10
10
  2. Dev installs `@featherk/icons` with the Font Awesome Vite entry point and ensures compatible Vite 7.x or 8.x is available using [Install the Vite Integration](#install-the-vite-integration).
11
- 3. Dev confirms access and availability for each manifest `package` and exact `version`, configures authorized registry access when required, then installs those matching pinned npm packages using [Install Source Packages](#install-source-packages). For Pro, follow [Pro token setup](LICENSING.md#dev-setup-quick-start) before installation.
12
- 4. Dev configures the Vite plugin to use the approved manifest and validates the installed selections in [Vite Setup](#vite-setup).
11
+ 3. Dev checks the source mapping for selected keys, confirms access and availability, configures authorized registry access when required, then installs only the matching pinned npm packages using [Install Source Packages](#install-source-packages). For Pro, follow [Pro token setup](LICENSING.md#dev-setup-quick-start) before installation.
12
+ 4. Dev configures the Vite plugin with only the selected keys. Pro keys require explicit Pro-profile opt-in and authorized installed sources; see [Vite Setup](#vite-setup).
13
13
  5. Dev renders the selected descriptors through the virtual module using the [rendering example](#render-the-selected-key).
14
14
  6. Dev preserves emitted license notices in application distribution as described in [Preserve license notices](#preserve-license-notices).
15
15
 
16
- This Free example uses an illustrative `fa-solid-v7` installed alias. Resolve its actual package, availability, version, and entitlement before use. Install a FeatherK release/build containing these entry points; a prior published release does not gain them automatically. For CLI generation, including declaration preparation before an early type check, see [CLI and non-Vite setup](FontAwesomeCLI.md).
16
+ Consumers need only the keys, not the other catalog records. These examples use keys present in the published catalog; verify source availability and license coverage for the project's exact selections. Install a FeatherK release/build containing these entry points; a prior published release does not gain them automatically. For CLI generation, including declaration preparation before an early type check, see [CLI and non-Vite setup](FontAwesomeCLI.md).
17
17
 
18
18
  ```json
19
19
  {
20
- "icons": [
21
- {
22
- "key": "account",
23
- "name": "user",
24
- "version": "7.0.0",
25
- "family": "classic",
26
- "style": "solid",
27
- "package": "fa-solid-v7"
28
- }
29
- ]
20
+ "free": ["user"],
21
+ "pro": []
30
22
  }
31
23
  ```
32
24
 
33
25
  ### Pro Demo Example
34
26
 
35
- The repository's Pro demo selects Classic Light `house` from Font Awesome Pro 7 and exposes it with the manifest key `pro-house-light`. Use this selection only when the application has the required Font Awesome Pro access and license coverage:
27
+ The repository's Pro demo selects Classic Light `house` from Font Awesome Pro 7 with the catalog key `pro-house-light`. Include it only in an authorized Pro build with the required package access and license coverage:
36
28
 
37
29
  ```json
38
30
  {
39
- "icons": [
40
- {
41
- "key": "pro-house-light",
42
- "name": "house",
43
- "version": "7.0.0",
44
- "family": "classic",
45
- "style": "light",
46
- "package": "@fortawesome/pro-light-svg-icons"
47
- }
48
- ]
31
+ "free": ["user"],
32
+ "pro": ["pro-house-light"]
49
33
  }
50
34
  ```
51
35
 
@@ -75,62 +59,65 @@ npm install --save-dev @featherk/icons vite@^7.0.0
75
59
 
76
60
  ## Install Source Packages
77
61
 
78
- Dev installs the npm package or alias named by each UX-approved manifest `package` field, pinned to that entry's exact `version`. The Free example uses the `fa-solid-v7` alias shown in the manifest; the Pro example installs `@fortawesome/pro-light-svg-icons@7.0.0` as recorded in its manifest entry and requires authorized Font Awesome package access before installation.
62
+ The catalog maps each key to its local dependency name, canonical registry package, export, and exact version. Dev installs only packages needed by selected keys, pinned to those exact versions. When Vite processes the selected keys, it prints one deduplicated `npm install --save-dev --save-exact ...` command in the terminal, including version aliases where needed. The CLI prints the same suggestion before generation. Run it from the consuming project with the appropriate registry access; FeatherK tooling never installs packages or handles credentials. During generation, the installed package's declared name is checked against `registryPackage` and its version against the catalog before the icon module is loaded. The Free example uses `@fortawesome/free-solid-svg-icons@7.0.0`; the Pro example needs authorized access to `@fortawesome/pro-light-svg-icons@7.0.0`.
79
63
 
80
64
  ```sh
81
- # Free alias used by the example manifest.
82
- npm install --save-dev --save-exact fa-solid-v7@npm:@fortawesome/free-solid-svg-icons@7.0.0
65
+ # Free source for the selected `user` key.
66
+ npm install --save-dev --save-exact @fortawesome/free-solid-svg-icons@7.0.0
83
67
 
84
68
  # Pro package used by the example manifest.
85
69
  npm install --save-dev --save-exact @fortawesome/pro-light-svg-icons@7.0.0
86
70
  ```
87
71
 
88
- The Free command uses an alias to match the example manifest.
89
-
90
- Note: Aliases (i.e Like `fa-solid-v7` in the example above) let one project install multiple versions of the same npm package under distinct dependency names. See [alias details](#about-aliases-and-why-use-them).
72
+ Aliases let one project install multiple versions of the same npm package under distinct dependency names. The catalog's `package` mapping specifies the dependency name for each selected version. See [alias details](#about-aliases-and-why-use-them).
91
73
 
92
74
  Never put a Pro token in the command or commit it. See [Pro licensing and setup](LICENSING.md) for secure registry configuration.
93
75
 
76
+ The printed command is an install suggestion, not a license or access check. Pro builds still require separately configured authorized registry access and the explicit Pro profile. Vite may print the same selected-package command on each startup; it includes only packages mapped from that app's selected keys.
77
+
94
78
  ## Vite Setup
95
79
 
96
- The following setup is Dev-owned and assumes the UX-approved manifest and required license approvals are in place.
80
+ The following setup is Dev-owned and assumes the app keys-only manifest and required license approvals are in place.
97
81
 
98
82
  ```ts
99
83
  import { defineConfig } from "vite";
100
84
  import vue from "@vitejs/plugin-vue";
101
85
  import { featherkFontAwesome } from "@featherk/icons/fontawesome/vite";
102
- import type { FontAwesomeSelection } from "@featherk/icons/fontawesome";
103
- import manifest from "./fontawesome.icons.json";
86
+ import manifest from "./fontawesome.keys.json";
87
+
88
+ const proEnabled = process.env.FEATHERK_FONTAWESOME_PRO === "1";
104
89
 
105
- // Step 1: Use the UX-approved manifest and verify required entitlement.
90
+ // Step 1: Use UX-provided keys; verify any required Pro entitlement separately.
106
91
  // Step 2: Ensure @featherk/icons and Vite 7 or 8 are available.
107
- // Step 3: Install the npm packages matching each manifest package and version before Vite starts.
92
+ // Step 3: Install source packages mapped by the selected catalog keys before Vite starts.
108
93
  export default defineConfig({
109
- // Step 4: Use the selections from the manifest approved and installed above.
94
+ // Step 4: Pro keys are included only for the explicitly enabled profile.
110
95
  plugins: [
111
96
  vue(),
112
97
  featherkFontAwesome({
113
- icons: manifest.icons as FontAwesomeSelection[],
98
+ keys: [...manifest.free, ...(proEnabled ? manifest.pro : [])],
99
+ allowPro: proEnabled,
100
+ sourceRoot: proEnabled ? "pro" : undefined,
114
101
  }),
115
102
  ],
116
103
  });
117
104
  ```
118
105
 
119
- Enable JSON imports in the consumer's TypeScript configuration if necessary. The assertion above supplies TypeScript's selection type; the generator still validates the manifest's supported fields and resolved identities at runtime.
106
+ Enable JSON imports in the consumer's TypeScript configuration if necessary. The app passes only keys; the catalog supplies exact metadata, and the generator validates installed source versions and identities at runtime.
120
107
 
121
108
  ### Render the Selected Key
122
109
 
123
110
  ```vue
124
111
  <template>
125
112
  <!-- Step 5: Render the generated descriptor directly through Kendo. -->
126
- <SvgIcon :icon="accountIcon" />
113
+ <SvgIcon :icon="userIcon" />
127
114
  </template>
128
115
 
129
116
  <script setup lang="ts">
130
117
  import { SvgIcon } from "@progress/kendo-vue-common";
131
118
  import { getFaIcon } from "virtual:featherk/fontawesome";
132
119
 
133
- const accountIcon = getFaIcon("account");
120
+ const userIcon = getFaIcon("user");
134
121
  </script>
135
122
  ```
136
123
 
@@ -144,7 +131,7 @@ The plugin emits `featherk-fontawesome.licenses.txt` into Vite build output (Ste
144
131
 
145
132
  `getFaIcon(key)` returns a runtime `FontAwesomeIcon` object with `{ name, content, viewBox }`, structurally compatible with Kendo's `SVGIcon`. `name` is the selected manifest key, `content` is the inner SVG path markup without an outer `<svg>`, and `viewBox` preserves the source geometry. The property is case-sensitive: `viewBox`, not `viewbox`.
146
133
 
147
- The following examples assume `rocket` is included in the project's enabled selections. Replace it with your selected key, such as `account` in the Quick Start manifest.
134
+ The following examples assume `rocket` is included in the project's enabled selections. Replace it with your selected key, such as `user` in the Quick Start manifest.
148
135
 
149
136
  ### Application Code
150
137
 
@@ -1,16 +1,16 @@
1
1
  # Font Awesome CLI and Non-Vite Setup
2
2
 
3
- This Dev-owned supplement assumes UX/Design has supplied the approved selections in a manifest. For icon choice, approval, naming, and manifest authoring, start with [Choose Font Awesome Icons and Create a Manifest](CreateFontAwesomeManifest.md). For the default Vite integration, see [Font Awesome Build Integration](FontAwesome.md).
3
+ This Dev-owned supplement assumes UX/Design has supplied catalog keys. The catalog contains the source metadata; the app manifest contains only keys the project uses. For icon choice and key assignment, start with [Choose Font Awesome Icons and Create a Manifest](CreateFontAwesomeManifest.md). For the default Vite integration, see [Font Awesome Build Integration](FontAwesome.md).
4
4
 
5
5
  ## Quick Start
6
6
 
7
- 1. Receive the UX-approved manifest and required license approvals.
7
+ 1. Receive the UX-provided catalog keys and required license approvals.
8
8
  2. Dev installs `@featherk/icons` at a release containing the CLI or Node API; for example, `npm install --save-dev @featherk/icons`.
9
- 3. Dev installs the npm package or alias named by each manifest `package` field at its exact `version` using authorized package access. For Pro, follow [Pro token setup](LICENSING.md#dev-setup-quick-start) before installation; package examples are in [Install Source Packages](FontAwesome.md#install-source-packages).
10
- 4. Dev generates virtual-module declarations or a regular ESM module from the manifest.
9
+ 3. Dev installs only the packages mapped to selected keys in the published catalog, pinned to exact versions. For Pro, follow [Pro token setup](LICENSING.md#dev-setup-quick-start) before installation; package examples are in [Install Source Packages](FontAwesome.md#install-source-packages).
10
+ 4. Dev generates virtual-module declarations or a regular ESM module from the keys-only manifest.
11
11
  5. Dev imports the generated module where needed, type-checks declarations, and preserves emitted license notices.
12
12
 
13
- The CLI validates installed Font Awesome source packages; it does not install them or authenticate with a registry. A prior FeatherK release does not gain the CLI or Node API entry points automatically.
13
+ The CLI prints one deduplicated exact install command for the packages mapped to selected keys before generation. Run that command yourself from the consumer project after configuring any required registry access. The CLI validates installed Font Awesome source packages; it does not install them or authenticate with a registry. A prior FeatherK release does not gain the CLI or Node API entry points automatically.
14
14
 
15
15
  ### Generate declarations before a Vite type check
16
16
 
@@ -18,10 +18,10 @@ The Vite plugin writes `src/featherk-fontawesome.d.ts` on startup by default. If
18
18
 
19
19
  ```sh
20
20
  # Step 4: Generate the virtual-module declarations before standalone type checking.
21
- npm exec -- featherk-fontawesome --manifest fontawesome.icons.json --virtual-types src/featherk-fontawesome.d.ts
21
+ npm exec -- featherk-fontawesome --manifest fontawesome.keys.json --virtual-types src/featherk-fontawesome.d.ts
22
22
  ```
23
23
 
24
- Configure `featherkFontAwesome` with the same selections. The CLI and plugin must use the same manifest; do not maintain conflicting selection lists. `virtualTypesFile` can select another project-local `.d.ts` path or disable plugin writing with `false`.
24
+ The manifest uses `{ "free": ["key"], "pro": ["key"] }`. By default, the CLI selects only `free` keys. For a licensed profile, add `--allow-pro`; the CLI then includes the `pro` keys and rejects Pro selections if the exact source package cannot be resolved. Configure the Vite plugin with the same key file and profile. `virtualTypesFile` can select another project-local `.d.ts` path or disable plugin writing with `false`.
25
25
 
26
26
  ### Generate a module for a non-Vite application
27
27
 
@@ -29,7 +29,7 @@ No migration to Vite is required. Generate a regular ESM module and adjacent dec
29
29
 
30
30
  ```sh
31
31
  # Step 4: Generate application-local ESM output from the selected manifest.
32
- npm exec -- featherk-fontawesome --manifest fontawesome.icons.json --out src/generated/fontawesome/icons.mjs
32
+ npm exec -- featherk-fontawesome --manifest fontawesome.keys.json --out src/generated/fontawesome/icons.mjs
33
33
  ```
34
34
 
35
35
  Import the generated module before running the existing application build:
@@ -38,16 +38,16 @@ Import the generated module before running the existing application build:
38
38
  // Step 5: Use the manifest key selected for this application.
39
39
  import { getFaIcon } from "./generated/fontawesome/icons.mjs";
40
40
 
41
- const accountIcon = getFaIcon("account");
41
+ const userIcon = getFaIcon("user");
42
42
  ```
43
43
 
44
44
  Run generation again when selections change, including before local development. A generation failure exits nonzero and must stop CI; do not continue with prior output. Preserve the emitted `icons.mjs.licenses.txt` notice in application distribution. Non-Vite bundlers do not automatically copy that sidecar.
45
45
 
46
46
  ## Node API and CLI Options
47
47
 
48
- `generateFaIcons` from `@featherk/icons/fontawesome/build` accepts `icons`, optional `root`, `sourceRoot`, `outFile`, and `virtualTypesFile`. It returns ESM code, file-module declarations, ambient virtual-module declarations, notices, provenance, and source dependency paths. Without output options, it writes nothing.
48
+ `generateFaIcons` from `@featherk/icons/fontawesome/build` accepts selected `keys`, optional `allowPro`, `root`, `sourceRoot`, `outFile`, and `virtualTypesFile`. It returns ESM code, file-module declarations, ambient virtual-module declarations, notices, provenance, and source dependency paths. Without output options, it writes nothing. Catalog keys are the only supported selection input. Pro keys require `allowPro: true`, which is an accidental-use guard, not proof of license entitlement.
49
49
 
50
- The CLI accepts `--manifest`, `--root`, `--source-root`, `--out`, `--virtual-types`, and `--help`. The manifest must contain an `icons` array; specify at least one output. Paths are relative to `--root` or the current directory. File output uses `.js`/`.mjs` with `.d.ts`/`.d.mts` declarations; ambient output uses `.d.ts` and must not overwrite the file-module declaration.
50
+ The CLI accepts `--manifest`, `--root`, `--source-root`, `--allow-pro`, `--out`, `--virtual-types`, and `--help`. The manifest contains `free` and optional `pro` arrays of catalog keys; full-record `icons` manifests are rejected. To migrate from 0.14.0, replace each full selection record with its UX-provided catalog key and use the published catalog for source metadata. Specify at least one output. Paths are relative to `--root` or the current directory. File output uses `.js`/`.mjs` with `.d.ts`/`.d.mts` declarations; ambient output uses `.d.ts` and must not overwrite the file-module declaration.
51
51
 
52
52
  Output must remain inside the consumer project, outside `node_modules` and the `@featherk/icons` package. The independent runtime `createFontAwesomeService` is available from `@featherk/icons/fontawesome`; Node tooling is never imported through the custom-icon root service.
53
53
 
@@ -105,9 +105,9 @@ Two supported Vite layouts are:
105
105
 
106
106
  For non-Vite applications or declaration generation before a standalone type check, follow [CLI and non-Vite setup](FontAwesomeCLI.md). Registry authentication still belongs to the authorized package installation environment; the generator and browser never receive the token.
107
107
 
108
- For Vite, use `featherkFontAwesome({ icons, sourceRoot: "pro" })`. The profile scripts above are repository demo helpers, not scripts automatically installed into consumer applications.
108
+ For Vite, pass only selected catalog keys and opt in at the profile level, for example `featherkFontAwesome({ keys, allowPro: true, sourceRoot: "pro" })`. Keep Pro keys in the app's optional Pro group and include them only in an authorized build profile. The profile scripts above are repository demo helpers, not scripts automatically installed into consumer applications. The `allowPro` option prevents accidental selection; it does not verify license entitlement.
109
109
 
110
- For applications using both Free and Pro, UX/Design approves both selection sets; Dev enables them together in the build manifest. Optional profiles must not silently include paid inputs in public/uncredentialed builds. Follow the [generated-output ignore guidance](FontAwesome.md#generated-output-and-source-checks): exclude generated files from ESLint/Prettier/Git while retaining TypeScript checks.
110
+ For applications using both Free and Pro, UX provides catalog keys for both tiers; Dev keeps Free and Pro keys in the shared keys-only selection file and includes Pro keys only in the explicit authorized profile. Optional profiles must not silently include paid inputs in public/uncredentialed builds. Follow the [generated-output ignore guidance](FontAwesome.md#generated-output-and-source-checks): exclude generated files from ESLint/Prettier/Git while retaining TypeScript checks.
111
111
 
112
112
  ## CI and Deployment
113
113
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@featherk/icons",
3
- "version": "0.14.1",
3
+ "version": "0.15.0",
4
4
  "main": "dist/featherk-icons.umd.js",
5
5
  "module": "dist/featherk-icons.es.js",
6
6
  "types": "dist/index.d.ts",
@@ -25,6 +25,11 @@
25
25
  "import": "./dist/fontawesome/vite.mjs",
26
26
  "require": "./dist/fontawesome/vite.cjs"
27
27
  },
28
+ "./fontawesome/catalog": {
29
+ "types": "./dist/fontawesome/catalog.d.ts",
30
+ "import": "./dist/fontawesome/catalog.mjs",
31
+ "require": "./dist/fontawesome/catalog.cjs"
32
+ },
28
33
  "./package.json": "./package.json"
29
34
  },
30
35
  "files": [