ionbase-ui 0.76.0 → 0.81.1

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 (91) hide show
  1. package/dist/components/Card.d.ts +61 -0
  2. package/dist/components/Card.d.ts.map +1 -0
  3. package/dist/components/Card.js +37 -0
  4. package/dist/components/Card.js.map +1 -0
  5. package/dist/components/CommandPalette.d.ts +76 -0
  6. package/dist/components/CommandPalette.d.ts.map +1 -0
  7. package/dist/components/CommandPalette.js +194 -0
  8. package/dist/components/CommandPalette.js.map +1 -0
  9. package/dist/components/DateField.d.ts +14 -0
  10. package/dist/components/DateField.d.ts.map +1 -1
  11. package/dist/components/DateField.js +1 -1
  12. package/dist/components/DateField.js.map +1 -1
  13. package/dist/components/DatePicker.d.ts +1 -1
  14. package/dist/components/DatePicker.d.ts.map +1 -1
  15. package/dist/components/DatePicker.js +14 -6
  16. package/dist/components/DatePicker.js.map +1 -1
  17. package/dist/components/DateRangePicker.d.ts +1 -1
  18. package/dist/components/DateRangePicker.d.ts.map +1 -1
  19. package/dist/components/DateRangePicker.js +14 -6
  20. package/dist/components/DateRangePicker.js.map +1 -1
  21. package/dist/components/Kbd.d.ts +45 -0
  22. package/dist/components/Kbd.d.ts.map +1 -0
  23. package/dist/components/Kbd.js +45 -0
  24. package/dist/components/Kbd.js.map +1 -0
  25. package/dist/components/Table.d.ts +18 -0
  26. package/dist/components/Table.d.ts.map +1 -1
  27. package/dist/components/Table.js +14 -3
  28. package/dist/components/Table.js.map +1 -1
  29. package/dist/components/TagGroup.d.ts +51 -0
  30. package/dist/components/TagGroup.d.ts.map +1 -0
  31. package/dist/components/TagGroup.js +84 -0
  32. package/dist/components/TagGroup.js.map +1 -0
  33. package/dist/components/TimeField.d.ts +72 -0
  34. package/dist/components/TimeField.d.ts.map +1 -0
  35. package/dist/components/TimeField.js +102 -0
  36. package/dist/components/TimeField.js.map +1 -0
  37. package/dist/components/index.d.ts +14 -1
  38. package/dist/components/index.d.ts.map +1 -1
  39. package/dist/components/index.js +6 -0
  40. package/dist/components/index.js.map +1 -1
  41. package/dist/components/iso-time.d.ts +23 -0
  42. package/dist/components/iso-time.d.ts.map +1 -0
  43. package/dist/components/iso-time.js +34 -0
  44. package/dist/components/iso-time.js.map +1 -0
  45. package/dist/components/shortcut.d.ts +19 -0
  46. package/dist/components/shortcut.d.ts.map +1 -0
  47. package/dist/components/shortcut.js +122 -0
  48. package/dist/components/shortcut.js.map +1 -0
  49. package/dist/components/use-table-sort.d.ts +38 -0
  50. package/dist/components/use-table-sort.d.ts.map +1 -0
  51. package/dist/components/use-table-sort.js +33 -0
  52. package/dist/components/use-table-sort.js.map +1 -0
  53. package/dist/figma-descriptions.json +103 -68
  54. package/dist/figma-map.json +343 -2
  55. package/dist/meta/Card.json +153 -0
  56. package/dist/meta/Checkbox.json +2 -2
  57. package/dist/meta/CommandPalette.json +178 -0
  58. package/dist/meta/DatePicker.json +5 -4
  59. package/dist/meta/DateRangePicker.json +3 -2
  60. package/dist/meta/Kbd.json +97 -0
  61. package/dist/meta/Radio.json +2 -2
  62. package/dist/meta/RadioGroup.json +2 -2
  63. package/dist/meta/Table.json +4 -1
  64. package/dist/meta/TableBody.json +3 -0
  65. package/dist/meta/TableCell.json +49 -5
  66. package/dist/meta/TableHead.json +3 -0
  67. package/dist/meta/TableRow.json +3 -0
  68. package/dist/meta/Tag.json +54 -0
  69. package/dist/meta/TagGroup.json +211 -0
  70. package/dist/meta/TimeField.json +224 -0
  71. package/dist/meta/Toggle.json +2 -2
  72. package/dist/meta/components.json +1014 -38
  73. package/dist/meta/contrast.json +1133 -6
  74. package/dist/meta/index.json +86 -12
  75. package/dist/meta/patterns/DataTable.json +27 -3
  76. package/dist/meta/patterns/PageShell.json +15 -2
  77. package/dist/meta/patterns/index.json +7 -3
  78. package/dist/styles/agent-activity.css +4 -2
  79. package/dist/styles/approval-gate.css +4 -3
  80. package/dist/styles/card.css +75 -0
  81. package/dist/styles/citation.css +4 -2
  82. package/dist/styles/command-palette.css +250 -0
  83. package/dist/styles/confidence-indicator.css +2 -2
  84. package/dist/styles/index.css +5 -0
  85. package/dist/styles/kbd.css +47 -0
  86. package/dist/styles/streaming-text.css +3 -2
  87. package/dist/styles/table.css +51 -0
  88. package/dist/styles/tag-group.css +172 -0
  89. package/dist/styles/time-field.css +31 -0
  90. package/llms.txt +2 -2
  91. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  /*
2
2
  * ConfidenceIndicator
3
3
  *
4
- * NOT DRAWN IN FIGMA. Three bars and a line of text; the colours are the
5
- * system's status roles.
4
+ * Drawn in Figma as `Confidence Indicator` (1166:262), by Level. Three bars and
5
+ * a line of text; the colours are the system's status roles.
6
6
  *
7
7
  * THE BARS ARE THE SECOND SIGNAL, NOT THE FIRST. The count of filled bars
8
8
  * carries the level, so it reads in greyscale and in forced-colours mode; the
@@ -90,9 +90,14 @@
90
90
  */
91
91
  @import url('./date-picker.css');
92
92
  @import url('./date-range-picker.css');
93
+ @import url('./time-field.css');
93
94
  @import url('./stat-tile.css');
94
95
  @import url('./setting-row.css');
95
96
  @import url('./chart.css');
97
+ @import url('./card.css');
98
+ @import url('./tag-group.css');
99
+ @import url('./kbd.css');
100
+ @import url('./command-palette.css');
96
101
 
97
102
  /*
98
103
  * Visually hidden, but not hidden from assistive tech.
@@ -0,0 +1,47 @@
1
+ /*
2
+ * Kbd
3
+ *
4
+ * Drawn in Figma as `Kbd` on the Command Palette page.
5
+ *
6
+ * key 20 tall, at least 20 wide, 4 across; radius/xs
7
+ * colour surface/subtle key, border/default rule, text/secondary glyph
8
+ * type caption, medium — a key is read at a glance, not studied
9
+ *
10
+ * A shortcut is a group of keys 2 apart, never "⌘+K" with a printed plus:
11
+ * the keys are what the reader looks for on the keyboard, and the plus is not
12
+ * one of them.
13
+ *
14
+ * The key carries its own background, so the contrast gate measures the glyph
15
+ * against the key rather than whatever it sits on — a menu row, a hover.
16
+ */
17
+ .ion-kbd-group {
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: var(--spacing-2);
21
+ font: inherit;
22
+ }
23
+
24
+ .ion-kbd {
25
+ display: inline-flex;
26
+ align-items: center;
27
+ justify-content: center;
28
+ min-width: var(--spacing-20);
29
+ height: var(--spacing-20);
30
+ padding-inline: calc(var(--spacing-4) - var(--border-width-default));
31
+ border: var(--border-width-default) solid var(--border-default);
32
+ border-radius: var(--radius-xs);
33
+ background-color: var(--surface-subtle);
34
+ color: var(--text-secondary);
35
+ font-family: var(--font-family-sans);
36
+ font-size: var(--type-caption);
37
+ line-height: var(--type-caption-line-height);
38
+ font-weight: var(--font-weight-medium);
39
+ white-space: nowrap;
40
+ }
41
+
42
+ /* Forced colours drop the fill; the rule is what keeps each key a key. */
43
+ @media (forced-colors: active) {
44
+ .ion-kbd {
45
+ border-color: CanvasText;
46
+ }
47
+ }
@@ -1,8 +1,9 @@
1
1
  /*
2
2
  * StreamingText
3
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.
4
+ * Drawn in Figma as `Streaming Text` (1164:248), with a Streaming axis for the
5
+ * cursor. Type and rhythm come from the body tokens, so this is ordinary prose
6
+ * that happens to be arriving late.
6
7
  */
7
8
  .ion-streaming-text {
8
9
  color: var(--text-default);
@@ -187,6 +187,57 @@
187
187
  color: var(--icon-secondary);
188
188
  }
189
189
 
190
+ /*
191
+ * Sortable headers — `sortDirection` on a header TableCell, Figma's
192
+ * `Table Sort Indicator` in the Cell Text trailing slot.
193
+ *
194
+ * The label is a real button inside the <th>, reset to read as header text:
195
+ * same weight, same `text/secondary`, no chrome. It darkens to `text/default`
196
+ * on hover and when it is the sorted column, so the current sort reads from
197
+ * the label as well as the arrow. The unsorted indicator stays
198
+ * `icon/tertiary`: present enough to say "this sorts", quiet enough that a
199
+ * row of them is not noise.
200
+ */
201
+ .ion-table__sort {
202
+ margin: 0;
203
+ padding: 0;
204
+ border: 0;
205
+ border-radius: var(--radius-xs);
206
+ background: none;
207
+ color: inherit;
208
+ font: inherit;
209
+ text-align: inherit;
210
+
211
+ /* The arrow beside a two-line label reads as belonging to one line of it.
212
+ The table scrolls sideways before it squeezes a header this far. */
213
+ white-space: nowrap;
214
+ cursor: pointer;
215
+ transition: color var(--ion-duration-base) var(--ion-ease-out);
216
+ }
217
+
218
+ @media (hover: hover) {
219
+ .ion-table__sort:hover {
220
+ color: var(--text-default);
221
+ }
222
+ }
223
+
224
+ .ion-table__sort:focus-visible {
225
+ outline: var(--border-width-thick) solid var(--ring-focus);
226
+ outline-offset: 2px;
227
+ }
228
+
229
+ .ion-table__sort--active {
230
+ color: var(--text-default);
231
+ }
232
+
233
+ .ion-table th .ion-table__sort-icon {
234
+ color: var(--icon-tertiary);
235
+ }
236
+
237
+ .ion-table th .ion-table__sort--active .ion-table__sort-icon {
238
+ color: var(--icon-default);
239
+ }
240
+
190
241
  /* Link cells — Figma's `Type=Link`. */
191
242
  .ion-table__cell-content--link {
192
243
  color: var(--text-link);
@@ -0,0 +1,172 @@
1
+ /*
2
+ * TagGroup, Tag
3
+ *
4
+ * Drawn in Figma as `Tag` and `Tag Group` on the Tag page.
5
+ *
6
+ * tag surface/subtle fill, border/subtle rule, text/default label
7
+ * label inset 8 (sm) / 12 (md) from the tag's edge, 4 / 6 to the button
8
+ * height pinned — spacing/24 (sm), spacing/32 (md) — the way Badge
9
+ * pins its ramp, so padding never nudges it off by a pixel
10
+ * radius radius/sm at sm, radius/md at md
11
+ * remove button 16 / 20 square, icon/secondary, surface/hover under the
12
+ * pointer, its own focus ring
13
+ *
14
+ * NEUTRAL ON PURPOSE
15
+ *
16
+ * No intent colours. A tag is a choice someone made, not a state the system
17
+ * reports; a red "Status: Failing" filter would read as the agent failing.
18
+ * That is Badge's job, and Badge is not removable.
19
+ *
20
+ * The tag carries its own background, so the contrast gate measures the label
21
+ * against the tag rather than whatever the group sits on.
22
+ */
23
+ .ion-tag-group {
24
+ display: grid;
25
+ gap: var(--spacing-6);
26
+ min-width: 0;
27
+ font-family: var(--font-family-sans);
28
+ }
29
+
30
+ .ion-tag-group__label {
31
+ color: var(--text-secondary);
32
+ font-size: var(--type-body-sm);
33
+ line-height: var(--type-body-sm-line-height);
34
+ font-weight: var(--font-weight-medium);
35
+ }
36
+
37
+ .ion-tag-group__list {
38
+ display: flex;
39
+ flex-wrap: wrap;
40
+ gap: var(--spacing-6);
41
+ min-width: 0;
42
+ }
43
+
44
+ .ion-tag-group__list:focus-visible {
45
+ outline: var(--border-width-thick) solid var(--ring-focus);
46
+ outline-offset: 2px;
47
+ border-radius: var(--radius-xs);
48
+ }
49
+
50
+ .ion-tag-group__empty,
51
+ .ion-tag-group__description {
52
+ margin: 0;
53
+ color: var(--text-tertiary);
54
+ font-size: var(--type-body-sm);
55
+ line-height: var(--type-body-sm-line-height);
56
+ }
57
+
58
+ .ion-tag {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ max-width: 100%;
62
+ height: var(--spacing-24);
63
+ padding-inline: calc(var(--spacing-8) - var(--border-width-default));
64
+ border: var(--border-width-default) solid var(--border-subtle);
65
+ border-radius: var(--radius-sm);
66
+ background-color: var(--surface-subtle);
67
+ color: var(--text-default);
68
+ font-size: var(--type-body-sm);
69
+ line-height: var(--type-body-sm-line-height);
70
+ outline: none;
71
+ cursor: default;
72
+ }
73
+
74
+ /* The remove button sits closer to the edge than the label does. */
75
+ .ion-tag--removable {
76
+ padding-inline-end: calc(var(--spacing-4) - var(--border-width-default));
77
+ }
78
+
79
+ .ion-tag-group--md .ion-tag {
80
+ height: var(--spacing-32);
81
+ padding-inline: calc(var(--spacing-12) - var(--border-width-default));
82
+ border-radius: var(--radius-md);
83
+ font-size: var(--type-body);
84
+ line-height: var(--type-body-line-height);
85
+ }
86
+
87
+ .ion-tag-group--md .ion-tag--removable {
88
+ padding-inline-end: calc(var(--spacing-6) - var(--border-width-default));
89
+ }
90
+
91
+ .ion-tag[data-focus-visible='true'] {
92
+ outline: var(--border-width-thick) solid var(--ring-focus);
93
+ outline-offset: 2px;
94
+ }
95
+
96
+ .ion-tag--disabled {
97
+ border-color: var(--border-disabled);
98
+ background-color: var(--surface-disabled);
99
+ color: var(--text-disabled);
100
+ }
101
+
102
+ .ion-tag__cell {
103
+ display: inline-flex;
104
+ align-items: center;
105
+ gap: var(--spacing-4);
106
+ min-width: 0;
107
+ }
108
+
109
+ /* A long label ends in an ellipsis rather than stretching the row. */
110
+ .ion-tag__label {
111
+ overflow: hidden;
112
+ text-overflow: ellipsis;
113
+ white-space: nowrap;
114
+ }
115
+
116
+ .ion-tag__remove {
117
+ display: inline-flex;
118
+ flex-shrink: 0;
119
+ align-items: center;
120
+ justify-content: center;
121
+ width: var(--spacing-16);
122
+ height: var(--spacing-16);
123
+ margin: 0;
124
+ padding: 0;
125
+ border: 0;
126
+ border-radius: var(--radius-xs);
127
+ background: none;
128
+ color: var(--icon-secondary);
129
+ cursor: pointer;
130
+ transition:
131
+ background-color var(--ion-duration-base) var(--ion-ease-out),
132
+ color var(--ion-duration-base) var(--ion-ease-out);
133
+ }
134
+
135
+ /* Figma's Label Slot pads 4 / 6 on each side, which is the gap to the button. */
136
+ .ion-tag-group--md .ion-tag__cell {
137
+ gap: var(--spacing-6);
138
+ }
139
+
140
+ .ion-tag-group--md .ion-tag__remove {
141
+ width: var(--spacing-20);
142
+ height: var(--spacing-20);
143
+ }
144
+
145
+ .ion-tag__remove svg {
146
+ width: var(--icon-size-2xs);
147
+ height: var(--icon-size-2xs);
148
+ }
149
+
150
+ @media (hover: hover) {
151
+ .ion-tag__remove:hover {
152
+ background-color: var(--surface-hover);
153
+ color: var(--icon-default);
154
+ }
155
+ }
156
+
157
+ .ion-tag__remove[data-focus-visible='true'] {
158
+ outline: var(--border-width-thick) solid var(--ring-focus);
159
+ outline-offset: 1px;
160
+ }
161
+
162
+ .ion-tag--disabled .ion-tag__remove {
163
+ color: var(--icon-disabled);
164
+ cursor: default;
165
+ }
166
+
167
+ /* Forced colours drop the fill; the rule keeps each tag a separate shape. */
168
+ @media (forced-colors: active) {
169
+ .ion-tag {
170
+ border-color: CanvasText;
171
+ }
172
+ }
@@ -0,0 +1,31 @@
1
+ /*
2
+ * TimeField
3
+ *
4
+ * Drawn in Figma as `Time Field` on the Date Picker page: the Input box with
5
+ * a leading clock icon and hour, minute and period segments.
6
+ *
7
+ * Everything but the box's cursor comes from elsewhere, on purpose:
8
+ *
9
+ * the box `.ion-input` and its size and state modifiers — the same
10
+ * box DatePicker and Combobox reuse
11
+ * the segments `.ion-date-field` in date-picker.css, which is imported
12
+ * before this file; a time segment is a date segment
13
+ * the clock `.ion-input__icon-start`, decorative, icon/tertiary
14
+ *
15
+ * A second copy of the segment rules would drift from DatePicker's the first
16
+ * time either changed, and the two fields sit side by side in every schedule
17
+ * form.
18
+ */
19
+ .ion-time-field {
20
+ cursor: text;
21
+ }
22
+
23
+ /*
24
+ * Digits sit against the separator, not centred in their reserved width.
25
+ * A 12-hour clock shows "9", not "09", in a segment wide enough for "12", so
26
+ * centring read as "9 :00 AM". Right-aligned, the spare width falls beside
27
+ * the clock icon, where it looks like padding rather than a typo.
28
+ */
29
+ .ion-time-field .ion-date-field__segment {
30
+ text-align: end;
31
+ }
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.76.0. 75 components.
5
+ Version 0.81.1. 81 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`, `ChartLegend`, `ChartTooltip`, `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`, `SettingRow`, `Sidebar`, `SidebarItem`, `SidebarSection`, `Skeleton`, `Spinner`, `StatGroup`, `StatTile`, `Stepper`, `StepperStep`, `StreamingText`, `TabItem`, `Table`, `TableBody`, `TableCell`, `TableHead`, `TableRow`, `Tabs`, `Textarea`, `Toast`, `ToastProvider`, `Toggle`, `ToolCall`, `Tooltip`
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`, `Modal`, `NavItem`, `NumberInput`, `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`
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.76.0",
3
+ "version": "0.81.1",
4
4
  "description": "IonBase Design System — accessible React components, styles and design tokens in one package",
5
5
  "license": "MIT",
6
6
  "type": "module",