@edmicro/olkit 1.1.6 → 1.1.7

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.
@@ -131,6 +131,17 @@ declare class OlAlert {
131
131
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlAlert, "ol-alert", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "headingLevel": { "alias": "headingLevel"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; }, { "onDismiss": "onDismiss"; }, never, ["[badge]", "*", "[alertActions]"], true, never>;
132
132
  }
133
133
 
134
+ /**
135
+ * Bỏ dấu tiếng Việt để gõ không dấu vẫn tìm ra.
136
+ *
137
+ * Phải xử lý `đ`/`Đ` riêng: chúng KHÔNG phải `d` cộng dấu phụ nên `NFD` không
138
+ * tách ra được, `đăng nhập` sẽ không khớp `dang nhap` nếu bỏ bước này.
139
+ *
140
+ * Dùng chung cho mọi ô có tìm kiếm (`ol-command`, `ol-select`); `ol-command`
141
+ * export lại để giữ API công khai từ 1.1.1.
142
+ */
143
+ declare function stripDiacritics(text: string): string;
144
+
134
145
  /** Một lệnh trong bảng. `keywords` để tìm được bằng từ khác với chữ hiển thị. */
135
146
  interface CommandItem {
136
147
  id: string;
@@ -145,13 +156,7 @@ interface CommandGroup {
145
156
  label: string;
146
157
  items: CommandItem[];
147
158
  }
148
- /**
149
- * Bỏ dấu tiếng Việt để gõ không dấu vẫn tìm ra.
150
- *
151
- * Phải xử lý `đ`/`Đ` riêng: chúng KHÔNG phải `d` cộng dấu phụ nên `NFD` không
152
- * tách ra được, `đăng nhập` sẽ không khớp `dang nhap` nếu bỏ bước này.
153
- */
154
- declare function stripDiacritics(text: string): string;
159
+
155
160
  /**
156
161
  * @deprecated Dùng `stripDiacritics`. Giữ lại vì hàm này ĐÃ publish trong
157
162
  * `@edmicro/olkit@1.1.1` (kiểm bằng `npm pack` rồi đọc `types/*.d.ts` — có
@@ -1052,6 +1057,178 @@ interface DatepickerPreset {
1052
1057
  range: () => [Date, Date];
1053
1058
  }
1054
1059
 
1060
+ /**
1061
+ * Bảng chuẩn kích thước và trạng thái cho MỌI ô nhập của thư viện.
1062
+ *
1063
+ * ## Vì sao cần
1064
+ *
1065
+ * Chín component họ form từng tự khai kích thước riêng, và chúng trôi khỏi
1066
+ * nhau. Đo ngày 2026-09-23 trên chín component:
1067
+ *
1068
+ * thiếu cỡ `xl` 3 component (select · autocomplete · input-counter)
1069
+ * nền sai 3 component (autocomplete · timepicker · datepicker)
1070
+ * viền sai 5 component
1071
+ * đệm ngang lệch 2px ở cả ba cỡ đầu (datepicker so với input)
1072
+ * cỡ chữ `sm` lệch 2px (14px vs 12px)
1073
+ *
1074
+ * Nền và viền lệch **chỉ lộ ở chế độ tối**: sáng thì `--bg-secondary` và
1075
+ * `--bg-secondary-medium` cùng ra `#f9fafb`, tối thì `gray-950` vs `gray-800`.
1076
+ * Nên lỗi sống rất lâu — người dựng nhìn chế độ sáng, thấy giống hệt nhau.
1077
+ *
1078
+ * Đọc từ đây thì thêm ô nhập mới cũng tự khớp, và đổi thang chỉ sửa một chỗ.
1079
+ *
1080
+ * ## Không gộp chiều cao với đệm ngang
1081
+ *
1082
+ * Hai thứ tách riêng vì component có icon cần `ps-*` thay `px-*`. Gộp lại thì
1083
+ * mỗi component phải cắt chuỗi ra để bỏ phần đệm — dễ sai hơn là ghép vào.
1084
+ */
1085
+ /** Bốn cỡ của họ form. Trùng `InputSize`, `SelectSize`, `DatepickerSize`. */
1086
+ type FieldSize = 'sm' | 'base' | 'lg' | 'xl';
1087
+ /** Ba trạng thái hiển thị. */
1088
+ type FieldState = 'default' | 'error' | 'success';
1089
+ /**
1090
+ * Chiều cao theo cỡ — **cố định bằng `h-*`**, không suy từ `py-*`.
1091
+ *
1092
+ * Suy từ đệm dọc thì chiều cao phụ thuộc `line-height` của cỡ chữ và không
1093
+ * bao giờ khớp thang chung. Đo trước khi chuẩn hoá: datepicker ra 34/42/54
1094
+ * trong khi input ra 36/40/48 — đặt cạnh nhau là so le ngay, nặng nhất ở `lg`.
1095
+ *
1096
+ * `xl` (52px) là cỡ mới nhất; ba component còn thiếu nó sẽ so le 12px khi đặt
1097
+ * cạnh một `ol-input size="xl"`.
1098
+ */
1099
+ declare const FIELD_HEIGHT: Record<FieldSize, string>;
1100
+ /**
1101
+ * Chiều cao TỐI THIỂU — cho component cao theo nội dung.
1102
+ *
1103
+ * `ol-select` nhiều lựa chọn, `ol-tag-input` nhiều thẻ: chúng phải giãn ra khi
1104
+ * nội dung xuống dòng, nên `h-*` cố định sẽ cắt mất. Giá trị bằng đúng
1105
+ * `FIELD_HEIGHT` để một dòng vẫn cao bằng các ô khác.
1106
+ */
1107
+ declare const FIELD_MIN_HEIGHT: Record<FieldSize, string>;
1108
+ /**
1109
+ * Đệm ngang theo Figma `ol-input`: sm 10px · base 12px · lg 14px · xl 16px.
1110
+ *
1111
+ * KHÔNG dùng `[class.px-2.5]` trên template: Angular cắt phần sau dấu chấm
1112
+ * nên nó render ra `px-2`, lệch 2px so với thiết kế. Phải gom vào một chuỗi.
1113
+ */
1114
+ declare const FIELD_PADDING_X: Record<FieldSize, string>;
1115
+ /**
1116
+ * `FIELD_PADDING_X` tách hai đầu — cho ô có icon: phần tử ĐẦU TIÊN trong khung
1117
+ * (icon hoặc ô gõ) nhận lề đầu, phần tử CUỐI nhận lề cuối, ở giữa chỉ còn
1118
+ * `FIELD_ICON_GAP`.
1119
+ */
1120
+ declare const FIELD_PADDING_START: Record<FieldSize, string>;
1121
+ declare const FIELD_PADDING_END: Record<FieldSize, string>;
1122
+ /**
1123
+ * Icon ↔ chữ trong khung: 8px, mọi cỡ — Figma `ol-input` (1149:46826) và
1124
+ * `ol-timepicker` (1149:52243) đều `itemSpacing: 8`.
1125
+ *
1126
+ * Chỉ một nguồn tạo khoảng này. Bản cũ của `ol-input` có cả `gap-2` ở khung
1127
+ * lẫn `ps-2.5`/`pe-2.5` ở ô gõ → icon cách chữ 18px (đo 2026-09-29).
1128
+ */
1129
+ declare const FIELD_ICON_GAP = "gap-2";
1130
+ /**
1131
+ * Đệm dọc của khung CHỌN NHIỀU (chip cao 24px). Nhãn nổi Bordered nằm vắt
1132
+ * qua viền trên, nửa dưới lấn vào khung ~10px — đệm 4px thường lệ để chip
1133
+ * nằm dưới chữ nhãn (đo 2026-09-29: đè 3px, 32/96 ô). Chừa 10px thì một
1134
+ * dòng chip vẫn cao đúng 40px: 1 + 10 + 24 + 4 + 1.
1135
+ */
1136
+ declare function multiValuePadY(floatingOutlined: boolean): string;
1137
+ /**
1138
+ * Chỗ dành cho icon 16px nằm `absolute` ở đầu/cuối khung: lề cỡ + 16px +
1139
+ * `FIELD_ICON_GAP` 8px. Dùng khi icon ra khỏi luồng (select, autocomplete
1140
+ * chọn nhiều) nên khung phải tự chừa chỗ.
1141
+ */
1142
+ declare const FIELD_ICON_RESERVE_START: Record<FieldSize, string>;
1143
+ declare const FIELD_ICON_RESERVE_END: Record<FieldSize, string>;
1144
+ /** Chỗ cho nút xoá 14px (`close` cỡ xs) nằm `absolute` cuối ô: lề cỡ + 14 + 8. */
1145
+ declare const FIELD_CLEAR_RESERVE_END: Record<FieldSize, string>;
1146
+ /**
1147
+ * Như `FIELD_ICON_RESERVE_START` nhưng cho icon lịch của datepicker, vốn to
1148
+ * theo cỡ ô (14 / 16 / 20 / 20px): lề cỡ + icon + 8px = 32 / 36 / 42 / 44.
1149
+ */
1150
+ declare const PICKER_ICON_RESERVE_START: Record<FieldSize, string>;
1151
+ /**
1152
+ * Cỡ chữ theo cỡ ô.
1153
+ *
1154
+ * `sm` là **14px** (`text-sm`), không phải 12px. Datepicker từng dùng
1155
+ * `text-xs` nên chữ trong ô nhỏ hơn hẳn các ô cùng hàng.
1156
+ */
1157
+ declare const FIELD_TEXT: Record<FieldSize, string>;
1158
+ /**
1159
+ * Nền · viền · vòng focus theo trạng thái.
1160
+ *
1161
+ * Dùng `-medium` cho cả nền lẫn viền ở trạng thái thường. Hai tên gần giống
1162
+ * nhau (`bg-neutral-secondary` vs `bg-neutral-secondary-medium`) nhưng **khác
1163
+ * hẳn ở chế độ tối**, nên nhầm một chữ là ô đó lệch màu mà chế độ sáng không
1164
+ * lộ ra.
1165
+ *
1166
+ * Dùng `focus-within:` chứ không `focus:`: viền nằm trên thẻ bọc, còn focus
1167
+ * rơi vào `<input>` bên trong. `focus:` trên thẻ bọc không bao giờ khớp.
1168
+ */
1169
+ declare const FIELD_STATE: Record<FieldState, string>;
1170
+ /** Nền và con trỏ khi ô bị khoá. Áp đè lên `FIELD_STATE`. */
1171
+ declare const FIELD_DISABLED = "bg-disabled opacity-60 cursor-not-allowed";
1172
+ /** Bo góc — 12px cho mọi cỡ, theo Figma `bieu-mau.md`. */
1173
+ declare const FIELD_RADIUS = "rounded-md";
1174
+ /**
1175
+ * Lớp của nhãn phía trên ô.
1176
+ *
1177
+ * `text-heading` chứ không `text-body`: nhãn là thứ người dùng đọc đầu tiên để
1178
+ * biết ô này hỏi gì, nó phải đậm hơn chữ phụ.
1179
+ */
1180
+ declare const FIELD_LABEL = "inline-flex items-center gap-1 text-sm font-medium text-heading";
1181
+ /** Khoảng cách nhãn → ô. */
1182
+ declare const FIELD_LABEL_GAP = "mb-1.5";
1183
+ /**
1184
+ * Vị trí nhãn so với ô: `top` (mặc định, nhãn trên ô) hoặc `left` (nhãn cùng
1185
+ * hàng, bên trái — form dạng bảng: cài đặt, hồ sơ). Nhãn nổi thắng cả hai.
1186
+ */
1187
+ type LabelPosition = 'top' | 'left';
1188
+ /**
1189
+ * Khung ngoài của host khi nhãn `left`: lưới 2 cột. Cột 1 = nhãn, rộng theo
1190
+ * `--ol-label-w` (input `labelWidth`, mặc định 8rem). Cột 2 = mọi thứ còn lại
1191
+ * — khung nhập, dòng gợi ý/lỗi — nên chữ lỗi thẳng mép ô, không chui xuống
1192
+ * dưới nhãn. `[&>ol-field-label]` cụ thể hơn `[&>*]` nên nhãn thắng cột.
1193
+ */
1194
+ declare const FIELD_LABEL_BESIDE = "grid grid-cols-[var(--ol-label-w,8rem)_minmax(0,1fr)] items-start gap-x-3 [&>*]:col-start-2 [&>ol-field-label]:col-start-1 [&>ol-field-label]:row-start-1";
1195
+ /** Lớp khung ngoài theo vị trí nhãn — rỗng khi nhãn trên hoặc nhãn nổi. */
1196
+ declare function fieldLabelLayout(position: LabelPosition, floating: boolean): string;
1197
+ /** Dấu sao bắt buộc. */
1198
+ declare const FIELD_ASTERISK = "text-fg-danger font-bold";
1199
+ /**
1200
+ * Chữ trợ giúp dưới ô, đổi màu theo trạng thái.
1201
+ *
1202
+ * Trạng thái lỗi mà chữ vẫn màu phụ thì người dùng không biết dòng đó là lời
1203
+ * giải thích lỗi hay chú thích thường.
1204
+ */
1205
+ declare const FIELD_HELPER: Record<FieldState, string>;
1206
+ /** Khoảng cách ô → chữ trợ giúp. */
1207
+ declare const FIELD_HELPER_GAP = "mt-1.5";
1208
+ /**
1209
+ * Gộp chiều cao · đệm ngang · cỡ chữ · bo góc cho một cỡ.
1210
+ *
1211
+ * Tiện cho component không có icon. Component có icon tự ghép từ các bảng
1212
+ * riêng để thay `px-*` bằng `ps-*`.
1213
+ */
1214
+ declare function fieldSizeClasses(size: FieldSize): string;
1215
+ /**
1216
+ * Ba kiểu nhãn nổi — Figma `ol-floating-label` (#1149:50454) trục `Type`:
1217
+ *
1218
+ * - `outlined` — **Bordered**: viền đủ, nhãn nổi nằm ĐÈ lên viền trên.
1219
+ * - `filled` — **With background**: nền xám + gạch chân 2px, nhãn nổi thành
1220
+ * một hàng 20px ở trên, nằm trong nền.
1221
+ * - `standard` — **Default**: chỉ gạch chân 2px, nhãn nổi thành hàng 20px ở trên.
1222
+ */
1223
+ type FloatingVariant = 'outlined' | 'filled' | 'standard';
1224
+ /**
1225
+ * Vị trí ngang của nhãn KHI NỔI (px) = đệm ngang của ô (`FIELD_PADDING_X`) —
1226
+ * Figma đặt nhãn nổi thẳng mép chữ, kể cả khi có icon đầu (nhãn nổi lên trên
1227
+ * cột icon). Phải là SỐ vì nhãn đặt bằng `style.left`, cùng hệ với vị trí nằm
1228
+ * yên (đo lúc chạy).
1229
+ */
1230
+ declare const FLOAT_LABEL_START: Record<FieldSize, number>;
1231
+
1055
1232
  declare class OlDatepickerStateService {
1056
1233
  readonly viewMode: _angular_core.WritableSignal<DatepickerViewMode>;
1057
1234
  readonly viewDate: _angular_core.WritableSignal<Date>;
@@ -1099,7 +1276,11 @@ declare class OlDatepickerStateService {
1099
1276
  }
1100
1277
 
1101
1278
  declare class OlDatepicker implements ControlValueAccessor {
1102
- readonly state: OlDatepickerStateService;
1279
+ /**
1280
+ * Trạng thái lịch (ngày đang xem, khoảng đã chọn…). Tên cũ `state` nhường
1281
+ * cho input `state` (lỗi / thành công) — cùng tên với mọi ô nhập khác.
1282
+ */
1283
+ readonly pickerState: OlDatepickerStateService;
1103
1284
  private readonly hostEl;
1104
1285
  /** Id do nơi gọi truyền; trống thì dùng id tự sinh bên dưới. */
1105
1286
  readonly id: _angular_core.InputSignal<string>;
@@ -1113,6 +1294,33 @@ declare class OlDatepicker implements ControlValueAccessor {
1113
1294
  readonly value: _angular_core.ModelSignal<Date | null>;
1114
1295
  readonly placeholder: _angular_core.InputSignal<string>;
1115
1296
  readonly label: _angular_core.InputSignal<string>;
1297
+ /**
1298
+ * Trạng thái hiển thị — lỗi / thành công, cùng thang `FIELD_STATE` với mọi ô
1299
+ * nhập khác. Trước đây datepicker không có (tên `state` bị service chiếm).
1300
+ */
1301
+ readonly state: _angular_core.InputSignal<FieldState>;
1302
+ /**
1303
+ * Nhãn nổi: `label` nằm TRONG khung (sau icon lịch), nổi lên khi focus, mở
1304
+ * lịch hoặc đã có ngày (kể cả chữ đang gõ dở).
1305
+ */
1306
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
1307
+ /**
1308
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
1309
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
1310
+ */
1311
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
1312
+ /**
1313
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
1314
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
1315
+ * mép ô thẳng hàng.
1316
+ */
1317
+ readonly labelWidth: _angular_core.InputSignal<string>;
1318
+ protected readonly labelLayout: _angular_core.Signal<string>;
1319
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
1320
+ /** Khung nhãn + ô: cột dọc (nhãn trên) hoặc lưới 2 cột (nhãn trái). */
1321
+ protected readonly stackClasses: _angular_core.Signal<string>;
1322
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
1323
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
1116
1324
  readonly helperText: _angular_core.InputSignal<string>;
1117
1325
  readonly required: _angular_core.InputSignal<boolean>;
1118
1326
  /**
@@ -1203,6 +1411,16 @@ declare class OlDatepicker implements ControlValueAccessor {
1203
1411
  * ngang và `ps-*` cho chỗ icon lịch.
1204
1412
  */
1205
1413
  readonly inputSizeClasses: _angular_core.Signal<string>;
1414
+ private readonly sizeClasses;
1415
+ protected readonly showClear: _angular_core.Signal<boolean>;
1416
+ /**
1417
+ * `ms-px`/`me-px`: div bọc icon tính từ mép NGOÀI viền 1px của ô, còn đệm
1418
+ * ô tính từ mép trong. Nhãn nổi `filled`/`standard` không có viền hai bên
1419
+ * (chỉ gạch dưới) thì không bù.
1420
+ */
1421
+ private readonly sideBorder;
1422
+ protected readonly leadPadClass: _angular_core.Signal<string>;
1423
+ protected readonly trailPadClass: _angular_core.Signal<string>;
1206
1424
  /**
1207
1425
  * Cỡ icon lịch theo `size` của ô nhập.
1208
1426
  *
@@ -1257,17 +1475,57 @@ declare class OlDatepicker implements ControlValueAccessor {
1257
1475
  */
1258
1476
  ngOnDestroy(): void;
1259
1477
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlDatepicker, never>;
1260
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDatepicker, "ol-datepicker", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "daysDisabled": { "alias": "daysDisabled"; "required": false; "isSignal": true; }; "datesDisabled": { "alias": "datesDisabled"; "required": false; "isSignal": true; }; "datesEnabled": { "alias": "datesEnabled"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "showFooter": { "alias": "showFooter"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "dateChange": "dateChange"; "timestampChange": "timestampChange"; "isoChange": "isoChange"; "formattedChange": "formattedChange"; }, never, never, true, never>;
1478
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDatepicker, "ol-datepicker", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "daysDisabled": { "alias": "daysDisabled"; "required": false; "isSignal": true; }; "datesDisabled": { "alias": "datesDisabled"; "required": false; "isSignal": true; }; "datesEnabled": { "alias": "datesEnabled"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "showFooter": { "alias": "showFooter"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "dateChange": "dateChange"; "timestampChange": "timestampChange"; "isoChange": "isoChange"; "formattedChange": "formattedChange"; }, never, never, true, never>;
1261
1479
  }
1262
1480
 
1263
1481
  type OlDateRangePickerVariant = 'dual-inputs' | 'joined';
1264
1482
  declare class OlDateRangePicker implements ControlValueAccessor {
1265
- readonly state: OlDatepickerStateService;
1483
+ /**
1484
+ * Trạng thái lịch (ngày đang xem, khoảng đã chọn…). Tên cũ `state` nhường
1485
+ * cho input `state` (lỗi / thành công) — cùng tên với mọi ô nhập khác.
1486
+ */
1487
+ readonly pickerState: OlDatepickerStateService;
1266
1488
  private readonly hostEl;
1267
1489
  readonly value: _angular_core.ModelSignal<DateRange | null>;
1268
1490
  readonly startPlaceholder: _angular_core.InputSignal<string>;
1269
1491
  readonly endPlaceholder: _angular_core.InputSignal<string>;
1270
1492
  readonly label: _angular_core.InputSignal<string>;
1493
+ /** Lỗi / thành công — cùng thang `FIELD_STATE` với mọi ô nhập khác. */
1494
+ readonly state: _angular_core.InputSignal<FieldState>;
1495
+ /**
1496
+ * Nhãn nổi. `joined`: một nhãn (`label`) cho cả khung. `dual-inputs`: mỗi ô
1497
+ * một nhãn (`fromLabel` / `toLabel`), nổi riêng theo ô đó có ngày hay không.
1498
+ */
1499
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
1500
+ /**
1501
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
1502
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
1503
+ */
1504
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
1505
+ /**
1506
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
1507
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
1508
+ * mép ô thẳng hàng.
1509
+ */
1510
+ readonly labelWidth: _angular_core.InputSignal<string>;
1511
+ protected readonly labelLayout: _angular_core.Signal<string>;
1512
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
1513
+ /**
1514
+ * `joined`: một nhãn cho cả khung → khung ngoài thành lưới. `dual-inputs`:
1515
+ * mỗi ô một nhãn ("Từ" / "Đến") → khung ngoài giữ cột dọc, từng CỘT thành lưới.
1516
+ */
1517
+ protected readonly stackClasses: _angular_core.Signal<string>;
1518
+ protected readonly columnClasses: _angular_core.Signal<string>;
1519
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
1520
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
1521
+ /**
1522
+ * Id hai ô `dual-inputs` — để `<label for>` nối được. Bản cũ hai nhãn
1523
+ * "Từ"/"Đến" KHÔNG có `for`, ô không có id: bấm nhãn không focus, trình đọc
1524
+ * màn hình đọc hai ô không tên.
1525
+ */
1526
+ private readonly uid;
1527
+ readonly startInputId: string;
1528
+ readonly endInputId: string;
1271
1529
  readonly fromLabel: _angular_core.InputSignal<string>;
1272
1530
  readonly toLabel: _angular_core.InputSignal<string>;
1273
1531
  readonly showInfoIcon: _angular_core.InputSignal<boolean>;
@@ -1341,7 +1599,27 @@ declare class OlDateRangePicker implements ControlValueAccessor {
1341
1599
  * dùng y hệt `py-2 / py-2.5 / py-3.5` nên lệch cùng một kiểu; sửa một nửa là
1342
1600
  * để lại đúng lỗi đó ở chỗ khác.
1343
1601
  */
1602
+ /**
1603
+ * Hai ô của dạng `dual-inputs`: icon lịch ở lề theo cỡ, chữ cách icon 8px.
1604
+ * Ô "Đến" mang nút xoá `absolute` nên lề phải chừa chỗ cho nó.
1605
+ */
1344
1606
  readonly inputSizeClasses: _angular_core.Signal<string>;
1607
+ readonly endInputClasses: _angular_core.Signal<string>;
1608
+ private inputClasses;
1609
+ protected readonly showClear: _angular_core.Signal<boolean>;
1610
+ /**
1611
+ * `ms-px`/`me-px`: div bọc icon tính từ mép NGOÀI viền 1px của ô, còn đệm
1612
+ * ô tính từ mép trong. Nhãn nổi `filled`/`standard` không có viền hai bên
1613
+ * (chỉ gạch dưới) thì không bù.
1614
+ */
1615
+ private readonly sideBorder;
1616
+ protected readonly leadPadClass: _angular_core.Signal<string>;
1617
+ protected readonly trailPadClass: _angular_core.Signal<string>;
1618
+ /**
1619
+ * Dạng `joined`: khung có `p-1` (4px), nên icon lùi thêm lề cỡ − 4px để
1620
+ * mép icon cách viền đúng lề cỡ như mọi ô; chữ cách icon 8px.
1621
+ */
1622
+ protected readonly joinedIconPadClass: _angular_core.Signal<string>;
1345
1623
  /**
1346
1624
  * Cỡ cho biến thể `joined` — khung bọc mang viền, hai input bên trong trong
1347
1625
  * suốt. Phải tách khỏi `inputSizeClasses()`: ở đây chiều cao thuộc về KHUNG,
@@ -1356,9 +1634,10 @@ declare class OlDateRangePicker implements ControlValueAccessor {
1356
1634
  * Khung có `p-1` = 4px mỗi cạnh, nên input con lùi 8px để TỔNG chiều cao
1357
1635
  * khớp thang: h-9 → h-7, h-10 → h-8, h-12 → h-10, h-13 → h-11.
1358
1636
  */
1359
- readonly joinedWrapperClasses: _angular_core.Signal<"h-9" | "h-12" | "h-10" | "h-13">;
1637
+ readonly joinedWrapperClasses: _angular_core.Signal<string>;
1638
+ private readonly joinedHeight;
1360
1639
  /** Input bên trong khung `joined` — trừ đi `p-1` của khung. */
1361
- readonly joinedInputClasses: _angular_core.Signal<"h-7 text-xs" | "h-10 text-base" | "h-11 text-base" | "h-8 text-sm">;
1640
+ readonly joinedInputClasses: _angular_core.Signal<string>;
1362
1641
  writeValue(val: DateRange | null): void;
1363
1642
  registerOnChange(fn: (val: DateRange | null) => void): void;
1364
1643
  registerOnTouched(fn: () => void): void;
@@ -1394,7 +1673,7 @@ declare class OlDateRangePicker implements ControlValueAccessor {
1394
1673
  */
1395
1674
  ngOnDestroy(): void;
1396
1675
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlDateRangePicker, never>;
1397
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDateRangePicker, "ol-date-range-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "fromLabel": { "alias": "fromLabel"; "required": false; "isSignal": true; }; "toLabel": { "alias": "toLabel"; "required": false; "isSignal": true; }; "showInfoIcon": { "alias": "showInfoIcon"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "dualMonth": { "alias": "dualMonth"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "daysDisabled": { "alias": "daysDisabled"; "required": false; "isSignal": true; }; "datesDisabled": { "alias": "datesDisabled"; "required": false; "isSignal": true; }; "datesEnabled": { "alias": "datesEnabled"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "showFooter": { "alias": "showFooter"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "rangeChange": "rangeChange"; }, never, never, true, never>;
1676
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDateRangePicker, "ol-date-range-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "startPlaceholder": { "alias": "startPlaceholder"; "required": false; "isSignal": true; }; "endPlaceholder": { "alias": "endPlaceholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; "fromLabel": { "alias": "fromLabel"; "required": false; "isSignal": true; }; "toLabel": { "alias": "toLabel"; "required": false; "isSignal": true; }; "showInfoIcon": { "alias": "showInfoIcon"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "dualMonth": { "alias": "dualMonth"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "daysDisabled": { "alias": "daysDisabled"; "required": false; "isSignal": true; }; "datesDisabled": { "alias": "datesDisabled"; "required": false; "isSignal": true; }; "datesEnabled": { "alias": "datesEnabled"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "showFooter": { "alias": "showFooter"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "inline": { "alias": "inline"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "rangeChange": "rangeChange"; }, never, never, true, never>;
1398
1677
  }
1399
1678
 
1400
1679
  declare class OlDatepickerDirective implements OnDestroy {
@@ -1906,6 +2185,74 @@ declare class OlDropdownHeader {
1906
2185
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDropdownHeader, "ol-dropdown-header", never, { "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1907
2186
  }
1908
2187
 
2188
+ /**
2189
+ * Ô tìm ở đầu menu — Figma `ol-dropdown-header` Type=Form (1149:39893): một
2190
+ * `ol-input` cỡ sm có icon tìm, đặt trên danh sách (`ol-dropdown` Type=Users,
2191
+ * Type=With scroll).
2192
+ *
2193
+ * Component KHÔNG tự lọc: mục trong menu do nơi dùng chiếu vào, có thể lấy từ
2194
+ * máy chủ, nên nơi dùng lọc theo `query` rồi hiện `ol-dropdown-state` khi rỗng
2195
+ * hoặc đang tải.
2196
+ *
2197
+ * Bàn phím: ↓ xuống mục đầu, Enter chọn mục đầu còn bấm được. Esc do
2198
+ * `ol-dropdown` lo (đóng + trả tiêu điểm về nút mở).
2199
+ *
2200
+ * `sticky`: menu dài có `menuClass="max-h-… overflow-y-auto"` thì ô tìm đứng
2201
+ * yên trên đỉnh khi cuộn danh sách. `-top-2 -mt-2 pt-2` phủ luôn đệm 8px của
2202
+ * menu, để mục cuộn qua không lộ ra phía trên ô tìm.
2203
+ */
2204
+ declare class OlDropdownSearch {
2205
+ readonly query: _angular_core.ModelSignal<string>;
2206
+ readonly placeholder: _angular_core.InputSignal<string>;
2207
+ readonly ariaLabel: _angular_core.InputSignal<string>;
2208
+ /** Mở menu thì đưa tiêu điểm vào ô tìm — người mở menu có ô tìm là để gõ. */
2209
+ readonly autofocus: _angular_core.InputSignal<boolean>;
2210
+ /** Đóng menu thì xoá từ khoá, lần mở sau thấy lại đủ danh sách. */
2211
+ readonly clearOnClose: _angular_core.InputSignal<boolean>;
2212
+ private readonly host;
2213
+ private readonly dropdown;
2214
+ constructor();
2215
+ protected onKeydown(event: KeyboardEvent): void;
2216
+ private field;
2217
+ /**
2218
+ * Mục đầu còn bấm được trong CÙNG menu — bỏ qua mục khoá. Tính cả
2219
+ * `menuitemcheckbox`/`menuitemradio` (menu chọn nhiều, chọn một).
2220
+ */
2221
+ private firstItem;
2222
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlDropdownSearch, never>;
2223
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDropdownSearch, "ol-dropdown-search", never, { "query": { "alias": "query"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "clearOnClose": { "alias": "clearOnClose"; "required": false; "isSignal": true; }; }, { "query": "queryChange"; }, never, never, true, never>;
2224
+ }
2225
+
2226
+ type DropdownStateType = 'loading' | 'empty' | 'no-results';
2227
+ /**
2228
+ * Trạng thái của menu khi KHÔNG có mục nào để hiện — Figma `ol-dropdown`
2229
+ * Type=Đang tải (5266:29107) · Rỗng (5266:29111) · Không có kết quả (5266:29114).
2230
+ *
2231
+ * Figma ghi: "Menu lấy dữ liệu từ máy chủ phải có đủ bốn trạng thái. Thiếu
2232
+ * Đang tải / Rỗng / Không có kết quả là lỗi hay gặp nhất ở ô tìm kiếm gợi ý."
2233
+ *
2234
+ * Đệm 24/16px, căn giữa. Đang tải: ba thanh xương cao 10px (thanh cuối ngắn
2235
+ * ~70%), cách 10px. Hai trạng thái chữ: tiêu đề 14px đậm vừa `text-heading`,
2236
+ * dòng phụ 12px `text-body-subtle`, cách 8px.
2237
+ *
2238
+ * `role="status"`: trình đọc màn hình báo khi danh sách vừa lọc ra rỗng —
2239
+ * người dùng gõ tìm không nhìn thấy menu thì vẫn biết không có kết quả.
2240
+ */
2241
+ declare class OlDropdownState {
2242
+ readonly type: _angular_core.InputSignal<DropdownStateType>;
2243
+ /** Tiêu đề — bỏ trống thì dùng câu mặc định theo `type`. */
2244
+ readonly heading: _angular_core.InputSignal<string>;
2245
+ /** Dòng phụ — bỏ trống thì dùng câu mặc định theo `type`. */
2246
+ readonly description: _angular_core.InputSignal<string>;
2247
+ /** Từ khoá vừa tìm — chèn vào câu mặc định của `no-results`. */
2248
+ readonly query: _angular_core.InputSignal<string>;
2249
+ protected readonly boxClasses: _angular_core.Signal<"flex flex-col items-center gap-2.5 px-4 py-6" | "flex flex-col items-center gap-2 px-4 py-6 text-center">;
2250
+ protected readonly resolvedHeading: _angular_core.Signal<string>;
2251
+ protected readonly resolvedDescription: _angular_core.Signal<string>;
2252
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlDropdownState, never>;
2253
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlDropdownState, "ol-dropdown-state", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2254
+ }
2255
+
1909
2256
  declare class OlFooter {
1910
2257
  /**
1911
2258
  * Giới hạn nội dung trong khung rộng tối đa và căn giữa. Tắt đi thì chân
@@ -1962,112 +2309,6 @@ declare class OlFrame {
1962
2309
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlFrame, "ol-frame", never, { "spacing": { "alias": "spacing"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "stacked": { "alias": "stacked"; "required": false; "isSignal": true; }; "horizontal": { "alias": "horizontal"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
1963
2310
  }
1964
2311
 
1965
- /**
1966
- * Bảng chuẩn kích thước và trạng thái cho MỌI ô nhập của thư viện.
1967
- *
1968
- * ## Vì sao cần
1969
- *
1970
- * Chín component họ form từng tự khai kích thước riêng, và chúng trôi khỏi
1971
- * nhau. Đo ngày 2026-09-23 trên chín component:
1972
- *
1973
- * thiếu cỡ `xl` 3 component (select · autocomplete · input-counter)
1974
- * nền sai 3 component (autocomplete · timepicker · datepicker)
1975
- * viền sai 5 component
1976
- * đệm ngang lệch 2px ở cả ba cỡ đầu (datepicker so với input)
1977
- * cỡ chữ `sm` lệch 2px (14px vs 12px)
1978
- *
1979
- * Nền và viền lệch **chỉ lộ ở chế độ tối**: sáng thì `--bg-secondary` và
1980
- * `--bg-secondary-medium` cùng ra `#f9fafb`, tối thì `gray-950` vs `gray-800`.
1981
- * Nên lỗi sống rất lâu — người dựng nhìn chế độ sáng, thấy giống hệt nhau.
1982
- *
1983
- * Đọc từ đây thì thêm ô nhập mới cũng tự khớp, và đổi thang chỉ sửa một chỗ.
1984
- *
1985
- * ## Không gộp chiều cao với đệm ngang
1986
- *
1987
- * Hai thứ tách riêng vì component có icon cần `ps-*` thay `px-*`. Gộp lại thì
1988
- * mỗi component phải cắt chuỗi ra để bỏ phần đệm — dễ sai hơn là ghép vào.
1989
- */
1990
- /** Bốn cỡ của họ form. Trùng `InputSize`, `SelectSize`, `DatepickerSize`. */
1991
- type FieldSize = 'sm' | 'base' | 'lg' | 'xl';
1992
- /** Ba trạng thái hiển thị. */
1993
- type FieldState = 'default' | 'error' | 'success';
1994
- /**
1995
- * Chiều cao theo cỡ — **cố định bằng `h-*`**, không suy từ `py-*`.
1996
- *
1997
- * Suy từ đệm dọc thì chiều cao phụ thuộc `line-height` của cỡ chữ và không
1998
- * bao giờ khớp thang chung. Đo trước khi chuẩn hoá: datepicker ra 34/42/54
1999
- * trong khi input ra 36/40/48 — đặt cạnh nhau là so le ngay, nặng nhất ở `lg`.
2000
- *
2001
- * `xl` (52px) là cỡ mới nhất; ba component còn thiếu nó sẽ so le 12px khi đặt
2002
- * cạnh một `ol-input size="xl"`.
2003
- */
2004
- declare const FIELD_HEIGHT: Record<FieldSize, string>;
2005
- /**
2006
- * Chiều cao TỐI THIỂU — cho component cao theo nội dung.
2007
- *
2008
- * `ol-select` nhiều lựa chọn, `ol-tag-input` nhiều thẻ: chúng phải giãn ra khi
2009
- * nội dung xuống dòng, nên `h-*` cố định sẽ cắt mất. Giá trị bằng đúng
2010
- * `FIELD_HEIGHT` để một dòng vẫn cao bằng các ô khác.
2011
- */
2012
- declare const FIELD_MIN_HEIGHT: Record<FieldSize, string>;
2013
- /**
2014
- * Đệm ngang theo Figma `ol-input`: sm 10px · base 12px · lg 14px · xl 16px.
2015
- *
2016
- * KHÔNG dùng `[class.px-2.5]` trên template: Angular cắt phần sau dấu chấm
2017
- * nên nó render ra `px-2`, lệch 2px so với thiết kế. Phải gom vào một chuỗi.
2018
- */
2019
- declare const FIELD_PADDING_X: Record<FieldSize, string>;
2020
- /**
2021
- * Cỡ chữ theo cỡ ô.
2022
- *
2023
- * `sm` là **14px** (`text-sm`), không phải 12px. Datepicker từng dùng
2024
- * `text-xs` nên chữ trong ô nhỏ hơn hẳn các ô cùng hàng.
2025
- */
2026
- declare const FIELD_TEXT: Record<FieldSize, string>;
2027
- /**
2028
- * Nền · viền · vòng focus theo trạng thái.
2029
- *
2030
- * Dùng `-medium` cho cả nền lẫn viền ở trạng thái thường. Hai tên gần giống
2031
- * nhau (`bg-neutral-secondary` vs `bg-neutral-secondary-medium`) nhưng **khác
2032
- * hẳn ở chế độ tối**, nên nhầm một chữ là ô đó lệch màu mà chế độ sáng không
2033
- * lộ ra.
2034
- *
2035
- * Dùng `focus-within:` chứ không `focus:`: viền nằm trên thẻ bọc, còn focus
2036
- * rơi vào `<input>` bên trong. `focus:` trên thẻ bọc không bao giờ khớp.
2037
- */
2038
- declare const FIELD_STATE: Record<FieldState, string>;
2039
- /** Nền và con trỏ khi ô bị khoá. Áp đè lên `FIELD_STATE`. */
2040
- declare const FIELD_DISABLED = "bg-disabled opacity-60 cursor-not-allowed";
2041
- /** Bo góc — 12px cho mọi cỡ, theo Figma `bieu-mau.md`. */
2042
- declare const FIELD_RADIUS = "rounded-md";
2043
- /**
2044
- * Lớp của nhãn phía trên ô.
2045
- *
2046
- * `text-heading` chứ không `text-body`: nhãn là thứ người dùng đọc đầu tiên để
2047
- * biết ô này hỏi gì, nó phải đậm hơn chữ phụ.
2048
- */
2049
- declare const FIELD_LABEL = "inline-flex items-center gap-1 text-sm font-medium text-heading";
2050
- /** Khoảng cách nhãn → ô. */
2051
- declare const FIELD_LABEL_GAP = "mb-1.5";
2052
- /** Dấu sao bắt buộc. */
2053
- declare const FIELD_ASTERISK = "text-fg-danger font-bold";
2054
- /**
2055
- * Chữ trợ giúp dưới ô, đổi màu theo trạng thái.
2056
- *
2057
- * Trạng thái lỗi mà chữ vẫn màu phụ thì người dùng không biết dòng đó là lời
2058
- * giải thích lỗi hay chú thích thường.
2059
- */
2060
- declare const FIELD_HELPER: Record<FieldState, string>;
2061
- /** Khoảng cách ô → chữ trợ giúp. */
2062
- declare const FIELD_HELPER_GAP = "mt-1.5";
2063
- /**
2064
- * Gộp chiều cao · đệm ngang · cỡ chữ · bo góc cho một cỡ.
2065
- *
2066
- * Tiện cho component không có icon. Component có icon tự ghép từ các bảng
2067
- * riêng để thay `px-*` bằng `ps-*`.
2068
- */
2069
- declare function fieldSizeClasses(size: FieldSize): string;
2070
-
2071
2312
  /**
2072
2313
  * Nhãn cho ô nhập — khớp Figma `ol-label` (#1149:94727), trục
2073
2314
  * `Type=[Default | Required & icon | Two texts]`.
@@ -2440,6 +2681,28 @@ declare class OlInput implements ControlValueAccessor {
2440
2681
  readonly cleared: _angular_core.OutputEmitterRef<void>;
2441
2682
  readonly rightHelperText: _angular_core.InputSignal<string>;
2442
2683
  readonly id: _angular_core.InputSignal<string>;
2684
+ /**
2685
+ * Nhãn nổi: `label` nằm TRONG khung, nổi lên khi focus hoặc có chữ — thay
2686
+ * cho nhãn phía trên ô. Xem `OlFieldFrame`.
2687
+ */
2688
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
2689
+ /**
2690
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
2691
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
2692
+ */
2693
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
2694
+ /**
2695
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
2696
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
2697
+ * mép ô thẳng hàng.
2698
+ */
2699
+ readonly labelWidth: _angular_core.InputSignal<string>;
2700
+ protected readonly labelLayout: _angular_core.Signal<string>;
2701
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
2702
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
2703
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
2704
+ /** Có chữ → nhãn nổi. `0` (input number) là CÓ giá trị. */
2705
+ readonly hasValue: _angular_core.Signal<boolean>;
2443
2706
  /** Id thực dùng: ưu tiên id do nơi gọi truyền, không thì dùng id tự sinh. */
2444
2707
  readonly inputId: _angular_core.Signal<string>;
2445
2708
  readonly helperId: _angular_core.Signal<string>;
@@ -2456,6 +2719,18 @@ declare class OlInput implements ControlValueAccessor {
2456
2719
  * lệch 2px so với thiết kế.
2457
2720
  */
2458
2721
  readonly paddingClasses: _angular_core.Signal<string>;
2722
+ /**
2723
+ * Khoảng icon ↔ chữ đúng 8px (`FIELD_ICON_GAP`): icon mang lề đầu/cuối của
2724
+ * khung, ô gõ bỏ lề phía có icon. Khung KHÔNG có `gap` — add-on chữ/icon
2725
+ * phải sát ô gõ (Figma Type=Add-on: gap 0).
2726
+ */
2727
+ protected readonly hasLeadingIcon: _angular_core.Signal<boolean>;
2728
+ protected readonly hasTrailingIcon: _angular_core.Signal<boolean>;
2729
+ protected readonly showClear: _angular_core.Signal<boolean>;
2730
+ protected readonly leadIconClasses: _angular_core.Signal<string>;
2731
+ /** Nút xoá đứng trước icon trạng thái thì để `ps-2` của icon tạo khoảng. */
2732
+ protected readonly clearClasses: _angular_core.Signal<string>;
2733
+ protected readonly trailIconClasses: _angular_core.Signal<string>;
2459
2734
  /**
2460
2735
  * Bốn phương thức này là thứ Angular Forms gọi tới. Thiếu chúng thì
2461
2736
  * `formControlName` / `[formControl]` KHÔNG gắn được — dùng component trong
@@ -2480,7 +2755,7 @@ declare class OlInput implements ControlValueAccessor {
2480
2755
  /** Gọi khi rời ô nhập — form dùng để đánh dấu `touched`. */
2481
2756
  protected markTouched(): void;
2482
2757
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlInput, never>;
2483
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlInput, "ol-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "labelIcon": { "alias": "labelIcon"; "required": false; "isSignal": true; }; "labelTooltip": { "alias": "labelTooltip"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "prefixText": { "alias": "prefixText"; "required": false; "isSignal": true; }; "suffixText": { "alias": "suffixText"; "required": false; "isSignal": true; }; "addOnIcon": { "alias": "addOnIcon"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "rightIcon": { "alias": "rightIcon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "rightHelperText": { "alias": "rightHelperText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "cleared": "cleared"; }, never, ["[addOnIcon], [leftIcon]", "[leftIcon]", "[rightIcon]", "[rightHelperAction]"], true, never>;
2758
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlInput, "ol-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "labelIcon": { "alias": "labelIcon"; "required": false; "isSignal": true; }; "labelTooltip": { "alias": "labelTooltip"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "prefixText": { "alias": "prefixText"; "required": false; "isSignal": true; }; "suffixText": { "alias": "suffixText"; "required": false; "isSignal": true; }; "addOnIcon": { "alias": "addOnIcon"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "rightIcon": { "alias": "rightIcon"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "clearAriaLabel": { "alias": "clearAriaLabel"; "required": false; "isSignal": true; }; "rightHelperText": { "alias": "rightHelperText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "cleared": "cleared"; }, never, ["[addOnIcon], [leftIcon]", "[rightIcon]", "[rightHelperAction]"], true, never>;
2484
2759
  }
2485
2760
 
2486
2761
  type TextareaState = 'default' | 'error' | 'success';
@@ -2516,6 +2791,26 @@ declare class OlTextarea implements ControlValueAccessor {
2516
2791
  readonly showAsterisk: _angular_core.InputSignal<boolean>;
2517
2792
  readonly commentBox: _angular_core.InputSignal<boolean>;
2518
2793
  readonly id: _angular_core.InputSignal<string>;
2794
+ /**
2795
+ * Nhãn nổi: `label` nằm TRONG khung ở dòng đầu, nổi lên khi focus hoặc có
2796
+ * chữ. Không áp cho `commentBox` (thẻ bình luận có bố cục riêng).
2797
+ */
2798
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
2799
+ /**
2800
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
2801
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
2802
+ */
2803
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
2804
+ /**
2805
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
2806
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
2807
+ * mép ô thẳng hàng.
2808
+ */
2809
+ readonly labelWidth: _angular_core.InputSignal<string>;
2810
+ protected readonly labelLayout: _angular_core.Signal<string>;
2811
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
2812
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
2813
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
2519
2814
  readonly submitComment: _angular_core.OutputEmitterRef<string>;
2520
2815
  onSubmit(): void;
2521
2816
  /**
@@ -2534,7 +2829,7 @@ declare class OlTextarea implements ControlValueAccessor {
2534
2829
  /** Gọi khi rời ô nhập — form dùng để đánh dấu `touched`. */
2535
2830
  protected markTouched(): void;
2536
2831
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlTextarea, never>;
2537
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlTextarea, "ol-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "showCharCount": { "alias": "showCharCount"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "commentBox": { "alias": "commentBox"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "submitComment": "submitComment"; }, never, never, true, never>;
2832
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlTextarea, "ol-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "showCharCount": { "alias": "showCharCount"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "commentBox": { "alias": "commentBox"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "submitComment": "submitComment"; }, never, never, true, never>;
2538
2833
  }
2539
2834
 
2540
2835
  /**
@@ -2646,6 +2941,26 @@ declare class OlSelect implements ControlValueAccessor {
2646
2941
  * cần `set()` được. Cách dùng từ ngoài không đổi.
2647
2942
  */
2648
2943
  readonly disabled: _angular_core.ModelSignal<boolean>;
2944
+ /**
2945
+ * Nhãn nổi: `label` nằm TRONG khung, nổi lên khi focus, mở danh sách hoặc có
2946
+ * lựa chọn. Đa chọn: nhãn nằm yên ở dòng đầu, nổi lên không đẩy thẻ.
2947
+ */
2948
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
2949
+ /**
2950
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
2951
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
2952
+ */
2953
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
2954
+ /**
2955
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
2956
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
2957
+ * mép ô thẳng hàng.
2958
+ */
2959
+ readonly labelWidth: _angular_core.InputSignal<string>;
2960
+ protected readonly labelLayout: _angular_core.Signal<string>;
2961
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
2962
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
2963
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
2649
2964
  readonly placeholder: _angular_core.InputSignal<string>;
2650
2965
  readonly multiple: _angular_core.InputSignal<boolean>;
2651
2966
  readonly searchable: _angular_core.InputSignal<boolean>;
@@ -2655,6 +2970,10 @@ declare class OlSelect implements ControlValueAccessor {
2655
2970
  readonly labelKey: _angular_core.InputSignal<string>;
2656
2971
  readonly valueKey: _angular_core.InputSignal<string>;
2657
2972
  readonly groupBy: _angular_core.InputSignal<string>;
2973
+ /**
2974
+ * Tiêu đề khi danh sách rỗng. Bỏ trống thì theo Figma: có từ khoá →
2975
+ * "Không tìm thấy “…”", chưa có mục nào → "Chưa có mục nào".
2976
+ */
2658
2977
  readonly emptyText: _angular_core.InputSignal<string>;
2659
2978
  readonly searchPlaceholder: _angular_core.InputSignal<string>;
2660
2979
  /**
@@ -2796,6 +3115,7 @@ declare class OlSelect implements ControlValueAccessor {
2796
3115
  private readonly listboxRef;
2797
3116
  /** Ô tìm ở đầu panel, để chuyển focus vào khi mở. */
2798
3117
  private readonly oTimPanel;
3118
+ private readonly inlineSearch;
2799
3119
  readonly isOpen: _angular_core.WritableSignal<boolean>;
2800
3120
  readonly searchQuery: _angular_core.WritableSignal<string>;
2801
3121
  readonly activeIndex: _angular_core.WritableSignal<number>;
@@ -2845,9 +3165,15 @@ declare class OlSelect implements ControlValueAccessor {
2845
3165
  * 10/12/14/16px. Đặt `ol-select size="sm"` cạnh `ol-input size="sm"` là
2846
3166
  * lệch 4px, và ở `xl` lệch 2px theo chiều ngược lại.
2847
3167
  *
2848
- * Có icon trái thì `ps-10` cố định — chỗ đó dành cho icon, không phải đệm.
3168
+ * Icon trái và cụm nút phải đều `absolute`, nên khung tự chừa chỗ cho
3169
+ * chúng bằng `FIELD_ICON_RESERVE_*`: icon ↔ chữ đúng 8px. Bản cũ `ps-10` /
3170
+ * `pe-10` cố định cho mọi cỡ ra 10px ở cỡ base, 14px ở sm (đo 2026-09-29).
2849
3171
  */
2850
3172
  readonly paddingStartClass: _angular_core.Signal<string>;
3173
+ private readonly floatingOutlined;
3174
+ /** Icon trái và cụm nút phải nằm ở lề theo cỡ, như `ol-input`. */
3175
+ protected readonly leftIconPadClass: _angular_core.Signal<string>;
3176
+ protected readonly controlPadClass: _angular_core.Signal<string>;
2851
3177
  private onChange;
2852
3178
  private onTouched;
2853
3179
  private readonly destroyRef;
@@ -3042,7 +3368,7 @@ declare class OlSelect implements ControlValueAccessor {
3042
3368
  registerOnTouched(fn: () => void): void;
3043
3369
  setDisabledState(isDisabled: boolean): void;
3044
3370
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlSelect, never>;
3045
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlSelect, "ol-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "labelKey": { "alias": "labelKey"; "required": false; "isSignal": true; }; "valueKey": { "alias": "valueKey"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "menuClass": { "alias": "menuClass"; "required": false; "isSignal": true; }; "matchTriggerWidth": { "alias": "matchTriggerWidth"; "required": false; "isSignal": true; }; "maxSelectedItems": { "alias": "maxSelectedItems"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "hideSelected": { "alias": "hideSelected"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "createText": { "alias": "createText"; "required": false; "isSignal": true; }; "groupSeparator": { "alias": "groupSeparator"; "required": false; "isSignal": true; }; "searchPosition": { "alias": "searchPosition"; "required": false; "isSignal": true; }; "searchIcon": { "alias": "searchIcon"; "required": false; "isSignal": true; }; "searchPrefix": { "alias": "searchPrefix"; "required": false; "isSignal": true; }; "triggerIcon": { "alias": "triggerIcon"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "remoteSearch": { "alias": "remoteSearch"; "required": false; "isSignal": true; }; "minTermLength": { "alias": "minTermLength"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "typeToSearchText": { "alias": "typeToSearchText"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": false; "isSignal": true; }; "bufferAmount": { "alias": "bufferAmount"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "search": "search"; "opened": "opened"; "closed": "closed"; "cleared": "cleared"; "added": "added"; "removed": "removed"; "selectionChange": "selectionChange"; }, ["optionTemplate", "labelTemplate"], ["[leftIcon]"], true, never>;
3371
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlSelect, "ol-select", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "leftIcon": { "alias": "leftIcon"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "labelKey": { "alias": "labelKey"; "required": false; "isSignal": true; }; "valueKey": { "alias": "valueKey"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "menuClass": { "alias": "menuClass"; "required": false; "isSignal": true; }; "matchTriggerWidth": { "alias": "matchTriggerWidth"; "required": false; "isSignal": true; }; "maxSelectedItems": { "alias": "maxSelectedItems"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "hideSelected": { "alias": "hideSelected"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "createText": { "alias": "createText"; "required": false; "isSignal": true; }; "groupSeparator": { "alias": "groupSeparator"; "required": false; "isSignal": true; }; "searchPosition": { "alias": "searchPosition"; "required": false; "isSignal": true; }; "searchIcon": { "alias": "searchIcon"; "required": false; "isSignal": true; }; "searchPrefix": { "alias": "searchPrefix"; "required": false; "isSignal": true; }; "triggerIcon": { "alias": "triggerIcon"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "remoteSearch": { "alias": "remoteSearch"; "required": false; "isSignal": true; }; "minTermLength": { "alias": "minTermLength"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "typeToSearchText": { "alias": "typeToSearchText"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": false; "isSignal": true; }; "bufferAmount": { "alias": "bufferAmount"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "search": "search"; "opened": "opened"; "closed": "closed"; "cleared": "cleared"; "added": "added"; "removed": "removed"; "selectionChange": "selectionChange"; }, ["optionTemplate", "labelTemplate"], ["[leftIcon]"], true, never>;
3046
3372
  }
3047
3373
 
3048
3374
  /**
@@ -3269,7 +3595,13 @@ interface SegmentedOption<T = string | number> {
3269
3595
  label: string;
3270
3596
  icon?: string;
3271
3597
  disabled?: boolean;
3598
+ /**
3599
+ * Màu của mục KHI ĐANG CHỌN — cho lựa chọn mang nghĩa (Đạt / Chưa đạt,
3600
+ * Đúng / Sai). Không truyền thì nền trắng chữ đậm như mặc định.
3601
+ */
3602
+ color?: SegmentedColor;
3272
3603
  }
3604
+ type SegmentedColor = 'neutral' | 'brand' | 'success' | 'warning' | 'danger';
3273
3605
  type SegmentedSize = 'sm' | 'base';
3274
3606
  /**
3275
3607
  * Chọn MỘT trong vài chế độ loại trừ nhau, đặt cạnh nhau trên một rãnh xám;
@@ -3846,66 +4178,6 @@ declare class OlRange implements ControlValueAccessor {
3846
4178
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlRange, "ol-range", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "minValue": { "alias": "minValue"; "required": false; "isSignal": true; }; "maxValue": { "alias": "maxValue"; "required": false; "isSignal": true; }; "dualRange": { "alias": "dualRange"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "showValue": { "alias": "showValue"; "required": false; "isSignal": true; }; "showTooltip": { "alias": "showTooltip"; "required": false; "isSignal": true; }; "showMinMaxLabels": { "alias": "showMinMaxLabels"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "minValue": "minValueChange"; "maxValue": "maxValueChange"; "disabled": "disabledChange"; }, never, ["[slot=prefix]", "[slot=suffix]"], true, never>;
3847
4179
  }
3848
4180
 
3849
- /**
3850
- * Figma `ol-floating-label` #1149:50454 trục `Type` chỉ có
3851
- * `Default | With background | Bordered` — ánh xạ sang `outlined`/`filled`.
3852
- * `standard` không có trong thiết kế và template cũng **không có nhánh nào**
3853
- * cho nó (grep ra 0 lượt), nên truyền vào là ra y hệt `outlined`. Đã xoá.
3854
- */
3855
- type FloatingLabelVariant = 'outlined' | 'filled';
3856
- /**
3857
- * Figma `ol-floating-label` (#1149:50454) có `Size=[sm|base|lg|xl]`; code
3858
- * trước đây thiếu `xl`. Đo trên Figma, `xl` giống hệt `lg` trừ chiều cao
3859
- * (48 -> 52px) và padding dọc (12 -> 14px): cùng gap 8, cùng icon 20px,
3860
- * cùng cỡ chữ 16px, cùng bo góc 12px.
3861
- */
3862
- type FloatingLabelSize = 'sm' | 'base' | 'lg' | 'xl';
3863
- type FloatingLabelState = 'default' | 'error' | 'success';
3864
- declare class OlFloatingLabel implements ControlValueAccessor {
3865
- readonly value: _angular_core.ModelSignal<string>;
3866
- readonly label: _angular_core.InputSignal<string>;
3867
- readonly type: _angular_core.InputSignal<string>;
3868
- readonly variant: _angular_core.InputSignal<FloatingLabelVariant>;
3869
- readonly size: _angular_core.InputSignal<FloatingLabelSize>;
3870
- readonly state: _angular_core.InputSignal<FloatingLabelState>;
3871
- /**
3872
- * Khai bằng `model()` thay vì `input()` để Reactive Forms khoá được component:
3873
- * `setDisabledState()` cần `set()` giá trị, mà `input()` chỉ đọc. Cách dùng từ
3874
- * ngoài không đổi — `[disabled]="true"` và `disabled()` trong template vẫn như cũ.
3875
- */
3876
- readonly disabled: _angular_core.ModelSignal<boolean>;
3877
- readonly readonly: _angular_core.InputSignal<boolean>;
3878
- readonly helperText: _angular_core.InputSignal<string>;
3879
- readonly errorText: _angular_core.InputSignal<string>;
3880
- readonly id: _angular_core.InputSignal<string>;
3881
- readonly autocomplete: _angular_core.InputSignal<string>;
3882
- readonly labelBg: _angular_core.InputSignal<string>;
3883
- readonly prefixIcon: _angular_core.InputSignal<string>;
3884
- readonly suffixIcon: _angular_core.InputSignal<string>;
3885
- readonly prefixVariant: _angular_core.InputSignal<string>;
3886
- readonly suffixVariant: _angular_core.InputSignal<string>;
3887
- readonly hasPrefix: _angular_core.Signal<boolean>;
3888
- readonly hasSuffix: _angular_core.Signal<boolean>;
3889
- readonly isFocused: _angular_core.WritableSignal<boolean>;
3890
- readonly isFloated: _angular_core.Signal<boolean>;
3891
- private readonly generatedId;
3892
- protected readonly inputId: _angular_core.Signal<string>;
3893
- readonly helperId: _angular_core.Signal<string>;
3894
- readonly describedBy: _angular_core.Signal<string | null>;
3895
- readonly ariaInvalid: _angular_core.Signal<"true" | null>;
3896
- private onChange;
3897
- private onTouched;
3898
- onFocus(): void;
3899
- onBlur(): void;
3900
- onModelChange(val: string): void;
3901
- writeValue(val: string): void;
3902
- registerOnChange(fn: any): void;
3903
- registerOnTouched(fn: any): void;
3904
- setDisabledState(isDisabled: boolean): void;
3905
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlFloatingLabel, never>;
3906
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlFloatingLabel, "ol-floating-label", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "labelBg": { "alias": "labelBg"; "required": false; "isSignal": true; }; "prefixIcon": { "alias": "prefixIcon"; "required": false; "isSignal": true; }; "suffixIcon": { "alias": "suffixIcon"; "required": false; "isSignal": true; }; "prefixVariant": { "alias": "prefixVariant"; "required": false; "isSignal": true; }; "suffixVariant": { "alias": "suffixVariant"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; }, never, never, true, never>;
3907
- }
3908
-
3909
4181
  /**
3910
4182
  * Thang cỡ theo Figma: `sm | base | lg`. `'md'` là BÍ DANH của `'base'`,
3911
4183
  * giữ cho mã cũ chạy tiếp và sẽ bỏ ở bản sau — dùng `'base'` cho mã mới.
@@ -4076,6 +4348,26 @@ declare class OlTagInput implements ControlValueAccessor {
4076
4348
  readonly maxTags: _angular_core.InputSignal<number | undefined>;
4077
4349
  readonly id: _angular_core.InputSignal<string>;
4078
4350
  readonly size: _angular_core.InputSignal<TagInputSize>;
4351
+ /**
4352
+ * Nhãn nổi: `label` nằm TRONG khung ở dòng đầu, nổi lên khi focus, đang gõ
4353
+ * hoặc đã có thẻ. Khung giãn nhiều dòng — nhãn nổi không đẩy thẻ.
4354
+ */
4355
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
4356
+ /**
4357
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
4358
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
4359
+ */
4360
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
4361
+ /**
4362
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
4363
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
4364
+ * mép ô thẳng hàng.
4365
+ */
4366
+ readonly labelWidth: _angular_core.InputSignal<string>;
4367
+ protected readonly labelLayout: _angular_core.Signal<string>;
4368
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
4369
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
4370
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
4079
4371
  /**
4080
4372
  * Gom chiều cao + padding vào MỘT chuỗi thay vì nhiều `[class.X]`: hai class
4081
4373
  * cùng thuộc tính đều nằm trên thẻ thì trình duyệt chọn theo thứ tự luật CSS
@@ -4112,7 +4404,7 @@ declare class OlTagInput implements ControlValueAccessor {
4112
4404
  */
4113
4405
  protected markTouched(): void;
4114
4406
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlTagInput, never>;
4115
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlTagInput, "ol-tag-input", never, { "tags": { "alias": "tags"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, { "tags": "tagsChange"; "disabled": "disabledChange"; }, never, never, true, never>;
4407
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlTagInput, "ol-tag-input", never, { "tags": { "alias": "tags"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "maxTags": { "alias": "maxTags"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; }, { "tags": "tagsChange"; "disabled": "disabledChange"; }, never, never, true, never>;
4116
4408
  }
4117
4409
 
4118
4410
  declare class OlRichTextEditor implements ControlValueAccessor {
@@ -4185,6 +4477,26 @@ declare class OlTimepicker implements ControlValueAccessor {
4185
4477
  * `aria-labelledby` đã lo — không cần truyền cái này.
4186
4478
  */
4187
4479
  readonly ariaLabel: _angular_core.InputSignal<string>;
4480
+ /**
4481
+ * Nhãn nổi: `label` nằm TRONG khung (sau icon đồng hồ), nổi lên khi focus,
4482
+ * mở bảng chọn hoặc đã có giờ. Có addon thì nhãn nằm trong ô, không trùm addon.
4483
+ */
4484
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
4485
+ /**
4486
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
4487
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
4488
+ */
4489
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
4490
+ /**
4491
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
4492
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
4493
+ * mép ô thẳng hàng.
4494
+ */
4495
+ readonly labelWidth: _angular_core.InputSignal<string>;
4496
+ protected readonly labelLayout: _angular_core.Signal<string>;
4497
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
4498
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
4499
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
4188
4500
  readonly placeholder: _angular_core.InputSignal<string>;
4189
4501
  readonly format: _angular_core.InputSignal<TimepickerFormat>;
4190
4502
  readonly size: _angular_core.InputSignal<TimepickerSize>;
@@ -4296,7 +4608,7 @@ declare class OlTimepicker implements ControlValueAccessor {
4296
4608
  registerOnTouched(fn: any): void;
4297
4609
  setDisabledState(isDisabled: boolean): void;
4298
4610
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlTimepicker, never>;
4299
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlTimepicker, "ol-timepicker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "showPresets": { "alias": "showPresets"; "required": false; "isSignal": true; }; "addonType": { "alias": "addonType"; "required": false; "isSignal": true; }; "addonText": { "alias": "addonText"; "required": false; "isSignal": true; }; "addonIcon": { "alias": "addonIcon"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "timeChange": "timeChange"; "timestampChange": "timestampChange"; "isoChange": "isoChange"; "timeObjectChange": "timeObjectChange"; }, never, never, true, never>;
4611
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlTimepicker, "ol-timepicker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "showPresets": { "alias": "showPresets"; "required": false; "isSignal": true; }; "addonType": { "alias": "addonType"; "required": false; "isSignal": true; }; "addonText": { "alias": "addonText"; "required": false; "isSignal": true; }; "addonIcon": { "alias": "addonIcon"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "timeChange": "timeChange"; "timestampChange": "timestampChange"; "isoChange": "isoChange"; "timeObjectChange": "timeObjectChange"; }, never, never, true, never>;
4300
4612
  }
4301
4613
 
4302
4614
  /**
@@ -4320,6 +4632,28 @@ declare class OlAutocomplete implements ControlValueAccessor {
4320
4632
  readonly value: _angular_core.ModelSignal<any>;
4321
4633
  readonly options: _angular_core.InputSignal<any[]>;
4322
4634
  readonly label: _angular_core.InputSignal<string>;
4635
+ /**
4636
+ * Nhãn nổi: `label` nằm TRONG khung (sau icon kính lúp), nổi lên khi focus,
4637
+ * đang gõ, mở danh sách hoặc đã chọn. Đa chọn: nổi lên không đẩy thẻ.
4638
+ */
4639
+ readonly floatingLabel: _angular_core.InputSignal<boolean>;
4640
+ /**
4641
+ * Nhãn `top` (trên ô, mặc định) hay `left` (cùng hàng, bên trái). Nhãn nổi
4642
+ * (`floatingLabel`) thắng — bật nó thì bỏ qua input này.
4643
+ */
4644
+ readonly labelPosition: _angular_core.InputSignal<LabelPosition>;
4645
+ /**
4646
+ * Độ rộng cột nhãn khi `labelPosition="left"` — độ dài CSS bất kỳ: `140px`,
4647
+ * `10rem`, `30%`. Bỏ trống = 8rem. Các ô trong cùng form đặt cùng một số thì
4648
+ * mép ô thẳng hàng.
4649
+ */
4650
+ readonly labelWidth: _angular_core.InputSignal<string>;
4651
+ protected readonly labelLayout: _angular_core.Signal<string>;
4652
+ protected readonly labelBeside: _angular_core.Signal<boolean>;
4653
+ /** Kiểu nhãn nổi — Figma Bordered / With background / Default. */
4654
+ readonly floatingVariant: _angular_core.InputSignal<FloatingVariant>;
4655
+ /** Có giá trị để nhãn nổi: đã chọn (một hay nhiều) hoặc đang có chữ gõ. */
4656
+ protected readonly hasFloatValue: _angular_core.Signal<boolean>;
4323
4657
  readonly placeholder: _angular_core.InputSignal<string>;
4324
4658
  readonly labelKey: _angular_core.InputSignal<string>;
4325
4659
  readonly valueKey: _angular_core.InputSignal<string>;
@@ -4337,7 +4671,7 @@ declare class OlAutocomplete implements ControlValueAccessor {
4337
4671
  protected readonly resolvedSize: _angular_core.Signal<FieldSize>;
4338
4672
  /**
4339
4673
  * Đệm ngang theo BẢNG CHUẨN họ form. Chỉ dùng khi KHÔNG `multiple` —
4340
- * chế độ nhiều thẻ có đệm riêng (`px-1.5 py-1`) vì các thẻ tự mang đệm.
4674
+ * chế độ nhiều thẻ dùng `boxPaddingClass`.
4341
4675
  *
4342
4676
  * Ba lỗi cũ gộp làm một chỗ này (đo /autocomplete 2026-09-24):
4343
4677
  * sm `[class.px-2.5]` -> Angular CẮT ở dấu chấm, render `px-2` = 8px
@@ -4346,6 +4680,26 @@ declare class OlAutocomplete implements ControlValueAccessor {
4346
4680
  * xl có `px-4` nhưng nằm ở `[class.px-4]` rời, dễ lệch khỏi ba cỡ kia.
4347
4681
  */
4348
4682
  protected readonly fieldPaddingClass: _angular_core.Signal<string>;
4683
+ /**
4684
+ * Đệm khung. Chọn nhiều: icon kính lúp vẫn là phần tử đầu nên lề đầu theo
4685
+ * cỡ như ô đơn (bản cũ `ps-1.5` để icon cách mép 6px, ô đơn 12px — hai ô
4686
+ * cạnh nhau lệch nhau rõ). Lề cuối chừa chỗ cụm nút absolute: lề cỡ + icon
4687
+ * 16px + `FIELD_ICON_GAP` 8px.
4688
+ */
4689
+ protected readonly boxPaddingClass: _angular_core.Signal<string>;
4690
+ /**
4691
+ * Cụm nút cuối (xoá / chevron / spinner). Rộng icon 16px + `ps-0.5` để chữ
4692
+ * ↔ icon đúng 8px (`gap-1.5` của khung + 2px) — bản cũ `w-7` ra 18px.
4693
+ * `justify-end`: spinner 12px vẫn neo mép phải như icon.
4694
+ */
4695
+ protected readonly controlClass: _angular_core.Signal<string>;
4696
+ /**
4697
+ * Đã có thẻ (chọn nhiều): khi KHÔNG gõ, ô gõ co về 0 (`min-w-0`, vẫn
4698
+ * `flex-1`) nên luôn ở cùng dòng chip cuối — không đẻ ra một dòng trống.
4699
+ * Focus để gõ thì mới cần chỗ (`focus:min-w-16`), lúc đó xuống dòng là đúng.
4700
+ * Đo 2026-09-29: dòng chip cuối còn 43px, `min-w-12` (48px) vẫn rớt.
4701
+ */
4702
+ protected readonly hasChips: _angular_core.Signal<boolean>;
4349
4703
  /**
4350
4704
  * Cỡ chữ theo BẢNG CHUẨN. Trước đây `[class.text-base]` chỉ khai cho `lg`,
4351
4705
  * `xl` không có nhánh nào nên rơi về 16px MẶC ĐỊNH của trình duyệt — trùng
@@ -4525,7 +4879,7 @@ declare class OlAutocomplete implements ControlValueAccessor {
4525
4879
  registerOnTouched(fn: any): void;
4526
4880
  setDisabledState(isDisabled: boolean): void;
4527
4881
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlAutocomplete, never>;
4528
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlAutocomplete, "ol-autocomplete", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "labelKey": { "alias": "labelKey"; "required": false; "isSignal": true; }; "valueKey": { "alias": "valueKey"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "menuClass": { "alias": "menuClass"; "required": false; "isSignal": true; }; "matchTriggerWidth": { "alias": "matchTriggerWidth"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "remoteSearch": { "alias": "remoteSearch"; "required": false; "isSignal": true; }; "minTermLength": { "alias": "minTermLength"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "typeToSearchText": { "alias": "typeToSearchText"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "createOption": "createOption"; "search": "search"; "opened": "opened"; "closed": "closed"; "cleared": "cleared"; "added": "added"; "removed": "removed"; "selectionChange": "selectionChange"; }, ["optionTemplate"], never, true, never>;
4882
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlAutocomplete, "ol-autocomplete", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "floatingLabel": { "alias": "floatingLabel"; "required": false; "isSignal": true; }; "labelPosition": { "alias": "labelPosition"; "required": false; "isSignal": true; }; "labelWidth": { "alias": "labelWidth"; "required": false; "isSignal": true; }; "floatingVariant": { "alias": "floatingVariant"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "labelKey": { "alias": "labelKey"; "required": false; "isSignal": true; }; "valueKey": { "alias": "valueKey"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "state": { "alias": "state"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "showAsterisk": { "alias": "showAsterisk"; "required": false; "isSignal": true; }; "helperText": { "alias": "helperText"; "required": false; "isSignal": true; }; "errorText": { "alias": "errorText"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "menuClass": { "alias": "menuClass"; "required": false; "isSignal": true; }; "matchTriggerWidth": { "alias": "matchTriggerWidth"; "required": false; "isSignal": true; }; "groupBy": { "alias": "groupBy"; "required": false; "isSignal": true; }; "remoteSearch": { "alias": "remoteSearch"; "required": false; "isSignal": true; }; "minTermLength": { "alias": "minTermLength"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "typeToSearchText": { "alias": "typeToSearchText"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "disabled": "disabledChange"; "createOption": "createOption"; "search": "search"; "opened": "opened"; "closed": "closed"; "cleared": "cleared"; "added": "added"; "removed": "removed"; "selectionChange": "selectionChange"; }, ["optionTemplate"], never, true, never>;
4529
4883
  }
4530
4884
 
4531
4885
  declare class OlKbd {
@@ -4791,6 +5145,30 @@ declare class OlModalFooter {
4791
5145
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlModalFooter, "ol-modal-footer", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
4792
5146
  }
4793
5147
 
5148
+ /**
5149
+ * Mốc gập menu vào ☰, theo bề rộng THANH. `xl` (78rem ≈ 1248px) là mặc định cũ.
5150
+ * `md` (48rem = 768px) / `lg` (64rem = 1024px) cho thanh muốn giữ menu lâu hơn —
5151
+ * thường kèm `compactItems`, vì menu đầy đủ chữ hiếm khi vừa 768px.
5152
+ */
5153
+ type NavbarCollapseAt = 'md' | 'lg' | 'xl';
5154
+ /**
5155
+ * Ba nấc hiển thị khi `compactItems` bật — thanh ĐO chỗ trống thật và chọn nấc
5156
+ * đầy đủ nhất còn vừa, ghi vào `data-density` trên gốc `<nav>`:
5157
+ *
5158
+ * - `full` — đủ hết.
5159
+ * - `medium` — vẫn ĐỦ CHỮ và icon menu; bỏ phần PHỤ của nơi gọi.
5160
+ * - `text` — đủ chữ, bỏ icon đầu mục (−24px mỗi mục).
5161
+ * - `compact` — mục có icon chỉ còn icon (chữ `sr-only`, có `title`).
5162
+ *
5163
+ * Từ `medium` trở xuống gốc có thêm `data-condensed`: nơi gọi ẩn phần phụ
5164
+ * (dòng phụ dưới logo, nhãn "Năm học:"…) bằng MỘT class
5165
+ * `group-data-[condensed]/navbar:hidden`, không phải liệt kê từng nấc.
5166
+ *
5167
+ * Bản trước đổi sang icon ở mốc CỨNG 78rem: thanh 1180px chỉ thiếu 3px là vừa
5168
+ * đủ chữ mà vẫn thành icon, để trống một khoảng lớn giữa menu và nút (báo
5169
+ * 2026-09-28 kèm ảnh).
5170
+ */
5171
+ type NavbarDensity = 'full' | 'medium' | 'text' | 'compact';
4794
5172
  declare class OlNavbar {
4795
5173
  readonly brandLogo: _angular_core.InputSignal<string>;
4796
5174
  readonly brandName: _angular_core.InputSignal<string>;
@@ -4799,6 +5177,13 @@ declare class OlNavbar {
4799
5177
  readonly fluid: _angular_core.InputSignal<boolean>;
4800
5178
  readonly showSearch: _angular_core.InputSignal<boolean>;
4801
5179
  readonly searchPlaceholder: _angular_core.InputSignal<string>;
5180
+ /** Thanh hẹp hơn mốc này thì mục menu gập vào ☰. Xem `NavbarCollapseAt`. */
5181
+ readonly collapseAt: _angular_core.InputSignal<NavbarCollapseAt>;
5182
+ /**
5183
+ * Tự co theo chỗ trống thật (`full` → `medium` → `compact`, xem
5184
+ * `NavbarDensity`) thay vì gập menu. Thường đi kèm `collapseAt="md"`/`"lg"`.
5185
+ */
5186
+ readonly compactItems: _angular_core.InputSignal<boolean>;
4802
5187
  readonly isCollapsed: _angular_core.ModelSignal<boolean>;
4803
5188
  readonly onSearch: _angular_core.OutputEmitterRef<string>;
4804
5189
  readonly onToggleMobileMenu: _angular_core.OutputEmitterRef<boolean>;
@@ -4814,6 +5199,16 @@ declare class OlNavbar {
4814
5199
  constructor();
4815
5200
  /** Chiều cao khối mục xếp dọc (0 khi không xếp dọc) → `--ol-nav-stack-h`. */
4816
5201
  private observeStackHeight;
5202
+ private observeDensity;
5203
+ /**
5204
+ * Thử từ nấc đầy đủ nhất xuống, dừng ở nấc đầu tiên vừa hàng. Đặt thuộc tính
5205
+ * rồi đọc kích thước NGAY (ép trình duyệt tính lại) nên không nháy khung nào
5206
+ * — trạng thái cuối được gán trước khi vẽ.
5207
+ *
5208
+ * Đo bằng `scrollWidth`: logo có `min-w-0 truncate`, bị ép co thì
5209
+ * `offsetWidth` nhỏ đi và phép đo báo "vừa" sai.
5210
+ */
5211
+ updateDensity(): void;
4817
5212
  private isStacked;
4818
5213
  /**
4819
5214
  * Đo lại mỗi lần mở ☰, không chỉ lúc đầu: nội dung chiếu vào có thể nằm
@@ -4828,8 +5223,17 @@ declare class OlNavbar {
4828
5223
  * di động. Bản trước chỉ ẩn chúng, nên 5/7 thanh trên /navbar và /blocks bấm
4829
5224
  * ☰ ra bảng trống (đo iPhone 13 giả lập, 2026-09-28).
4830
5225
  */
5226
+ protected readonly bp: _angular_core.Signal<{
5227
+ row: string;
5228
+ wide: string;
5229
+ stackReset: string;
5230
+ hide: string;
5231
+ }>;
5232
+ /** Hàng trên: lưới ở khung hẹp (logo | nút), flex từ mốc gập trở lên. */
5233
+ readonly rowClasses: _angular_core.Signal<string>;
5234
+ readonly toggleClasses: _angular_core.Signal<string>;
4831
5235
  readonly navWrapClasses: _angular_core.Signal<string>;
4832
- readonly mobilePanelClasses: _angular_core.Signal<"hidden" | "@[78rem]:hidden absolute inset-x-0 top-[calc(100%+var(--ol-nav-stack-h,0px))] z-dropdown max-h-[calc(100dvh-5rem)] overflow-y-auto border-t border-default bg-neutral-primary px-4 pt-4 pb-6 space-y-4 animate-in fade-in slide-in-from-top-2 duration-150 shadow-xl">;
5236
+ readonly mobilePanelClasses: _angular_core.Signal<string>;
4833
5237
  readonly navbarClasses: _angular_core.Signal<string>;
4834
5238
  readonly containerClasses: _angular_core.Signal<"w-full px-4 @[40rem]:px-6" | "max-w-7xl mx-auto px-4 @[40rem]:px-6 @5xl:px-8">;
4835
5239
  toggleMobileMenu(): void;
@@ -4837,7 +5241,7 @@ declare class OlNavbar {
4837
5241
  handleSearchInput(event: Event): void;
4838
5242
  handleGlobalKeydown(event: KeyboardEvent): void;
4839
5243
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<OlNavbar, never>;
4840
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlNavbar, "ol-navbar", never, { "brandLogo": { "alias": "brandLogo"; "required": false; "isSignal": true; }; "brandName": { "alias": "brandName"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "fluid": { "alias": "fluid"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "isCollapsed": { "alias": "isCollapsed"; "required": false; "isSignal": true; }; }, { "isCollapsed": "isCollapsedChange"; "onSearch": "onSearch"; "onToggleMobileMenu": "onToggleMobileMenu"; }, never, ["[slot=brand], [brand]", "[slot=navigation], [navigation], ol-navbar-item, ol-nav-dropdown", "[slot=actions], [actions]", "[slot=mobile-user]", "[slot=mobile], [slot=mobile-links]", "[slot=mobile-actions]", "[slot=mobile-footer]"], true, never>;
5244
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OlNavbar, "ol-navbar", never, { "brandLogo": { "alias": "brandLogo"; "required": false; "isSignal": true; }; "brandName": { "alias": "brandName"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "fluid": { "alias": "fluid"; "required": false; "isSignal": true; }; "showSearch": { "alias": "showSearch"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "collapseAt": { "alias": "collapseAt"; "required": false; "isSignal": true; }; "compactItems": { "alias": "compactItems"; "required": false; "isSignal": true; }; "isCollapsed": { "alias": "isCollapsed"; "required": false; "isSignal": true; }; }, { "isCollapsed": "isCollapsedChange"; "onSearch": "onSearch"; "onToggleMobileMenu": "onToggleMobileMenu"; }, never, ["[slot=brand], [brand]", "[slot=navigation], [navigation], ol-navbar-item, ol-nav-dropdown", "[slot=actions], [actions]", "[slot=mobile-user]", "[slot=mobile], [slot=mobile-links]", "[slot=mobile-actions]", "[slot=mobile-footer]"], true, never>;
4841
5245
  }
4842
5246
 
4843
5247
  declare class OlNavbarItem {
@@ -7909,6 +8313,6 @@ declare class OlOverlayContainer {
7909
8313
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<any>;
7910
8314
  }
7911
8315
 
7912
- export { CHAT_BUBBLE_STATUS, FIELD_ASTERISK, FIELD_DISABLED, FIELD_HEIGHT, FIELD_HELPER, FIELD_HELPER_GAP, FIELD_LABEL, FIELD_LABEL_GAP, FIELD_MIN_HEIGHT, FIELD_PADDING_X, FIELD_RADIUS, FIELD_STATE, FIELD_TEXT, FILE_KIND_META, MONTHS_FULL_EN, MONTHS_FULL_VI, MONTHS_SHORT_VI, OlAccordion, OlAccordionItem, OlAlert, OlAlertDialog, OlAppNav, OlAspectRatio, OlAutocomplete, OlAvatar, OlAvatarGroup, OlBackdrop, OlBadge, OlBanner, OlBottomNav, OlBottomNavItem, OlBreadcrumb, OlBreadcrumbItem, OlButton, OlButtonGroup, OlCard, OlCarousel, OlCarouselSlide, OlChart, OlChatBubble, OlChatContainer, OlCheckbox, OlCheckboxRadioForm, OlCheckboxRadioGroup, OlClipboard, OlCollapse, OlCommand, OlDateRangePicker, OlDatepicker, OlDatepickerDirective, OlDatepickerFooter, OlDatepickerHeader, OlDatepickerPopup, OlDatepickerStateService, OlDayView, OlDeviceMockup, OlDownloadAppButton, OlDrawer, OlDrawerFooter, OlDrawerHeader, OlDropdown, OlDropdownHeader, OlDropdownItem, OlEmpty, OlFileDropzone, OlFileInput, OlFileItem, OlFileUpload, OlFloatingLabel, OlFocusTrapService, OlFooter, OlFrame, OlGallery, OlGalleryItem, OlHelper, OlIcon, OlIconService, OlIconShape, OlIconStack, OlImagePreview, OlInput, OlInputCounter, OlItem, OlJumbotron, OlKbd, OlLabel, OlListGroup, OlListGroupItem, OlLoadingOverlay, OlMenubar, OlModal, OlModalFooter, OlModalHeader, OlMonthView, OlNavDropdown, OlNavbar, OlNavbarItem, OlOtpInput, OlOverlayContainer, OlPagination, OlPopover, OlPopoverContent, OlPositioningService, OlProgress, OlProgressBarService, OlProgressBarTop, OlRadio, OlRange, OlRating, OlResizable, OlRichTextEditor, OlScrollArea, OlScrollspy, OlSegmented, OlSelect, OlSeparator, OlSidebar, OlSidebarGroup, OlSidebarItem, OlSidebarSubmenu, OlSkeleton, OlSpeedDial, OlSpeedDialItem, OlSpinner, OlStepItem, OlStepper, OlTabItem, OlTable, OlTableLoading, OlTableRow, OlTabs, OlTagInput, OlTextarea, OlTimeline, OlTimelineItem, OlTimepicker, OlToast, OlToastContainer, OlToastService, OlToggle, OlToggleGroup, OlToggleInput, OlTooltip, OlTooltipDirective, OlTree, OlTreeNodeItem, OlYearView, WEEKDAYS_SHORT_EN, WEEKDAYS_SHORT_VI, boDau, cloneDate, detectFileKind, endOfDay, fieldSizeClasses, fileExtension, filesFromClipboard, formatDate, formatFileSize, generateMonthMatrix, generateMonthsMatrix, generateYearsMatrix, isBetween, isDateDisabled, isEditableTarget, isSameDay, isSameMonth, isSameYear, isToday, matchesAccept, parseDate, pasteShortcutLabel, startOfDay, stripDiacritics, toUploadFile, validateFiles };
7913
- export type { AccordionVariant, AlertColor, AlertDialogTone, AlertLayout, AlertRounded, AlertType, AlertVariant, AppDevice, AppNavConfig, AppNavGroup, AppNavItem, AppNavUser, AppTheme, AutocompleteOption, AutocompleteSize, AutocompleteState, AvatarShape, AvatarSize, AvatarStatus, BadgeColor, BadgeShape, BadgeSize, BadgeTheme, BadgeType, BannerPosition, BannerVariant, BoxplotDataPoint, BreadcrumbItemStatus, BreadcrumbSeparator, BreadcrumbVariant, ButtonColor, ButtonGroupColor, ButtonGroupOrientation, ButtonGroupSize, ButtonSize, CardPadding, CardRadius, CardShadow, CardVariant, ChartDataPoint, ChartSeries, ChartType, ChatBubbleStatus, ChatSender, CheckboxSize, ChoiceControl, ChoiceControlPosition, ChoiceGroupLayout, ChoiceLayout, ChoiceShape, CommandGroup, CommandItem, DateCustomClass, DateRange, DatepickerPreset, DatepickerSelectionMode, DatepickerSize, DatepickerViewMode, DayCell, DeviceType, DrawerFooterLayout, DrawerPlacement, DrawerSize, DropdownAutoClose, DropdownPlacement, DropdownTrigger, EmptySize, FieldSize, FieldState, FileInputSize, FileItemVariant, FileKind, FileKindMeta, FileRejectReason, FileRejection, FileUploadMode, FileValidationResult, FileValidationRules, FloatingLabelSize, FloatingLabelState, FloatingLabelVariant, HeatmapData, HelperFeature, HelperRule, HelperSize, HelperState, IconColor, IconShapeColor, IconShapeSize, IconShapeType, IconSize, IconVariant, InputCounterSize, InputSize, InputState, JumbotronVariant, ListGroupType, ModalFooterLayout, ModalPlacement, ModalSize, MonthCell, OlAvatarStatusPosition, OlBottomNavPosition, OlButtonType, OlCheckboxRadioFormAlign, OlCheckboxRadioGroupRole, OlDateRangePickerVariant, OlFrameRounded, OlFrameSpacing, OlFrameVariant, OlGalleryGap, OlGalleryRatio, OlHelperType, OlIconStackSize, OlItemAlign, OlItemSize, OlMenubarItem, OlMenubarMenu, OlModalBackdrop, OlModalRole, OlPreviewImage, OlResizableDirection, OlScrollspyItem, OlScrollspyOrientation, OlSkeletonAnimation, OlSkeletonAspectRatio, OlSkeletonRounded, OlSkeletonType, OlSpeedDialTooltipPosition, OlTimepickerAddonType, OlToggleInputAlign, OlTreeNode, OlTreeNodeSelectionMode, OlTreeNodeToggleIcon, OlTreeSelectionMode, OlTreeToggleIcon, OlUploadFile, OtpInputSize, OverlayLayer, PaginationType, PaginationVariant, PopoverPlacement, PopoverTrigger, PositionedCoordinates, PositioningOptions, ProgressColor, ProgressLabelPosition, ProgressSize, RadarIndicator, RadioSize, RatingType, ScatterDataPoint, ScatterSeries, ScrollAreaAxis, ScrollAreaScrollbar, SegmentedOption, SegmentedSize, SelectOption, SelectSize, SelectState, SeparatorOrientation, SpeedDialAction, SpeedDialColor, SpeedDialDirection, SpeedDialTrigger, SpeedDialType, StepState, StepperBreakpoint, StepperOrientation, StepperVariant, TabsSize, TabsVariant, TagInputSize, TextareaState, TimeObject, TimepickerFormat, TimepickerSize, TimepickerState, Toast, ToastConfig, ToastPosition, ToggleColor, TogglePosition, ToggleSize, UploadStatus, YearCell };
8316
+ export { CHAT_BUBBLE_STATUS, FIELD_ASTERISK, FIELD_CLEAR_RESERVE_END, FIELD_DISABLED, FIELD_HEIGHT, FIELD_HELPER, FIELD_HELPER_GAP, FIELD_ICON_GAP, FIELD_ICON_RESERVE_END, FIELD_ICON_RESERVE_START, FIELD_LABEL, FIELD_LABEL_BESIDE, FIELD_LABEL_GAP, FIELD_MIN_HEIGHT, FIELD_PADDING_END, FIELD_PADDING_START, FIELD_PADDING_X, FIELD_RADIUS, FIELD_STATE, FIELD_TEXT, FILE_KIND_META, FLOAT_LABEL_START, MONTHS_FULL_EN, MONTHS_FULL_VI, MONTHS_SHORT_VI, OlAccordion, OlAccordionItem, OlAlert, OlAlertDialog, OlAppNav, OlAspectRatio, OlAutocomplete, OlAvatar, OlAvatarGroup, OlBackdrop, OlBadge, OlBanner, OlBottomNav, OlBottomNavItem, OlBreadcrumb, OlBreadcrumbItem, OlButton, OlButtonGroup, OlCard, OlCarousel, OlCarouselSlide, OlChart, OlChatBubble, OlChatContainer, OlCheckbox, OlCheckboxRadioForm, OlCheckboxRadioGroup, OlClipboard, OlCollapse, OlCommand, OlDateRangePicker, OlDatepicker, OlDatepickerDirective, OlDatepickerFooter, OlDatepickerHeader, OlDatepickerPopup, OlDatepickerStateService, OlDayView, OlDeviceMockup, OlDownloadAppButton, OlDrawer, OlDrawerFooter, OlDrawerHeader, OlDropdown, OlDropdownHeader, OlDropdownItem, OlDropdownSearch, OlDropdownState, OlEmpty, OlFileDropzone, OlFileInput, OlFileItem, OlFileUpload, OlFocusTrapService, OlFooter, OlFrame, OlGallery, OlGalleryItem, OlHelper, OlIcon, OlIconService, OlIconShape, OlIconStack, OlImagePreview, OlInput, OlInputCounter, OlItem, OlJumbotron, OlKbd, OlLabel, OlListGroup, OlListGroupItem, OlLoadingOverlay, OlMenubar, OlModal, OlModalFooter, OlModalHeader, OlMonthView, OlNavDropdown, OlNavbar, OlNavbarItem, OlOtpInput, OlOverlayContainer, OlPagination, OlPopover, OlPopoverContent, OlPositioningService, OlProgress, OlProgressBarService, OlProgressBarTop, OlRadio, OlRange, OlRating, OlResizable, OlRichTextEditor, OlScrollArea, OlScrollspy, OlSegmented, OlSelect, OlSeparator, OlSidebar, OlSidebarGroup, OlSidebarItem, OlSidebarSubmenu, OlSkeleton, OlSpeedDial, OlSpeedDialItem, OlSpinner, OlStepItem, OlStepper, OlTabItem, OlTable, OlTableLoading, OlTableRow, OlTabs, OlTagInput, OlTextarea, OlTimeline, OlTimelineItem, OlTimepicker, OlToast, OlToastContainer, OlToastService, OlToggle, OlToggleGroup, OlToggleInput, OlTooltip, OlTooltipDirective, OlTree, OlTreeNodeItem, OlYearView, PICKER_ICON_RESERVE_START, WEEKDAYS_SHORT_EN, WEEKDAYS_SHORT_VI, boDau, cloneDate, detectFileKind, endOfDay, fieldLabelLayout, fieldSizeClasses, fileExtension, filesFromClipboard, formatDate, formatFileSize, generateMonthMatrix, generateMonthsMatrix, generateYearsMatrix, isBetween, isDateDisabled, isEditableTarget, isSameDay, isSameMonth, isSameYear, isToday, matchesAccept, multiValuePadY, parseDate, pasteShortcutLabel, startOfDay, stripDiacritics, toUploadFile, validateFiles };
8317
+ export type { AccordionVariant, AlertColor, AlertDialogTone, AlertLayout, AlertRounded, AlertType, AlertVariant, AppDevice, AppNavConfig, AppNavGroup, AppNavItem, AppNavUser, AppTheme, AutocompleteOption, AutocompleteSize, AutocompleteState, AvatarShape, AvatarSize, AvatarStatus, BadgeColor, BadgeShape, BadgeSize, BadgeTheme, BadgeType, BannerPosition, BannerVariant, BoxplotDataPoint, BreadcrumbItemStatus, BreadcrumbSeparator, BreadcrumbVariant, ButtonColor, ButtonGroupColor, ButtonGroupOrientation, ButtonGroupSize, ButtonSize, CardPadding, CardRadius, CardShadow, CardVariant, ChartDataPoint, ChartSeries, ChartType, ChatBubbleStatus, ChatSender, CheckboxSize, ChoiceControl, ChoiceControlPosition, ChoiceGroupLayout, ChoiceLayout, ChoiceShape, CommandGroup, CommandItem, DateCustomClass, DateRange, DatepickerPreset, DatepickerSelectionMode, DatepickerSize, DatepickerViewMode, DayCell, DeviceType, DrawerFooterLayout, DrawerPlacement, DrawerSize, DropdownAutoClose, DropdownPlacement, DropdownStateType, DropdownTrigger, EmptySize, FieldSize, FieldState, FileInputSize, FileItemVariant, FileKind, FileKindMeta, FileRejectReason, FileRejection, FileUploadMode, FileValidationResult, FileValidationRules, FloatingVariant, HeatmapData, HelperFeature, HelperRule, HelperSize, HelperState, IconColor, IconShapeColor, IconShapeSize, IconShapeType, IconSize, IconVariant, InputCounterSize, InputSize, InputState, JumbotronVariant, LabelPosition, ListGroupType, ModalFooterLayout, ModalPlacement, ModalSize, MonthCell, NavbarCollapseAt, NavbarDensity, OlAvatarStatusPosition, OlBottomNavPosition, OlButtonType, OlCheckboxRadioFormAlign, OlCheckboxRadioGroupRole, OlDateRangePickerVariant, OlFrameRounded, OlFrameSpacing, OlFrameVariant, OlGalleryGap, OlGalleryRatio, OlHelperType, OlIconStackSize, OlItemAlign, OlItemSize, OlMenubarItem, OlMenubarMenu, OlModalBackdrop, OlModalRole, OlPreviewImage, OlResizableDirection, OlScrollspyItem, OlScrollspyOrientation, OlSkeletonAnimation, OlSkeletonAspectRatio, OlSkeletonRounded, OlSkeletonType, OlSpeedDialTooltipPosition, OlTimepickerAddonType, OlToggleInputAlign, OlTreeNode, OlTreeNodeSelectionMode, OlTreeNodeToggleIcon, OlTreeSelectionMode, OlTreeToggleIcon, OlUploadFile, OtpInputSize, OverlayLayer, PaginationType, PaginationVariant, PopoverPlacement, PopoverTrigger, PositionedCoordinates, PositioningOptions, ProgressColor, ProgressLabelPosition, ProgressSize, RadarIndicator, RadioSize, RatingType, ScatterDataPoint, ScatterSeries, ScrollAreaAxis, ScrollAreaScrollbar, SegmentedColor, SegmentedOption, SegmentedSize, SelectOption, SelectSize, SelectState, SeparatorOrientation, SpeedDialAction, SpeedDialColor, SpeedDialDirection, SpeedDialTrigger, SpeedDialType, StepState, StepperBreakpoint, StepperOrientation, StepperVariant, TabsSize, TabsVariant, TagInputSize, TextareaState, TimeObject, TimepickerFormat, TimepickerSize, TimepickerState, Toast, ToastConfig, ToastPosition, ToggleColor, TogglePosition, ToggleSize, UploadStatus, YearCell };
7914
8318
  //# sourceMappingURL=edmicro-olkit.d.ts.map