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.
Files changed (56) hide show
  1. package/dist/components/AgentActivity.d.ts +41 -0
  2. package/dist/components/AgentActivity.d.ts.map +1 -0
  3. package/dist/components/AgentActivity.js +84 -0
  4. package/dist/components/AgentActivity.js.map +1 -0
  5. package/dist/components/AgentStop.d.ts +58 -0
  6. package/dist/components/AgentStop.d.ts.map +1 -0
  7. package/dist/components/AgentStop.js +82 -0
  8. package/dist/components/AgentStop.js.map +1 -0
  9. package/dist/components/ApprovalGate.d.ts +72 -0
  10. package/dist/components/ApprovalGate.d.ts.map +1 -0
  11. package/dist/components/ApprovalGate.js +68 -0
  12. package/dist/components/ApprovalGate.js.map +1 -0
  13. package/dist/components/Citation.d.ts +51 -0
  14. package/dist/components/Citation.d.ts.map +1 -0
  15. package/dist/components/Citation.js +41 -0
  16. package/dist/components/Citation.js.map +1 -0
  17. package/dist/components/ConfidenceIndicator.d.ts +37 -0
  18. package/dist/components/ConfidenceIndicator.d.ts.map +1 -0
  19. package/dist/components/ConfidenceIndicator.js +41 -0
  20. package/dist/components/ConfidenceIndicator.js.map +1 -0
  21. package/dist/components/StreamingText.d.ts +47 -0
  22. package/dist/components/StreamingText.d.ts.map +1 -0
  23. package/dist/components/StreamingText.js +44 -0
  24. package/dist/components/StreamingText.js.map +1 -0
  25. package/dist/components/index.d.ts +12 -0
  26. package/dist/components/index.d.ts.map +1 -1
  27. package/dist/components/index.js +6 -0
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/figma-descriptions.json +147 -0
  30. package/dist/figma-map.json +3 -1
  31. package/dist/meta/AgentActivity.json +103 -0
  32. package/dist/meta/AgentActivityStep.json +117 -0
  33. package/dist/meta/AgentStop.json +164 -0
  34. package/dist/meta/ApprovalGate.json +255 -0
  35. package/dist/meta/Avatar.json +2 -2
  36. package/dist/meta/AvatarGroup.json +2 -2
  37. package/dist/meta/Citation.json +101 -0
  38. package/dist/meta/CitationList.json +94 -0
  39. package/dist/meta/CitationListItem.json +88 -0
  40. package/dist/meta/ConfidenceIndicator.json +115 -0
  41. package/dist/meta/Input.json +2 -2
  42. package/dist/meta/PhoneInput.json +38 -38
  43. package/dist/meta/StreamingText.json +99 -0
  44. package/dist/meta/components.json +2125 -989
  45. package/dist/meta/contrast.json +1086 -32
  46. package/dist/meta/index.json +100 -5
  47. package/dist/meta/patterns/index.json +1 -1
  48. package/dist/styles/agent-activity.css +95 -0
  49. package/dist/styles/agent-stop.css +109 -0
  50. package/dist/styles/approval-gate.css +181 -0
  51. package/dist/styles/citation.css +93 -0
  52. package/dist/styles/confidence-indicator.css +97 -0
  53. package/dist/styles/index.css +34 -0
  54. package/dist/styles/streaming-text.css +56 -0
  55. package/llms.txt +2 -2
  56. 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
+ }
@@ -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.22.0. 35 components.
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.22.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",