@kjun-ui/native 0.6.1 → 0.7.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.
package/dist/styles.css CHANGED
@@ -686,6 +686,9 @@
686
686
  --_kjun-state-opacity-pending: 0.55;
687
687
  --_kjun-state-opacity-heat-minimum: 0.08;
688
688
  --_kjun-state-opacity-heat-maximum: 0.4;
689
+ --_kjun-state-opacity-deviation-low: 0.08;
690
+ --_kjun-state-opacity-deviation-medium: 0.14;
691
+ --_kjun-state-opacity-deviation-strong: 0.22;
689
692
  --_kjun-state-focus-width: 2px;
690
693
  --_kjun-state-focus-offset: 2px;
691
694
  --_kjun-state-focus-choice-offset: 3px;
@@ -1137,7 +1140,6 @@
1137
1140
  .kjun-scope .kjun-field--suffix { padding-right: calc(var(--_kjun-field-padding) + var(--_kjun-field-clear-size) + var(--_kjun-field-affix-gap) - var(--_kjun-border-control-width)); }
1138
1141
  .kjun-scope .kjun-input-native.kjun-field--prefix { padding-left: calc(var(--_kjun-field-padding) + var(--_kjun-input-prefix-width) + var(--_kjun-field-affix-gap) - var(--_kjun-border-control-width)); }
1139
1142
  .kjun-scope .kjun-input-native.kjun-field--suffix { padding-right: calc(var(--_kjun-field-padding) + var(--_kjun-input-suffix-width) + var(--_kjun-field-affix-gap) - var(--_kjun-border-control-width)); }
1140
- .kjun-scope .kjun-field--clearable > .kj-truncate { padding-right: calc(var(--_kjun-field-clear-size) + var(--_kjun-field-affix-gap)); }
1141
1143
  .kjun-scope .kjun-field--select { display: flex; align-items: center; justify-content: space-between; text-align: left; gap: var(--_kjun-geometry-dimension-value8); }
1142
1144
  .kjun-scope .kjun-field--textarea { height: auto; padding-top: var(--_kjun-field-textarea-padding-y); padding-bottom: var(--_kjun-field-textarea-padding-y); }
1143
1145
  .kjun-scope .kjun-field-shell { position: relative; min-width: 0; --_kjun-input-prefix-width: 0px; --_kjun-input-suffix-width: 0px; }
@@ -1160,7 +1162,7 @@
1160
1162
  .kjun-scope .kjun-form-group { margin-bottom: var(--_kjun-extension-form-item-gap); min-width: 0; }
1161
1163
  .kjun-scope .kjun-form-group:last-child { margin-bottom: 0; }
1162
1164
  /* 그리드·툴바는 부모 gap을 사용하고, 일반 문서 흐름의 기존 폼만 기본 간격을 유지한다. */
1163
- .kjun-scope :where(.kj-flex, .kj-inline-flex, .kj-grid, .kj-inline-grid, [data-kjun-layout="form"]) > .kjun-form-group { margin-bottom: 0; }
1165
+ .kjun-scope :where([data-kjun-layout="form"]) > .kjun-form-group { margin-bottom: 0; }
1164
1166
  .kjun-scope .kjun-field-menu {
1165
1167
  padding: var(--_kjun-extension-menu-padding);
1166
1168
  border: var(--_kjun-border-default-width) solid var(--_kjun-border-primary);
@@ -1382,12 +1384,12 @@
1382
1384
  .kjun-scope .kjun-type-control-large { font-size: var(--_kjun-type-control-large-size); line-height: var(--_kjun-type-control-large-line); font-weight: var(--_kjun-type-control-large-weight); letter-spacing: var(--_kjun-type-control-large-tracking); }
1383
1385
  .kjun-scope .kjun-type-section-title { font-size: var(--_kjun-type-section-title-size); line-height: var(--_kjun-type-section-title-line); font-weight: var(--_kjun-type-section-title-weight); letter-spacing: var(--_kjun-type-section-title-tracking); }
1384
1386
  .kjun-scope .kjun-type-page-title { font-size: var(--_kjun-type-page-title-size); line-height: var(--_kjun-type-page-title-line); font-weight: var(--_kjun-type-page-title-weight); letter-spacing: var(--_kjun-type-page-title-tracking); }
1385
- .kjun-scope .kjun-type-number-sm { font-size: var(--_kjun-type-number-sm-size); line-height: var(--_kjun-type-number-sm-line); font-weight: var(--_kjun-type-number-sm-weight); letter-spacing: var(--_kjun-type-number-sm-tracking); font-family: var(--font-numeric); font-variant-numeric: tabular-nums; }
1386
- .kjun-scope .kjun-type-number-md { font-size: var(--_kjun-type-number-md-size); line-height: var(--_kjun-type-number-md-line); font-weight: var(--_kjun-type-number-md-weight); letter-spacing: var(--_kjun-type-number-md-tracking); font-family: var(--font-numeric); font-variant-numeric: tabular-nums; }
1387
- .kjun-scope .kjun-type-number-lg { font-size: var(--_kjun-type-number-lg-size); line-height: var(--_kjun-type-number-lg-line); font-weight: var(--_kjun-type-number-lg-weight); letter-spacing: var(--_kjun-type-number-lg-tracking); font-family: var(--font-numeric); font-variant-numeric: tabular-nums; }
1388
- .kjun-scope .kjun-type-display-sm { font-size: var(--_kjun-type-display-sm-size); line-height: var(--_kjun-type-display-sm-line); font-weight: var(--_kjun-type-display-sm-weight); letter-spacing: var(--_kjun-type-display-sm-tracking); font-family: var(--font-numeric); font-variant-numeric: tabular-nums; }
1389
- .kjun-scope .kjun-type-display-md { font-size: var(--_kjun-type-display-md-size); line-height: var(--_kjun-type-display-md-line); font-weight: var(--_kjun-type-display-md-weight); letter-spacing: var(--_kjun-type-display-md-tracking); font-family: var(--font-numeric); font-variant-numeric: tabular-nums; }
1390
- .kjun-scope .kjun-type-display-lg { font-size: var(--_kjun-type-display-lg-size); line-height: var(--_kjun-type-display-lg-line); font-weight: var(--_kjun-type-display-lg-weight); letter-spacing: var(--_kjun-type-display-lg-tracking); font-family: var(--font-numeric); font-variant-numeric: tabular-nums; }
1387
+ .kjun-scope .kjun-type-number-sm { font-size: var(--_kjun-type-number-sm-size); line-height: var(--_kjun-type-number-sm-line); font-weight: var(--_kjun-type-number-sm-weight); letter-spacing: var(--_kjun-type-number-sm-tracking); font-family: var(--_kjun-font-numeric); font-variant-numeric: tabular-nums; }
1388
+ .kjun-scope .kjun-type-number-md { font-size: var(--_kjun-type-number-md-size); line-height: var(--_kjun-type-number-md-line); font-weight: var(--_kjun-type-number-md-weight); letter-spacing: var(--_kjun-type-number-md-tracking); font-family: var(--_kjun-font-numeric); font-variant-numeric: tabular-nums; }
1389
+ .kjun-scope .kjun-type-number-lg { font-size: var(--_kjun-type-number-lg-size); line-height: var(--_kjun-type-number-lg-line); font-weight: var(--_kjun-type-number-lg-weight); letter-spacing: var(--_kjun-type-number-lg-tracking); font-family: var(--_kjun-font-numeric); font-variant-numeric: tabular-nums; }
1390
+ .kjun-scope .kjun-type-display-sm { font-size: var(--_kjun-type-display-sm-size); line-height: var(--_kjun-type-display-sm-line); font-weight: var(--_kjun-type-display-sm-weight); letter-spacing: var(--_kjun-type-display-sm-tracking); font-family: var(--_kjun-font-numeric); font-variant-numeric: tabular-nums; }
1391
+ .kjun-scope .kjun-type-display-md { font-size: var(--_kjun-type-display-md-size); line-height: var(--_kjun-type-display-md-line); font-weight: var(--_kjun-type-display-md-weight); letter-spacing: var(--_kjun-type-display-md-tracking); font-family: var(--_kjun-font-numeric); font-variant-numeric: tabular-nums; }
1392
+ .kjun-scope .kjun-type-display-lg { font-size: var(--_kjun-type-display-lg-size); line-height: var(--_kjun-type-display-lg-line); font-weight: var(--_kjun-type-display-lg-weight); letter-spacing: var(--_kjun-type-display-lg-tracking); font-family: var(--_kjun-font-numeric); font-variant-numeric: tabular-nums; }
1391
1393
 
1392
1394
  @keyframes kjun-price-flash-up {
1393
1395
  0%, 20% {
@@ -2954,12 +2956,14 @@
2954
2956
  opacity: var(--_kjun-state-opacity-disabled);
2955
2957
  cursor: not-allowed;
2956
2958
  }
2957
- .kjun-icon-toggle svg {
2959
+ .kjun-icon-toggle svg:not([data-kjun-color-class]) {
2958
2960
  color: var(--_kjun-icon-toggle-color, currentColor);
2961
+ }
2962
+ .kjun-icon-toggle svg {
2959
2963
  transition: color var(--_kjun-motion-control) var(--_kjun-ease-out), transform var(--_kjun-motion-control) var(--_kjun-ease-out);
2960
2964
  }
2961
2965
  /* Like RefreshButton, an inactive icon darkens on hover; the selected color stays as set. */
2962
- .kjun-icon-toggle[aria-pressed="false"]:hover:not(:disabled) svg {
2966
+ .kjun-icon-toggle[aria-pressed="false"]:hover:not(:disabled) svg:not([data-kjun-color-class]) {
2963
2967
  color: var(--_kjun-color-text-secondary);
2964
2968
  }
2965
2969
  .kjun-icon-toggle:hover:not(:disabled) svg {
@@ -4126,6 +4130,22 @@
4126
4130
  }
4127
4131
  }
4128
4132
 
4133
+ /* 좁은 화면에서 보조 지표가 셋 이상이면 두 열로 감싼다. 한 줄에 몰아 숫자가 자릿수 사이에서 끊기지 않게 한다. */
4134
+ @media (width <= 400px) {
4135
+ .kjun-kpi-hero:not(.kjun-kpi-hero--sm) .kjun-kpi-hero__secondary:has(> .kjun-kpi-hero__sec-item:nth-child(3)) {
4136
+ display: grid;
4137
+ grid-template-columns: repeat(2, minmax(0, 1fr));
4138
+ row-gap: var(--_kjun-extension-kpi-hero-mobile-secondary-padding);
4139
+ }
4140
+ .kjun-kpi-hero:not(.kjun-kpi-hero--sm) .kjun-kpi-hero__secondary:has(> .kjun-kpi-hero__sec-item:nth-child(3)) > .kjun-kpi-hero__sec-item:nth-child(odd) {
4141
+ padding-left: 0;
4142
+ border-left: none;
4143
+ }
4144
+ .kjun-kpi-hero:not(.kjun-kpi-hero--sm) .kjun-kpi-hero__secondary:has(> .kjun-kpi-hero__sec-item:nth-child(3)) > .kjun-kpi-hero__sec-item:nth-child(even) {
4145
+ padding-right: 0;
4146
+ }
4147
+ }
4148
+
4129
4149
  /* size=sm — 모달, 컴팩트 카드 내부용 */
4130
4150
  .kjun-kpi-hero--sm {
4131
4151
  padding: var(--_kjun-extension-kpi-hero-sm-padding-y) var(--_kjun-extension-kpi-hero-sm-padding-x);
@@ -4167,6 +4187,14 @@
4167
4187
  }
4168
4188
  }
4169
4189
 
4190
+ /* surface="none": 앱의 카드·모달·전폭 목록 안에서는 자체 카드 표면을 그리지 않는다. 미디어 규칙보다 뒤에 두어 좁은 화면에서도 이긴다. */
4191
+ /* 클래스를 겹쳐 모바일 규칙(.kjun-kpi-hero:not(.kjun-kpi-hero--sm))보다 명시도를 높인다. */
4192
+ .kjun-kpi-hero.kjun-kpi-hero[data-surface="none"] {
4193
+ padding: 0;
4194
+ background: transparent;
4195
+ border-radius: 0;
4196
+ }
4197
+
4170
4198
  .kjun-kpi-row {
4171
4199
  display: flex;
4172
4200
  padding: var(--_kjun-extension-kpi-row-md-padding-y) var(--_kjun-extension-kpi-row-md-padding-x);
@@ -4455,6 +4483,14 @@
4455
4483
  }
4456
4484
  }
4457
4485
 
4486
+ /* surface="none": 앱의 카드·모달·전폭 목록 안에서는 자체 카드 표면을 그리지 않는다. 미디어 규칙보다 뒤에 두어 좁은 화면에서도 이긴다. */
4487
+ /* 클래스를 겹쳐 모바일 요약 규칙(.kjun-kpi-row.kjun-kpi-row--mobile-summary:not(...))과 같은 명시도로 맞춘다. */
4488
+ .kjun-kpi-row.kjun-kpi-row[data-surface="none"] {
4489
+ padding: 0;
4490
+ background: transparent;
4491
+ border-radius: 0;
4492
+ }
4493
+
4458
4494
  .kjun-card {
4459
4495
  position: relative;
4460
4496
  min-width: 0;
@@ -19,6 +19,8 @@ export interface KjunDataStateProps extends QueryDisplayProps {
19
19
  emptyIcon?: string;
20
20
  emptyActionText?: string;
21
21
  loadingText?: string;
22
+ /** Milliseconds a first load must last before its loading display shows; the box keeps its space meanwhile. */
23
+ loadingDelay?: number;
22
24
  retryText?: string;
23
25
  size?: "sm" | "md" | "lg";
24
26
  skeleton?: boolean;
@@ -31,7 +33,7 @@ export interface KjunDataStateProps extends QueryDisplayProps {
31
33
  onRetry?: () => void;
32
34
  onEmptyAction?: () => void;
33
35
  }
34
- export declare function KjunDataState({ preserveContent, refreshing, refreshError, refreshingText, loadingPadding, empty, emptyText, emptyIcon, emptyActionText, loadingText, retryText, size, skeleton, skeletonType, skeletonCount, children, loadingContent, emptyContent, errorContent, onRetry, onEmptyAction, ...query }: KjunDataStateProps): import("react/jsx-runtime").JSX.Element;
36
+ export declare function KjunDataState({ preserveContent, refreshing, refreshError, refreshingText, loadingPadding, empty, emptyText, emptyIcon, emptyActionText, loadingText, loadingDelay, retryText, size, skeleton, skeletonType, skeletonCount, children, loadingContent, emptyContent, errorContent, onRetry, onEmptyAction, ...query }: KjunDataStateProps): import("react/jsx-runtime").JSX.Element;
35
37
  export interface KjunErrorBoundaryProps {
36
38
  children: ReactNode;
37
39
  fallbackMessage?: string;
@@ -19,6 +19,8 @@ export interface KjunDataStateProps extends QueryDisplayProps {
19
19
  emptyIcon?: string;
20
20
  emptyActionText?: string;
21
21
  loadingText?: string;
22
+ /** Milliseconds a first load must last before its loading display shows; the box keeps its space meanwhile. */
23
+ loadingDelay?: number;
22
24
  retryText?: string;
23
25
  size?: "sm" | "md" | "lg";
24
26
  skeleton?: boolean;
@@ -31,7 +33,7 @@ export interface KjunDataStateProps extends QueryDisplayProps {
31
33
  onRetry?: () => void;
32
34
  onEmptyAction?: () => void;
33
35
  }
34
- export declare function KjunDataState({ preserveContent, refreshing, refreshError, refreshingText, loadingPadding, empty, emptyText, emptyIcon, emptyActionText, loadingText, retryText, size, skeleton, skeletonType, skeletonCount, children, loadingContent, emptyContent, errorContent, onRetry, onEmptyAction, ...query }: KjunDataStateProps): import("react/jsx-runtime").JSX.Element;
36
+ export declare function KjunDataState({ preserveContent, refreshing, refreshError, refreshingText, loadingPadding, empty, emptyText, emptyIcon, emptyActionText, loadingText, loadingDelay, retryText, size, skeleton, skeletonType, skeletonCount, children, loadingContent, emptyContent, errorContent, onRetry, onEmptyAction, ...query }: KjunDataStateProps): import("react/jsx-runtime").JSX.Element;
35
37
  export interface KjunErrorBoundaryProps {
36
38
  children: ReactNode;
37
39
  fallbackMessage?: string;
@@ -27,6 +27,8 @@ export interface KjunKpiHeroProps {
27
27
  secondary?: KpiValue[];
28
28
  animated?: boolean;
29
29
  size?: "md" | "sm";
30
+ /** "none" drops the card background, padding and radius, for a KPI placed inside a card, modal or full-width list. */
31
+ surface?: "card" | "none";
30
32
  aside?: ReactNode;
31
33
  formatter?: (value: number) => string;
32
34
  deltaFormatter?: (value: number, kind: "absolute" | "percent") => string;
@@ -27,6 +27,8 @@ export interface KjunKpiHeroProps {
27
27
  secondary?: KpiValue[];
28
28
  animated?: boolean;
29
29
  size?: "md" | "sm";
30
+ /** "none" drops the card background, padding and radius, for a KPI placed inside a card, modal or full-width list. */
31
+ surface?: "card" | "none";
30
32
  aside?: ReactNode;
31
33
  formatter?: (value: number) => string;
32
34
  deltaFormatter?: (value: number, kind: "absolute" | "percent") => string;
@@ -25,8 +25,10 @@ export interface KjunKpiRowProps {
25
25
  loading?: boolean;
26
26
  items: KpiRowItem[];
27
27
  size?: "md" | "sm";
28
+ /** "none" drops the card background, padding and radius, for a KPI placed inside a card, modal or full-width list. */
29
+ surface?: "card" | "none";
28
30
  mobileSummary?: boolean;
29
31
  onItemClick?: (item: KpiRowItem, index: number) => void;
30
32
  renderValue?: (item: KpiRowItem, index: number) => ReactNode;
31
33
  }
32
- export declare function KjunKpiRow({ loading, items, size, mobileSummary, onItemClick, renderValue, }: KjunKpiRowProps): import("react/jsx-runtime").JSX.Element;
34
+ export declare function KjunKpiRow({ loading, items, size, surface, mobileSummary, onItemClick, renderValue, }: KjunKpiRowProps): import("react/jsx-runtime").JSX.Element;
@@ -25,8 +25,10 @@ export interface KjunKpiRowProps {
25
25
  loading?: boolean;
26
26
  items: KpiRowItem[];
27
27
  size?: "md" | "sm";
28
+ /** "none" drops the card background, padding and radius, for a KPI placed inside a card, modal or full-width list. */
29
+ surface?: "card" | "none";
28
30
  mobileSummary?: boolean;
29
31
  onItemClick?: (item: KpiRowItem, index: number) => void;
30
32
  renderValue?: (item: KpiRowItem, index: number) => ReactNode;
31
33
  }
32
- export declare function KjunKpiRow({ loading, items, size, mobileSummary, onItemClick, renderValue, }: KjunKpiRowProps): import("react/jsx-runtime").JSX.Element;
34
+ export declare function KjunKpiRow({ loading, items, size, surface, mobileSummary, onItemClick, renderValue, }: KjunKpiRowProps): import("react/jsx-runtime").JSX.Element;
@@ -17,6 +17,11 @@ export interface MarketBaseProps<Row extends object> extends QueryDisplayProps {
17
17
  subMeta?: (row: Row) => string;
18
18
  emptyMessage?: string;
19
19
  emptySubMessage?: string;
20
+ /** false shows the shared spinner and loadingText instead of the skeleton. Default true. */
21
+ skeleton?: boolean;
22
+ loadingText?: string;
23
+ /** Milliseconds a first load must last before its loading display shows. */
24
+ loadingDelay?: number;
20
25
  showFooter?: boolean;
21
26
  calculatedAt?: string | null;
22
27
  footerNote?: string;
@@ -17,6 +17,11 @@ export interface MarketBaseProps<Row extends object> extends QueryDisplayProps {
17
17
  subMeta?: (row: Row) => string;
18
18
  emptyMessage?: string;
19
19
  emptySubMessage?: string;
20
+ /** false shows the shared spinner and loadingText instead of the skeleton. Default true. */
21
+ skeleton?: boolean;
22
+ loadingText?: string;
23
+ /** Milliseconds a first load must last before its loading display shows. */
24
+ loadingDelay?: number;
20
25
  showFooter?: boolean;
21
26
  calculatedAt?: string | null;
22
27
  footerNote?: string;
@@ -1,2 +1,2 @@
1
1
  import type { TableCardsProps } from "../../../shared/package-runtime/table-presentation.cjs";
2
- export declare function TableCards<Row extends object>({ initialLoading, skeletonRows, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, layout }: TableCardsProps<Row>): import("react/jsx-runtime").JSX.Element;
2
+ export declare function TableCards<Row extends object>({ initialLoading, skeletonRows, skeletonHidden, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, layout }: TableCardsProps<Row>): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { TableCardsProps } from "../../../shared/package-runtime/table-presentation.js";
2
- export declare function TableCards<Row extends object>({ initialLoading, skeletonRows, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, layout }: TableCardsProps<Row>): import("react/jsx-runtime").JSX.Element;
2
+ export declare function TableCards<Row extends object>({ initialLoading, skeletonRows, skeletonHidden, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, layout }: TableCardsProps<Row>): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { TableGridProps } from "../../../shared/package-runtime/table-presentation.cjs";
2
- export declare function TableGrid<Row extends object>({ initialLoading, skeletonRows, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, visible, maxHeight, stickyHeader, sortable, compact, striped, hoverable }: TableGridProps<Row, number>): import("react/jsx-runtime").JSX.Element;
2
+ export declare function TableGrid<Row extends object>({ initialLoading, skeletonRows, skeletonHidden, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, visible, maxHeight, stickyHeader, sortable, compact, striped, hoverable }: TableGridProps<Row, number>): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  import type { TableGridProps } from "../../../shared/package-runtime/table-presentation.js";
2
- export declare function TableGrid<Row extends object>({ initialLoading, skeletonRows, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, visible, maxHeight, stickyHeader, sortable, compact, striped, hoverable }: TableGridProps<Row, number>): import("react/jsx-runtime").JSX.Element;
2
+ export declare function TableGrid<Row extends object>({ initialLoading, skeletonRows, skeletonHidden, state, onRowClick, selectable, checkbox, cell, expandable, expand, renderExpand, emptyContent, emptyText, visible, maxHeight, stickyHeader, sortable, compact, striped, hoverable }: TableGridProps<Row, number>): import("react/jsx-runtime").JSX.Element;
@@ -18,6 +18,8 @@ export declare function tableCellValue<Row extends object>(props: TableProps<Row
18
18
  export interface TableRowsProps<Row extends object> {
19
19
  initialLoading: boolean;
20
20
  skeletonRows: number;
21
+ /** A loadingDelay is still running: the skeleton keeps its space but stays out of sight. */
22
+ skeletonHidden?: boolean;
21
23
  state: Pick<ReturnType<typeof useTableModel<Row>>, "rows" | "key" | "expanded" | "selectedRow">;
22
24
  onRowClick: TableProps<Row>["onRowClick"];
23
25
  selectable: boolean;
@@ -18,6 +18,8 @@ export declare function tableCellValue<Row extends object>(props: TableProps<Row
18
18
  export interface TableRowsProps<Row extends object> {
19
19
  initialLoading: boolean;
20
20
  skeletonRows: number;
21
+ /** A loadingDelay is still running: the skeleton keeps its space but stays out of sight. */
22
+ skeletonHidden?: boolean;
21
23
  state: Pick<ReturnType<typeof useTableModel<Row>>, "rows" | "key" | "expanded" | "selectedRow">;
22
24
  onRowClick: TableProps<Row>["onRowClick"];
23
25
  selectable: boolean;
@@ -38,6 +38,11 @@ export interface TableProps<Row extends object = Record<string, unknown>, MaxHei
38
38
  data?: Row[];
39
39
  rowKey?: string;
40
40
  skeletonRows?: number;
41
+ /** false shows the shared spinner and loadingText instead of skeleton rows. Default true. */
42
+ skeleton?: boolean;
43
+ loadingText?: string;
44
+ /** Milliseconds a first load must last before its loading display shows. */
45
+ loadingDelay?: number;
41
46
  emptyText?: string;
42
47
  sortable?: boolean;
43
48
  sort?: TableSort | null;
@@ -38,6 +38,11 @@ export interface TableProps<Row extends object = Record<string, unknown>, MaxHei
38
38
  data?: Row[];
39
39
  rowKey?: string;
40
40
  skeletonRows?: number;
41
+ /** false shows the shared spinner and loadingText instead of skeleton rows. Default true. */
42
+ skeleton?: boolean;
43
+ loadingText?: string;
44
+ /** Milliseconds a first load must last before its loading display shows. */
45
+ loadingDelay?: number;
41
46
  emptyText?: string;
42
47
  sortable?: boolean;
43
48
  sort?: TableSort | null;
@@ -0,0 +1,2 @@
1
+ /** True once a loading state has lasted `delay` ms, so a fast result never flashes the loading display. Always true without a delay. */
2
+ export declare function useLoadingReveal(active: boolean, delay?: number): boolean;
@@ -0,0 +1,2 @@
1
+ /** True once a loading state has lasted `delay` ms, so a fast result never flashes the loading display. Always true without a delay. */
2
+ export declare function useLoadingReveal(active: boolean, delay?: number): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kjun-ui/native",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://ui.kjun.dev",
6
6
  "repository": {
@@ -47,8 +47,8 @@
47
47
  "./package.json": "./package.json"
48
48
  },
49
49
  "dependencies": {
50
- "@kjun-ui/tokens": "0.6.1",
51
- "@kjun-ui/icons": "0.6.1"
50
+ "@kjun-ui/tokens": "0.7.0",
51
+ "@kjun-ui/icons": "0.7.0"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "react": "^19.2.3",