@tensor_1/react 2.28.0 → 2.29.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/README.md CHANGED
@@ -331,3 +331,26 @@ toast.dismiss(id); // or toast.dismiss() for all
331
331
  - **Accessibility:** errors are `role="alert"`. Everything else is announced through the toaster's polite live region, and a loading toast that settles is announced again. Esc closes the focused toast. Tone glyphs are decorative; the text carries the meaning.
332
332
  - **Stores:** `toast` writes to a default store that `<Toaster />` reads. `createToastApi(createToastStore())` gives a separate queue (tests, embedded apps); pass its `store` to `<Toaster store>`. The store has no React dependency.
333
333
  - `<Toaster>` still renders hand-managed `<Toast>` children first. `Toast` gains `tone="warning"` and an `action` slot.
334
+ ### Icons (`@tensor_1/react/icons`)
335
+
336
+ The UIx icon set (HAR-996): 233 glyphs drawn in `currentColor` at the `--uix-icon-*` sizes. Icons come only from UIx
337
+ (workspace ADR-0038); no product adds an icon library. The glyphs are Lucide's (ISC); the licence travels in
338
+ `THIRD_PARTY_NOTICES.md`. Import the CSS once: `@tensor_1/tokens/components/icon` (also in the bundle).
339
+
340
+ ```tsx
341
+ import { ShieldCheckIcon, TriangleAlertIcon, Icon } from '@tensor_1/react/icons';
342
+ import type { UixIcon, IconName } from '@tensor_1/react/icons';
343
+
344
+ <ShieldCheckIcon /> // decorative: aria-hidden, 20 px (md)
345
+ <ShieldCheckIcon size="sm" tone="success" label="Verified" /> // role="img" with a name
346
+ <Button icon aria-label="Delete"><Trash2Icon /></Button> // the button carries the name
347
+ <Icon name={entityIconName} /> // chosen at run time (loads the whole set)
348
+ const icons: Record<EntityType, UixIcon> = { incident: SirenIcon, change: GitBranchIcon };
349
+ ```
350
+
351
+ - **Migrating from `lucide-react`:** import from `@tensor_1/react/icons` and add `Icon` to the name: `ShieldCheck` → `ShieldCheckIcon`. The older Lucide names the products use are kept as aliases (`AlertTriangleIcon`, `CheckCircle2Icon`, `Loader2Icon`, …). `etc/icon-names.json` maps every Lucide name to its UIx component and glyph, for a codemod. `LucideIcon` becomes `UixIcon`.
352
+ - **Size:** `sm` 16 px, `md` 20 px (default), `lg` 24 px, or any CSS length or pixel number. A product sizing class (a Tailwind `size-4`) wins over the default.
353
+ - **Tone:** `current` (default, inherits the text colour), `muted`, `accent`, `success`, `warning`, `danger`, `info`.
354
+ - **Accessibility:** decorative unless `label` is set. Never let an icon carry meaning alone; pair it with text.
355
+ - **Bundle size:** each `<Name>Icon` is tree-shaken; one icon adds well under 3 KB minified. `<Icon name>` and `ICON_GLYPHS` load all of them.
356
+ - **A glyph is missing?** Add its Lucide name to `scripts/icon-names.txt`, run `node scripts/generate-icons.mjs <lucide-react dir>` and release. Do not paste an SVG into a product.
@@ -0,0 +1,54 @@
1
+ # Third-party notices
2
+
3
+ `@tensor_1/react` redistributes SVG path data from these projects. Their licences require this notice to travel with copies.
4
+
5
+ ## Lucide (lucide-react 1.39.0)
6
+
7
+ Used by: the icon set (`@tensor_1/react/icons`, `dist/icons/**`) and the editor, emoji, reaction and table-control glyphs (`EditorIcons`). Source: https://lucide.dev
8
+
9
+ ```text
10
+ ISC License
11
+
12
+ Copyright (c) 2026 Lucide Icons and Contributors
13
+
14
+ Permission to use, copy, modify, and/or distribute this software for any
15
+ purpose with or without fee is hereby granted, provided that the above
16
+ copyright notice and this permission notice appear in all copies.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
21
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25
+
26
+ ---
27
+
28
+ The following Lucide icons are derived from the Feather project:
29
+
30
+ airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
31
+
32
+ The MIT License (MIT) (for the icons listed above)
33
+
34
+ Copyright (c) 2013-present Cole Bemis
35
+
36
+ Permission is hereby granted, free of charge, to any person obtaining a copy
37
+ of this software and associated documentation files (the "Software"), to deal
38
+ in the Software without restriction, including without limitation the rights
39
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
40
+ copies of the Software, and to permit persons to whom the Software is
41
+ furnished to do so, subject to the following conditions:
42
+
43
+ The above copyright notice and this permission notice shall be included in all
44
+ copies or substantial portions of the Software.
45
+
46
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
47
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
48
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
49
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
50
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
51
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52
+ SOFTWARE.
53
+
54
+ ```
@@ -0,0 +1,489 @@
1
+ import * as react from 'react';
2
+ import { CSSProperties } from 'react';
3
+ import { IconNode, UixIcon, IconProps } from './types.js';
4
+
5
+ /** Renders a glyph as an inline SVG; the props contract shared by every icon. */
6
+ declare function renderIcon(node: IconNode, { size, tone, label, strokeWidth, className, style, ...rest }: IconProps, ref?: unknown): react.ReactElement<{
7
+ string?: number | string | undefined | undefined;
8
+ type?: string | undefined | undefined;
9
+ id?: string | undefined | undefined;
10
+ name?: string | undefined | undefined;
11
+ z?: number | string | undefined | undefined;
12
+ color?: string | undefined | undefined;
13
+ opacity?: number | string | undefined | undefined;
14
+ x?: number | string | undefined | undefined;
15
+ y?: number | string | undefined | undefined;
16
+ cursor?: number | string | undefined | undefined;
17
+ children?: react.ReactNode;
18
+ clipPath?: string | undefined | undefined;
19
+ radius?: number | string | undefined | undefined;
20
+ media?: string | undefined | undefined;
21
+ fontStyle?: number | string | undefined | undefined;
22
+ fontWeight?: number | string | undefined | undefined;
23
+ fontSize?: number | string | undefined | undefined;
24
+ fontFamily?: string | undefined | undefined;
25
+ height?: number | string | undefined | undefined;
26
+ suppressHydrationWarning?: boolean | undefined | undefined;
27
+ lang?: string | undefined | undefined;
28
+ tabIndex?: number | undefined | undefined;
29
+ role: string | undefined;
30
+ "aria-activedescendant"?: string | undefined | undefined;
31
+ "aria-atomic"?: (boolean | "false" | "true") | undefined;
32
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
33
+ "aria-braillelabel"?: string | undefined | undefined;
34
+ "aria-brailleroledescription"?: string | undefined | undefined;
35
+ "aria-busy"?: (boolean | "false" | "true") | undefined;
36
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
37
+ "aria-colcount"?: number | undefined | undefined;
38
+ "aria-colindex"?: number | undefined | undefined;
39
+ "aria-colindextext"?: string | undefined | undefined;
40
+ "aria-colspan"?: number | undefined | undefined;
41
+ "aria-controls"?: string | undefined | undefined;
42
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
43
+ "aria-describedby"?: string | undefined | undefined;
44
+ "aria-description"?: string | undefined | undefined;
45
+ "aria-details"?: string | undefined | undefined;
46
+ "aria-disabled"?: (boolean | "false" | "true") | undefined;
47
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
48
+ "aria-errormessage"?: string | undefined | undefined;
49
+ "aria-expanded"?: (boolean | "false" | "true") | undefined;
50
+ "aria-flowto"?: string | undefined | undefined;
51
+ "aria-grabbed"?: (boolean | "false" | "true") | undefined;
52
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
53
+ "aria-hidden": (boolean | "false" | "true") | undefined;
54
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
55
+ "aria-keyshortcuts"?: string | undefined | undefined;
56
+ "aria-label": string | undefined;
57
+ "aria-labelledby"?: string | undefined | undefined;
58
+ "aria-level"?: number | undefined | undefined;
59
+ "aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
60
+ "aria-modal"?: (boolean | "false" | "true") | undefined;
61
+ "aria-multiline"?: (boolean | "false" | "true") | undefined;
62
+ "aria-multiselectable"?: (boolean | "false" | "true") | undefined;
63
+ "aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
64
+ "aria-owns"?: string | undefined | undefined;
65
+ "aria-placeholder"?: string | undefined | undefined;
66
+ "aria-posinset"?: number | undefined | undefined;
67
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
68
+ "aria-readonly"?: (boolean | "false" | "true") | undefined;
69
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
70
+ "aria-required"?: (boolean | "false" | "true") | undefined;
71
+ "aria-roledescription"?: string | undefined | undefined;
72
+ "aria-rowcount"?: number | undefined | undefined;
73
+ "aria-rowindex"?: number | undefined | undefined;
74
+ "aria-rowindextext"?: string | undefined | undefined;
75
+ "aria-rowspan"?: number | undefined | undefined;
76
+ "aria-selected"?: (boolean | "false" | "true") | undefined;
77
+ "aria-setsize"?: number | undefined | undefined;
78
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
79
+ "aria-valuemax"?: number | undefined | undefined;
80
+ "aria-valuemin"?: number | undefined | undefined;
81
+ "aria-valuenow"?: number | undefined | undefined;
82
+ "aria-valuetext"?: string | undefined | undefined;
83
+ dangerouslySetInnerHTML?: {
84
+ __html: string | TrustedHTML;
85
+ } | undefined | undefined;
86
+ onCopy?: react.ClipboardEventHandler<SVGSVGElement> | undefined;
87
+ onCopyCapture?: react.ClipboardEventHandler<SVGSVGElement> | undefined;
88
+ onCut?: react.ClipboardEventHandler<SVGSVGElement> | undefined;
89
+ onCutCapture?: react.ClipboardEventHandler<SVGSVGElement> | undefined;
90
+ onPaste?: react.ClipboardEventHandler<SVGSVGElement> | undefined;
91
+ onPasteCapture?: react.ClipboardEventHandler<SVGSVGElement> | undefined;
92
+ onCompositionEnd?: react.CompositionEventHandler<SVGSVGElement> | undefined;
93
+ onCompositionEndCapture?: react.CompositionEventHandler<SVGSVGElement> | undefined;
94
+ onCompositionStart?: react.CompositionEventHandler<SVGSVGElement> | undefined;
95
+ onCompositionStartCapture?: react.CompositionEventHandler<SVGSVGElement> | undefined;
96
+ onCompositionUpdate?: react.CompositionEventHandler<SVGSVGElement> | undefined;
97
+ onCompositionUpdateCapture?: react.CompositionEventHandler<SVGSVGElement> | undefined;
98
+ onFocus?: react.FocusEventHandler<SVGSVGElement> | undefined;
99
+ onFocusCapture?: react.FocusEventHandler<SVGSVGElement> | undefined;
100
+ onBlur?: react.FocusEventHandler<SVGSVGElement> | undefined;
101
+ onBlurCapture?: react.FocusEventHandler<SVGSVGElement> | undefined;
102
+ onChange?: react.FormEventHandler<SVGSVGElement> | undefined;
103
+ onChangeCapture?: react.FormEventHandler<SVGSVGElement> | undefined;
104
+ onBeforeInput?: react.InputEventHandler<SVGSVGElement> | undefined;
105
+ onBeforeInputCapture?: react.FormEventHandler<SVGSVGElement> | undefined;
106
+ onInput?: react.FormEventHandler<SVGSVGElement> | undefined;
107
+ onInputCapture?: react.FormEventHandler<SVGSVGElement> | undefined;
108
+ onReset?: react.FormEventHandler<SVGSVGElement> | undefined;
109
+ onResetCapture?: react.FormEventHandler<SVGSVGElement> | undefined;
110
+ onSubmit?: react.FormEventHandler<SVGSVGElement> | undefined;
111
+ onSubmitCapture?: react.FormEventHandler<SVGSVGElement> | undefined;
112
+ onInvalid?: react.FormEventHandler<SVGSVGElement> | undefined;
113
+ onInvalidCapture?: react.FormEventHandler<SVGSVGElement> | undefined;
114
+ onLoad?: react.ReactEventHandler<SVGSVGElement> | undefined;
115
+ onLoadCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
116
+ onError?: react.ReactEventHandler<SVGSVGElement> | undefined;
117
+ onErrorCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
118
+ onKeyDown?: react.KeyboardEventHandler<SVGSVGElement> | undefined;
119
+ onKeyDownCapture?: react.KeyboardEventHandler<SVGSVGElement> | undefined;
120
+ onKeyPress?: react.KeyboardEventHandler<SVGSVGElement> | undefined;
121
+ onKeyPressCapture?: react.KeyboardEventHandler<SVGSVGElement> | undefined;
122
+ onKeyUp?: react.KeyboardEventHandler<SVGSVGElement> | undefined;
123
+ onKeyUpCapture?: react.KeyboardEventHandler<SVGSVGElement> | undefined;
124
+ onAbort?: react.ReactEventHandler<SVGSVGElement> | undefined;
125
+ onAbortCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
126
+ onCanPlay?: react.ReactEventHandler<SVGSVGElement> | undefined;
127
+ onCanPlayCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
128
+ onCanPlayThrough?: react.ReactEventHandler<SVGSVGElement> | undefined;
129
+ onCanPlayThroughCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
130
+ onDurationChange?: react.ReactEventHandler<SVGSVGElement> | undefined;
131
+ onDurationChangeCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
132
+ onEmptied?: react.ReactEventHandler<SVGSVGElement> | undefined;
133
+ onEmptiedCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
134
+ onEncrypted?: react.ReactEventHandler<SVGSVGElement> | undefined;
135
+ onEncryptedCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
136
+ onEnded?: react.ReactEventHandler<SVGSVGElement> | undefined;
137
+ onEndedCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
138
+ onLoadedData?: react.ReactEventHandler<SVGSVGElement> | undefined;
139
+ onLoadedDataCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
140
+ onLoadedMetadata?: react.ReactEventHandler<SVGSVGElement> | undefined;
141
+ onLoadedMetadataCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
142
+ onLoadStart?: react.ReactEventHandler<SVGSVGElement> | undefined;
143
+ onLoadStartCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
144
+ onPause?: react.ReactEventHandler<SVGSVGElement> | undefined;
145
+ onPauseCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
146
+ onPlay?: react.ReactEventHandler<SVGSVGElement> | undefined;
147
+ onPlayCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
148
+ onPlaying?: react.ReactEventHandler<SVGSVGElement> | undefined;
149
+ onPlayingCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
150
+ onProgress?: react.ReactEventHandler<SVGSVGElement> | undefined;
151
+ onProgressCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
152
+ onRateChange?: react.ReactEventHandler<SVGSVGElement> | undefined;
153
+ onRateChangeCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
154
+ onSeeked?: react.ReactEventHandler<SVGSVGElement> | undefined;
155
+ onSeekedCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
156
+ onSeeking?: react.ReactEventHandler<SVGSVGElement> | undefined;
157
+ onSeekingCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
158
+ onStalled?: react.ReactEventHandler<SVGSVGElement> | undefined;
159
+ onStalledCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
160
+ onSuspend?: react.ReactEventHandler<SVGSVGElement> | undefined;
161
+ onSuspendCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
162
+ onTimeUpdate?: react.ReactEventHandler<SVGSVGElement> | undefined;
163
+ onTimeUpdateCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
164
+ onVolumeChange?: react.ReactEventHandler<SVGSVGElement> | undefined;
165
+ onVolumeChangeCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
166
+ onWaiting?: react.ReactEventHandler<SVGSVGElement> | undefined;
167
+ onWaitingCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
168
+ onAuxClick?: react.MouseEventHandler<SVGSVGElement> | undefined;
169
+ onAuxClickCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
170
+ onClick?: react.MouseEventHandler<SVGSVGElement> | undefined;
171
+ onClickCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
172
+ onContextMenu?: react.MouseEventHandler<SVGSVGElement> | undefined;
173
+ onContextMenuCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
174
+ onDoubleClick?: react.MouseEventHandler<SVGSVGElement> | undefined;
175
+ onDoubleClickCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
176
+ onDrag?: react.DragEventHandler<SVGSVGElement> | undefined;
177
+ onDragCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
178
+ onDragEnd?: react.DragEventHandler<SVGSVGElement> | undefined;
179
+ onDragEndCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
180
+ onDragEnter?: react.DragEventHandler<SVGSVGElement> | undefined;
181
+ onDragEnterCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
182
+ onDragExit?: react.DragEventHandler<SVGSVGElement> | undefined;
183
+ onDragExitCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
184
+ onDragLeave?: react.DragEventHandler<SVGSVGElement> | undefined;
185
+ onDragLeaveCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
186
+ onDragOver?: react.DragEventHandler<SVGSVGElement> | undefined;
187
+ onDragOverCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
188
+ onDragStart?: react.DragEventHandler<SVGSVGElement> | undefined;
189
+ onDragStartCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
190
+ onDrop?: react.DragEventHandler<SVGSVGElement> | undefined;
191
+ onDropCapture?: react.DragEventHandler<SVGSVGElement> | undefined;
192
+ onMouseDown?: react.MouseEventHandler<SVGSVGElement> | undefined;
193
+ onMouseDownCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
194
+ onMouseEnter?: react.MouseEventHandler<SVGSVGElement> | undefined;
195
+ onMouseLeave?: react.MouseEventHandler<SVGSVGElement> | undefined;
196
+ onMouseMove?: react.MouseEventHandler<SVGSVGElement> | undefined;
197
+ onMouseMoveCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
198
+ onMouseOut?: react.MouseEventHandler<SVGSVGElement> | undefined;
199
+ onMouseOutCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
200
+ onMouseOver?: react.MouseEventHandler<SVGSVGElement> | undefined;
201
+ onMouseOverCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
202
+ onMouseUp?: react.MouseEventHandler<SVGSVGElement> | undefined;
203
+ onMouseUpCapture?: react.MouseEventHandler<SVGSVGElement> | undefined;
204
+ onSelect?: react.ReactEventHandler<SVGSVGElement> | undefined;
205
+ onSelectCapture?: react.ReactEventHandler<SVGSVGElement> | undefined;
206
+ onTouchCancel?: react.TouchEventHandler<SVGSVGElement> | undefined;
207
+ onTouchCancelCapture?: react.TouchEventHandler<SVGSVGElement> | undefined;
208
+ onTouchEnd?: react.TouchEventHandler<SVGSVGElement> | undefined;
209
+ onTouchEndCapture?: react.TouchEventHandler<SVGSVGElement> | undefined;
210
+ onTouchMove?: react.TouchEventHandler<SVGSVGElement> | undefined;
211
+ onTouchMoveCapture?: react.TouchEventHandler<SVGSVGElement> | undefined;
212
+ onTouchStart?: react.TouchEventHandler<SVGSVGElement> | undefined;
213
+ onTouchStartCapture?: react.TouchEventHandler<SVGSVGElement> | undefined;
214
+ onPointerDown?: react.PointerEventHandler<SVGSVGElement> | undefined;
215
+ onPointerDownCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
216
+ onPointerMove?: react.PointerEventHandler<SVGSVGElement> | undefined;
217
+ onPointerMoveCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
218
+ onPointerUp?: react.PointerEventHandler<SVGSVGElement> | undefined;
219
+ onPointerUpCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
220
+ onPointerCancel?: react.PointerEventHandler<SVGSVGElement> | undefined;
221
+ onPointerCancelCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
222
+ onPointerEnter?: react.PointerEventHandler<SVGSVGElement> | undefined;
223
+ onPointerLeave?: react.PointerEventHandler<SVGSVGElement> | undefined;
224
+ onPointerOver?: react.PointerEventHandler<SVGSVGElement> | undefined;
225
+ onPointerOverCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
226
+ onPointerOut?: react.PointerEventHandler<SVGSVGElement> | undefined;
227
+ onPointerOutCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
228
+ onGotPointerCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
229
+ onGotPointerCaptureCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
230
+ onLostPointerCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
231
+ onLostPointerCaptureCapture?: react.PointerEventHandler<SVGSVGElement> | undefined;
232
+ onScroll?: react.UIEventHandler<SVGSVGElement> | undefined;
233
+ onScrollCapture?: react.UIEventHandler<SVGSVGElement> | undefined;
234
+ onWheel?: react.WheelEventHandler<SVGSVGElement> | undefined;
235
+ onWheelCapture?: react.WheelEventHandler<SVGSVGElement> | undefined;
236
+ onAnimationStart?: react.AnimationEventHandler<SVGSVGElement> | undefined;
237
+ onAnimationStartCapture?: react.AnimationEventHandler<SVGSVGElement> | undefined;
238
+ onAnimationEnd?: react.AnimationEventHandler<SVGSVGElement> | undefined;
239
+ onAnimationEndCapture?: react.AnimationEventHandler<SVGSVGElement> | undefined;
240
+ onAnimationIteration?: react.AnimationEventHandler<SVGSVGElement> | undefined;
241
+ onAnimationIterationCapture?: react.AnimationEventHandler<SVGSVGElement> | undefined;
242
+ onTransitionEnd?: react.TransitionEventHandler<SVGSVGElement> | undefined;
243
+ onTransitionEndCapture?: react.TransitionEventHandler<SVGSVGElement> | undefined;
244
+ end?: number | string | undefined | undefined;
245
+ alphabetic?: number | string | undefined | undefined;
246
+ ideographic?: number | string | undefined | undefined;
247
+ mathematical?: number | string | undefined | undefined;
248
+ accumulate?: "none" | "sum" | undefined | undefined;
249
+ local?: number | string | undefined | undefined;
250
+ hanging?: number | string | undefined | undefined;
251
+ unicode?: number | string | undefined | undefined;
252
+ fill: string;
253
+ clip?: number | string | undefined | undefined;
254
+ stroke: string;
255
+ r?: number | string | undefined | undefined;
256
+ filter?: string | undefined | undefined;
257
+ values?: string | undefined | undefined;
258
+ offset?: number | string | undefined | undefined;
259
+ dy?: number | string | undefined | undefined;
260
+ dx?: number | string | undefined | undefined;
261
+ transform?: string | undefined | undefined;
262
+ mask?: string | undefined | undefined;
263
+ path?: string | undefined | undefined;
264
+ max?: number | string | undefined | undefined;
265
+ method?: string | undefined | undefined;
266
+ min?: number | string | undefined | undefined;
267
+ target?: string | undefined | undefined;
268
+ width?: number | string | undefined | undefined;
269
+ crossOrigin?: "" | "anonymous" | "use-credentials" | undefined;
270
+ accentHeight?: number | string | undefined | undefined;
271
+ additive?: "replace" | "sum" | undefined | undefined;
272
+ alignmentBaseline?: "auto" | "baseline" | "before-edge" | "text-before-edge" | "middle" | "central" | "after-edge" | "text-after-edge" | "ideographic" | "alphabetic" | "hanging" | "mathematical" | "inherit" | undefined | undefined;
273
+ allowReorder?: "no" | "yes" | undefined | undefined;
274
+ amplitude?: number | string | undefined | undefined;
275
+ arabicForm?: "initial" | "medial" | "terminal" | "isolated" | undefined | undefined;
276
+ ascent?: number | string | undefined | undefined;
277
+ attributeName?: string | undefined | undefined;
278
+ attributeType?: string | undefined | undefined;
279
+ autoReverse?: (boolean | "false" | "true") | undefined;
280
+ azimuth?: number | string | undefined | undefined;
281
+ baseFrequency?: number | string | undefined | undefined;
282
+ baselineShift?: number | string | undefined | undefined;
283
+ baseProfile?: number | string | undefined | undefined;
284
+ bbox?: number | string | undefined | undefined;
285
+ begin?: number | string | undefined | undefined;
286
+ bias?: number | string | undefined | undefined;
287
+ by?: number | string | undefined | undefined;
288
+ calcMode?: number | string | undefined | undefined;
289
+ capHeight?: number | string | undefined | undefined;
290
+ clipPathUnits?: number | string | undefined | undefined;
291
+ clipRule?: number | string | undefined | undefined;
292
+ colorInterpolation?: number | string | undefined | undefined;
293
+ colorInterpolationFilters?: "auto" | "sRGB" | "linearRGB" | "inherit" | undefined | undefined;
294
+ colorProfile?: number | string | undefined | undefined;
295
+ colorRendering?: number | string | undefined | undefined;
296
+ contentScriptType?: number | string | undefined | undefined;
297
+ contentStyleType?: number | string | undefined | undefined;
298
+ cx?: number | string | undefined | undefined;
299
+ cy?: number | string | undefined | undefined;
300
+ d?: string | undefined | undefined;
301
+ decelerate?: number | string | undefined | undefined;
302
+ descent?: number | string | undefined | undefined;
303
+ diffuseConstant?: number | string | undefined | undefined;
304
+ direction?: number | string | undefined | undefined;
305
+ display?: number | string | undefined | undefined;
306
+ divisor?: number | string | undefined | undefined;
307
+ dominantBaseline?: "auto" | "use-script" | "no-change" | "reset-size" | "ideographic" | "alphabetic" | "hanging" | "mathematical" | "central" | "middle" | "text-after-edge" | "text-before-edge" | "inherit" | undefined | undefined;
308
+ dur?: number | string | undefined | undefined;
309
+ edgeMode?: number | string | undefined | undefined;
310
+ elevation?: number | string | undefined | undefined;
311
+ enableBackground?: number | string | undefined | undefined;
312
+ exponent?: number | string | undefined | undefined;
313
+ externalResourcesRequired?: (boolean | "false" | "true") | undefined;
314
+ fillOpacity?: number | string | undefined | undefined;
315
+ fillRule?: "nonzero" | "evenodd" | "inherit" | undefined | undefined;
316
+ filterRes?: number | string | undefined | undefined;
317
+ filterUnits?: number | string | undefined | undefined;
318
+ floodColor?: number | string | undefined | undefined;
319
+ floodOpacity?: number | string | undefined | undefined;
320
+ focusable: string | boolean;
321
+ fontSizeAdjust?: number | string | undefined | undefined;
322
+ fontStretch?: number | string | undefined | undefined;
323
+ fontVariant?: number | string | undefined | undefined;
324
+ format?: number | string | undefined | undefined;
325
+ fr?: number | string | undefined | undefined;
326
+ from?: number | string | undefined | undefined;
327
+ fx?: number | string | undefined | undefined;
328
+ fy?: number | string | undefined | undefined;
329
+ g1?: number | string | undefined | undefined;
330
+ g2?: number | string | undefined | undefined;
331
+ glyphName?: number | string | undefined | undefined;
332
+ glyphOrientationHorizontal?: number | string | undefined | undefined;
333
+ glyphOrientationVertical?: number | string | undefined | undefined;
334
+ glyphRef?: number | string | undefined | undefined;
335
+ gradientTransform?: string | undefined | undefined;
336
+ gradientUnits?: string | undefined | undefined;
337
+ horizAdvX?: number | string | undefined | undefined;
338
+ horizOriginX?: number | string | undefined | undefined;
339
+ href?: string | undefined | undefined;
340
+ imageRendering?: number | string | undefined | undefined;
341
+ in2?: number | string | undefined | undefined;
342
+ in?: string | undefined | undefined;
343
+ intercept?: number | string | undefined | undefined;
344
+ k1?: number | string | undefined | undefined;
345
+ k2?: number | string | undefined | undefined;
346
+ k3?: number | string | undefined | undefined;
347
+ k4?: number | string | undefined | undefined;
348
+ k?: number | string | undefined | undefined;
349
+ kernelMatrix?: number | string | undefined | undefined;
350
+ kernelUnitLength?: number | string | undefined | undefined;
351
+ kerning?: number | string | undefined | undefined;
352
+ keyPoints?: number | string | undefined | undefined;
353
+ keySplines?: number | string | undefined | undefined;
354
+ keyTimes?: number | string | undefined | undefined;
355
+ lengthAdjust?: number | string | undefined | undefined;
356
+ letterSpacing?: number | string | undefined | undefined;
357
+ lightingColor?: number | string | undefined | undefined;
358
+ limitingConeAngle?: number | string | undefined | undefined;
359
+ markerEnd?: string | undefined | undefined;
360
+ markerHeight?: number | string | undefined | undefined;
361
+ markerMid?: string | undefined | undefined;
362
+ markerStart?: string | undefined | undefined;
363
+ markerUnits?: number | string | undefined | undefined;
364
+ markerWidth?: number | string | undefined | undefined;
365
+ maskContentUnits?: number | string | undefined | undefined;
366
+ maskUnits?: number | string | undefined | undefined;
367
+ mode?: number | string | undefined | undefined;
368
+ numOctaves?: number | string | undefined | undefined;
369
+ operator?: number | string | undefined | undefined;
370
+ order?: number | string | undefined | undefined;
371
+ orient?: number | string | undefined | undefined;
372
+ orientation?: number | string | undefined | undefined;
373
+ origin?: number | string | undefined | undefined;
374
+ overflow?: number | string | undefined | undefined;
375
+ overlinePosition?: number | string | undefined | undefined;
376
+ overlineThickness?: number | string | undefined | undefined;
377
+ paintOrder?: number | string | undefined | undefined;
378
+ panose1?: number | string | undefined | undefined;
379
+ pathLength?: number | string | undefined | undefined;
380
+ patternContentUnits?: string | undefined | undefined;
381
+ patternTransform?: number | string | undefined | undefined;
382
+ patternUnits?: string | undefined | undefined;
383
+ pointerEvents?: number | string | undefined | undefined;
384
+ points?: string | undefined | undefined;
385
+ pointsAtX?: number | string | undefined | undefined;
386
+ pointsAtY?: number | string | undefined | undefined;
387
+ pointsAtZ?: number | string | undefined | undefined;
388
+ preserveAlpha?: (boolean | "false" | "true") | undefined;
389
+ preserveAspectRatio?: string | undefined | undefined;
390
+ primitiveUnits?: number | string | undefined | undefined;
391
+ refX?: number | string | undefined | undefined;
392
+ refY?: number | string | undefined | undefined;
393
+ renderingIntent?: number | string | undefined | undefined;
394
+ repeatCount?: number | string | undefined | undefined;
395
+ repeatDur?: number | string | undefined | undefined;
396
+ requiredExtensions?: number | string | undefined | undefined;
397
+ requiredFeatures?: number | string | undefined | undefined;
398
+ restart?: number | string | undefined | undefined;
399
+ result?: string | undefined | undefined;
400
+ rotate?: number | string | undefined | undefined;
401
+ rx?: number | string | undefined | undefined;
402
+ ry?: number | string | undefined | undefined;
403
+ scale?: number | string | undefined | undefined;
404
+ seed?: number | string | undefined | undefined;
405
+ shapeRendering?: number | string | undefined | undefined;
406
+ slope?: number | string | undefined | undefined;
407
+ spacing?: number | string | undefined | undefined;
408
+ specularConstant?: number | string | undefined | undefined;
409
+ specularExponent?: number | string | undefined | undefined;
410
+ speed?: number | string | undefined | undefined;
411
+ spreadMethod?: string | undefined | undefined;
412
+ startOffset?: number | string | undefined | undefined;
413
+ stdDeviation?: number | string | undefined | undefined;
414
+ stemh?: number | string | undefined | undefined;
415
+ stemv?: number | string | undefined | undefined;
416
+ stitchTiles?: number | string | undefined | undefined;
417
+ stopColor?: string | undefined | undefined;
418
+ stopOpacity?: number | string | undefined | undefined;
419
+ strikethroughPosition?: number | string | undefined | undefined;
420
+ strikethroughThickness?: number | string | undefined | undefined;
421
+ strokeDasharray?: string | number | undefined | undefined;
422
+ strokeDashoffset?: string | number | undefined | undefined;
423
+ strokeLinecap: string;
424
+ strokeLinejoin: string;
425
+ strokeMiterlimit?: number | string | undefined | undefined;
426
+ strokeOpacity?: number | string | undefined | undefined;
427
+ surfaceScale?: number | string | undefined | undefined;
428
+ systemLanguage?: number | string | undefined | undefined;
429
+ tableValues?: number | string | undefined | undefined;
430
+ targetX?: number | string | undefined | undefined;
431
+ targetY?: number | string | undefined | undefined;
432
+ textAnchor?: "start" | "middle" | "end" | "inherit" | undefined | undefined;
433
+ textDecoration?: number | string | undefined | undefined;
434
+ textLength?: number | string | undefined | undefined;
435
+ textRendering?: number | string | undefined | undefined;
436
+ to?: number | string | undefined | undefined;
437
+ transformOrigin?: string | undefined | undefined;
438
+ u1?: number | string | undefined | undefined;
439
+ u2?: number | string | undefined | undefined;
440
+ underlinePosition?: number | string | undefined | undefined;
441
+ underlineThickness?: number | string | undefined | undefined;
442
+ unicodeBidi?: number | string | undefined | undefined;
443
+ unicodeRange?: number | string | undefined | undefined;
444
+ unitsPerEm?: number | string | undefined | undefined;
445
+ vAlphabetic?: number | string | undefined | undefined;
446
+ vectorEffect?: number | string | undefined | undefined;
447
+ version?: string | undefined | undefined;
448
+ vertAdvY?: number | string | undefined | undefined;
449
+ vertOriginX?: number | string | undefined | undefined;
450
+ vertOriginY?: number | string | undefined | undefined;
451
+ vHanging?: number | string | undefined | undefined;
452
+ vIdeographic?: number | string | undefined | undefined;
453
+ viewBox: string;
454
+ viewTarget?: number | string | undefined | undefined;
455
+ visibility?: number | string | undefined | undefined;
456
+ vMathematical?: number | string | undefined | undefined;
457
+ widths?: number | string | undefined | undefined;
458
+ wordSpacing?: number | string | undefined | undefined;
459
+ writingMode?: number | string | undefined | undefined;
460
+ x1?: number | string | undefined | undefined;
461
+ x2?: number | string | undefined | undefined;
462
+ xChannelSelector?: string | undefined | undefined;
463
+ xHeight?: number | string | undefined | undefined;
464
+ xlinkActuate?: string | undefined | undefined;
465
+ xlinkArcrole?: string | undefined | undefined;
466
+ xlinkHref?: string | undefined | undefined;
467
+ xlinkRole?: string | undefined | undefined;
468
+ xlinkShow?: string | undefined | undefined;
469
+ xlinkTitle?: string | undefined | undefined;
470
+ xlinkType?: string | undefined | undefined;
471
+ xmlBase?: string | undefined | undefined;
472
+ xmlLang?: string | undefined | undefined;
473
+ xmlns: string;
474
+ xmlnsXlink?: string | undefined | undefined;
475
+ xmlSpace?: string | undefined | undefined;
476
+ y1?: number | string | undefined | undefined;
477
+ y2?: number | string | undefined | undefined;
478
+ yChannelSelector?: string | undefined | undefined;
479
+ zoomAndPan?: string | undefined | undefined;
480
+ key?: react.Key | null | undefined;
481
+ ref: unknown;
482
+ strokeWidth: string | number;
483
+ className: string;
484
+ style: CSSProperties | undefined;
485
+ }, string | react.JSXElementConstructor<any>>;
486
+ /** Makes a named, ref-forwarding component for one glyph (the generated `<Name>Icon` exports). */
487
+ declare function createIcon(displayName: string, node: IconNode): UixIcon;
488
+
489
+ export { createIcon, renderIcon };
@@ -0,0 +1,37 @@
1
+ import { createElement, forwardRef } from "react";
2
+ import { cx } from "../cx.js";
3
+ const SIZES = /* @__PURE__ */ new Set(["sm", "md", "lg"]);
4
+ function renderIcon(node, { size = "md", tone = "current", label, strokeWidth = 2, className, style, ...rest }, ref) {
5
+ const tokenSize = typeof size === "string" && SIZES.has(size);
6
+ const length = typeof size === "number" ? `${size}px` : tokenSize ? void 0 : size;
7
+ return createElement(
8
+ "svg",
9
+ {
10
+ ref,
11
+ xmlns: "http://www.w3.org/2000/svg",
12
+ viewBox: "0 0 24 24",
13
+ fill: "none",
14
+ stroke: "currentColor",
15
+ strokeWidth,
16
+ strokeLinecap: "round",
17
+ strokeLinejoin: "round",
18
+ focusable: "false",
19
+ className: cx("uix-icon", tokenSize && size !== "md" && `uix-icon--${size}`, tone !== "current" && `uix-icon--${tone}`, className),
20
+ style: length ? { width: length, height: length, ...style } : style,
21
+ role: label ? "img" : void 0,
22
+ "aria-label": label || void 0,
23
+ "aria-hidden": label ? void 0 : true,
24
+ ...rest
25
+ },
26
+ node.map(([tag, attrs], i) => createElement(tag, { key: i, ...attrs }))
27
+ );
28
+ }
29
+ function createIcon(displayName, node) {
30
+ const Component = forwardRef((props, ref) => renderIcon(node, props, ref));
31
+ Component.displayName = displayName;
32
+ return Component;
33
+ }
34
+ export {
35
+ createIcon,
36
+ renderIcon
37
+ };
@@ -0,0 +1,15 @@
1
+ import * as react from 'react';
2
+ import { IconName } from './glyphs.js';
3
+ import { IconProps } from './types.js';
4
+
5
+ interface IconByNameProps extends IconProps {
6
+ name: IconName;
7
+ }
8
+ /**
9
+ * An icon chosen by name at run time (e.g. from a config or an entity type). It imports the
10
+ * whole set; a fixed icon should use its own component (`ShieldCheckIcon`) so bundlers keep
11
+ * only the glyphs you use.
12
+ */
13
+ declare const Icon: react.ForwardRefExoticComponent<IconByNameProps & react.RefAttributes<SVGSVGElement>>;
14
+
15
+ export { Icon, type IconByNameProps };
@@ -0,0 +1,9 @@
1
+ import { forwardRef } from "react";
2
+ import { renderIcon } from "./Icon.js";
3
+ import { ICON_GLYPHS } from "./glyphs.js";
4
+ const Icon = forwardRef(function Icon2({ name, ...props }, ref) {
5
+ return renderIcon(ICON_GLYPHS[name], props, ref);
6
+ });
7
+ export {
8
+ Icon
9
+ };