@kjun-ui/native 0.15.0 → 0.17.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 (34) hide show
  1. package/dist/index.cjs +2009 -1925
  2. package/dist/index.js +1888 -1803
  3. package/dist/index.web.cjs +2031 -1947
  4. package/dist/index.web.js +1905 -1820
  5. package/dist/styles.css +99 -32
  6. package/dist/types/packages/native/src/alert-actions-context.d.cts +3 -0
  7. package/dist/types/packages/native/src/alert-actions-context.d.ts +3 -0
  8. package/dist/types/packages/native/src/app-navigation.d.cts +9 -3
  9. package/dist/types/packages/native/src/app-navigation.d.ts +9 -3
  10. package/dist/types/packages/native/src/choice-controls.d.cts +3 -1
  11. package/dist/types/packages/native/src/choice-controls.d.ts +3 -1
  12. package/dist/types/packages/native/src/display-primitives.d.cts +1 -11
  13. package/dist/types/packages/native/src/display-primitives.d.ts +1 -11
  14. package/dist/types/packages/native/src/kpi-row.d.cts +6 -2
  15. package/dist/types/packages/native/src/kpi-row.d.ts +6 -2
  16. package/dist/types/packages/native/src/layer-backdrop.d.cts +5 -0
  17. package/dist/types/packages/native/src/layer-backdrop.d.ts +5 -0
  18. package/dist/types/packages/native/src/list.d.cts +7 -2
  19. package/dist/types/packages/native/src/list.d.ts +7 -2
  20. package/dist/types/packages/native/src/media.d.cts +1 -1
  21. package/dist/types/packages/native/src/media.d.ts +1 -1
  22. package/dist/types/packages/native/src/popover.d.cts +6 -1
  23. package/dist/types/packages/native/src/popover.d.ts +6 -1
  24. package/dist/types/packages/native/src/progress.d.cts +16 -0
  25. package/dist/types/packages/native/src/progress.d.ts +16 -0
  26. package/dist/types/packages/native/src/range-input.d.cts +4 -0
  27. package/dist/types/packages/native/src/range-input.d.ts +4 -0
  28. package/dist/types/shared/package-runtime/alert-tone.d.cts +11 -0
  29. package/dist/types/shared/package-runtime/alert-tone.d.ts +11 -0
  30. package/dist/types/shared/package-runtime/drawer-geometry.d.cts +10 -4
  31. package/dist/types/shared/package-runtime/drawer-geometry.d.ts +10 -4
  32. package/dist/types/shared/package-runtime/progress-circle.d.cts +5 -0
  33. package/dist/types/shared/package-runtime/progress-circle.d.ts +5 -0
  34. package/package.json +3 -3
package/dist/styles.css CHANGED
@@ -79,6 +79,8 @@
79
79
  --_kjun-color-selected-bg: var(--kjun-selected-bg, var(--kjun-active));
80
80
  --_kjun-color-on-brand: var(--kjun-on-brand, var(--kjun-inverse));
81
81
  --_kjun-color-switch-thumb-on: var(--kjun-switch-thumb-on, var(--kjun-on-brand, var(--kjun-inverse)));
82
+ --_kjun-color-filter-selected-bg: var(--kjun-filter-selected-bg, var(--kjun-text));
83
+ --_kjun-color-filter-selected-text: var(--kjun-filter-selected-text, var(--kjun-inverse));
82
84
  --_kjun-color-on-danger: var(--kjun-on-danger, var(--kjun-inverse));
83
85
  --_kjun-color-on-success: var(--kjun-on-success, var(--kjun-inverse));
84
86
  --_kjun-color-on-warning: var(--kjun-on-warning, var(--kjun-inverse));
@@ -182,6 +184,8 @@
182
184
  --_kjun-selected-bg: var(--_kjun-color-selected-bg);
183
185
  --_kjun-on-brand: var(--_kjun-color-on-brand);
184
186
  --_kjun-switch-thumb-on: var(--_kjun-color-switch-thumb-on);
187
+ --_kjun-filter-selected-bg: var(--_kjun-color-filter-selected-bg);
188
+ --_kjun-filter-selected-text: var(--_kjun-color-filter-selected-text);
185
189
  --_kjun-on-danger: var(--_kjun-color-on-danger);
186
190
  --_kjun-on-success: var(--_kjun-color-on-success);
187
191
  --_kjun-on-warning: var(--_kjun-color-on-warning);
@@ -269,6 +273,9 @@
269
273
  --_kjun-extension-list-description-gap: 4px;
270
274
  --_kjun-extension-list-actions-gap: 8px;
271
275
  --_kjun-extension-list-actions-padding: 16px;
276
+ --_kjun-extension-list-leading-width: 40px;
277
+ --_kjun-extension-list-bare-heading-padding-bottom: 4px;
278
+ --_kjun-extension-list-icon-size: 20px;
272
279
  --_kjun-extension-navigation-minimum-height: 56px;
273
280
  --_kjun-extension-navigation-padding: 16px;
274
281
  --_kjun-extension-navigation-gap: 12px;
@@ -323,12 +330,16 @@
323
330
  --_kjun-extension-bottom-navigation-badge-offset: 4px;
324
331
  --_kjun-extension-bottom-navigation-badge-overlap: 8px;
325
332
  --_kjun-extension-bottom-navigation-badge-radius: 9999px;
333
+ --_kjun-extension-avatar-xs: 24px;
326
334
  --_kjun-extension-avatar-sm: 32px;
327
335
  --_kjun-extension-avatar-md: 40px;
328
336
  --_kjun-extension-avatar-lg: 56px;
337
+ --_kjun-extension-avatar-xl: 72px;
338
+ --_kjun-extension-avatar-fallback-icon-sizes-xs: 12px;
329
339
  --_kjun-extension-avatar-fallback-icon-sizes-sm: 14px;
330
340
  --_kjun-extension-avatar-fallback-icon-sizes-md: 18px;
331
341
  --_kjun-extension-avatar-fallback-icon-sizes-lg: 24px;
342
+ --_kjun-extension-avatar-fallback-icon-sizes-xl: 32px;
332
343
  --_kjun-extension-avatar-fallback-icon-size: 18px;
333
344
  --_kjun-extension-chip-sm: 28px;
334
345
  --_kjun-extension-chip-md: 32px;
@@ -440,23 +451,25 @@
440
451
  --_kjun-extension-toast-action-gap: 8px;
441
452
  --_kjun-extension-toast-radius: 12px;
442
453
  --_kjun-extension-toast-close-radius: 6px;
443
- --_kjun-extension-alert-radius: 12px;
444
- --_kjun-extension-alert-description-gap: 4px;
454
+ --_kjun-extension-alert-radius: 16px;
455
+ --_kjun-extension-alert-description-gap: 2px;
445
456
  --_kjun-extension-alert-close-size: 28px;
446
457
  --_kjun-extension-alert-close-radius: 8px;
447
458
  --_kjun-extension-alert-actions-gap: 8px;
448
- --_kjun-extension-alert-sm-padding-x: 12px;
449
- --_kjun-extension-alert-sm-padding-y: 8px;
450
- --_kjun-extension-alert-sm-gap: 8px;
459
+ --_kjun-extension-alert-warning-icon-lift: 0.5px;
460
+ --_kjun-extension-alert-sm-radius: 12px;
461
+ --_kjun-extension-alert-sm-padding-x: 14px;
462
+ --_kjun-extension-alert-sm-padding-y: 12px;
463
+ --_kjun-extension-alert-sm-gap: 10px;
451
464
  --_kjun-extension-alert-sm-close-size: 24px;
452
- --_kjun-extension-alert-sm-action-gap: 8px;
453
- --_kjun-extension-alert-md-padding-x: 14px;
454
- --_kjun-extension-alert-md-padding-y: 10px;
455
- --_kjun-extension-alert-md-gap: 10px;
465
+ --_kjun-extension-alert-sm-action-gap: 10px;
466
+ --_kjun-extension-alert-md-padding-x: 16px;
467
+ --_kjun-extension-alert-md-padding-y: 16px;
468
+ --_kjun-extension-alert-md-gap: 12px;
456
469
  --_kjun-extension-alert-md-action-gap: 12px;
457
- --_kjun-extension-alert-icon-sizes-sm: 14px;
458
- --_kjun-extension-alert-icon-sizes-md: 16px;
459
- --_kjun-extension-alert-close-icon-size: 14px;
470
+ --_kjun-extension-alert-icon-sizes-sm: 16px;
471
+ --_kjun-extension-alert-icon-sizes-md: 18px;
472
+ --_kjun-extension-alert-close-icon-size: 16px;
460
473
  --_kjun-extension-table-card-padding: 12px;
461
474
  --_kjun-extension-table-card-radius: 12px;
462
475
  --_kjun-extension-table-card-gap: 8px;
@@ -532,6 +545,9 @@
532
545
  --_kjun-extension-switch-label-gap: 8px;
533
546
  --_kjun-extension-tooltip-padding-x: 8px;
534
547
  --_kjun-extension-tooltip-padding-y: 4px;
548
+ --_kjun-extension-tooltip-max-widths-sm: 192px;
549
+ --_kjun-extension-tooltip-max-widths-md: 256px;
550
+ --_kjun-extension-tooltip-max-widths-lg: 320px;
535
551
  --_kjun-extension-tooltip-max-width: 256px;
536
552
  --_kjun-extension-tooltip-arrow-size: 8px;
537
553
  --_kjun-extension-financial-affix-gap: 4px;
@@ -699,6 +715,11 @@
699
715
  --_kjun-state-opacity-deviation-low: 0.08;
700
716
  --_kjun-state-opacity-deviation-medium: 0.14;
701
717
  --_kjun-state-opacity-deviation-strong: 0.22;
718
+ --_kjun-state-opacity-tint-fill: 0.06;
719
+ --_kjun-state-opacity-tint-control: 0.08;
720
+ --_kjun-state-opacity-tint-hover: 0.12;
721
+ --_kjun-state-opacity-tint-active: 0.16;
722
+ --_kjun-state-opacity-muted: 0.55;
702
723
  --_kjun-state-focus-width: 2px;
703
724
  --_kjun-state-focus-offset: 2px;
704
725
  --_kjun-state-focus-choice-offset: 3px;
@@ -833,6 +854,7 @@
833
854
  --_kjun-geometry-card-radii-sm: 8px;
834
855
  --_kjun-geometry-card-radii-md: 12px;
835
856
  --_kjun-geometry-card-radii-lg: 16px;
857
+ --_kjun-geometry-card-radii-xl: 24px;
836
858
  --_kjun-geometry-card-subtitle-gap: 4px;
837
859
  --_kjun-geometry-card-title-gap: 8px;
838
860
  --_kjun-geometry-card-glass-blur: 10px;
@@ -882,6 +904,7 @@
882
904
  --_kjun-geometry-radius-radius9999: 9999px;
883
905
  --_kjun-geometry-radius-radius14: 14px;
884
906
  --_kjun-geometry-radius-radius20: 20px;
907
+ --_kjun-geometry-radius-radius24: 24px;
885
908
  --_kjun-geometry-native-minimum-touch-target: 44px;
886
909
  --_kjun-geometry-space-inline-xs: 4px;
887
910
  --_kjun-geometry-space-inline-sm: 8px;
@@ -2115,18 +2138,26 @@
2115
2138
  display: flex;
2116
2139
  align-items: flex-start;
2117
2140
  gap: var(--_kjun-extension-alert-md-gap);
2118
- border: var(--_kjun-border-default-width) solid;
2119
2141
  border-radius: var(--_kjun-extension-alert-radius);
2142
+ word-break: keep-all;
2120
2143
  padding: var(--_kjun-extension-alert-md-padding-y) var(--_kjun-extension-alert-md-padding-x);
2121
2144
  --_kjun-alert-line: var(--_kjun-type-control-line);
2122
2145
  --_kjun-alert-close: var(--_kjun-extension-alert-close-size);
2123
2146
  --_kjun-alert-action-gap: var(--_kjun-extension-alert-md-action-gap);
2124
- }
2147
+ /* Text-role tints stay readable on any fill and page background, light or dark. */
2148
+ --_kjun-alert-tint-fill: color-mix(in srgb, var(--_kjun-color-text) calc(var(--_kjun-state-opacity-tint-fill) * 100%), transparent);
2149
+ --_kjun-alert-tint-control: color-mix(in srgb, var(--_kjun-color-text) calc(var(--_kjun-state-opacity-tint-control) * 100%), transparent);
2150
+ --_kjun-alert-tint-hover: color-mix(in srgb, var(--_kjun-color-text) calc(var(--_kjun-state-opacity-tint-hover) * 100%), transparent);
2151
+ --_kjun-alert-tint-active: color-mix(in srgb, var(--_kjun-color-text) calc(var(--_kjun-state-opacity-tint-active) * 100%), transparent);
2152
+ }
2153
+ /* Info has no fill role: a translucent tint keeps its edge on white and gray pages alike. */
2154
+ .kjun-alert[data-tone="info"] { background: var(--_kjun-alert-tint-fill); }
2125
2155
  .kjun-alert[data-size="sm"] {
2126
2156
  --_kjun-alert-line: var(--_kjun-type-control-small-line);
2127
2157
  --_kjun-alert-close: var(--_kjun-extension-alert-sm-close-size);
2128
2158
  --_kjun-alert-action-gap: var(--_kjun-extension-alert-sm-action-gap);
2129
2159
  gap: var(--_kjun-extension-alert-sm-gap);
2160
+ border-radius: var(--_kjun-extension-alert-sm-radius);
2130
2161
  padding: var(--_kjun-extension-alert-sm-padding-y) var(--_kjun-extension-alert-sm-padding-x);
2131
2162
  }
2132
2163
  .kjun-alert-icon {
@@ -2135,6 +2166,8 @@
2135
2166
  flex-shrink: 0;
2136
2167
  height: var(--_kjun-alert-line);
2137
2168
  }
2169
+ /* A triangle's optical center sits below its box center. */
2170
+ .kjun-alert[data-tone="warning"] .kjun-alert-icon svg { transform: translateY(calc(-1 * var(--_kjun-extension-alert-warning-icon-lift))); }
2138
2171
  .kjun-alert-content {
2139
2172
  min-height: var(--_kjun-alert-line);
2140
2173
  overflow-wrap: anywhere;
@@ -2143,15 +2176,16 @@
2143
2176
  }
2144
2177
  .kjun-alert-title {
2145
2178
  margin: 0;
2146
- font-size: var(--_kjun-type-control-size);
2147
2179
  color: var(--_kjun-color-text);
2180
+ font-size: var(--_kjun-type-control-size);
2148
2181
  line-height: var(--_kjun-type-control-line);
2149
2182
  font-weight: var(--_kjun-type-control-weight);
2150
2183
  letter-spacing: var(--_kjun-type-control-tracking);
2151
2184
  }
2185
+ /* Body copy stays on the text role: secondary gray turns muddy on tinted fills. */
2152
2186
  .kjun-alert-description {
2153
2187
  font-size: var(--_kjun-type-body-size);
2154
- color: var(--_kjun-color-text-secondary);
2188
+ color: var(--_kjun-color-text);
2155
2189
  line-height: var(--_kjun-type-body-line);
2156
2190
  font-weight: var(--_kjun-type-body-weight);
2157
2191
  letter-spacing: var(--_kjun-type-body-tracking);
@@ -2183,7 +2217,7 @@
2183
2217
  background: transparent;
2184
2218
  border: 0;
2185
2219
  padding: 0;
2186
- color: var(--_kjun-color-text-tertiary);
2220
+ color: color-mix(in srgb, var(--_kjun-color-text) calc(var(--_kjun-state-opacity-muted) * 100%), transparent);
2187
2221
  cursor: pointer;
2188
2222
  }
2189
2223
  .kjun-alert-actions {
@@ -2193,15 +2227,15 @@
2193
2227
  gap: var(--_kjun-extension-alert-actions-gap);
2194
2228
  margin-top: var(--_kjun-alert-action-gap);
2195
2229
  }
2196
- /* Secondary actions sit on the surface role so they stay clean on tinted alerts. */
2197
- .kjun-alert-actions .kjun-button[data-variant="secondary"] { background: var(--_kjun-color-surface); }
2198
- .kjun-alert-actions .kjun-button[data-variant="secondary"]:hover:not(:disabled) { background: var(--_kjun-color-hover); }
2199
- .kjun-alert-actions .kjun-button[data-variant="secondary"]:active:not(:disabled) { background: var(--_kjun-color-active); }
2230
+ /* Secondary actions and the close button tint the alert's own fill instead of sitting on it as gray or white. */
2231
+ .kjun-alert-actions .kjun-button[data-variant="secondary"] { background: var(--_kjun-alert-tint-control); }
2232
+ .kjun-alert-actions .kjun-button[data-variant="secondary"]:hover:not(:disabled) { background: var(--_kjun-alert-tint-hover); }
2233
+ .kjun-alert-actions .kjun-button[data-variant="secondary"]:active:not(:disabled) { background: var(--_kjun-alert-tint-active); }
2200
2234
  @media (hover: none), (pointer: coarse) {
2201
- .kjun-alert-actions .kjun-button[data-variant="secondary"]:hover:not(:disabled):not(:active) { background: var(--_kjun-color-surface); }
2235
+ .kjun-alert-actions .kjun-button[data-variant="secondary"]:hover:not(:disabled):not(:active) { background: var(--_kjun-alert-tint-control); }
2202
2236
  }
2203
- .kjun-alert-close:hover { background: var(--_kjun-color-hover); color: var(--_kjun-color-text); }
2204
- .kjun-alert-close:active { background: var(--_kjun-color-active); color: var(--_kjun-color-text); }
2237
+ .kjun-alert-close:hover { background: var(--_kjun-alert-tint-hover); color: var(--_kjun-color-text); }
2238
+ .kjun-alert-close:active { background: var(--_kjun-alert-tint-active); color: var(--_kjun-color-text); }
2205
2239
  .kjun-alert-close:focus-visible {
2206
2240
  outline: var(--_kjun-state-focus-width) solid var(--_kjun-color-focus-ring);
2207
2241
  outline-offset: var(--_kjun-state-focus-offset);
@@ -2226,6 +2260,20 @@
2226
2260
  border-radius: inherit;
2227
2261
  transition: width var(--_kjun-motion-progress) var(--_kjun-ease-out);
2228
2262
  }
2263
+ .kjun-progress[data-state="indeterminate"] .kjun-progress-track > div {
2264
+ animation: kjun-progress-indeterminate var(--_kjun-motion-spin) linear infinite;
2265
+ transition: none;
2266
+ }
2267
+ @keyframes kjun-progress-indeterminate {
2268
+ from { transform: translateX(-100%); }
2269
+ to { transform: translateX(334%); }
2270
+ }
2271
+ @media (prefers-reduced-motion: reduce) {
2272
+ .kjun-progress[data-state="indeterminate"] .kjun-progress-track > div {
2273
+ animation: none;
2274
+ transform: translateX(116%);
2275
+ }
2276
+ }
2229
2277
  .kjun-progress-sub {
2230
2278
  font-size: var(--_kjun-type-caption-size);
2231
2279
  margin-top: var(--_kjun-geometry-dimension-value4);
@@ -2421,8 +2469,8 @@
2421
2469
  white-space: nowrap;
2422
2470
  }
2423
2471
  .kjun-filter-chip[aria-pressed="true"] > span {
2424
- background: var(--_kjun-color-text);
2425
- color: var(--_kjun-color-inverse);
2472
+ background: var(--_kjun-color-filter-selected-bg);
2473
+ color: var(--_kjun-color-filter-selected-text);
2426
2474
  font-weight: var(--_kjun-type-control-weight);
2427
2475
  }
2428
2476
  .kjun-filter-chip:disabled {
@@ -2520,6 +2568,17 @@
2520
2568
  font-weight: var(--_kjun-type-caption-weight);
2521
2569
  letter-spacing: var(--_kjun-type-caption-tracking);
2522
2570
  }
2571
+ /* Title above the body: a bolder small role in the same tooltip text color. */
2572
+ .kjun-tooltip-title {
2573
+ display: block;
2574
+ font-size: var(--_kjun-type-control-small-size);
2575
+ line-height: var(--_kjun-type-control-small-line);
2576
+ font-weight: var(--_kjun-type-control-small-weight);
2577
+ letter-spacing: var(--_kjun-type-control-small-tracking);
2578
+ }
2579
+ .kjun-tooltip-body { display: block; }
2580
+ .kjun-tooltip[data-align="start"] { text-align: start; }
2581
+ .kjun-tooltip[data-align="center"] { text-align: center; }
2523
2582
  .kjun-tooltip svg {
2524
2583
  display: block;
2525
2584
  color: var(--_kjun-color-chart-tooltip-bg);
@@ -4800,7 +4859,11 @@
4800
4859
 
4801
4860
  .kjun-list-section,.kjun-top-navigation,.kjun-bottom-navigation,.kjun-bottom-action-bar{min-width:0;max-width:100%;color:var(--_kjun-color-text);background:var(--_kjun-color-surface)}
4802
4861
  .kjun-list-heading{display:flex;align-items:center;justify-content:space-between;gap:var(--_kjun-extension-list-gap);padding:var(--_kjun-extension-list-padding)}.kjun-list-heading h3{font-size:var(--_kjun-type-card-title-size);margin:0;line-height:var(--_kjun-type-card-title-line);font-weight:var(--_kjun-type-card-title-weight);letter-spacing:var(--_kjun-type-card-title-tracking)}.kjun-list-heading p{margin:var(--_kjun-geometry-dimension-value4) 0 0;font-size:var(--_kjun-type-caption-size);color:var(--_kjun-color-text-secondary);overflow-wrap:anywhere;line-height:var(--_kjun-type-caption-line);font-weight:var(--_kjun-type-caption-weight);letter-spacing:var(--_kjun-type-caption-tracking)}
4803
- .kjun-list{list-style:none;padding:0;margin:0}.kjun-list-row{display:flex;align-items:center;gap:var(--_kjun-extension-list-gap);border-bottom:var(--_kjun-border-default-width) solid var(--_kjun-color-divider);min-width:0}.kjun-list-row:last-child{border-bottom:0}.kjun-list[data-divider=false]>.kjun-list-row{border-bottom:0}.kjun-list[data-density=compact] .kjun-list-main{min-height:var(--_kjun-extension-list-compact-minimum-height);padding-block:var(--_kjun-extension-list-compact-padding-y)}.kjun-list-main{display:flex;align-items:center;gap:var(--_kjun-extension-list-gap);flex:1;min-width:0;min-height:var(--_kjun-extension-list-minimum-height);padding:var(--_kjun-extension-list-padding);text-align:start;color:inherit;text-decoration:none;background:transparent;border:0;font:inherit}.kjun-list-main:is(button,a):hover{background:var(--_kjun-color-hover)}.kjun-list-body{flex:1;min-width:0}.kjun-list-content{display:block;margin-top:var(--_kjun-extension-list-description-gap)}.kjun-list-title,.kjun-list-description{display:block;overflow-wrap:anywhere;line-height:1.5}.kjun-list-title{font-size:var(--_kjun-type-label-size);line-height:var(--_kjun-type-label-line);font-weight:var(--_kjun-type-label-weight);letter-spacing:var(--_kjun-type-label-tracking)}.kjun-list-description{font-size:var(--_kjun-type-caption-size);color:var(--_kjun-color-text-secondary);line-height:var(--_kjun-type-caption-line);font-weight:var(--_kjun-type-caption-weight);letter-spacing:var(--_kjun-type-caption-tracking)}.kjun-list-leading{flex-shrink:0}.kjun-list-trailing{overflow-wrap:anywhere;max-width:35%}.kjun-list-actions{display:flex;flex-wrap:wrap;gap:var(--_kjun-extension-list-actions-gap);padding-inline-end:var(--_kjun-extension-list-actions-padding);max-width:45%}
4862
+ .kjun-list{list-style:none;padding:0;margin:0}.kjun-list-row{display:flex;align-items:center;gap:var(--_kjun-extension-list-gap);position:relative;min-width:0}/* Dividers start where the text does: the row inset, or past the fixed leading column. */
4863
+ .kjun-list-row:not(:last-child)::after,.kjun-list-item:not(:last-child)::after{content:"";position:absolute;inset-inline:var(--_kjun-list-divider-inset,var(--_kjun-extension-list-padding)) 0;bottom:0;height:var(--_kjun-border-default-width);background:var(--_kjun-color-divider);pointer-events:none}
4864
+ .kjun-list-row[data-leading]{--_kjun-list-divider-inset:calc(var(--_kjun-extension-list-padding) + var(--_kjun-extension-list-leading-width) + var(--_kjun-extension-list-gap))}.kjun-list[data-divider=false]>:is(.kjun-list-row,.kjun-list-item)::after{content:none}.kjun-list[data-density=compact] .kjun-list-main{min-height:var(--_kjun-extension-list-compact-minimum-height);padding-block:var(--_kjun-extension-list-compact-padding-y)}.kjun-list-main{display:flex;align-items:center;gap:var(--_kjun-extension-list-gap);flex:1;min-width:0;min-height:var(--_kjun-extension-list-minimum-height);padding:var(--_kjun-extension-list-padding);text-align:start;color:inherit;text-decoration:none;background:transparent;border:0;font:inherit}.kjun-list-main:is(button,a):hover{background:var(--_kjun-color-hover)}.kjun-list-body{flex:1;min-width:0}.kjun-list-content{display:block;margin-top:var(--_kjun-extension-list-description-gap)}.kjun-list-title,.kjun-list-description{display:block;overflow-wrap:anywhere;line-height:1.5}.kjun-list-title{font-size:var(--_kjun-type-control-size);line-height:var(--_kjun-type-control-line);font-weight:var(--_kjun-type-control-weight);letter-spacing:var(--_kjun-type-control-tracking)}.kjun-list-description{font-size:var(--_kjun-type-caption-size);color:var(--_kjun-color-text-secondary);line-height:var(--_kjun-type-caption-line);font-weight:var(--_kjun-type-caption-weight);letter-spacing:var(--_kjun-type-caption-tracking)}/* A fixed leading column keeps titles on one line whether a row shows an icon, an avatar or a wider image. */
4865
+ .kjun-list-leading{flex-shrink:0;display:flex;align-items:center;justify-content:center;min-width:var(--_kjun-extension-list-leading-width)}
4866
+ .kjun-list-icon{color:var(--_kjun-color-text-secondary)}.kjun-list-trailing{overflow-wrap:anywhere;max-width:35%}.kjun-list-actions{display:flex;flex-wrap:wrap;gap:var(--_kjun-extension-list-actions-gap);padding-inline-end:var(--_kjun-extension-list-actions-padding);max-width:45%}
4804
4867
  /* A disabled row disables its actions too, so the row never reads as partly available. */
4805
4868
  .kjun-list-actions[data-disabled]{opacity:var(--_kjun-state-opacity-disabled)}
4806
4869
  .kjun-navigation-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:var(--_kjun-extension-navigation-actions-gap);min-width:0}
@@ -4808,7 +4871,7 @@
4808
4871
  /* Initials scale with the avatar (about 40% of its side) and show Latin initials in capitals. */
4809
4872
  .kjun-avatar .kjun-image-fallback{text-transform:uppercase;font-size:var(--_kjun-type-input-size);line-height:var(--_kjun-type-input-line)}
4810
4873
  .kjun-avatar[data-size=sm] .kjun-image-fallback{font-size:var(--_kjun-type-control-size);line-height:var(--_kjun-type-control-line)}
4811
- .kjun-avatar[data-size=lg] .kjun-image-fallback{font-size:var(--_kjun-type-section-title-size);line-height:var(--_kjun-type-section-title-line)}.kjun-avatar[data-shape=square]{border-radius:var(--_kjun-geometry-radius-radius8)}
4874
+ .kjun-avatar[data-size=lg] .kjun-image-fallback{font-size:var(--_kjun-type-section-title-size);line-height:var(--_kjun-type-section-title-line)}.kjun-avatar[data-size=xs] .kjun-image-fallback{font-size:var(--_kjun-type-control-small-size);line-height:var(--_kjun-type-control-small-line)}.kjun-avatar[data-size=xl] .kjun-image-fallback{font-size:var(--_kjun-type-page-title-size);line-height:var(--_kjun-type-page-title-line)}.kjun-avatar[data-shape=square]{border-radius:var(--_kjun-geometry-radius-radius8)}
4812
4875
  /* App colors (color/textColor) arrive as private custom properties; without them the image roles stay. */
4813
4876
  .kjun-avatar .kjun-image{background:var(--_kjun-avatar-color,var(--_kjun-color-secondary))}.kjun-avatar .kjun-image-fallback{color:var(--_kjun-avatar-text-color,var(--_kjun-color-text-secondary))}
4814
4877
  .kjun-chip{--_kjun-chip-remove-icon:var(--_kjun-extension-chip-remove-icon-sizes-md);display:inline-flex;max-width:100%;align-items:center;gap:var(--_kjun-extension-chip-gap);min-height:var(--_kjun-extension-chip-md);padding:var(--_kjun-extension-chip-padding-y) var(--_kjun-extension-chip-padding-x);border-radius:var(--_kjun-extension-chip-radius);background:var(--_kjun-color-secondary);font-size:var(--_kjun-extension-chip-typography-md-font-size-px);line-height:var(--_kjun-extension-chip-typography-md-line-height-px);font-weight:var(--_kjun-extension-chip-typography-md-font-weight);letter-spacing:var(--_kjun-extension-chip-typography-md-letter-spacing-em)}
@@ -5014,6 +5077,9 @@
5014
5077
  .kjun-list-description { margin-top:var(--_kjun-extension-list-description-gap); }
5015
5078
 
5016
5079
  .kjun-list-heading > div { flex:1; min-width:0; overflow-wrap:anywhere; }
5080
+ /* A title without a description labels the rows below as a small group header instead of floating above them. */
5081
+ .kjun-list-heading[data-bare] { padding-bottom:var(--_kjun-extension-list-bare-heading-padding-bottom); }
5082
+ .kjun-list-heading[data-bare] h3 { font-size:var(--_kjun-type-control-small-size); line-height:var(--_kjun-type-control-small-line); font-weight:var(--_kjun-type-control-small-weight); letter-spacing:var(--_kjun-type-control-small-tracking); color:var(--_kjun-color-text-secondary); }
5017
5083
 
5018
5084
  /* KjunFab: a round action pinned to the viewport's bottom end, above page content and clear of the safe area. */
5019
5085
  .kjun-fab{position:fixed;right:var(--_kjun-extension-fab-inset);z-index:var(--_kjun-layer-page-navigation);display:inline-flex;align-items:center;justify-content:center;width:var(--_kjun-extension-fab-size);height:var(--_kjun-extension-fab-size);padding:0;border:0;border-radius:50%;background:var(--_kjun-color-brand);color:var(--_kjun-color-on-brand);box-shadow:var(--_kjun-elevation-floating);cursor:pointer}
@@ -5022,12 +5088,13 @@
5022
5088
  .kjun-fab:disabled{opacity:var(--_kjun-state-opacity-disabled);cursor:not-allowed}
5023
5089
 
5024
5090
  /* 0.14.0: plain sections, destructive rows, decorative chevrons and non-row list items share the row inset. */
5025
- .kjun-list-section[data-surface="false"]{background:transparent}
5091
+ .kjun-list-section[data-surface="false"],.kjun-top-navigation[data-surface="false"],.kjun-bottom-navigation[data-surface="false"],.kjun-bottom-action-bar[data-surface="false"]{background:transparent}
5092
+ /* A rounded section clips its rows to the corners; row focus rings move inside so the clip does not cut them. */
5093
+ .kjun-list-section[data-radius]{overflow:hidden;overflow:clip}
5094
+ .kjun-list-section[data-radius] .kjun-list-main:focus-visible{outline-offset:var(--_kjun-state-focus-inset-offset)}
5026
5095
  .kjun-list-row[data-destructive] .kjun-list-title{color:var(--_kjun-color-danger)}
5027
5096
  .kjun-list-chevron{flex-shrink:0;color:var(--_kjun-color-text-tertiary)}
5028
- .kjun-list-item{padding:var(--_kjun-extension-list-padding);border-bottom:var(--_kjun-border-default-width) solid var(--_kjun-color-divider);min-width:0}
5029
- .kjun-list-item:last-child{border-bottom:0}
5030
- .kjun-list[data-divider=false]>.kjun-list-item{border-bottom:0}
5097
+ .kjun-list-item{padding:var(--_kjun-extension-list-padding);position:relative;min-width:0}
5031
5098
  .kjun-list[data-density=compact]>.kjun-list-item{padding-block:var(--_kjun-extension-list-compact-padding-y)}
5032
5099
 
5033
5100
  /* Compound fields share input geometry; buttons retain their own size contract. */
@@ -1 +1,4 @@
1
+ import type { ColorValue } from "react-native";
1
2
  export declare const AlertActionsContext: import("react").Context<boolean>;
3
+ /** Text-role tint at a state opacity, like the web color-mix; colors it cannot parse use the fallback role. */
4
+ export declare function alertTint(text: ColorValue, amount: 'tintFill' | 'tintControl' | 'tintHover' | 'tintActive' | 'muted', fallback: ColorValue): ColorValue;
@@ -1 +1,4 @@
1
+ import type { ColorValue } from "react-native";
1
2
  export declare const AlertActionsContext: import("react").Context<boolean>;
3
+ /** Text-role tint at a state opacity, like the web color-mix; colors it cannot parse use the fallback role. */
4
+ export declare function alertTint(text: ColorValue, amount: 'tintFill' | 'tintControl' | 'tintHover' | 'tintActive' | 'muted', fallback: ColorValue): ColorValue;
@@ -6,8 +6,10 @@ export interface KjunTopNavigationProps {
6
6
  leading?: ReactNode;
7
7
  actions?: ReactNode;
8
8
  safeAreaTop?: number;
9
+ /** Paints the surface background (default true); false lets the page background show through, so the bar does not read as a separate band. */
10
+ surface?: boolean;
9
11
  }
10
- export declare function KjunTopNavigation({ title, description, leading, actions, safeAreaTop }: KjunTopNavigationProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function KjunTopNavigation({ title, description, leading, actions, safeAreaTop, surface }: KjunTopNavigationProps): import("react/jsx-runtime").JSX.Element;
11
13
  export interface NavigationDestination {
12
14
  key: string;
13
15
  label: string;
@@ -24,13 +26,17 @@ export interface KjunBottomNavigationProps {
24
26
  keyboardVisible?: boolean;
25
27
  hideOnKeyboard?: boolean;
26
28
  onNavigate?: (key: string, event: GestureResponderEvent) => void;
29
+ /** Paints the surface background (default true); false lets the page background show through, so the bar does not read as a separate band. */
30
+ surface?: boolean;
27
31
  }
28
- export declare function KjunBottomNavigation({ items, value, ariaLabel, safeAreaBottom, keyboardVisible, hideOnKeyboard, onNavigate }: KjunBottomNavigationProps): import("react/jsx-runtime").JSX.Element | null;
32
+ export declare function KjunBottomNavigation({ items, value, ariaLabel, safeAreaBottom, keyboardVisible, hideOnKeyboard, onNavigate, surface }: KjunBottomNavigationProps): import("react/jsx-runtime").JSX.Element | null;
29
33
  export interface KjunBottomActionBarProps {
30
34
  description?: string;
31
35
  children: ReactNode;
32
36
  safeAreaBottom?: number;
33
37
  keyboardVisible?: boolean;
34
38
  hideOnKeyboard?: boolean;
39
+ /** Paints the surface background (default true); false lets the page background show through, so the bar does not read as a separate band. */
40
+ surface?: boolean;
35
41
  }
36
- export declare function KjunBottomActionBar({ description, children, safeAreaBottom, keyboardVisible, hideOnKeyboard }: KjunBottomActionBarProps): import("react/jsx-runtime").JSX.Element | null;
42
+ export declare function KjunBottomActionBar({ description, children, safeAreaBottom, keyboardVisible, hideOnKeyboard, surface }: KjunBottomActionBarProps): import("react/jsx-runtime").JSX.Element | null;
@@ -6,8 +6,10 @@ export interface KjunTopNavigationProps {
6
6
  leading?: ReactNode;
7
7
  actions?: ReactNode;
8
8
  safeAreaTop?: number;
9
+ /** Paints the surface background (default true); false lets the page background show through, so the bar does not read as a separate band. */
10
+ surface?: boolean;
9
11
  }
10
- export declare function KjunTopNavigation({ title, description, leading, actions, safeAreaTop }: KjunTopNavigationProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function KjunTopNavigation({ title, description, leading, actions, safeAreaTop, surface }: KjunTopNavigationProps): import("react/jsx-runtime").JSX.Element;
11
13
  export interface NavigationDestination {
12
14
  key: string;
13
15
  label: string;
@@ -24,13 +26,17 @@ export interface KjunBottomNavigationProps {
24
26
  keyboardVisible?: boolean;
25
27
  hideOnKeyboard?: boolean;
26
28
  onNavigate?: (key: string, event: GestureResponderEvent) => void;
29
+ /** Paints the surface background (default true); false lets the page background show through, so the bar does not read as a separate band. */
30
+ surface?: boolean;
27
31
  }
28
- export declare function KjunBottomNavigation({ items, value, ariaLabel, safeAreaBottom, keyboardVisible, hideOnKeyboard, onNavigate }: KjunBottomNavigationProps): import("react/jsx-runtime").JSX.Element | null;
32
+ export declare function KjunBottomNavigation({ items, value, ariaLabel, safeAreaBottom, keyboardVisible, hideOnKeyboard, onNavigate, surface }: KjunBottomNavigationProps): import("react/jsx-runtime").JSX.Element | null;
29
33
  export interface KjunBottomActionBarProps {
30
34
  description?: string;
31
35
  children: ReactNode;
32
36
  safeAreaBottom?: number;
33
37
  keyboardVisible?: boolean;
34
38
  hideOnKeyboard?: boolean;
39
+ /** Paints the surface background (default true); false lets the page background show through, so the bar does not read as a separate band. */
40
+ surface?: boolean;
35
41
  }
36
- export declare function KjunBottomActionBar({ description, children, safeAreaBottom, keyboardVisible, hideOnKeyboard }: KjunBottomActionBarProps): import("react/jsx-runtime").JSX.Element | null;
42
+ export declare function KjunBottomActionBar({ description, children, safeAreaBottom, keyboardVisible, hideOnKeyboard, surface }: KjunBottomActionBarProps): import("react/jsx-runtime").JSX.Element | null;
@@ -11,6 +11,8 @@ export interface ChoiceOption<T = ChoiceValue> {
11
11
  }
12
12
  export interface KjunCheckboxProps<T = ChoiceValue> {
13
13
  value: boolean | T[];
14
+ /** Mixed selection display; value and change callbacks keep their boolean/array shape. */
15
+ indeterminate?: boolean;
14
16
  val?: T;
15
17
  label?: string;
16
18
  ariaLabel?: string;
@@ -20,7 +22,7 @@ export interface KjunCheckboxProps<T = ChoiceValue> {
20
22
  onValueChange?: (value: boolean | T[]) => void;
21
23
  onChange?: (value: boolean | T[]) => void;
22
24
  }
23
- export declare function KjunCheckbox<T = ChoiceValue>({ value, val, label, ariaLabel, disabled, size, children, onValueChange, onChange, }: KjunCheckboxProps<T>): import("react/jsx-runtime").JSX.Element;
25
+ export declare function KjunCheckbox<T = ChoiceValue>({ value, indeterminate, val, label, ariaLabel, disabled, size, children, onValueChange, onChange, }: KjunCheckboxProps<T>): import("react/jsx-runtime").JSX.Element;
24
26
  export interface KjunSwitchProps {
25
27
  value: boolean;
26
28
  label?: string;
@@ -11,6 +11,8 @@ export interface ChoiceOption<T = ChoiceValue> {
11
11
  }
12
12
  export interface KjunCheckboxProps<T = ChoiceValue> {
13
13
  value: boolean | T[];
14
+ /** Mixed selection display; value and change callbacks keep their boolean/array shape. */
15
+ indeterminate?: boolean;
14
16
  val?: T;
15
17
  label?: string;
16
18
  ariaLabel?: string;
@@ -20,7 +22,7 @@ export interface KjunCheckboxProps<T = ChoiceValue> {
20
22
  onValueChange?: (value: boolean | T[]) => void;
21
23
  onChange?: (value: boolean | T[]) => void;
22
24
  }
23
- export declare function KjunCheckbox<T = ChoiceValue>({ value, val, label, ariaLabel, disabled, size, children, onValueChange, onChange, }: KjunCheckboxProps<T>): import("react/jsx-runtime").JSX.Element;
25
+ export declare function KjunCheckbox<T = ChoiceValue>({ value, indeterminate, val, label, ariaLabel, disabled, size, children, onValueChange, onChange, }: KjunCheckboxProps<T>): import("react/jsx-runtime").JSX.Element;
24
26
  export interface KjunSwitchProps {
25
27
  value: boolean;
26
28
  label?: string;
@@ -41,14 +41,4 @@ export interface KjunAlertProps {
41
41
  onClose?: () => void;
42
42
  }
43
43
  export declare function KjunAlert({ type, variant, size, title, closable, live, children, actions, onClose, }: KjunAlertProps): import("react/jsx-runtime").JSX.Element | null;
44
- export interface KjunProgressProps {
45
- value?: number;
46
- max?: number;
47
- size?: "sm" | "md" | "lg";
48
- variant?: SemanticTone;
49
- showLabel?: boolean;
50
- label?: ReactNode;
51
- subLabel?: ReactNode;
52
- shape?: "bar" | "circle";
53
- }
54
- export declare function KjunProgress({ value, max, size, variant, showLabel, label, subLabel, shape, }: KjunProgressProps): import("react/jsx-runtime").JSX.Element;
44
+ export { KjunProgress, type KjunProgressProps } from "./progress.cjs";
@@ -41,14 +41,4 @@ export interface KjunAlertProps {
41
41
  onClose?: () => void;
42
42
  }
43
43
  export declare function KjunAlert({ type, variant, size, title, closable, live, children, actions, onClose, }: KjunAlertProps): import("react/jsx-runtime").JSX.Element | null;
44
- export interface KjunProgressProps {
45
- value?: number;
46
- max?: number;
47
- size?: "sm" | "md" | "lg";
48
- variant?: SemanticTone;
49
- showLabel?: boolean;
50
- label?: ReactNode;
51
- subLabel?: ReactNode;
52
- shape?: "bar" | "circle";
53
- }
54
- export declare function KjunProgress({ value, max, size, variant, showLabel, label, subLabel, shape, }: KjunProgressProps): import("react/jsx-runtime").JSX.Element;
44
+ export { KjunProgress, type KjunProgressProps } from "./progress.js";
@@ -1,7 +1,11 @@
1
1
  import { type ReactNode } from "react";
2
2
  import { type ColorValue } from "react-native";
3
3
  import { KpiValue } from "./kpi-hero.cjs";
4
- export interface KpiRowItem extends KpiValue {
4
+ export interface KpiRowItem extends Omit<KpiValue, "value"> {
5
+ /** null/undefined and non-finite numbers are missing, never zero. Loading still takes precedence. */
6
+ value?: number | string | null;
7
+ /** Shown for a missing value; defaults to an em dash. */
8
+ missingText?: string;
5
9
  loading?: boolean;
6
10
  clickable?: boolean;
7
11
  mobileFull?: boolean;
@@ -18,7 +22,7 @@ export interface KpiRowItem extends KpiValue {
18
22
  badge?: {
19
23
  text: string;
20
24
  variant?: "warning" | "success" | "danger" | "price-up" | "price-down" | "info" | "neutral";
21
- };
25
+ } | null;
22
26
  badgePlacement?: "label" | "value";
23
27
  }
24
28
  export interface KjunKpiRowProps {
@@ -1,7 +1,11 @@
1
1
  import { type ReactNode } from "react";
2
2
  import { type ColorValue } from "react-native";
3
3
  import { KpiValue } from "./kpi-hero.js";
4
- export interface KpiRowItem extends KpiValue {
4
+ export interface KpiRowItem extends Omit<KpiValue, "value"> {
5
+ /** null/undefined and non-finite numbers are missing, never zero. Loading still takes precedence. */
6
+ value?: number | string | null;
7
+ /** Shown for a missing value; defaults to an em dash. */
8
+ missingText?: string;
5
9
  loading?: boolean;
6
10
  clickable?: boolean;
7
11
  mobileFull?: boolean;
@@ -18,7 +22,7 @@ export interface KpiRowItem extends KpiValue {
18
22
  badge?: {
19
23
  text: string;
20
24
  variant?: "warning" | "success" | "danger" | "price-up" | "price-down" | "info" | "neutral";
21
- };
25
+ } | null;
22
26
  badgePlacement?: "label" | "value";
23
27
  }
24
28
  export interface KjunKpiRowProps {
@@ -1,4 +1,9 @@
1
1
  import { type StyleProp, type ViewStyle } from "react-native";
2
+ /**
3
+ * Where a modal backdrop sits: from the root's top to at least the screen's bottom. Android lays out a
4
+ * new modal root a navigation bar short for its first frames; an inset of 0 would leave that strip bright.
5
+ */
6
+ export declare function screenCover(): ViewStyle;
2
7
  /** The backdrop accepts pointer dismissal and never participates in focus traversal. */
3
8
  export declare function LayerBackdrop({ onPress, style }: {
4
9
  onPress: () => void;
@@ -1,4 +1,9 @@
1
1
  import { type StyleProp, type ViewStyle } from "react-native";
2
+ /**
3
+ * Where a modal backdrop sits: from the root's top to at least the screen's bottom. Android lays out a
4
+ * new modal root a navigation bar short for its first frames; an inset of 0 would leave that strip bright.
5
+ */
6
+ export declare function screenCover(): ViewStyle;
2
7
  /** The backdrop accepts pointer dismissal and never participates in focus traversal. */
3
8
  export declare function LayerBackdrop({ onPress, style }: {
4
9
  onPress: () => void;
@@ -1,8 +1,11 @@
1
+ import { type CardRadius } from "@kjun-ui/tokens";
1
2
  import { type ReactNode } from "react";
2
3
  import { type GestureResponderEvent } from "react-native";
3
4
  export interface KjunListRowProps {
4
5
  title: string;
5
6
  description?: string;
7
+ /** Icon name drawn in the leading column at the list icon size; `leading` replaces it when both are given. */
8
+ icon?: string;
6
9
  leading?: ReactNode;
7
10
  trailing?: ReactNode;
8
11
  actions?: ReactNode;
@@ -18,7 +21,7 @@ export interface KjunListRowProps {
18
21
  /** Display-only content under the description (a budget bar); no buttons or links inside a pressable row. */
19
22
  children?: ReactNode;
20
23
  }
21
- export declare function KjunListRow({ title, description, leading, trailing, actions, href, disabled, destructive, chevron, onPress, ariaLabel, children }: KjunListRowProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function KjunListRow({ title, description, icon, leading, trailing, actions, href, disabled, destructive, chevron, onPress, ariaLabel, children }: KjunListRowProps): import("react/jsx-runtime").JSX.Element;
22
25
  export interface KjunListSectionProps {
23
26
  title?: string;
24
27
  description?: string;
@@ -31,8 +34,10 @@ export interface KjunListSectionProps {
31
34
  divider?: boolean;
32
35
  /** "compact" rows keep the 16px inset but are 44 tall (the touch minimum) instead of 56. */
33
36
  density?: "default" | "compact";
37
+ /** Rounds the section on the card radius steps and clips its rows to the corners (default "none"). */
38
+ radius?: CardRadius;
34
39
  }
35
- export declare function KjunListSection({ title, description, actions, children, ariaLabel, surface, divider, density }: KjunListSectionProps): import("react/jsx-runtime").JSX.Element;
40
+ export declare function KjunListSection({ title, description, actions, children, ariaLabel, surface, divider, density, radius }: KjunListSectionProps): import("react/jsx-runtime").JSX.Element;
36
41
  export interface KjunListItemProps {
37
42
  children: ReactNode;
38
43
  }
@@ -1,8 +1,11 @@
1
+ import { type CardRadius } from "@kjun-ui/tokens";
1
2
  import { type ReactNode } from "react";
2
3
  import { type GestureResponderEvent } from "react-native";
3
4
  export interface KjunListRowProps {
4
5
  title: string;
5
6
  description?: string;
7
+ /** Icon name drawn in the leading column at the list icon size; `leading` replaces it when both are given. */
8
+ icon?: string;
6
9
  leading?: ReactNode;
7
10
  trailing?: ReactNode;
8
11
  actions?: ReactNode;
@@ -18,7 +21,7 @@ export interface KjunListRowProps {
18
21
  /** Display-only content under the description (a budget bar); no buttons or links inside a pressable row. */
19
22
  children?: ReactNode;
20
23
  }
21
- export declare function KjunListRow({ title, description, leading, trailing, actions, href, disabled, destructive, chevron, onPress, ariaLabel, children }: KjunListRowProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function KjunListRow({ title, description, icon, leading, trailing, actions, href, disabled, destructive, chevron, onPress, ariaLabel, children }: KjunListRowProps): import("react/jsx-runtime").JSX.Element;
22
25
  export interface KjunListSectionProps {
23
26
  title?: string;
24
27
  description?: string;
@@ -31,8 +34,10 @@ export interface KjunListSectionProps {
31
34
  divider?: boolean;
32
35
  /** "compact" rows keep the 16px inset but are 44 tall (the touch minimum) instead of 56. */
33
36
  density?: "default" | "compact";
37
+ /** Rounds the section on the card radius steps and clips its rows to the corners (default "none"). */
38
+ radius?: CardRadius;
34
39
  }
35
- export declare function KjunListSection({ title, description, actions, children, ariaLabel, surface, divider, density }: KjunListSectionProps): import("react/jsx-runtime").JSX.Element;
40
+ export declare function KjunListSection({ title, description, actions, children, ariaLabel, surface, divider, density, radius }: KjunListSectionProps): import("react/jsx-runtime").JSX.Element;
36
41
  export interface KjunListItemProps {
37
42
  children: ReactNode;
38
43
  }
@@ -18,7 +18,7 @@ export interface KjunAvatarProps {
18
18
  name?: string;
19
19
  alt?: string;
20
20
  decorative?: boolean;
21
- size?: "sm" | "md" | "lg";
21
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
22
22
  shape?: "circle" | "square";
23
23
  color?: ColorValue;
24
24
  textColor?: ColorValue;
@@ -18,7 +18,7 @@ export interface KjunAvatarProps {
18
18
  name?: string;
19
19
  alt?: string;
20
20
  decorative?: boolean;
21
- size?: "sm" | "md" | "lg";
21
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
22
22
  shape?: "circle" | "square";
23
23
  color?: ColorValue;
24
24
  textColor?: ColorValue;
@@ -21,6 +21,11 @@ export interface KjunPopoverProps {
21
21
  export declare function KjunPopover({ noPadding, open: controlled, onOpenChange, manualTrigger, matchTriggerWidth, maxHeight, flip, focusOnOpen, ariaLabel, placement, header, modal, trigger, children, }: KjunPopoverProps): import("react/jsx-runtime").JSX.Element;
22
22
  export interface KjunTooltipProps extends Pick<PressableProps, "onPress" | "disabled"> {
23
23
  content?: string;
24
+ /** A bolder line above content (a file name above its path). Read together with content. */
25
+ title?: string;
26
+ align?: "start" | "center";
27
+ /** Maximum width step (tooltip.maxWidths); default is md, the earlier width. */
28
+ width?: "sm" | "md" | "lg";
24
29
  placement?: "top" | "bottom" | "left" | "right";
25
30
  delay?: number;
26
31
  /** Controlled visibility; omit to let hover and focus drive it. */
@@ -28,4 +33,4 @@ export interface KjunTooltipProps extends Pick<PressableProps, "onPress" | "disa
28
33
  onOpenChange?: (open: boolean) => void;
29
34
  children: ReactNode;
30
35
  }
31
- export declare function KjunTooltip({ content: message, placement, delay, children, onPress, disabled, open: controlled, onOpenChange, }: KjunTooltipProps): import("react/jsx-runtime").JSX.Element;
36
+ export declare function KjunTooltip({ content: body, title, align, width, placement, delay, children, onPress, disabled, open: controlled, onOpenChange, }: KjunTooltipProps): import("react/jsx-runtime").JSX.Element;