@kjun-ui/native 0.16.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 (32) hide show
  1. package/dist/index.cjs +1985 -1913
  2. package/dist/index.js +1866 -1793
  3. package/dist/index.web.cjs +2009 -1937
  4. package/dist/index.web.js +1883 -1810
  5. package/dist/styles.css +74 -30
  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 +3 -1
  19. package/dist/types/packages/native/src/list.d.ts +3 -1
  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/progress.d.cts +16 -0
  23. package/dist/types/packages/native/src/progress.d.ts +16 -0
  24. package/dist/types/packages/native/src/range-input.d.cts +4 -0
  25. package/dist/types/packages/native/src/range-input.d.ts +4 -0
  26. package/dist/types/shared/package-runtime/alert-tone.d.cts +11 -0
  27. package/dist/types/shared/package-runtime/alert-tone.d.ts +11 -0
  28. package/dist/types/shared/package-runtime/drawer-geometry.d.cts +10 -4
  29. package/dist/types/shared/package-runtime/drawer-geometry.d.ts +10 -4
  30. package/dist/types/shared/package-runtime/progress-circle.d.cts +5 -0
  31. package/dist/types/shared/package-runtime/progress-circle.d.ts +5 -0
  32. package/package.json +3 -3
package/dist/styles.css CHANGED
@@ -273,6 +273,9 @@
273
273
  --_kjun-extension-list-description-gap: 4px;
274
274
  --_kjun-extension-list-actions-gap: 8px;
275
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;
276
279
  --_kjun-extension-navigation-minimum-height: 56px;
277
280
  --_kjun-extension-navigation-padding: 16px;
278
281
  --_kjun-extension-navigation-gap: 12px;
@@ -327,12 +330,16 @@
327
330
  --_kjun-extension-bottom-navigation-badge-offset: 4px;
328
331
  --_kjun-extension-bottom-navigation-badge-overlap: 8px;
329
332
  --_kjun-extension-bottom-navigation-badge-radius: 9999px;
333
+ --_kjun-extension-avatar-xs: 24px;
330
334
  --_kjun-extension-avatar-sm: 32px;
331
335
  --_kjun-extension-avatar-md: 40px;
332
336
  --_kjun-extension-avatar-lg: 56px;
337
+ --_kjun-extension-avatar-xl: 72px;
338
+ --_kjun-extension-avatar-fallback-icon-sizes-xs: 12px;
333
339
  --_kjun-extension-avatar-fallback-icon-sizes-sm: 14px;
334
340
  --_kjun-extension-avatar-fallback-icon-sizes-md: 18px;
335
341
  --_kjun-extension-avatar-fallback-icon-sizes-lg: 24px;
342
+ --_kjun-extension-avatar-fallback-icon-sizes-xl: 32px;
336
343
  --_kjun-extension-avatar-fallback-icon-size: 18px;
337
344
  --_kjun-extension-chip-sm: 28px;
338
345
  --_kjun-extension-chip-md: 32px;
@@ -444,23 +451,25 @@
444
451
  --_kjun-extension-toast-action-gap: 8px;
445
452
  --_kjun-extension-toast-radius: 12px;
446
453
  --_kjun-extension-toast-close-radius: 6px;
447
- --_kjun-extension-alert-radius: 12px;
448
- --_kjun-extension-alert-description-gap: 4px;
454
+ --_kjun-extension-alert-radius: 16px;
455
+ --_kjun-extension-alert-description-gap: 2px;
449
456
  --_kjun-extension-alert-close-size: 28px;
450
457
  --_kjun-extension-alert-close-radius: 8px;
451
458
  --_kjun-extension-alert-actions-gap: 8px;
452
- --_kjun-extension-alert-sm-padding-x: 12px;
453
- --_kjun-extension-alert-sm-padding-y: 8px;
454
- --_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;
455
464
  --_kjun-extension-alert-sm-close-size: 24px;
456
- --_kjun-extension-alert-sm-action-gap: 8px;
457
- --_kjun-extension-alert-md-padding-x: 14px;
458
- --_kjun-extension-alert-md-padding-y: 10px;
459
- --_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;
460
469
  --_kjun-extension-alert-md-action-gap: 12px;
461
- --_kjun-extension-alert-icon-sizes-sm: 14px;
462
- --_kjun-extension-alert-icon-sizes-md: 16px;
463
- --_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;
464
473
  --_kjun-extension-table-card-padding: 12px;
465
474
  --_kjun-extension-table-card-radius: 12px;
466
475
  --_kjun-extension-table-card-gap: 8px;
@@ -706,6 +715,11 @@
706
715
  --_kjun-state-opacity-deviation-low: 0.08;
707
716
  --_kjun-state-opacity-deviation-medium: 0.14;
708
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;
709
723
  --_kjun-state-focus-width: 2px;
710
724
  --_kjun-state-focus-offset: 2px;
711
725
  --_kjun-state-focus-choice-offset: 3px;
@@ -2124,18 +2138,26 @@
2124
2138
  display: flex;
2125
2139
  align-items: flex-start;
2126
2140
  gap: var(--_kjun-extension-alert-md-gap);
2127
- border: var(--_kjun-border-default-width) solid;
2128
2141
  border-radius: var(--_kjun-extension-alert-radius);
2142
+ word-break: keep-all;
2129
2143
  padding: var(--_kjun-extension-alert-md-padding-y) var(--_kjun-extension-alert-md-padding-x);
2130
2144
  --_kjun-alert-line: var(--_kjun-type-control-line);
2131
2145
  --_kjun-alert-close: var(--_kjun-extension-alert-close-size);
2132
2146
  --_kjun-alert-action-gap: var(--_kjun-extension-alert-md-action-gap);
2133
- }
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); }
2134
2155
  .kjun-alert[data-size="sm"] {
2135
2156
  --_kjun-alert-line: var(--_kjun-type-control-small-line);
2136
2157
  --_kjun-alert-close: var(--_kjun-extension-alert-sm-close-size);
2137
2158
  --_kjun-alert-action-gap: var(--_kjun-extension-alert-sm-action-gap);
2138
2159
  gap: var(--_kjun-extension-alert-sm-gap);
2160
+ border-radius: var(--_kjun-extension-alert-sm-radius);
2139
2161
  padding: var(--_kjun-extension-alert-sm-padding-y) var(--_kjun-extension-alert-sm-padding-x);
2140
2162
  }
2141
2163
  .kjun-alert-icon {
@@ -2144,6 +2166,8 @@
2144
2166
  flex-shrink: 0;
2145
2167
  height: var(--_kjun-alert-line);
2146
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))); }
2147
2171
  .kjun-alert-content {
2148
2172
  min-height: var(--_kjun-alert-line);
2149
2173
  overflow-wrap: anywhere;
@@ -2152,15 +2176,16 @@
2152
2176
  }
2153
2177
  .kjun-alert-title {
2154
2178
  margin: 0;
2155
- font-size: var(--_kjun-type-control-size);
2156
2179
  color: var(--_kjun-color-text);
2180
+ font-size: var(--_kjun-type-control-size);
2157
2181
  line-height: var(--_kjun-type-control-line);
2158
2182
  font-weight: var(--_kjun-type-control-weight);
2159
2183
  letter-spacing: var(--_kjun-type-control-tracking);
2160
2184
  }
2185
+ /* Body copy stays on the text role: secondary gray turns muddy on tinted fills. */
2161
2186
  .kjun-alert-description {
2162
2187
  font-size: var(--_kjun-type-body-size);
2163
- color: var(--_kjun-color-text-secondary);
2188
+ color: var(--_kjun-color-text);
2164
2189
  line-height: var(--_kjun-type-body-line);
2165
2190
  font-weight: var(--_kjun-type-body-weight);
2166
2191
  letter-spacing: var(--_kjun-type-body-tracking);
@@ -2192,7 +2217,7 @@
2192
2217
  background: transparent;
2193
2218
  border: 0;
2194
2219
  padding: 0;
2195
- color: var(--_kjun-color-text-tertiary);
2220
+ color: color-mix(in srgb, var(--_kjun-color-text) calc(var(--_kjun-state-opacity-muted) * 100%), transparent);
2196
2221
  cursor: pointer;
2197
2222
  }
2198
2223
  .kjun-alert-actions {
@@ -2202,15 +2227,15 @@
2202
2227
  gap: var(--_kjun-extension-alert-actions-gap);
2203
2228
  margin-top: var(--_kjun-alert-action-gap);
2204
2229
  }
2205
- /* Secondary actions sit on the surface role so they stay clean on tinted alerts. */
2206
- .kjun-alert-actions .kjun-button[data-variant="secondary"] { background: var(--_kjun-color-surface); }
2207
- .kjun-alert-actions .kjun-button[data-variant="secondary"]:hover:not(:disabled) { background: var(--_kjun-color-hover); }
2208
- .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); }
2209
2234
  @media (hover: none), (pointer: coarse) {
2210
- .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); }
2211
2236
  }
2212
- .kjun-alert-close:hover { background: var(--_kjun-color-hover); color: var(--_kjun-color-text); }
2213
- .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); }
2214
2239
  .kjun-alert-close:focus-visible {
2215
2240
  outline: var(--_kjun-state-focus-width) solid var(--_kjun-color-focus-ring);
2216
2241
  outline-offset: var(--_kjun-state-focus-offset);
@@ -2235,6 +2260,20 @@
2235
2260
  border-radius: inherit;
2236
2261
  transition: width var(--_kjun-motion-progress) var(--_kjun-ease-out);
2237
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
+ }
2238
2277
  .kjun-progress-sub {
2239
2278
  font-size: var(--_kjun-type-caption-size);
2240
2279
  margin-top: var(--_kjun-geometry-dimension-value4);
@@ -4820,7 +4859,11 @@
4820
4859
 
4821
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)}
4822
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)}
4823
- .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%}
4824
4867
  /* A disabled row disables its actions too, so the row never reads as partly available. */
4825
4868
  .kjun-list-actions[data-disabled]{opacity:var(--_kjun-state-opacity-disabled)}
4826
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}
@@ -4828,7 +4871,7 @@
4828
4871
  /* Initials scale with the avatar (about 40% of its side) and show Latin initials in capitals. */
4829
4872
  .kjun-avatar .kjun-image-fallback{text-transform:uppercase;font-size:var(--_kjun-type-input-size);line-height:var(--_kjun-type-input-line)}
4830
4873
  .kjun-avatar[data-size=sm] .kjun-image-fallback{font-size:var(--_kjun-type-control-size);line-height:var(--_kjun-type-control-line)}
4831
- .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)}
4832
4875
  /* App colors (color/textColor) arrive as private custom properties; without them the image roles stay. */
4833
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))}
4834
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)}
@@ -5034,6 +5077,9 @@
5034
5077
  .kjun-list-description { margin-top:var(--_kjun-extension-list-description-gap); }
5035
5078
 
5036
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); }
5037
5083
 
5038
5084
  /* KjunFab: a round action pinned to the viewport's bottom end, above page content and clear of the safe area. */
5039
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}
@@ -5042,15 +5088,13 @@
5042
5088
  .kjun-fab:disabled{opacity:var(--_kjun-state-opacity-disabled);cursor:not-allowed}
5043
5089
 
5044
5090
  /* 0.14.0: plain sections, destructive rows, decorative chevrons and non-row list items share the row inset. */
5045
- .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}
5046
5092
  /* A rounded section clips its rows to the corners; row focus rings move inside so the clip does not cut them. */
5047
5093
  .kjun-list-section[data-radius]{overflow:hidden;overflow:clip}
5048
5094
  .kjun-list-section[data-radius] .kjun-list-main:focus-visible{outline-offset:var(--_kjun-state-focus-inset-offset)}
5049
5095
  .kjun-list-row[data-destructive] .kjun-list-title{color:var(--_kjun-color-danger)}
5050
5096
  .kjun-list-chevron{flex-shrink:0;color:var(--_kjun-color-text-tertiary)}
5051
- .kjun-list-item{padding:var(--_kjun-extension-list-padding);border-bottom:var(--_kjun-border-default-width) solid var(--_kjun-color-divider);min-width:0}
5052
- .kjun-list-item:last-child{border-bottom:0}
5053
- .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}
5054
5098
  .kjun-list[data-density=compact]>.kjun-list-item{padding-block:var(--_kjun-extension-list-compact-padding-y)}
5055
5099
 
5056
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;
@@ -4,6 +4,8 @@ import { type GestureResponderEvent } from "react-native";
4
4
  export interface KjunListRowProps {
5
5
  title: string;
6
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;
7
9
  leading?: ReactNode;
8
10
  trailing?: ReactNode;
9
11
  actions?: ReactNode;
@@ -19,7 +21,7 @@ export interface KjunListRowProps {
19
21
  /** Display-only content under the description (a budget bar); no buttons or links inside a pressable row. */
20
22
  children?: ReactNode;
21
23
  }
22
- 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;
23
25
  export interface KjunListSectionProps {
24
26
  title?: string;
25
27
  description?: string;
@@ -4,6 +4,8 @@ import { type GestureResponderEvent } from "react-native";
4
4
  export interface KjunListRowProps {
5
5
  title: string;
6
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;
7
9
  leading?: ReactNode;
8
10
  trailing?: ReactNode;
9
11
  actions?: ReactNode;
@@ -19,7 +21,7 @@ export interface KjunListRowProps {
19
21
  /** Display-only content under the description (a budget bar); no buttons or links inside a pressable row. */
20
22
  children?: ReactNode;
21
23
  }
22
- 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;
23
25
  export interface KjunListSectionProps {
24
26
  title?: string;
25
27
  description?: string;
@@ -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;
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from "react";
2
+ import type { SemanticTone } from "./display-primitives.cjs";
3
+ export interface KjunProgressProps {
4
+ /** null is missing data; omission keeps the zero default. */
5
+ value?: number | null;
6
+ /** Work is active but its completion percentage is unknown; takes precedence over null. */
7
+ indeterminate?: boolean;
8
+ max?: number;
9
+ size?: "sm" | "md" | "lg";
10
+ variant?: SemanticTone;
11
+ showLabel?: boolean;
12
+ label?: ReactNode;
13
+ subLabel?: ReactNode;
14
+ shape?: "bar" | "circle";
15
+ }
16
+ export declare function KjunProgress({ value, indeterminate, max, size, variant, showLabel, label, subLabel, shape, }: KjunProgressProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from "react";
2
+ import type { SemanticTone } from "./display-primitives.js";
3
+ export interface KjunProgressProps {
4
+ /** null is missing data; omission keeps the zero default. */
5
+ value?: number | null;
6
+ /** Work is active but its completion percentage is unknown; takes precedence over null. */
7
+ indeterminate?: boolean;
8
+ max?: number;
9
+ size?: "sm" | "md" | "lg";
10
+ variant?: SemanticTone;
11
+ showLabel?: boolean;
12
+ label?: ReactNode;
13
+ subLabel?: ReactNode;
14
+ shape?: "bar" | "circle";
15
+ }
16
+ export declare function KjunProgress({ value, indeterminate, max, size, variant, showLabel, label, subLabel, shape, }: KjunProgressProps): import("react/jsx-runtime").JSX.Element;
@@ -6,6 +6,10 @@ export interface KjunSliderProps {
6
6
  disabled?: boolean;
7
7
  label?: string;
8
8
  ariaLabel?: string;
9
+ /** Hides the visible value only; each thumb still reports its value to assistive technology. */
10
+ showValue?: boolean;
11
+ /** Formats the visible value and each thumb's accessible value text. Values stay numeric. */
12
+ formatValue?: (value: number) => string;
9
13
  onValueChange?: (value: number) => void;
10
14
  onChangeCommit?: (value: number) => void;
11
15
  }
@@ -6,6 +6,10 @@ export interface KjunSliderProps {
6
6
  disabled?: boolean;
7
7
  label?: string;
8
8
  ariaLabel?: string;
9
+ /** Hides the visible value only; each thumb still reports its value to assistive technology. */
10
+ showValue?: boolean;
11
+ /** Formats the visible value and each thumb's accessible value text. Values stay numeric. */
12
+ formatValue?: (value: number) => string;
9
13
  onValueChange?: (value: number) => void;
10
14
  onChangeCommit?: (value: number) => void;
11
15
  }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Color roles a soft-fill Alert paints per tone. Info has no fill role: it uses a translucent text tint so it
3
+ * stays visible on any page background; the semantic tones carry the color, titles stay on the text role.
4
+ */
5
+ export declare function alertToneRoles(tone: string): {
6
+ bg: string | null;
7
+ icon: string;
8
+ };
9
+ export declare const alertIcons: Record<string, string>;
10
+ /** Native has no color-mix: tints a hex or rgb() color with alpha, or returns undefined for other formats. */
11
+ export declare function tintColor(color: string, alpha: number): string | undefined;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Color roles a soft-fill Alert paints per tone. Info has no fill role: it uses a translucent text tint so it
3
+ * stays visible on any page background; the semantic tones carry the color, titles stay on the text role.
4
+ */
5
+ export declare function alertToneRoles(tone: string): {
6
+ bg: string | null;
7
+ icon: string;
8
+ };
9
+ export declare const alertIcons: Record<string, string>;
10
+ /** Native has no color-mix: tints a hex or rgb() color with alpha, or returns undefined for other formats. */
11
+ export declare function tintColor(color: string, alpha: number): string | undefined;
@@ -18,15 +18,21 @@ export interface DrawerFrame {
18
18
  lift: number;
19
19
  }
20
20
  /**
21
- * Keyboard events a drawer listens to. Only iOS: React Native's Android Modal window is adjustResize,
22
- * so the system already shrinks the modal and a measured root height covers it.
21
+ * Keyboard events a drawer listens to. Android reports only after the keyboard moved; edge-to-edge
22
+ * windows no longer resize for it (adjustResize), so the drawer lifts itself there too.
23
23
  */
24
24
  export declare function keyboardEvents(os: string): {
25
25
  readonly show: "keyboardWillShow";
26
26
  readonly hide: "keyboardWillHide";
27
+ } | {
28
+ readonly show: "keyboardDidShow";
29
+ readonly hide: "keyboardDidHide";
27
30
  } | null;
28
- /** The part of the window the keyboard covers; 0 when the platform already resized the window. */
29
- export declare function keyboardOverlap(windowHeight: number, keyboardScreenY: number): number;
31
+ /**
32
+ * The part of the modal root the keyboard covers. Measured against the root, a window the platform
33
+ * already resized ends at or above the keyboard and gives 0, so the drawer never lifts twice.
34
+ */
35
+ export declare function keyboardOverlap(rootHeight: number, keyboardScreenY: number): number;
30
36
  export declare function drawerFrame({ position, windowHeight, safeAreaTop, safeAreaBottom, gap, keyboard, maxHeight }: DrawerFrameInput): DrawerFrame;
31
37
  /** Web overlay variables read by the drawer CSS (tokens controls.css). */
32
38
  export declare function drawerOverlayVars({ safeAreaTop, safeAreaBottom, maxHeight }: {