ionbase-ui 0.47.0 → 0.48.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "ionbase-ui",
3
- "version": "0.47.0",
3
+ "version": "0.48.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": {
@@ -43,6 +43,7 @@
43
43
  @import url('./header.css');
44
44
  @import url('./logo.css');
45
45
  @import url('./table.css');
46
+ @import url('./pagination.css');
46
47
  @import url('./divider.css');
47
48
  @import url('./link.css');
48
49
  @import url('./modal.css');
@@ -0,0 +1,170 @@
1
+ /*
2
+ * Pagination
3
+ *
4
+ * Geometry measured from Figma `Pagination Item` (1283:289) and `Pagination`
5
+ * (1291:503), designed 5 Sep 2026. Two Figma sets, one exported component: the
6
+ * item is an internal part, not something a caller composes, so it is not in
7
+ * the public API. See the `unmapped` note in figma/mapping.json.
8
+ *
9
+ * Size is a set of slots defaulting to medium — the same shape tabs.css uses.
10
+ * A size modifier reassigns five variables rather than restating five rules,
11
+ * which is why the item, the icon and the summary all resize from one class.
12
+ *
13
+ * sm 32 type/body-sm icon 14
14
+ * md 40 type/body icon 20
15
+ * lg 48 type/body-lg icon 24
16
+ *
17
+ * THE CELL IS NOT A FIXED SQUARE, AND FIGMA'S IS.
18
+ *
19
+ * Figma binds width AND height to the same spacing token, because a Figma
20
+ * variant has to pick a number and `1` is what fits in the frame. A real pager
21
+ * reaches three and four digits, and a fixed 40px box either clips `1024` or
22
+ * pads every single-digit cell to fit the widest one that might occur. So the
23
+ * height is the token and the width is a MINIMUM — the cell is square until the
24
+ * number outgrows it, then it grows. Do not "fix" this back to a square to
25
+ * match the Figma frame; the frame is the constraint, not the intent.
26
+ */
27
+
28
+ .ion-pagination {
29
+ --ion-pagination-box: var(--spacing-40);
30
+ --ion-pagination-gap: var(--spacing-8);
31
+ --ion-pagination-font-size: var(--type-body);
32
+ --ion-pagination-line-height: var(--type-body-line-height);
33
+ --ion-pagination-icon: var(--icon-size-md);
34
+
35
+ display: flex;
36
+ align-items: center;
37
+ justify-content: space-between;
38
+ gap: var(--spacing-16);
39
+ }
40
+
41
+ .ion-pagination--sm {
42
+ --ion-pagination-box: var(--spacing-32);
43
+ --ion-pagination-gap: var(--spacing-6);
44
+ --ion-pagination-font-size: var(--type-body-sm);
45
+ --ion-pagination-line-height: var(--type-body-sm-line-height);
46
+ --ion-pagination-icon: var(--icon-size-xs);
47
+ }
48
+
49
+ .ion-pagination--lg {
50
+ --ion-pagination-box: var(--spacing-48);
51
+ --ion-pagination-font-size: var(--type-body-lg);
52
+ --ion-pagination-line-height: var(--type-body-lg-line-height);
53
+ --ion-pagination-icon: var(--icon-size-lg);
54
+ }
55
+
56
+ /*
57
+ * With no page-size slot there is nothing to sit opposite, and
58
+ * `space-between` would pin a lone control group to the left edge of whatever
59
+ * contains it. Ending the row is what the component means in that case.
60
+ */
61
+ .ion-pagination--no-page-size {
62
+ justify-content: flex-end;
63
+ }
64
+
65
+ .ion-pagination__page-size {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: var(--spacing-8);
69
+ }
70
+
71
+ .ion-pagination__controls {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: var(--spacing-4);
75
+ margin: 0;
76
+ padding: 0;
77
+ list-style: none;
78
+ }
79
+
80
+ /* The cell. A button for pages and arrows; a span for the ellipsis. */
81
+ .ion-pagination__item {
82
+ display: inline-flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ box-sizing: border-box;
86
+ min-width: var(--ion-pagination-box);
87
+ height: var(--ion-pagination-box);
88
+ padding: 0 var(--spacing-4);
89
+ border: 0;
90
+ border-radius: var(--radius-md);
91
+ background-color: transparent;
92
+ color: var(--text-tertiary);
93
+ font-family: var(--font-family-sans);
94
+ font-size: var(--ion-pagination-font-size);
95
+ line-height: var(--ion-pagination-line-height);
96
+ font-weight: var(--font-weight-medium);
97
+ cursor: pointer;
98
+ transition:
99
+ background-color var(--ion-duration-base) var(--ion-ease-out),
100
+ color var(--ion-duration-base) var(--ion-ease-out);
101
+ }
102
+
103
+ .ion-pagination__item[data-hovered] {
104
+ background-color: var(--surface-hover);
105
+ color: var(--text-default);
106
+ }
107
+
108
+ /*
109
+ * SELECTED IS `surface/selected`, NOT THE `surface/default` TABS USES.
110
+ *
111
+ * A Tabs pill sits on a `surface/muted` track, so `surface/default` reads as a
112
+ * raised chip against it. Pagination has no track: on a `surface/default` card
113
+ * the current page would be the same colour as the thing behind it, and the one
114
+ * cell that must be unmistakable would be the only invisible one.
115
+ */
116
+ .ion-pagination__item[data-selected] {
117
+ background-color: var(--surface-selected);
118
+ color: var(--text-default);
119
+ }
120
+
121
+ .ion-pagination__item[data-selected][data-hovered] {
122
+ background-color: var(--surface-selected-hover);
123
+ }
124
+
125
+ .ion-pagination__item[data-disabled] {
126
+ color: var(--text-disabled);
127
+ cursor: not-allowed;
128
+ }
129
+
130
+ .ion-pagination__item[data-focused] {
131
+ outline: var(--border-width-thick) solid var(--border-focus);
132
+ outline-offset: var(--spacing-2);
133
+ }
134
+
135
+ .ion-pagination__icon {
136
+ width: var(--ion-pagination-icon);
137
+ height: var(--ion-pagination-icon);
138
+ flex-shrink: 0;
139
+ }
140
+
141
+ /*
142
+ * The truncation marker. Not a button and not focusable — it is the absence of
143
+ * pages, and giving it a tab stop would put a control in the sequence that does
144
+ * nothing when activated. `aria-hidden` in the TSX keeps it out of the
145
+ * announcement too; the surrounding numbers already say what was skipped.
146
+ */
147
+ .ion-pagination__ellipsis {
148
+ display: inline-flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ min-width: var(--ion-pagination-box);
152
+ height: var(--ion-pagination-box);
153
+ color: var(--text-tertiary);
154
+ }
155
+
156
+ .ion-pagination__summary {
157
+ padding: 0 var(--spacing-8);
158
+ color: var(--text-secondary);
159
+ font-family: var(--font-family-sans);
160
+ font-size: var(--ion-pagination-font-size);
161
+ line-height: var(--ion-pagination-line-height);
162
+ font-weight: var(--font-weight-regular);
163
+ white-space: nowrap;
164
+ }
165
+
166
+ @media (prefers-reduced-motion: reduce) {
167
+ .ion-pagination__item {
168
+ transition: none;
169
+ }
170
+ }
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.47.0. 46 components.
5
+ Version 0.48.0. 47 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`, `PhoneInput`, `Popover`, `Radio`, `RadioGroup`, `ScrollProgress`, `Select`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Toast`, `ToastProvider`, `Toggle`, `Tooltip`
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`, `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.47.0",
3
+ "version": "0.48.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",