@flood-md/react 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,169 @@
1
1
  @import "@flood-md/tokens/foundations.css";
2
2
 
3
+ .flood-root .flood-container { box-sizing: border-box; inline-size: 100%; max-inline-size: var(--flood-container-max); min-inline-size: 0; margin-inline: auto; padding-inline: var(--flood-container-gutter); }
4
+ .flood-root .flood-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--flood-grid-min, var(--flood-sys-size-grid-min-item))), 1fr)); gap: var(--flood-layout-gap); min-inline-size: 0; }
5
+ .flood-root .flood-grid > * { min-inline-size: 0; }
6
+ .flood-root .flood-aspect-ratio { position: relative; inline-size: 100%; min-inline-size: 0; }
7
+ .flood-root .flood-aspect-ratio__content { position: absolute; inset: 0; min-inline-size: 0; }
8
+ .flood-root .flood-aspect-ratio__content > :is(img, video, iframe) { display: block; inline-size: 100%; block-size: 100%; }
9
+ .flood-root .flood-image { display: block; max-inline-size: 100%; block-size: auto; object-fit: cover; }
10
+ .flood-root .flood-image[data-fit="contain"] { object-fit: contain; }
11
+ .flood-root .flood-list { display: grid; gap: var(--flood-layout-gap); margin: 0; padding-inline-start: var(--flood-sys-space-6); font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); overflow-wrap: anywhere; }
12
+ .flood-root .flood-list[data-marker="false"] { list-style: none; padding: 0; }
13
+ .flood-root .flood-empty-state { box-sizing: border-box; align-items: center; text-align: center; padding-block: var(--flood-sys-space-8); padding-inline: min(var(--flood-sys-space-8), 8%); }
14
+ .flood-root .flood-empty-state[data-density="compact"] { padding-block: var(--flood-sys-space-6); padding-inline: min(var(--flood-sys-space-6), 8%); }
15
+ .flood-root .flood-empty-state__icon { padding: var(--flood-sys-space-3); border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-surface-default); }
16
+ .flood-root .flood-empty-state__actions { justify-content: center; }
17
+ .flood-root :is(.flood-container, .flood-grid, .flood-aspect-ratio, .flood-list, .flood-image, .flood-empty-state)[hidden] { display: none; }
18
+
19
+ .flood-root .flood-card { display: flex; flex-direction: column; gap: var(--flood-sys-space-4); overflow-wrap: anywhere; }
20
+ .flood-root .flood-card[data-density="compact"] { gap: var(--flood-sys-space-3); }
21
+ .flood-root .flood-card__header { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--flood-sys-space-3); min-inline-size: 0; }
22
+ .flood-root .flood-card__intro { display: grid; gap: var(--flood-sys-space-1); flex: 1 1 12rem; min-inline-size: 0; }
23
+ .flood-root .flood-card__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--flood-sys-space-2); min-inline-size: 0; max-inline-size: 100%; }
24
+ .flood-root :is(.flood-card__body, .flood-card__footer) { min-inline-size: 0; }
25
+ .flood-root .flood-card__footer { margin-block-start: auto; border-block-start: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); padding-block-start: var(--flood-sys-space-4); }
26
+ .flood-root .flood-card[data-density="compact"] > .flood-card__footer { padding-block-start: var(--flood-sys-space-3); }
27
+ .flood-root .flood-card > .flood-card__footer:only-child { border: 0; padding: 0; }
28
+ .flood-root .flood-card[hidden] { display: none; }
29
+ @media (forced-colors: active) { .flood-root .flood-card { border: var(--flood-sys-stroke-width) solid CanvasText; background: Canvas !important; color: CanvasText; } }
30
+
31
+ .flood-root .flood-kbd { display: inline-flex; flex: none; align-items: center; justify-content: center; vertical-align: middle; box-sizing: border-box; min-inline-size: var(--flood-sys-size-keycap-sm); min-block-size: var(--flood-sys-size-keycap-sm); padding-inline: var(--flood-sys-space-1); border: var(--flood-sys-stroke-width) solid var(--flood-sys-color-border-decorative); border-radius: var(--flood-sys-radius-indicator); background: var(--flood-sys-color-surface-default); color: var(--flood-sys-color-content-subtle); font-family: var(--flood-sys-font-mono); font-size: var(--flood-sys-type-helper-size); font-weight: var(--flood-sys-type-helper-weight); line-height: var(--flood-sys-type-helper-line-height); white-space: nowrap; }
32
+ .flood-root .flood-kbd[data-size="md"] { min-inline-size: var(--flood-sys-size-keycap-md); min-block-size: var(--flood-sys-size-keycap-md); font-size: var(--flood-sys-type-compact-size); }
33
+ .flood-root .flood-kbd[data-size="lg"] { min-inline-size: var(--flood-sys-size-keycap-lg); min-block-size: var(--flood-sys-size-keycap-lg); font-size: var(--flood-sys-type-body-size); }
34
+ .flood-root .flood-toolbar { display: inline-flex; flex-wrap: wrap; align-items: center; gap: var(--flood-sys-space-1); box-sizing: border-box; inline-size: fit-content; max-inline-size: 100%; min-inline-size: 0; padding: var(--flood-sys-space-1); border: var(--flood-sys-stroke-width) solid var(--flood-sys-color-border-decorative); border-radius: var(--flood-sys-radius-field); background: var(--flood-sys-color-surface-default); }
35
+ .flood-root .flood-toolbar[data-orientation="vertical"] { flex-direction: column; align-items: stretch; }
36
+ .flood-root .flood-toolbar:focus-visible { outline: var(--flood-sys-focus-width) solid var(--flood-sys-color-focus-ring); outline-offset: calc(-1 * var(--flood-sys-focus-width)); }
37
+ .flood-root .flood-toolbar[data-orientation="horizontal"] > .flood-divider { align-self: stretch; inline-size: var(--flood-sys-stroke-width); block-size: auto; border: 0; border-inline-start: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); margin-inline: var(--flood-sys-space-1); margin-block: var(--flood-sys-space-1); }
38
+ .flood-root .flood-toolbar[data-orientation="vertical"] > .flood-divider { align-self: stretch; inline-size: 100%; block-size: var(--flood-sys-stroke-width); border: 0; border-block-start: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); margin-block: var(--flood-sys-space-1); }
39
+ .flood-root :is(.flood-kbd, .flood-toolbar)[hidden] { display: none; }
40
+ @media (forced-colors: active) { .flood-root :is(.flood-kbd, .flood-toolbar) { color: CanvasText; background: Canvas; border-color: CanvasText; } }
41
+
42
+ .flood-root .flood-overlay-panel.flood-menu { inline-size: 15rem; padding: var(--flood-sys-space-1); column-gap: var(--flood-sys-space-2); overflow: visible; }
43
+ .flood-root .flood-menu__viewport { max-block-size: min(22rem, max(0px, calc(var(--flood-overlay-available-height, 100dvh - 1rem) - 2 * var(--flood-sys-space-1) - 2 * var(--flood-sys-stroke-width)))); }
44
+ .flood-root .flood-menu .flood-menu__item { inline-size: 100%; justify-content: flex-start; text-align: start; gap: var(--flood-sys-space-2); border-radius: max(0px, calc(var(--flood-sys-radius-field) - var(--flood-sys-space-1) - var(--flood-sys-stroke-width))); white-space: normal; }
45
+ .flood-root .flood-menu .flood-menu__item:focus { background: var(--flood-sys-color-action-on-surface-hover); }
46
+ .flood-root .flood-menu .flood-menu__item:focus-visible { outline-offset: calc(-1 * var(--flood-sys-focus-width)); }
47
+ .flood-root .flood-menu .flood-menu__item[data-tone="danger"] { color: var(--flood-sys-color-action-danger-content); }
48
+ .flood-root .flood-menu .flood-menu__item[aria-disabled="true"] { color: var(--flood-sys-color-field-disabled-content); cursor: default; }
49
+ .flood-root .flood-menu__icon { display: inline-flex; align-items: center; justify-content: center; flex: none; inline-size: var(--flood-control-icon); block-size: var(--flood-control-icon); }
50
+ .flood-root .flood-menu__icon > svg { inline-size: 100%; block-size: 100%; }
51
+ .flood-root .flood-menu__label { min-inline-size: 0; overflow-wrap: anywhere; }
52
+ .flood-root .flood-menu__shortcut { margin-inline-start: auto; flex: none; color: var(--flood-sys-color-content-subtle); font-size: var(--flood-sys-type-helper-size); white-space: nowrap; }
53
+ .flood-root .flood-menu__separator { block-size: var(--flood-sys-stroke-width); margin: var(--flood-sys-space-1) var(--flood-sys-space-2); background: var(--flood-sys-color-divider-decorative); }
54
+ @media (forced-colors: active) {
55
+ .flood-root .flood-overlay-panel.flood-menu { background: Canvas; border-color: CanvasText; }
56
+ .flood-root .flood-menu .flood-menu__item[data-tone="danger"] { color: CanvasText; }
57
+ .flood-root .flood-menu .flood-menu__item:focus { forced-color-adjust: none; background: Highlight; color: HighlightText; }
58
+ .flood-root .flood-menu .flood-menu__item[aria-disabled="true"] { color: GrayText; }
59
+ .flood-root .flood-menu__shortcut { color: inherit; }
60
+ .flood-root .flood-menu__separator { background: CanvasText; }
61
+ }
62
+
63
+ .flood-root .flood-description-list { --flood-data-padding: var(--flood-sys-space-2); container: flood-description / inline-size; box-sizing: border-box; min-inline-size: 0; inline-size: 100%; margin: 0; color: var(--flood-sys-color-content-default); font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); }
64
+ .flood-root .flood-description-list[data-density="comfortable"] { --flood-data-padding: var(--flood-sys-space-3); }
65
+ .flood-root .flood-description-list__item { display: grid; grid-template-columns: minmax(0, min(10rem, 35%)) minmax(0, 1fr); column-gap: var(--flood-sys-space-3); row-gap: var(--flood-sys-space-1); padding-block: var(--flood-data-padding); }
66
+ .flood-root .flood-description-list__item:first-child { padding-block-start: 0; }
67
+ .flood-root .flood-description-list__item:last-child { padding-block-end: 0; }
68
+ .flood-root .flood-description-list[data-dividers="true"] > .flood-description-list__item + .flood-description-list__item { border-block-start: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); }
69
+ .flood-root .flood-description-list :is(dt, dd) { margin: 0; min-inline-size: 0; overflow-wrap: anywhere; }
70
+ .flood-root .flood-description-list dt { color: var(--flood-sys-color-content-subtle); }
71
+ .flood-root .flood-description-list[data-layout="stacked"] > .flood-description-list__item { grid-template-columns: minmax(0, 1fr); }
72
+ @container flood-description (max-width: 22rem) { .flood-root .flood-description-list__item { grid-template-columns: minmax(0, 1fr); } }
73
+ .flood-root .flood-table-container { min-inline-size: 0; max-inline-size: 100%; inline-size: 100%; }
74
+ .flood-root .flood-table { --flood-data-padding: var(--flood-sys-space-3); inline-size: 100%; border-collapse: collapse; border-spacing: 0; text-align: start; color: var(--flood-sys-color-content-default); font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); }
75
+ .flood-root .flood-table[data-density="compact"] { --flood-data-padding: var(--flood-sys-space-2); }
76
+ .flood-root .flood-table caption { text-align: start; padding-block-end: var(--flood-sys-space-3); font-weight: var(--flood-sys-type-label-weight); color: var(--flood-sys-color-content-default); }
77
+ .flood-root .flood-table :is(th, td) { text-align: start; vertical-align: top; padding: var(--flood-data-padding) var(--flood-sys-space-3); overflow-wrap: anywhere; }
78
+ .flood-root .flood-table th { font-weight: var(--flood-sys-type-label-weight); }
79
+ .flood-root .flood-table thead th { color: var(--flood-sys-color-content-subtle); border-block-end: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); }
80
+ .flood-root .flood-table tbody > tr:not(:last-child) > :is(th, td) { border-block-end: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); }
81
+ .flood-root .flood-table tfoot > tr:first-child > :is(th, td) { border-block-start: var(--flood-sys-stroke-width) solid var(--flood-sys-color-divider-decorative); }
82
+ .flood-root .flood-table tfoot { background: color-mix(in srgb, var(--flood-sys-color-content-default) 8%, transparent); }
83
+ .flood-root .flood-table tfoot :is(th, td) { font-weight: var(--flood-sys-type-label-weight); }
84
+ .flood-root .flood-table[data-striped="true"] tbody > tr:nth-child(even) { background: color-mix(in srgb, var(--flood-sys-color-content-default) 4%, transparent); }
85
+ .flood-root .flood-table [data-numeric] { text-align: end; font-variant-numeric: tabular-nums; white-space: nowrap; }
86
+ .flood-root .flood-table [data-align="center"] { text-align: center; }
87
+ .flood-root .flood-table [data-align="end"] { text-align: end; }
88
+ .flood-root .flood-table [data-align="start"] { text-align: start; }
89
+ .flood-root :is(.flood-description-list, .flood-table-container, .flood-table)[hidden] { display: none; }
90
+ @media (forced-colors: active) {
91
+ .flood-root .flood-table[data-striped="true"] tbody > tr:nth-child(even) { background: Canvas; }
92
+ .flood-root .flood-table tfoot { background: Canvas; }
93
+ .flood-root .flood-table :is(th, td), .flood-root .flood-description-list[data-dividers="true"] > .flood-description-list__item { border-color: CanvasText; }
94
+ }
95
+
96
+ .flood-root .flood-indicator { --flood-indicator-color: var(--flood-sys-color-indicator-fill); --flood-indicator-size: var(--flood-sys-size-indicator-md); position: relative; min-inline-size: 0; inline-size: 100%; box-sizing: border-box; }
97
+ .flood-root .flood-indicator[data-size="sm"] { --flood-indicator-size: var(--flood-sys-size-indicator-sm); }
98
+ .flood-root .flood-indicator[data-size="lg"] { --flood-indicator-size: var(--flood-sys-size-indicator-lg); }
99
+ .flood-root .flood-indicator[data-tone="accent"] { --flood-indicator-color: var(--flood-sys-color-indicator-accent); }
100
+ .flood-root .flood-indicator[data-tone="error"] { --flood-indicator-color: var(--flood-sys-color-feedback-error); }
101
+ .flood-root .flood-indicator[data-tone="warning"] { --flood-indicator-color: var(--flood-sys-color-feedback-warning); }
102
+ .flood-root .flood-indicator[data-tone="success"] { --flood-indicator-color: var(--flood-sys-color-feedback-success); }
103
+ .flood-root .flood-indicator[data-tone="info"] { --flood-indicator-color: var(--flood-sys-color-feedback-info); }
104
+ .flood-root .flood-indicator__caption { display: flex; justify-content: space-between; align-items: baseline; gap: var(--flood-sys-space-3); margin-block-end: var(--flood-sys-space-2); font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); overflow-wrap: anywhere; }
105
+ .flood-root .flood-indicator__value { color: var(--flood-sys-color-content-subtle); text-align: end; font-variant-numeric: tabular-nums; }
106
+ .flood-root .flood-indicator__track { display: flex; block-size: var(--flood-indicator-size); overflow: hidden; border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-indicator-track); }
107
+ .flood-root .flood-indicator__fill { display: block; flex: none; block-size: 100%; border-radius: inherit; background: var(--flood-indicator-color); transition: inline-size var(--flood-sys-motion-duration-normal) var(--flood-sys-motion-easing); }
108
+ .flood-root .flood-indicator[data-indeterminate="true"] .flood-indicator__fill { inline-size: 100%; background: linear-gradient(90deg, transparent, var(--flood-indicator-color), transparent); background-size: 200% 100%; animation: flood-indeterminate 1.4s linear infinite; }
109
+ @keyframes flood-indeterminate { from { background-position: 200% 0; } to { background-position: -200% 0; } }
110
+ .flood-root .flood-alert { --flood-alert-color: var(--flood-sys-color-content-subtle); position: relative; display: flex; align-items: flex-start; gap: var(--flood-sys-space-3); box-sizing: border-box; min-inline-size: 0; padding: var(--flood-sys-space-4); border: var(--flood-sys-stroke-width) solid var(--flood-sys-color-border-decorative); border-radius: var(--flood-sys-radius-field); background: color-mix(in srgb, var(--flood-alert-color) 4%, var(--flood-sys-color-surface-canvas)); color: var(--flood-sys-color-content-default); }
111
+ .flood-root .flood-alert[data-tone="info"] { --flood-alert-color: var(--flood-sys-color-feedback-info); }
112
+ .flood-root .flood-alert[data-tone="success"] { --flood-alert-color: var(--flood-sys-color-feedback-success); }
113
+ .flood-root .flood-alert[data-tone="warning"] { --flood-alert-color: var(--flood-sys-color-feedback-warning); }
114
+ .flood-root .flood-alert[data-tone="error"] { --flood-alert-color: var(--flood-sys-color-feedback-error); }
115
+ .flood-root .flood-alert__icon { display: inline-flex; flex: none; inline-size: var(--flood-sys-control-md-icon-size); block-size: var(--flood-sys-control-md-icon-size); color: var(--flood-alert-color); }
116
+ .flood-root .flood-alert__icon > svg { inline-size: 100%; block-size: 100%; }
117
+ .flood-root .flood-alert__content { flex: 1 1 auto; min-inline-size: 0; overflow-wrap: anywhere; font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); }
118
+ .flood-root .flood-alert__title { margin: 0; font: inherit; font-weight: var(--flood-sys-type-label-weight); }
119
+ .flood-root .flood-alert__title + .flood-alert__body { margin-block-start: var(--flood-sys-space-1); }
120
+ .flood-root .flood-alert__body { color: var(--flood-sys-color-content-subtle); }
121
+ .flood-root .flood-alert__body > :first-child { margin-block-start: 0; }
122
+ .flood-root .flood-alert__body > :last-child { margin-block-end: 0; }
123
+ .flood-root :is(.flood-alert, .flood-indicator)[hidden] { display: none; }
124
+ @media (prefers-reduced-motion: reduce) {
125
+ .flood-root .flood-indicator__fill { transition: none; }
126
+ .flood-root .flood-indicator[data-indeterminate="true"] .flood-indicator__fill { animation: none; background: var(--flood-indicator-color); inline-size: 35%; }
127
+ }
128
+ @media (forced-colors: active) {
129
+ .flood-root .flood-indicator__track { forced-color-adjust: none; background: Canvas; outline: 1px solid CanvasText; }
130
+ .flood-root .flood-indicator__fill { forced-color-adjust: none; background: Highlight; }
131
+ .flood-root .flood-indicator[data-indeterminate="true"] .flood-indicator__fill { animation: none; background: Highlight; inline-size: 35%; }
132
+ .flood-root .flood-alert { background: Canvas; color: CanvasText; border-color: CanvasText; }
133
+ .flood-root :is(.flood-alert__icon, .flood-alert__body) { color: CanvasText; }
134
+ }
135
+
136
+ .flood-root .flood-badge { --flood-badge-color: var(--flood-sys-color-content-default); display: inline-flex; align-items: center; vertical-align: middle; gap: var(--flood-sys-space-1); box-sizing: border-box; max-inline-size: 100%; min-inline-size: 0; padding: var(--flood-sys-space-1) var(--flood-sys-space-2); border: var(--flood-sys-stroke-width) solid transparent; border-radius: var(--flood-sys-radius-action); background: color-mix(in srgb, var(--flood-badge-color) 9%, var(--flood-sys-color-surface-canvas)); color: var(--flood-badge-color); font-size: var(--flood-sys-type-helper-size); line-height: var(--flood-sys-type-helper-line-height); font-weight: var(--flood-sys-type-label-weight); letter-spacing: var(--flood-sys-type-helper-tracking); overflow-wrap: anywhere; }
137
+ .flood-root .flood-badge[data-size="sm"] { padding-block: 0; }
138
+ .flood-root .flood-badge[data-size="lg"] { padding-inline: var(--flood-sys-space-3); font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); }
139
+ .flood-root .flood-badge[data-tone="accent"] { --flood-badge-color: var(--flood-sys-color-accent-content); }
140
+ .flood-root .flood-badge[data-tone="error"] { --flood-badge-color: var(--flood-sys-color-feedback-error); }
141
+ .flood-root .flood-badge[data-tone="warning"] { --flood-badge-color: var(--flood-sys-color-feedback-warning); }
142
+ .flood-root .flood-badge[data-tone="success"] { --flood-badge-color: var(--flood-sys-color-feedback-success); }
143
+ .flood-root .flood-badge[data-tone="info"] { --flood-badge-color: var(--flood-sys-color-feedback-info); }
144
+ .flood-root .flood-badge[data-variant="outline"] { background: transparent; border-color: color-mix(in srgb, var(--flood-badge-color) 25%, var(--flood-sys-color-border-decorative)); }
145
+ .flood-root .flood-badge > svg { flex: none; inline-size: 1em; block-size: 1em; }
146
+ .flood-root .flood-skeleton { display: block; flex: none; box-sizing: border-box; inline-size: 100%; block-size: 1rem; max-inline-size: 100%; border-radius: var(--flood-sys-radius-indicator); background: var(--flood-sys-color-loading-placeholder); }
147
+ .flood-root .flood-skeleton[data-shape="rounded"] { block-size: 6rem; border-radius: var(--flood-sys-radius-field); }
148
+ .flood-root .flood-skeleton[data-shape="circle"] { inline-size: 2.5rem; block-size: 2.5rem; border-radius: var(--flood-sys-radius-action); }
149
+ .flood-root .flood-skeleton[data-animate="true"] { animation: flood-skeleton-pulse 1.8s ease-in-out infinite; }
150
+ @keyframes flood-skeleton-pulse { 50% { opacity: .5; } }
151
+ .flood-root .flood-avatar { --flood-avatar-size: var(--flood-sys-control-md-height); position: relative; display: inline-grid; place-items: center; vertical-align: middle; flex: none; inline-size: var(--flood-avatar-size); block-size: var(--flood-avatar-size); box-sizing: border-box; overflow: hidden; border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-surface-overlay); color: var(--flood-sys-color-content-subtle); font-size: var(--flood-sys-type-compact-size); font-weight: var(--flood-sys-type-label-weight); line-height: 1; user-select: none; }
152
+ .flood-root .flood-avatar[data-size="sm"] { --flood-avatar-size: var(--flood-sys-control-sm-height); font-size: var(--flood-sys-type-helper-size); }
153
+ .flood-root .flood-avatar[data-size="lg"] { --flood-avatar-size: var(--flood-sys-control-xl-height); }
154
+ .flood-root .flood-avatar[data-shape="rounded"] { border-radius: var(--flood-sys-radius-field); }
155
+ .flood-avatar__fallback { max-inline-size: 100%; overflow: hidden; white-space: nowrap; }
156
+ .flood-root .flood-avatar .flood-avatar__image { position: absolute; inset: 0; inline-size: 100%; block-size: 100%; object-fit: cover; opacity: 0; }
157
+ .flood-root .flood-avatar .flood-avatar__image[data-ready="true"] { opacity: 1; }
158
+ .flood-root :is(.flood-badge, .flood-skeleton, .flood-avatar)[hidden] { display: none; }
159
+ @media (prefers-reduced-motion: reduce) { .flood-root .flood-skeleton[data-animate="true"] { animation: none; } }
160
+ @media (forced-colors: active) {
161
+ .flood-root :is(.flood-badge, .flood-avatar) { color: CanvasText; background: Canvas; border: 1px solid CanvasText; }
162
+ .flood-root .flood-skeleton { background: GrayText; animation: none; }
163
+ }
164
+
3
165
  /* Keep real labels in the accessibility tree while removing their layout box. */
4
- .flood-visually-hidden { position: absolute; inline-size: 1px; block-size: 1px; padding: 0; margin: 0; border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
166
+ .flood-visually-hidden, .flood-visually-hidden--focusable:not(:focus-within):not([data-flood-focus-held]) { position: absolute; inline-size: 1px; block-size: 1px; padding: 0; margin: 0; border: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
5
167
  .flood-field[data-hide-label="true"], .flood-fieldset[data-hide-label="true"] { position: relative; }
6
168
 
7
169
  .flood-root .flood-tabs { display: grid; grid-template-rows: auto 1fr; min-inline-size: 0; box-sizing: border-box; overflow: clip; border: var(--flood-sys-stroke-width) solid var(--flood-sys-color-border-decorative); border-radius: var(--flood-sys-radius-field); background: var(--flood-sys-color-surface-default); }
@@ -19,7 +181,9 @@
19
181
  .flood-root .flood-tabs__panel:focus-visible { outline: var(--flood-sys-focus-width) solid var(--flood-sys-color-focus-ring); outline-offset: calc(-1 * var(--flood-sys-focus-width)); }
20
182
  .flood-root :is(.flood-breadcrumb, .flood-pagination) { min-inline-size: 0; max-inline-size: 100%; font-size: var(--flood-sys-type-compact-size); line-height: var(--flood-sys-type-compact-line-height); }
21
183
  .flood-root :is(.flood-breadcrumb ol, .flood-pagination ul) { display: flex; flex-wrap: wrap; align-items: center; padding: 0; margin: 0; list-style: none; gap: var(--flood-sys-space-2); }
22
- .flood-root .flood-breadcrumb li { display: inline-flex; align-items: center; gap: var(--flood-sys-space-2); min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; }
184
+ .flood-root .flood-breadcrumb { inline-size: max-content; }
185
+ .flood-root .flood-breadcrumb li { display: inline-flex; align-items: center; flex: 0 0 auto; inline-size: max-content; gap: var(--flood-sys-space-2); min-inline-size: 0; max-inline-size: 100%; overflow-wrap: anywhere; }
186
+ .flood-root .flood-breadcrumb li > :not(.flood-breadcrumb__separator) { min-inline-size: 0; }
23
187
  .flood-root .flood-breadcrumb a { display: inline-flex; align-items: center; min-block-size: var(--flood-sys-control-sm-height); color: var(--flood-sys-color-content-subtle); text-decoration: none; }
24
188
  .flood-root .flood-breadcrumb a:hover { text-decoration: underline; }
25
189
  .flood-root .flood-breadcrumb [aria-current="page"] { color: var(--flood-sys-color-content-default); }
@@ -31,7 +195,7 @@
31
195
  .flood-root .flood-pagination .flood-page[aria-current="page"] { background: var(--flood-sys-color-selection-background); color: var(--flood-sys-color-selection-content); }
32
196
  .flood-root .flood-pagination .flood-page:is(:disabled, [aria-disabled="true"]) { color: var(--flood-sys-color-field-disabled-content); cursor: default; }
33
197
  .flood-root .flood-page-gap { padding-inline: var(--flood-sys-space-1); color: var(--flood-sys-color-content-subtle); }
34
- @media (pointer: coarse) { .flood-root .flood-pagination .flood-page { min-inline-size: var(--flood-sys-size-touch); } .flood-root .flood-breadcrumb a { min-block-size: var(--flood-sys-size-touch); min-inline-size: var(--flood-sys-size-touch); } }
198
+ @media (pointer: coarse) { .flood-root .flood-pagination .flood-page { min-inline-size: var(--flood-sys-size-touch); } .flood-root .flood-breadcrumb li > a.flood-link { min-block-size: var(--flood-sys-size-touch); min-inline-size: var(--flood-sys-size-touch); } }
35
199
  @media (forced-colors: active) {
36
200
  .flood-root .flood-tabs .flood-tab[aria-selected="true"]:not(:disabled), .flood-root .flood-pagination .flood-page[aria-current="page"]:not(:disabled):not([aria-disabled="true"]) { forced-color-adjust: none; background: Highlight; color: HighlightText; box-shadow: none; }
37
201
  }
@@ -67,6 +231,7 @@
67
231
  .flood-root .flood-accordion > .flood-disclosure:last-child[data-open="false"] > .flood-disclosure__heading > .flood-disclosure__trigger { border-end-start-radius: calc(var(--flood-sys-radius-field) - var(--flood-sys-stroke-width)); border-end-end-radius: calc(var(--flood-sys-radius-field) - var(--flood-sys-stroke-width)); }
68
232
  @media (prefers-reduced-motion: reduce) { .flood-root .flood-disclosure__indicator { transition: none; } }
69
233
 
234
+ @font-face { font-family: "Inter"; src: url("./fonts/InterVariable-Italic.woff2") format("woff2"); font-style: italic; font-weight: 100 900; font-display: swap; }
70
235
  @font-face {
71
236
  font-family: "Inter";
72
237
  font-style: normal;
@@ -135,7 +300,7 @@
135
300
  color: var(--flood-sys-color-content-default);
136
301
  }
137
302
  .flood-root .flood-code-snippet__code {
138
- flex: 1;
303
+ flex: 1 1 20ch;
139
304
  min-inline-size: 0;
140
305
  font-family: var(--flood-sys-font-mono);
141
306
  font-size: var(--flood-sys-type-compact-size);
@@ -289,14 +454,18 @@
289
454
  .flood-root .flood-textarea { min-block-size: calc(var(--flood-control-height) * 3); resize: none; overflow: auto; }
290
455
  .flood-root .flood-field { display: grid; gap: var(--flood-sys-space-2); }
291
456
  .flood-root .flood-fieldset { margin: 0; padding: 0; border: 0; min-inline-size: 0; inline-size: 100%; }
292
- .flood-root .flood-legend { padding: 0; margin-block-end: var(--flood-sys-space-3); font-size: var(--flood-sys-type-label-size); line-height: var(--flood-sys-type-label-line-height); font-weight: var(--flood-sys-type-label-weight); letter-spacing: var(--flood-sys-type-label-tracking); }
293
- .flood-root .flood-fieldset__body { display: grid; gap: var(--flood-sys-space-3); min-inline-size: 0; }
457
+ .flood-root .flood-legend { float: inline-start; inline-size: 100%; padding: 0; margin-block-end: var(--flood-sys-space-3); font-size: var(--flood-sys-type-label-size); line-height: var(--flood-sys-type-label-line-height); font-weight: var(--flood-sys-type-label-weight); letter-spacing: var(--flood-sys-type-label-tracking); }
458
+ .flood-root .flood-fieldset__body { clear: both; display: grid; gap: var(--flood-sys-space-3); min-inline-size: 0; }
294
459
  .flood-root .flood-choice-group { display: flex; flex-direction: column; align-items: flex-start; gap: 0; min-inline-size: 0; }
295
460
  .flood-root .flood-choice-group > .flood-choice { min-block-size: var(--flood-sys-control-sm-height); }
296
461
  .flood-root .flood-choice-group[data-orientation="horizontal"] { flex-direction: row; flex-wrap: wrap; column-gap: var(--flood-sys-space-4); }
297
462
  .flood-root .flood-fieldset__body:has(> .flood-choice-group) { gap: var(--flood-sys-space-1); }
298
463
  .flood-root .flood-fieldset:has(> .flood-fieldset__body > .flood-choice-group) > .flood-legend { margin-block-end: var(--flood-sys-space-1); }
299
464
  .flood-root .flood-fieldset:has(> .flood-fieldset__body > .flood-hint) > .flood-legend { margin-block-end: var(--flood-sys-space-1); }
465
+ /* Keep legends in ordinary float/clear layout from their first render.
466
+ WebKit otherwise retains the native legend row when it becomes absolute.
467
+ The real legend and its React children remain mounted for group semantics. */
468
+ .flood-root .flood-fieldset[data-hide-label="true"] > .flood-legend.flood-visually-hidden--focusable:not(:focus-within):not([data-flood-focus-held]) { float: none; inline-size: 1px; block-size: 1px; margin: 0; min-inline-size: 0; min-block-size: 0; max-inline-size: 1px; max-block-size: 1px; line-height: 1px; }
300
469
  .flood-root .flood-fieldset:disabled :is(.flood-legend, .flood-label) { color: var(--flood-sys-color-field-disabled-content); }
301
470
  .flood-root .flood-label { color: var(--flood-sys-color-content-helper); font-size: var(--flood-sys-type-label-size); line-height: var(--flood-sys-type-label-line-height); font-weight: var(--flood-sys-type-label-weight); letter-spacing: var(--flood-sys-type-label-tracking); }
302
471
  .flood-root :where(.flood-hint, .flood-error) { font-size: var(--flood-sys-type-helper-size); line-height: var(--flood-sys-type-helper-line-height); font-weight: var(--flood-sys-type-helper-weight); letter-spacing: var(--flood-sys-type-helper-tracking); }
@@ -332,11 +501,10 @@
332
501
  .flood-root .flood-check[type="radio"] { border-radius: var(--flood-sys-radius-action); }
333
502
  .flood-root .flood-check[type="radio"]::before { inline-size: calc(var(--flood-sys-size-choice) * .45); block-size: calc(var(--flood-sys-size-choice) * .45); border-radius: var(--flood-sys-radius-action); background: currentColor; }
334
503
  .flood-root .flood-check:disabled { background: var(--flood-sys-color-field-disabled); border-color: var(--flood-sys-color-field-border); color: var(--flood-sys-color-field-disabled-content); opacity: 1; }
335
- .flood-root .flood-switch-input { inline-size: var(--flood-sys-size-switch-width); block-size: var(--flood-sys-size-switch-height); padding: calc((var(--flood-sys-size-switch-height) - var(--flood-sys-size-switch-thumb)) / 2 - var(--flood-sys-stroke-width)); border: var(--flood-sys-stroke-width) solid var(--flood-sys-color-field-border); border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-action-subtle-hover); }
336
- .flood-root .flood-switch-input::before { inline-size: var(--flood-sys-size-switch-thumb); block-size: var(--flood-sys-size-switch-thumb); border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-content-default); transition: transform var(--flood-sys-motion-duration-fast) var(--flood-sys-motion-easing); }
504
+ .flood-root .flood-switch-input { position: relative; box-sizing: border-box; inline-size: var(--flood-sys-size-switch-width); block-size: var(--flood-sys-size-switch-height); padding: calc((var(--flood-sys-size-switch-height) - var(--flood-sys-size-switch-thumb)) / 2 - var(--flood-sys-stroke-width)); border: var(--flood-sys-stroke-width) solid var(--flood-sys-color-field-border); border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-action-subtle-hover); }
505
+ .flood-root .flood-switch-input::before { position: absolute; inset-block-start: calc((var(--flood-sys-size-switch-height) - var(--flood-sys-size-switch-thumb)) / 2 - var(--flood-sys-stroke-width)); inset-inline-start: calc((var(--flood-sys-size-switch-height) - var(--flood-sys-size-switch-thumb)) / 2 - var(--flood-sys-stroke-width)); transform: none; inline-size: var(--flood-sys-size-switch-thumb); block-size: var(--flood-sys-size-switch-thumb); border-radius: var(--flood-sys-radius-action); background: var(--flood-sys-color-content-default); transition: inset-inline-start var(--flood-sys-motion-duration-fast) var(--flood-sys-motion-easing); }
337
506
  .flood-root .flood-switch-input:checked { background: var(--flood-sys-color-action-primary-rest); border-color: var(--flood-sys-color-action-primary-rest); }
338
- .flood-root .flood-switch-input:checked::before { transform: translateX(calc(var(--flood-sys-size-switch-width) - var(--flood-sys-size-switch-height))); background: var(--flood-sys-color-action-primary-content); }
339
- .flood-root .flood-switch-input:dir(rtl):checked::before { transform: translateX(calc(var(--flood-sys-size-switch-height) - var(--flood-sys-size-switch-width))); }
507
+ .flood-root .flood-switch-input:checked::before { transform: none; inset-inline-start: calc(var(--flood-sys-size-switch-width) - var(--flood-sys-size-switch-height) + (var(--flood-sys-size-switch-height) - var(--flood-sys-size-switch-thumb)) / 2 - var(--flood-sys-stroke-width)); background: var(--flood-sys-color-action-primary-content); }
340
508
  .flood-root .flood-switch-input:disabled { opacity: 1; border-color: var(--flood-sys-color-field-border); background: var(--flood-sys-color-field-disabled); }
341
509
  .flood-root .flood-switch-input:disabled::before { background: var(--flood-sys-color-field-disabled-content); }
342
510
  .flood-root .flood-link { font-size: inherit; color: var(--flood-sys-color-content-default); text-underline-offset: var(--flood-sys-space-1); }
@@ -552,12 +720,12 @@
552
720
  .flood-root .flood-button-group[data-orientation="vertical"] > .flood-button:not([hidden]) ~ .flood-button:not([hidden]) { border-block-start-color: var(--flood-sys-color-field-border); }
553
721
  .flood-root .flood-button-group[data-orientation="vertical"] > .flood-button:nth-child(1 of .flood-button:not([hidden])) { border-start-start-radius: var(--flood-sys-radius-field); border-start-end-radius: var(--flood-sys-radius-field); }
554
722
  .flood-root .flood-button-group[data-orientation="vertical"] > .flood-button:nth-last-child(1 of .flood-button:not([hidden])) { border-end-start-radius: var(--flood-sys-radius-field); border-end-end-radius: var(--flood-sys-radius-field); }
555
- .flood-root .flood-input-group { --flood-group-stroke: var(--flood-sys-stroke-width); --flood-group-height: var(--flood-control-height); --flood-group-inset: max(var(--flood-sys-space-1), var(--flood-sys-focus-width)); box-sizing: border-box; display: flex; align-items: center; gap: var(--flood-control-gap); min-inline-size: 0; inline-size: 100%; min-block-size: var(--flood-group-height); padding-inline: calc(var(--flood-control-padding) - var(--flood-group-stroke)); padding-block: calc(var(--flood-group-inset) - var(--flood-group-stroke)); border: var(--flood-group-stroke) solid var(--flood-sys-color-field-border); border-radius: var(--flood-sys-radius-field); background: var(--flood-sys-color-field-background); color: var(--flood-sys-color-field-content); }
723
+ .flood-root .flood-input-group { flex-wrap: wrap; --flood-group-stroke: var(--flood-sys-stroke-width); --flood-group-height: var(--flood-control-height); --flood-group-inset: max(var(--flood-sys-space-1), var(--flood-sys-focus-width)); box-sizing: border-box; display: flex; align-items: center; gap: var(--flood-control-gap); min-inline-size: 0; inline-size: 100%; min-block-size: var(--flood-group-height); padding-inline: calc(var(--flood-control-padding) - var(--flood-group-stroke)); padding-block: calc(var(--flood-group-inset) - var(--flood-group-stroke)); border: var(--flood-group-stroke) solid var(--flood-sys-color-field-border); border-radius: var(--flood-sys-radius-field); background: var(--flood-sys-color-field-background); color: var(--flood-sys-color-field-content); }
556
724
  .flood-root .flood-input-group[data-status] { border-color: var(--flood-field-feedback); }
557
725
  .flood-root .flood-input-group[data-readonly="true"] { background: var(--flood-sys-color-surface-canvas); border-style: dashed; }
558
726
  .flood-root .flood-input-group[data-disabled="true"] { background: var(--flood-sys-color-field-disabled); border-color: var(--flood-sys-color-field-border); color: var(--flood-sys-color-field-disabled-content); }
559
727
  .flood-root .flood-input-group:has(> .flood-input:focus-visible) { --flood-group-stroke: var(--flood-sys-focus-width); border-color: var(--flood-sys-color-focus-ring); border-style: solid; }
560
- .flood-root .flood-input-group > .flood-input { flex: 1 1 0; align-self: stretch; inline-size: 0; min-inline-size: 0; min-block-size: calc(var(--flood-group-height) - 2 * var(--flood-group-inset)); border: 0; border-radius: 0; background: transparent; padding-inline: 0; padding-block: max(0px, calc((var(--flood-control-height) - var(--flood-control-text) * var(--flood-control-line)) / 2 - var(--flood-group-inset))); }
728
+ .flood-root .flood-input-group > .flood-input { flex: 1 1 4rem; align-self: stretch; inline-size: 0; min-inline-size: min(100%, 4rem); min-block-size: calc(var(--flood-group-height) - 2 * var(--flood-group-inset)); border: 0; border-radius: 0; background: transparent; padding-inline: 0; padding-block: max(0px, calc((var(--flood-control-height) - var(--flood-control-text) * var(--flood-control-line)) / 2 - var(--flood-group-inset))); }
561
729
  .flood-root .flood-input-group > .flood-input:focus-visible { outline: none; border: 0; padding-inline: 0; }
562
730
  .flood-root .flood-input-group__addon { color: var(--flood-sys-color-content-subtle); display: flex; align-items: center; flex: 0 1 auto; min-inline-size: 0; max-inline-size: 40%; overflow-wrap: anywhere; font-size: var(--flood-control-text); line-height: var(--flood-control-line); }
563
731
  /* Text edges retain reading padding; nested actions use the same optical inset on every edge. */
@@ -597,3 +765,19 @@
597
765
  .flood-root .flood-segmented .flood-choice:has(input:checked) { forced-color-adjust: none; background: Highlight; color: HighlightText; }
598
766
  .flood-root .flood-segmented .flood-choice:has(input:focus-visible) { outline-color: Highlight; }
599
767
  }
768
+
769
+ .flood-root .flood-choice[hidden] { display: none; }
770
+
771
+ .flood-root .flood-input-group__addon:has(> .flood-button) { flex: 0 0 auto; max-inline-size: 100%; }
772
+ .flood-root .flood-input-group__addon > .flood-button { white-space: normal; overflow-wrap: normal; flex-shrink: 0; min-inline-size: min-content; }
773
+ .flood-root .flood-connected-scroll .flood-button-group { inline-size: max-content; max-inline-size: none; }
774
+ .flood-root .flood-connected-scroll .flood-button-group > .flood-button { flex-shrink: 0; min-inline-size: min-content; overflow-wrap: normal; white-space: nowrap; }
775
+ .flood-root .flood-connected-scroll .flood-button-group[data-orientation="vertical"] { inline-size: 100%; }
776
+ .flood-root .flood-connected-scroll .flood-button-group[data-orientation="vertical"] > .flood-button { white-space: normal; }
777
+ .flood-scroll-area[hidden], .flood-root .flood-select[hidden] { display: none; }
778
+
779
+ .flood-root .flood-connected-scroll .flood-button:focus-visible { outline-offset: calc(-1 * var(--flood-sys-focus-width)); }
780
+
781
+ .flood-root .flood-connected-scroll .flood-button-group > .flood-icon-button { min-inline-size: var(--flood-control-height); }
782
+ @media (pointer: coarse) { .flood-root .flood-connected-scroll .flood-button-group > .flood-icon-button { min-inline-size: max(var(--flood-control-height), var(--flood-sys-size-touch)); } }
783
+ .flood-root .flood-input-group__addon--end:has(> .flood-button) { margin-inline-start: auto; }
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ButtonHTMLAttributes, type InputHTMLAttributes, type TextareaHTMLAttributes, type SelectHTMLAttributes, type AnchorHTMLAttributes, type ReactNode, type HTMLAttributes, type LabelHTMLAttributes, type FieldsetHTMLAttributes, type RefCallback, type RefObject } from "react";
1
+ import { type ButtonHTMLAttributes, type InputHTMLAttributes, type TextareaHTMLAttributes, type SelectHTMLAttributes, type AnchorHTMLAttributes, type ReactNode, type HTMLAttributes, type CSSProperties, type LabelHTMLAttributes, type FieldsetHTMLAttributes, type RefCallback, type RefObject, type TableHTMLAttributes, type ImgHTMLAttributes } from "react";
2
2
  export type ControlSize = "2xs" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
3
3
  export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
4
4
  variant?: "solid" | "subtle" | "outline" | "ghost";
@@ -7,6 +7,102 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
7
7
  }
8
8
  export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
9
9
  export type FieldStatus = "error" | "warning" | "success" | "info";
10
+ export type ContentSize = "sm" | "md" | "lg";
11
+ export interface KbdProps extends HTMLAttributes<HTMLElement> {
12
+ size?: ContentSize;
13
+ }
14
+ /** @since 0.2.4 */
15
+ export declare const Kbd: import("react").ForwardRefExoticComponent<KbdProps & import("react").RefAttributes<HTMLElement>>;
16
+ export interface ToolbarProps extends Omit<HTMLAttributes<HTMLDivElement>, "role"> {
17
+ label: string;
18
+ orientation?: "horizontal" | "vertical";
19
+ loop?: boolean;
20
+ }
21
+ /** @since 0.2.4 */
22
+ export declare const Toolbar: import("react").ForwardRefExoticComponent<ToolbarProps & import("react").RefAttributes<HTMLDivElement>>;
23
+ export type DataDensity = "compact" | "comfortable";
24
+ export interface DescriptionItem {
25
+ id: string;
26
+ term: string;
27
+ description: ReactNode;
28
+ }
29
+ export interface DescriptionListProps extends Omit<HTMLAttributes<HTMLDListElement>, "children"> {
30
+ items: readonly DescriptionItem[];
31
+ layout?: "inline" | "stacked";
32
+ density?: DataDensity;
33
+ dividers?: boolean;
34
+ }
35
+ /** @since 0.2.4 */
36
+ export declare const DescriptionList: import("react").ForwardRefExoticComponent<DescriptionListProps & import("react").RefAttributes<HTMLDListElement>>;
37
+ export interface TableProps extends Omit<TableHTMLAttributes<HTMLTableElement>, "children"> {
38
+ caption: string;
39
+ children: ReactNode;
40
+ hideCaption?: boolean;
41
+ density?: DataDensity;
42
+ striped?: boolean;
43
+ scrollLabel?: string;
44
+ }
45
+ /** @since 0.2.4 */
46
+ export declare const Table: import("react").ForwardRefExoticComponent<TableProps & import("react").RefAttributes<HTMLTableElement>>;
47
+ export type SemanticTone = "neutral" | "accent" | "error" | "warning" | "success" | "info";
48
+ export type BadgeTone = SemanticTone;
49
+ export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
50
+ size?: ContentSize;
51
+ tone?: BadgeTone;
52
+ variant?: "subtle" | "outline";
53
+ }
54
+ /** @since 0.2.4 */
55
+ export declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLSpanElement>>;
56
+ export interface SpinnerProps extends Omit<HTMLAttributes<HTMLSpanElement>, "children" | "role" | "aria-label" | "aria-hidden"> {
57
+ size?: ContentSize;
58
+ label?: string;
59
+ decorative?: boolean;
60
+ }
61
+ /** @since 0.2.4 */
62
+ export declare const Spinner: import("react").ForwardRefExoticComponent<SpinnerProps & import("react").RefAttributes<HTMLSpanElement>>;
63
+ export interface SkeletonProps extends Omit<HTMLAttributes<HTMLSpanElement>, "children" | "role" | "tabIndex" | "aria-label" | "aria-hidden"> {
64
+ shape?: "text" | "rounded" | "circle";
65
+ width?: CSSProperties["width"];
66
+ height?: CSSProperties["height"];
67
+ animate?: boolean;
68
+ }
69
+ /** @since 0.2.4 */
70
+ export declare const Skeleton: import("react").ForwardRefExoticComponent<SkeletonProps & import("react").RefAttributes<HTMLSpanElement>>;
71
+ export interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, "children" | "role" | "aria-label" | "aria-hidden"> {
72
+ name: string;
73
+ src?: string;
74
+ fallback?: string;
75
+ size?: ContentSize;
76
+ shape?: "circle" | "rounded";
77
+ decorative?: boolean;
78
+ }
79
+ /** @since 0.2.4 */
80
+ export declare const Avatar: import("react").ForwardRefExoticComponent<AvatarProps & import("react").RefAttributes<HTMLSpanElement>>;
81
+ export interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "role"> {
82
+ label: string;
83
+ value?: number;
84
+ max?: number;
85
+ valueText?: string;
86
+ size?: ContentSize;
87
+ tone?: SemanticTone;
88
+ hideLabel?: boolean;
89
+ }
90
+ /** @since 0.2.4 */
91
+ export declare const Progress: import("react").ForwardRefExoticComponent<ProgressProps & import("react").RefAttributes<HTMLDivElement>>;
92
+ export interface MeterProps extends Omit<ProgressProps, "value"> {
93
+ value: number;
94
+ min?: number;
95
+ }
96
+ /** @since 0.2.4 */
97
+ export declare const Meter: import("react").ForwardRefExoticComponent<MeterProps & import("react").RefAttributes<HTMLDivElement>>;
98
+ export interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "role" | "aria-live"> {
99
+ title?: string;
100
+ tone?: "neutral" | FieldStatus;
101
+ icon?: ReactNode;
102
+ announcement?: "off" | "polite" | "assertive";
103
+ }
104
+ /** @since 0.2.4 */
105
+ export declare const Alert: import("react").ForwardRefExoticComponent<AlertProps & import("react").RefAttributes<HTMLDivElement>>;
10
106
  export interface TabItem {
11
107
  value: string;
12
108
  label: string;
@@ -54,6 +150,35 @@ export declare const Pagination: import("react").ForwardRefExoticComponent<Pagin
54
150
  export interface OverlayTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {
55
151
  ref: RefCallback<HTMLButtonElement>;
56
152
  }
153
+ export interface MenuActionItem {
154
+ id: string;
155
+ type?: "item";
156
+ label: string;
157
+ icon?: ReactNode;
158
+ shortcut?: string;
159
+ disabled?: boolean;
160
+ tone?: "default" | "danger";
161
+ }
162
+ export interface MenuSeparator {
163
+ id: string;
164
+ type: "separator";
165
+ }
166
+ export type MenuItem = MenuActionItem | MenuSeparator;
167
+ export interface MenuProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "role"> {
168
+ label: string;
169
+ trigger: (props: OverlayTriggerProps) => ReactNode;
170
+ items: readonly MenuItem[];
171
+ onAction?: (id: string) => void;
172
+ open?: boolean;
173
+ defaultOpen?: boolean;
174
+ onOpenChange?: (open: boolean) => void;
175
+ disabled?: boolean;
176
+ side?: "top" | "bottom" | "left" | "right";
177
+ align?: "start" | "center" | "end";
178
+ controlSize?: "sm" | "md" | "lg" | "xl";
179
+ }
180
+ /** @since 0.2.4 */
181
+ export declare const Menu: import("react").ForwardRefExoticComponent<MenuProps & import("react").RefAttributes<HTMLDivElement>>;
57
182
  export interface TooltipProps extends Omit<HTMLAttributes<HTMLDivElement>, "children" | "content" | "title" | "role"> {
58
183
  content: string;
59
184
  trigger: (props: OverlayTriggerProps) => ReactNode;
@@ -183,7 +308,10 @@ export declare const Select: import("react").ForwardRefExoticComponent<SelectPro
183
308
  export interface ChoiceProps extends Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "size"> {
184
309
  label: ReactNode;
185
310
  }
186
- export declare const Checkbox: import("react").ForwardRefExoticComponent<ChoiceProps & import("react").RefAttributes<HTMLInputElement>>;
311
+ export interface CheckboxProps extends ChoiceProps {
312
+ indeterminate?: boolean;
313
+ }
314
+ export declare const Checkbox: import("react").ForwardRefExoticComponent<CheckboxProps & import("react").RefAttributes<HTMLInputElement>>;
187
315
  export declare const Radio: import("react").ForwardRefExoticComponent<ChoiceProps & import("react").RefAttributes<HTMLInputElement>>;
188
316
  export declare const Switch: import("react").ForwardRefExoticComponent<ChoiceProps & import("react").RefAttributes<HTMLInputElement>>;
189
317
  export interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {
@@ -288,6 +416,66 @@ export interface SurfaceProps extends HTMLAttributes<HTMLDivElement> {
288
416
  padding?: Space;
289
417
  }
290
418
  export declare const Surface: import("react").ForwardRefExoticComponent<SurfaceProps & import("react").RefAttributes<HTMLDivElement>>;
419
+ export interface ContainerProps extends HTMLAttributes<HTMLDivElement> {
420
+ size?: "sm" | "md" | "lg" | "full";
421
+ gutter?: Space;
422
+ }
423
+ /** Centered content with logical gutters; max width includes padding. @since 0.2.4 */
424
+ export declare const Container: import("react").ForwardRefExoticComponent<ContainerProps & import("react").RefAttributes<HTMLDivElement>>;
425
+ export interface GridProps extends HTMLAttributes<HTMLDivElement> {
426
+ columns?: 1 | 2 | 3 | 4 | 6 | 12;
427
+ minItemWidth?: string;
428
+ gap?: Space;
429
+ }
430
+ /** Auto-fit by default; explicit columns retain their count at every width. @since 0.2.4 */
431
+ export declare const Grid: import("react").ForwardRefExoticComponent<GridProps & import("react").RefAttributes<HTMLDivElement>>;
432
+ export interface VisuallyHiddenProps extends HTMLAttributes<HTMLElement> {
433
+ as?: "span" | "div";
434
+ focusable?: boolean;
435
+ }
436
+ /** Nonvisual content, with optional reveal when a descendant receives focus. @since 0.2.4 */
437
+ export declare const VisuallyHidden: import("react").ForwardRefExoticComponent<VisuallyHiddenProps & import("react").RefAttributes<HTMLElement>>;
438
+ export interface AspectRatioProps extends HTMLAttributes<HTMLDivElement> {
439
+ ratio?: number;
440
+ }
441
+ /** Reserve media geometry. Child content may overflow rather than being clipped. @since 0.2.4 */
442
+ export declare const AspectRatio: import("react").ForwardRefExoticComponent<AspectRatioProps & import("react").RefAttributes<HTMLDivElement>>;
443
+ export interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, "alt"> {
444
+ alt: string;
445
+ fit?: "cover" | "contain";
446
+ }
447
+ /** Native image semantics, explicit alternative text and bounded media fitting. @since 0.2.4 */
448
+ export declare const Image: import("react").ForwardRefExoticComponent<ImageProps & import("react").RefAttributes<HTMLImageElement>>;
449
+ export interface ListProps extends Omit<HTMLAttributes<HTMLUListElement | HTMLOListElement>, "role"> {
450
+ ordered?: boolean;
451
+ start?: number;
452
+ reversed?: boolean;
453
+ marker?: boolean;
454
+ gap?: Space;
455
+ }
456
+ /** Native list items supplied by the host; hidden markers retain list semantics. @since 0.2.4 */
457
+ export declare const List: import("react").ForwardRefExoticComponent<ListProps & import("react").RefAttributes<HTMLOListElement | HTMLUListElement>>;
458
+ export interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "children"> {
459
+ title: string;
460
+ description?: ReactNode;
461
+ icon?: ReactNode;
462
+ actions?: ReactNode;
463
+ headingLevel?: 2 | 3 | 4 | 5 | 6;
464
+ density?: "compact" | "comfortable";
465
+ }
466
+ /** Static empty content, not loading, an error boundary or a live announcement. @since 0.2.4 */
467
+ export declare const EmptyState: import("react").ForwardRefExoticComponent<EmptyStateProps & import("react").RefAttributes<HTMLDivElement>>;
468
+ export interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
469
+ title?: ReactNode;
470
+ description?: ReactNode;
471
+ actions?: ReactNode;
472
+ footer?: ReactNode;
473
+ headingLevel?: 2 | 3 | 4 | 5 | 6;
474
+ density?: "compact" | "comfortable";
475
+ elevation?: "default" | "raised";
476
+ }
477
+ /** A structured content surface, not an interactive wrapper. @since 0.2.4 */
478
+ export declare const Card: import("react").ForwardRefExoticComponent<CardProps & import("react").RefAttributes<HTMLDivElement>>;
291
479
  export interface IconSlotProps extends HTMLAttributes<HTMLSpanElement> {
292
480
  size?: ControlSize;
293
481
  label?: string;
@@ -301,6 +489,7 @@ export declare const IconButton: import("react").ForwardRefExoticComponent<IconB
301
489
  export declare const Divider: import("react").ForwardRefExoticComponent<HTMLAttributes<HTMLHRElement> & import("react").RefAttributes<HTMLHRElement>>;
302
490
  export interface CodeSnippetProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
303
491
  code: string;
492
+ codeDirection?: "ltr" | "rtl" | "auto";
304
493
  action?: ReactNode;
305
494
  }
306
495
  /** Selectable code with an optional host-owned action; no clipboard side effects. */