@feugene/granularity 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/chunks/config-BTCOJO5z2.js.map +1 -0
  2. package/dist/chunks/config-B_qi4Fma.js.map +1 -0
  3. package/dist/chunks/config-Baj7Wvx-.js.map +1 -0
  4. package/dist/chunks/{config-BKvX0q10.js → config-C5mO5DYZ.js} +10 -1
  5. package/dist/chunks/config-C5mO5DYZ.js.map +1 -0
  6. package/dist/chunks/config-CIcynHGr.js +96 -0
  7. package/dist/chunks/config-CIcynHGr.js.map +1 -0
  8. package/dist/chunks/{config-BsuDM3Hb.js → config-CKULiuvc.js} +15 -1
  9. package/dist/chunks/config-CKULiuvc.js.map +1 -0
  10. package/dist/chunks/{config-jyZq8XKL.js → config-DCwQBMmJ.js} +12 -3
  11. package/dist/chunks/config-DCwQBMmJ.js.map +1 -0
  12. package/dist/chunks/config-QaIc_gRa.js.map +1 -0
  13. package/dist/chunks/config-eXB87DOi.js.map +1 -0
  14. package/dist/chunks/copy-DChChcq-.js +29 -0
  15. package/dist/chunks/copy-DChChcq-.js.map +1 -0
  16. package/dist/chunks/{trending-up-Bf9AQmoq.js → deltaTone-B5OoS1vo.js} +19 -1
  17. package/dist/chunks/deltaTone-B5OoS1vo.js.map +1 -0
  18. package/dist/chunks/{en-CwAr3C_x.js → en-DCCFP4qu.js} +12 -2
  19. package/dist/chunks/{en-CwAr3C_x.js.map → en-DCCFP4qu.js.map} +1 -1
  20. package/dist/chunks/{es-TR4g2I4A.js → es-CT34HBVM.js} +12 -2
  21. package/dist/chunks/{es-TR4g2I4A.js.map → es-CT34HBVM.js.map} +1 -1
  22. package/dist/chunks/{es-Do1q9_SF.js → es-DdJsxlUr.js} +3 -3
  23. package/dist/chunks/{es-Do1q9_SF.js.map → es-DdJsxlUr.js.map} +1 -1
  24. package/dist/chunks/{generated-Do60Aq2I.js → generated-CiCrGDQO.js} +49 -0
  25. package/dist/chunks/{generated-Do60Aq2I.js.map → generated-CiCrGDQO.js.map} +1 -1
  26. package/dist/chunks/{granular-provider-BW2uopTG.js → granular-provider-CQKhl5C_.js} +10 -8
  27. package/dist/chunks/granular-provider-CQKhl5C_.js.map +1 -0
  28. package/dist/chunks/{ru-Bm-zWJ3F.js → ru-CLiAMwrx.js} +12 -2
  29. package/dist/chunks/{ru-Bm-zWJ3F.js.map → ru-CLiAMwrx.js.map} +1 -1
  30. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-CW3zY1ee.js → GrCodeBlock-BmXCLgLS.js} +4 -30
  31. package/dist/components/GrCodeBlock/chunks/{GrCodeBlock-CW3zY1ee.js.map → GrCodeBlock-BmXCLgLS.js.map} +1 -1
  32. package/dist/components/GrCodeBlock/index.js +2 -2
  33. package/dist/components/GrDelta/chunks/{GrDelta-BMmpYz8K.js → GrDelta-DFvxNpmN.js} +0 -0
  34. package/dist/components/GrDelta/chunks/GrDelta-DFvxNpmN.js.map +1 -0
  35. package/dist/components/GrDelta/index.js +3 -2
  36. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-pXh1LZEe.js → GrDescriptionList-2zFXzX83.js} +15 -4
  37. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-2zFXzX83.js.map +1 -0
  38. package/dist/components/GrDescriptionList/index.js +2 -2
  39. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-LOaFSCyd.js → GrDropdownMenu-DyS6dWDp.js} +2 -2
  40. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-LOaFSCyd.js.map → GrDropdownMenu-DyS6dWDp.js.map} +1 -1
  41. package/dist/components/GrDropdownMenu/index.js +2 -2
  42. package/dist/components/GrFilePreview/chunks/{GrFilePreview-rbE3zL9w.js → GrFilePreview-D0Bt-0nn.js} +1 -1
  43. package/dist/components/GrFilePreview/chunks/{GrFilePreview-rbE3zL9w.js.map → GrFilePreview-D0Bt-0nn.js.map} +1 -1
  44. package/dist/components/GrFilePreview/index.js +2 -2
  45. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-DFUppRNb.js +389 -0
  46. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-DFUppRNb.js.map +1 -0
  47. package/dist/components/GrJsonViewer/index.js +3 -0
  48. package/dist/components/GrList/chunks/{GrList-BUzFRa8-.js → GrList-BRYhpqIe.js} +3 -3
  49. package/dist/components/GrList/chunks/GrList-BRYhpqIe.js.map +1 -0
  50. package/dist/components/GrList/index.js +2 -2
  51. package/dist/components/GrList/styles.css +1 -1
  52. package/dist/components/GrRadio/index.js +1 -1
  53. package/dist/components/GrRadioGroup/index.js +1 -1
  54. package/dist/components/GrRating/chunks/{GrRating-BiAVT9H7.js → GrRating-BSEtaibx.js} +1 -1
  55. package/dist/components/GrRating/chunks/{GrRating-BiAVT9H7.js.map → GrRating-BSEtaibx.js.map} +1 -1
  56. package/dist/components/GrRating/index.js +2 -2
  57. package/dist/components/GrStatistic/chunks/{GrStatistic-DkzWUAw1.js → GrStatistic-C7wQECeS.js} +20 -4
  58. package/dist/components/GrStatistic/chunks/GrStatistic-C7wQECeS.js.map +1 -0
  59. package/dist/components/GrStatistic/index.js +1 -1
  60. package/dist/components/GrTabPanels/index.js +1 -1
  61. package/dist/granular-provider-node.js +1 -1
  62. package/dist/granular-provider.js +1 -1
  63. package/dist/i18n/all.js +1 -1
  64. package/dist/i18n/index.js +1 -1
  65. package/dist/index.js +21 -18
  66. package/dist/theme.js +1 -1
  67. package/dist/tokens.js +1 -1
  68. package/dist/types/components/GrDelta/index.d.ts +1 -0
  69. package/dist/types/components/GrDescriptionList/GrDescriptionList.vue.d.ts +6 -2
  70. package/dist/types/components/GrDescriptionList/grDescriptionListStyles.d.ts +12 -5
  71. package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +1 -1
  72. package/dist/types/components/GrDropdownMenu/grDropdownMenuStyles.d.ts +10 -1
  73. package/dist/types/components/GrFilePreview/index.d.ts +1 -0
  74. package/dist/types/components/GrInput/GrInput.vue.d.ts +1 -1
  75. package/dist/types/components/GrJsonViewer/GrJsonViewer.vue.d.ts +129 -0
  76. package/dist/types/components/GrJsonViewer/config.d.ts +1 -0
  77. package/dist/types/components/GrJsonViewer/defaults.d.ts +23 -0
  78. package/dist/types/components/GrJsonViewer/grJsonViewerStyles.d.ts +57 -0
  79. package/dist/types/components/GrJsonViewer/index.d.ts +9 -0
  80. package/dist/types/components/GrJsonViewer/jsonToNodes.d.ts +47 -0
  81. package/dist/types/components/GrJsonViewer/safelist.d.ts +1 -0
  82. package/dist/types/components/GrList/grListStyles.d.ts +13 -0
  83. package/dist/types/components/GrNumberInput/GrNumberInput.vue.d.ts +1 -1
  84. package/dist/types/components/GrPromptDialog/GrPromptDialog.vue.d.ts +1 -1
  85. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +12 -2
  86. package/dist/types/components/GrStatistic/defaults.d.ts +6 -0
  87. package/dist/types/granular-provider/shared.d.ts +1 -0
  88. package/dist/types/i18n/messages/en.d.ts +18 -0
  89. package/dist/types/i18n/messages/es.d.ts +18 -0
  90. package/dist/types/i18n/messages/ru.d.ts +18 -0
  91. package/dist/types/index.d.ts +1 -0
  92. package/dist/types/internal/granularityFormat.d.ts +26 -0
  93. package/dist/web-types.json +136 -6
  94. package/package.json +5 -1
  95. package/dist/chunks/config-BKvX0q10.js.map +0 -1
  96. package/dist/chunks/config-BTCOJO5z.js.map +0 -1
  97. package/dist/chunks/config-B_qi4Fma2.js.map +0 -1
  98. package/dist/chunks/config-Baj7Wvx-2.js.map +0 -1
  99. package/dist/chunks/config-BsuDM3Hb.js.map +0 -1
  100. package/dist/chunks/config-QaIc_gRa2.js.map +0 -1
  101. package/dist/chunks/config-eXB87DOi2.js.map +0 -1
  102. package/dist/chunks/config-jyZq8XKL.js.map +0 -1
  103. package/dist/chunks/granular-provider-BW2uopTG.js.map +0 -1
  104. package/dist/chunks/trending-up-Bf9AQmoq.js.map +0 -1
  105. package/dist/components/GrDelta/chunks/GrDelta-BMmpYz8K.js.map +0 -1
  106. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-pXh1LZEe.js.map +0 -1
  107. package/dist/components/GrList/chunks/GrList-BUzFRa8-.js.map +0 -1
  108. package/dist/components/GrStatistic/chunks/GrStatistic-DkzWUAw1.js.map +0 -1
  109. /package/dist/chunks/{config-BTCOJO5z.js → config-BTCOJO5z2.js} +0 -0
  110. /package/dist/chunks/{config-B_qi4Fma2.js → config-B_qi4Fma.js} +0 -0
  111. /package/dist/chunks/{config-Baj7Wvx-2.js → config-Baj7Wvx-.js} +0 -0
  112. /package/dist/chunks/{config-QaIc_gRa2.js → config-QaIc_gRa.js} +0 -0
  113. /package/dist/chunks/{config-eXB87DOi2.js → config-eXB87DOi.js} +0 -0
@@ -1,6 +1,7 @@
1
1
  export { default } from './GrDelta.vue';
2
2
  export { default as GrDelta } from './GrDelta.vue';
3
3
  export { grDeltaConfig } from './config';
4
+ export { deltaDirection, deltaTone } from './deltaTone';
4
5
  export type { GrDeltaPolarity, GrDeltaProps, GrDeltaTone } from './GrDelta.vue';
5
6
  export type { GrDeltaConfigurableProps } from './defaults';
6
7
  export { grDeltaSafelist } from './safelist';
@@ -20,7 +20,10 @@ export interface GrDescriptionItem {
20
20
  */
21
21
  export interface GrDescriptionListProps {
22
22
  items: readonly GrDescriptionItem[];
23
- /** `inline` — подпись слева колонкой; `stacked` — над значением. */
23
+ /**
24
+ * `inline` — подпись слева колонкой; `stacked` — над значением; `flow` —
25
+ * пары текут по строке с переносом (метаданные внутри пункта списка).
26
+ */
24
27
  layout?: GrDescriptionLayout;
25
28
  /** Ширина колонки подписей при `inline`. */
26
29
  labelWidth?: string;
@@ -30,8 +33,9 @@ export interface GrDescriptionListProps {
30
33
  */
31
34
  stackBelow?: number;
32
35
  density?: GrDescriptionDensity;
33
- /** Отбивать пары линиями. */
36
+ /** Отбивать пары линиями. В `flow` не применяется. */
34
37
  divided?: boolean;
38
+ /** Колонки сетки. В `flow` не применяются: строка колонок не имеет. */
35
39
  columns?: GrDescriptionColumns;
36
40
  /** Чем печатать пустое значение. */
37
41
  emptyText?: string;
@@ -6,15 +6,22 @@ import type { GrTone } from '../shared/tones';
6
6
  * Тон перечислен целиком по одному литералу на ветку: UnoCSS сканирует исходный
7
7
  * текст файла, и собранное шаблонной строкой имя уехало бы в CSS литералом.
8
8
  */
9
- /** `inline` — подпись колонкой слева; `stacked` — над значением. */
10
- export type GrDescriptionLayout = 'inline' | 'stacked';
9
+ /**
10
+ * `inline` подпись колонкой слева; `stacked` — над значением; `flow` — пары
11
+ * текут по строке с переносом.
12
+ */
13
+ export type GrDescriptionLayout = 'inline' | 'stacked' | 'flow';
11
14
  export type GrDescriptionDensity = 'regular' | 'compact';
12
- /** Сколько колонок пар. Длинный список читается в две. */
13
- export type GrDescriptionColumns = 1 | 2;
14
- export declare const descriptionRootClass = "m-0 grid gap-x-4 [row-gap:var(--gr-description-list-row-gap,0.375rem)]";
15
+ /** Сколько колонок пар. Длинный список читается в несколько. */
16
+ export type GrDescriptionColumns = 1 | 2 | 3 | 4;
17
+ export declare const descriptionRootClass = "m-0 gap-x-4 [row-gap:var(--gr-description-list-row-gap,0.375rem)]";
18
+ /** Сетка колонок — раскладки `inline` и `stacked`. */
19
+ export declare const descriptionRootGridClass = "grid";
20
+ export declare const descriptionRootFlowClass = "flex flex-wrap items-baseline";
15
21
  export declare const descriptionColumnsClass: Record<GrDescriptionColumns, string>;
16
22
  export declare const descriptionPairInlineClass = "flex min-w-0 items-baseline gap-2";
17
23
  export declare const descriptionPairStackedClass = "min-w-0";
24
+ export declare const descriptionPairFlowClass = "flex min-w-0 items-baseline gap-1";
18
25
  export declare const descriptionDividedClass = "border-b border-[var(--gr-description-list-divider,var(--gr-brd))] pb-1 last:border-b-0 last:pb-0";
19
26
  export declare const descriptionLabelInlineClass = "shrink-0 text-[var(--gr-description-list-label-color,var(--gr-muted-fg))]";
20
27
  export declare const descriptionLabelStackedClass = "text-[var(--gr-description-list-label-color,var(--gr-muted-fg))]";
@@ -22,7 +22,7 @@ export interface GrDropdownMenuProps {
22
22
  teleportTo?: string | HTMLElement;
23
23
  /** Закрывать по клику внутри content. */
24
24
  closeOnContentClick?: boolean;
25
- /** Дополнительные классы content-контейнера; по умолчанию `p-0`. */
25
+ /** Дополнительные классы content-контейнера. */
26
26
  contentClass?: string;
27
27
  /**
28
28
  * Декларативное меню: пункты, группы и разделители массивом. Слот по
@@ -6,7 +6,16 @@ export type GrDropdownMenuColumnsCount = 2 | 3 | 4;
6
6
  export declare const alignClass: Record<GrDropdownMenuItemAlign, string>;
7
7
  export declare const textAlignClass: Record<GrDropdownMenuHeaderAlign, string>;
8
8
  export declare const colsClass: Record<GrDropdownMenuColumnsCount, string>;
9
- export declare const itemBaseClass = "w-full min-h-10 px-4 py-2.5 flex items-center gap-2 text-[length:var(--gr-text-sm)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
9
+ /**
10
+ * Радиус здесь не украшение: фон подсветки лежит на самом пункте, а панель
11
+ * `GrDropdown` скруглена на 16 px и содержимое не обрезает. Прямоугольник во всю
12
+ * ширину заливал бы угловые сегменты, вырезанные этим радиусом. Восемь
13
+ * пикселей — та же ступень, что у опций `GrSelect` и `GrAutocomplete`; внутренний
14
+ * угол панели после рамки и поля ≈ 11 px, так что подсветка до скругления не
15
+ * достаёт. Радиус в базовом классе, а не отдельной константой: hover, disabled и
16
+ * кольцо фокуса висят на одном элементе.
17
+ */
18
+ export declare const itemBaseClass = "w-full min-h-10 px-4 py-2.5 rounded-[var(--gr-radius-md)] flex items-center gap-2 text-[length:var(--gr-text-sm)] transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)]";
10
19
  export declare const itemVariantClass: Record<GrDropdownMenuItemVariant, string>;
11
20
  export declare const itemInteractiveClass = "cursor-pointer hover:bg-[var(--gr-accent)] hover:text-[var(--gr-accent-fg)]";
12
21
  export declare const itemDisabledClass = "cursor-not-allowed pointer-events-none bg-[var(--gr-muted)] text-[var(--gr-muted-fg)]";
@@ -1,6 +1,7 @@
1
1
  export { default } from './GrFilePreview.vue';
2
2
  export { default as GrFilePreview } from './GrFilePreview.vue';
3
3
  export { grFilePreviewConfig } from './config';
4
+ export { fileKindOf, isPreviewableKind } from './fileKindOf';
4
5
  export type { GrFileKind, GrFilePreviewEmits, GrFilePreviewProps, GrFilePreviewRatio, } from './GrFilePreview.vue';
5
6
  export type { GrFilePreviewConfigurableProps } from './defaults';
6
7
  export { grFilePreviewSafelist } from './safelist';
@@ -172,7 +172,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
172
172
  suffixFixed: boolean;
173
173
  autocomplete: string;
174
174
  showCount: boolean;
175
- inputmode: "search" | "text" | "none" | "email" | "tel" | "url" | "numeric" | "decimal";
175
+ inputmode: "none" | "search" | "text" | "email" | "tel" | "url" | "numeric" | "decimal";
176
176
  state: "default" | "success" | "warning" | "danger";
177
177
  maxlength: number;
178
178
  passwordToggle: boolean;
@@ -0,0 +1,129 @@
1
+ import { type GrJsonNode } from './jsonToNodes';
2
+ import type { GrComponentSize } from '../shared/sizes';
3
+ export type { GrJsonNode, GrJsonNodeKind } from './jsonToNodes';
4
+ /**
5
+ * JSON со свёрткой по узлам, поиском по ключу и значению и копированием узла.
6
+ *
7
+ * Дерево, клавиатуру и виртуализацию несёт `GrTree`; здесь — разбор `unknown` в
8
+ * узлы и разметка строки. Плоский текст целиком, который копируют в тикет, —
9
+ * `GrCodeBlock`.
10
+ */
11
+ export interface GrJsonViewerProps {
12
+ /** Показываемое значение. `unknown`, потому что приходит из БД или чужого сервиса. */
13
+ value: unknown;
14
+ /** Подпись корня. По умолчанию `$` — так адресуют путь JSONPath и dev-tools. */
15
+ rootLabel?: string;
16
+ /** Сколько уровней раскрыто изначально. */
17
+ defaultExpandDepth?: number;
18
+ /**
19
+ * Длина строкового значения, после которой показ обрезается.
20
+ *
21
+ * Не косметика: запрос к модели с картинкой в base64 — это один лист на
22
+ * сотни тысяч символов, и ни свёртка, ни виртуализация по строкам его не
23
+ * берут. Копирование при этом отдаёт значение целиком.
24
+ */
25
+ maxStringLength?: number;
26
+ /** Сколько элементов массива разбирать до заглушки «ещё N». */
27
+ maxArrayItems?: number;
28
+ /** Поле поиска над деревом. Выключено — поиск остаётся на `filter()` из `defineExpose`. */
29
+ searchable?: boolean;
30
+ /** Кнопка копирования узла в строке. */
31
+ copyable?: boolean;
32
+ /** Оставлять в DOM только окно вокруг вьюпорта. Требует `maxHeight`. */
33
+ virtual?: boolean;
34
+ /** Высота области просмотра: число — пиксели, строка — как есть. */
35
+ maxHeight?: string | number;
36
+ /** Имя области для скринридера. Безымянное дерево объявляется просто «дерево». */
37
+ ariaLabel?: string;
38
+ size?: GrComponentSize;
39
+ }
40
+ export interface GrJsonViewerEmits {
41
+ /** Узел скопирован: путь для тикета и полное значение. */
42
+ (e: 'copy', payload: {
43
+ path: string;
44
+ value: unknown;
45
+ }): void;
46
+ }
47
+ type __VLS_Slots = {
48
+ /** Значение листа: ссылка, дата, денежная сумма — оформление знает приложение. */
49
+ leaf?: (props: {
50
+ node: GrJsonNode;
51
+ }) => unknown;
52
+ };
53
+ declare function expandAll(): void;
54
+ declare function collapseAll(): void;
55
+ declare function filter(value: string): void;
56
+ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<GrJsonViewerProps>, {
57
+ rootLabel: undefined;
58
+ defaultExpandDepth: undefined;
59
+ maxStringLength: undefined;
60
+ maxArrayItems: undefined;
61
+ searchable: undefined;
62
+ copyable: undefined;
63
+ virtual: boolean;
64
+ maxHeight: undefined;
65
+ ariaLabel: undefined;
66
+ size: undefined;
67
+ }>>, {
68
+ filter: typeof filter;
69
+ expandAll: typeof expandAll;
70
+ collapseAll: typeof collapseAll;
71
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
72
+ copy: (payload: {
73
+ path: string;
74
+ value: unknown;
75
+ }) => void;
76
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToOption<GrJsonViewerProps>, {
77
+ rootLabel: undefined;
78
+ defaultExpandDepth: undefined;
79
+ maxStringLength: undefined;
80
+ maxArrayItems: undefined;
81
+ searchable: undefined;
82
+ copyable: undefined;
83
+ virtual: boolean;
84
+ maxHeight: undefined;
85
+ ariaLabel: undefined;
86
+ size: undefined;
87
+ }>>> & Readonly<{
88
+ onCopy?: ((payload: {
89
+ path: string;
90
+ value: unknown;
91
+ }) => any) | undefined;
92
+ }>, {
93
+ size: GrComponentSize;
94
+ copyable: boolean;
95
+ defaultExpandDepth: number;
96
+ maxStringLength: number;
97
+ maxArrayItems: number;
98
+ searchable: boolean;
99
+ maxHeight: string | number;
100
+ ariaLabel: string;
101
+ virtual: boolean;
102
+ rootLabel: string;
103
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
104
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
105
+ declare const _default: typeof __VLS_export;
106
+ export default _default;
107
+ type __VLS_TypePropsToOption<T> = {
108
+ [K in keyof T]-?: {} extends Pick<T, K> ? {
109
+ type: import('vue').PropType<Required<T>[K]>;
110
+ } : {
111
+ type: import('vue').PropType<T[K]>;
112
+ required: true;
113
+ };
114
+ };
115
+ type __VLS_WithDefaults<P, D> = {
116
+ [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_PrettifyLocal<P[K] & {
117
+ default: D[K];
118
+ }> : P[K];
119
+ };
120
+ type __VLS_WithSlots<T, S> = T & {
121
+ new (): {
122
+ $slots: S;
123
+ };
124
+ };
125
+ type __VLS_PrettifyLocal<T> = (T extends any ? {
126
+ [K in keyof T]: T[K];
127
+ } : {
128
+ [K in keyof T as K]: T[K];
129
+ }) & {};
@@ -0,0 +1 @@
1
+ export declare const grJsonViewerConfig: import("@feugene/unocss-preset-granular/contract").GranularComponentDescriptor<"GrJsonViewer">;
@@ -0,0 +1,23 @@
1
+ import type { GrComponentSize } from '../shared/sizes';
2
+ /**
3
+ * Пропы `GrJsonViewer`, настраиваемые глобально через
4
+ * `<GrConfigProvider :component-defaults="{ GrJsonViewer: { … } }">`.
5
+ *
6
+ * Пороги обрезки здесь наравне с оформлением не случайно: «сколько показывать»
7
+ * — решение приложения, а не экрана. У админки с ответами модели и у панели с
8
+ * конфигами оно разное, и повторять его на каждом просмотрщике значит однажды
9
+ * забыть.
10
+ */
11
+ export interface GrJsonViewerConfigurableProps {
12
+ size: GrComponentSize;
13
+ defaultExpandDepth: number;
14
+ maxStringLength: number;
15
+ maxArrayItems: number;
16
+ searchable: boolean;
17
+ copyable: boolean;
18
+ }
19
+ declare module '../../composables/useGrComponentConfig' {
20
+ interface GrComponentDefaultsRegistry {
21
+ GrJsonViewer: GrJsonViewerConfigurableProps;
22
+ }
23
+ }
@@ -0,0 +1,57 @@
1
+ import type { GrJsonNodeKind } from './jsonToNodes';
2
+ /**
3
+ * Классы `GrJsonViewer`.
4
+ *
5
+ * Роли перечислены целиком, по литералу на ветку: UnoCSS сканирует исходный
6
+ * текст файла, и собранное шаблонной строкой имя уехало бы в CSS литералом.
7
+ */
8
+ /**
9
+ * `min-w-0` и клип — не украшение: глубокая ветка шире контейнера, и без них
10
+ * панель растягивает раскладку страницы, вместо того чтобы прокручиваться
11
+ * внутри себя. Горизонтальный скролл остаётся у самого дерева.
12
+ */
13
+ export declare const jsonViewerRootClass = "min-w-0 overflow-hidden rounded-[var(--gr-radius-md)] bg-[var(--gr-json-viewer-bg,var(--gr-muted))] text-[var(--gr-fg)]";
14
+ /** Шапка с поиском и кнопками свёртки. Отбивается от дерева, а не от края. */
15
+ export declare const jsonViewerToolbarClass = "flex items-center gap-2 border-b border-[var(--gr-brd)] p-2";
16
+ export declare const jsonViewerSearchClass = "min-w-0 flex-1";
17
+ /** Строка узла моноширинная: значения выравниваются по разрядам, как в блоке кода. */
18
+ export declare const jsonViewerRowClass = "relative flex min-w-0 items-center gap-1 font-[var(--gr-font-mono)]";
19
+ /** Область узла не даёт значению растянуть строку шире панели. */
20
+ export declare const jsonViewerContentClass = "min-w-0";
21
+ export declare const jsonViewerKeyClass = "shrink-0 text-[var(--gr-json-viewer-key,var(--gr-primary-text))]";
22
+ export declare const jsonViewerPunctuationClass = "shrink-0 text-[var(--gr-json-viewer-punctuation,var(--gr-fg))]";
23
+ /**
24
+ * Значение обрезается по ширине строки, а не переносится: перенос превратил бы
25
+ * дерево в простыню и сломал бы оценку высоты строки у виртуализации.
26
+ */
27
+ export declare const jsonViewerValueClass = "min-w-0 truncate";
28
+ /** Счётчик у свёрнутой ветки и служебные подписи — тише значения. */
29
+ export declare const jsonViewerMutedClass = "shrink-0 text-[var(--gr-json-viewer-muted,var(--gr-muted-fg))]";
30
+ /**
31
+ * Кнопка копирования узла: появляется по наведению и по фокусу внутри строки.
32
+ *
33
+ * Стоит в потоке сразу за значением, а не прижата к правому краю строки:
34
+ * прижать её не к чему — область узла у `GrTree` сжата по содержимому
35
+ * (`flex: 0 1 auto`) собственным scoped-правилом, а утилитой снаружи оно не
36
+ * перебивается: оба класса равной специфичности, и победителя выбирает порядок
37
+ * правил в CSS. Цена потока — 4 px высоты строки, и она дешевле этой лотереи.
38
+ */
39
+ export declare const jsonViewerCopyClass = "ml-2 shrink-0 opacity-0 focus-visible:opacity-100 group-hover:opacity-100";
40
+ /**
41
+ * Зацепка варианта `group-hover` у кнопки копирования. В safelist не идёт: CSS
42
+ * из неё не порождается — правило пишет сам вариант, а гейт справедливо считал
43
+ * бы такую запись мёртвой.
44
+ */
45
+ export declare const jsonViewerGroupClass = "group";
46
+ /**
47
+ * Цвет значения по виду.
48
+ *
49
+ * Дефолты — ссылки на `-text`-роли темы, те же, что у `GrCodeBlock`: роли
50
+ * переключаются вместе с темой, поэтому подсветка работает в обеих без своего
51
+ * theme-слоя, а два компонента остаются согласованными через роль, а не через
52
+ * общую константу — импорт чужой мапы притащил бы потребителю весь CSS донора.
53
+ *
54
+ * Число взято от `azure`, а не от `info`: `info` — синий в двух шагах от индиго
55
+ * `primary`, и пара «ключ ↔ число» стояла бы в одной строке неразличимой.
56
+ */
57
+ export declare const jsonValueClass: Record<GrJsonNodeKind, string>;
@@ -0,0 +1,9 @@
1
+ import type { ComponentExposed } from '../shared/instance';
2
+ import type GrJsonViewerComponent from './GrJsonViewer.vue';
3
+ export { default } from './GrJsonViewer.vue';
4
+ export { default as GrJsonViewer } from './GrJsonViewer.vue';
5
+ export { grJsonViewerConfig } from './config';
6
+ export type { GrJsonViewerConfigurableProps } from './defaults';
7
+ export type { GrJsonNode, GrJsonNodeKind, GrJsonViewerEmits, GrJsonViewerProps, } from './GrJsonViewer.vue';
8
+ export { grJsonViewerSafelist } from './safelist';
9
+ export type GrJsonViewerInstance = ComponentExposed<typeof GrJsonViewerComponent>;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Разбор произвольного значения в узлы дерева.
3
+ *
4
+ * Компонент показывает данные из БД и от чужих сервисов, поэтому обход обязан
5
+ * пережить всё: цикл, `BigInt`, функцию в поле, массив на десять тысяч записей,
6
+ * строку в миллион символов. Уронить страницу он права не имеет.
7
+ */
8
+ /** Что за значение в узле. Решает и цвет, и то, раскрывается ли узел. */
9
+ export type GrJsonNodeKind = 'object' | 'array' | 'string' | 'number' | 'boolean' | 'null'
10
+ /** Значения, которых в JSON не бывает: функция, символ, `undefined`. */
11
+ | 'unsupported'
12
+ /** Хвост обрезанного массива — «ещё N элементов». Своего значения не имеет. */
13
+ | 'truncation';
14
+ export type GrJsonNode = {
15
+ /** Читаемый адрес узла (`$.items[3].name`). Он же ключ для `GrTree`. */
16
+ path: string;
17
+ /** Имя ключа или индекс. Показывается слева от двоеточия. */
18
+ label: string;
19
+ kind: GrJsonNodeKind;
20
+ /** Что видно в строке. У ветки — счётчик, у листа — значение, возможно обрезанное. */
21
+ preview: string;
22
+ /** Полное значение. Копирование берёт его, а не `preview`. */
23
+ value: unknown;
24
+ /** Показ обрезан: копирование всё равно отдаёт целое. */
25
+ truncated: boolean;
26
+ isLeaf: boolean;
27
+ children?: GrJsonNode[];
28
+ };
29
+ export type GrJsonToNodesOptions = {
30
+ /** Подпись корня. */
31
+ rootLabel?: string;
32
+ /** Длина строки, после которой значение обрезается в показе. */
33
+ maxStringLength?: number;
34
+ /** Сколько элементов массива разбирать до заглушки «ещё N». */
35
+ maxArrayItems?: number;
36
+ };
37
+ /** Маркер ветки, которая уже встречалась выше по этой же цепочке предков. */
38
+ export declare const CIRCULAR_MARKER = "[Circular]";
39
+ /**
40
+ * Значение → узлы дерева. Корень всегда один: даже скаляр на входе — это узел,
41
+ * иначе дерево пришлось бы то показывать, то нет.
42
+ */
43
+ export declare function jsonToNodes(value: unknown, options?: GrJsonToNodesOptions): GrJsonNode[];
44
+ /** Пути всех узлов до заданной глубины — ими задаётся начальная свёртка. */
45
+ export declare function pathsToDepth(nodes: GrJsonNode[], depth: number, level?: number): string[];
46
+ /** Пути всех веток — для «раскрыть всё». */
47
+ export declare function branchPaths(nodes: GrJsonNode[]): string[];
@@ -0,0 +1 @@
1
+ export declare const grJsonViewerSafelist: string[];
@@ -7,6 +7,19 @@ export type GrListItemDensity = 'compact' | 'regular';
7
7
  * и разойтись они могли молча.
8
8
  */
9
9
  export declare const densityPadding: Record<GrListItemDensity, string>;
10
+ /**
11
+ * Список обрезается по радиусу карточки под ним.
12
+ *
13
+ * Своего радиуса у строки нет и не нужно: строки идут вплотную, и скруглённая
14
+ * подсветка посреди сплошного списка читалась бы как случайная. Но поля у
15
+ * `GrCard` по умолчанию нет, строка лежит вплотную к скруглению, и без клипа
16
+ * фон первой и последней заливает углы — постоянно при `disabled` и по
17
+ * наведению при кликабельной строке.
18
+ *
19
+ * `inherit`, а не повтор `--gr-radius-lg`: значение принадлежит `GrCard`, и
20
+ * копия разошлась бы с ним молча.
21
+ */
22
+ export declare const listSurfaceClass = "overflow-hidden rounded-[inherit]";
10
23
  export declare const itemLayoutClass = "flex items-start justify-between gap-4";
11
24
  /** Интерактивная строка занимает всю ширину пункта — кликабельна вся, а не текст. */
12
25
  export declare const itemInteractiveClass = "w-full text-left transition-colors duration-[var(--gr-duration-fast)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--gr-ring)] focus-visible:ring-inset";
@@ -184,7 +184,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
184
184
  suffixFixed: boolean;
185
185
  autocomplete: string;
186
186
  step: number;
187
- inputmode: "search" | "text" | "none" | "email" | "tel" | "url" | "numeric" | "decimal";
187
+ inputmode: "none" | "search" | "text" | "email" | "tel" | "url" | "numeric" | "decimal";
188
188
  state: GrNumberInputState;
189
189
  locale: string;
190
190
  precision: number;
@@ -187,7 +187,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
187
187
  required: boolean;
188
188
  placeholder: string;
189
189
  showCount: boolean;
190
- inputmode: "search" | "text" | "none" | "email" | "tel" | "url" | "numeric" | "decimal";
190
+ inputmode: "none" | "search" | "text" | "email" | "tel" | "url" | "numeric" | "decimal";
191
191
  maxlength: number;
192
192
  closeOnEsc: boolean;
193
193
  closeOnBackdrop: boolean;
@@ -1,4 +1,5 @@
1
1
  import { type Component } from 'vue';
2
+ import { type GrDeltaPolarity } from '../GrDelta/deltaTone';
2
3
  import { type GrStatisticSize, type GrStatisticTone, type GrStatisticTrend } from './grStatisticStyles';
3
4
  export type { GrStatisticSize, GrStatisticTone, GrStatisticTrend, } from './grStatisticStyles';
4
5
  export type { GrStatisticFormatOptions } from './formatStatisticValue';
@@ -37,6 +38,12 @@ export interface GrStatisticProps {
37
38
  size?: GrStatisticSize;
38
39
  /** Тон значения; точечно перекрывается `--gr-statistic-value-color`. */
39
40
  tone?: GrStatisticTone;
41
+ /**
42
+ * Что считать хорошим: тон выводится из знака самого значения. Для выручки
43
+ * рост — успех, для себестоимости и оттока — наоборот. Явный `tone` сильнее:
44
+ * выведенный тон — умолчание, а не диктат.
45
+ */
46
+ polarity?: GrDeltaPolarity;
40
47
  /** Направление динамики — задаёт цвет и иконку строки под значением. */
41
48
  trend?: GrStatisticTrend;
42
49
  /** Текст динамики (например `+12,5% к прошлой неделе`). */
@@ -88,7 +95,8 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
88
95
  suffix: undefined;
89
96
  icon: undefined;
90
97
  size: undefined;
91
- tone: string;
98
+ tone: undefined;
99
+ polarity: undefined;
92
100
  trend: undefined;
93
101
  trendText: undefined;
94
102
  loading: boolean;
@@ -109,7 +117,8 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
109
117
  suffix: undefined;
110
118
  icon: undefined;
111
119
  size: undefined;
112
- tone: string;
120
+ tone: undefined;
121
+ polarity: undefined;
113
122
  trend: undefined;
114
123
  trendText: undefined;
115
124
  loading: boolean;
@@ -123,6 +132,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
123
132
  }>, {
124
133
  tone: GrStatisticTone;
125
134
  size: GrStatisticSize;
135
+ polarity: GrDeltaPolarity;
126
136
  loading: boolean;
127
137
  title: string;
128
138
  icon: string | Component;
@@ -1,11 +1,17 @@
1
+ import type { GrDeltaPolarity } from '../GrDelta/deltaTone';
1
2
  import type { GrStatisticSize } from './grStatisticStyles';
2
3
  /**
3
4
  * Пропы `GrStatistic`, настраиваемые глобально через
4
5
  * `<GrConfigProvider :component-defaults="{ GrStatistic: { … } }">`.
5
6
  * Только оформление — см. `GrButton/defaults.ts`.
7
+ *
8
+ * `polarity` здесь по той же причине, что и у `GrDelta`: на дашборде расходов
9
+ * «рост — плохо» верно сразу для всех плиток ряда, и повторять это на каждой
10
+ * значит однажды пропустить одну.
6
11
  */
7
12
  export interface GrStatisticConfigurableProps {
8
13
  size: GrStatisticSize;
14
+ polarity: GrDeltaPolarity;
9
15
  }
10
16
  declare module '../../composables/useGrComponentConfig' {
11
17
  interface GrComponentDefaultsRegistry {
@@ -49,6 +49,7 @@ export declare const granularityComponentConfigs: {
49
49
  GrImageViewer: GranularComponentDescriptor<"GrImageViewer">;
50
50
  GrInput: GranularComponentDescriptor<"GrInput">;
51
51
  GrInputTag: GranularComponentDescriptor<"GrInputTag">;
52
+ GrJsonViewer: GranularComponentDescriptor<"GrJsonViewer">;
52
53
  GrKbd: GranularComponentDescriptor<"GrKbd">;
53
54
  GrLink: GranularComponentDescriptor<"GrLink">;
54
55
  GrList: GranularComponentDescriptor<"GrList">;
@@ -346,6 +346,15 @@ export declare const en: {
346
346
  copied: string;
347
347
  copyFailed: string;
348
348
  };
349
+ jsonViewer: {
350
+ search: string;
351
+ expandAll: string;
352
+ collapseAll: string;
353
+ copy: string;
354
+ copied: string;
355
+ copyFailed: string;
356
+ moreItems: string;
357
+ };
349
358
  };
350
359
  common: {
351
360
  confirm: string;
@@ -684,6 +693,15 @@ export declare const en: {
684
693
  copied: string;
685
694
  copyFailed: string;
686
695
  };
696
+ jsonViewer: {
697
+ search: string;
698
+ expandAll: string;
699
+ collapseAll: string;
700
+ copy: string;
701
+ copied: string;
702
+ copyFailed: string;
703
+ moreItems: string;
704
+ };
687
705
  }>;
688
706
  };
689
707
  };
@@ -341,6 +341,15 @@ export declare const es: {
341
341
  copied: string;
342
342
  copyFailed: string;
343
343
  };
344
+ jsonViewer: {
345
+ search: string;
346
+ expandAll: string;
347
+ collapseAll: string;
348
+ copy: string;
349
+ copied: string;
350
+ copyFailed: string;
351
+ moreItems: string;
352
+ };
344
353
  };
345
354
  common: {
346
355
  confirm: string;
@@ -681,6 +690,15 @@ export declare const es: {
681
690
  copied: string;
682
691
  copyFailed: string;
683
692
  };
693
+ jsonViewer: {
694
+ search: string;
695
+ expandAll: string;
696
+ collapseAll: string;
697
+ copy: string;
698
+ copied: string;
699
+ copyFailed: string;
700
+ moreItems: string;
701
+ };
684
702
  }>;
685
703
  };
686
704
  };
@@ -343,6 +343,15 @@ export declare const ru: {
343
343
  copied: string;
344
344
  copyFailed: string;
345
345
  };
346
+ jsonViewer: {
347
+ search: string;
348
+ expandAll: string;
349
+ collapseAll: string;
350
+ copy: string;
351
+ copied: string;
352
+ copyFailed: string;
353
+ moreItems: string;
354
+ };
346
355
  };
347
356
  common: {
348
357
  confirm: string;
@@ -685,6 +694,15 @@ export declare const ru: {
685
694
  copied: string;
686
695
  copyFailed: string;
687
696
  };
697
+ jsonViewer: {
698
+ search: string;
699
+ expandAll: string;
700
+ collapseAll: string;
701
+ copy: string;
702
+ copied: string;
703
+ copyFailed: string;
704
+ moreItems: string;
705
+ };
688
706
  }>;
689
707
  };
690
708
  };
@@ -36,6 +36,7 @@ export * from './components/GrIcon';
36
36
  export * from './components/GrImageViewer';
37
37
  export * from './components/GrInput';
38
38
  export * from './components/GrInputTag';
39
+ export * from './components/GrJsonViewer';
39
40
  export * from './components/GrKbd';
40
41
  export * from './components/GrLink';
41
42
  export * from './components/GrList';
@@ -16,4 +16,30 @@
16
16
  * сводим к `en`.
17
17
  */
18
18
  export declare function formatNumber(locale: string, value: number | bigint, options?: Intl.NumberFormatOptions): string;
19
+ /**
20
+ * Те же правила, что у `formatNumber`, но по частям: вызывающему нужно знать,
21
+ * где в записи стоит знак, чтобы вынести его отдельным узлом.
22
+ *
23
+ * Инстанс тот же, что у `formatNumber`: `Intl.NumberFormat` умеет оба метода, а
24
+ * второй кэш под теми же ключами разъехался бы с первым на первом вытеснении.
25
+ */
26
+ export declare function formatNumberToParts(locale: string, value: number | bigint, options?: Intl.NumberFormatOptions): Intl.NumberFormatPart[];
27
+ /**
28
+ * Ведущий знак и остаток записи.
29
+ *
30
+ * Нужно там, где знаку полагается свой узел разметки: валюта обязана стоять
31
+ * после знака (`+$0,03`, а не `$+0,03`). Резать готовую строку по первому
32
+ * символу нельзя — в RTL-локалях знаку предшествует невидимая метка
33
+ * направления (`he-IL` — U+200E, `ar-EG` — U+061C), которой и разворачивается
34
+ * минус относительно цифр. Метка уходит вместе со знаком: она управляет им.
35
+ *
36
+ * `sign` пуст, когда знака нет вовсе (ноль, положительное при `signDisplay:
37
+ * 'auto'`, `NaN`) либо когда перед ним стоит содержательная часть. Во втором
38
+ * случае запись не делится совсем: вернуть половину по догадке хуже, чем
39
+ * вернуть целое.
40
+ */
41
+ export declare function splitLeadingSign(parts: readonly Intl.NumberFormatPart[]): {
42
+ sign: string;
43
+ rest: string;
44
+ };
19
45
  export declare function formatDate(locale: string, value: Date | number | string, options?: Intl.DateTimeFormatOptions): string;