@feugene/granularity 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/chunks/{en-BMjJZttK.js → en-QNZhjmSJ.js} +18 -1
  2. package/dist/chunks/en-QNZhjmSJ.js.map +1 -0
  3. package/dist/chunks/{es-EYCf8G_1.js → es-C1c5XsIK.js} +18 -1
  4. package/dist/chunks/es-C1c5XsIK.js.map +1 -0
  5. package/dist/chunks/{es-Cu_RlgIr.js → es-CKLPuE0h.js} +3 -3
  6. package/dist/chunks/{es-Cu_RlgIr.js.map → es-CKLPuE0h.js.map} +1 -1
  7. package/dist/chunks/granularityI18n-CXa_uN7f.js +46 -0
  8. package/dist/chunks/granularityI18n-CXa_uN7f.js.map +1 -0
  9. package/dist/chunks/{ru-DKswMSdd.js → ru-DcF7ciz0.js} +18 -1
  10. package/dist/chunks/ru-DcF7ciz0.js.map +1 -0
  11. package/dist/chunks/{shared-DO3Sr5FJ.js → shared-BkIIEolF.js} +7 -0
  12. package/dist/chunks/shared-BkIIEolF.js.map +1 -0
  13. package/dist/components/GrNavbar/chunks/{GrNavbar-BDIKAYfN.js → GrNavbar-BoVuSZ-V.js} +1 -1
  14. package/dist/components/GrNavbar/chunks/{GrNavbar-BDIKAYfN.js.map → GrNavbar-BoVuSZ-V.js.map} +1 -1
  15. package/dist/components/GrNavbar/index.js +1 -1
  16. package/dist/components/GrPagination/chunks/{GrPagination-BZlH-uEd.js → GrPagination-DW44c2-a.js} +1 -1
  17. package/dist/components/GrPagination/chunks/{GrPagination-BZlH-uEd.js.map → GrPagination-DW44c2-a.js.map} +1 -1
  18. package/dist/components/GrPagination/index.js +1 -1
  19. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-n0CZT4Ic.js → GrTreeSelect-DkAIksRW.js} +1 -1
  20. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-n0CZT4Ic.js.map → GrTreeSelect-DkAIksRW.js.map} +1 -1
  21. package/dist/components/GrTreeSelect/index.js +1 -1
  22. package/dist/granular-provider-node.js +1 -1
  23. package/dist/granular-provider.js +1 -1
  24. package/dist/i18n/all.js +1 -1
  25. package/dist/i18n/index.js +1 -1
  26. package/dist/index.js +977 -4
  27. package/dist/index.js.map +1 -1
  28. package/dist/types/src/components/GrResponseErrorBanner/GrFormErrorBanner.vue.d.ts +70 -0
  29. package/dist/types/src/components/GrResponseErrorBanner/GrResponseErrorBanner.vue.d.ts +96 -0
  30. package/dist/types/src/components/GrResponseErrorBanner/GrUploadErrorBanner.vue.d.ts +73 -0
  31. package/dist/types/src/components/GrResponseErrorBanner/config.d.ts +1 -0
  32. package/dist/types/src/components/GrResponseErrorBanner/index.d.ts +10 -0
  33. package/dist/types/src/components/GrResponseErrorBanner/parsers/abortErrorParser.d.ts +15 -0
  34. package/dist/types/src/components/GrResponseErrorBanner/parsers/createResponseErrorClassifier.d.ts +28 -0
  35. package/dist/types/src/components/GrResponseErrorBanner/parsers/fileValidationParser.d.ts +12 -0
  36. package/dist/types/src/components/GrResponseErrorBanner/parsers/httpStatusParser.d.ts +15 -0
  37. package/dist/types/src/components/GrResponseErrorBanner/parsers/index.d.ts +11 -0
  38. package/dist/types/src/components/GrResponseErrorBanner/parsers/jsonApiErrorParser.d.ts +17 -0
  39. package/dist/types/src/components/GrResponseErrorBanner/parsers/laravelValidationParser.d.ts +15 -0
  40. package/dist/types/src/components/GrResponseErrorBanner/parsers/networkErrorParser.d.ts +14 -0
  41. package/dist/types/src/components/GrResponseErrorBanner/parsers/normalizeError.d.ts +19 -0
  42. package/dist/types/src/components/GrResponseErrorBanner/parsers/plainMessageParser.d.ts +15 -0
  43. package/dist/types/src/components/GrResponseErrorBanner/parsers/problemDetailsParser.d.ts +17 -0
  44. package/dist/types/src/components/GrResponseErrorBanner/responseError.defaults.d.ts +18 -0
  45. package/dist/types/src/components/GrResponseErrorBanner/responseError.types.d.ts +115 -0
  46. package/dist/types/src/components/GrResponseErrorBanner/useResponseError.d.ts +62 -0
  47. package/dist/types/src/components/GrToaster/GrToaster.vue.d.ts +1 -1
  48. package/dist/types/src/granular-provider/shared.d.ts +1 -0
  49. package/dist/types/src/i18n/messages/en.d.ts +32 -0
  50. package/dist/types/src/i18n/messages/es.d.ts +32 -0
  51. package/dist/types/src/i18n/messages/ru.d.ts +32 -0
  52. package/dist/types/src/index.d.ts +1 -0
  53. package/package.json +1 -1
  54. package/dist/chunks/en-BMjJZttK.js.map +0 -1
  55. package/dist/chunks/es-EYCf8G_1.js.map +0 -1
  56. package/dist/chunks/granularityI18n-Dm4DuCS9.js +0 -26
  57. package/dist/chunks/granularityI18n-Dm4DuCS9.js.map +0 -1
  58. package/dist/chunks/ru-DKswMSdd.js.map +0 -1
  59. package/dist/chunks/shared-DO3Sr5FJ.js.map +0 -1
@@ -0,0 +1,17 @@
1
+ import type { ResponseErrorParser } from '../responseError.types';
2
+ /**
3
+ * Парсер RFC 7807 «Problem Details for HTTP APIs»:
4
+ *
5
+ * ```json
6
+ * { "type": "https://example.com/probs/out-of-credit",
7
+ * "title": "You do not have enough credit.",
8
+ * "status": 403,
9
+ * "detail": "Your current balance is 30.",
10
+ * "errors": { "balance": ["..."] } }
11
+ * ```
12
+ *
13
+ * Активируется, если есть `body.type` + `body.title`, либо
14
+ * Content-Type заголовка `application/problem+json`. Берёт `title` как
15
+ * `message`, `detail` — в `details[0]`, status — в `status`.
16
+ */
17
+ export declare const problemDetailsParser: ResponseErrorParser;
@@ -0,0 +1,18 @@
1
+ import type { ResponseErrorKind, ResponseErrorTexts, ResponseErrorTone } from './responseError.types';
2
+ /**
3
+ * Default English texts. Any field can be overridden via the `texts` prop
4
+ * on `GrResponseErrorBanner` or the `texts` option of `useResponseError`.
5
+ */
6
+ export declare const DEFAULT_RESPONSE_ERROR_TEXTS: ResponseErrorTexts;
7
+ /**
8
+ * Маппинг `kind` → `tone` по умолчанию. Применяется внутри баннера, если
9
+ * пользователь не передал `tone` или `toneByKind`. Цель — визуально отделить
10
+ * «исправь ввод» (warning) от «упало по сети/серверу» (danger).
11
+ */
12
+ export declare const DEFAULT_TONE_BY_KIND: Record<ResponseErrorKind, ResponseErrorTone>;
13
+ /**
14
+ * `kind`'ы, которые по умолчанию не показываются (баннер скрыт).
15
+ * Семантика: отмена пользователем — не «ошибка», UI обычно тихо проглатывает.
16
+ * Пользователь может переопределить через `autoHideKinds: []`, чтобы показать info-плашку.
17
+ */
18
+ export declare const DEFAULT_AUTO_HIDE_KINDS: ResponseErrorKind[];
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Универсальные типы для отображения ошибок ответа сервера/сети.
3
+ *
4
+ * Компонент `GrResponseErrorBanner` не зависит от транспорта (axios/fetch/xhr)
5
+ * и не делает запросов — он получает уже готовый «сырой» результат и
6
+ * прогоняет его через цепочку парсеров (`ResponseErrorParser[]`), превращая
7
+ * в `ResponseErrorInfo`.
8
+ */
9
+ /**
10
+ * Категория ошибки. Жёстко разделены по семантике (см. `DEFAULT_TONE_BY_KIND`).
11
+ *
12
+ * - `network` — транспортная проблема: нет интернета, DNS, CORS-preflight,
13
+ * `fetch` `TypeError`, axios `ERR_NETWORK`. **Ответа от сервера нет.**
14
+ * - `aborted` — запрос отменён клиентом (`AbortController`, axios `CanceledError`).
15
+ * - `validation` — ошибка валидации формы/файлов; есть структурированные поля или
16
+ * статус `400`/`422`. UX: «исправь поле и повтори».
17
+ * - `client` — прочие 4xx (auth/forbidden/not-found/conflict/rate-limit) —
18
+ * проблема запроса, retry обычно не помогает.
19
+ * - `server` — 5xx, проблема на сервере; retry разумен.
20
+ * - `unknown` — ничего не сматчилось, fallback.
21
+ */
22
+ export type ResponseErrorKind = 'network' | 'aborted' | 'validation' | 'client' | 'server' | 'unknown';
23
+ /** Визуальный тон баннера. Совпадает с `tone` у `GrAlert`. */
24
+ export type ResponseErrorTone = 'info' | 'success' | 'warning' | 'danger' | 'slate' | 'azure' | 'primary' | 'neutral';
25
+ /** Ошибка по конкретному полю (Laravel-style / JSON:API pointer / RFC 7807 errors). */
26
+ export type ResponseErrorFieldError = {
27
+ /** Имя поля. Для Laravel — ключ из `errors`. Для JSON:API — последний сегмент `source.pointer`. */
28
+ field: string;
29
+ /** Сообщения, относящиеся к этому полю. */
30
+ messages: string[];
31
+ };
32
+ /**
33
+ * Готовая к показу структура. Это то, что баннер принимает в `error`-проп.
34
+ */
35
+ export type ResponseErrorInfo = {
36
+ kind: ResponseErrorKind;
37
+ /** HTTP-статус, если известен. */
38
+ status?: number;
39
+ /** Основной заголовок-сообщение для пользователя. */
40
+ message: string;
41
+ /** Плоский список дополнительных сообщений под `message`. */
42
+ details?: string[];
43
+ /** Структурированные ошибки по полям (если сервер вернул JSON-объект `errors`). */
44
+ fieldErrors?: ResponseErrorFieldError[];
45
+ /** Оригинальный объект ошибки/ответа (для логов/retry). */
46
+ raw: unknown;
47
+ /** Произвольный контекст, переданный потребителем (например, `{ files }`). */
48
+ meta?: Record<string, unknown>;
49
+ };
50
+ /**
51
+ * Нормализованный «сырой» результат запроса. Заполняется `normalizeError`
52
+ * единообразно для axios / fetch / xhr / голого Error / строки.
53
+ */
54
+ export type NormalizedRawError = {
55
+ /** Оригинал, как пришёл от потребителя. */
56
+ raw: unknown;
57
+ /** HTTP-статус (если был ответ). */
58
+ status?: number;
59
+ /** Уже распарсенное тело ответа (JSON-объект, строка). */
60
+ body?: unknown;
61
+ /** Заголовки ответа (lower-case keys). */
62
+ headers?: Record<string, string>;
63
+ /** Признак отмены (`AbortError` / axios `isCancel`). */
64
+ isAbort?: boolean;
65
+ /** Признак транспортной ошибки без ответа. */
66
+ isNetwork?: boolean;
67
+ };
68
+ /**
69
+ * Контекст, который классификатор передаёт каждому парсеру.
70
+ *
71
+ * `raw` — исходный объект (для duck-typing).
72
+ * `status/body/headers/isAbort/isNetwork` — нормализованные поля.
73
+ * `meta` — произвольный пользовательский контекст (например, `{ files, formId }`).
74
+ * `texts` — мёрджнутые тексты, парсер может использовать дефолты как fallback.
75
+ */
76
+ export type ResponseErrorContext = NormalizedRawError & {
77
+ meta: Record<string, unknown>;
78
+ texts: ResponseErrorTexts;
79
+ };
80
+ /**
81
+ * Результат работы парсера. Любое поле опционально — классификатор сливает
82
+ * результаты по очереди (последний непустой выигрывает).
83
+ *
84
+ * `stop: true` — прервать цепочку, никакие следующие парсеры не вызовутся.
85
+ */
86
+ export type ResponseErrorParserResult = {
87
+ kind?: ResponseErrorKind;
88
+ status?: number;
89
+ message?: string;
90
+ details?: string[];
91
+ fieldErrors?: ResponseErrorFieldError[];
92
+ stop?: boolean;
93
+ };
94
+ /** Сигнатура парсера. */
95
+ export type ResponseErrorParser = (ctx: ResponseErrorContext) => ResponseErrorParserResult | null | undefined;
96
+ /**
97
+ * Тексты-фолбэки для каждого `kind` + лейблы кнопок.
98
+ * Все строки переопределяются через проп `texts` (частичный мердж).
99
+ */
100
+ export type ResponseErrorTexts = {
101
+ networkTitle: string;
102
+ networkMessage: string;
103
+ abortedTitle: string;
104
+ abortedMessage: string;
105
+ validationTitle: string;
106
+ validationMessage: string;
107
+ clientTitle: string;
108
+ clientMessage: string;
109
+ serverTitle: string;
110
+ serverMessage: string;
111
+ unknownTitle: string;
112
+ unknownMessage: string;
113
+ retryLabel: string;
114
+ dismissLabel: string;
115
+ };
@@ -0,0 +1,62 @@
1
+ import type { ComputedRef, Ref } from 'vue';
2
+ import { DEFAULT_RESPONSE_ERROR_TEXTS } from './responseError.defaults';
3
+ import type { ResponseErrorInfo, ResponseErrorKind, ResponseErrorParser, ResponseErrorTexts } from './responseError.types';
4
+ /**
5
+ * Опции для `useResponseError`. Все поля опциональны и поддерживают
6
+ * **реактивные геттеры** (`() => value`) — чтобы пробрасывать пропсы
7
+ * родителя без потери реактивности.
8
+ */
9
+ export type UseResponseErrorOptions = {
10
+ /** Цепочка парсеров. По умолчанию — `defaultResponseErrorParsers`. */
11
+ parsers?: () => ResponseErrorParser[] | undefined;
12
+ /** Частичный override текстов баннера. */
13
+ texts?: () => Partial<ResponseErrorTexts> | undefined;
14
+ /**
15
+ * `kind`'ы, которые **не** выставляются в state (баннер останется скрытым).
16
+ * По умолчанию пусто — `aborted` показывается info-плашкой. Передайте
17
+ * `['aborted']`, если хотите тихо проглатывать отмены.
18
+ */
19
+ autoHideKinds?: () => ResponseErrorKind[] | undefined;
20
+ /** Имя поля основного сообщения в body (для `plainMessageParser`). */
21
+ messageKey?: () => string | undefined;
22
+ /** Контекст, который попадёт в `ctx.meta` каждого парсера (`{ files, formId, ... }`). */
23
+ meta?: () => Record<string, unknown> | undefined;
24
+ /** Побочка после успешной классификации (логирование, sentry). */
25
+ onClassify?: (info: ResponseErrorInfo) => void;
26
+ };
27
+ /** Публичный возвращаемый API. */
28
+ export type UseResponseErrorReturn = {
29
+ /** Текущее состояние ошибки. `null` — баннер скрыт. */
30
+ currentError: Ref<ResponseErrorInfo | null>;
31
+ /** `currentError.value !== null`. */
32
+ isVisible: ComputedRef<boolean>;
33
+ /** Последний «сырой» вход (для retry/логов). */
34
+ lastRaw: Ref<unknown>;
35
+ /**
36
+ * Главное API: классифицирует raw, сохраняет в state, возвращает info
37
+ * (или `null`, если `kind` в `autoHideKinds`). Возвращает Promise,
38
+ * т.к. нормализатор поддерживает `Response.json()` (async).
39
+ */
40
+ setRaw: (raw: unknown, meta?: Record<string, unknown>) => Promise<ResponseErrorInfo | null>;
41
+ /** Установить готовый info, не пропуская через парсеры. */
42
+ setError: (info: ResponseErrorInfo) => void;
43
+ /** Чистая классификация без записи в state — для предпросмотра. */
44
+ classify: (raw: unknown, meta?: Record<string, unknown>) => Promise<ResponseErrorInfo>;
45
+ /** Сбросить state (скрыть баннер). */
46
+ dismiss: () => void;
47
+ /** Алиас `dismiss`. */
48
+ reset: () => void;
49
+ /**
50
+ * Хелпер: вызывает `handler(currentError)`. Если handler завершился без
51
+ * исключения — сбрасывает state. Если кинул — оставляет state, поднимает.
52
+ * Удобно бинать к кнопке «Повторить».
53
+ */
54
+ retry: (handler: (info: ResponseErrorInfo) => void | Promise<void>) => Promise<void>;
55
+ };
56
+ /**
57
+ * Stateful-композабл вокруг `createResponseErrorClassifier`. Хранит
58
+ * `currentError`, инкапсулирует setRaw/retry/dismiss. Подходит для типичного
59
+ * сценария «поймал ошибку запроса → показал баннер → ретрай/скрыть».
60
+ */
61
+ export declare function useResponseError(options?: UseResponseErrorOptions): UseResponseErrorReturn;
62
+ export { DEFAULT_RESPONSE_ERROR_TEXTS };
@@ -18,8 +18,8 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
18
18
  regionLabel: string;
19
19
  }>>> & Readonly<{}>, {
20
20
  regionLabel: string;
21
- placement: GrToasterPlacement;
22
21
  dismissLabel: string;
22
+ placement: GrToasterPlacement;
23
23
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
24
24
  declare const _default: typeof __VLS_export;
25
25
  export default _default;
@@ -59,6 +59,7 @@ export declare const granularityComponentConfigs: {
59
59
  GrPromptDialog: GranularComponentDescriptor<"GrPromptDialog">;
60
60
  GrRadio: GranularComponentDescriptor<"GrRadio">;
61
61
  GrRadioGroup: GranularComponentDescriptor<"GrRadioGroup">;
62
+ GrResponseErrorBanner: GranularComponentDescriptor<"GrResponseErrorBanner">;
62
63
  GrSegmented: GranularComponentDescriptor<"GrSegmented">;
63
64
  GrSelect: GranularComponentDescriptor<"GrSelect">;
64
65
  GrSidebar: GranularComponentDescriptor<"GrSidebar">;
@@ -41,6 +41,22 @@ export declare const en: {
41
41
  navbar: {
42
42
  openMenu: string;
43
43
  };
44
+ responseError: {
45
+ networkTitle: string;
46
+ networkMessage: string;
47
+ abortedTitle: string;
48
+ abortedMessage: string;
49
+ validationTitle: string;
50
+ validationMessage: string;
51
+ clientTitle: string;
52
+ clientMessage: string;
53
+ serverTitle: string;
54
+ serverMessage: string;
55
+ unknownTitle: string;
56
+ unknownMessage: string;
57
+ retryLabel: string;
58
+ dismissLabel: string;
59
+ };
44
60
  colors: {
45
61
  neutral: string;
46
62
  success: string;
@@ -84,6 +100,22 @@ export declare const en: {
84
100
  navbar: {
85
101
  openMenu: string;
86
102
  };
103
+ responseError: {
104
+ networkTitle: string;
105
+ networkMessage: string;
106
+ abortedTitle: string;
107
+ abortedMessage: string;
108
+ validationTitle: string;
109
+ validationMessage: string;
110
+ clientTitle: string;
111
+ clientMessage: string;
112
+ serverTitle: string;
113
+ serverMessage: string;
114
+ unknownTitle: string;
115
+ unknownMessage: string;
116
+ retryLabel: string;
117
+ dismissLabel: string;
118
+ };
87
119
  colors: {
88
120
  neutral: string;
89
121
  success: string;
@@ -34,6 +34,22 @@ export declare const es: {
34
34
  navbar: {
35
35
  openMenu: string;
36
36
  };
37
+ responseError: {
38
+ networkTitle: string;
39
+ networkMessage: string;
40
+ abortedTitle: string;
41
+ abortedMessage: string;
42
+ validationTitle: string;
43
+ validationMessage: string;
44
+ clientTitle: string;
45
+ clientMessage: string;
46
+ serverTitle: string;
47
+ serverMessage: string;
48
+ unknownTitle: string;
49
+ unknownMessage: string;
50
+ retryLabel: string;
51
+ dismissLabel: string;
52
+ };
37
53
  colors: {
38
54
  neutral: string;
39
55
  success: string;
@@ -77,6 +93,22 @@ export declare const es: {
77
93
  navbar: {
78
94
  openMenu: string;
79
95
  };
96
+ responseError: {
97
+ networkTitle: string;
98
+ networkMessage: string;
99
+ abortedTitle: string;
100
+ abortedMessage: string;
101
+ validationTitle: string;
102
+ validationMessage: string;
103
+ clientTitle: string;
104
+ clientMessage: string;
105
+ serverTitle: string;
106
+ serverMessage: string;
107
+ unknownTitle: string;
108
+ unknownMessage: string;
109
+ retryLabel: string;
110
+ dismissLabel: string;
111
+ };
80
112
  colors: {
81
113
  neutral: string;
82
114
  success: string;
@@ -34,6 +34,22 @@ export declare const ru: {
34
34
  navbar: {
35
35
  openMenu: string;
36
36
  };
37
+ responseError: {
38
+ networkTitle: string;
39
+ networkMessage: string;
40
+ abortedTitle: string;
41
+ abortedMessage: string;
42
+ validationTitle: string;
43
+ validationMessage: string;
44
+ clientTitle: string;
45
+ clientMessage: string;
46
+ serverTitle: string;
47
+ serverMessage: string;
48
+ unknownTitle: string;
49
+ unknownMessage: string;
50
+ retryLabel: string;
51
+ dismissLabel: string;
52
+ };
37
53
  colors: {
38
54
  neutral: string;
39
55
  success: string;
@@ -77,6 +93,22 @@ export declare const ru: {
77
93
  navbar: {
78
94
  openMenu: string;
79
95
  };
96
+ responseError: {
97
+ networkTitle: string;
98
+ networkMessage: string;
99
+ abortedTitle: string;
100
+ abortedMessage: string;
101
+ validationTitle: string;
102
+ validationMessage: string;
103
+ clientTitle: string;
104
+ clientMessage: string;
105
+ serverTitle: string;
106
+ serverMessage: string;
107
+ unknownTitle: string;
108
+ unknownMessage: string;
109
+ retryLabel: string;
110
+ dismissLabel: string;
111
+ };
80
112
  colors: {
81
113
  neutral: string;
82
114
  success: string;
@@ -34,6 +34,7 @@ export * from './components/GrProgressBar';
34
34
  export * from './components/GrPromptDialog';
35
35
  export * from './components/GrRadio';
36
36
  export * from './components/GrRadioGroup';
37
+ export * from './components/GrResponseErrorBanner';
37
38
  export * from './components/GrSegmented';
38
39
  export * from './components/GrSelect';
39
40
  export * from './components/GrSidebar';
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.6.2",
4
+ "version": "0.7.0",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
7
7
  "name": "Evgeniy Fureev",
@@ -1 +0,0 @@
1
- {"version":3,"file":"en-BMjJZttK.js","names":[],"sources":["../../src/i18n/locales/en.json"],"sourcesContent":["{\n \"common\": {\n \"confirm\": \"Confirm\",\n \"cancel\": \"Cancel\",\n \"add\": \"Add\",\n \"clear\": \"Clear\",\n \"close\": \"Close\"\n },\n \"loading\": {\n \"defaultText\": \"Loading...\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Search…\",\n \"empty\": \"No data\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Confirm\"\n },\n \"prompt\": {\n \"title\": \"Prompt\",\n \"label\": \"Value\",\n \"required\": \"Enter a value.\"\n }\n },\n \"pagination\": {\n \"pageSize\": \"Page size\",\n \"prev\": \"Prev\",\n \"next\": \"Next\"\n },\n \"navbar\": {\n \"openMenu\": \"Open menu\"\n },\n \"colors\": {\n \"neutral\": \"Neutral\",\n \"success\": \"Success\",\n \"warning\": \"Warning\",\n \"danger\": \"Danger\",\n \"info\": \"Info\",\n \"primary\": \"Primary\",\n \"slate\": \"Slate\",\n \"azure\": \"Azure\"\n }\n}\n"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"es-EYCf8G_1.js","names":[],"sources":["../../src/i18n/locales/es.json"],"sourcesContent":["{\n \"common\": {\n \"confirm\": \"Confirmar\",\n \"cancel\": \"Cancelar\",\n \"add\": \"Añadir\",\n \"clear\": \"Limpiar\",\n \"close\": \"Cerrar\"\n },\n \"loading\": {\n \"defaultText\": \"Cargando...\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Buscar…\",\n \"empty\": \"Sin datos\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Confirmar\"\n },\n \"prompt\": {\n \"title\": \"Aviso\",\n \"label\": \"Valor\",\n \"required\": \"Introduzca un valor.\"\n }\n },\n \"pagination\": {\n \"pageSize\": \"Tamaño de página\",\n \"prev\": \"Anterior\",\n \"next\": \"Siguiente\"\n },\n \"navbar\": {\n \"openMenu\": \"Abrir menú\"\n },\n \"colors\": {\n \"neutral\": \"Neutral\",\n \"success\": \"Éxito\",\n \"warning\": \"Advertencia\",\n \"danger\": \"Peligro\",\n \"info\": \"Info\",\n \"primary\": \"Primario\",\n \"slate\": \"Pizarra\",\n \"azure\": \"Azul celeste\"\n }\n}\n"],"mappings":""}
@@ -1,26 +0,0 @@
1
- import { t as GRANULARITY_I18N_KEY } from "./adapter-CRyH4YC8.js";
2
- import { getCurrentInstance, inject } from "vue";
3
- //#region src/internal/granularityI18n.ts
4
- function isGranularityI18nLike(value) {
5
- return typeof value?.t === "function";
6
- }
7
- function resolveGranularityI18n(context) {
8
- if (isGranularityI18nLike(context)) return context;
9
- const provides = context?.provides;
10
- if (provides) return provides[GRANULARITY_I18N_KEY];
11
- return getCurrentInstance() ? inject(GRANULARITY_I18N_KEY, null) : null;
12
- }
13
- function useGranularityTranslations(context) {
14
- const i18n = resolveGranularityI18n(context);
15
- const t = (key, fallback, params) => {
16
- if (!i18n) return fallback;
17
- const result = i18n.t(key, params);
18
- return result === key ? fallback : result;
19
- };
20
- return {
21
- i18n,
22
- t
23
- };
24
- }
25
- //#endregion
26
- export { useGranularityTranslations as t };
@@ -1 +0,0 @@
1
- {"version":3,"file":"granularityI18n-Dm4DuCS9.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n return provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null\n }\n\n return getCurrentInstance() ? inject(GRANULARITY_I18N_KEY, null) : null\n}\n\nexport function useGranularityTranslations(context?: AppContext | GranularityI18nLike | null) {\n const i18n = resolveGranularityI18n(context)\n\n const t = (key: string, fallback: string, params?: Record<string, any>): string => {\n if (!i18n) {\n return fallback\n }\n\n const result = i18n.t(key, params)\n return result === key ? fallback : result\n }\n\n return {\n i18n,\n t,\n }\n}"],"mappings":";;;AAMA,SAAS,sBAAsB,OAA8C;AAC3E,QAAO,OAAQ,OAAsC,MAAM;;AAG7D,SAAgB,uBAAuB,SAA+E;AACpH,KAAI,sBAAsB,QAAQ,CAChC,QAAO;CAGT,MAAM,WAAW,SAAS;AAE1B,KAAI,SACF,QAAO,SAAS;AAGlB,QAAO,oBAAoB,GAAG,OAAO,sBAAsB,KAAK,GAAG;;AAGrE,SAAgB,2BAA2B,SAAmD;CAC5F,MAAM,OAAO,uBAAuB,QAAQ;CAE5C,MAAM,KAAK,KAAa,UAAkB,WAAyC;AACjF,MAAI,CAAC,KACH,QAAO;EAGT,MAAM,SAAS,KAAK,EAAE,KAAK,OAAO;AAClC,SAAO,WAAW,MAAM,WAAW;;AAGrC,QAAO;EACL;EACA;EACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ru-DKswMSdd.js","names":[],"sources":["../../src/i18n/locales/ru.json"],"sourcesContent":["{\n \"common\": {\n \"confirm\": \"Подтвердить\",\n \"cancel\": \"Отмена\",\n \"add\": \"Добавить\",\n \"clear\": \"Очистить\",\n \"close\": \"Закрыть\"\n },\n \"loading\": {\n \"defaultText\": \"Загрузка...\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Поиск…\",\n \"empty\": \"Нет данных\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Подтверждение\"\n },\n \"prompt\": {\n \"title\": \"Введите значение\",\n \"label\": \"Значение\",\n \"required\": \"Введите значение.\"\n }\n },\n \"pagination\": {\n \"pageSize\": \"Размер страницы\",\n \"prev\": \"Назад\",\n \"next\": \"Вперёд\"\n },\n \"navbar\": {\n \"openMenu\": \"Открыть меню\"\n },\n \"colors\": {\n \"neutral\": \"Нейтральный\",\n \"success\": \"Успех\",\n \"warning\": \"Предупреждение\",\n \"danger\": \"Опасность\",\n \"info\": \"Инфо\",\n \"primary\": \"Primary\",\n \"slate\": \"Сланцевый\",\n \"azure\": \"Лазурный\"\n }\n}\n"],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared-DO3Sr5FJ.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/granular-provider/shared.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","// Общий код browser- и node-entry granular-provider'а.\n//\n// Оба entry (`./index.ts`, `./node.ts`) отличаются только списком\n// компонентов, у которых есть node-only вариант конфига (например,\n// `GrButton`, чей `config.node.ts` использует `tokenDefinitionsFromCssSync`\n// и тянет `node:fs`). Browser-вариант таких компонентов берёт облегчённый\n// `./config.ts`, node-вариант — `./config.node.ts`. Всё остальное — `id`,\n// `theme.*`, `packageBaseUrl` и полный список browser-safe компонентов —\n// живёт здесь.\n//\n// ВАЖНО: все `new URL('../styles/...', import.meta.url)` намеренно находятся\n// здесь — `shared.ts` лежит в той же директории, что и `index.ts` / `node.ts`,\n// поэтому относительные пути идентичны. Это ОК для браузера: бандлеры\n// транслируют такие конструкции в статические asset-URL и `node:*` в бандл\n// не утаскивают.\n//\n// Ключи записи `<Name>: ds<Name>Config` в `granularityComponentConfigs`\n// критичны для regex‑парсинга в `apps/showcase/scripts/generate-component-api.mjs`,\n// не ломайте формат.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n} from '@feugene/unocss-preset-granular/contract'\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// runtime-concat: литерал `new URL('..', import.meta.url)` rolldown заменяет\n// на `data:`-URL, поэтому собираем корень пакета из `import.meta.url` вручную\n// (отрезая два последних сегмента: имя файла и каталог `granular-provider/`).\nconst packageBaseUrl = `${import.meta.url.slice(\n 0,\n import.meta.url.lastIndexOf('/', import.meta.url.lastIndexOf('/') - 1) + 1,\n)}`\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Полный реестр публичных компонентов пакета `@feugene/granularity`.\n *\n * Ключи — имена компонентов (совпадают с публичным subpath‑экспортом\n * `@feugene/granularity/components/<Name>`). Значения — browser‑safe\n * `ds<Name>Config` из `./config.ts` рядом с SFC.\n *\n * Для компонентов, у которых есть node-only вариант конфига\n * (например, `GrButton` с `tokenDefinitionsFromCssSync`), browser‑конфиг\n * остаётся здесь, а node‑вариант подставляется снаружи через\n * `createGranularityProvider(overrides)` — см. `./index.ts` (browser)\n * и `./node.ts` (node).\n *\n * Формат записи `<Name>: ds<Name>Config` критичен для regex‑парсинга\n * в `apps/showcase/scripts/generate-component-api.mjs`, не ломайте его.\n */\nexport const granularityComponentConfigs = {\n GrAlert: grAlertConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCollapse: grCollapseConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrDataTable: grDataTableConfig,\n GrDialog: grDialogConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFileUpload: grFileUploadConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrProgressBar: grProgressBarConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый (browser-safe) набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета `@feugene/granularity`.\n *\n * Принимает массив `GranularComponentDescriptor`'ов — это компоненты,\n * у которых есть node-only вариант конфига (например, `GrButton` с\n * `tokenDefinitionsFromCssSync`). Дескрипторы с именем, которое уже\n * присутствует в базовом наборе, переопределяют его (побеждает\n * переданный снаружи), остальные — добавляются в конец списка.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;CACrC,UAAU;CACX,CAAC;;;;ACkEF,IAAa,0BAA0B;AAKvC,IAAM,iBAAiB,GAAG,OAAO,KAAK,IAAI,MACxC,GACA,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI,YAAY,IAAI,GAAG,EAAE,GAAG,EAC1E;;AAGD,IAAa,wBAAwB,CAAC,SAAS,OAAO;;AAItD,IAAa,2BAA4D,CAAC,QAAQ;AAElF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,i2BAAA,KAAA,OAAA,KAAA,IAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,iuKAAA,KAAA,OAAA,KAAA,IAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,qrGAAA,KAAA,OAAA,KAAA,IAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,qxGAAA,KAAA,OAAA,KAAA,IAAqD,CAAC;EAC7D;CACD,eAAe;CAChB;;;;;;;;;;;;;;;;;AAkBD,IAAa,8BAA8B;CACzC,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,aAAa;CACb,UAAU;CACV,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,SAAS;CACT,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACf;;AAKD,IAAM,iBAAyD,OAAO,OACpE,4BACD;;;;;;;;;;AAWD,SAAgB,0BACd,YAAoD,EAAE,EACpC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,UAAU,CAAC,CACxD;AAMD,QAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,YATgD,CAChD,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,KAAK,IAAI,UAAU,EACnF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,KAAK,CAAC,CAC7F;EAOC;EACD,CAAC"}