ionbase-ui 0.22.0 → 0.25.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/AgentActivity.d.ts +41 -0
- package/dist/components/AgentActivity.d.ts.map +1 -0
- package/dist/components/AgentActivity.js +84 -0
- package/dist/components/AgentActivity.js.map +1 -0
- package/dist/components/AgentStop.d.ts +58 -0
- package/dist/components/AgentStop.d.ts.map +1 -0
- package/dist/components/AgentStop.js +82 -0
- package/dist/components/AgentStop.js.map +1 -0
- package/dist/components/ApprovalGate.d.ts +72 -0
- package/dist/components/ApprovalGate.d.ts.map +1 -0
- package/dist/components/ApprovalGate.js +68 -0
- package/dist/components/ApprovalGate.js.map +1 -0
- package/dist/components/Citation.d.ts +51 -0
- package/dist/components/Citation.d.ts.map +1 -0
- package/dist/components/Citation.js +41 -0
- package/dist/components/Citation.js.map +1 -0
- package/dist/components/ConfidenceIndicator.d.ts +37 -0
- package/dist/components/ConfidenceIndicator.d.ts.map +1 -0
- package/dist/components/ConfidenceIndicator.js +41 -0
- package/dist/components/ConfidenceIndicator.js.map +1 -0
- package/dist/components/StreamingText.d.ts +47 -0
- package/dist/components/StreamingText.d.ts.map +1 -0
- package/dist/components/StreamingText.js +44 -0
- package/dist/components/StreamingText.js.map +1 -0
- package/dist/components/index.d.ts +12 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -0
- package/dist/components/index.js.map +1 -1
- package/dist/figma-descriptions.json +147 -0
- package/dist/figma-map.json +3 -1
- package/dist/meta/AgentActivity.json +103 -0
- package/dist/meta/AgentActivityStep.json +117 -0
- package/dist/meta/AgentStop.json +164 -0
- package/dist/meta/ApprovalGate.json +255 -0
- package/dist/meta/Avatar.json +2 -2
- package/dist/meta/AvatarGroup.json +2 -2
- package/dist/meta/Citation.json +101 -0
- package/dist/meta/CitationList.json +94 -0
- package/dist/meta/CitationListItem.json +88 -0
- package/dist/meta/ConfidenceIndicator.json +115 -0
- package/dist/meta/Input.json +2 -2
- package/dist/meta/PhoneInput.json +38 -38
- package/dist/meta/StreamingText.json +99 -0
- package/dist/meta/components.json +2125 -989
- package/dist/meta/contrast.json +1086 -32
- package/dist/meta/index.json +100 -5
- package/dist/meta/patterns/index.json +1 -1
- package/dist/styles/agent-activity.css +95 -0
- package/dist/styles/agent-stop.css +109 -0
- package/dist/styles/approval-gate.css +181 -0
- package/dist/styles/citation.css +93 -0
- package/dist/styles/confidence-indicator.css +97 -0
- package/dist/styles/index.css +34 -0
- package/dist/styles/streaming-text.css +56 -0
- package/llms.txt +2 -2
- package/package.json +4 -3
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ConfidenceIndicator
|
|
3
|
+
*
|
|
4
|
+
* NOT DRAWN IN FIGMA. Three bars and a line of text; the colours are the
|
|
5
|
+
* system's status roles.
|
|
6
|
+
*
|
|
7
|
+
* THE BARS ARE THE SECOND SIGNAL, NOT THE FIRST. The count of filled bars
|
|
8
|
+
* carries the level, so it reads in greyscale and in forced-colours mode; the
|
|
9
|
+
* colour only reinforces it. The label spells the level out regardless, which
|
|
10
|
+
* is what makes the meter safe to look at quickly.
|
|
11
|
+
*/
|
|
12
|
+
.ion-confidence {
|
|
13
|
+
display: inline-flex;
|
|
14
|
+
align-items: baseline;
|
|
15
|
+
gap: var(--spacing-8);
|
|
16
|
+
font-family: var(--font-family-sans);
|
|
17
|
+
font-size: var(--type-caption);
|
|
18
|
+
line-height: var(--type-caption-line-height);
|
|
19
|
+
color: var(--text-secondary);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.ion-confidence__meter {
|
|
23
|
+
display: inline-flex;
|
|
24
|
+
align-items: flex-end;
|
|
25
|
+
gap: var(--spacing-2);
|
|
26
|
+
|
|
27
|
+
/* Baseline-aligned with the label rather than centred, so the meter sits on
|
|
28
|
+
* the text's baseline the way a small-caps run would. */
|
|
29
|
+
align-self: center;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
* EVERY bar is outlined; only the filled ones take a colour.
|
|
34
|
+
*
|
|
35
|
+
* The first draft used `surface/muted` as the empty bar's fill, which measures
|
|
36
|
+
* 1.05:1 against `surface/page` — invisible. That breaks the reading the meter
|
|
37
|
+
* depends on: "one bar filled of three" collapses into "one bar", and the level
|
|
38
|
+
* can no longer be judged without reading the label. Found by computing the
|
|
39
|
+
* pairing the contrast gate does not model, since these spans hold no text.
|
|
40
|
+
*
|
|
41
|
+
* `icon/tertiary` is 7.09:1 against the page and 7.56:1 against a card, so the
|
|
42
|
+
* empty bars are legible on both surfaces. This is also the same construction
|
|
43
|
+
* the forced-colours block below uses, so the two no longer diverge.
|
|
44
|
+
*/
|
|
45
|
+
.ion-confidence__bar {
|
|
46
|
+
width: var(--spacing-4);
|
|
47
|
+
height: var(--spacing-8);
|
|
48
|
+
border: var(--border-width-default) solid var(--icon-tertiary);
|
|
49
|
+
border-radius: var(--radius-2xs);
|
|
50
|
+
background-color: transparent;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.ion-confidence__bar:nth-child(2) {
|
|
54
|
+
height: var(--spacing-12);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.ion-confidence__bar:nth-child(3) {
|
|
58
|
+
height: var(--spacing-16);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.ion-confidence--low .ion-confidence__bar--on {
|
|
62
|
+
border-color: var(--icon-warning);
|
|
63
|
+
background-color: var(--icon-warning);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.ion-confidence--medium .ion-confidence__bar--on {
|
|
67
|
+
border-color: var(--icon-information);
|
|
68
|
+
background-color: var(--icon-information);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.ion-confidence--high .ion-confidence__bar--on {
|
|
72
|
+
border-color: var(--icon-success);
|
|
73
|
+
background-color: var(--icon-success);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.ion-confidence__label {
|
|
77
|
+
color: var(--text-default);
|
|
78
|
+
font-weight: var(--font-weight-medium);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.ion-confidence__basis {
|
|
82
|
+
color: var(--text-tertiary);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@media (forced-colors: active) {
|
|
86
|
+
/* Colour is remapped away entirely here, so the filled bars must still be
|
|
87
|
+
* distinguishable from the empty ones by fill rather than hue. */
|
|
88
|
+
.ion-confidence__bar {
|
|
89
|
+
forced-color-adjust: none;
|
|
90
|
+
background-color: Canvas;
|
|
91
|
+
border: var(--border-width-default) solid CanvasText;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.ion-confidence__bar--on {
|
|
95
|
+
background-color: CanvasText;
|
|
96
|
+
}
|
|
97
|
+
}
|
package/dist/styles/index.css
CHANGED
|
@@ -52,6 +52,40 @@
|
|
|
52
52
|
@import url('./scroll-progress.css');
|
|
53
53
|
@import url('./full-card.css');
|
|
54
54
|
|
|
55
|
+
/*
|
|
56
|
+
* The agentic tier. No Figma counterpart yet, so these borrow their
|
|
57
|
+
* measurements from Button and Alert rather than inventing any — see the
|
|
58
|
+
* header of each file.
|
|
59
|
+
*/
|
|
60
|
+
@import url('./agent-stop.css');
|
|
61
|
+
@import url('./approval-gate.css');
|
|
62
|
+
@import url('./agent-activity.css');
|
|
63
|
+
@import url('./streaming-text.css');
|
|
64
|
+
@import url('./citation.css');
|
|
65
|
+
@import url('./confidence-indicator.css');
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* Visually hidden, but not hidden from assistive tech.
|
|
69
|
+
*
|
|
70
|
+
* Written once here rather than per component: two components already needed
|
|
71
|
+
* it for their live regions, and a second copy of a rule this fiddly is how the
|
|
72
|
+
* two quietly diverge. `display: none` and `visibility: hidden` both remove the
|
|
73
|
+
* node from the accessibility tree, so an announcement placed in one would
|
|
74
|
+
* never be made — the clip-path is what keeps it readable while occupying no
|
|
75
|
+
* space. No `margin: -1px`: that belongs to the older `clip: rect()` variant
|
|
76
|
+
* and is not needed here, which is convenient, because it is also not a token.
|
|
77
|
+
*/
|
|
78
|
+
.ion-visually-hidden {
|
|
79
|
+
position: absolute;
|
|
80
|
+
width: 1px;
|
|
81
|
+
height: 1px;
|
|
82
|
+
padding: 0;
|
|
83
|
+
overflow: hidden;
|
|
84
|
+
clip-path: inset(50%);
|
|
85
|
+
white-space: nowrap;
|
|
86
|
+
border: 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
55
89
|
/*
|
|
56
90
|
* Every IonBase element is border-box.
|
|
57
91
|
*
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* StreamingText
|
|
3
|
+
*
|
|
4
|
+
* NOT DRAWN IN FIGMA. Type and rhythm come from the body tokens, so this is
|
|
5
|
+
* ordinary prose that happens to be arriving late.
|
|
6
|
+
*/
|
|
7
|
+
.ion-streaming-text {
|
|
8
|
+
color: var(--text-default);
|
|
9
|
+
font-family: var(--font-family-sans);
|
|
10
|
+
font-size: var(--type-body);
|
|
11
|
+
line-height: var(--type-body-line-height);
|
|
12
|
+
white-space: pre-wrap;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* Reserve the height rather than growing into it. `lh` is the line box of THIS
|
|
17
|
+
* element, so the reserved space tracks the font size instead of a guessed
|
|
18
|
+
* pixel value — which is what makes it hold at any zoom level.
|
|
19
|
+
*/
|
|
20
|
+
.ion-streaming-text--reserved {
|
|
21
|
+
min-height: calc(var(--ion-streaming-min-lines, 3) * 1lh);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* The cursor is a box, not a text character: a literal "▌" is read aloud by
|
|
26
|
+
* some screen readers even inside an aria-hidden span, and it inherits font
|
|
27
|
+
* metrics that differ per family.
|
|
28
|
+
*/
|
|
29
|
+
.ion-streaming-text__cursor {
|
|
30
|
+
display: inline-block;
|
|
31
|
+
width: 0.5em;
|
|
32
|
+
height: 1em;
|
|
33
|
+
margin-inline-start: 0.1em;
|
|
34
|
+
vertical-align: text-bottom;
|
|
35
|
+
background-color: var(--text-tertiary);
|
|
36
|
+
animation: ion-streaming-blink 1s step-end infinite;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@keyframes ion-streaming-blink {
|
|
40
|
+
50% {
|
|
41
|
+
opacity: 0;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/*
|
|
46
|
+
* Blinking is a WCAG 2.3.1 concern and a real problem for some vestibular and
|
|
47
|
+
* attention conditions. The global reduced-motion block in index.css collapses
|
|
48
|
+
* the duration, which would leave the cursor stuck mid-blink — so pin it
|
|
49
|
+
* visible here instead of merely stopping the animation.
|
|
50
|
+
*/
|
|
51
|
+
@media (prefers-reduced-motion: reduce) {
|
|
52
|
+
.ion-streaming-text__cursor {
|
|
53
|
+
animation: none;
|
|
54
|
+
opacity: 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
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.25.0. 44 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
|
-
`Alert`, `Avatar`, `AvatarGroup`, `Badge`, `Button`, `Checkbox`, `Divider`, `FullCard`, `Header`, `Icon`, `Input`, `Link`, `Logo`, `LogoMark`, `Menu`, `MenuItem`, `Modal`, `NavItem`, `PhoneInput`, `Popover`, `Radio`, `RadioGroup`, `ScrollProgress`, `Select`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Toast`, `ToastProvider`, `Toggle`, `Tooltip`
|
|
16
|
+
`AgentActivity`, `AgentActivityStep`, `AgentStop`, `Alert`, `ApprovalGate`, `Avatar`, `AvatarGroup`, `Badge`, `Button`, `Checkbox`, `Citation`, `CitationList`, `CitationListItem`, `ConfidenceIndicator`, `Divider`, `FullCard`, `Header`, `Icon`, `Input`, `Link`, `Logo`, `LogoMark`, `Menu`, `MenuItem`, `Modal`, `NavItem`, `PhoneInput`, `Popover`, `Radio`, `RadioGroup`, `ScrollProgress`, `Select`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Toast`, `ToastProvider`, `Toggle`, `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.25.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",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"dev": "tsc --watch",
|
|
65
|
-
"build": "node scripts/sync-tokens.mjs && tsc --build --force && node scripts/copy-css.mjs && node scripts/verify-client-boundaries.mjs && node scripts/verify-contrast.mjs && node scripts/build-meta.mjs && node scripts/verify-meta.mjs && node scripts/build-patterns.mjs && node scripts/verify-figma-map.mjs && node scripts/build-llms.mjs",
|
|
65
|
+
"build": "node scripts/sync-tokens.mjs && tsc --build --force && node scripts/copy-css.mjs && node scripts/verify-client-boundaries.mjs && node scripts/verify-contrast.mjs && node scripts/build-meta.mjs && node scripts/verify-meta.mjs && node scripts/build-patterns.mjs && node scripts/verify-figma-map.mjs && node scripts/build-figma-descriptions.mjs && node scripts/build-llms.mjs",
|
|
66
66
|
"typecheck": "tsc --noEmit",
|
|
67
67
|
"lint": "eslint . && stylelint \"src/styles/*.css\"",
|
|
68
68
|
"format": "prettier --check .",
|
|
@@ -73,7 +73,8 @@
|
|
|
73
73
|
"contrast:list": "node scripts/verify-contrast.mjs --list",
|
|
74
74
|
"llms": "node scripts/build-llms.mjs",
|
|
75
75
|
"patterns": "node scripts/build-patterns.mjs",
|
|
76
|
-
"figma:map": "node scripts/verify-figma-map.mjs"
|
|
76
|
+
"figma:map": "node scripts/verify-figma-map.mjs",
|
|
77
|
+
"figma:descriptions": "node scripts/build-figma-descriptions.mjs"
|
|
77
78
|
},
|
|
78
79
|
"peerDependencies": {
|
|
79
80
|
"react": "^18.0.0 || ^19.0.0",
|