@maggioli-design-system/magma-react 2.1.0 → 2.3.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.
- package/AGENTS.md +26 -10
- package/CHANGELOG.md +478 -0
- package/agents/assets.md +231 -28
- package/agents/color.md +5 -3
- package/agents/components.md +3 -3
- package/agents/install.md +37 -4
- package/agents/reporting.md +127 -0
- package/agents/theming.md +15 -0
- package/dist/mds-input-date-range.server.js +1 -0
- package/dist/mds-input-date.server.js +1 -0
- package/dist/mds-input-select.server.js +1 -0
- package/dist/mds-input.server.js +1 -0
- package/dist/mds-table-header-cell.js +1 -1
- package/dist/mds-table-header-cell.server.js +1 -0
- package/dist/mds-table.server.js +2 -1
- package/dist/mds-tooltip.server.js +1 -0
- package/dist/mds-usage.server.js +2 -1
- package/dist/types/mds-table-header-cell.d.ts +5 -2
- package/dist/types/mds-table-header-cell.server.d.ts +5 -2
- package/package.json +4 -3
package/AGENTS.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
-->
|
|
6
6
|
# @maggioli-design-system/magma-react - agent install guide
|
|
7
7
|
|
|
8
|
-
> Version 2.
|
|
8
|
+
> Version 2.3.0. You (the agent) are installing Magma into THIS project. Do not
|
|
9
9
|
> assume the setup - detect it from the project, then ask the user only for what you
|
|
10
10
|
> cannot infer. The detailed steps live in [`agents/install.md`](agents/install.md)
|
|
11
11
|
> (this target) and [`agents/assets.md`](agents/assets.md) (shared styles, fonts,
|
|
@@ -23,31 +23,44 @@ Inspect the consumer project before asking anything:
|
|
|
23
23
|
| Tailwind + version | `tailwindcss` in deps: v4 -> the CSS imports, v3 -> the JS preset (see agents/assets.md) |
|
|
24
24
|
| SSR | `@angular/ssr` / Angular Universal, or Next App Router |
|
|
25
25
|
| Compatible versions | derive from the installed `@maggioli-design-system/magma` major (see matrix in install.md) |
|
|
26
|
+
| Editor | a `.vscode/` folder -> VS Code; nothing -> ask (step 2) |
|
|
26
27
|
|
|
27
28
|
## Step 2 - ask only the gaps
|
|
28
29
|
|
|
29
30
|
Ask the user only what detection left undecided. Typical questions:
|
|
30
31
|
|
|
31
|
-
1. **Icons**:
|
|
32
|
-
|
|
33
|
-
Magma
|
|
34
|
-
|
|
32
|
+
1. **Icons**: which sets does the app use, and how should they be served? Every slug must
|
|
33
|
+
be served at `<mdsIconSvgPath><slug>.svg`, and each set comes from its own package:
|
|
34
|
+
Magma ships only `mgg/` (`@maggioli-design-system/svg-icons`), while `mi/` and
|
|
35
|
+
`mdi/` come from `@material-icons/svg` and `@mdi/svg`, and none of them is a
|
|
36
|
+
dependency of this package. The routes are in agents/assets.md section 3: **iconsauce**,
|
|
37
|
+
what Magma uses (it reads the sources and writes only the icons they name), or a copy
|
|
38
|
+
script that serves the files in the slug layout. Copying the `svg-icons` folder as it
|
|
39
|
+
is renders nothing: its files are not under `mgg/`.
|
|
35
40
|
2. **Static assets path**: where are static files served from? This sets `mdsIconSvgPath`
|
|
36
41
|
and the SVG copy destination.
|
|
37
42
|
3. **Dark mode / preferences**: needed? If yes, wire the preference classes and components.
|
|
38
43
|
4. Confirm the version row if the installed major is ambiguous.
|
|
44
|
+
5. **Editor**: VS Code? It gets token and class autocomplete through two files in
|
|
45
|
+
`.vscode/` (agents/assets.md section 5); for another editor only the token file applies.
|
|
39
46
|
|
|
40
47
|
## Step 3 - execute
|
|
41
48
|
|
|
42
49
|
1. Install packages and the shared assets - see [`agents/install.md`](agents/install.md).
|
|
43
50
|
2. Wire styles in the exact cascade-layer order - see [`agents/assets.md`](agents/assets.md).
|
|
44
|
-
3.
|
|
51
|
+
3. Serve every icon slug the app uses at the static path, with the route from step 2, and
|
|
52
|
+
set `mdsIconSvgPath`.
|
|
45
53
|
4. Register components: import the Mds* components from '@maggioli-design-system/magma-react' (no defineCustomElements needed).
|
|
54
|
+
5. Set up editor autocomplete - see [`agents/assets.md`](agents/assets.md) section 5: MERGE the
|
|
55
|
+
keys into `.vscode/settings.json` and `.vscode/extensions.json`, never overwrite them.
|
|
46
56
|
|
|
47
57
|
## Step 4 - verify
|
|
48
58
|
|
|
49
|
-
Build the app and confirm an `mds-*` component renders and
|
|
50
|
-
the configured path
|
|
59
|
+
Build the app and confirm an `mds-*` component renders and every icon it names loads
|
|
60
|
+
from the configured path (no 404 on `<path><slug>.svg`). In VS Code, check both halves of
|
|
61
|
+
the autocomplete: `var(--magma-` completes Magma tokens in a CSS file and, with Tailwind,
|
|
62
|
+
`bg-surface-default` shows a swatch. Report what was installed, the cascade order used, the
|
|
63
|
+
icon route and the icon path.
|
|
51
64
|
|
|
52
65
|
## Using the components
|
|
53
66
|
|
|
@@ -64,8 +77,11 @@ Once installed, do not guess component APIs or rules - read only the file you ne
|
|
|
64
77
|
| Coloring your own UI | [`agents/color.md`](agents/color.md) |
|
|
65
78
|
| Typography utilities | [`agents/typography.md`](agents/typography.md) |
|
|
66
79
|
| Dark mode, preferences, named themes, surface levels and elevation, global design decisions, corner geometry | [`agents/theming.md`](agents/theming.md) |
|
|
80
|
+
| Reporting a problem that is Magma's, not this project's (bug, wrong guide, missing token), with this project's origin label | [`agents/reporting.md`](agents/reporting.md) |
|
|
81
|
+
| What changed between the installed version and a newer one, before upgrading | `CHANGELOG.md` of each Magma package, newest release first (`magma-react` and `magma-angular` carry the releases of `magma`) |
|
|
67
82
|
|
|
68
83
|
Tooling that needs structured data reads `documentation.json`: one per component beside
|
|
69
84
|
its `AGENTS.md`, or `@maggioli-design-system/magma/dist/documentation.json` for all of them
|
|
70
|
-
(over 2 MB - do not load it into context). `
|
|
71
|
-
|
|
85
|
+
(over 2 MB - do not load it into context). In both, the relative links of the `usage`
|
|
86
|
+
texts resolve from the component's folder, `dist/collection/components/<tag>/`.
|
|
87
|
+
`dist/types/components.d.ts` drives editor IntelliSense.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Every release of `@maggioli-design-system/magma-react`, newest first. Each section is the body of the GitHub
|
|
4
|
+
release with the same tag, written by git-cliff from the conventional commits of the
|
|
5
|
+
package.
|
|
6
|
+
|
|
7
|
+
It is released together with `magma`, at the same version: the sections are the
|
|
8
|
+
releases of `magma`.
|
|
9
|
+
|
|
10
|
+
## [magma@2.3.0] - 2026-10-15
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- *(mds-text)* Read the animation custom properties when the reveal starts
|
|
15
|
+
- *(mds-text)* Paint the revealed text as text, never as html
|
|
16
|
+
- *(magma)* Keep the HTMLElement shim of the loader in consumer bundles
|
|
17
|
+
- *(mds-input-switch)* Give the off knob of a switch a light colour in dark mode
|
|
18
|
+
- *(mds-input-select)* Keep the hover and focus ring in dark mode and with more contrast
|
|
19
|
+
- *(magma)* Keep the icon lists of the story controls out of the published collection
|
|
20
|
+
- *(mds-table)* Paint the scroll area of an interactive table like its rows while hovered
|
|
21
|
+
- *(mds-pref-theme-item)* Show the color preview next to the label
|
|
22
|
+
- *(mds-pref-theme)* Show the label of the selected item in the trigger
|
|
23
|
+
- *(mds-tab,mds-input-switch)* Animate the slider and the knob only on a change of state
|
|
24
|
+
- *(mds-button)* Give back the icon slug title when another element names the button
|
|
25
|
+
- *(mds-pref)* Keep the document flag and the listeners across a move in the DOM
|
|
26
|
+
- *(mds-button)* Leave a button with an icon given as markup without a role again
|
|
27
|
+
- *(magma)* Lay out the label and the tab of every mds-pref-* control alike
|
|
28
|
+
- *(magma)* Cap the radius of buttons, tabs and fields at a part of their height
|
|
29
|
+
- *(mds-file)* Show the downloaded indicator again and drop crypto-js
|
|
30
|
+
- *(magma)* Name the icon-only buttons inside the components and give every mds-button its role
|
|
31
|
+
- *(mds-filter,mds-filter-item)* Announce the selected state and the count, name the reset button
|
|
32
|
+
- *(mds-filter)* Follow the selection the application sets on the items
|
|
33
|
+
- *(mds-list-item)* Take the text colour of the container instead of painting the items muted
|
|
34
|
+
|
|
35
|
+
### Build
|
|
36
|
+
|
|
37
|
+
- *(magma)* Prepend the release notes to each package's CHANGELOG.md in the release commit
|
|
38
|
+
- *(design-tokens,identity,styles,svg-icons,icons,magma)* Ship CHANGELOG.md in every package
|
|
39
|
+
|
|
40
|
+
### Documentation
|
|
41
|
+
|
|
42
|
+
- *(magma)* Say in the agent guides that hydrated.css keeps the box of the components
|
|
43
|
+
- *(magma)* Point the no-bundler loader example of the readme at a real file
|
|
44
|
+
- *(magma)* Document icon routes that serve every slug where mds-icon fetches it
|
|
45
|
+
- *(mds-text)* Regenerate the readme with the usage docs of the yugop fix
|
|
46
|
+
- *(magma)* Set up editor autocomplete in the agent guides, tokens and classes
|
|
47
|
+
- *(magma)* Link the shipped component docs from the agent guides, never plain text
|
|
48
|
+
- *(magma)* Say in the agent guides what the semantic utilities paint without semantic.css
|
|
49
|
+
- *(stencil)* Drop the hand-written sections of the component readmes
|
|
50
|
+
- *(magma)* Lead the icon path setup with IconsSetService and link the mds-icon pattern
|
|
51
|
+
- *(magma)* Have a reporting agent propose the origin label its project lacks
|
|
52
|
+
- *(magma)* Point the agent guides to the identity manifest
|
|
53
|
+
- *(stencil)* Say every mds-pref-* control also works on its own
|
|
54
|
+
- *(magma)* Point to the changelogs in AGENTS.md and in the commit convention
|
|
55
|
+
- *(mds-tab,mds-input-switch)* Regenerate the readmes from the usage docs
|
|
56
|
+
|
|
57
|
+
### Features
|
|
58
|
+
|
|
59
|
+
- *(mds-input,mds-input-select,mds-input-date,mds-input-date-range)* Add size (sm, md, lg)
|
|
60
|
+
- *(mds-tooltip)* Name the caller with relation="label"
|
|
61
|
+
- *(mds-usage)* Give each variant its own header icon and add an icon prop
|
|
62
|
+
- *(mds-table,mds-table-header-cell)* Emit mdsTableHeaderCellSort, let the back end sort the rows
|
|
63
|
+
|
|
64
|
+
### Performance
|
|
65
|
+
|
|
66
|
+
- *(mds-button)* Render the spinner only to await, the label without mds-text
|
|
67
|
+
- *(mds-button)* Write each tone once, over the tokens each variant names
|
|
68
|
+
- *(magma)* Prefix the component CSS for the supported browsers, not for IE 11
|
|
69
|
+
- *(magma)* Drop the fallback links that can never resolve
|
|
70
|
+
|
|
71
|
+
## [magma@2.2.0] - 2026-10-14
|
|
72
|
+
|
|
73
|
+
### Bug Fixes
|
|
74
|
+
|
|
75
|
+
- *(mds-table-row)* Show the actions of rows revealed by a streamed ssr boundary
|
|
76
|
+
|
|
77
|
+
### Build
|
|
78
|
+
|
|
79
|
+
- *(magma)* Pin typescript to 5.8.3, the version the lockfile installs
|
|
80
|
+
- *(magma)* Move to typescript 5.9.3 with typescript-eslint 8.71.2
|
|
81
|
+
|
|
82
|
+
### Documentation
|
|
83
|
+
|
|
84
|
+
- *(magma)* Label issues by the project they come from
|
|
85
|
+
- *(magma)* Never merge a branch with a red pipeline into dev
|
|
86
|
+
- *(magma)* Tell consumer-project agents how to report a Magma problem
|
|
87
|
+
|
|
88
|
+
### Features
|
|
89
|
+
|
|
90
|
+
- *(magma)* Render href as a real link and route it through NavigationService
|
|
91
|
+
|
|
92
|
+
### Refactor
|
|
93
|
+
|
|
94
|
+
- *(mds-table-row)* Compare sizerWidth with undefined for the actions margin
|
|
95
|
+
|
|
96
|
+
## [magma@2.1.0] - 2026-10-10
|
|
97
|
+
|
|
98
|
+
### Bug Fixes
|
|
99
|
+
|
|
100
|
+
- *(styles,magma)* Require internal dependencies as caret ranges
|
|
101
|
+
- *(magma)* Ship the agent docs in the magma and magma-react tarballs
|
|
102
|
+
- *(stencil)* Apply the mds-pref-* preference once on load, then mirror the shared store
|
|
103
|
+
- *(mds-pref)* Keep data-magma-pref on <html> until the last instance unmounts
|
|
104
|
+
- *(mds-input)* Rebuild the validators when a rule changes after load
|
|
105
|
+
- *(mds-input-date)* Validate again when required, min or max change after load
|
|
106
|
+
- *(mds-input-select)* Show the required tip red when the value is null
|
|
107
|
+
- *(mds-input)* Report the validity to the form, so that required stops the submit
|
|
108
|
+
- *(mds-input-date)* Report the validity to the form
|
|
109
|
+
- *(mds-input-select)* Report a required select left empty to the form
|
|
110
|
+
- *(mds-input-upload)* Submit the files to the form, like a native file input
|
|
111
|
+
- *(mds-input)* Bring back the value of load on a form reset
|
|
112
|
+
- *(mds-input)* Check pattern like a native input, and stop overwriting it
|
|
113
|
+
- *(mds-input)* Emit mdsInputKeydown on keydown, with the KeyboardEvent
|
|
114
|
+
- *(mds-input)* Keep the value when the browser has no Speech API
|
|
115
|
+
- *(mds-input)* Check the format of email and url like the native types
|
|
116
|
+
- *(mds-input)* Check the format of piva and cc
|
|
117
|
+
- *(mds-input-date)* Honour readonly, load pristine and bring back the value on reset
|
|
118
|
+
- *(mds-input-select)* Make multiple work, bring back the selection on reset
|
|
119
|
+
- *(mds-input-switch)* Keep one value per radio group, bring back checked on reset
|
|
120
|
+
- *(mds-input-otp)* Fill the cells from value, bring back the code on reset
|
|
121
|
+
- *(mds-input-range)* Fall back to step 1 like a native input, bring back the value on reset
|
|
122
|
+
- *(mds-input-date-range)* Bound the slotted fields, keep presets in order and in sync at load
|
|
123
|
+
- *(mds-input)* Disable it in a disabled fieldset, like a native input
|
|
124
|
+
- *(mds-input-date)* Disable it in a disabled fieldset, like a native date input
|
|
125
|
+
- *(mds-input-range)* Disable it in a disabled fieldset, like a native range input
|
|
126
|
+
- *(mds-input-select)* Disable it in a disabled fieldset, like a native select
|
|
127
|
+
- *(mds-input-switch)* Disable it in a disabled fieldset, like a native checkbox
|
|
128
|
+
- *(mds-input)* Stop the mic and the steppers on a field the user cannot change
|
|
129
|
+
- *(mds-button-dropdown,mds-button)* Disable the buttons in a disabled fieldset
|
|
130
|
+
|
|
131
|
+
### Build
|
|
132
|
+
|
|
133
|
+
- *(magma)* Pin internal dependencies as caret ranges
|
|
134
|
+
- *(stencil)* Write the public API snapshot magma.api.txt from the docs JSON
|
|
135
|
+
- *(stencil)* Compute the review level and the release check of a PR
|
|
136
|
+
- *(stencil)* Rate an event detail that extends the old one as minor
|
|
137
|
+
- *(stencil)* Record the disabled prop of three form inputs in magma.api.txt
|
|
138
|
+
- *(stencil)* Record the API changes of the button family in magma.api.txt
|
|
139
|
+
- *(stencil)* Declare a break no consumer can tell apart with API-Compatible
|
|
140
|
+
|
|
141
|
+
### Documentation
|
|
142
|
+
|
|
143
|
+
- *(storybook)* Render the usage docs in the components' Docs pages
|
|
144
|
+
- *(storybook)* Scroll the docs pages to the heading clicked in the table of contents (#834)
|
|
145
|
+
- *(storybook)* Move the Magma preferences to a toolbar menu
|
|
146
|
+
- *(magma,styles,design-tokens)* Rewrite the color docs on the semantic layer
|
|
147
|
+
- *(magma,styles,design-tokens)* Align the styles and design-tokens docs with the build
|
|
148
|
+
- *(magma,stencil)* Align the agent and component docs with the code
|
|
149
|
+
- *(magma,stencil)* Align the 342 component usage docs with the code
|
|
150
|
+
- *(stencil)* Tell how to place mds-table so it scrolls by itself
|
|
151
|
+
- *(magma)* Document how the form components report their validity
|
|
152
|
+
- *(magma)* Document how the form components submit, reset and report validity
|
|
153
|
+
- *(magma)* Say what disabled and a disabled fieldset do to the form components
|
|
154
|
+
- *(magma)* Every form input follows disabled and a disabled fieldset
|
|
155
|
+
- *(stencil)* Document the API snapshot in SPEC.md, AGENTS.md and the PR template
|
|
156
|
+
- *(magma)* Document the review levels and the release check
|
|
157
|
+
- *(stencil)* Put the form reset JSDoc back on formResetCallback
|
|
158
|
+
- *(mds-button)* Let the controls of the Await story drive it
|
|
159
|
+
- *(magma)* Say how the buttons submit a form and tell the actions apart
|
|
160
|
+
|
|
161
|
+
### Features
|
|
162
|
+
|
|
163
|
+
- *(magma)* Ship the agent docs as topic fragments and per-component docs
|
|
164
|
+
- *(mds-input-otp)* Add disabled, and disable it in a disabled fieldset
|
|
165
|
+
- *(mds-input-upload)* Add disabled, and disable it in a disabled fieldset
|
|
166
|
+
- *(mds-input-date-range)* Add disabled, and disable it in a disabled fieldset
|
|
167
|
+
- *(mds-input-upload,mds-input-select)* Record name and the selected values in magma.api.txt
|
|
168
|
+
- *(mds-button)* Send name and value to the form it submits, like a native submit button
|
|
169
|
+
- *(mds-button-dropdown,mds-button)* Submit a form from the primary action, with name and value
|
|
170
|
+
- *(mds-button-dropdown)* Emit mdsButtonDropdownClick from the primary action only
|
|
171
|
+
|
|
172
|
+
### Refactor
|
|
173
|
+
|
|
174
|
+
- *(magma)* Move the release scope matching to commit-scopes.mjs
|
|
175
|
+
|
|
176
|
+
## [magma@2.0.1] - 2026-10-05
|
|
177
|
+
|
|
178
|
+
### Bug Fixes
|
|
179
|
+
|
|
180
|
+
- *(mds-icon)* Bump idb-keyval to 6.3.0 so the icon cache reopens a closed IndexedDB connection
|
|
181
|
+
- *(mds-icon)* Keep the whole svg path instead of truncating it
|
|
182
|
+
- *(mds-icon)* Render nothing without a name and stop listening once removed from the page
|
|
183
|
+
- *(stencil)* Treat null and missing props as not set again
|
|
184
|
+
|
|
185
|
+
### Documentation
|
|
186
|
+
|
|
187
|
+
- *(storybook)* Resolve the story assets relative to the storybook base
|
|
188
|
+
- *(storybook)* Link the published storybook
|
|
189
|
+
|
|
190
|
+
### Performance
|
|
191
|
+
|
|
192
|
+
- *(mds-icon)* Check the memory cache before reading IndexedDB
|
|
193
|
+
|
|
194
|
+
## [magma@2.0.0] - 2026-09-30
|
|
195
|
+
|
|
196
|
+
### Bug Fixes
|
|
197
|
+
|
|
198
|
+
- *(mds-modal)* Fix bug animation display
|
|
199
|
+
- *(magma)* Generate agent docs before stencil build
|
|
200
|
+
- *(mds-keyboard,mds-filter-item,mds-paginator-item,mds-url-view)* Typo disconnectedCallback
|
|
201
|
+
- *(stencil)* Set private function
|
|
202
|
+
- *(stencil)* Resolve eslint doc warning
|
|
203
|
+
- *(mds-keyboard)* Remove redundant .bind on test button onClick
|
|
204
|
+
- *(stencil)* Remove .bind in JSX props flagged by react/jsx-no-bind
|
|
205
|
+
- *(stencil)* Resolve react/jsx-no-bind warnings
|
|
206
|
+
- *(stencil)* Avoid top-level call expression in mds-push-notification-item
|
|
207
|
+
- *(mds-icon)* Remove duplicated method
|
|
208
|
+
- *(storybook)* Use accordion disable-close in color-scale
|
|
209
|
+
- *(stencil)* Dedupe repeated @layer order statements in component CSS
|
|
210
|
+
- *(stencil)* Guard preference observer when MutationObserver is missing
|
|
211
|
+
- *(mds-modal)* Correct backdrop click-through selector
|
|
212
|
+
- *(mds-pref-language-item)* Tolerate unset code prop on first render
|
|
213
|
+
- *(mds-video-wall)* [**breaking**] Rename --mds-video-wall-noise-fitler to --mds-video-wall-noise-filter
|
|
214
|
+
- *(mds-file)* [**breaking**] Rename --mds-file-preview-icon-bacground to --mds-file-preview-icon-background
|
|
215
|
+
- *(mds-img)* Tolerate undefined src without crashing
|
|
216
|
+
- *(stencil)* Stop inline components stretching in grid/flex parents
|
|
217
|
+
- *(stencil)* Fall back to the default theme value, not the dark one
|
|
218
|
+
- *(mds-table)* Tolerate lifecycle races on slotted elements
|
|
219
|
+
- *(stencil)* Give the status icons a role, and the contrast that comes with it
|
|
220
|
+
- *(stencil)* Replace :scope selectors with SSR-safe direct-child queries
|
|
221
|
+
- *(stencil)* Guard browser-only APIs for the hydrate/SSR runtime
|
|
222
|
+
- *(stencil)* Declare pre-hydration host geometry
|
|
223
|
+
- *(mds-usage)* Paint the header with its own background token
|
|
224
|
+
- *(stencil)* Point the dead rings at the republished family, and the shadows at the role
|
|
225
|
+
- *(mds-text)* Guard unknown typography against the default variant
|
|
226
|
+
- *(mds-button)* Guard unknown size against the md typography
|
|
227
|
+
- *(stencil,styles)* Close the escape hatch of #624, and repair the registration snapshots
|
|
228
|
+
- *(mds-paginator)* Scroll on item focus only for keyboard navigation so clicks are not lost
|
|
229
|
+
- *(mds-calendar)* Keep the intrinsic width within --mds-calendar-max-width
|
|
230
|
+
- *(mds-input-date)* Give the dropdown calendar a definite width
|
|
231
|
+
- *(stencil)* Center the calendar day numbers and the input date icons
|
|
232
|
+
- *(mds-input-upload)* Widen the infos column and lay the main actions in a row
|
|
233
|
+
- *(mds-file-preview)* Show the extension fallback icon when the icon prop is unset
|
|
234
|
+
- *(mds-input-upload)* Move the width cap from the infos column to the progress bar
|
|
235
|
+
- *(stencil)* Correct the @Element types of three components
|
|
236
|
+
- *(mds-calendar)* Ignore invalid start-date and end-date instead of throwing
|
|
237
|
+
- *(mds-calendar)* Redraw the range and preview the hover without a parent
|
|
238
|
+
- *(mds-input)* Keep the password mask inside the rounded field
|
|
239
|
+
- *(stencil)* Wire the mds-chip selected state to the tokens the docs promise
|
|
240
|
+
- *(mds-emoji)* Keep the thinking pose centred and let expressions take the face over
|
|
241
|
+
- *(mds-emoji)* Keep the prerender out of the browser only pose restore
|
|
242
|
+
- *(mds-input-date-range)* Repair the :host() selector that voided the slotted color
|
|
243
|
+
- *(stencil)* Write the registered <number> opacities as numbers, not percentages
|
|
244
|
+
- *(stencil)* Delete the ten custom properties nothing ever reads
|
|
245
|
+
- *(stencil)* Drop the two dead properties the codemod manifest flagged
|
|
246
|
+
- *(mds-chip)* Expose the selected state to assistive technology
|
|
247
|
+
- *(stencil)* Remove the seven documented APIs that do not exist at all
|
|
248
|
+
- *(stencil)* Close the mechanical dead chains the full sweep found
|
|
249
|
+
- *(stencil)* Apply the two v1 renames we ship to consumers
|
|
250
|
+
- *(mds-table)* Raise the table background to the overlay surface
|
|
251
|
+
- *(mds-tooltip)* Describe the caller as a tooltip, not as a menu it controls
|
|
252
|
+
- *(mds-input-switch)* Make the native input the focusable, labelled control
|
|
253
|
+
- *(mds-tab-item)* Name icon-only tabs after the host title
|
|
254
|
+
- *(mds-keyboard)* Label the combination checker with aria-label
|
|
255
|
+
- *(mds-progress)* Expose the progress value and hide the nested radial gauge
|
|
256
|
+
- *(mds-details)* Expose the header as a disclosure button, not a banner
|
|
257
|
+
- *(mds-file-preview)* Drop the footer landmark from the infos row
|
|
258
|
+
- *(mds-input-field)* Validate the input that emitted inside the slotted element
|
|
259
|
+
- *(stencil)* Spell the pill one way, on the generated radius scale
|
|
260
|
+
- *(stencil)* Put the hand written radii back on the generated scale
|
|
261
|
+
- *(stencil)* Wire the button corner shape, drop the dead tab style queries
|
|
262
|
+
- *(mds-banner)* Show the actions slotted after the first render
|
|
263
|
+
- *(stencil)* Show the slotted content added after the first render
|
|
264
|
+
- *(mds-dropdown)* Leave the ARIA wiring off a caller that delegates its role
|
|
265
|
+
- *(mds-pref-theme-variant)* Drop the caption that never had a string
|
|
266
|
+
- *(mds-label)* Put the tag back on the pill it was drawn as
|
|
267
|
+
- *(mds-label)* Give the close button one state that shows
|
|
268
|
+
- *(storybook)* Emit the icons named only in the stories
|
|
269
|
+
- *(mds-modal)* Release the body scroll lock when the modal closes
|
|
270
|
+
- *(storybook)* Wrap the body tokens in rgb()
|
|
271
|
+
- *(mds-modal)* Let the page colour through the dialog
|
|
272
|
+
- *(mds-modal)* Measure the bars when the dialog becomes visible
|
|
273
|
+
- *(storybook)* Let the header do what it does on a page
|
|
274
|
+
- *(mds-button-group)* Decide the joined edges among the members of the group
|
|
275
|
+
- *(stencil)* Open a floating panel from its arrow, not from its middle
|
|
276
|
+
- *(mds-dropdown,mds-tooltip)* Place a panel that mounts already visible
|
|
277
|
+
- *(mds-filter)* Centre the selected item wherever the filter sits on the page
|
|
278
|
+
- *(mds-stepper-bar-item)* Number the steps by position, not by child node
|
|
279
|
+
- *(stencil)* Position a floating panel only once it has a box to measure
|
|
280
|
+
- *(mds-dropdown)* Give the panel its outro back
|
|
281
|
+
- *(mds-input-select)* Draw the arrow the way mds-input-date draws its icon
|
|
282
|
+
- *(mds-input-select)* Stop the dark block from repainting the arrow
|
|
283
|
+
- *(mds-mention)* Give the remove button a switch and an event
|
|
284
|
+
- *(mds-table)* Count the selected rows in the batch actions badge
|
|
285
|
+
- *(mds-table-header)* Resolve the select-all switch before ticking it
|
|
286
|
+
- *(storybook)* Key the lists the stories build, and lint for it
|
|
287
|
+
- *(mds-button)* Keep the box of an icon-only button while it awaits
|
|
288
|
+
- *(mds-kpi-item)* Hold the line open while the value is still to come
|
|
289
|
+
- *(stencil)* Animate the text at its full length, from the first frame
|
|
290
|
+
- *(stencil)* Paint the two label variants that four components were missing
|
|
291
|
+
- *(mds-toast)* Park a toast that is not visible outside the screen
|
|
292
|
+
- *(stencil)* Hold back every transition under the animation preference
|
|
293
|
+
- *(stencil)* Let the animations written in JS read the preference too
|
|
294
|
+
- *(mds-tree-item)* End the branch on the icon that covers it
|
|
295
|
+
- *(mds-tree-item)* Give the shorter branch to the first child only
|
|
296
|
+
- *(mds-tree)* Stack the items, not the whitespace between them
|
|
297
|
+
- *(stencil)* Give the entries of a dropdown menu the role of entries
|
|
298
|
+
- *(mds-policy-ai)* Declare the chip panel a group, not a menu
|
|
299
|
+
- *(mds-modal)* Name the dialog, and leave only one of them
|
|
300
|
+
- *(mds-dropdown)* Wire the caller and the panel with references that resolve
|
|
301
|
+
- *(mds-dropdown)* Name the entries of the menu from the panel that declares it
|
|
302
|
+
- *(mds-tooltip)* Let the text of the tip reach the caller it describes
|
|
303
|
+
- *(mds-tab-item)* Let the tab tell whether the popup it opens is showing
|
|
304
|
+
- *(mds-dropdown)* Let go of the caller the target no longer names
|
|
305
|
+
- *(stencil)* Take the escape listener off window when it is detached
|
|
306
|
+
- *(mds-pref-theme)* Write the mode as --magma-pref-theme
|
|
307
|
+
- *(stencil)* Inject the global token fallbacks instead of writing them by hand
|
|
308
|
+
- *(storybook)* Align the chrome and the preview on one color scheme
|
|
309
|
+
- *(mds-badge)* Never fill the outline tone
|
|
310
|
+
- *(mds-progress)* Fill the status bars with the hue, not its ink
|
|
311
|
+
- *(mds-modal)* Keep the close icon visible on the scrim in dark
|
|
312
|
+
- *(mds-file)* Split the name from the extension at the last dot
|
|
313
|
+
|
|
314
|
+
### Build
|
|
315
|
+
|
|
316
|
+
- *(magma)* Cache agent docs as stencil build outputs
|
|
317
|
+
- *(magma)* Add all target building every project in dependency order
|
|
318
|
+
- *(magma)* Exclude storybook stories and test files from the stencil build
|
|
319
|
+
- *(magma)* Replace yarn with npm as the package manager
|
|
320
|
+
- *(magma)* Drop the @mdi/svg override in favor of @iconsauce/mdi-svg 1.1.0
|
|
321
|
+
- *(magma)* Update dependencies to fix npm audit vulnerabilities
|
|
322
|
+
- *(magma)* Update nx to 23.1.3
|
|
323
|
+
- *(magma)* Make clean-modules remove all nested node_modules and lockfiles
|
|
324
|
+
- *(magma)* Add the root lint configs to the lint target inputs
|
|
325
|
+
- *(magma)* Add @stencil/vitest and align vitest to 4.1.11
|
|
326
|
+
- *(storybook)* Move to the vite builder and run the stories with the vitest addon
|
|
327
|
+
- *(magma)* Declare each dependency in the project that uses it
|
|
328
|
+
- *(magma)* Resolve svg-icons from the workspace and make the Nx graph analysis explicit
|
|
329
|
+
- *(magma)* Pin the remaining dependency ranges
|
|
330
|
+
|
|
331
|
+
### Changes
|
|
332
|
+
|
|
333
|
+
- *(stencil)* Name the mode mode and the named theme theme
|
|
334
|
+
- *(mds-pref-mode)* Drop theme from the visible label
|
|
335
|
+
|
|
336
|
+
### Documentation
|
|
337
|
+
|
|
338
|
+
- *(magma)* Add module install instructions for agents
|
|
339
|
+
- *(stencil)* Update property descriptions and types across multiple components
|
|
340
|
+
- *(magma)* Rename install->agents, add usage guide + component catalogue
|
|
341
|
+
- *(stencil)* Update components readme
|
|
342
|
+
- *(stencil)* Update components.d.ts
|
|
343
|
+
- *(mds-accordion-item)* Align docs with disableClose rename
|
|
344
|
+
- *(mds-card-content)* Regenerate component docs
|
|
345
|
+
- *(mds-card-media)* Regenerate component docs
|
|
346
|
+
- *(magma)* Enhance issue templates with new fields and labels
|
|
347
|
+
- *(magma)* Add agentic git governance rules and PR template
|
|
348
|
+
- *(magma)* Require linking work branches to their github issue
|
|
349
|
+
- *(stencil)* Clarify the quiet tone migration mapping
|
|
350
|
+
- *(magma)* Require merge commits when promoting dev into main
|
|
351
|
+
- *(magma)* Detail repo structure in README
|
|
352
|
+
- *(magma)* Require PRs to list every resolved issue with a closing keyword
|
|
353
|
+
- *(stencil)* Add the Semantic roles reference story
|
|
354
|
+
- *(stencil)* Allinea la reference story al ruolo inverse-surface
|
|
355
|
+
- *(mds-usage)* Restate why the dark header overrides stay removed
|
|
356
|
+
- *(mds-paginator)* Clarify that the focus auto-scroll follows keyboard navigation only
|
|
357
|
+
- *(mds-calendar)* Document and register --mds-calendar-max-width
|
|
358
|
+
- *(magma)* Point contributor docs at npm instead of yarn
|
|
359
|
+
- *(magma)* Document the lint gate in CI
|
|
360
|
+
- *(magma)* Document the vitest based stencil tests
|
|
361
|
+
- *(mds-input)* Recommend autocomplete tokens on login fields
|
|
362
|
+
- *(mds-chip)* Regenerate the readme after the selected-state rewiring
|
|
363
|
+
- *(mds-emoji)* Restore the css custom properties table dropped by the rewiring
|
|
364
|
+
- *(magma)* Require a covering test for every behaviour change
|
|
365
|
+
- *(magma)* Point the test docs at the vitest storybook project
|
|
366
|
+
- *(styles,magma)* Document the corner axis, and stop recommending the hatch
|
|
367
|
+
- *(mds-dropdown)* Write down the roles of the panel, and point the examples at an id
|
|
368
|
+
- *(magma)* Let agents open pull requests into dev, still never merge them
|
|
369
|
+
- *(stencil)* Customize the entity and tree stories with semantic roles
|
|
370
|
+
- *(mds-badge)* Regenerate the readme for the outline note
|
|
371
|
+
- *(magma)* Document the wrapper tests
|
|
372
|
+
- *(magma)* Document the tag-only beta releases
|
|
373
|
+
- *(styles,magma)* Update the compatibility table for magma 2 stable
|
|
374
|
+
|
|
375
|
+
### Features
|
|
376
|
+
|
|
377
|
+
- *(mds-modal)* Update component properties and styles for improved functionality and consistency
|
|
378
|
+
- *(mds-modal)* Refine animation styles and transitions for improved modal behavior
|
|
379
|
+
- *(magma)* Add .browserslistrc for modern CSS support and update package dependencies
|
|
380
|
+
- *(mds-icon)* Expose IconsSetService to set the SVG path without sessionStorage
|
|
381
|
+
- *(mds-calendar,mds-input-date,mds-input-date-range)* Port magma 1.12 from support/v1.x
|
|
382
|
+
- *(stencil)* Inline the semantic layer as var() fallbacks
|
|
383
|
+
- *(stencil)* Adopt --magma-surface-* in surface components
|
|
384
|
+
- *(mds-table)* Consume semantic surfaces and flip text with the theme
|
|
385
|
+
- *(stencil)* Add the semantic surfaces Storybook cheat-sheet
|
|
386
|
+
- *(stencil)* Wire named themes into storybook and fix the variant components
|
|
387
|
+
- *(stencil)* Coordinate lock-dark between the pref theme lanes
|
|
388
|
+
- *(design-tokens,stencil,styles)* Collapse accent roles to {accent, ai}
|
|
389
|
+
- *(stencil)* [**breaking**] Make the published packages tree-shakeable
|
|
390
|
+
- *(design-tokens,styles,stencil)* Publish the hue role scales and promote them under pref-contrast-more
|
|
391
|
+
- *(styles,stencil)* Register the component custom properties from globals.css
|
|
392
|
+
- *(design-tokens,styles,stencil)* Retint the raw ramp with the theme via --magma-scale-*
|
|
393
|
+
- *(stencil)* Enable SSR with declarative shadow DOM
|
|
394
|
+
- *(stencil)* Add check.ssr guard for SSR regressions
|
|
395
|
+
- *(design-tokens,styles,stencil)* Give the colored hues the emphasis band states
|
|
396
|
+
- *(design-tokens,styles,stencil)* A shadow ink role, the ring family back, and a guard
|
|
397
|
+
- *(stencil)* Add hide-today to mds-calendar and the date inputs
|
|
398
|
+
- *(styles,stencil)* Emit the corner axis, shape and scale in one block
|
|
399
|
+
- *(stencil)* Point the shaped components at the shape-aware scale
|
|
400
|
+
- *(stencil)* Let mds-pref-theme-variant drive the corner axis
|
|
401
|
+
- *(stencil)* Forward an accessible name to the native controls of the inputs
|
|
402
|
+
- *(mds-dropdown)* Walk the menu with the keyboard, and close it back on the caller
|
|
403
|
+
|
|
404
|
+
### Refactor
|
|
405
|
+
|
|
406
|
+
- *(mds-modal)* Replace @apply with direct gap property for consistency
|
|
407
|
+
- *(mds-avatar-stack)* Drive slotted item size from parent, drop :host-context
|
|
408
|
+
- *(stencil)* Drive slotted child styling from parent, drop :host-context
|
|
409
|
+
- *(stencil)* Drop precautionary safari :host-context in size container queries
|
|
410
|
+
- *(stencil)* Remove ineffective safari :host-context gates
|
|
411
|
+
- *(mds-tab)* Propagate direction/animation to items, drop :host-context
|
|
412
|
+
- *(mds-table)* Propagate selection to rows, drop :host-context
|
|
413
|
+
- *(mds-tree)* Propagate toggle-position/appearance to items, drop :host-context
|
|
414
|
+
- *(mds-tree)* Resolve effective actions in JS, drop last :host-context
|
|
415
|
+
- *(stencil)* Respect strict boolean condition
|
|
416
|
+
- *(mds-accordion)* Rename closable to disableClose
|
|
417
|
+
- *(mds-banner)* Rename cockade to hideCockade
|
|
418
|
+
- *(mds-breadcrumb)* Rename back to hideBack
|
|
419
|
+
- *(mds-card)* Rename autoGrid to disableAutoGrid
|
|
420
|
+
- *(mds-dropdown)* Rename arrow/autoPlacement/shift/smooth to negative props
|
|
421
|
+
- *(mds-file)* Rename showDownloadedIcon to hideDownloadedIcon
|
|
422
|
+
- *(mds-header)* Rename backdrop to hideBackdrop
|
|
423
|
+
- *(mds-help)* Rename autoPlacement to disableAutoPlacement
|
|
424
|
+
- *(mds-input-date)* Use disable-auto-placement on dropdown
|
|
425
|
+
- *(mds-input-date-range)* Use disable-auto-placement on dropdown
|
|
426
|
+
- *(mds-modal)* Rename backdrop to hideBackdrop
|
|
427
|
+
- *(mds-notification)* Rename visible to dismissed
|
|
428
|
+
- *(mds-pref-language)* Drop autoPlacement on dropdown
|
|
429
|
+
- *(mds-pref-theme-variant)* Drop autoPlacement on dropdown
|
|
430
|
+
- *(mds-push-notification-item)* Default deletable to false
|
|
431
|
+
- *(mds-radial-menu-item)* Use disableAutoPlacement on tooltip
|
|
432
|
+
- *(mds-status-bar)* Use hideBackdrop on modal
|
|
433
|
+
- *(mds-tooltip)* Rename arrow/autoPlacement/shift to negative props
|
|
434
|
+
- *(stencil)* Align floating controller with negative floating props
|
|
435
|
+
- *(stencil)* [**breaking**] Drive language and preferences through a shared reactive store
|
|
436
|
+
- *(storybook)* Sync preview preferences through the addon channel
|
|
437
|
+
- *(mds-pref-language-item)* Use explicit comparisons in code validation
|
|
438
|
+
- *(stencil,styles)* [**breaking**] Migrate --tone-*(bare) usages to --tone-*-seed (#572)
|
|
439
|
+
- *(magma)* Move semantic.config into design-tokens to break the build cycle
|
|
440
|
+
- *(mds-toast)* Consuma il ruolo --magma-surface-inverse
|
|
441
|
+
- *(stencil)* Replace stale bare tone utilities in stories
|
|
442
|
+
- *(stencil)* Read the staged semantic layer from styles build dir
|
|
443
|
+
- *(stencil)* Migrate accent variant partials to semantic accent roles
|
|
444
|
+
- *(design-tokens,styles,stencil)* Name the hue background levels wash-*, not surface-*
|
|
445
|
+
- *(stencil)* Adopt semantic color roles in components
|
|
446
|
+
- *(stencil)* Adopt the semantic status roles where the value is identical
|
|
447
|
+
- *(stencil)* Give the step-04 inks a role, split by what they sit on
|
|
448
|
+
- *(stencil)* Put the status fills on the emphasis band
|
|
449
|
+
- *(stencil)* Adopt the neutral wash band for the pill backgrounds
|
|
450
|
+
- *(stencil)* Give the step-02 inks a role, by what they sit on
|
|
451
|
+
- *(stencil)* Give the status borders a role, strong where the border is the affordance
|
|
452
|
+
- *(magma)* Move the react and angular wrappers out of projects/stencil
|
|
453
|
+
- *(stencil)* [**breaking**] Invert the mds-calendar boolean props to their negative form
|
|
454
|
+
- *(mds-stepper-bar)* Scroll the strip from the boxes
|
|
455
|
+
- *(stencil)* Move the neutral seed backgrounds onto the surface roles
|
|
456
|
+
- *(stencil)* Give the remaining neutral seed grounds a role
|
|
457
|
+
- *(stencil)* Let the contrast layer paint the paper ground
|
|
458
|
+
- *(mds-badge)* Drop the leftovers of the text tone
|
|
459
|
+
- *(stencil)* Move the accent residues onto the accent roles
|
|
460
|
+
- *(stencil)* Move the raw status steps onto the hue roles
|
|
461
|
+
- *(stencil)* Move the ramp-step borders onto the border roles
|
|
462
|
+
- *(stencil)* Retire the ramp steps from the *-pref-* sheets
|
|
463
|
+
- *(stencil)* Move the dark variants onto the inverse roles
|
|
464
|
+
- *(stencil)* Move the step 02 inks onto text-default
|
|
465
|
+
- *(stencil)* Move the step 06 inks onto the text and border roles
|
|
466
|
+
- *(stencil)* Move the step 07 inks onto the text and border roles
|
|
467
|
+
- *(stencil)* Move the step 06/07 grounds onto the wash and border roles
|
|
468
|
+
- *(mds-input)* Align the commented counter hover with wash-base
|
|
469
|
+
- *(stencil)* Move the --magma-scale-NN uses with an identical role onto it
|
|
470
|
+
|
|
471
|
+
### Styling
|
|
472
|
+
|
|
473
|
+
- *(stencil)* Update accessibility feature with supported browser specs
|
|
474
|
+
- *(stencil)* Move apply tokens to custom proerty based tokens
|
|
475
|
+
- *(stencil)* Replace pref :host-context with dedicated attributes
|
|
476
|
+
- *(stencil)* Replace pref :host-context in variant files with attributes
|
|
477
|
+
- *(stencil)* Various component styles fixes
|
|
478
|
+
- *(stencil)* Quieter unchecked switch track in dark
|
package/agents/assets.md
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
## Purpose
|
|
9
9
|
|
|
10
10
|
Canonical setup for the assets every Magma consumer needs, **identical for all three
|
|
11
|
-
targets** (web components, React, Angular): styles, fonts, icons
|
|
12
|
-
identity. The per-target tracks ([`install.md`](install.md)) link here instead of repeating
|
|
11
|
+
targets** (web components, React, Angular): styles, fonts, icons, optional brand
|
|
12
|
+
identity and editor autocomplete. The per-target tracks ([`install.md`](install.md)) link here instead of repeating
|
|
13
13
|
this. If something about styles/fonts/icons setup is unclear, this file wins.
|
|
14
14
|
|
|
15
15
|
This file is the minimum to get a consumer running. Once it runs: coloring your own UI
|
|
@@ -72,10 +72,10 @@ What each file provides:
|
|
|
72
72
|
| `colors-rgb.css` | RGB color tokens (`--tone-*`, `--status-*`, ...). Required by components and Tailwind. Also redefines tokens for dark / high-contrast |
|
|
73
73
|
| `typography.css` | The non-color tokens as CSS vars: fonts, type sizes, spacing, radius, shadows (`--shadow-md-sharp`, ...). Components carry their own fallbacks; your CSS needs this file for `var(--shadow-*)`, `var(--radius-*)` and the `--magma-radius-*` corner scale |
|
|
74
74
|
| `reset.css` | Opinionated CSS reset |
|
|
75
|
-
| `hydrated.css` | Anti-FOUC for Stencil - hides components until hydrated |
|
|
75
|
+
| `hydrated.css` | Anti-FOUC for Stencil - hides components until hydrated, then keeps the margin, padding and border they give themselves against a page reset such as Tailwind's preflight. Import it into `base`, as above |
|
|
76
76
|
| `transitions.css`, `animations.css` | Shared motion |
|
|
77
77
|
| `globals.css` | Global `--magma-*` design decisions |
|
|
78
|
-
| `semantic.css` | The semantic color roles (`--magma-surface-*`, `--magma-text-*`, ..., see [`color.md`](color.md)). Required: without it the page `body` has no colour, the Tailwind role utilities
|
|
78
|
+
| `semantic.css` | The semantic color roles (`--magma-surface-*`, `--magma-text-*`, ..., see [`color.md`](color.md)). Required: without it the page `body` has no colour, the Tailwind role utilities are stuck on their light default (the fallback that gives editors a swatch), and components lose dark mode, named themes and high contrast |
|
|
79
79
|
| `themes.css` | The named themes (`data-theme-name`): retint the semantic roles. Import it after `semantic.css` |
|
|
80
80
|
| `base.css` | Base element styles (sets `--font-info` body font, etc.) |
|
|
81
81
|
|
|
@@ -129,40 +129,173 @@ the `vendor` cascade layer and ship offline.
|
|
|
129
129
|
## 3. Icons
|
|
130
130
|
|
|
131
131
|
Icons are consumed at runtime by `mds-icon`, which fetches each icon as an SVG file from
|
|
132
|
-
a path the host app configures.
|
|
133
|
-
|
|
134
|
-
`<mdsIconSvgPath><slug>.svg`: with the path `/svg/`, `mi/baseline/email` is fetched from
|
|
135
|
-
`/svg/mi/baseline/email.svg`.
|
|
132
|
+
a path the host app configures. The components' own icons are inlined, so what needs
|
|
133
|
+
serving is the icons the app names.
|
|
136
134
|
|
|
137
|
-
###
|
|
135
|
+
### The contract
|
|
136
|
+
|
|
137
|
+
Every slug the app uses must be served at `<mdsIconSvgPath><slug>.svg`: with the path
|
|
138
|
+
`/svg/`, `mi/baseline/email` is fetched from `/svg/mi/baseline/email.svg`. A slug starts
|
|
139
|
+
with its icon set, and each set comes from its own package, with its own layout:
|
|
140
|
+
|
|
141
|
+
| Slug | Set | Package | File in the package |
|
|
142
|
+
| ---- | --- | ------- | ------------------- |
|
|
143
|
+
| `mi/<variant>/<name>` | Material Icons | `@material-icons/svg` | `svg/<name>/<variant>.svg` |
|
|
144
|
+
| `mdi/<name>` | Material Design Icons | `@mdi/svg` | `svg/<name>.svg` |
|
|
145
|
+
| `mgg/<name>` | Maggioli | `@maggioli-design-system/svg-icons` | `dist/svg/<name>.svg` |
|
|
146
|
+
|
|
147
|
+
Magma ships only the `mgg/` set, and none of these packages is a dependency of `magma`,
|
|
148
|
+
`magma-react` or `magma-angular`: the route you pick installs what it needs. Copying the
|
|
149
|
+
`svg-icons` folder as it is does NOT follow the contract: its files sit directly in
|
|
150
|
+
`dist/svg/`, while `mds-icon` asks for them under `mgg/`.
|
|
151
|
+
|
|
152
|
+
`mds-usage` still fetches `mi/baseline/info` for its header: serve it too if the app
|
|
153
|
+
uses that component.
|
|
154
|
+
|
|
155
|
+
Any setup that follows the contract works. Two tested routes, both run before every dev
|
|
156
|
+
start and build, with the output folder kept out of git:
|
|
157
|
+
|
|
158
|
+
### Route 1: iconsauce (what Magma uses)
|
|
159
|
+
|
|
160
|
+
iconsauce reads the sources the way Tailwind reads class names and writes only the icons
|
|
161
|
+
they use, one SVG file per slug, in the folders `mds-icon` expects. Its plugins know the
|
|
162
|
+
three sets and bring their packages along.
|
|
138
163
|
|
|
139
164
|
```bash
|
|
140
|
-
npm i @
|
|
165
|
+
npm i -D @iconsauce/core @iconsauce/material-icons @iconsauce/mdi-svg @iconsauce/mgg-icons
|
|
141
166
|
```
|
|
142
167
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
168
|
+
```js
|
|
169
|
+
// iconsauce.config.mjs
|
|
170
|
+
import mi from '@iconsauce/material-icons';
|
|
171
|
+
import mdi from '@iconsauce/mdi-svg';
|
|
172
|
+
import mgg from '@iconsauce/mgg-icons';
|
|
146
173
|
|
|
147
|
-
|
|
174
|
+
export default {
|
|
175
|
+
content: ['./index.html', './src/**/*.{html,js,jsx,ts,tsx}'], // every file where icon slugs are written
|
|
176
|
+
plugin: [mi, mdi, mgg],
|
|
177
|
+
};
|
|
178
|
+
```
|
|
148
179
|
|
|
149
|
-
|
|
150
|
-
|
|
180
|
+
```json
|
|
181
|
+
"scripts": {
|
|
182
|
+
"icons": "iconsauce --config ./iconsauce.config.mjs --output-svg ./public/svg",
|
|
183
|
+
"predev": "npm run icons",
|
|
184
|
+
"prebuild": "npm run icons"
|
|
185
|
+
}
|
|
186
|
+
```
|
|
151
187
|
|
|
152
|
-
|
|
153
|
-
|
|
188
|
+
A slug built at runtime (`'mi/baseline/' + name`) is invisible to iconsauce: write slugs
|
|
189
|
+
in full, or list the computed ones in a file that `content` reads.
|
|
190
|
+
|
|
191
|
+
### Route 2: serve the files yourself
|
|
192
|
+
|
|
193
|
+
One renaming step: `@material-icons/svg` stores `<name>/<variant>.svg`, while the slug
|
|
194
|
+
wants `mi/<variant>/<name>`. `mdi/` and `mgg/` are plain folder copies. This script covers
|
|
195
|
+
the three sets with Node built-ins only, so it fits any bundler:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
npm i -D @maggioli-design-system/svg-icons @material-icons/svg @mdi/svg
|
|
154
199
|
```
|
|
155
200
|
|
|
156
|
-
|
|
157
|
-
|
|
201
|
+
```js
|
|
202
|
+
// scripts/copy-icons.mjs
|
|
203
|
+
// Copies Magma's icon sets where mds-icon fetches them: <OUT>/<slug>.svg.
|
|
204
|
+
// node scripts/copy-icons.mjs icons.json only the slugs listed in icons.json
|
|
205
|
+
// node scripts/copy-icons.mjs every icon of the three sets (18,720 files, 73 MB)
|
|
206
|
+
import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync } from 'node:fs';
|
|
207
|
+
import { createRequire } from 'node:module';
|
|
208
|
+
import { dirname, join } from 'node:path';
|
|
209
|
+
|
|
210
|
+
const OUT = 'public/svg'; // served at /svg/ by Vite, Next.js and the Angular CLI
|
|
211
|
+
const require = createRequire(import.meta.url);
|
|
212
|
+
const root = (pkg) => dirname(require.resolve(`${pkg}/package.json`));
|
|
213
|
+
const MI = join(root('@material-icons/svg'), 'svg'); // <name>/<variant>.svg
|
|
214
|
+
const MDI = join(root('@mdi/svg'), 'svg'); // <name>.svg
|
|
215
|
+
const MGG = join(root('@maggioli-design-system/svg-icons'), 'dist/svg'); // <name>.svg
|
|
216
|
+
|
|
217
|
+
// Source file of a slug: mi/<variant>/<name>, mdi/<name>, mgg/<name>.
|
|
218
|
+
function source(slug) {
|
|
219
|
+
const [set, ...rest] = slug.split('/');
|
|
220
|
+
if (set === 'mi' && rest.length === 2) return join(MI, rest[1], `${rest[0]}.svg`);
|
|
221
|
+
if (set === 'mdi' && rest.length === 1) return join(MDI, `${rest[0]}.svg`);
|
|
222
|
+
if (set === 'mgg' && rest.length === 1) return join(MGG, `${rest[0]}.svg`);
|
|
223
|
+
throw new Error(`Not a Magma icon slug: ${slug}`);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function allSlugs() {
|
|
227
|
+
const names = (dir) => readdirSync(dir).map((file) => file.replace(/\.svg$/, ''));
|
|
228
|
+
return [
|
|
229
|
+
...readdirSync(MI).flatMap((name) => names(join(MI, name)).map((variant) => `mi/${variant}/${name}`)),
|
|
230
|
+
...names(MDI).map((name) => `mdi/${name}`),
|
|
231
|
+
...names(MGG).map((name) => `mgg/${name}`),
|
|
232
|
+
];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const slugs = process.argv[2] ? JSON.parse(readFileSync(process.argv[2], 'utf8')) : allSlugs();
|
|
236
|
+
for (const slug of slugs) {
|
|
237
|
+
const file = source(slug);
|
|
238
|
+
if (!existsSync(file)) throw new Error(`No such icon: ${slug} (${file})`);
|
|
239
|
+
const target = join(OUT, `${slug}.svg`);
|
|
240
|
+
mkdirSync(dirname(target), { recursive: true });
|
|
241
|
+
copyFileSync(file, target);
|
|
242
|
+
}
|
|
243
|
+
console.log(`${slugs.length} icons in ${OUT}/`);
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
`icons.json` lists the slugs the app uses:
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
["mi/baseline/email", "mi/baseline/send", "mdi/github", "mgg/abitazione-principale"]
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
"scripts": {
|
|
254
|
+
"icons": "node scripts/copy-icons.mjs icons.json",
|
|
255
|
+
"predev": "npm run icons",
|
|
256
|
+
"prebuild": "npm run icons"
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
A slug that does not exist stops the script with an error. A slug used in the code but
|
|
261
|
+
missing from `icons.json` gives a 404 at runtime: iconsauce avoids that by reading the
|
|
262
|
+
sources. Without `icons.json` the script copies every icon of the three sets, all of
|
|
263
|
+
them deployed: 18,720 files and 73 MB (`mi` 43 MB in five variants, `mdi` 29 MB, `mgg`
|
|
264
|
+
1.3 MB).
|
|
265
|
+
|
|
266
|
+
### Only the `mgg/` set
|
|
267
|
+
|
|
268
|
+
An app that uses only Maggioli icons can copy the `svg-icons` folder, into `mgg/` under
|
|
269
|
+
the served path: `@maggioli-design-system/svg-icons/dist/svg/` to `public/svg/mgg/`. With
|
|
270
|
+
the Angular CLI that is an `assets` entry in `angular.json`:
|
|
271
|
+
|
|
272
|
+
```json
|
|
273
|
+
{ "glob": "**/*.svg", "input": "node_modules/@maggioli-design-system/svg-icons/dist/svg", "output": "/svg/mgg" }
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Tell mds-icon where the icons are
|
|
277
|
+
|
|
278
|
+
Set the public URL of the folder the icons are served from, before the first `mds-icon`
|
|
279
|
+
renders. Two ways:
|
|
158
280
|
|
|
159
281
|
- `IconsSetService.setSvgPath('/svg/')`, imported from
|
|
160
|
-
`@maggioli-design-system/magma/services
|
|
161
|
-
`sessionStorage`, and reloads the icons already mounted
|
|
162
|
-
- `
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
282
|
+
`@maggioli-design-system/magma/services` (recommended): sets the path in code, without
|
|
283
|
+
`sessionStorage`, and reloads the icons already mounted.
|
|
284
|
+
- the `mdsIconSvgPath` key in `sessionStorage`, a one-liner the install tracks use. Some
|
|
285
|
+
browsers block storage (private windows, sandboxed iframes, storage partitioning): there
|
|
286
|
+
only `IconsSetService` works.
|
|
287
|
+
|
|
288
|
+
```javascript
|
|
289
|
+
import { IconsSetService } from '@maggioli-design-system/magma/services';
|
|
290
|
+
|
|
291
|
+
IconsSetService.setSvgPath('/svg/');
|
|
292
|
+
// or: window.sessionStorage.setItem('mdsIconSvgPath', '/svg/');
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Icons mounted before a path set through `sessionStorage` reload on
|
|
296
|
+
`window.dispatchEvent(new CustomEvent('mdsIconSvgPathUpdate'))`. Every option, with its
|
|
297
|
+
snippet, is in the
|
|
298
|
+
[`mds-icon` pattern](../../magma/dist/collection/components/mds-icon/pattern.md).
|
|
166
299
|
|
|
167
300
|
Reference an icon by slug, never inline SVG and never import from an icon-set package:
|
|
168
301
|
|
|
@@ -190,14 +323,84 @@ Assets live under `@maggioli-design-system/identity/dist/`:
|
|
|
190
323
|
- `dist/illustrations/`, `dist/products/` - additional brand imagery
|
|
191
324
|
|
|
192
325
|
These are static read-only files - serve them like any other asset, do not modify
|
|
193
|
-
them in the consumer project.
|
|
326
|
+
them in the consumer project. `dist/identity.json` describes them: one entry per family of
|
|
327
|
+
artworks, with its name as the artwork writes it, its owner and kind, and every variant with
|
|
328
|
+
its path, form, colour, the background it is drawn for and its size. Read names and alt texts
|
|
329
|
+
from it instead of from the file names, which lose accents and punctuation.
|
|
330
|
+
|
|
331
|
+
## 5. Editor autocomplete
|
|
332
|
+
|
|
333
|
+
Two halves, one extension each. Set them up in VS Code; for another editor, point its CSS
|
|
334
|
+
custom property completion at the same `tokens.editor.css` and leave the rest to the user.
|
|
335
|
+
|
|
336
|
+
| Completes | Extension | Fed by |
|
|
337
|
+
| --------- | --------- | ------ |
|
|
338
|
+
| Magma tokens inside `var(--...)`, in scale order, with a swatch on colors | CSS Var Complete (`phoenisx.cssvar`) | `@maggioli-design-system/styles/dist/css/tokens.editor.css`, every public token once |
|
|
339
|
+
| Tailwind classes (`bg-surface-default`, `p-600`), with their value | Tailwind CSS IntelliSense (`bradlc.vscode-tailwindcss`), only if the app uses Tailwind | the CSS entry that imports Tailwind and Magma's theme (section 1) |
|
|
340
|
+
|
|
341
|
+
MERGE these keys into `.vscode/settings.json` and `.vscode/extensions.json`: never overwrite
|
|
342
|
+
a file that exists, the user's own settings stay.
|
|
343
|
+
|
|
344
|
+
```json
|
|
345
|
+
{
|
|
346
|
+
"cssvar.files": ["node_modules/@maggioli-design-system/styles/dist/css/tokens.editor.css"],
|
|
347
|
+
"cssvar.ignore": [],
|
|
348
|
+
"cssvar.disableSort": true
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
```json
|
|
353
|
+
{
|
|
354
|
+
"recommendations": ["phoenisx.cssvar", "bradlc.vscode-tailwindcss"],
|
|
355
|
+
"unwantedRecommendations": ["vunguyentuan.vscode-css-variables"]
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
Leave `bradlc.vscode-tailwindcss` out of `recommendations` when the app has no Tailwind.
|
|
360
|
+
|
|
361
|
+
The traps, all measured:
|
|
362
|
+
|
|
363
|
+
- `cssvar.ignore` must be `[]`: its default, `["**/node_modules/**"]`, is applied over
|
|
364
|
+
`cssvar.files`, so the path above is dropped and nothing completes.
|
|
365
|
+
- `cssvar.disableSort: true` keeps the order of the file (a scale from its smallest step
|
|
366
|
+
up); without it the list is alphabetical.
|
|
367
|
+
- `vunguyentuan.vscode-css-variables` goes in `unwantedRecommendations`: it sorts
|
|
368
|
+
alphabetically, never opens the list by itself and duplicates every entry next to CSS
|
|
369
|
+
Var Complete.
|
|
370
|
+
- Never import `tokens.editor.css` in the app: it is for editors only, and holds light
|
|
371
|
+
defaults that would freeze theming (it is wrapped in a query that never matches, so an
|
|
372
|
+
import does nothing at best).
|
|
373
|
+
|
|
374
|
+
Tailwind IntelliSense finds the CSS entry on its own, the split imports of section 1
|
|
375
|
+
included. Only if hovering a class shows nothing, add
|
|
376
|
+
`"tailwindCSS.experimental.configFile": "<path of that CSS file>"`. If the app builds class
|
|
377
|
+
names through functions (`clsx`, `cva`, `cn`), list the ones it uses in
|
|
378
|
+
`"tailwindCSS.classFunctions"`, so the classes inside their calls complete too.
|
|
379
|
+
|
|
380
|
+
Verify, after reloading the window:
|
|
381
|
+
|
|
382
|
+
- in a CSS file, `var(--magma-surface` lists the surface roles, in order, with swatches;
|
|
383
|
+
- with Tailwind, in markup: hovering `p-600` shows `1.5rem = 24px`, and `bg-surface-default`
|
|
384
|
+
shows a swatch in the completion list. No swatch on the semantic classes means an older
|
|
385
|
+
`@maggioli-design-system/styles`: update it.
|
|
386
|
+
|
|
387
|
+
Known limits, nothing to configure:
|
|
388
|
+
|
|
389
|
+
- Tailwind IntelliSense lists the utilities alphabetically, whatever the order of the
|
|
390
|
+
theme: `bg-surface-bisque-*` comes before `bg-surface-default`. Type the role name.
|
|
391
|
+
- The class list offers Tailwind's stock spacing steps (`p-1` ... `p-96`), not Magma's:
|
|
392
|
+
with Magma's theme `p-1` is 0.04px. Write the Magma steps in full (`p-600`, `gap-400`):
|
|
393
|
+
they work and hover with their value, they are just not suggested.
|
|
194
394
|
|
|
195
395
|
## Checklist
|
|
196
396
|
|
|
197
397
|
- [ ] `styles` + `design-tokens` installed on the matching version row
|
|
198
398
|
- [ ] Global CSS imports in the exact cascade-layer order above
|
|
199
399
|
- [ ] `@fontsource` fonts installed and imported in the `vendor` layer
|
|
200
|
-
- [ ]
|
|
400
|
+
- [ ] Every icon slug the app uses served at `<mdsIconSvgPath><slug>.svg` (iconsauce or
|
|
401
|
+
the copy script, run before dev and build, output folder out of git)
|
|
201
402
|
- [ ] `mdsIconSvgPath` set to that public path before hydration
|
|
202
403
|
- [ ] (optional) `identity` installed if brand assets are used
|
|
203
404
|
- [ ] Components registered per your target track
|
|
405
|
+
- [ ] (VS Code) the editor keys merged into `.vscode/settings.json` and `extensions.json`;
|
|
406
|
+
`var(--magma-` completes, and with Tailwind `bg-surface-default` shows a swatch
|
package/agents/color.md
CHANGED
|
@@ -55,9 +55,11 @@ Tailwind names the TEXT roles `fg-*`, so a utility never reads `text-text-*`:
|
|
|
55
55
|
`border-border-default`, `bg-accent-emphasis`, `bg-danger-wash-base`.
|
|
56
56
|
|
|
57
57
|
Both faces need the setup in [`assets.md`](assets.md): the values come from
|
|
58
|
-
`styles/dist/css/semantic.css
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
`styles/dist/css/semantic.css`, the Tailwind utilities from `styles/dist/tailwind/theme.css`.
|
|
59
|
+
Without `semantic.css` a `var(--magma-*)` paints nothing, and a Tailwind utility paints the
|
|
60
|
+
light default of its role, the fallback its bridge carries so editors can show a swatch: in
|
|
61
|
+
dark mode, with a named theme or with more contrast it stays wrong, so the file is still
|
|
62
|
+
required. A Tailwind modifier works as usual (`bg-surface-raised/80`).
|
|
61
63
|
|
|
62
64
|
## The roles
|
|
63
65
|
|
package/agents/components.md
CHANGED
|
@@ -83,10 +83,10 @@
|
|
|
83
83
|
| [`mds-pref-animation`](../../magma/dist/collection/components/mds-pref-animation/AGENTS.md) | The `<mds-pref-animation>` web component is a preference control that lets users choose how animations are presented (reduced, system-driven, or fully enabled) |
|
|
84
84
|
| [`mds-pref-consumption`](../../magma/dist/collection/components/mds-pref-consumption/AGENTS.md) | The `<mds-pref-consumption>` web component is a preference control of the Magma Design System that lets the user pick an energy-consumption mode (`low`, `medium`, `high`); it is usually a child of `<mds-pref>` and renders as a tab group with one option per mode, so it has no native HTML primitive equivalent. |
|
|
85
85
|
| [`mds-pref-contrast`](../../magma/dist/collection/components/mds-pref-contrast/AGENTS.md) | The `<mds-pref-contrast>` web component is a preference control that lets users switch the application's contrast mode (`more`, `system`, or `no-preference`) |
|
|
86
|
-
| [`mds-pref-language`](../../magma/dist/collection/components/mds-pref-language/AGENTS.md) | The `<mds-pref-language>` web component is the language-preference control of the Magma Design System,
|
|
86
|
+
| [`mds-pref-language`](../../magma/dist/collection/components/mds-pref-language/AGENTS.md) | The `<mds-pref-language>` web component is the language-preference control of the Magma Design System, usually slotted inside the `<mds-pref>` panel alongside the other preference children |
|
|
87
87
|
| [`mds-pref-language-item`](../../magma/dist/collection/components/mds-pref-language-item/AGENTS.md) | The `<mds-pref-language-item>` web component represents a single selectable language option inside the language-preference picker `<mds-pref-language>` |
|
|
88
|
-
| [`mds-pref-mode`](../../magma/dist/collection/components/mds-pref-mode/AGENTS.md) | The `<mds-pref-mode>` web component is the mode preference control of the Magma Design System,
|
|
89
|
-
| [`mds-pref-theme`](../../magma/dist/collection/components/mds-pref-theme/AGENTS.md) | The `<mds-pref-theme>` web component is the theme-switcher segment of the Magma accessibility preferences panel,
|
|
88
|
+
| [`mds-pref-mode`](../../magma/dist/collection/components/mds-pref-mode/AGENTS.md) | The `<mds-pref-mode>` web component is the mode preference control of the Magma Design System, usually a direct child of the `<mds-pref>` panel |
|
|
89
|
+
| [`mds-pref-theme`](../../magma/dist/collection/components/mds-pref-theme/AGENTS.md) | The `<mds-pref-theme>` web component is the theme-switcher segment of the Magma accessibility preferences panel, usually a direct child of `<mds-pref>` |
|
|
90
90
|
| [`mds-pref-theme-item`](../../magma/dist/collection/components/mds-pref-theme-item/AGENTS.md) | The `<mds-pref-theme-item>` web component is a single selectable theme entry inside the `<mds-pref-theme>` preference picker |
|
|
91
91
|
| [`mds-price-table`](../../magma/dist/collection/components/mds-price-table/AGENTS.md) | The `<mds-price-table>` web component is the layout container of the Magma Design System pricing-table family |
|
|
92
92
|
| [`mds-price-table-features`](../../magma/dist/collection/components/mds-price-table-features/AGENTS.md) | The `<mds-price-table-features>` web component is the feature-matrix block of the Magma Design System pricing-table family |
|
package/agents/install.md
CHANGED
|
@@ -24,7 +24,7 @@ npm i @maggioli-design-system/magma-react @maggioli-design-system/magma
|
|
|
24
24
|
matrix). Then install the assets from [`assets.md`](assets.md):
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
npm i @maggioli-design-system/styles @maggioli-design-system/design-tokens
|
|
27
|
+
npm i @maggioli-design-system/styles @maggioli-design-system/design-tokens
|
|
28
28
|
npm i @fontsource/karla @fontsource/merriweather @fontsource/roboto @fontsource/roboto-mono
|
|
29
29
|
```
|
|
30
30
|
|
|
@@ -116,9 +116,10 @@ export default function RootLayout({
|
|
|
116
116
|
|
|
117
117
|
## 4. Serve the icon SVGs and styles
|
|
118
118
|
|
|
119
|
-
-
|
|
120
|
-
|
|
121
|
-
|
|
119
|
+
- Write the icons into the static folder served at `/svg/` (Vite and Next.js:
|
|
120
|
+
`public/svg/`) with one of the routes of [`assets.md`](assets.md) section 3
|
|
121
|
+
(iconsauce or the copy script, run from `predev` and `prebuild`). Match the path you
|
|
122
|
+
pass to `mdsIconSvgPath`.
|
|
122
123
|
- Import the global CSS block from [`assets.md`](assets.md) in your global stylesheet
|
|
123
124
|
(`app/globals.css`, `src/index.css`, ...) so the cascade-layer order is preserved.
|
|
124
125
|
|
|
@@ -168,6 +169,38 @@ SSR notes:
|
|
|
168
169
|
server-only). It is imported lazily behind a `typeof window` check and must
|
|
169
170
|
never end up in a client bundle.
|
|
170
171
|
|
|
172
|
+
## 6. Client-side routing
|
|
173
|
+
|
|
174
|
+
The links of the components (`href` of `MdsButton`, `MdsTabItem`, ...) are real anchors
|
|
175
|
+
the browser follows, loading the page. Register the router once, in the client wrapper of
|
|
176
|
+
section 3, and every plain click on a component link is routed on the client instead; a
|
|
177
|
+
modifier or middle click, `target="blank"` and a link to another origin stay with the browser.
|
|
178
|
+
|
|
179
|
+
```tsx
|
|
180
|
+
'use client';
|
|
181
|
+
import { useEffect } from 'react';
|
|
182
|
+
import { useRouter } from 'next/navigation';
|
|
183
|
+
import { NavigationService } from '@maggioli-design-system/magma/services';
|
|
184
|
+
|
|
185
|
+
export default function ClientGlobalsWrapper({
|
|
186
|
+
children,
|
|
187
|
+
}: Readonly<{ children: React.ReactNode }>) {
|
|
188
|
+
const router = useRouter();
|
|
189
|
+
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
sessionStorage.setItem('mdsIconSvgPath', '/svg/');
|
|
192
|
+
}, []);
|
|
193
|
+
// setHandler returns the function that removes the handler: the cleanup of the effect
|
|
194
|
+
useEffect(() => NavigationService.setHandler((href) => router.push(href)), [router]);
|
|
195
|
+
|
|
196
|
+
return <>{children}</>;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
With React Router the handler is `(href) => navigate(href)` from `useNavigate()`. Return
|
|
201
|
+
`false` from the handler for a link the browser is to load. Without a registered router, an
|
|
202
|
+
`onClick` on the component can still cancel the click with `preventDefault()` and route by hand.
|
|
203
|
+
|
|
171
204
|
## Gotchas
|
|
172
205
|
|
|
173
206
|
- The icon path effect must run on the client. In Next.js App Router the wrapper that
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
GENERATED FILE - do not edit by hand.
|
|
3
|
+
Source of truth: docs/agents/ in the magma monorepo.
|
|
4
|
+
Regenerate with: npm run sync.agent-docs (from the stencil package).
|
|
5
|
+
-->
|
|
6
|
+
# Magma - reporting a problem
|
|
7
|
+
|
|
8
|
+
> Scope: you are working in a project that uses Magma and you hit a problem that is
|
|
9
|
+
> Magma's, not the project's: a component that misbehaves, a guide that is wrong, a
|
|
10
|
+
> missing token or utility, a packaging or install issue. This is how to report it to
|
|
11
|
+
> the Magma repository, `magma-design-system/magma`, labelled with the project it comes
|
|
12
|
+
> from, so the maintainers can tell which project reported what.
|
|
13
|
+
|
|
14
|
+
## 1. Make sure it is Magma's
|
|
15
|
+
|
|
16
|
+
- Read the component's `AGENTS.md` and `antipattern.md`, and
|
|
17
|
+
[`anti-patterns.md`](anti-patterns.md): a documented mistake is the project's to fix,
|
|
18
|
+
not a Magma bug.
|
|
19
|
+
- Check that the installed `magma`, `styles` and `design-tokens` versions belong
|
|
20
|
+
together (the ones a `magma` release depends on): mismatched versions break tokens
|
|
21
|
+
and styles on their own.
|
|
22
|
+
- Reduce it to the smallest markup that still shows the problem, without the project's
|
|
23
|
+
own CSS or wrappers when you can.
|
|
24
|
+
|
|
25
|
+
## 2. Look for an existing issue
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
gh issue list --repo magma-design-system/magma --state all --search "<component or keywords>"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
If one already describes it, comment there with what is new (your versions, another
|
|
32
|
+
reproduction) and the project you hit it in, instead of opening a duplicate.
|
|
33
|
+
|
|
34
|
+
## 3. Ask before you open it
|
|
35
|
+
|
|
36
|
+
The Magma repository is public: opening an issue publishes its text. Draft the issue,
|
|
37
|
+
show it to the user, and create it only once they agree. Leave out anything private to
|
|
38
|
+
the project: internal URLs, credentials, customer data, unreleased features.
|
|
39
|
+
|
|
40
|
+
## 4. Pick the labels
|
|
41
|
+
|
|
42
|
+
Every issue carries three kinds of label:
|
|
43
|
+
|
|
44
|
+
| Label | Says | Values |
|
|
45
|
+
| ----- | ---- | ------ |
|
|
46
|
+
| type | what kind of issue | `bug`, `feature`, `docs` |
|
|
47
|
+
| `prg-*` | which Magma package is affected | `prg-stencil` (the components: `magma`, `magma-react`, `magma-angular`), `prg-styles`, `prg-design-tokens`, `prg-svg-icons`, `prg-icons`, `prg-identity` |
|
|
48
|
+
| `prd-*` | which project it was found in (its origin) | one per project, e.g. `prd-mindy` |
|
|
49
|
+
|
|
50
|
+
Find this project's origin label. Each one's description names the project and its
|
|
51
|
+
repository:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
gh label list --repo magma-design-system/magma --search prd-
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Match it against this project's repository name (the `origin` remote, or the `name` in
|
|
58
|
+
`package.json`). If none matches, do not create one: the Magma maintainers manage the
|
|
59
|
+
labels of their repository, and a label missing from their configuration is deleted by
|
|
60
|
+
the next sync. Open the issue without it, and propose its name in the body, so the
|
|
61
|
+
maintainers add it as it is: `prd-` and the project's short name, lowercase, in
|
|
62
|
+
kebab-case (`prd-mindy` for `mindy-webapp`, `prd-docs` for the docs site). Leave out
|
|
63
|
+
generic words such as `app`, `webapp`, `frontend` or the organization's name.
|
|
64
|
+
|
|
65
|
+
GitHub sets labels on a new issue only for users with write access to the repository,
|
|
66
|
+
and drops them for everyone else, often without an error. After creating the issue,
|
|
67
|
+
check what it got:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
gh issue view <number> --repo magma-design-system/magma --json labels
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
If the labels were dropped, the `Found in` line of the body is what the maintainers
|
|
74
|
+
label it from.
|
|
75
|
+
|
|
76
|
+
## 5. Write it
|
|
77
|
+
|
|
78
|
+
In English. Title: `<component or package>: <what is wrong>`, e.g.
|
|
79
|
+
`mds-modal: the window jumps on open`. Body:
|
|
80
|
+
|
|
81
|
+
```markdown
|
|
82
|
+
## Problem
|
|
83
|
+
|
|
84
|
+
What happens, and what should happen instead.
|
|
85
|
+
|
|
86
|
+
## How to reproduce
|
|
87
|
+
|
|
88
|
+
The minimal markup or the steps, and the browser if it matters.
|
|
89
|
+
|
|
90
|
+
## Versions
|
|
91
|
+
|
|
92
|
+
- @maggioli-design-system/magma (or magma-react / magma-angular): <installed version>
|
|
93
|
+
- @maggioli-design-system/styles: <installed version>
|
|
94
|
+
- @maggioli-design-system/design-tokens: <installed version>
|
|
95
|
+
- Framework: <e.g. Next 16 + React 19, Angular 20, none>
|
|
96
|
+
|
|
97
|
+
## Workaround
|
|
98
|
+
|
|
99
|
+
What the project does meanwhile, if anything.
|
|
100
|
+
|
|
101
|
+
Found in <project> (<repository>): <where in the app>.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
When step 4 found no origin label, end the body with the one you propose:
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
No origin label for this project yet: proposed `prd-<name>`.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Read the installed versions from the lockfile or `npm ls`, not from the ranges in
|
|
111
|
+
`package.json`.
|
|
112
|
+
|
|
113
|
+
## 6. Create it
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
gh issue create --repo magma-design-system/magma \
|
|
117
|
+
--title "mds-modal: the window jumps on open" \
|
|
118
|
+
--label bug --label prg-stencil --label prd-<project> \
|
|
119
|
+
--body-file magma-issue.md
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Pass only labels that exist: `gh` refuses an unknown one. Without `gh`, give the user
|
|
123
|
+
the title, the labels and the body to open it by hand at
|
|
124
|
+
`https://github.com/magma-design-system/magma/issues/new`.
|
|
125
|
+
|
|
126
|
+
Then give the user the issue URL, and leave a comment in the project next to the
|
|
127
|
+
workaround that links it, so the workaround can go once the fix ships.
|
package/agents/theming.md
CHANGED
|
@@ -138,3 +138,18 @@ by itself changes the shape WITHOUT the scale.
|
|
|
138
138
|
In your own CSS take radii from the `--magma-radius-*` scale (`none`, `3xs` ... `5xl`,
|
|
139
139
|
`full`), which follows the axis: `border-radius: var(--magma-radius-lg)`. A raw
|
|
140
140
|
`--radius-*` token or a pixel value stays the same under every shape.
|
|
141
|
+
|
|
142
|
+
A browser without `corner-shape` (Firefox, Safari) gets round corners and the round
|
|
143
|
+
scale on its own. A control of your own whose radius is past half its height
|
|
144
|
+
(Chromium clamps it to half the height) needs one more step to keep its look there:
|
|
145
|
+
cap the radius at a part of its height, as Magma's buttons and fields do.
|
|
146
|
+
|
|
147
|
+
```css
|
|
148
|
+
.my-control {
|
|
149
|
+
--my-control-height: 2.25rem;
|
|
150
|
+
|
|
151
|
+
border-radius: min(var(--magma-radius-2xl), var(--magma-corner-cap) * var(--my-control-height));
|
|
152
|
+
corner-shape: var(--magma-corner-shape);
|
|
153
|
+
min-height: var(--my-control-height);
|
|
154
|
+
}
|
|
155
|
+
```
|
package/dist/mds-input.server.js
CHANGED
|
@@ -7,6 +7,6 @@ export const MdsTableHeaderCell = /*@__PURE__*/ createComponent({
|
|
|
7
7
|
elementClass: MdsTableHeaderCellElement,
|
|
8
8
|
// @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
|
|
9
9
|
react: React,
|
|
10
|
-
events: {},
|
|
10
|
+
events: { onMdsTableHeaderCellSort: 'mdsTableHeaderCellSort' },
|
|
11
11
|
defineCustomElement: defineMdsTableHeaderCell
|
|
12
12
|
});
|
|
@@ -8,6 +8,7 @@ export const MdsTableHeaderCell = /*@__PURE__*/ createComponent({
|
|
|
8
8
|
properties: {
|
|
9
9
|
sortable: 'sortable',
|
|
10
10
|
label: 'label',
|
|
11
|
+
sortKey: 'sort-key',
|
|
11
12
|
direction: 'direction'
|
|
12
13
|
},
|
|
13
14
|
hydrateModule: typeof window === 'undefined' ? import('@maggioli-design-system/magma/hydrate') : undefined,
|
package/dist/mds-table.server.js
CHANGED
|
@@ -8,7 +8,8 @@ export const MdsTable = /*@__PURE__*/ createComponent({
|
|
|
8
8
|
properties: {
|
|
9
9
|
interactive: 'interactive',
|
|
10
10
|
selectable: 'selectable',
|
|
11
|
-
selection: 'selection'
|
|
11
|
+
selection: 'selection',
|
|
12
|
+
sorting: 'sorting'
|
|
12
13
|
},
|
|
13
14
|
hydrateModule: typeof window === 'undefined' ? import('@maggioli-design-system/magma/hydrate') : undefined,
|
|
14
15
|
clientModule: clientComponents.MdsTable,
|
package/dist/mds-usage.server.js
CHANGED
|
@@ -7,7 +7,8 @@ export const MdsUsage = /*@__PURE__*/ createComponent({
|
|
|
7
7
|
tagName: 'mds-usage',
|
|
8
8
|
properties: {
|
|
9
9
|
variant: 'variant',
|
|
10
|
-
alias: 'alias'
|
|
10
|
+
alias: 'alias',
|
|
11
|
+
icon: 'icon'
|
|
11
12
|
},
|
|
12
13
|
hydrateModule: typeof window === 'undefined' ? import('@maggioli-design-system/magma/hydrate') : undefined,
|
|
13
14
|
clientModule: clientComponents.MdsUsage,
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
* This file was automatically generated by the Stencil React Output Target.
|
|
3
3
|
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
4
|
*/
|
|
5
|
-
import type { StencilReactComponent } from '@stencil/react-output-target/runtime';
|
|
5
|
+
import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
|
|
6
|
+
import { type MdsTableHeaderCellCustomEvent, type MdsTableHeaderCellSortEventDetail } from "@maggioli-design-system/magma";
|
|
6
7
|
import type { Components } from "@maggioli-design-system/magma/dist/components";
|
|
7
8
|
import { MdsTableHeaderCell as MdsTableHeaderCellElement } from "@maggioli-design-system/magma/dist/components/mds-table-header-cell.js";
|
|
8
|
-
export type MdsTableHeaderCellEvents =
|
|
9
|
+
export type MdsTableHeaderCellEvents = {
|
|
10
|
+
onMdsTableHeaderCellSort: EventName<MdsTableHeaderCellCustomEvent<MdsTableHeaderCellSortEventDetail>>;
|
|
11
|
+
};
|
|
9
12
|
export declare const MdsTableHeaderCell: StencilReactComponent<MdsTableHeaderCellElement, MdsTableHeaderCellEvents, Components.MdsTableHeaderCell>;
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* This file was automatically generated by the Stencil React Output Target.
|
|
3
3
|
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
4
|
*/
|
|
5
|
-
import type { StencilReactComponent } from '@stencil/react-output-target/runtime';
|
|
5
|
+
import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
|
|
6
6
|
import { type SerializeShadowRootOptions } from '@stencil/react-output-target/ssr';
|
|
7
|
+
import { type MdsTableHeaderCellCustomEvent, type MdsTableHeaderCellSortEventDetail } from "@maggioli-design-system/magma";
|
|
7
8
|
import type { Components } from "@maggioli-design-system/magma/dist/components";
|
|
8
9
|
import { MdsTableHeaderCell as MdsTableHeaderCellElement } from "@maggioli-design-system/magma/dist/components/mds-table-header-cell.js";
|
|
9
10
|
export declare const serializeShadowRoot: SerializeShadowRootOptions;
|
|
10
|
-
export type MdsTableHeaderCellEvents =
|
|
11
|
+
export type MdsTableHeaderCellEvents = {
|
|
12
|
+
onMdsTableHeaderCellSort: EventName<MdsTableHeaderCellCustomEvent<MdsTableHeaderCellSortEventDetail>>;
|
|
13
|
+
};
|
|
11
14
|
export declare const MdsTableHeaderCell: StencilReactComponent<MdsTableHeaderCellElement, MdsTableHeaderCellEvents, Components.MdsTableHeaderCell>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@maggioli-design-system/magma-react",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"main": "dist/components.js",
|
|
5
5
|
"module": "dist/components.js",
|
|
6
6
|
"types": "dist/types/components.d.ts",
|
|
@@ -26,13 +26,14 @@
|
|
|
26
26
|
"files": [
|
|
27
27
|
"dist",
|
|
28
28
|
"AGENTS.md",
|
|
29
|
-
"agents/"
|
|
29
|
+
"agents/",
|
|
30
|
+
"CHANGELOG.md"
|
|
30
31
|
],
|
|
31
32
|
"publishConfig": {
|
|
32
33
|
"access": "public"
|
|
33
34
|
},
|
|
34
35
|
"dependencies": {
|
|
35
|
-
"@maggioli-design-system/magma": "2.
|
|
36
|
+
"@maggioli-design-system/magma": "2.3.0",
|
|
36
37
|
"@stencil/react-output-target": "1.6.2"
|
|
37
38
|
},
|
|
38
39
|
"repository": {
|