ui-foundations 0.4.1 → 0.6.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 (51) hide show
  1. package/README.md +8 -7
  2. package/dist/core/index.css +1 -0
  3. package/dist/macros/ui.njk +61 -0
  4. package/dist/main.css +528 -89
  5. package/dist/react/accordion.js +36 -0
  6. package/dist/react/avatar.js +34 -0
  7. package/dist/react/button.js +1 -12
  8. package/dist/react/checkbox.js +3 -20
  9. package/dist/react/divider.js +31 -0
  10. package/dist/react/icon.js +1 -12
  11. package/dist/react/index.js +6 -0
  12. package/dist/react/radio.js +3 -20
  13. package/dist/react/switch.js +3 -20
  14. package/dist/react/tabs.js +72 -0
  15. package/dist/react/textarea.js +38 -0
  16. package/dist/react/tooltip.js +25 -0
  17. package/dist/react/warn-dev.js +15 -0
  18. package/dist/tokens/css/appearance-modes.tokens.mode-dark.css +6 -6
  19. package/dist/tokens/css/appearance-modes.tokens.mode-light.css +1 -1
  20. package/dist/tokens/css/components-ui.tokens.css +66 -68
  21. package/dist/tokens/css/core-primitives.tokens.css +72 -1
  22. package/dist/tokens/css/semantics-roles.tokens.css +1 -1
  23. package/dist/tokens/css/themes-brands.tokens.brand-a.css +11 -11
  24. package/dist/tokens/css/themes-brands.tokens.brand-b.css +1 -1
  25. package/dist/tokens/css/themes-brands.tokens.brand-c.css +22 -0
  26. package/dist/tokens/json/components-ui.tokens.json +275 -277
  27. package/dist/tokens/json/core-primitives.tokens.json +302 -0
  28. package/dist/tokens/json/themes-brands.tokens.brand-a.json +10 -10
  29. package/dist/tokens/json/themes-brands.tokens.brand-b.json +10 -10
  30. package/dist/tokens/json/themes-brands.tokens.brand-c.json +81 -0
  31. package/dist/tokens/tokens.yaml +1701 -583
  32. package/dist/tokens/ts/appearance-modes.tokens.mode-dark.ts +6 -6
  33. package/dist/tokens/ts/appearance-modes.tokens.mode-light.ts +1 -1
  34. package/dist/tokens/ts/components-ui.tokens.ts +67 -69
  35. package/dist/tokens/ts/core-primitives.tokens.ts +73 -2
  36. package/dist/tokens/ts/semantics-roles.tokens.ts +1 -1
  37. package/dist/tokens/ts/themes-brands.tokens.brand-a.ts +11 -11
  38. package/dist/tokens/ts/themes-brands.tokens.brand-b.ts +1 -1
  39. package/dist/tokens/ts/themes-brands.tokens.brand-c.ts +32 -0
  40. package/dist/ui/index.css +6 -0
  41. package/dist/ui/patterns/accordion.css +81 -0
  42. package/dist/ui/patterns/avatar.css +57 -0
  43. package/dist/ui/patterns/divider.css +25 -0
  44. package/dist/ui/patterns/tabs.css +71 -0
  45. package/dist/ui/patterns/textarea.css +50 -0
  46. package/dist/ui/patterns/tooltip.css +64 -0
  47. package/docs/agentic/README.md +1 -0
  48. package/docs/agentic/skills/component-accessibility-audit.md +132 -0
  49. package/docs/foundations/foundation-007-typography-selectors-and-specificity.md +1 -1
  50. package/package.json +2 -1
  51. package/dist/tokens/missing-tokens.json +0 -43
package/README.md CHANGED
@@ -116,7 +116,7 @@ import "ui-foundations/ui.css";
116
116
  ### Apply Theming
117
117
 
118
118
  ```js
119
- document.documentElement.dataset.brand = "a"; // "a" | "b"
119
+ document.documentElement.dataset.brand = "a"; // "a" | "b" | "c"
120
120
  document.documentElement.dataset.mode = "light"; // "light" | "dark"
121
121
  ```
122
122
 
@@ -128,8 +128,8 @@ to see it in action.
128
128
 
129
129
  ## Components
130
130
 
131
- Label, Button (solid / outline / ghost), ButtonGroup, Input, Icon, Checkbox,
132
- Radio, RadioGroup, Switch, Slider, Link
131
+ Label, Button (solid / outline / ghost), ButtonGroup, Badge, Input, Icon, Checkbox,
132
+ Radio, Switch, Link
133
133
 
134
134
  Each component uses its own token layer and supports theming out of the box.
135
135
 
@@ -201,10 +201,11 @@ npm run rules:validate # rule pipeline traceability
201
201
 
202
202
  ## MCP Integration
203
203
 
204
- Figma integration via Model Context Protocol:
204
+ Figma integration uses the Model Context Protocol. Token exports live in
205
+ `figma/exports/` and are processed by `npm run tokens:generate`.
205
206
 
206
- - `figma-developer-mcp`REST API read access (requires `FIGMA_TOKEN` in `.env`)
207
- - Figma Desktop MCP local server via Figma Desktop app
207
+ - **Figma Desktop MCP** local server via the Figma Desktop app (primary path)
208
+ - **figma-developer-mcp** REST API read access (requires `FIGMA_TOKEN` in `.env`)
208
209
 
209
210
  ```json
210
211
  {
@@ -240,4 +241,4 @@ Vanilla CSS (Custom Properties, `@layer`) · Node.js · Eleventy · React (optio
240
241
 
241
242
  ---
242
243
 
243
- Designed for consistency, built for scale, ready for agents.
244
+ MIT License
@@ -9,4 +9,5 @@
9
9
  @import url("../tokens/css/appearance-modes.tokens.mode-light.css") layer(tokens);
10
10
  @import url("../tokens/css/themes-brands.tokens.brand-a.css") layer(tokens);
11
11
  @import url("../tokens/css/themes-brands.tokens.brand-b.css") layer(tokens);
12
+ @import url("../tokens/css/themes-brands.tokens.brand-c.css") layer(tokens);
12
13
  @import url("./themes/mode.css") layer(themes);
@@ -140,3 +140,64 @@
140
140
  <span class="badge__text">{{ text }}</span>
141
141
  </span>
142
142
  {%- endmacro %}
143
+
144
+ {% macro divider(orientation='horizontal', variant='', className='') -%}
145
+ {%- set classes = "divider" -%}
146
+ {%- if variant -%}{%- set classes = classes + " " + variant -%}{%- endif -%}
147
+ {%- if className -%}{%- set classes = classes + " " + className -%}{%- endif -%}
148
+ <hr class="{{ classes }}"{% if orientation == "vertical" %} aria-orientation="vertical"{% endif %} />
149
+ {%- endmacro %}
150
+
151
+ {% macro textarea(placeholder='', value='', disabled=false, readonly=false, rows='', state='default', className='') -%}
152
+ {%- set classes = "textarea" -%}
153
+ {%- if state == "hover" -%}{%- set classes = classes + " is-hover" -%}{%- endif -%}
154
+ {%- if state == "focus" -%}{%- set classes = classes + " is-focus-visible" -%}{%- endif -%}
155
+ {%- if state == "disabled" or disabled -%}{%- set classes = classes + " is-disabled" -%}{%- endif -%}
156
+ {%- if className -%}{%- set classes = classes + " " + className -%}{%- endif -%}
157
+ <textarea class="{{ classes }}"{% if placeholder %} placeholder="{{ placeholder }}"{% endif %}{% if rows %} rows="{{ rows }}"{% endif %}{% if readonly %} readonly{% endif %}{% if disabled or state == "disabled" %} disabled{% endif %}>{{ value }}</textarea>
158
+ {%- endmacro %}
159
+
160
+ {% macro avatar(src='', alt='', initials='', size='', className='') -%}
161
+ {%- set classes = "avatar" -%}
162
+ {%- if size and size != "md" -%}{%- set classes = classes + " " + size -%}{%- endif -%}
163
+ {%- if className -%}{%- set classes = classes + " " + className -%}{%- endif -%}
164
+ <span class="{{ classes }}" role="img" aria-label="{{ alt or initials }}">
165
+ {%- if src -%}<img src="{{ src }}" alt="{{ alt }}" />{%- else -%}<span class="avatar__initials">{{ initials }}</span>{%- endif -%}
166
+ </span>
167
+ {%- endmacro %}
168
+
169
+ {% macro accordion(className='') -%}
170
+ {%- set classes = "accordion" -%}
171
+ {%- if className -%}{%- set classes = classes + " " + className -%}{%- endif -%}
172
+ <div class="{{ classes }}">{{ caller() }}</div>
173
+ {%- endmacro %}
174
+
175
+ {% macro accordionItem(title='', open=false, disabled=false) -%}
176
+ {%- set classes = "accordion-item" -%}
177
+ {%- if disabled -%}{%- set classes = classes + " is-disabled" -%}{%- endif -%}
178
+ <details class="{{ classes }}"{% if open %} open{% endif %}>
179
+ <summary>{{ title }}</summary>
180
+ <div class="accordion-item__content">{{ caller() }}</div>
181
+ </details>
182
+ {%- endmacro %}
183
+
184
+ {% macro tabList(orientation='horizontal', ariaLabel='', className='') -%}
185
+ {%- set classes = "tab-list" -%}
186
+ {%- if className -%}{%- set classes = classes + " " + className -%}{%- endif -%}
187
+ <div class="{{ classes }}" role="tablist" aria-orientation="{{ orientation }}"{% if ariaLabel %} aria-label="{{ ariaLabel }}"{% endif %}>{{ caller() }}</div>
188
+ {%- endmacro %}
189
+
190
+ {% macro tab(label='', selected=false, disabled=false, controls='') -%}
191
+ {%- set classes = "tab" -%}
192
+ <button class="{{ classes }}" role="tab" type="button" aria-selected="{{ "true" if selected else "false" }}"{% if controls %} aria-controls="{{ controls }}"{% endif %}{% if disabled %} disabled{% endif %} tabindex="{{ "0" if selected else "-1" }}">{{ label }}</button>
193
+ {%- endmacro %}
194
+
195
+ {% macro tabPanel(id='', hidden=false) -%}
196
+ <div class="tab-panel" role="tabpanel"{% if id %} id="{{ id }}"{% endif %}{% if hidden %} hidden{% endif %} tabindex="0">{{ caller() }}</div>
197
+ {%- endmacro %}
198
+
199
+ {% macro tooltip(text='', placement='top', className='') -%}
200
+ {%- set classes = "tooltip-trigger" -%}
201
+ {%- if className -%}{%- set classes = classes + " " + className -%}{%- endif -%}
202
+ <span class="{{ classes }}">{{ caller() }}<span class="tooltip" role="tooltip" data-placement="{{ placement }}">{{ text }}</span></span>
203
+ {%- endmacro %}