@f-ewald/components 0.6.0 → 1.0.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.
Files changed (75) hide show
  1. package/README.md +101 -44
  2. package/custom-elements.json +2570 -877
  3. package/dist/calendar-entry.d.ts +33 -0
  4. package/dist/calendar-entry.d.ts.map +1 -0
  5. package/dist/calendar-entry.js +64 -0
  6. package/dist/calendar-entry.js.map +1 -0
  7. package/dist/calendar-month.d.ts +67 -0
  8. package/dist/calendar-month.d.ts.map +1 -0
  9. package/dist/calendar-month.js +455 -0
  10. package/dist/calendar-month.js.map +1 -0
  11. package/dist/calendar-year.d.ts +43 -0
  12. package/dist/calendar-year.d.ts.map +1 -0
  13. package/dist/calendar-year.js +136 -0
  14. package/dist/calendar-year.js.map +1 -0
  15. package/dist/dropdown-button.d.ts +37 -0
  16. package/dist/dropdown-button.d.ts.map +1 -0
  17. package/dist/dropdown-button.js +219 -0
  18. package/dist/dropdown-button.js.map +1 -0
  19. package/dist/form-select.d.ts +27 -2
  20. package/dist/form-select.d.ts.map +1 -1
  21. package/dist/form-select.js +440 -27
  22. package/dist/form-select.js.map +1 -1
  23. package/dist/frame-box.d.ts +22 -0
  24. package/dist/frame-box.d.ts.map +1 -0
  25. package/dist/frame-box.js +68 -0
  26. package/dist/frame-box.js.map +1 -0
  27. package/dist/icon-button.d.ts +27 -0
  28. package/dist/icon-button.d.ts.map +1 -0
  29. package/dist/icon-button.js +83 -0
  30. package/dist/icon-button.js.map +1 -0
  31. package/dist/icons.d.ts +1 -0
  32. package/dist/icons.d.ts.map +1 -1
  33. package/dist/icons.js +1 -0
  34. package/dist/icons.js.map +1 -1
  35. package/dist/index.d.ts +6 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +6 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/map-circle.d.ts +3 -0
  40. package/dist/map-circle.d.ts.map +1 -1
  41. package/dist/map-circle.js +3 -0
  42. package/dist/map-circle.js.map +1 -1
  43. package/dist/mcp-server.d.ts +3 -0
  44. package/dist/mcp-server.d.ts.map +1 -0
  45. package/dist/mcp-server.js +82 -0
  46. package/dist/mcp-server.js.map +1 -0
  47. package/dist/popover-panel.d.ts +3 -0
  48. package/dist/popover-panel.d.ts.map +1 -1
  49. package/dist/popover-panel.js +11 -0
  50. package/dist/popover-panel.js.map +1 -1
  51. package/dist/tokens.css +4 -0
  52. package/dist/tokens.d.ts.map +1 -1
  53. package/dist/tokens.js +3 -0
  54. package/dist/tokens.js.map +1 -1
  55. package/dist/utils/calendar.d.ts +77 -0
  56. package/dist/utils/calendar.d.ts.map +1 -0
  57. package/dist/utils/calendar.js +135 -0
  58. package/dist/utils/calendar.js.map +1 -0
  59. package/docs/calendar-entry.md +53 -0
  60. package/docs/calendar-month.md +77 -0
  61. package/docs/calendar-year.md +53 -0
  62. package/docs/dropdown-button.md +61 -0
  63. package/docs/form-select.md +21 -3
  64. package/docs/frame-box.md +43 -0
  65. package/docs/icon-button.md +52 -0
  66. package/docs/map-circle.md +4 -0
  67. package/docs/mcp-evaluation.md +18 -11
  68. package/docs/popover-panel.md +5 -1
  69. package/llms.txt +194 -28
  70. package/package.json +19 -4
  71. package/dist/map-point.d.ts +0 -31
  72. package/dist/map-point.d.ts.map +0 -1
  73. package/dist/map-point.js +0 -83
  74. package/dist/map-point.js.map +0 -1
  75. package/docs/map-point.md +0 -44
package/README.md CHANGED
@@ -3,6 +3,9 @@
3
3
  [![npm](https://img.shields.io/npm/v/@f-ewald/components)](https://www.npmjs.com/package/@f-ewald/components)
4
4
  [![license](https://img.shields.io/badge/license-BSD--3--Clause-blue)](./LICENSE)
5
5
 
6
+ [Documentation](https://f-ewald.github.io/components/) ·
7
+ [Playground](https://f-ewald.github.io/components/playground/)
8
+
6
9
  A collection of self-contained [Lit](https://lit.dev) web components sharing a
7
10
  Tailwind-inspired design token system. Every component is individually
8
11
  importable and ships its own TypeScript types plus a checked-in
@@ -41,40 +44,45 @@ import "@f-ewald/components/roman-numeral.js";
41
44
 
42
45
  | Component | Docs |
43
46
  | --- | --- |
44
- | `<address-autocomplete>` | [docs/address-autocomplete.md](./docs/address-autocomplete.md) |
45
- | `<animate-confetti>` | [docs/animate-confetti.md](./docs/animate-confetti.md) |
46
- | `<autocomplete-input>` | [docs/autocomplete-input.md](./docs/autocomplete-input.md) |
47
- | `<chat-message>` | [docs/chat-message.md](./docs/chat-message.md) |
48
- | `<confirm-dialog>` | [docs/confirm-dialog.md](./docs/confirm-dialog.md) |
49
- | `<copy-link-button>` | [docs/copy-link-button.md](./docs/copy-link-button.md) |
50
- | `<data-table>` | [docs/data-table.md](./docs/data-table.md) |
51
- | `<distance-value>` | [docs/distance-value.md](./docs/distance-value.md) |
52
- | `<distribution-chart>` | [docs/distribution-chart.md](./docs/distribution-chart.md) |
53
- | `<editable-text>` | [docs/editable-text.md](./docs/editable-text.md) |
54
- | `<form-select>` | [docs/form-select.md](./docs/form-select.md) |
55
- | `<gallery-item>` | [docs/gallery-item.md](./docs/gallery-item.md) |
56
- | `<gallery-item-variant>` | [docs/gallery-item-variant.md](./docs/gallery-item-variant.md) |
57
- | `<live-timer>` | [docs/live-timer.md](./docs/live-timer.md) |
58
- | `<map-circle>` | [docs/map-circle.md](./docs/map-circle.md) |
59
- | `<map-pin>` | [docs/map-pin.md](./docs/map-pin.md) |
60
- | `<map-point>` | [docs/map-point.md](./docs/map-point.md) |
61
- | `<percent-bar-chart>` | [docs/percent-bar-chart.md](./docs/percent-bar-chart.md) |
62
- | `<photo-gallery>` | [docs/photo-gallery.md](./docs/photo-gallery.md) |
63
- | `<popover-panel>` | [docs/popover-panel.md](./docs/popover-panel.md) |
64
- | `<price-history-chart>` | [docs/price-history-chart.md](./docs/price-history-chart.md) |
65
- | `<radio-cards>` | [docs/radio-cards.md](./docs/radio-cards.md) |
66
- | `<radio-pills>` | [docs/radio-pills.md](./docs/radio-pills.md) |
67
- | `<relative-time>` | [docs/relative-time.md](./docs/relative-time.md) |
68
- | `<reveal-button>` | [docs/reveal-button.md](./docs/reveal-button.md) |
69
- | `<roman-numeral>` | [docs/roman-numeral.md](./docs/roman-numeral.md) |
70
- | `<slide-panel>` | [docs/slide-panel.md](./docs/slide-panel.md) |
71
- | `<stat-meter>` | [docs/stat-meter.md](./docs/stat-meter.md) |
72
- | `<status-pill>` | [docs/status-pill.md](./docs/status-pill.md) |
73
- | `<tile-grid>` | [docs/tile-grid.md](./docs/tile-grid.md) |
74
- | `<toast-notification>` | [docs/toast-notification.md](./docs/toast-notification.md) |
75
- | `<ui-button>` | [docs/ui-button.md](./docs/ui-button.md) |
76
- | `<user-avatar>` | [docs/user-avatar.md](./docs/user-avatar.md) |
77
- | `<weight-bar-chart>` | [docs/weight-bar-chart.md](./docs/weight-bar-chart.md) |
47
+ | `<address-autocomplete>` | [API reference](https://f-ewald.github.io/components/docs/address-autocomplete.html) |
48
+ | `<animate-confetti>` | [API reference](https://f-ewald.github.io/components/docs/animate-confetti.html) |
49
+ | `<autocomplete-input>` | [API reference](https://f-ewald.github.io/components/docs/autocomplete-input.html) |
50
+ | `<calendar-entry>` | [API reference](https://f-ewald.github.io/components/docs/calendar-entry.html) |
51
+ | `<calendar-month>` | [API reference](https://f-ewald.github.io/components/docs/calendar-month.html) |
52
+ | `<calendar-year>` | [API reference](https://f-ewald.github.io/components/docs/calendar-year.html) |
53
+ | `<chat-message>` | [API reference](https://f-ewald.github.io/components/docs/chat-message.html) |
54
+ | `<confirm-dialog>` | [API reference](https://f-ewald.github.io/components/docs/confirm-dialog.html) |
55
+ | `<copy-link-button>` | [API reference](https://f-ewald.github.io/components/docs/copy-link-button.html) |
56
+ | `<data-table>` | [API reference](https://f-ewald.github.io/components/docs/data-table.html) |
57
+ | `<distance-value>` | [API reference](https://f-ewald.github.io/components/docs/distance-value.html) |
58
+ | `<distribution-chart>` | [API reference](https://f-ewald.github.io/components/docs/distribution-chart.html) |
59
+ | `<dropdown-button>` | [API reference](https://f-ewald.github.io/components/docs/dropdown-button.html) |
60
+ | `<editable-text>` | [API reference](https://f-ewald.github.io/components/docs/editable-text.html) |
61
+ | `<form-select>` | [API reference](https://f-ewald.github.io/components/docs/form-select.html) |
62
+ | `<frame-box>` | [API reference](https://f-ewald.github.io/components/docs/frame-box.html) |
63
+ | `<gallery-item>` | [API reference](https://f-ewald.github.io/components/docs/gallery-item.html) |
64
+ | `<gallery-item-variant>` | [API reference](https://f-ewald.github.io/components/docs/gallery-item-variant.html) |
65
+ | `<icon-button>` | [API reference](https://f-ewald.github.io/components/docs/icon-button.html) |
66
+ | `<live-timer>` | [API reference](https://f-ewald.github.io/components/docs/live-timer.html) |
67
+ | `<map-circle>` | [API reference](https://f-ewald.github.io/components/docs/map-circle.html) |
68
+ | `<map-pin>` | [API reference](https://f-ewald.github.io/components/docs/map-pin.html) |
69
+ | `<percent-bar-chart>` | [API reference](https://f-ewald.github.io/components/docs/percent-bar-chart.html) |
70
+ | `<photo-gallery>` | [API reference](https://f-ewald.github.io/components/docs/photo-gallery.html) |
71
+ | `<popover-panel>` | [API reference](https://f-ewald.github.io/components/docs/popover-panel.html) |
72
+ | `<price-history-chart>` | [API reference](https://f-ewald.github.io/components/docs/price-history-chart.html) |
73
+ | `<radio-cards>` | [API reference](https://f-ewald.github.io/components/docs/radio-cards.html) |
74
+ | `<radio-pills>` | [API reference](https://f-ewald.github.io/components/docs/radio-pills.html) |
75
+ | `<relative-time>` | [API reference](https://f-ewald.github.io/components/docs/relative-time.html) |
76
+ | `<reveal-button>` | [API reference](https://f-ewald.github.io/components/docs/reveal-button.html) |
77
+ | `<roman-numeral>` | [API reference](https://f-ewald.github.io/components/docs/roman-numeral.html) |
78
+ | `<slide-panel>` | [API reference](https://f-ewald.github.io/components/docs/slide-panel.html) |
79
+ | `<stat-meter>` | [API reference](https://f-ewald.github.io/components/docs/stat-meter.html) |
80
+ | `<status-pill>` | [API reference](https://f-ewald.github.io/components/docs/status-pill.html) |
81
+ | `<tile-grid>` | [API reference](https://f-ewald.github.io/components/docs/tile-grid.html) |
82
+ | `<toast-notification>` | [API reference](https://f-ewald.github.io/components/docs/toast-notification.html) |
83
+ | `<ui-button>` | [API reference](https://f-ewald.github.io/components/docs/ui-button.html) |
84
+ | `<user-avatar>` | [API reference](https://f-ewald.github.io/components/docs/user-avatar.html) |
85
+ | `<weight-bar-chart>` | [API reference](https://f-ewald.github.io/components/docs/weight-bar-chart.html) |
78
86
 
79
87
  Each doc lists the component's attributes/properties, events, slots, and the
80
88
  `--ui-*` CSS custom properties it consumes. For a machine-readable summary of
@@ -120,6 +128,36 @@ set. Don't reintroduce that pattern.)
120
128
 
121
129
  The full token set is defined in [`src/tokens.ts`](./src/tokens.ts).
122
130
 
131
+ ## MCP server
132
+
133
+ `npm run mcp` (or `node dist/mcp-server.js` after `npm run build`) starts a
134
+ stdio [MCP](https://modelcontextprotocol.io) server exposing the component
135
+ catalog to AI coding assistants, with two tools:
136
+
137
+ - `list_components` — every tag + one-line description.
138
+ - `get_component_docs(tag)` — the full generated Markdown doc for one tag
139
+ (install snippet, usage example, attributes/properties, events, slots,
140
+ CSS custom properties).
141
+
142
+ It's read-only over the same `custom-elements.json`/`docs/*.md` this package
143
+ already generates via `npm run docs` — no separate data source to maintain.
144
+ A consuming project wires it up with a `.mcp.json` at its repo root:
145
+
146
+ ```json
147
+ {
148
+ "mcpServers": {
149
+ "f-ewald-components": {
150
+ "command": "node",
151
+ "args": ["/absolute/path/to/components/dist/mcp-server.js"]
152
+ }
153
+ }
154
+ }
155
+ ```
156
+
157
+ See the "MCP server" section in [`CLAUDE.md`](./CLAUDE.md) for more, and
158
+ [`docs/mcp-evaluation.md`](./docs/mcp-evaluation.md) for why this was built
159
+ now rather than earlier.
160
+
123
161
  ## Playground / development
124
162
 
125
163
  ```bash
@@ -133,8 +171,17 @@ sources are imported directly from `src/`, so edits hot-reload.
133
171
 
134
172
  ```bash
135
173
  npm run build:demo # static build of the playground, into demo-dist/
174
+ npm run build:site # docs + playground Pages artifact, into pages-dist/
175
+ npm run preview:site # preview the exact Pages artifact locally
176
+ npm run test:site # smoke-test the built documentation and playground
136
177
  ```
137
178
 
179
+ The combined site is deployed automatically from `main` to
180
+ [GitHub Pages](https://f-ewald.github.io/components/). The workflow reads the
181
+ repository and publishes `pages-dist/`; it has no permission or persisted
182
+ credential capable of changing repository files, branches, tags, or pull
183
+ requests.
184
+
138
185
  ## Development commands
139
186
 
140
187
  | Command | Purpose |
@@ -142,10 +189,14 @@ npm run build:demo # static build of the playground, into demo-dist/
142
189
  | `npm run dev` | Start the Vite playground with HMR. |
143
190
  | `npm run build` | Compile `src/` with `tsc` into `dist/`, and generate `dist/tokens.css`. |
144
191
  | `npm run build:demo` | Build the static playground into `demo-dist/`. |
192
+ | `npm run build:site` | Build the static documentation and nested playground into `pages-dist/`. |
193
+ | `npm run preview:site` | Preview the built Pages artifact locally. |
145
194
  | `npm run icons` | Regenerate `src/icons.ts` from the Heroicons package. |
146
195
  | `npm run analyze` | Regenerate `custom-elements.json` via the custom-elements-manifest analyzer. |
147
196
  | `npm run docs` | Regenerate the manifest, `docs/*.md`, and `llms.txt`. |
197
+ | `npm run mcp` | Run the MCP server (`dist/mcp-server.js`) directly, for manual testing. |
148
198
  | `npm run test` | Run the Playwright suite against the playground. |
199
+ | `npm run test:site` | Run the Playwright smoke suite against `pages-dist/`. |
149
200
 
150
201
  ## Contributing
151
202
 
@@ -157,25 +208,31 @@ npm run build:demo # static build of the playground, into demo-dist/
157
208
  the `tsc`-emitted `dist/` output resolves correctly for consumers.
158
209
  - Run `npm run docs` after changing any component's public API so the
159
210
  generated docs and `llms.txt` stay in sync.
211
+ - `npm run build:site` only reads those checked-in documentation inputs and
212
+ writes ignored `pages-dist/`; it never updates tracked generated files.
160
213
 
161
214
  ## Publishing
162
215
 
163
- First publish (package is not yet on the npm registry):
164
-
165
- ```bash
166
- npm login # if needed
167
- npm publish --access public
168
- ```
216
+ Releases are published automatically by
217
+ [`.github/workflows/npm-publish.yml`](./.github/workflows/npm-publish.yml)
218
+ when a strict `vX.Y.Z` tag is pushed. The workflow validates the tag against
219
+ both package manifests, runs the full `prepublishOnly` gate, and publishes via
220
+ npm Trusted Publishing with provenance—no `NPM_TOKEN` repository secret.
169
221
 
170
- Subsequent releases:
222
+ Configure the `@f-ewald/components` npmjs package once with a GitHub Actions
223
+ Trusted Publisher for owner `f-ewald`, repository `components`, workflow
224
+ `npm-publish.yml`, no environment, and **Allowed actions: npm publish**. Then
225
+ release only after all source and generated-doc changes are committed:
171
226
 
172
227
  ```bash
173
228
  npm version <patch|minor|major>
174
- npm publish
229
+ git push origin main --follow-tags
175
230
  ```
176
231
 
177
- `prepublishOnly` runs `build`, `docs`, and `test` automatically before every
178
- publish.
232
+ `npm version` must create the matching annotated `vX.Y.Z` tag on the version
233
+ commit; every version bump requires that tag, beginning with `v1.0.0`. The
234
+ initial local `v1.0.0` tag was moved to the release-workflow commit before
235
+ its first push; published tags must never be moved.
179
236
 
180
237
  ## License
181
238