ionbase-ui 0.84.0 → 0.86.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/dist/components/Checkbox.d.ts +39 -0
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox.js +77 -4
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/Fieldset.d.ts +62 -0
- package/dist/components/Fieldset.d.ts.map +1 -0
- package/dist/components/Fieldset.js +58 -0
- package/dist/components/Fieldset.js.map +1 -0
- package/dist/components/Radio.d.ts +14 -0
- package/dist/components/Radio.d.ts.map +1 -1
- package/dist/components/Radio.js +15 -4
- package/dist/components/Radio.js.map +1 -1
- package/dist/components/SearchField.d.ts +36 -0
- package/dist/components/SearchField.d.ts.map +1 -0
- package/dist/components/SearchField.js +76 -0
- package/dist/components/SearchField.js.map +1 -0
- package/dist/components/index.d.ts +6 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -1
- package/dist/components/index.js.map +1 -1
- package/dist/figma-descriptions.json +87 -77
- package/dist/figma-map.json +132 -3
- package/dist/meta/Checkbox.json +8 -6
- package/dist/meta/CheckboxGroup.json +268 -0
- package/dist/meta/Divider.json +2 -2
- package/dist/meta/Fieldset.json +162 -0
- package/dist/meta/Radio.json +0 -1
- package/dist/meta/RadioGroup.json +59 -7
- package/dist/meta/SearchField.json +487 -0
- package/dist/meta/Stepper.json +2 -2
- package/dist/meta/Tabs.json +3 -3
- package/dist/meta/components.json +1015 -45
- package/dist/meta/contrast.json +370 -74
- package/dist/meta/index.json +59 -8
- package/dist/meta/patterns/DataTable.json +14 -6
- package/dist/meta/patterns/Form.json +27 -2
- package/dist/meta/patterns/index.json +4 -2
- package/dist/styles/fieldset.css +65 -0
- package/dist/styles/index.css +2 -0
- package/dist/styles/radio.css +0 -20
- package/dist/styles/search-field.css +70 -0
- package/llms.txt +2 -2
- package/package.json +1 -1
package/dist/meta/index.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "ionbase-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.86.0",
|
|
4
4
|
"usage": "Pick a component here, then read dist/meta/<Name>.json for its full contract.",
|
|
5
5
|
"hooks": [
|
|
6
6
|
"useAgentRun",
|
|
@@ -298,6 +298,28 @@
|
|
|
298
298
|
"detail": "dist/meta/Checkbox.json",
|
|
299
299
|
"hasIntent": true
|
|
300
300
|
},
|
|
301
|
+
"CheckboxGroup": {
|
|
302
|
+
"summary": "A set of checkboxes answering one question. Owns the selected values, the group's label, help and error, and \"select at least one\".",
|
|
303
|
+
"status": "stable",
|
|
304
|
+
"variants": {
|
|
305
|
+
"size": [
|
|
306
|
+
"sm",
|
|
307
|
+
"md",
|
|
308
|
+
"lg"
|
|
309
|
+
],
|
|
310
|
+
"intent": [
|
|
311
|
+
"neutral",
|
|
312
|
+
"danger",
|
|
313
|
+
"brand"
|
|
314
|
+
],
|
|
315
|
+
"orientation": [
|
|
316
|
+
"vertical",
|
|
317
|
+
"horizontal"
|
|
318
|
+
]
|
|
319
|
+
},
|
|
320
|
+
"detail": "dist/meta/CheckboxGroup.json",
|
|
321
|
+
"hasIntent": true
|
|
322
|
+
},
|
|
301
323
|
"Citation": {
|
|
302
324
|
"summary": "The inline source marker. The visible number is for the eye; the accessible name is the sentence.",
|
|
303
325
|
"status": "stable",
|
|
@@ -388,8 +410,8 @@
|
|
|
388
410
|
"status": "stable",
|
|
389
411
|
"variants": {
|
|
390
412
|
"orientation": [
|
|
391
|
-
"
|
|
392
|
-
"
|
|
413
|
+
"vertical",
|
|
414
|
+
"horizontal"
|
|
393
415
|
]
|
|
394
416
|
},
|
|
395
417
|
"detail": "dist/meta/Divider.json",
|
|
@@ -433,6 +455,18 @@
|
|
|
433
455
|
"detail": "dist/meta/EmptyState.json",
|
|
434
456
|
"hasIntent": true
|
|
435
457
|
},
|
|
458
|
+
"Fieldset": {
|
|
459
|
+
"summary": "A <fieldset>/<legend> that groups related fields under one label, one description and one error — an address, a pair of limits, a date typed as two fields.",
|
|
460
|
+
"status": "stable",
|
|
461
|
+
"variants": {
|
|
462
|
+
"orientation": [
|
|
463
|
+
"vertical",
|
|
464
|
+
"horizontal"
|
|
465
|
+
]
|
|
466
|
+
},
|
|
467
|
+
"detail": "dist/meta/Fieldset.json",
|
|
468
|
+
"hasIntent": true
|
|
469
|
+
},
|
|
436
470
|
"FileUpload": {
|
|
437
471
|
"summary": "A drop target wrapped around a real file input, with client-side accept and size checks.",
|
|
438
472
|
"status": "stable",
|
|
@@ -735,9 +769,13 @@
|
|
|
735
769
|
"hasIntent": true
|
|
736
770
|
},
|
|
737
771
|
"RadioGroup": {
|
|
738
|
-
"summary": "A <fieldset>/<legend> group of mutually exclusive options. Owns the shared name and the selected value.",
|
|
772
|
+
"summary": "A <fieldset>/<legend> group of mutually exclusive options. Owns the shared name and the selected value, and the group's label, help and error.",
|
|
739
773
|
"status": "stable",
|
|
740
774
|
"variants": {
|
|
775
|
+
"orientation": [
|
|
776
|
+
"vertical",
|
|
777
|
+
"horizontal"
|
|
778
|
+
],
|
|
741
779
|
"size": [
|
|
742
780
|
"sm",
|
|
743
781
|
"md",
|
|
@@ -764,6 +802,19 @@
|
|
|
764
802
|
"detail": "dist/meta/ScrollProgress.json",
|
|
765
803
|
"hasIntent": true
|
|
766
804
|
},
|
|
805
|
+
"SearchField": {
|
|
806
|
+
"summary": "A text field for a search query: role=\"searchbox\", Enter submits, Escape clears, and a clear button once there is something to clear. Input's box and sizes.",
|
|
807
|
+
"status": "stable",
|
|
808
|
+
"variants": {
|
|
809
|
+
"size": [
|
|
810
|
+
"sm",
|
|
811
|
+
"md",
|
|
812
|
+
"lg"
|
|
813
|
+
]
|
|
814
|
+
},
|
|
815
|
+
"detail": "dist/meta/SearchField.json",
|
|
816
|
+
"hasIntent": true
|
|
817
|
+
},
|
|
767
818
|
"SegmentedControl": {
|
|
768
819
|
"summary": "Pick one of two to five options, all visible at once. A radio group drawn as a segmented track — it sets a value and controls no panel.",
|
|
769
820
|
"status": "stable",
|
|
@@ -880,8 +931,8 @@
|
|
|
880
931
|
"status": "stable",
|
|
881
932
|
"variants": {
|
|
882
933
|
"orientation": [
|
|
883
|
-
"
|
|
884
|
-
"
|
|
934
|
+
"vertical",
|
|
935
|
+
"horizontal"
|
|
885
936
|
]
|
|
886
937
|
},
|
|
887
938
|
"detail": "dist/meta/Stepper.json",
|
|
@@ -990,8 +1041,8 @@
|
|
|
990
1041
|
"lg"
|
|
991
1042
|
],
|
|
992
1043
|
"orientation": [
|
|
993
|
-
"
|
|
994
|
-
"
|
|
1044
|
+
"vertical",
|
|
1045
|
+
"horizontal"
|
|
995
1046
|
]
|
|
996
1047
|
},
|
|
997
1048
|
"detail": "dist/meta/Tabs.json",
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"Button",
|
|
16
16
|
"Badge",
|
|
17
17
|
"Alert",
|
|
18
|
-
"
|
|
18
|
+
"SearchField",
|
|
19
19
|
"TagGroup"
|
|
20
20
|
],
|
|
21
21
|
"structure": [
|
|
22
|
-
"A toolbar above the table: a
|
|
23
|
-
"Under the toolbar, once any filter is applied: a TagGroup of the active filters, each removable on its own, beside a Clear all Button. When the last one goes the row goes with it, so move focus to the
|
|
22
|
+
"A toolbar above the table: a SearchField (size sm, with an aria-label naming what it searches), filter controls, and the bulk-action Buttons that appear once something is selected.",
|
|
23
|
+
"Under the toolbar, once any filter is applied: a TagGroup of the active filters, each removable on its own, beside a Clear all Button. When the last one goes the row goes with it, so move focus to the SearchField.",
|
|
24
24
|
"Table with a TableHead whose first cell carries the select-all Checkbox, and a TableBody whose rows each carry their own.",
|
|
25
25
|
"Sortable columns: every header that sorts gets `sortDirection` — the current direction on the sorted column, `none` on the others — so each shows it can be sorted before anyone tries.",
|
|
26
26
|
"One region below the table for pagination or a load-more Button.",
|
|
@@ -80,13 +80,17 @@
|
|
|
80
80
|
"title",
|
|
81
81
|
"actions"
|
|
82
82
|
],
|
|
83
|
-
"Input": [
|
|
84
|
-
"leadingIcon"
|
|
85
|
-
],
|
|
86
83
|
"TagGroup": [
|
|
87
84
|
"label",
|
|
88
85
|
"items",
|
|
89
86
|
"onRemove"
|
|
87
|
+
],
|
|
88
|
+
"SearchField": [
|
|
89
|
+
"size",
|
|
90
|
+
"value",
|
|
91
|
+
"onChange",
|
|
92
|
+
"placeholder",
|
|
93
|
+
"aria-label"
|
|
90
94
|
]
|
|
91
95
|
},
|
|
92
96
|
"variantsUsed": {
|
|
@@ -152,6 +156,10 @@
|
|
|
152
156
|
{
|
|
153
157
|
"dont": "sorting only the current page of a paged table",
|
|
154
158
|
"why": "the reader sees \"A–Z\" and takes it as the whole list; send the sort to the server, which knows every row"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"dont": "an Input with type=\"search\" and a magnifier icon as the table's search",
|
|
162
|
+
"why": "it has no searchbox role, no Escape to clear and no labelled clear button — SearchField is the same box with that behaviour"
|
|
155
163
|
}
|
|
156
164
|
]
|
|
157
165
|
}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
"Input",
|
|
10
10
|
"Select",
|
|
11
11
|
"Checkbox",
|
|
12
|
+
"CheckboxGroup",
|
|
13
|
+
"Fieldset",
|
|
12
14
|
"Radio",
|
|
13
15
|
"RadioGroup",
|
|
14
16
|
"Toggle",
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
"structure": [
|
|
22
24
|
"Fields in a single column. Two columns only for genuinely paired values, and they stack below the mobile breakpoint.",
|
|
23
25
|
"Each field carries its own label and, when invalid, its own errorMessage — the message sits with the control it is about.",
|
|
26
|
+
"Related fields that answer one question — an address, a pair of limits, a set of checkboxes — sit in a Fieldset, CheckboxGroup or RadioGroup, so the question is announced with each field and a group-level error has somewhere to live.",
|
|
24
27
|
"An error summary Alert above the form after a failed submit, listing each invalid field as a link to it.",
|
|
25
28
|
"A submit Button and a cancel Link or Button, in that reading order, at the end."
|
|
26
29
|
],
|
|
@@ -70,7 +73,23 @@
|
|
|
70
73
|
"label",
|
|
71
74
|
"name",
|
|
72
75
|
"value",
|
|
73
|
-
"onChange"
|
|
76
|
+
"onChange",
|
|
77
|
+
"isInvalid",
|
|
78
|
+
"errorMessage",
|
|
79
|
+
"isRequired"
|
|
80
|
+
],
|
|
81
|
+
"CheckboxGroup": [
|
|
82
|
+
"label",
|
|
83
|
+
"value",
|
|
84
|
+
"onChange",
|
|
85
|
+
"isInvalid",
|
|
86
|
+
"errorMessage",
|
|
87
|
+
"isRequired"
|
|
88
|
+
],
|
|
89
|
+
"Fieldset": [
|
|
90
|
+
"label",
|
|
91
|
+
"isInvalid",
|
|
92
|
+
"errorMessage"
|
|
74
93
|
],
|
|
75
94
|
"Checkbox": [
|
|
76
95
|
"isDisabled"
|
|
@@ -104,7 +123,8 @@
|
|
|
104
123
|
"a visible `label` on every field, or `aria-label` where the label is genuinely elsewhere",
|
|
105
124
|
"`isInvalid` alongside `errorMessage` — the message alone styles the field without announcing it as invalid",
|
|
106
125
|
"focus moved to the error summary after a failed submit",
|
|
107
|
-
"`isRequired` on required fields rather than an asterisk in the label text"
|
|
126
|
+
"`isRequired` on required fields rather than an asterisk in the label text",
|
|
127
|
+
"a group-level error on the CheckboxGroup, RadioGroup or Fieldset it is about — \"choose at least one\" belongs to the set, not to its first box"
|
|
108
128
|
],
|
|
109
129
|
"notes": [
|
|
110
130
|
"Validate on blur and on submit, not on every keystroke: an error that appears while the user is still typing the value is wrong more often than right."
|
|
@@ -131,6 +151,11 @@
|
|
|
131
151
|
"dont": "a Toggle inside a form that is submitted",
|
|
132
152
|
"do": "Checkbox",
|
|
133
153
|
"why": "a switch says the change already took effect"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"dont": "a row of Checkboxes under a heading, with the error in a paragraph beneath",
|
|
157
|
+
"do": "<CheckboxGroup label=\"…\" isRequired isInvalid errorMessage=\"…\">",
|
|
158
|
+
"why": "the heading is not announced with the boxes and the error is attached to none of them"
|
|
134
159
|
}
|
|
135
160
|
]
|
|
136
161
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "ionbase-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.86.0",
|
|
4
4
|
"usage": "A pattern is a documented composition of components, not a component. Read one here, then read the contracts of what it composes.",
|
|
5
5
|
"patterns": {
|
|
6
6
|
"AgentRun": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"Button",
|
|
56
56
|
"Badge",
|
|
57
57
|
"Alert",
|
|
58
|
-
"
|
|
58
|
+
"SearchField",
|
|
59
59
|
"TagGroup"
|
|
60
60
|
],
|
|
61
61
|
"drivenBy": "useTableSort",
|
|
@@ -90,6 +90,8 @@
|
|
|
90
90
|
"Input",
|
|
91
91
|
"Select",
|
|
92
92
|
"Checkbox",
|
|
93
|
+
"CheckboxGroup",
|
|
94
|
+
"Fieldset",
|
|
93
95
|
"Radio",
|
|
94
96
|
"RadioGroup",
|
|
95
97
|
"Toggle",
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Fieldset — and CheckboxGroup and RadioGroup, which render the same shell.
|
|
3
|
+
*
|
|
4
|
+
* The type is Form Field's (`.ion-field`, input.css): the legend is its label,
|
|
5
|
+
* the helper its helper, the error the same recolour. A group of fields reads
|
|
6
|
+
* as one field with several controls, so it must not introduce a second label
|
|
7
|
+
* style for agents and designers to choose between.
|
|
8
|
+
*
|
|
9
|
+
* The fieldset stays `display: block`. A rendered <legend> is laid out in the
|
|
10
|
+
* fieldset's border, not as a flex item, so a flex column here would space
|
|
11
|
+
* everything except the gap under the legend. Spacing is margins on the legend
|
|
12
|
+
* and helper, and a flex wrapper around the fields themselves.
|
|
13
|
+
*
|
|
14
|
+
* Two spacings. A Fieldset of Inputs spaces them as a form does, 16; the
|
|
15
|
+
* choice groups space their options at 8, which is what RadioGroup has always
|
|
16
|
+
* used — options in a list, not fields in a form.
|
|
17
|
+
*/
|
|
18
|
+
.ion-fieldset {
|
|
19
|
+
--ion-fieldset-gap: var(--spacing-16);
|
|
20
|
+
--ion-fieldset-inline-gap: var(--spacing-16);
|
|
21
|
+
|
|
22
|
+
min-width: 0; /* a fieldset's default min-content width would stop wrapping */
|
|
23
|
+
margin: 0;
|
|
24
|
+
padding: 0;
|
|
25
|
+
border: none;
|
|
26
|
+
font-family: var(--font-family-sans);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.ion-fieldset--choices {
|
|
30
|
+
--ion-fieldset-gap: var(--spacing-8);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.ion-fieldset__legend {
|
|
34
|
+
/* Legend has default inline padding; the label beside an Input has none. */
|
|
35
|
+
padding: 0;
|
|
36
|
+
margin-bottom: var(--spacing-6);
|
|
37
|
+
color: var(--text-secondary);
|
|
38
|
+
font-size: var(--type-body-sm);
|
|
39
|
+
line-height: var(--type-body-sm-line-height);
|
|
40
|
+
font-weight: var(--font-weight-medium);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.ion-fieldset__content {
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-direction: column;
|
|
46
|
+
gap: var(--ion-fieldset-gap);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.ion-fieldset--horizontal .ion-fieldset__content {
|
|
50
|
+
flex-flow: row wrap;
|
|
51
|
+
column-gap: var(--ion-fieldset-inline-gap);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.ion-fieldset__helper {
|
|
55
|
+
display: block;
|
|
56
|
+
margin-top: var(--spacing-6);
|
|
57
|
+
color: var(--text-tertiary);
|
|
58
|
+
font-size: var(--type-body-sm);
|
|
59
|
+
line-height: var(--type-body-sm-line-height);
|
|
60
|
+
font-weight: var(--font-weight-regular);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.ion-fieldset--error .ion-fieldset__helper {
|
|
64
|
+
color: var(--text-error);
|
|
65
|
+
}
|
package/dist/styles/index.css
CHANGED
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
@import url('./select.css');
|
|
38
38
|
@import url('./checkbox.css');
|
|
39
39
|
@import url('./radio.css');
|
|
40
|
+
@import url('./fieldset.css');
|
|
40
41
|
@import url('./toggle.css');
|
|
41
42
|
@import url('./menu.css');
|
|
42
43
|
@import url('./avatar.css');
|
|
@@ -77,6 +78,7 @@
|
|
|
77
78
|
@import url('./prompt-input.css');
|
|
78
79
|
@import url('./tool-call.css');
|
|
79
80
|
@import url('./number-input.css');
|
|
81
|
+
@import url('./search-field.css');
|
|
80
82
|
@import url('./segmented-control.css');
|
|
81
83
|
@import url('./sidebar.css');
|
|
82
84
|
@import url('./file-upload.css');
|
package/dist/styles/radio.css
CHANGED
|
@@ -178,23 +178,3 @@
|
|
|
178
178
|
.ion-radio[data-disabled='true'] .ion-radio__label {
|
|
179
179
|
color: var(--text-disabled);
|
|
180
180
|
}
|
|
181
|
-
|
|
182
|
-
/* The group stacks its radios; Figma has no group component, so this is the
|
|
183
|
-
* minimum a fieldset needs rather than an invented layout. */
|
|
184
|
-
.ion-radio-group {
|
|
185
|
-
display: flex;
|
|
186
|
-
flex-direction: column;
|
|
187
|
-
gap: var(--spacing-8);
|
|
188
|
-
border: none;
|
|
189
|
-
margin: 0;
|
|
190
|
-
padding: 0;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
.ion-radio-group__label {
|
|
194
|
-
color: var(--text-secondary);
|
|
195
|
-
font-family: var(--font-family-sans);
|
|
196
|
-
font-size: var(--type-body-sm);
|
|
197
|
-
line-height: var(--type-body-sm-line-height);
|
|
198
|
-
font-weight: var(--font-weight-medium);
|
|
199
|
-
padding: 0;
|
|
200
|
-
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SearchField
|
|
3
|
+
*
|
|
4
|
+
* The box is `.ion-input` itself — the component renders Input's classes, so
|
|
5
|
+
* every size and state comes from input.css and cannot drift from it. This
|
|
6
|
+
* file owns only what Input does not have: the clear button, and silencing the
|
|
7
|
+
* browser's own.
|
|
8
|
+
*
|
|
9
|
+
* The clear button is (field height − 8px) square — 24 / 32 / 40 — like
|
|
10
|
+
* NumberInput's steps, so a Small field's target still meets WCAG 2.5.8.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/* Restates Input's surface at zero specificity, for the contrast gate — the
|
|
14
|
+
* same reason, and the same :where(), as number-input.css. */
|
|
15
|
+
:where(.ion-search-field) {
|
|
16
|
+
background-color: var(--surface-default);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.ion-search-field--clearable {
|
|
20
|
+
/* The button carries its own inset; full padding would double it. */
|
|
21
|
+
padding-inline-end: var(--spacing-4);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* `type="search"` gets a native cancel button in Chromium and Safari, drawn in
|
|
26
|
+
* the platform's style and sitting beside ours. Two clear buttons, one of them
|
|
27
|
+
* unlabelled and unstyled, is the bug this removes.
|
|
28
|
+
*/
|
|
29
|
+
.ion-search-field__field::-webkit-search-cancel-button,
|
|
30
|
+
.ion-search-field__field::-webkit-search-decoration {
|
|
31
|
+
display: none;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.ion-search-field__clear {
|
|
35
|
+
display: inline-flex;
|
|
36
|
+
flex: none;
|
|
37
|
+
align-items: center;
|
|
38
|
+
justify-content: center;
|
|
39
|
+
width: calc(var(--ion-input-height) - var(--spacing-8));
|
|
40
|
+
height: calc(var(--ion-input-height) - var(--spacing-8));
|
|
41
|
+
margin: 0;
|
|
42
|
+
padding: 0;
|
|
43
|
+
border: 0;
|
|
44
|
+
border-radius: var(--radius-sm);
|
|
45
|
+
background-color: transparent;
|
|
46
|
+
color: var(--icon-secondary);
|
|
47
|
+
cursor: pointer;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.ion-search-field__clear svg {
|
|
51
|
+
width: var(--ion-input-icon-size);
|
|
52
|
+
height: var(--ion-input-icon-size);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (hover: hover) {
|
|
56
|
+
.ion-search-field__clear:hover {
|
|
57
|
+
background-color: var(--surface-hover);
|
|
58
|
+
color: var(--icon-default);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.ion-search-field__clear:active {
|
|
63
|
+
background-color: var(--surface-pressed);
|
|
64
|
+
color: var(--icon-default);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.ion-search-field__clear:focus-visible {
|
|
68
|
+
outline: var(--border-width-thick) solid var(--border-focus);
|
|
69
|
+
outline-offset: calc(-1 * var(--border-width-thick));
|
|
70
|
+
}
|
package/llms.txt
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> IonBase is a React design system for enterprise SaaS, built to be consumed by an agent rather than read by a developer. Every component ships a machine-readable contract carrying the judgement a type signature cannot: when to use it, what to use instead, the anti-patterns, and what it guarantees for accessibility versus what it requires of you.
|
|
4
4
|
|
|
5
|
-
Version 0.
|
|
5
|
+
Version 0.86.0. 87 components.
|
|
6
6
|
|
|
7
7
|
## Read these, in this order
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@ Both are importable: `ionbase-ui/meta/index` and `ionbase-ui/meta/<Name>.json`.
|
|
|
13
13
|
|
|
14
14
|
## Components
|
|
15
15
|
|
|
16
|
-
`Accordion`, `AccordionItem`, `AgentActivity`, `AgentActivityStep`, `AgentStop`, `Alert`, `ApprovalGate`, `Avatar`, `AvatarGradient`, `AvatarGroup`, `Badge`, `Breadcrumb`, `BreadcrumbItem`, `Button`, `Card`, `ChartLegend`, `ChartTooltip`, `Checkbox`, `Citation`, `CitationList`, `CitationListItem`, `Combobox`, `CommandPalette`, `ConfidenceIndicator`, `DatePicker`, `DateRangePicker`, `Divider`, `Drawer`, `EmptyState`, `FileUpload`, `FullCard`, `Header`, `Icon`, `Input`, `Kbd`, `Link`, `Logo`, `LogoMark`, `Menu`, `MenuItem`, `MenuSection`, `MenuTrigger`, `Modal`, `NavItem`, `NumberInput`, `PageHeader`, `Pagination`, `PhoneInput`, `Popover`, `ProgressBar`, `PromptInput`, `Radio`, `RadioGroup`, `ScrollProgress`, `SegmentedControl`, `SegmentedControlItem`, `Select`, `SettingRow`, `Sidebar`, `SidebarItem`, `SidebarSection`, `Skeleton`, `Spinner`, `StatGroup`, `StatTile`, `Stepper`, `StepperStep`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Tag`, `TagGroup`, `Textarea`, `TimeField`, `Toast`, `ToastProvider`, `Toggle`, `ToolCall`, `Tooltip`
|
|
16
|
+
`Accordion`, `AccordionItem`, `AgentActivity`, `AgentActivityStep`, `AgentStop`, `Alert`, `ApprovalGate`, `Avatar`, `AvatarGradient`, `AvatarGroup`, `Badge`, `Breadcrumb`, `BreadcrumbItem`, `Button`, `Card`, `ChartLegend`, `ChartTooltip`, `Checkbox`, `CheckboxGroup`, `Citation`, `CitationList`, `CitationListItem`, `Combobox`, `CommandPalette`, `ConfidenceIndicator`, `DatePicker`, `DateRangePicker`, `Divider`, `Drawer`, `EmptyState`, `Fieldset`, `FileUpload`, `FullCard`, `Header`, `Icon`, `Input`, `Kbd`, `Link`, `Logo`, `LogoMark`, `Menu`, `MenuItem`, `MenuSection`, `MenuTrigger`, `Modal`, `NavItem`, `NumberInput`, `PageHeader`, `Pagination`, `PhoneInput`, `Popover`, `ProgressBar`, `PromptInput`, `Radio`, `RadioGroup`, `ScrollProgress`, `SearchField`, `SegmentedControl`, `SegmentedControlItem`, `Select`, `SettingRow`, `Sidebar`, `SidebarItem`, `SidebarSection`, `Skeleton`, `Spinner`, `StatGroup`, `StatTile`, `Stepper`, `StepperStep`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Tag`, `TagGroup`, `Textarea`, `TimeField`, `Toast`, `ToastProvider`, `Toggle`, `ToolCall`, `Tooltip`
|
|
17
17
|
|
|
18
18
|
## Patterns
|
|
19
19
|
|