ionbase-ui 0.51.0 → 0.69.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/Accordion.d.ts +54 -0
- package/dist/components/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion.js +68 -0
- package/dist/components/Accordion.js.map +1 -0
- package/dist/components/AgentActivity.d.ts +2 -1
- package/dist/components/AgentActivity.d.ts.map +1 -1
- package/dist/components/AgentActivity.js +4 -17
- package/dist/components/AgentActivity.js.map +1 -1
- package/dist/components/Breadcrumb.d.ts +45 -0
- package/dist/components/Breadcrumb.d.ts.map +1 -0
- package/dist/components/Breadcrumb.js +31 -0
- package/dist/components/Breadcrumb.js.map +1 -0
- package/dist/components/Calendar.d.ts +20 -0
- package/dist/components/Calendar.d.ts.map +1 -0
- package/dist/components/Calendar.js +151 -0
- package/dist/components/Calendar.js.map +1 -0
- package/dist/components/CalendarPopover.d.ts +26 -0
- package/dist/components/CalendarPopover.d.ts.map +1 -0
- package/dist/components/CalendarPopover.js +45 -0
- package/dist/components/CalendarPopover.js.map +1 -0
- package/dist/components/Checkbox.d.ts +2 -1
- package/dist/components/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox.js +4 -2
- package/dist/components/Checkbox.js.map +1 -1
- package/dist/components/Combobox.d.ts +86 -0
- package/dist/components/Combobox.d.ts.map +1 -0
- package/dist/components/Combobox.js +261 -0
- package/dist/components/Combobox.js.map +1 -0
- package/dist/components/DateField.d.ts +15 -0
- package/dist/components/DateField.d.ts.map +1 -0
- package/dist/components/DateField.js +74 -0
- package/dist/components/DateField.js.map +1 -0
- package/dist/components/DatePicker.d.ts +81 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +102 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DateRangePicker.d.ts +117 -0
- package/dist/components/DateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker.js +152 -0
- package/dist/components/DateRangePicker.js.map +1 -0
- package/dist/components/Drawer.d.ts +52 -0
- package/dist/components/Drawer.d.ts.map +1 -0
- package/dist/components/Drawer.js +66 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/FileUpload.d.ts +79 -0
- package/dist/components/FileUpload.d.ts.map +1 -0
- package/dist/components/FileUpload.js +218 -0
- package/dist/components/FileUpload.js.map +1 -0
- package/dist/components/Header.d.ts +10 -0
- package/dist/components/Header.d.ts.map +1 -1
- package/dist/components/Header.js +18 -3
- package/dist/components/Header.js.map +1 -1
- package/dist/components/NumberInput.d.ts +63 -0
- package/dist/components/NumberInput.d.ts.map +1 -0
- package/dist/components/NumberInput.js +102 -0
- package/dist/components/NumberInput.js.map +1 -0
- package/dist/components/ProgressBar.d.ts +46 -0
- package/dist/components/ProgressBar.d.ts.map +1 -0
- package/dist/components/ProgressBar.js +52 -0
- package/dist/components/ProgressBar.js.map +1 -0
- package/dist/components/PromptInput.d.ts +89 -0
- package/dist/components/PromptInput.d.ts.map +1 -0
- package/dist/components/PromptInput.js +130 -0
- package/dist/components/PromptInput.js.map +1 -0
- package/dist/components/SegmentedControl.d.ts +63 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +79 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/Select.d.ts +9 -2
- package/dist/components/Select.d.ts.map +1 -1
- package/dist/components/Select.js.map +1 -1
- package/dist/components/Sidebar.d.ts +109 -0
- package/dist/components/Sidebar.d.ts.map +1 -0
- package/dist/components/Sidebar.js +106 -0
- package/dist/components/Sidebar.js.map +1 -0
- package/dist/components/Skeleton.d.ts +39 -0
- package/dist/components/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton.js +50 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/Spinner.d.ts +45 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +44 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/Stepper.d.ts +73 -0
- package/dist/components/Stepper.d.ts.map +1 -0
- package/dist/components/Stepper.js +82 -0
- package/dist/components/Stepper.js.map +1 -0
- package/dist/components/Toggle.d.ts +2 -1
- package/dist/components/Toggle.d.ts.map +1 -1
- package/dist/components/Toggle.js +4 -2
- package/dist/components/Toggle.js.map +1 -1
- package/dist/components/ToolCall.d.ts +66 -0
- package/dist/components/ToolCall.d.ts.map +1 -0
- package/dist/components/ToolCall.js +78 -0
- package/dist/components/ToolCall.js.map +1 -0
- package/dist/components/agent-status.d.ts +14 -0
- package/dist/components/agent-status.d.ts.map +1 -0
- package/dist/components/agent-status.js +16 -0
- package/dist/components/agent-status.js.map +1 -0
- package/dist/components/index.d.ts +33 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +16 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/iso-date.d.ts +53 -0
- package/dist/components/iso-date.d.ts.map +1 -0
- package/dist/components/iso-date.js +102 -0
- package/dist/components/iso-date.js.map +1 -0
- package/dist/components/resolve-selection.d.ts +36 -0
- package/dist/components/resolve-selection.d.ts.map +1 -0
- package/dist/components/resolve-selection.js +14 -0
- package/dist/components/resolve-selection.js.map +1 -0
- package/dist/figma-descriptions.json +255 -145
- package/dist/figma-map.json +3205 -1860
- package/dist/meta/Accordion.json +123 -0
- package/dist/meta/AccordionItem.json +90 -0
- package/dist/meta/AgentActivityStep.json +2 -2
- package/dist/meta/Breadcrumb.json +87 -0
- package/dist/meta/BreadcrumbItem.json +78 -0
- package/dist/meta/Checkbox.json +18 -1
- package/dist/meta/Combobox.json +265 -0
- package/dist/meta/DatePicker.json +270 -0
- package/dist/meta/DateRangePicker.json +284 -0
- package/dist/meta/Drawer.json +234 -0
- package/dist/meta/EmptyState.json +1 -1
- package/dist/meta/FileUpload.json +246 -0
- package/dist/meta/Header.json +32 -2
- package/dist/meta/NumberInput.json +407 -0
- package/dist/meta/PhoneInput.json +39 -39
- package/dist/meta/Popover.json +3 -3
- package/dist/meta/ProgressBar.json +166 -0
- package/dist/meta/PromptInput.json +212 -0
- package/dist/meta/SegmentedControl.json +217 -0
- package/dist/meta/SegmentedControlItem.json +122 -0
- package/dist/meta/Select.json +4 -3
- package/dist/meta/Sidebar.json +150 -0
- package/dist/meta/SidebarItem.json +184 -0
- package/dist/meta/SidebarSection.json +131 -0
- package/dist/meta/Skeleton.json +120 -0
- package/dist/meta/Spinner.json +123 -0
- package/dist/meta/Stepper.json +135 -0
- package/dist/meta/StepperStep.json +148 -0
- package/dist/meta/Tabs.json +5 -0
- package/dist/meta/Toggle.json +18 -1
- package/dist/meta/ToolCall.json +192 -0
- package/dist/meta/Tooltip.json +3 -3
- package/dist/meta/components.json +6759 -2705
- package/dist/meta/contrast.json +11075 -3098
- package/dist/meta/index.json +266 -8
- package/dist/meta/patterns/AgentRun.json +27 -0
- package/dist/meta/patterns/Form.json +9 -0
- package/dist/meta/patterns/PageShell.json +43 -3
- package/dist/meta/patterns/Wizard.json +20 -1
- package/dist/meta/patterns/index.json +10 -1
- package/dist/styles/accordion.css +102 -0
- package/dist/styles/breadcrumb.css +72 -0
- package/dist/styles/combobox.css +154 -0
- package/dist/styles/date-picker.css +420 -0
- package/dist/styles/date-range-picker.css +280 -0
- package/dist/styles/drawer.css +181 -0
- package/dist/styles/empty-state.css +16 -4
- package/dist/styles/file-upload.css +236 -0
- package/dist/styles/header.css +26 -0
- package/dist/styles/index.css +23 -0
- package/dist/styles/number-input.css +83 -0
- package/dist/styles/progress-bar.css +107 -0
- package/dist/styles/prompt-input.css +127 -0
- package/dist/styles/segmented-control.css +182 -0
- package/dist/styles/sidebar.css +307 -0
- package/dist/styles/skeleton.css +76 -0
- package/dist/styles/spinner.css +70 -0
- package/dist/styles/stepper.css +250 -0
- package/dist/styles/tool-call.css +202 -0
- package/llms.txt +2 -2
- package/package.json +2 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Spinner
|
|
3
|
+
*
|
|
4
|
+
* One ring, one token per slot, sized off the icon ramp rather than a ramp of
|
|
5
|
+
* its own — a spinner is an icon-shaped thing and giving it private sizes is
|
|
6
|
+
* the `control/<size>/*` mistake recorded in AGENTS.md.
|
|
7
|
+
*/
|
|
8
|
+
.ion-spinner {
|
|
9
|
+
--ion-spinner-size: var(--icon-size-md);
|
|
10
|
+
--ion-spinner-track: var(--border-subtle);
|
|
11
|
+
--ion-spinner-head: var(--border-primary-strong);
|
|
12
|
+
|
|
13
|
+
display: inline-flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
gap: var(--spacing-8);
|
|
16
|
+
color: var(--text-secondary);
|
|
17
|
+
font-family: var(--font-family-sans);
|
|
18
|
+
font-size: var(--type-body-sm);
|
|
19
|
+
line-height: var(--type-body-sm-line-height);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.ion-spinner--sm {
|
|
23
|
+
--ion-spinner-size: var(--icon-size-sm);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.ion-spinner--lg {
|
|
27
|
+
--ion-spinner-size: var(--icon-size-lg);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/*
|
|
31
|
+
* The track is the full ring and the head is one quadrant of it, which is what
|
|
32
|
+
* makes rotation legible: a ring of uniform colour spinning looks static.
|
|
33
|
+
*/
|
|
34
|
+
.ion-spinner__ring {
|
|
35
|
+
box-sizing: border-box;
|
|
36
|
+
flex: none;
|
|
37
|
+
width: var(--ion-spinner-size);
|
|
38
|
+
height: var(--ion-spinner-size);
|
|
39
|
+
border: var(--border-width-thick) solid var(--ion-spinner-track);
|
|
40
|
+
border-top-color: var(--ion-spinner-head);
|
|
41
|
+
border-radius: var(--radius-full);
|
|
42
|
+
animation: ion-spinner-rotate var(--ion-duration-slow) var(--ion-ease-linear)
|
|
43
|
+
infinite;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@keyframes ion-spinner-rotate {
|
|
47
|
+
to {
|
|
48
|
+
transform: rotate(360deg);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* Slowed, not stopped. A stationary spinner is not a calmer spinner; it is
|
|
54
|
+
* indistinguishable from a hung one, and it removes the only signal a sighted
|
|
55
|
+
* user has that the wait is still live.
|
|
56
|
+
*/
|
|
57
|
+
@media (prefers-reduced-motion: reduce) {
|
|
58
|
+
.ion-spinner__ring {
|
|
59
|
+
animation-duration: 2400ms;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Forced colours throw the token palette away; the ring must still read as a
|
|
64
|
+
* ring, so the head keeps its contrast against the track. */
|
|
65
|
+
@media (forced-colors: active) {
|
|
66
|
+
.ion-spinner__ring {
|
|
67
|
+
border-color: GrayText;
|
|
68
|
+
border-top-color: CanvasText;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Stepper
|
|
3
|
+
*
|
|
4
|
+
* Drawn in Figma as `Stepper` (1391:431) and `Stepper Step` (1391:356), from
|
|
5
|
+
* this file. Built code-first, like Breadcrumb: the indicator is a circle at the
|
|
6
|
+
* `lg` icon rung, the label type is Breadcrumb's, and the colours are the primary
|
|
7
|
+
* and error roles every other status in the system uses.
|
|
8
|
+
*
|
|
9
|
+
* Status is never colour alone. `complete` draws a check and `error` an
|
|
10
|
+
* exclamation, and both carry their name as visually hidden text.
|
|
11
|
+
*
|
|
12
|
+
* Status and current are BEM modifiers, not `[data-*]` attributes, and that is
|
|
13
|
+
* load-bearing: the contrast gate keys contexts on `--modifier` classes. The
|
|
14
|
+
* first draft used `[data-status]`, and the filled current indicator and every
|
|
15
|
+
* error colour were silently unmeasured — no failure, no pass, just absent.
|
|
16
|
+
*/
|
|
17
|
+
.ion-stepper {
|
|
18
|
+
display: flex;
|
|
19
|
+
gap: var(--spacing-8);
|
|
20
|
+
margin: 0;
|
|
21
|
+
padding: 0;
|
|
22
|
+
list-style: none;
|
|
23
|
+
font-family: var(--font-family-sans);
|
|
24
|
+
font-size: var(--type-body-sm);
|
|
25
|
+
line-height: var(--type-body-sm-line-height);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Horizontal only: an inline-size container stops sizing to its content, which
|
|
30
|
+
* a vertical rail inside a flex parent needs to do.
|
|
31
|
+
*/
|
|
32
|
+
.ion-stepper--horizontal {
|
|
33
|
+
container-type: inline-size;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.ion-stepper--vertical {
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
gap: 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.ion-stepper__label {
|
|
42
|
+
font-weight: var(--font-weight-medium);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.ion-stepper__step {
|
|
46
|
+
position: relative;
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: var(--spacing-8);
|
|
50
|
+
min-width: 0;
|
|
51
|
+
color: var(--text-secondary);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.ion-stepper--vertical .ion-stepper__step {
|
|
55
|
+
align-items: flex-start;
|
|
56
|
+
padding-bottom: var(--spacing-24);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.ion-stepper--horizontal .ion-stepper__step {
|
|
60
|
+
flex: 1 1 0;
|
|
61
|
+
align-items: flex-start;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.ion-stepper--horizontal .ion-stepper__step:last-child {
|
|
65
|
+
flex: 0 0 auto;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.ion-stepper--vertical .ion-stepper__step:last-child {
|
|
69
|
+
padding-bottom: 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/*
|
|
73
|
+
* The connector. Drawn by CSS after every step but the last, so it is
|
|
74
|
+
* decoration that never enters the accessibility tree. It turns primary once
|
|
75
|
+
* the step before it is complete, which is the "how far have I got" reading.
|
|
76
|
+
*
|
|
77
|
+
* A border, not a background: the contrast gate reads `background-color` on a
|
|
78
|
+
* `::after` as the ground for the whole step, and measured the check glyph
|
|
79
|
+
* against its own connector at 1:1. It is a line, so it is drawn as one.
|
|
80
|
+
*/
|
|
81
|
+
.ion-stepper--horizontal .ion-stepper__step:not(:last-child)::after {
|
|
82
|
+
content: '';
|
|
83
|
+
flex: 1 1 var(--spacing-16);
|
|
84
|
+
min-width: var(--spacing-16);
|
|
85
|
+
|
|
86
|
+
/* Centred on the indicator, not on a step that may carry a description. */
|
|
87
|
+
margin-top: calc((var(--icon-size-lg) - var(--border-width-thick)) / 2);
|
|
88
|
+
border-top: var(--border-width-thick) solid var(--border-default);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.ion-stepper--vertical .ion-stepper__step:not(:last-child)::after {
|
|
92
|
+
content: '';
|
|
93
|
+
position: absolute;
|
|
94
|
+
top: calc(var(--icon-size-lg) + var(--spacing-4));
|
|
95
|
+
bottom: var(--spacing-4);
|
|
96
|
+
|
|
97
|
+
/* Centred under the indicator. */
|
|
98
|
+
left: calc((var(--icon-size-lg) - var(--border-width-thick)) / 2);
|
|
99
|
+
border-left: var(--border-width-thick) solid var(--border-default);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.ion-stepper__trigger {
|
|
103
|
+
display: inline-flex;
|
|
104
|
+
align-items: flex-start;
|
|
105
|
+
gap: var(--spacing-8);
|
|
106
|
+
min-width: 0;
|
|
107
|
+
margin: 0;
|
|
108
|
+
padding: 0;
|
|
109
|
+
border: 0;
|
|
110
|
+
border-radius: var(--radius-xs);
|
|
111
|
+
background: none;
|
|
112
|
+
color: inherit;
|
|
113
|
+
font: inherit;
|
|
114
|
+
text-align: start;
|
|
115
|
+
text-decoration: none;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
a.ion-stepper__trigger,
|
|
119
|
+
button.ion-stepper__trigger {
|
|
120
|
+
cursor: pointer;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
a.ion-stepper__trigger:focus-visible,
|
|
124
|
+
button.ion-stepper__trigger:focus-visible {
|
|
125
|
+
outline: var(--border-width-thick) solid var(--border-focus);
|
|
126
|
+
outline-offset: 2px;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
a.ion-stepper__trigger:hover .ion-stepper__label,
|
|
130
|
+
button.ion-stepper__trigger:hover .ion-stepper__label {
|
|
131
|
+
color: var(--text-default);
|
|
132
|
+
text-decoration: underline;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.ion-stepper__indicator {
|
|
136
|
+
display: inline-flex;
|
|
137
|
+
flex: none;
|
|
138
|
+
align-items: center;
|
|
139
|
+
justify-content: center;
|
|
140
|
+
width: var(--icon-size-lg);
|
|
141
|
+
height: var(--icon-size-lg);
|
|
142
|
+
border: var(--border-width-thick) solid var(--border-strong);
|
|
143
|
+
border-radius: var(--radius-full);
|
|
144
|
+
color: var(--text-secondary);
|
|
145
|
+
font-size: var(--type-caption);
|
|
146
|
+
font-weight: var(--font-weight-semibold);
|
|
147
|
+
line-height: var(--type-caption-line-height);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.ion-stepper__indicator svg {
|
|
151
|
+
width: var(--icon-size-sm);
|
|
152
|
+
height: var(--icon-size-sm);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.ion-stepper__text {
|
|
156
|
+
display: flex;
|
|
157
|
+
flex-direction: column;
|
|
158
|
+
gap: var(--spacing-2);
|
|
159
|
+
min-width: 0;
|
|
160
|
+
|
|
161
|
+
/* Aligns the label's first line with the 24px indicator. */
|
|
162
|
+
padding-top: var(--spacing-2);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.ion-stepper__description {
|
|
166
|
+
color: var(--text-tertiary);
|
|
167
|
+
font-size: var(--type-caption);
|
|
168
|
+
line-height: var(--type-caption-line-height);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* complete — a primary check in a primary ring, and a primary connector. */
|
|
172
|
+
.ion-stepper .ion-stepper__step--complete:not(:last-child)::after {
|
|
173
|
+
border-color: var(--border-primary);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.ion-stepper__step--complete .ion-stepper__indicator {
|
|
177
|
+
border-color: var(--border-primary);
|
|
178
|
+
color: var(--icon-primary);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* error — the same ring in error, with a different glyph. */
|
|
182
|
+
.ion-stepper__step--error {
|
|
183
|
+
color: var(--text-error);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.ion-stepper__step--error .ion-stepper__indicator {
|
|
187
|
+
border-color: var(--border-error);
|
|
188
|
+
color: var(--icon-error);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
* current — the one filled indicator on the row, so the position reads at a
|
|
193
|
+
* glance. The label goes to the strongest text colour for the same reason
|
|
194
|
+
* Breadcrumb's current crumb does.
|
|
195
|
+
*/
|
|
196
|
+
.ion-stepper__step--current {
|
|
197
|
+
color: var(--text-default);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.ion-stepper__step--current .ion-stepper__indicator {
|
|
201
|
+
border-color: var(--surface-primary);
|
|
202
|
+
background-color: var(--surface-primary);
|
|
203
|
+
color: var(--text-on-color);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.ion-stepper__step--current.ion-stepper__step--error {
|
|
207
|
+
color: var(--text-error);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.ion-stepper__step--current.ion-stepper__step--error .ion-stepper__indicator {
|
|
211
|
+
border-color: var(--surface-error);
|
|
212
|
+
background-color: var(--surface-error);
|
|
213
|
+
color: var(--text-on-color);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/*
|
|
217
|
+
* Narrow containers: a horizontal stepper keeps every indicator and only the
|
|
218
|
+
* current step's label. The other labels are hidden visually, NOT removed, so
|
|
219
|
+
* "Step 2 of 5: Shipping, Completed" is still read for each of them.
|
|
220
|
+
*/
|
|
221
|
+
@container (max-width: 40rem) {
|
|
222
|
+
.ion-stepper--horizontal .ion-stepper__step--current {
|
|
223
|
+
flex: 0 1 auto;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.ion-stepper--horizontal
|
|
227
|
+
.ion-stepper__step:not(.ion-stepper__step--current)
|
|
228
|
+
.ion-stepper__text {
|
|
229
|
+
position: absolute;
|
|
230
|
+
width: 1px;
|
|
231
|
+
height: 1px;
|
|
232
|
+
padding: 0;
|
|
233
|
+
overflow: hidden;
|
|
234
|
+
clip-path: inset(50%);
|
|
235
|
+
white-space: nowrap;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/*
|
|
240
|
+
* Forced colours throw the primary fill away, which would leave the current
|
|
241
|
+
* step looking like every other. A heavier ring survives, because width is
|
|
242
|
+
* not a colour. (Not `Highlight` + `forced-color-adjust: none`: the contrast
|
|
243
|
+
* gate flattens at-rules, and a system colour here replaced the real fill in
|
|
244
|
+
* its model, so the white-on-primary pairing silently went unmeasured.)
|
|
245
|
+
*/
|
|
246
|
+
@media (forced-colors: active) {
|
|
247
|
+
.ion-stepper__step--current .ion-stepper__indicator {
|
|
248
|
+
border-width: var(--border-width-thicker);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ToolCall
|
|
3
|
+
*
|
|
4
|
+
* Drawn in Figma as `Tool Call` (1392:391), from this file. The header row is AgentActivity's step one rung up —
|
|
5
|
+
* same glyphs, same status colours, read from the same module — and the
|
|
6
|
+
* disclosure chevron and its rotation are Accordion's. The error strip is
|
|
7
|
+
* Alert's subtle error pairing.
|
|
8
|
+
*
|
|
9
|
+
* The card surface is on the BLOCK, not an inner wrapper, so the contrast gate
|
|
10
|
+
* resolves the header's translucent `surface/hover` against a real ground.
|
|
11
|
+
* drawer.css records what happens otherwise: the pairing is skipped, silently.
|
|
12
|
+
*/
|
|
13
|
+
.ion-tool-call {
|
|
14
|
+
overflow: hidden;
|
|
15
|
+
border: var(--border-width-default) solid var(--border-subtle);
|
|
16
|
+
border-radius: var(--radius-md);
|
|
17
|
+
background-color: var(--surface-default);
|
|
18
|
+
color: var(--text-default);
|
|
19
|
+
font-family: var(--font-family-sans);
|
|
20
|
+
font-size: var(--type-body-sm);
|
|
21
|
+
line-height: var(--type-body-sm-line-height);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.ion-tool-call__header {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: var(--spacing-8);
|
|
28
|
+
width: 100%;
|
|
29
|
+
margin: 0;
|
|
30
|
+
padding: var(--spacing-8) var(--spacing-12);
|
|
31
|
+
border: 0;
|
|
32
|
+
background: none;
|
|
33
|
+
color: inherit;
|
|
34
|
+
font: inherit;
|
|
35
|
+
text-align: start;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
button.ion-tool-call__header {
|
|
39
|
+
cursor: pointer;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@media (hover: hover) {
|
|
43
|
+
/* The colour is restated so the contrast gate has a pair to measure; with
|
|
44
|
+
* the background alone the hover state was never checked. */
|
|
45
|
+
button.ion-tool-call__header:hover {
|
|
46
|
+
background-color: var(--surface-hover);
|
|
47
|
+
color: var(--text-default);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
button.ion-tool-call__header:focus-visible {
|
|
52
|
+
outline: var(--border-width-thick) solid var(--border-focus);
|
|
53
|
+
outline-offset: calc(-1 * var(--border-width-thick));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.ion-tool-call__glyph {
|
|
57
|
+
display: inline-flex;
|
|
58
|
+
flex: none;
|
|
59
|
+
width: var(--icon-size-sm);
|
|
60
|
+
height: var(--icon-size-sm);
|
|
61
|
+
color: var(--icon-tertiary);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.ion-tool-call__glyph svg,
|
|
65
|
+
.ion-tool-call__chevron svg {
|
|
66
|
+
width: 100%;
|
|
67
|
+
height: 100%;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.ion-tool-call__heading {
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-wrap: wrap;
|
|
73
|
+
align-items: baseline;
|
|
74
|
+
flex: 1 1 auto;
|
|
75
|
+
column-gap: var(--spacing-8);
|
|
76
|
+
min-width: 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.ion-tool-call__title {
|
|
80
|
+
font-weight: var(--font-weight-medium);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.ion-tool-call__name {
|
|
84
|
+
color: var(--text-tertiary);
|
|
85
|
+
font-family: var(--font-family-mono);
|
|
86
|
+
font-size: var(--type-caption);
|
|
87
|
+
line-height: var(--type-caption-line-height);
|
|
88
|
+
overflow-wrap: anywhere;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.ion-tool-call__duration {
|
|
92
|
+
flex: none;
|
|
93
|
+
color: var(--text-tertiary);
|
|
94
|
+
font-size: var(--type-caption);
|
|
95
|
+
line-height: var(--type-caption-line-height);
|
|
96
|
+
font-variant-numeric: tabular-nums;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.ion-tool-call__chevron {
|
|
100
|
+
display: inline-flex;
|
|
101
|
+
flex: none;
|
|
102
|
+
width: var(--icon-size-sm);
|
|
103
|
+
height: var(--icon-size-sm);
|
|
104
|
+
color: var(--icon-secondary);
|
|
105
|
+
transition: transform var(--ion-duration-base) var(--ion-ease-out);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.ion-tool-call--expanded .ion-tool-call__chevron {
|
|
109
|
+
transform: rotate(180deg);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/*
|
|
113
|
+
* Outside the disclosure on purpose: the failure is the one part of a call a
|
|
114
|
+
* reader must not have to click to find.
|
|
115
|
+
*/
|
|
116
|
+
.ion-tool-call__error {
|
|
117
|
+
padding: var(--spacing-8) var(--spacing-12);
|
|
118
|
+
border-top: var(--border-width-default) solid var(--border-error-subtle);
|
|
119
|
+
background-color: var(--surface-error-subtle);
|
|
120
|
+
color: var(--text-error);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.ion-tool-call__body {
|
|
124
|
+
display: flex;
|
|
125
|
+
flex-direction: column;
|
|
126
|
+
gap: var(--spacing-12);
|
|
127
|
+
padding: var(--spacing-12);
|
|
128
|
+
border-top: var(--border-width-default) solid var(--border-subtle);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.ion-tool-call__section {
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
gap: var(--spacing-4);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.ion-tool-call__label {
|
|
138
|
+
color: var(--text-secondary);
|
|
139
|
+
font-size: var(--type-caption);
|
|
140
|
+
line-height: var(--type-caption-line-height);
|
|
141
|
+
font-weight: var(--font-weight-medium);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* Wraps rather than scrolling sideways: a long string in a JSON value would
|
|
146
|
+
* otherwise force a horizontal scrollbar on a phone. Height is capped, and the
|
|
147
|
+
* element is focusable (tabIndex 0 in the component) so the cap never hides
|
|
148
|
+
* content from a keyboard user.
|
|
149
|
+
*/
|
|
150
|
+
.ion-tool-call__payload {
|
|
151
|
+
max-height: 16rem;
|
|
152
|
+
margin: 0;
|
|
153
|
+
padding: var(--spacing-8);
|
|
154
|
+
overflow: auto;
|
|
155
|
+
border-radius: var(--radius-sm);
|
|
156
|
+
background-color: var(--surface-muted);
|
|
157
|
+
color: var(--text-default);
|
|
158
|
+
font-family: var(--font-family-mono);
|
|
159
|
+
font-size: var(--type-caption);
|
|
160
|
+
line-height: var(--type-caption-line-height);
|
|
161
|
+
white-space: pre-wrap;
|
|
162
|
+
overflow-wrap: anywhere;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.ion-tool-call__payload:focus-visible {
|
|
166
|
+
outline: var(--border-width-thick) solid var(--border-focus);
|
|
167
|
+
outline-offset: 2px;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Status: the colour is the second signal — glyph shape and hidden text first. */
|
|
171
|
+
.ion-tool-call--active .ion-tool-call__glyph {
|
|
172
|
+
color: var(--icon-primary);
|
|
173
|
+
animation: ion-tool-call-spin 1.2s linear infinite;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.ion-tool-call--done .ion-tool-call__glyph {
|
|
177
|
+
color: var(--icon-success);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.ion-tool-call--failed .ion-tool-call__glyph {
|
|
181
|
+
color: var(--icon-error);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.ion-tool-call--skipped .ion-tool-call__title {
|
|
185
|
+
color: var(--text-tertiary);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@keyframes ion-tool-call-spin {
|
|
189
|
+
to {
|
|
190
|
+
transform: rotate(360deg);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
@media (prefers-reduced-motion: reduce) {
|
|
195
|
+
.ion-tool-call--active .ion-tool-call__glyph {
|
|
196
|
+
animation: none;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.ion-tool-call__chevron {
|
|
200
|
+
transition: none;
|
|
201
|
+
}
|
|
202
|
+
}
|
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.69.0. 70 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
|
-
`AgentActivity`, `AgentActivityStep`, `AgentStop`, `Alert`, `ApprovalGate`, `Avatar`, `AvatarGradient`, `AvatarGroup`, `Badge`, `Button`, `Checkbox`, `Citation`, `CitationList`, `CitationListItem`, `ConfidenceIndicator`, `Divider`, `EmptyState`, `FullCard`, `Header`, `Icon`, `Input`, `Link`, `Logo`, `LogoMark`, `Menu`, `MenuItem`, `Modal`, `NavItem`, `Pagination`, `PhoneInput`, `Popover`, `Radio`, `RadioGroup`, `ScrollProgress`, `Select`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Textarea`, `Toast`, `ToastProvider`, `Toggle`, `Tooltip`
|
|
16
|
+
`Accordion`, `AccordionItem`, `AgentActivity`, `AgentActivityStep`, `AgentStop`, `Alert`, `ApprovalGate`, `Avatar`, `AvatarGradient`, `AvatarGroup`, `Badge`, `Breadcrumb`, `BreadcrumbItem`, `Button`, `Checkbox`, `Citation`, `CitationList`, `CitationListItem`, `Combobox`, `ConfidenceIndicator`, `DatePicker`, `DateRangePicker`, `Divider`, `Drawer`, `EmptyState`, `FileUpload`, `FullCard`, `Header`, `Icon`, `Input`, `Link`, `Logo`, `LogoMark`, `Menu`, `MenuItem`, `Modal`, `NavItem`, `NumberInput`, `Pagination`, `PhoneInput`, `Popover`, `ProgressBar`, `PromptInput`, `Radio`, `RadioGroup`, `ScrollProgress`, `SegmentedControl`, `SegmentedControlItem`, `Select`, `Sidebar`, `SidebarItem`, `SidebarSection`, `Skeleton`, `Spinner`, `Stepper`, `StepperStep`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Textarea`, `Toast`, `ToastProvider`, `Toggle`, `ToolCall`, `Tooltip`
|
|
17
17
|
|
|
18
18
|
## Patterns
|
|
19
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ionbase-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.69.0",
|
|
4
4
|
"description": "IonBase Design System — accessible React components, styles and design tokens in one package",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -85,6 +85,7 @@
|
|
|
85
85
|
"eslint": "^8.57.0 || ^9.0.0"
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
+
"@internationalized/date": "^3.12.2",
|
|
88
89
|
"@react-stately/collections": "^3.13.1",
|
|
89
90
|
"@react-types/shared": "^3.36.0",
|
|
90
91
|
"react-aria": "^3.34.0",
|