@feugene/granularity 0.45.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/chunks/{x-circle-BCBURwyX.js → check-circle-Bnrb-CGJ.js} +8 -32
- package/dist/chunks/check-circle-Bnrb-CGJ.js.map +1 -0
- package/dist/chunks/{config-BqT6PMzO.js → config-B42iJ48O.js} +5 -1
- package/dist/chunks/{config-BqT6PMzO.js.map → config-B42iJ48O.js.map} +1 -1
- package/dist/chunks/{config-BGCyyXiD.js → config-BAse0laT.js} +5 -1
- package/dist/chunks/{config-BGCyyXiD.js.map → config-BAse0laT.js.map} +1 -1
- package/dist/chunks/{config-MmPym-Z7.js → config-BLP94dPY.js} +5 -1
- package/dist/chunks/{config-MmPym-Z7.js.map → config-BLP94dPY.js.map} +1 -1
- package/dist/chunks/{config-CjKpUcmy.js → config-Bdf1bt-m.js} +25 -16
- package/dist/chunks/config-Bdf1bt-m.js.map +1 -0
- package/dist/chunks/{config-CIkdsWUk.js → config-CIUU9ZpY.js} +4 -1
- package/dist/chunks/config-CIUU9ZpY.js.map +1 -0
- package/dist/chunks/{config-BhfNgyWL.js → config-DENqOoh0.js} +5 -1
- package/dist/chunks/config-DENqOoh0.js.map +1 -0
- package/dist/chunks/{config-ChnYtO4o.js → config-bjDf8nBf.js} +16 -1
- package/dist/chunks/config-bjDf8nBf.js.map +1 -0
- package/dist/chunks/controlState-DoImKciE.js +35 -0
- package/dist/chunks/controlState-DoImKciE.js.map +1 -0
- package/dist/chunks/{en-DiHzFact.js → en-DjTnfTqM.js} +3 -1
- package/dist/chunks/en-DjTnfTqM.js.map +1 -0
- package/dist/chunks/{es-1ZL6NtkB.js → es-Bc_t3FI8.js} +3 -1
- package/dist/chunks/es-Bc_t3FI8.js.map +1 -0
- package/dist/chunks/{es-CeKkMxZ_.js → es-DIFzSXSZ.js} +3 -3
- package/dist/chunks/{es-CeKkMxZ_.js.map → es-DIFzSXSZ.js.map} +1 -1
- package/dist/chunks/{generated-DAKeOOqm.js → generated-CQ4h6Ieq.js} +28 -0
- package/dist/chunks/{generated-DAKeOOqm.js.map → generated-CQ4h6Ieq.js.map} +1 -1
- package/dist/chunks/{granular-provider-D_8_l-gM.js → granular-provider-AKukmYva.js} +7 -7
- package/dist/chunks/{granular-provider-D_8_l-gM.js.map → granular-provider-AKukmYva.js.map} +1 -1
- package/dist/chunks/{ru-Dr2RYn0P.js → ru-Bb-co59W.js} +3 -1
- package/dist/chunks/ru-Bb-co59W.js.map +1 -0
- package/dist/chunks/x-circle-BigSZy8m.js +26 -0
- package/dist/chunks/x-circle-BigSZy8m.js.map +1 -0
- package/dist/components/GrAlert/chunks/{GrAlert-D72y1IEh.js → GrAlert-CfEZghSY.js} +2 -1
- package/dist/components/GrAlert/chunks/{GrAlert-D72y1IEh.js.map → GrAlert-CfEZghSY.js.map} +1 -1
- package/dist/components/GrAlert/index.js +1 -1
- package/dist/components/GrAutocomplete/chunks/{GrAutocomplete-D396_JrW.js → GrAutocomplete-C-uovdv8.js} +320 -224
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-C-uovdv8.js.map +1 -0
- package/dist/components/GrAutocomplete/index.js +1 -1
- package/dist/components/GrAutocomplete/styles.css +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-9mTR-YZ_.js → GrColorPicker-BRM_4lyI.js} +1 -1
- package/dist/components/GrColorPicker/chunks/{GrColorPicker-9mTR-YZ_.js.map → GrColorPicker-BRM_4lyI.js.map} +1 -1
- package/dist/components/GrColorPicker/index.js +1 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-Ha4s3DMT.js.map → GrCommandPalette-BJHmkDQv.js.map} +1 -1
- package/dist/components/GrCommandPalette/index.js +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-e15nFI8M.js → GrConfirmDialog-BzUQwbec.js} +1 -1
- package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-e15nFI8M.js.map → GrConfirmDialog-BzUQwbec.js.map} +1 -1
- package/dist/components/GrConfirmDialog/index.js +1 -1
- package/dist/components/GrDataTable/chunks/{GrDataTable-xNSmO_I-.js → GrDataTable-Dp9Fp_P5.js} +606 -499
- package/dist/components/GrDataTable/chunks/GrDataTable-Dp9Fp_P5.js.map +1 -0
- package/dist/components/GrDataTable/index.js +1 -1
- package/dist/components/GrDialogService/chunks/{GrDialogService-BmXiYmUp.js → GrDialogService-Dtq0ZCN5.js} +3 -3
- package/dist/components/GrDialogService/chunks/{GrDialogService-BmXiYmUp.js.map → GrDialogService-Dtq0ZCN5.js.map} +1 -1
- package/dist/components/GrDialogService/index.js +1 -1
- package/dist/components/GrFormField/chunks/GrFormField-DO61vxpS.js.map +1 -1
- package/dist/components/GrInput/chunks/{GrInput-TFeBm3gQ.js → GrInput-DV4gMWPR.js} +40 -11
- package/dist/components/GrInput/chunks/GrInput-DV4gMWPR.js.map +1 -0
- package/dist/components/GrInput/index.js +2 -2
- package/dist/components/GrInputTag/chunks/{GrInputTag-Ci8AO1ze.js → GrInputTag-CO0YU-ok.js} +30 -6
- package/dist/components/GrInputTag/chunks/GrInputTag-CO0YU-ok.js.map +1 -0
- package/dist/components/GrInputTag/index.js +2 -2
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-CdlWMGnF.js → GrJsonViewer-D7CyWzhT.js} +2 -2
- package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-CdlWMGnF.js.map → GrJsonViewer-D7CyWzhT.js.map} +1 -1
- package/dist/components/GrJsonViewer/index.js +1 -1
- package/dist/components/GrNumberInput/chunks/{GrNumberInput-CL5QhOmx.js → GrNumberInput-BI6-vkcs.js} +48 -16
- package/dist/components/GrNumberInput/chunks/GrNumberInput-BI6-vkcs.js.map +1 -0
- package/dist/components/GrNumberInput/index.js +2 -2
- package/dist/components/GrPagination/chunks/{GrPagination-DhbNZHEF.js → GrPagination-BbaF5eXk.js} +10 -7
- package/dist/components/GrPagination/chunks/GrPagination-BbaF5eXk.js.map +1 -0
- package/dist/components/GrPagination/index.js +2 -2
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-8RxQsOQ_.js → GrPromptDialog-BEL-QgwE.js} +3 -3
- package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-8RxQsOQ_.js.map → GrPromptDialog-BEL-QgwE.js.map} +1 -1
- package/dist/components/GrPromptDialog/index.js +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-NEEJZ8zi.js → GrResponseErrorBanner-Bdd5c07x.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-NEEJZ8zi.js.map → GrResponseErrorBanner-Bdd5c07x.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-ZvBvEQDZ.js → GrResponseErrorBanner-DySe1ym4.js} +1 -1
- package/dist/components/GrResponseErrorBanner/chunks/{GrResponseErrorBanner-ZvBvEQDZ.js.map → GrResponseErrorBanner-DySe1ym4.js.map} +1 -1
- package/dist/components/GrResponseErrorBanner/index.js +2 -2
- package/dist/components/GrSelect/chunks/{GrSelect-Do1iAyp1.js → GrSelect-0iI4wdR_.js} +3 -3
- package/dist/components/GrSelect/chunks/{GrSelect-Do1iAyp1.js.map → GrSelect-0iI4wdR_.js.map} +1 -1
- package/dist/components/GrSelect/index.js +1 -1
- package/dist/components/GrTextarea/chunks/{GrTextarea-BII3w61K.js → GrTextarea-Bfgc0DD2.js} +73 -32
- package/dist/components/GrTextarea/chunks/GrTextarea-Bfgc0DD2.js.map +1 -0
- package/dist/components/GrTextarea/index.js +2 -2
- package/dist/components/GrToaster/chunks/{GrToaster-D-sV-9of.js → GrToaster-CZixNk0l.js} +2 -1
- package/dist/components/GrToaster/chunks/{GrToaster-D-sV-9of.js.map → GrToaster-CZixNk0l.js.map} +1 -1
- package/dist/components/GrToaster/index.js +1 -1
- package/dist/components/GrTransfer/chunks/{GrTransfer-8FA78ny6.js → GrTransfer-DdfBUf35.js} +2 -2
- package/dist/components/GrTransfer/chunks/{GrTransfer-8FA78ny6.js.map → GrTransfer-DdfBUf35.js.map} +1 -1
- package/dist/components/GrTransfer/index.js +1 -1
- package/dist/components/GrTree/chunks/{GrTree-DnDGW0xO.js → GrTree-6yZrncJE.js} +52 -18
- package/dist/components/GrTree/chunks/GrTree-6yZrncJE.js.map +1 -0
- package/dist/components/GrTree/index.js +1 -1
- package/dist/components/GrTree/styles.css +1 -1
- package/dist/components/GrTreeSections/chunks/{GrTreeSections-D2PQ87mw.js → GrTreeSections-DcmDcLwj.js} +5 -3
- package/dist/components/GrTreeSections/chunks/GrTreeSections-DcmDcLwj.js.map +1 -0
- package/dist/components/GrTreeSections/index.js +2 -2
- package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DzheDCuZ.js → GrTreeSelect-B6KoDYiZ.js} +44 -19
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-B6KoDYiZ.js.map +1 -0
- package/dist/components/GrTreeSelect/index.js +2 -2
- package/dist/granular-provider-node.js +1 -1
- package/dist/granular-provider.js +1 -1
- package/dist/i18n/all.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.js +30 -30
- package/dist/theme.js +1 -1
- package/dist/tokens.js +1 -1
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteNavigation.d.ts +39 -0
- package/dist/types/components/GrAutocomplete/composables/useAutocompletePanel.d.ts +36 -0
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteValues.d.ts +28 -0
- package/dist/types/components/GrAutocomplete/composables/useAutocompleteVirtual.d.ts +33 -0
- package/dist/types/components/GrAutocomplete/composables/useRemoteOptions.d.ts +33 -0
- package/dist/types/components/GrDataTable/GrDataTable.vue.d.ts +1 -1
- package/dist/types/components/GrDataTable/composables/useDataTableColumnOrder.d.ts +45 -0
- package/dist/types/components/GrDataTable/composables/useDataTableColumnWidths.d.ts +38 -0
- package/dist/types/components/GrDataTable/composables/useDataTableLayout.d.ts +29 -0
- package/dist/types/components/GrDataTable/composables/useDataTableRowKeys.d.ts +16 -0
- package/dist/types/components/GrDataTable/composables/useDataTableSelection.d.ts +32 -0
- package/dist/types/components/GrDataTable/composables/useDataTableSort.d.ts +37 -0
- package/dist/types/components/GrFormField/GrFormField.vue.d.ts +7 -1
- package/dist/types/components/GrPagination/GrPagination.vue.d.ts +17 -2
- package/dist/types/components/GrPagination/grPaginationStyles.d.ts +15 -6
- package/dist/types/components/GrPagination/index.d.ts +1 -1
- package/dist/types/components/GrTree/grTreeStyles.d.ts +1 -1
- package/dist/types/components/GrTreeSections/grTreeSectionsStyles.d.ts +15 -0
- package/dist/types/components/shared/controlState.d.ts +36 -0
- package/dist/types/i18n/messages/en.d.ts +4 -0
- package/dist/types/i18n/messages/es.d.ts +4 -0
- package/dist/types/i18n/messages/ru.d.ts +4 -0
- package/dist/web-types.json +4 -3
- package/package.json +1 -1
- package/dist/chunks/config-BhfNgyWL.js.map +0 -1
- package/dist/chunks/config-CIkdsWUk.js.map +0 -1
- package/dist/chunks/config-ChnYtO4o.js.map +0 -1
- package/dist/chunks/config-CjKpUcmy.js.map +0 -1
- package/dist/chunks/en-DiHzFact.js.map +0 -1
- package/dist/chunks/es-1ZL6NtkB.js.map +0 -1
- package/dist/chunks/ru-Dr2RYn0P.js.map +0 -1
- package/dist/chunks/x-circle-BCBURwyX.js.map +0 -1
- package/dist/components/GrAutocomplete/chunks/GrAutocomplete-D396_JrW.js.map +0 -1
- package/dist/components/GrDataTable/chunks/GrDataTable-xNSmO_I-.js.map +0 -1
- package/dist/components/GrInput/chunks/GrInput-TFeBm3gQ.js.map +0 -1
- package/dist/components/GrInputTag/chunks/GrInputTag-Ci8AO1ze.js.map +0 -1
- package/dist/components/GrNumberInput/chunks/GrNumberInput-CL5QhOmx.js.map +0 -1
- package/dist/components/GrPagination/chunks/GrPagination-DhbNZHEF.js.map +0 -1
- package/dist/components/GrTextarea/chunks/GrTextarea-BII3w61K.js.map +0 -1
- package/dist/components/GrTree/chunks/GrTree-DnDGW0xO.js.map +0 -1
- package/dist/components/GrTreeSections/chunks/GrTreeSections-D2PQ87mw.js.map +0 -1
- package/dist/components/GrTreeSelect/chunks/GrTreeSelect-DzheDCuZ.js.map +0 -1
- package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-Ha4s3DMT.js → GrCommandPalette-BJHmkDQv.js} +1 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ComputedRef, Ref, ShallowRef } from 'vue';
|
|
2
|
+
import type { GrAutocompleteModelValue, GrAutocompleteOption, GrAutocompleteValue } from '../GrAutocomplete.vue';
|
|
3
|
+
/**
|
|
4
|
+
* Значение и опции `GrAutocomplete`: что выбрано и как это назвать.
|
|
5
|
+
*
|
|
6
|
+
* Ничего про панель, клавиатуру и вид. Состав списка зависит от того, отвечал
|
|
7
|
+
* ли уже сервер: до первого ответа источник — проп `options`, иначе последний
|
|
8
|
+
* ответ `fetchOptions`.
|
|
9
|
+
*/
|
|
10
|
+
export interface UseAutocompleteValuesOptions<TValue extends GrAutocompleteValue> {
|
|
11
|
+
modelValue: () => GrAutocompleteModelValue<TValue>;
|
|
12
|
+
options: () => GrAutocompleteOption<TValue>[] | undefined;
|
|
13
|
+
multiple: () => boolean;
|
|
14
|
+
fetchOptions: () => unknown;
|
|
15
|
+
remoteOptions: ShallowRef<GrAutocompleteOption<TValue>[]>;
|
|
16
|
+
remoteAnswered: Ref<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export interface AutocompleteValues<TValue extends GrAutocompleteValue> {
|
|
19
|
+
optionsResolved: ComputedRef<GrAutocompleteOption<TValue>[]>;
|
|
20
|
+
isEmptyValue: (value: unknown) => boolean;
|
|
21
|
+
modelSingle: ComputedRef<TValue | ''>;
|
|
22
|
+
selectedValues: ComputedRef<TValue[]>;
|
|
23
|
+
hasSelection: ComputedRef<boolean>;
|
|
24
|
+
labelFor: (value: GrAutocompleteValue) => string;
|
|
25
|
+
selectedOptions: ComputedRef<GrAutocompleteOption<TValue>[]>;
|
|
26
|
+
singleSelectedLabel: ComputedRef<string>;
|
|
27
|
+
}
|
|
28
|
+
export declare function useAutocompleteValues<TValue extends GrAutocompleteValue>(options: UseAutocompleteValuesOptions<TValue>): AutocompleteValues<TValue>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ComputedRef, Ref } from 'vue';
|
|
2
|
+
import { useVirtualList } from '../../../composables/useVirtualList';
|
|
3
|
+
import type { GrAutocompleteOption, GrAutocompleteValue } from '../GrAutocomplete.vue';
|
|
4
|
+
/**
|
|
5
|
+
* Виртуализация панели `GrAutocomplete`.
|
|
6
|
+
*
|
|
7
|
+
* Набор — `[«Add …»?] + effectiveOptions`, тот же, по которому ходит клавиатура.
|
|
8
|
+
* Иначе верхняя распорка вытолкнула бы строку «Add …» вниз: она отрисована
|
|
9
|
+
* внутри listbox'а первой и является полноценной опцией. Отсюда `addOffset`,
|
|
10
|
+
* который сдвигает окно виртуализатора относительно индексов в списке опций.
|
|
11
|
+
*/
|
|
12
|
+
export interface UseAutocompleteVirtualOptions<TValue extends GrAutocompleteValue> {
|
|
13
|
+
/** Контейнер списка: по нему считается окно и замеряются строки. */
|
|
14
|
+
listboxEl: Ref<HTMLElement | null>;
|
|
15
|
+
effectiveOptions: ComputedRef<GrAutocompleteOption<TValue>[]>;
|
|
16
|
+
canAddCustom: ComputedRef<boolean>;
|
|
17
|
+
virtual: () => boolean;
|
|
18
|
+
dropdownMaxHeight: () => number;
|
|
19
|
+
}
|
|
20
|
+
export interface AutocompleteVirtual<TValue extends GrAutocompleteValue> {
|
|
21
|
+
/** Сдвиг окна из-за строки «Add …»: она идёт нулевым элементом набора. */
|
|
22
|
+
addOffset: ComputedRef<number>;
|
|
23
|
+
virtualCount: ComputedRef<number>;
|
|
24
|
+
virtualizer: ReturnType<typeof useVirtualList>;
|
|
25
|
+
showAddOption: ComputedRef<boolean>;
|
|
26
|
+
renderedOptions: ComputedRef<Array<{
|
|
27
|
+
option: GrAutocompleteOption<TValue>;
|
|
28
|
+
index: number;
|
|
29
|
+
}>>;
|
|
30
|
+
optionSetProps: (virtualIndex: number) => Record<string, number> | undefined;
|
|
31
|
+
listboxStyle: ComputedRef<Record<string, string>>;
|
|
32
|
+
}
|
|
33
|
+
export declare function useAutocompleteVirtual<TValue extends GrAutocompleteValue>(options: UseAutocompleteVirtualOptions<TValue>): AutocompleteVirtual<TValue>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Ref, ShallowRef } from 'vue';
|
|
2
|
+
import type { GrAutocompleteOption, GrAutocompleteValue } from '../GrAutocomplete.vue';
|
|
3
|
+
/**
|
|
4
|
+
* Дебаунснутая удалённая загрузка опций.
|
|
5
|
+
*
|
|
6
|
+
* Три вещи, каждая из которых по отдельности выглядит необязательной, а вместе
|
|
7
|
+
* составляют весь смысл модуля: запрос откладывается на `debounce`, летящий
|
|
8
|
+
* отменяется новым, а ответ, стартовавший раньше и пришедший позже, обязан
|
|
9
|
+
* проиграть последнему — иначе список показывает результат старого запроса.
|
|
10
|
+
*
|
|
11
|
+
* От DOM не зависит вовсе, поэтому проверяется без монтирования компонента.
|
|
12
|
+
*
|
|
13
|
+
* Единственный потребитель сегодня — `GrAutocomplete`. Появится второй
|
|
14
|
+
* (открытая строка аудита: `GrTransfer` отдаёт `search` наружу, а подгрузку
|
|
15
|
+
* делает потребитель) — модулю место в `composables/internal/`.
|
|
16
|
+
*/
|
|
17
|
+
export interface UseRemoteOptionsOptions<TValue extends GrAutocompleteValue> {
|
|
18
|
+
fetchOptions: () => ((query: string, signal: AbortSignal) => Promise<GrAutocompleteOption<TValue>[]>) | undefined;
|
|
19
|
+
/** Стартовый список: его смена сбрасывает ответ сервера. */
|
|
20
|
+
options: () => GrAutocompleteOption<TValue>[] | undefined;
|
|
21
|
+
debounce: () => number;
|
|
22
|
+
minQueryLength: () => number;
|
|
23
|
+
onSearch: (query: string) => void;
|
|
24
|
+
onSearchError: (error: unknown) => void;
|
|
25
|
+
}
|
|
26
|
+
export interface RemoteOptions<TValue extends GrAutocompleteValue> {
|
|
27
|
+
remoteOptions: ShallowRef<GrAutocompleteOption<TValue>[]>;
|
|
28
|
+
remoteAnswered: Ref<boolean>;
|
|
29
|
+
remoteLoading: Ref<boolean>;
|
|
30
|
+
scheduleSearch: (value: string) => void;
|
|
31
|
+
cancelSearch: () => void;
|
|
32
|
+
}
|
|
33
|
+
export declare function useRemoteOptions<TValue extends GrAutocompleteValue>(options: UseRemoteOptionsOptions<TValue>): RemoteOptions<TValue>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ComputedRef } from 'vue';
|
|
2
|
+
import { useDragSort } from '../../../composables/useDragSort';
|
|
3
|
+
import { useRovingFocus } from '../../../composables/useRovingFocus';
|
|
4
|
+
import type { GrDataColumn } from '../GrDataTable.vue';
|
|
5
|
+
/**
|
|
6
|
+
* Порядок колонок `GrDataTable`: перестановка указателем и с клавиатуры.
|
|
7
|
+
*
|
|
8
|
+
* Закреплённые колонки стоят своими группами у своих краёв, и перенос через
|
|
9
|
+
* границу группы запрещён — иначе «закреплена слева» перестало бы означать
|
|
10
|
+
* «слева». Отсюда `pinGroupOf` и проверка `sameGroup` в каждом пути переноса.
|
|
11
|
+
*
|
|
12
|
+
* Карты элементов приходят снаружи: их наполняет шаблон, и они же нужны
|
|
13
|
+
* модулям ширины и раскладки — владеть ими единолично этот модуль не может.
|
|
14
|
+
*/
|
|
15
|
+
export interface UseDataTableColumnOrderOptions<TRow extends Record<string, unknown>> {
|
|
16
|
+
columns: () => GrDataColumn<TRow>[];
|
|
17
|
+
/** Контролируемый порядок. `undefined` — компонент помнит порядок сам. */
|
|
18
|
+
columnOrder: () => string[] | undefined;
|
|
19
|
+
reorderableColumns: () => boolean;
|
|
20
|
+
loading: () => boolean;
|
|
21
|
+
/** Заголовочные ячейки по ключу колонки — цель перетаскивания. */
|
|
22
|
+
headerCellEls: Map<string, HTMLElement>;
|
|
23
|
+
/** Ручки переноса по ключу колонки — кольцо роверного фокуса. */
|
|
24
|
+
columnHandleEls: Map<string, HTMLElement>;
|
|
25
|
+
onOrderChange: (order: string[], moved: {
|
|
26
|
+
key: string;
|
|
27
|
+
from: number;
|
|
28
|
+
to: number;
|
|
29
|
+
}) => void;
|
|
30
|
+
/** Объявление в живой регион: перенос указателем без него беззвучен. */
|
|
31
|
+
announceMove: (label: string, position: number, count: number) => void;
|
|
32
|
+
}
|
|
33
|
+
export interface DataTableColumnOrder<TRow extends Record<string, unknown>> {
|
|
34
|
+
orderedColumns: ComputedRef<GrDataColumn<TRow>[]>;
|
|
35
|
+
columnKeys: ComputedRef<string[]>;
|
|
36
|
+
pinGroupOf: (col: GrDataColumn<TRow>) => number;
|
|
37
|
+
indexOfColumn: (key: string) => number;
|
|
38
|
+
draggingColumnKey: ComputedRef<string | null>;
|
|
39
|
+
columnDropClass: (index: number) => string;
|
|
40
|
+
onColumnHandleKeydown: (event: KeyboardEvent, key: string) => Promise<void>;
|
|
41
|
+
/** Жест и кольцо фокуса отдаются целиком: шаблон зовёт их собственный API. */
|
|
42
|
+
columnSort: ReturnType<typeof useDragSort<string, number>>;
|
|
43
|
+
columnRoving: ReturnType<typeof useRovingFocus<string>>;
|
|
44
|
+
}
|
|
45
|
+
export declare function useDataTableColumnOrder<TRow extends Record<string, unknown>>(options: UseDataTableColumnOrderOptions<TRow>): DataTableColumnOrder<TRow>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ComputedRef, Ref } from 'vue';
|
|
2
|
+
import type { GrDataColumn } from '../GrDataTable.vue';
|
|
3
|
+
/** Уже колонки не бывает: в неё перестаёт помещаться даже стрелка сортировки. */
|
|
4
|
+
export declare const MIN_COLUMN_WIDTH = 48;
|
|
5
|
+
/**
|
|
6
|
+
* Ширина колонок `GrDataTable`: протяжка ручки, клавиатура и сброс к авторазметке.
|
|
7
|
+
*
|
|
8
|
+
* Измеренные ширины сюда **приходят снаружи** (`setMeasuredWidths`): замер —
|
|
9
|
+
* дело раскладки, которая ходит в DOM после отрисовки, а здесь они только
|
|
10
|
+
* читаются, чтобы ручка называла значение с первого рендера.
|
|
11
|
+
*/
|
|
12
|
+
export interface UseDataTableColumnWidthsOptions<TRow extends Record<string, unknown>> {
|
|
13
|
+
/** Колонки в текущем порядке — по ним считается минимальная ширина таблицы. */
|
|
14
|
+
orderedColumns: () => GrDataColumn<TRow>[];
|
|
15
|
+
/** Контролируемые ширины. `undefined` — компонент помнит их сам. */
|
|
16
|
+
columnWidths: () => Record<string, number> | undefined;
|
|
17
|
+
resizableColumns: () => boolean;
|
|
18
|
+
loading: () => boolean;
|
|
19
|
+
/** Заголовочные ячейки: стартовая ширина протяжки берётся замером. */
|
|
20
|
+
headerCellEls: Map<string, HTMLElement>;
|
|
21
|
+
onWidthsChange: (widths: Record<string, number>) => void;
|
|
22
|
+
onColumnResize: (key: string, width: number) => void;
|
|
23
|
+
announceWidth: (label: string, width: number) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface DataTableColumnWidths<TRow extends Record<string, unknown>> {
|
|
26
|
+
columnWidths: ComputedRef<Record<string, number>>;
|
|
27
|
+
measuredColumnWidths: Ref<Record<string, number>>;
|
|
28
|
+
setMeasuredWidths: (widths: Record<string, number>) => void;
|
|
29
|
+
widthOf: (col: GrDataColumn<TRow>) => string | number | undefined;
|
|
30
|
+
tableMinWidth: ComputedRef<number | undefined>;
|
|
31
|
+
resizingKey: Ref<string | null>;
|
|
32
|
+
onResizerPointerDown: (event: PointerEvent, key: string) => void;
|
|
33
|
+
onResizerKeydown: (event: KeyboardEvent, key: string) => void;
|
|
34
|
+
/** Сброс к авторазметке — двойной клик по ручке в шаблоне. */
|
|
35
|
+
resetColumnWidth: (key: string) => void;
|
|
36
|
+
resizerValue: (col: GrDataColumn<TRow>) => number;
|
|
37
|
+
}
|
|
38
|
+
export declare function useDataTableColumnWidths<TRow extends Record<string, unknown>>(options: UseDataTableColumnWidthsOptions<TRow>): DataTableColumnWidths<TRow>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ComputedRef } from 'vue';
|
|
2
|
+
import type { GrDataColumn } from '../GrDataTable.vue';
|
|
3
|
+
/** Служебная колонка выбора в реестре ячеек: своего ключа у неё нет. */
|
|
4
|
+
export declare const SELECT_COLUMN_KEY = "__select__";
|
|
5
|
+
/**
|
|
6
|
+
* Раскладка закреплённых колонок: смещения липких ячеек и замер шапки.
|
|
7
|
+
*
|
|
8
|
+
* Единственный модуль таблицы, который целиком про DOM. Смещения нельзя
|
|
9
|
+
* вычислить из пропов: колонка может жить на авторазметке, и её ширина
|
|
10
|
+
* известна только после отрисовки — отсюда замер, а не `computed`.
|
|
11
|
+
*/
|
|
12
|
+
export interface UseDataTableLayoutOptions<TRow extends Record<string, unknown>> {
|
|
13
|
+
orderedColumns: () => GrDataColumn<TRow>[];
|
|
14
|
+
columnKeys: () => string[];
|
|
15
|
+
selectable: () => boolean;
|
|
16
|
+
resizableColumns: () => boolean;
|
|
17
|
+
headerCellEls: Map<string, HTMLElement>;
|
|
18
|
+
/** Пересчитать раскладку заново при смене этих значений. */
|
|
19
|
+
watchSources: () => unknown;
|
|
20
|
+
/** Измеренные ширины уезжают модулю ширин: ручка ресайза называет по ним значение. */
|
|
21
|
+
onMeasuredWidths: (widths: Record<string, number>) => void;
|
|
22
|
+
}
|
|
23
|
+
export interface DataTableLayout<TRow extends Record<string, unknown>> {
|
|
24
|
+
hasPinnedLeft: ComputedRef<boolean>;
|
|
25
|
+
pinnedStyleOf: (col: GrDataColumn<TRow>) => Record<string, string> | undefined;
|
|
26
|
+
pinnedCellClass: (col: GrDataColumn<TRow>, index: number) => string[];
|
|
27
|
+
measureLayout: () => void;
|
|
28
|
+
}
|
|
29
|
+
export declare function useDataTableLayout<TRow extends Record<string, unknown>>(options: UseDataTableLayoutOptions<TRow>): DataTableLayout<TRow>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { GrDataTableRowKey } from '../GrDataTable.vue';
|
|
2
|
+
/**
|
|
3
|
+
* Ключ строки: значение из данных, а при его отсутствии — синтетический.
|
|
4
|
+
*
|
|
5
|
+
* Без синтетического строка получила бы `String(undefined ?? '')` — **один и
|
|
6
|
+
* тот же** ключ на всю таблицу: Vue переиспользовал бы DOM не по назначению, а
|
|
7
|
+
* выбор одной строки помечал бы выбранными все. Ключ привязан к идентичности
|
|
8
|
+
* объекта, поэтому переживает сортировку и не зависит от индекса.
|
|
9
|
+
*/
|
|
10
|
+
export interface UseDataTableRowKeysOptions<TRow extends Record<string, unknown>> {
|
|
11
|
+
rowKey: () => GrDataTableRowKey<TRow>;
|
|
12
|
+
}
|
|
13
|
+
export interface DataTableRowKeys<TRow extends Record<string, unknown>> {
|
|
14
|
+
rowKeyValue: (row: TRow) => string | number;
|
|
15
|
+
}
|
|
16
|
+
export declare function useDataTableRowKeys<TRow extends Record<string, unknown>>(options: UseDataTableRowKeysOptions<TRow>): DataTableRowKeys<TRow>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ComputedRef } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* Выбор строк `GrDataTable`.
|
|
4
|
+
*
|
|
5
|
+
* Считается по **видимым и выбираемым** строкам: они же дают состояние
|
|
6
|
+
* галочки в шапке. Ключи строк, которых сейчас в наборе нет (отфильтрованы,
|
|
7
|
+
* на другой странице), из выбора не выпадают — «снять все» убирает только
|
|
8
|
+
* видимые.
|
|
9
|
+
*
|
|
10
|
+
* Как и сортировка, эмитов не знает: наружу сообщает `onSelectedChange`.
|
|
11
|
+
*/
|
|
12
|
+
export interface UseDataTableSelectionOptions<TRow extends Record<string, unknown>> {
|
|
13
|
+
/** Строки в текущем порядке — уже отсортированные. */
|
|
14
|
+
rows: () => TRow[];
|
|
15
|
+
/** Контролируемый список ключей. `undefined` — компонент помнит выбор сам. */
|
|
16
|
+
selected: () => Array<string | number> | undefined;
|
|
17
|
+
selectableRow: () => ((row: TRow) => boolean) | undefined;
|
|
18
|
+
rowKeyValue: (row: TRow) => string | number;
|
|
19
|
+
onSelectedChange: (keys: Array<string | number>) => void;
|
|
20
|
+
}
|
|
21
|
+
export interface DataTableSelection<TRow extends Record<string, unknown>> {
|
|
22
|
+
selectedKeys: ComputedRef<Set<string | number>>;
|
|
23
|
+
isRowSelectable: (row: TRow) => boolean;
|
|
24
|
+
isRowSelected: (row: TRow) => boolean;
|
|
25
|
+
/** Видимые выбираемые строки: по их числу шапка гасит «выбрать все». */
|
|
26
|
+
selectableRows: ComputedRef<TRow[]>;
|
|
27
|
+
allSelected: ComputedRef<boolean>;
|
|
28
|
+
someSelected: ComputedRef<boolean>;
|
|
29
|
+
toggleRow: (row: TRow) => void;
|
|
30
|
+
toggleAll: () => void;
|
|
31
|
+
}
|
|
32
|
+
export declare function useDataTableSelection<TRow extends Record<string, unknown>>(options: UseDataTableSelectionOptions<TRow>): DataTableSelection<TRow>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ComputedRef } from 'vue';
|
|
2
|
+
import type { GrDataColumn, GrDataTableSortCycle } from '../GrDataTable.vue';
|
|
3
|
+
import type { GrDataTableSortDir } from '../grDataTableSort';
|
|
4
|
+
/**
|
|
5
|
+
* Сортировка `GrDataTable`: состояние, порядок строк и обход состояний по клику.
|
|
6
|
+
*
|
|
7
|
+
* Модель эмитов не знает — о смене сообщает колбэком `onSortChange`, а
|
|
8
|
+
* `update:sortKey`/`update:sortDir`/`sortChange` остаются заботой компонента.
|
|
9
|
+
* Так же устроен `GrTree`: модель отдельно, эмиты связывает SFC.
|
|
10
|
+
*
|
|
11
|
+
* Сравнение значений, включая пустые и смешанные типы, живёт в
|
|
12
|
+
* `grDataTableSort.ts` и здесь только вызывается.
|
|
13
|
+
*/
|
|
14
|
+
export interface UseDataTableSortOptions<TRow extends Record<string, unknown>> {
|
|
15
|
+
rows: () => TRow[];
|
|
16
|
+
/** Контролируемый ключ. `undefined` — компонент помнит порядок сам. */
|
|
17
|
+
sortKey: () => string | undefined;
|
|
18
|
+
/** Контролируемое направление. */
|
|
19
|
+
sortDir: () => GrDataTableSortDir | undefined;
|
|
20
|
+
initialSortKey: () => string | undefined;
|
|
21
|
+
initialSortDir: () => GrDataTableSortDir;
|
|
22
|
+
/** Внешняя сортировка: `rows` приходят уже отсортированными. */
|
|
23
|
+
externalSort: () => boolean;
|
|
24
|
+
sortCycle: () => GrDataTableSortCycle;
|
|
25
|
+
/** Язык сравнения строк; не задан — сравнение по умолчанию рантайма. */
|
|
26
|
+
locale: () => string | undefined;
|
|
27
|
+
onSortChange: (key: string, dir: GrDataTableSortDir) => void;
|
|
28
|
+
}
|
|
29
|
+
export interface DataTableSort<TRow extends Record<string, unknown>> {
|
|
30
|
+
currentSortKey: ComputedRef<string>;
|
|
31
|
+
currentSortDir: ComputedRef<GrDataTableSortDir>;
|
|
32
|
+
sortedRows: ComputedRef<TRow[]>;
|
|
33
|
+
toggleSort: (col: GrDataColumn<TRow>) => void;
|
|
34
|
+
clearSort: () => void;
|
|
35
|
+
ariaSortFor: (col: GrDataColumn<TRow>) => 'ascending' | 'descending' | 'none' | undefined;
|
|
36
|
+
}
|
|
37
|
+
export declare function useDataTableSort<TRow extends Record<string, unknown>>(options: UseDataTableSortOptions<TRow>): DataTableSort<TRow>;
|
|
@@ -17,7 +17,13 @@ export interface GrFormFieldProps {
|
|
|
17
17
|
error?: string | string[];
|
|
18
18
|
/** Подсказка под лейблом/над контролом (можно также через слот `#hint`). */
|
|
19
19
|
hint?: string;
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Помечает поле обязательным: маркер `*` в подписи и `aria-required` у контрола.
|
|
22
|
+
*
|
|
23
|
+
* Маркер помечен `aria-hidden`, поэтому объявляет обязательность именно
|
|
24
|
+
* контрол — а чем именно, решает его роль. Разбор случая `role="group"`,
|
|
25
|
+
* который `aria-required` не допускает, — на странице компонента.
|
|
26
|
+
*/
|
|
21
27
|
required?: boolean;
|
|
22
28
|
/** Всё поле только для чтения: контролы внутри перестают редактироваться. */
|
|
23
29
|
readonly?: boolean;
|
|
@@ -7,11 +7,26 @@ import { type GrPaginationSize } from './grPaginationStyles';
|
|
|
7
7
|
* (алгоритм boundary/sibling, как у MUI): всегда видны первая/последняя страница
|
|
8
8
|
* и `siblingCount` соседей вокруг текущей.
|
|
9
9
|
*/
|
|
10
|
+
/**
|
|
11
|
+
* Вариант размера страницы: число либо пара «значение + подпись».
|
|
12
|
+
*
|
|
13
|
+
* Пара нужна там, где подпись не равна числу («50 / стр.», «Все»): собрать её
|
|
14
|
+
* из голого `number[]` было нельзя, а обходной путь — свой `GrSelect` рядом —
|
|
15
|
+
* терял связь с пагинацией.
|
|
16
|
+
*/
|
|
17
|
+
export type GrPaginationPageSizeOption = number | {
|
|
18
|
+
value: number;
|
|
19
|
+
label: string;
|
|
20
|
+
};
|
|
10
21
|
export interface GrPaginationProps {
|
|
11
22
|
page: number;
|
|
12
23
|
pageSize: number;
|
|
13
24
|
total: number;
|
|
14
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Варианты размера страницы. Число — подпись равна значению; пара — своя
|
|
27
|
+
* подпись при том же значении («50 / стр.»), которую иначе было не собрать.
|
|
28
|
+
*/
|
|
29
|
+
pageSizes?: GrPaginationPageSizeOption[];
|
|
15
30
|
/** Сколько соседних страниц показывать вокруг текущей. По умолчанию `1`. */
|
|
16
31
|
siblingCount?: number;
|
|
17
32
|
/** Сколько крайних страниц всегда показывать с каждого края. По умолчанию `1`. */
|
|
@@ -85,7 +100,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
|
|
|
85
100
|
size: GrPaginationSize;
|
|
86
101
|
compact: boolean;
|
|
87
102
|
ariaLabel: string;
|
|
88
|
-
pageSizes:
|
|
103
|
+
pageSizes: GrPaginationPageSizeOption[];
|
|
89
104
|
siblingCount: number;
|
|
90
105
|
boundaryCount: number;
|
|
91
106
|
showJumper: boolean;
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import type { GrComponentSize } from '../shared/sizes';
|
|
2
2
|
export type GrPaginationSize = GrComponentSize;
|
|
3
|
-
/**
|
|
4
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Номер страницы и многоточие: одна и та же коробка, чтобы ряд не прыгал.
|
|
5
|
+
*
|
|
6
|
+
* Высоты — шкала `GrButton` (`28/32/40/44`), а не своя. Номера стоят с
|
|
7
|
+
* навигационными кнопками в одном ряду, и собственная шкала это ломала:
|
|
8
|
+
* `sm` и `md` были одной коробкой `h-8`, а кнопке приходилось выдавать размер
|
|
9
|
+
* на ступень ниже имени. Имя `pageBoxSizes`, а не `pageSizes`, потому что
|
|
10
|
+
* `pageSizes` — проп со списком размеров страницы, и одно имя на два разных
|
|
11
|
+
* понятия в одном компоненте читается как ошибка.
|
|
12
|
+
*/
|
|
13
|
+
export declare const pageBoxSizes: Record<GrPaginationSize, string>;
|
|
5
14
|
/** Коробка та же, что у номера, но поле́ уже: многоточию не нужен клик-таргет. */
|
|
6
15
|
export declare const ellipsisSizes: Record<GrPaginationSize, string>;
|
|
7
16
|
/** Вспомогательный текст: индикатор «текущая / всего» и подпись у поля перехода. */
|
|
@@ -11,9 +20,9 @@ export declare const rowGaps: Record<GrPaginationSize, string>;
|
|
|
11
20
|
export declare const pageListGaps: Record<GrPaginationSize, string>;
|
|
12
21
|
export declare const pageSizeSelectWidths: Record<GrPaginationSize, string>;
|
|
13
22
|
/**
|
|
14
|
-
* Навигационные кнопки берут размер
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
23
|
+
* Навигационные кнопки берут свой размер один в один: коробка номера теперь
|
|
24
|
+
* той же высоты, что и `GrButton` того же имени, и сдвигать ступень больше не
|
|
25
|
+
* нужно. Отображение оставлено явным — оно называет инвариант «кнопка и номер
|
|
26
|
+
* одного роста», который иначе держался бы на совпадении двух шкал.
|
|
18
27
|
*/
|
|
19
28
|
export declare const navButtonSizes: Record<GrPaginationSize, GrComponentSize>;
|
|
@@ -4,4 +4,4 @@ export { grPaginationConfig } from './config';
|
|
|
4
4
|
export type { GrPaginationConfigurableProps } from './defaults';
|
|
5
5
|
export type { GrPaginationSize } from './grPaginationStyles';
|
|
6
6
|
export { grPaginationSafelist } from './safelist';
|
|
7
|
-
export type { GrPaginationEmits } from './GrPagination.vue';
|
|
7
|
+
export type { GrPaginationEmits, GrPaginationPageSizeOption } from './GrPagination.vue';
|
|
@@ -30,5 +30,5 @@ export declare const treeSizeVars: Record<GrTreeSize, GrTreeSizeVars>;
|
|
|
30
30
|
* значки — это `expandIcon`/`collapseIcon` и слот строки, то есть решение
|
|
31
31
|
* потребителя, а не вида.
|
|
32
32
|
*/
|
|
33
|
-
export type GrTreeView = 'explorer' | 'rail' | 'outline';
|
|
33
|
+
export type GrTreeView = 'explorer' | 'rail' | 'outline' | 'picker';
|
|
34
34
|
export declare const grTreeViewVars: Record<GrTreeView, Record<string, string>>;
|
|
@@ -6,3 +6,18 @@ export declare const treeSectionsRootClass = "flex flex-col gap-4";
|
|
|
6
6
|
export declare const treeSectionsHeadClass = "flex items-baseline gap-2 pb-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] uppercase tracking-wider text-[var(--gr-muted-fg)] border-b border-[var(--gr-brd)]";
|
|
7
7
|
export declare const treeSectionsCountClass = "ml-auto text-[var(--gr-muted-fg)] [font-variant-numeric:tabular-nums]";
|
|
8
8
|
export declare const treeSectionsGroupClass = "flex flex-col gap-1";
|
|
9
|
+
/**
|
|
10
|
+
* Собственный вид строк секций. Задаётся на самом дереве, а не на обёртке:
|
|
11
|
+
* `GrTree` объявляет значения по умолчанию на своём корне, и переменная,
|
|
12
|
+
* выставленная предком, до строки не доходит вовсе — её перекрывает
|
|
13
|
+
* собственное объявление дерева.
|
|
14
|
+
*
|
|
15
|
+
* Полоса у выбранной строки несёт то же, что заголовок группы, —
|
|
16
|
+
* принадлежность: подложка выбора отступает на отступ уровня, и на вложенных
|
|
17
|
+
* строках выбор переставал попадать в один вертикальный ряд с остальными.
|
|
18
|
+
*/
|
|
19
|
+
export declare const treeSectionsRowVars: {
|
|
20
|
+
readonly '--gr-tree-row-min-height': "32px";
|
|
21
|
+
readonly '--gr-tree-row-radius': "7px";
|
|
22
|
+
readonly '--gr-tree-row-current-bar-width': "2px";
|
|
23
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Небуквенный признак состояния форм-контрола.
|
|
3
|
+
*
|
|
4
|
+
* `state="success"`/`"warning"` до этого несли смысл **только цветом рамки**, а
|
|
5
|
+
* это WCAG 1.4.1: цвет не может быть единственным носителем информации. Иконка
|
|
6
|
+
* добавляет форму, а скрытая подпись — программный канал: у `success` и
|
|
7
|
+
* `warning`, в отличие от `danger`, ARIA-состояния не существует вовсе, и
|
|
8
|
+
* объявить их нечем, кроме текста в `aria-describedby`.
|
|
9
|
+
*
|
|
10
|
+
* Модуль общий на пять контролов (`GrInput`, `GrTextarea`, `GrNumberInput`,
|
|
11
|
+
* `GrInputTag`, `GrTreeSelect`), поэтому его классы обязан объявить **каждый**
|
|
12
|
+
* импортёр: в `dist` общий модуль лежит в чанке без адреса и в область скана
|
|
13
|
+
* пресета не попадает.
|
|
14
|
+
*/
|
|
15
|
+
/** Состояния, у которых признак есть. `danger` его не получает — см. ниже. */
|
|
16
|
+
export type GrControlSignalState = 'success' | 'warning';
|
|
17
|
+
/**
|
|
18
|
+
* `danger` в набор не входит намеренно. Его смысл уже несут два канала:
|
|
19
|
+
* `aria-invalid` для скринридера и текст ошибки от `GrFormField` для глаз.
|
|
20
|
+
* Третья иконка рядом с ними — шум, а не признак.
|
|
21
|
+
*/
|
|
22
|
+
export declare const controlStateIconClass = "pointer-events-none flex h-6 w-6 shrink-0 items-center justify-center";
|
|
23
|
+
/**
|
|
24
|
+
* Цвет иконки — роль `-text`, а не насыщенный тон: `--gr-success` выверен как
|
|
25
|
+
* заливка и в роли текста не добирает AA. Гейт `styleTokens` это ловит.
|
|
26
|
+
*/
|
|
27
|
+
export declare const controlStateIconColors: Record<GrControlSignalState, string>;
|
|
28
|
+
/** Ключ локали подписи. Текст один на все контролы: состояние у них общее. */
|
|
29
|
+
export declare const controlStateTextKey: Record<GrControlSignalState, string>;
|
|
30
|
+
export declare const controlStateFallbackText: Record<GrControlSignalState, string>;
|
|
31
|
+
/**
|
|
32
|
+
* Показывать ли признак: только у `success`/`warning` и только пока поле не
|
|
33
|
+
* объявлено невалидным. Иначе галочка «корректно» соседствовала бы с
|
|
34
|
+
* `aria-invalid="true"` и противоречила ему.
|
|
35
|
+
*/
|
|
36
|
+
export declare function controlSignalState(state: string | undefined, invalid: boolean): GrControlSignalState | undefined;
|
|
@@ -48,6 +48,8 @@ export declare const en: {
|
|
|
48
48
|
add: string;
|
|
49
49
|
clear: string;
|
|
50
50
|
close: string;
|
|
51
|
+
stateSuccess: string;
|
|
52
|
+
stateWarning: string;
|
|
51
53
|
};
|
|
52
54
|
loading: {
|
|
53
55
|
defaultText: string;
|
|
@@ -441,6 +443,8 @@ export declare const en: {
|
|
|
441
443
|
add: string;
|
|
442
444
|
clear: string;
|
|
443
445
|
close: string;
|
|
446
|
+
stateSuccess: string;
|
|
447
|
+
stateWarning: string;
|
|
444
448
|
};
|
|
445
449
|
loading: {
|
|
446
450
|
defaultText: string;
|
|
@@ -41,6 +41,8 @@ export declare const es: {
|
|
|
41
41
|
add: string;
|
|
42
42
|
clear: string;
|
|
43
43
|
close: string;
|
|
44
|
+
stateSuccess: string;
|
|
45
|
+
stateWarning: string;
|
|
44
46
|
};
|
|
45
47
|
loading: {
|
|
46
48
|
defaultText: string;
|
|
@@ -436,6 +438,8 @@ export declare const es: {
|
|
|
436
438
|
add: string;
|
|
437
439
|
clear: string;
|
|
438
440
|
close: string;
|
|
441
|
+
stateSuccess: string;
|
|
442
|
+
stateWarning: string;
|
|
439
443
|
};
|
|
440
444
|
loading: {
|
|
441
445
|
defaultText: string;
|
|
@@ -41,6 +41,8 @@ export declare const ru: {
|
|
|
41
41
|
add: string;
|
|
42
42
|
clear: string;
|
|
43
43
|
close: string;
|
|
44
|
+
stateSuccess: string;
|
|
45
|
+
stateWarning: string;
|
|
44
46
|
};
|
|
45
47
|
loading: {
|
|
46
48
|
defaultText: string;
|
|
@@ -438,6 +440,8 @@ export declare const ru: {
|
|
|
438
440
|
add: string;
|
|
439
441
|
clear: string;
|
|
440
442
|
close: string;
|
|
443
|
+
stateSuccess: string;
|
|
444
|
+
stateWarning: string;
|
|
441
445
|
};
|
|
442
446
|
loading: {
|
|
443
447
|
defaultText: string;
|
package/dist/web-types.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
|
|
3
3
|
"name": "@feugene/granularity",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.47.0",
|
|
5
5
|
"framework": "vue",
|
|
6
6
|
"js-types-syntax": "typescript",
|
|
7
7
|
"description-markup": "markdown",
|
|
@@ -4771,7 +4771,7 @@
|
|
|
4771
4771
|
},
|
|
4772
4772
|
{
|
|
4773
4773
|
"name": "required",
|
|
4774
|
-
"description": "Помечает поле
|
|
4774
|
+
"description": "Помечает поле обязательным: маркер `*` в подписи и `aria-required` у контрола. Маркер помечен `aria-hidden`, поэтому объявляет обязательность именно контрол — а чем именно, решает его роль. Разбор случая `role=\"group\"`, который `aria-required` не допускает, — на странице компонента.",
|
|
4775
4775
|
"default": "false",
|
|
4776
4776
|
"value": {
|
|
4777
4777
|
"kind": "expression",
|
|
@@ -7147,10 +7147,11 @@
|
|
|
7147
7147
|
},
|
|
7148
7148
|
{
|
|
7149
7149
|
"name": "pageSizes",
|
|
7150
|
+
"description": "Варианты размера страницы. Число — подпись равна значению; пара — своя подпись при том же значении («50 / стр.»), которую иначе было не собрать.",
|
|
7150
7151
|
"default": "[10, 20, 50]",
|
|
7151
7152
|
"value": {
|
|
7152
7153
|
"kind": "expression",
|
|
7153
|
-
"type": "
|
|
7154
|
+
"type": "GrPaginationPageSizeOption[] | undefined"
|
|
7154
7155
|
}
|
|
7155
7156
|
},
|
|
7156
7157
|
{
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feugene/granularity",
|
|
3
3
|
"description": "Granularity design system package with Vue 3 components, consumed via the `@feugene/unocss-preset-granular` preset.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.47.0",
|
|
5
5
|
"license": "LicenseRef-Granularity-EUC-1.1",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Evgeniy Fureev",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-BhfNgyWL.js","names":[],"sources":["../../src/components/GrTextarea/safelist.ts","../../src/components/GrTextarea/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n borderClassByState,\n countClass,\n countRowClass,\n lineCountClass,\n disabledSurfaceClass,\n enabledSurfaceClass,\n invalidBorderClass,\n resizeClass,\n sizes,\n} from './grTextareaStyles'\n\nexport const grTextareaSafelist = [...new Set([\n ...Object.values(borderClassByState).flatMap(splitClassTokens),\n ...splitClassTokens(invalidBorderClass),\n ...Object.values(sizes).flatMap(splitClassTokens),\n ...Object.values(resizeClass).flatMap(splitClassTokens),\n ...splitClassTokens(enabledSurfaceClass),\n ...splitClassTokens(disabledSurfaceClass),\n ...splitClassTokens(countClass),\n ...splitClassTokens(countRowClass),\n ...splitClassTokens(lineCountClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTextareaSafelist } from './safelist'\n\nexport const grTextareaConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTextarea',\n safelist: grTextareaSafelist,\n})\n"],"mappings":";;;;AAaA,IAAa,qBAAqB,CAAC,mBAAG,IAAI,IAAI;CAC5C,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,QAAQ,gBAAgB;CAChD,GAAG,OAAO,OAAO,WAAW,CAAC,CAAC,QAAQ,gBAAgB;CACtD,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,UAAU;CAC9B,GAAG,iBAAiB,aAAa;CACjC,GAAG,iBAAiB,cAAc;AACpC,CAAC,CAAC;;;ACnBF,IAAa,mBAAmB,wBAAwB,YAAY,KAAK;CACvE,MAAM;CACN,UAAU;AACZ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-CIkdsWUk.js","names":[],"sources":["../../src/components/GrInput/safelist.ts","../../src/components/GrInput/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport {\n addonInlinePrefixClass,\n addonInlineSuffixClass,\n addonSegmentPrefixClass,\n addonSegmentSuffixClass,\n invalidClass,\n shellBaseClass,\n shellDisabledClass,\n shellEnabledClass,\n sizes,\n states,\n textAlign,\n} from './grInputStyles'\n\nexport const grInputSafelist = [...new Set([\n ...Object.values(sizes).flatMap(splitClassTokens),\n ...Object.values(textAlign).flatMap(splitClassTokens),\n ...Object.values(states).flatMap(splitClassTokens),\n ...splitClassTokens(invalidClass),\n ...splitClassTokens(shellBaseClass),\n ...splitClassTokens(shellEnabledClass),\n ...splitClassTokens(shellDisabledClass),\n ...splitClassTokens(addonSegmentPrefixClass),\n ...splitClassTokens(addonSegmentSuffixClass),\n ...splitClassTokens(addonInlinePrefixClass),\n ...splitClassTokens(addonInlineSuffixClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\nimport { grInputSafelist } from './safelist'\n\nexport const grInputConfig = defineGranularComponent(import.meta.url, {\n name: 'GrInput',\n safelist: grInputSafelist,\n})\n"],"mappings":";;;;AAeA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACzC,GAAG,OAAO,OAAO,KAAK,CAAC,CAAC,QAAQ,gBAAgB;CAChD,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,gBAAgB;CACjD,GAAG,iBAAiB,YAAY;CAChC,GAAG,iBAAiB,cAAc;CAClC,GAAG,iBAAiB,iBAAiB;CACrC,GAAG,iBAAiB,kBAAkB;CACtC,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,sBAAsB;AAC5C,CAAC,CAAC;;;ACxBF,IAAa,gBAAgB,wBAAwB,YAAY,KAAK;CACpE,MAAM;CACN,UAAU;AACZ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-ChnYtO4o.js","names":[],"sources":["../../src/components/GrTreeSections/grTreeSectionsStyles.ts","../../src/components/GrTreeSections/safelist.ts","../../src/components/GrTreeSections/config.ts"],"sourcesContent":["export const treeSectionsRootClass = 'flex flex-col gap-4'\n\n/**\n * Заголовок группы набирается капителью и отделяется линией: он объявляет\n * рубрику, а не узел, и должен читаться иначе, чем строки под ним.\n */\nexport const treeSectionsHeadClass = 'flex items-baseline gap-2 pb-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)] uppercase tracking-wider text-[var(--gr-muted-fg)] border-b border-[var(--gr-brd)]'\n\nexport const treeSectionsCountClass = 'ml-auto text-[var(--gr-muted-fg)] [font-variant-numeric:tabular-nums]'\n\nexport const treeSectionsGroupClass = 'flex flex-col gap-1'\n","import { splitClassTokens } from '../shared/classTokens'\n\nimport {\n treeSectionsCountClass,\n treeSectionsGroupClass,\n treeSectionsHeadClass,\n treeSectionsRootClass,\n} from './grTreeSectionsStyles'\n\nexport const grTreeSectionsSafelist = [...new Set([\n ...splitClassTokens(treeSectionsRootClass),\n ...splitClassTokens(treeSectionsHeadClass),\n ...splitClassTokens(treeSectionsCountClass),\n ...splitClassTokens(treeSectionsGroupClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grTreeSectionsSafelist } from './safelist'\n\nexport const grTreeSectionsConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTreeSections',\n dependencies: ['GrTree'],\n safelist: grTreeSectionsSafelist,\n})\n"],"mappings":";;;AAAA,IAAa,wBAAwB;;;;;AAMrC,IAAa,wBAAwB;AAErC,IAAa,yBAAyB;AAEtC,IAAa,yBAAyB;;;ACDtC,IAAa,yBAAyB,CAAC,mBAAG,IAAI,IAAI;CAChD,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,qBAAqB;CACzC,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,sBAAsB;AAC5C,CAAC,CAAC;;;ACVF,IAAa,uBAAuB,wBAAwB,YAAY,KAAK;CAC3E,MAAM;CACN,cAAc,CAAC,QAAQ;CACvB,UAAU;AACZ,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-CjKpUcmy.js","names":[],"sources":["../../src/components/GrPagination/grPaginationStyles.ts","../../src/components/GrPagination/safelist.ts","../../src/components/GrPagination/config.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\nexport type GrPaginationSize = GrComponentSize\n\n/** Номер страницы и многоточие: одна и та же коробка, чтобы ряд не прыгал. */\nexport const pageSizes: Record<GrPaginationSize, string> = {\n xs: 'h-7 min-w-7 px-1.5 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 min-w-8 px-2 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-8 min-w-8 px-2 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-10 min-w-10 px-3 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\n/** Коробка та же, что у номера, но поле́ уже: многоточию не нужен клик-таргет. */\nexport const ellipsisSizes: Record<GrPaginationSize, string> = {\n xs: 'h-7 min-w-7 px-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 min-w-8 px-1 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-8 min-w-8 px-1 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-10 min-w-10 px-2 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\n/** Вспомогательный текст: индикатор «текущая / всего» и подпись у поля перехода. */\nexport const labelSizes: Record<GrPaginationSize, string> = {\n xs: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const jumperSizes: Record<GrPaginationSize, string> = {\n xs: 'h-7 w-12 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n sm: 'h-8 w-14 text-[length:var(--gr-text-xs)] leading-[var(--gr-leading-xs)]',\n md: 'h-8 w-14 text-[length:var(--gr-text-sm)] leading-[var(--gr-leading-sm)]',\n lg: 'h-10 w-16 text-[length:var(--gr-text-base)] leading-[var(--gr-leading-base)]',\n}\n\nexport const rowGaps: Record<GrPaginationSize, string> = {\n xs: 'gap-2',\n sm: 'gap-2',\n md: 'gap-3',\n lg: 'gap-3',\n}\n\nexport const pageListGaps: Record<GrPaginationSize, string> = {\n xs: 'gap-0.5',\n sm: 'gap-1',\n md: 'gap-1',\n lg: 'gap-1',\n}\n\nexport const pageSizeSelectWidths: Record<GrPaginationSize, string> = {\n xs: 'min-w-[84px]',\n sm: 'min-w-[92px]',\n md: 'min-w-[100px]',\n lg: 'min-w-[112px]',\n}\n\n/**\n * Навигационные кнопки берут размер из шкалы `GrButton`, а не из своей: они\n * обязаны стоять в один ряд с номерами страниц, а высоты у `GrButton`\n * `xs…lg` — `28/32/40/44px`. На `md` номера страниц ростом `h-8`, поэтому\n * кнопке достаётся `sm`, а не одноимённый `md`.\n */\nexport const navButtonSizes: Record<GrPaginationSize, GrComponentSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n ellipsisSizes,\n jumperSizes,\n labelSizes,\n pageListGaps,\n pageSizes,\n pageSizeSelectWidths,\n rowGaps,\n} from './grPaginationStyles'\n\nexport const grPaginationSafelist = [...new Set([\n ...Object.values(pageSizes).flatMap(splitClassTokens),\n ...Object.values(ellipsisSizes).flatMap(splitClassTokens),\n ...Object.values(labelSizes).flatMap(splitClassTokens),\n ...Object.values(jumperSizes).flatMap(splitClassTokens),\n ...Object.values(rowGaps).flatMap(splitClassTokens),\n ...Object.values(pageListGaps).flatMap(splitClassTokens),\n ...Object.values(pageSizeSelectWidths).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grPaginationSafelist } from './safelist'\n\nexport const grPaginationConfig = defineGranularComponent(import.meta.url, {\n name: 'GrPagination',\n dependencies: ['GrButton', 'GrSelect'],\n safelist: grPaginationSafelist,\n})\n"],"mappings":";;;;AAKA,IAAa,YAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,gBAAkD;CAC7D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,aAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,cAAgD;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,UAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,eAAiD;CAC5D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,uBAAyD;CACpE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;AAQA,IAAa,iBAA4D;CACvE,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;ACxDA,IAAa,uBAAuB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC,QAAQ,gBAAgB;CACpD,GAAG,OAAO,OAAO,aAAa,CAAC,CAAC,QAAQ,gBAAgB;CACxD,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC,QAAQ,gBAAgB;CACrD,GAAG,OAAO,OAAO,WAAW,CAAC,CAAC,QAAQ,gBAAgB;CACtD,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,QAAQ,gBAAgB;CAClD,GAAG,OAAO,OAAO,YAAY,CAAC,CAAC,QAAQ,gBAAgB;CACvD,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;AACjE,CAAC,CAAC;;;ACfF,IAAa,qBAAqB,wBAAwB,YAAY,KAAK;CACzE,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;CACrC,UAAU;AACZ,CAAC"}
|