@taskless-app/shared 0.1.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/LICENSE +24 -0
- package/dist/branding.d.ts +32 -0
- package/dist/branding.js +28 -0
- package/dist/branding.js.map +1 -0
- package/dist/chatMessageKinds.d.ts +2 -0
- package/dist/chatMessageKinds.js +10 -0
- package/dist/chatMessageKinds.js.map +1 -0
- package/dist/designTokens.d.ts +190 -0
- package/dist/designTokens.js +249 -0
- package/dist/designTokens.js.map +1 -0
- package/dist/domain.d.ts +2 -0
- package/dist/domain.js +8 -0
- package/dist/domain.js.map +1 -0
- package/dist/finishChip.d.ts +18 -0
- package/dist/finishChip.js +95 -0
- package/dist/finishChip.js.map +1 -0
- package/dist/gender.d.ts +6 -0
- package/dist/gender.js +11 -0
- package/dist/gender.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/labelColors.d.ts +3 -0
- package/dist/labelColors.js +33 -0
- package/dist/labelColors.js.map +1 -0
- package/dist/notifications.d.ts +36 -0
- package/dist/notifications.js +2 -0
- package/dist/notifications.js.map +1 -0
- package/dist/releaseSources.d.ts +20 -0
- package/dist/releaseSources.js +44 -0
- package/dist/releaseSources.js.map +1 -0
- package/dist/schemas.d.ts +1929 -0
- package/dist/schemas.js +655 -0
- package/dist/schemas.js.map +1 -0
- package/dist/sortWorkflowStates.d.ts +5 -0
- package/dist/sortWorkflowStates.js +18 -0
- package/dist/sortWorkflowStates.js.map +1 -0
- package/dist/statusIcons.d.ts +2 -0
- package/dist/statusIcons.js +40 -0
- package/dist/statusIcons.js.map +1 -0
- package/dist/translit.d.ts +11 -0
- package/dist/translit.js +41 -0
- package/dist/translit.js.map +1 -0
- package/dist/uiTour.d.ts +48 -0
- package/dist/uiTour.js +175 -0
- package/dist/uiTour.js.map +1 -0
- package/dist/userHandle.d.ts +14 -0
- package/dist/userHandle.js +25 -0
- package/dist/userHandle.js.map +1 -0
- package/dist/userHue.d.ts +1 -0
- package/dist/userHue.js +24 -0
- package/dist/userHue.js.map +1 -0
- package/dist/weight.d.ts +11 -0
- package/dist/weight.js +71 -0
- package/dist/weight.js.map +1 -0
- package/dist/workspaceBrand.d.ts +5 -0
- package/dist/workspaceBrand.js +39 -0
- package/dist/workspaceBrand.js.map +1 -0
- package/package.json +32 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Copyright © 2026 Ilya Smurov. All rights reserved.
|
|
2
|
+
|
|
3
|
+
@taskless/shared is proprietary software.
|
|
4
|
+
|
|
5
|
+
You are granted a limited, non-exclusive, non-transferable, revocable license to
|
|
6
|
+
use this package solely to build clients of the Taskless service (e.g. the
|
|
7
|
+
official Taskless mobile app) in accordance with the Taskless Terms of Service.
|
|
8
|
+
|
|
9
|
+
You may NOT, in whole or in part:
|
|
10
|
+
- redistribute, sublicense, sell, rent, or lease this package;
|
|
11
|
+
- use this package, or the ideas or techniques embodied in it, to build or
|
|
12
|
+
operate a competing product or service;
|
|
13
|
+
- remove or alter any proprietary or copyright notices.
|
|
14
|
+
|
|
15
|
+
Publication of this package to a public registry does not place it in the
|
|
16
|
+
public domain, nor grant any license or right beyond the terms above.
|
|
17
|
+
|
|
18
|
+
THIS PACKAGE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
+
IMPLIED. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE COPYRIGHT HOLDER
|
|
20
|
+
SHALL NOT BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY ARISING FROM THIS
|
|
21
|
+
PACKAGE OR ITS USE.
|
|
22
|
+
|
|
23
|
+
For any other use, or to obtain a commercial license, contact:
|
|
24
|
+
Ilya Smurov <ilya@smurov.com>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** CNAME-таргет для кастомных доменов. Клиенты CNAME-ят свой домен на него;
|
|
3
|
+
* при смене прод-IP правим одну A-запись ingress, у клиентов ничего не ломается. */
|
|
4
|
+
export declare const INGRESS_HOST = "ingress.taskless.ru";
|
|
5
|
+
export declare const ColorScheme: z.ZodEnum<["light", "dark", "system"]>;
|
|
6
|
+
export type ColorScheme = z.infer<typeof ColorScheme>;
|
|
7
|
+
export declare const BrandingConfig: z.ZodObject<{
|
|
8
|
+
themePreset: z.ZodOptional<z.ZodString>;
|
|
9
|
+
accentColor: z.ZodOptional<z.ZodString>;
|
|
10
|
+
defaultColorScheme: z.ZodOptional<z.ZodEnum<["light", "dark", "system"]>>;
|
|
11
|
+
emailFromName: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, "strict", z.ZodTypeAny, {
|
|
13
|
+
themePreset?: string | undefined;
|
|
14
|
+
accentColor?: string | undefined;
|
|
15
|
+
defaultColorScheme?: "light" | "dark" | "system" | undefined;
|
|
16
|
+
emailFromName?: string | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
themePreset?: string | undefined;
|
|
19
|
+
accentColor?: string | undefined;
|
|
20
|
+
defaultColorScheme?: "light" | "dark" | "system" | undefined;
|
|
21
|
+
emailFromName?: string | undefined;
|
|
22
|
+
}>;
|
|
23
|
+
export type BrandingConfig = z.infer<typeof BrandingConfig>;
|
|
24
|
+
export type ThemePreset = {
|
|
25
|
+
key: string;
|
|
26
|
+
name: string;
|
|
27
|
+
/** oklch-строки, совместимые с переменными index.css */
|
|
28
|
+
primary: string;
|
|
29
|
+
workspace: string;
|
|
30
|
+
};
|
|
31
|
+
export declare const THEME_PRESETS: ThemePreset[];
|
|
32
|
+
export declare function getThemePreset(key?: string): ThemePreset;
|
package/dist/branding.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** CNAME-таргет для кастомных доменов. Клиенты CNAME-ят свой домен на него;
|
|
3
|
+
* при смене прод-IP правим одну A-запись ingress, у клиентов ничего не ломается. */
|
|
4
|
+
export const INGRESS_HOST = "ingress.taskless.ru";
|
|
5
|
+
export const ColorScheme = z.enum(["light", "dark", "system"]);
|
|
6
|
+
export const BrandingConfig = z
|
|
7
|
+
.object({
|
|
8
|
+
// TAS-245: идентичность (название/лого/фавиконка) переехала в свойства
|
|
9
|
+
// воркспейса (Workspace.name/avatarUrl/logoDarkUrl/faviconUrl). Здесь —
|
|
10
|
+
// только тема/цвета/email.
|
|
11
|
+
themePreset: z.string().max(40).optional(),
|
|
12
|
+
// accentColor инъектится в <style> на клиенте — запрещаем символы, которыми
|
|
13
|
+
// можно вырваться из CSS-значения (защита от CSS-инъекции тенант-админом).
|
|
14
|
+
accentColor: z.string().max(40).regex(/^[^};{<>"]+$/).optional(),
|
|
15
|
+
defaultColorScheme: ColorScheme.optional(),
|
|
16
|
+
emailFromName: z.string().max(80).optional(),
|
|
17
|
+
})
|
|
18
|
+
.strict();
|
|
19
|
+
export const THEME_PRESETS = [
|
|
20
|
+
{ key: "default", name: "Taskless", primary: "oklch(0.72 0.17 255)", workspace: "oklch(0.58 0.20 300)" },
|
|
21
|
+
{ key: "emerald", name: "Emerald", primary: "oklch(0.72 0.15 160)", workspace: "oklch(0.62 0.16 165)" },
|
|
22
|
+
{ key: "amber", name: "Amber", primary: "oklch(0.80 0.15 75)", workspace: "oklch(0.70 0.16 60)" },
|
|
23
|
+
{ key: "rose", name: "Rose", primary: "oklch(0.65 0.20 15)", workspace: "oklch(0.62 0.20 10)" },
|
|
24
|
+
];
|
|
25
|
+
export function getThemePreset(key) {
|
|
26
|
+
return THEME_PRESETS.find((p) => p.key === key) ?? THEME_PRESETS[0];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=branding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branding.js","sourceRoot":"","sources":["../src/branding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;qFACqF;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG/D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,uEAAuE;IACvE,wEAAwE;IACxE,2BAA2B;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,4EAA4E;IAC5E,2EAA2E;IAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;IAChE,kBAAkB,EAAE,WAAW,CAAC,QAAQ,EAAE;IAC1C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC;KACD,MAAM,EAAE,CAAC;AAWZ,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,EAAE;IACxG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,sBAAsB,EAAE;IACvG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,qBAAqB,EAAE;IACjG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,qBAAqB,EAAE;CAChG,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAE,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// RoomMessage.kind'ы, которые остаются в БД (историю не трогаем), но не
|
|
2
|
+
// должны участвовать ни в unread-счётчиках/last-message превью на API, ни в
|
|
3
|
+
// рендере треда на web. Сейчас — только presence-строки call_join/call_leave
|
|
4
|
+
// звонка (PRJ3-59: фичу свернули, старые записи скрыли). Один источник
|
|
5
|
+
// правды для api и web, чтобы список не разъехался при будущих правках.
|
|
6
|
+
export const HIDDEN_MESSAGE_KINDS = ["call_join", "call_leave"];
|
|
7
|
+
export function isHiddenMessageKind(kind) {
|
|
8
|
+
return HIDDEN_MESSAGE_KINDS.includes(kind);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=chatMessageKinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatMessageKinds.js","sourceRoot":"","sources":["../src/chatMessageKinds.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,4EAA4E;AAC5E,6EAA6E;AAC7E,uEAAuE;AACvE,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAa,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAE1E,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Цветовые токены. `dark` — полный набор (используется как база в
|
|
3
|
+
* `:root, .dark`). `light` — ТОЛЬКО те ключи, которые светлая тема
|
|
4
|
+
* переопределяет (`.light`); остальные ключи светлая тема наследует из
|
|
5
|
+
* базового набора через обычный CSS-каскад (актуально для формул вида
|
|
6
|
+
* `var(--warning)` — они автоматически подхватывают light-значение
|
|
7
|
+
* `--warning`, не будучи переобъявлены сами).
|
|
8
|
+
*/
|
|
9
|
+
export declare const colorTokens: {
|
|
10
|
+
readonly dark: {
|
|
11
|
+
readonly background: "oklch(0.155 0.016 250)";
|
|
12
|
+
readonly foreground: "oklch(0.93 0.006 250)";
|
|
13
|
+
readonly "swarm-status-review": "oklch(0.72 0.12 155)";
|
|
14
|
+
readonly "swarm-status-running": "oklch(0.70 0.10 265)";
|
|
15
|
+
readonly "swarm-status-queued": "oklch(0.55 0.02 250)";
|
|
16
|
+
readonly "swarm-status-failed": "oklch(0.66 0.14 25)";
|
|
17
|
+
readonly "swarm-status-stalled": "var(--destructive)";
|
|
18
|
+
readonly "swarm-status-question": "oklch(0.78 0.10 90)";
|
|
19
|
+
readonly "swarm-status-done": "oklch(0.68 0.10 155)";
|
|
20
|
+
readonly "swarm-status-stopped": "oklch(0.62 0.06 300)";
|
|
21
|
+
readonly "swarm-status-superseded": "oklch(0.66 0.08 200)";
|
|
22
|
+
readonly "swarm-status-paused": "var(--warning)";
|
|
23
|
+
readonly "swarm-seg-wait": "color-mix(in oklab, var(--swarm-status-queued) 20%, var(--card))";
|
|
24
|
+
readonly "swarm-seg-run": "color-mix(in oklab, var(--swarm-status-running) 42%, var(--card))";
|
|
25
|
+
readonly "swarm-seg-review": "color-mix(in oklab, var(--swarm-status-review) 42%, var(--card))";
|
|
26
|
+
readonly "swarm-seg-pr": "var(--swarm-status-done)";
|
|
27
|
+
readonly "swarm-seg-question": "color-mix(in oklab, var(--swarm-status-question) 45%, var(--card))";
|
|
28
|
+
readonly "swarm-seg-paused": "color-mix(in oklab, var(--swarm-status-paused) 42%, var(--card))";
|
|
29
|
+
readonly "swarm-seg-stalled": "color-mix(in oklab, var(--swarm-status-stalled) 42%, var(--card))";
|
|
30
|
+
readonly "swarm-seg-failed": "color-mix(in oklab, var(--swarm-status-failed) 42%, var(--card))";
|
|
31
|
+
readonly "swarm-seg-stopped": "color-mix(in oklab, var(--swarm-status-stopped) 42%, var(--card))";
|
|
32
|
+
readonly "swarm-seg-superseded": "color-mix(in oklab, var(--swarm-status-superseded) 42%, var(--card))";
|
|
33
|
+
readonly "swarm-seg-edge": "color-mix(in oklab, var(--card) 78%, transparent)";
|
|
34
|
+
readonly "swarm-now-line": "color-mix(in oklab, var(--foreground) 52%, transparent)";
|
|
35
|
+
readonly "swarm-ghost": "color-mix(in oklab, var(--muted-foreground) 60%, transparent)";
|
|
36
|
+
readonly "swarm-flow": "var(--swarm-status-running)";
|
|
37
|
+
readonly card: "oklch(0.185 0.018 250)";
|
|
38
|
+
readonly "card-foreground": "oklch(0.93 0.006 250)";
|
|
39
|
+
readonly popover: "oklch(0.185 0.018 250)";
|
|
40
|
+
readonly "popover-foreground": "oklch(0.93 0.006 250)";
|
|
41
|
+
readonly primary: "oklch(0.72 0.17 255)";
|
|
42
|
+
readonly "primary-foreground": "oklch(0.98 0.02 255)";
|
|
43
|
+
readonly secondary: "oklch(0.19 0.018 250)";
|
|
44
|
+
readonly "secondary-foreground": "oklch(0.93 0.006 250)";
|
|
45
|
+
readonly muted: "oklch(0.19 0.018 250)";
|
|
46
|
+
readonly "muted-foreground": "oklch(0.60 0.012 250)";
|
|
47
|
+
readonly accent: "oklch(0.19 0.018 250)";
|
|
48
|
+
readonly "accent-foreground": "oklch(0.93 0.006 250)";
|
|
49
|
+
readonly destructive: "oklch(0.62 0.19 25)";
|
|
50
|
+
readonly "destructive-foreground": "oklch(0.98 0.02 25)";
|
|
51
|
+
readonly success: "oklch(0.72 0.15 150)";
|
|
52
|
+
readonly "success-foreground": "oklch(0.17 0.03 150)";
|
|
53
|
+
readonly warning: "oklch(0.78 0.155 75)";
|
|
54
|
+
readonly "warning-foreground": "oklch(0.19 0.035 75)";
|
|
55
|
+
readonly workspace: "oklch(0.58 0.20 300)";
|
|
56
|
+
readonly "workspace-foreground": "oklch(0.99 0.015 300)";
|
|
57
|
+
readonly border: "oklch(0.24 0.013 250)";
|
|
58
|
+
readonly "card-border": "oklch(0.20 0.014 250)";
|
|
59
|
+
readonly input: "oklch(0.30 0.014 250)";
|
|
60
|
+
readonly ring: "oklch(0.72 0.17 255 / 0.3)";
|
|
61
|
+
readonly "mention-active": "color-mix(in oklab, var(--foreground) 10%, var(--secondary))";
|
|
62
|
+
readonly "mention-me": "oklch(0.80 0.17 145)";
|
|
63
|
+
readonly sidebar: "oklch(0.135 0.014 250)";
|
|
64
|
+
readonly "sidebar-foreground": "oklch(0.93 0.006 250)";
|
|
65
|
+
readonly "sidebar-primary": "oklch(0.72 0.17 255)";
|
|
66
|
+
readonly "sidebar-primary-foreground": "oklch(0.98 0.02 255)";
|
|
67
|
+
readonly "sidebar-accent": "oklch(0.19 0.018 250)";
|
|
68
|
+
readonly "sidebar-accent-foreground": "oklch(0.93 0.006 250)";
|
|
69
|
+
readonly "sidebar-border": "oklch(0.24 0.013 250)";
|
|
70
|
+
readonly "sidebar-ring": "oklch(0.72 0.17 255 / 0.3)";
|
|
71
|
+
readonly rule: "oklch(0.22 0.014 250)";
|
|
72
|
+
readonly "rule-strong": "oklch(0.30 0.014 250)";
|
|
73
|
+
readonly "fg-soft": "oklch(0.80 0.010 250)";
|
|
74
|
+
readonly dim: "oklch(0.38 0.012 250)";
|
|
75
|
+
readonly cyan: "oklch(0.78 0.10 195)";
|
|
76
|
+
readonly amber: "oklch(0.82 0.13 75)";
|
|
77
|
+
readonly green: "oklch(0.78 0.13 150)";
|
|
78
|
+
readonly pink: "oklch(0.80 0.15 320)";
|
|
79
|
+
readonly "lc-blue": "var(--primary)";
|
|
80
|
+
readonly "lc-cyan": "var(--cyan)";
|
|
81
|
+
readonly "lc-green": "var(--green)";
|
|
82
|
+
readonly "lc-amber": "var(--amber)";
|
|
83
|
+
readonly "lc-pink": "var(--pink)";
|
|
84
|
+
readonly red: "oklch(0.72 0.18 25)";
|
|
85
|
+
readonly "task-color": "oklch(0.78 0.13 195)";
|
|
86
|
+
readonly "meeting-color": "oklch(0.80 0.15 320)";
|
|
87
|
+
readonly "focus-color": "oklch(0.85 0.13 75)";
|
|
88
|
+
readonly "card-grad-bright": "oklch(0.19 0.018 250)";
|
|
89
|
+
readonly "card-border-bright": "oklch(0.22 0.014 250)";
|
|
90
|
+
readonly "card-border-dim": "oklch(0.17 0.014 250)";
|
|
91
|
+
};
|
|
92
|
+
readonly light: {
|
|
93
|
+
readonly background: "oklch(0.985 0.003 250)";
|
|
94
|
+
readonly foreground: "oklch(0.20 0.012 250)";
|
|
95
|
+
readonly "swarm-status-review": "oklch(0.52 0.13 155)";
|
|
96
|
+
readonly "swarm-status-running": "oklch(0.52 0.15 265)";
|
|
97
|
+
readonly "swarm-status-queued": "oklch(0.55 0.02 250)";
|
|
98
|
+
readonly "swarm-status-failed": "oklch(0.54 0.19 25)";
|
|
99
|
+
readonly "swarm-status-question": "oklch(0.55 0.13 90)";
|
|
100
|
+
readonly "swarm-status-done": "oklch(0.50 0.13 155)";
|
|
101
|
+
readonly "swarm-status-stopped": "oklch(0.50 0.09 300)";
|
|
102
|
+
readonly "swarm-status-superseded": "oklch(0.50 0.11 200)";
|
|
103
|
+
readonly card: "oklch(1.00 0 0)";
|
|
104
|
+
readonly "card-foreground": "oklch(0.20 0.012 250)";
|
|
105
|
+
readonly popover: "oklch(1.00 0 0)";
|
|
106
|
+
readonly "popover-foreground": "oklch(0.20 0.012 250)";
|
|
107
|
+
readonly primary: "oklch(0.55 0.20 255)";
|
|
108
|
+
readonly "primary-foreground": "oklch(0.99 0.005 255)";
|
|
109
|
+
readonly secondary: "oklch(0.95 0.005 250)";
|
|
110
|
+
readonly "secondary-foreground": "oklch(0.22 0.012 250)";
|
|
111
|
+
readonly muted: "oklch(0.95 0.005 250)";
|
|
112
|
+
readonly "muted-foreground": "oklch(0.50 0.010 250)";
|
|
113
|
+
readonly accent: "oklch(0.94 0.008 250)";
|
|
114
|
+
readonly "accent-foreground": "oklch(0.20 0.012 250)";
|
|
115
|
+
readonly destructive: "oklch(0.55 0.22 25)";
|
|
116
|
+
readonly "destructive-foreground": "oklch(0.99 0.01 25)";
|
|
117
|
+
readonly success: "oklch(0.55 0.18 150)";
|
|
118
|
+
readonly "success-foreground": "oklch(0.99 0.01 150)";
|
|
119
|
+
readonly warning: "oklch(0.65 0.18 75)";
|
|
120
|
+
readonly "warning-foreground": "oklch(0.20 0.04 75)";
|
|
121
|
+
readonly workspace: "oklch(0.62 0.21 300)";
|
|
122
|
+
readonly "workspace-foreground": "oklch(0.99 0.01 300)";
|
|
123
|
+
readonly border: "oklch(0.91 0.004 250)";
|
|
124
|
+
readonly "card-border": "oklch(0.85 0.008 250)";
|
|
125
|
+
readonly input: "oklch(0.96 0.004 250)";
|
|
126
|
+
readonly ring: "oklch(0.55 0.20 255 / 0.3)";
|
|
127
|
+
readonly "mention-me": "oklch(0.48 0.16 150)";
|
|
128
|
+
readonly sidebar: "oklch(0.95 0.005 250)";
|
|
129
|
+
readonly "sidebar-foreground": "oklch(0.20 0.012 250)";
|
|
130
|
+
readonly "sidebar-primary": "oklch(0.55 0.20 255)";
|
|
131
|
+
readonly "sidebar-primary-foreground": "oklch(0.99 0.005 255)";
|
|
132
|
+
readonly "sidebar-accent": "oklch(0.92 0.008 250)";
|
|
133
|
+
readonly "sidebar-accent-foreground": "oklch(0.20 0.012 250)";
|
|
134
|
+
readonly "sidebar-border": "oklch(0.90 0.006 250)";
|
|
135
|
+
readonly "sidebar-ring": "oklch(0.55 0.20 255 / 0.3)";
|
|
136
|
+
readonly rule: "oklch(0.90 0.006 250)";
|
|
137
|
+
readonly "rule-strong": "oklch(0.82 0.010 250)";
|
|
138
|
+
readonly "fg-soft": "oklch(0.30 0.012 250)";
|
|
139
|
+
readonly dim: "oklch(0.55 0.010 250)";
|
|
140
|
+
readonly "lc-cyan": "oklch(0.56 0.12 195)";
|
|
141
|
+
readonly "lc-green": "oklch(0.55 0.14 150)";
|
|
142
|
+
readonly "lc-amber": "oklch(0.60 0.14 75)";
|
|
143
|
+
readonly "lc-pink": "oklch(0.56 0.18 320)";
|
|
144
|
+
readonly "card-grad-bright": "oklch(0.99 0.003 250)";
|
|
145
|
+
readonly "card-border-bright": "oklch(0.94 0 0)";
|
|
146
|
+
readonly "card-border-dim": "oklch(0.89 0 0)";
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Шкала радиусов. `radius`/`radius-modal`/`radius-popover` — семантические
|
|
151
|
+
* (компонент/слой), `radius-sm..xl`/`radius-full` — размерная шкала кита.
|
|
152
|
+
*/
|
|
153
|
+
export declare const radiusTokens: {
|
|
154
|
+
readonly radius: "6px";
|
|
155
|
+
readonly "radius-modal": "10px";
|
|
156
|
+
readonly "radius-popover": "10px";
|
|
157
|
+
readonly "radius-sm": "2px";
|
|
158
|
+
readonly "radius-md": "3px";
|
|
159
|
+
readonly "radius-lg": "5px";
|
|
160
|
+
readonly "radius-xl": "7px";
|
|
161
|
+
readonly "radius-full": "999px";
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Типографика: семейства шрифтов + шкала кеглей (TAS-300, неймспейс
|
|
165
|
+
* `type-*`, не `text-*` — Tailwind v4 резервирует `--text-*` под утилиты
|
|
166
|
+
* `text-*`). Body (`text.*`) — плоские: на мобиле не уменьшаются, UI-текст
|
|
167
|
+
* читаем под палец. Заголовки (`head.*`) — флюидные clamp (вьюпорт
|
|
168
|
+
* 360→1280px): крупный дисплей на узком экране уместно ужимать.
|
|
169
|
+
*/
|
|
170
|
+
export declare const typographyTokens: {
|
|
171
|
+
readonly fontFamily: {
|
|
172
|
+
readonly sans: "'Figtree', system-ui, sans-serif";
|
|
173
|
+
readonly heading: "'Barlow Semi Condensed', system-ui, sans-serif";
|
|
174
|
+
readonly mono: "'Barlow', monospace";
|
|
175
|
+
};
|
|
176
|
+
readonly text: {
|
|
177
|
+
readonly "2xs": "10.5px";
|
|
178
|
+
readonly xs: "12px";
|
|
179
|
+
readonly sm: "13.5px";
|
|
180
|
+
readonly md: "15px";
|
|
181
|
+
readonly lg: "17px";
|
|
182
|
+
};
|
|
183
|
+
readonly head: {
|
|
184
|
+
readonly xs: "clamp(13px, calc(13px + 2 * (100vw - 360px) / 920), 15px)";
|
|
185
|
+
readonly sm: "clamp(15px, calc(15px + 3 * (100vw - 360px) / 920), 18px)";
|
|
186
|
+
readonly md: "clamp(18px, calc(18px + 4 * (100vw - 360px) / 920), 22px)";
|
|
187
|
+
readonly lg: "clamp(22px, calc(22px + 6 * (100vw - 360px) / 920), 28px)";
|
|
188
|
+
readonly xl: "clamp(26px, calc(26px + 8 * (100vw - 360px) / 920), 34px)";
|
|
189
|
+
};
|
|
190
|
+
};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// CI-51: единственный источник токенов дизайна (цвета, радиусы, типографика)
|
|
2
|
+
// для web И мобильного приложения (отдельный репозиторий ilyasmurov/taskless-mobile,
|
|
3
|
+
// тянет их через npm). web генерирует из этого модуля свои CSS-переменные
|
|
4
|
+
// (packages/web/scripts/generate-theme.mjs → packages/web/src/index.css,
|
|
5
|
+
// секция между маркерами AUTOGEN) — правь значения ТОЛЬКО здесь, не в
|
|
6
|
+
// сгенерированном CSS: правки в index.css перезатрутся при следующей генерации
|
|
7
|
+
// и CI-проверка свежести (map-check job в ci.yml) их отловит как рассинхрон.
|
|
8
|
+
//
|
|
9
|
+
// Ключи объектов — это ИМЕНА CSS custom properties без ведущих "--" (напр.
|
|
10
|
+
// "swarm-status-review" → `--swarm-status-review`). Строковые ключи, не camelCase:
|
|
11
|
+
// прямое 1:1 соответствие с CSS исключает ошибку конвертации при генерации.
|
|
12
|
+
//
|
|
13
|
+
// Значения-строки могут быть литералами (oklch(...)) ИЛИ CSS-выражениями,
|
|
14
|
+
// ссылающимися на другие переменные (напр. "var(--warning)",
|
|
15
|
+
// "color-mix(in oklab, var(--swarm-status-queued) 20%, var(--card))") — эти
|
|
16
|
+
// формулы намеренно тема-нейтральны: var() резолвится в контексте темы
|
|
17
|
+
// использования, поэтому одна запись в colorTokens.dark покрывает обе темы,
|
|
18
|
+
// а colorTokens.light переопределяет только те ключи, для которых светлая
|
|
19
|
+
// тема действительно отличается (см. cascade-объяснение ниже).
|
|
20
|
+
/**
|
|
21
|
+
* Цветовые токены. `dark` — полный набор (используется как база в
|
|
22
|
+
* `:root, .dark`). `light` — ТОЛЬКО те ключи, которые светлая тема
|
|
23
|
+
* переопределяет (`.light`); остальные ключи светлая тема наследует из
|
|
24
|
+
* базового набора через обычный CSS-каскад (актуально для формул вида
|
|
25
|
+
* `var(--warning)` — они автоматически подхватывают light-значение
|
|
26
|
+
* `--warning`, не будучи переобъявлены сами).
|
|
27
|
+
*/
|
|
28
|
+
export const colorTokens = {
|
|
29
|
+
dark: {
|
|
30
|
+
background: "oklch(0.155 0.016 250)",
|
|
31
|
+
foreground: "oklch(0.93 0.006 250)",
|
|
32
|
+
// Swarm — цвета статусов дронов (dark). TASWM-76: подняты из scoped .root
|
|
33
|
+
// SwarmTimeline на глобальный :root, чтобы их видели и fleet-карточки
|
|
34
|
+
// вкладки «Рой», и портал модалки дрона (Dialog рендерится в body, вне
|
|
35
|
+
// .layout).
|
|
36
|
+
"swarm-status-review": "oklch(0.72 0.12 155)",
|
|
37
|
+
"swarm-status-running": "oklch(0.70 0.10 265)",
|
|
38
|
+
"swarm-status-queued": "oklch(0.55 0.02 250)",
|
|
39
|
+
"swarm-status-failed": "oklch(0.66 0.14 25)",
|
|
40
|
+
// «завис» (stalled, TASWM-233) — по канону swarm-core STATUS_META: роль
|
|
41
|
+
// --destructive, не отдельный амбер-оклч. Дрон погиб и ждёт человека —
|
|
42
|
+
// тревожный красный, не нейтральный.
|
|
43
|
+
"swarm-status-stalled": "var(--destructive)",
|
|
44
|
+
"swarm-status-question": "oklch(0.78 0.10 90)",
|
|
45
|
+
"swarm-status-done": "oklch(0.68 0.10 155)",
|
|
46
|
+
// stopped/superseded (TASWM-166): фиолет = «остановлен оператором»,
|
|
47
|
+
// циан = «переигран» (заменён другим прогоном) — не пересекаются по hue
|
|
48
|
+
// с остальной палитрой статусов.
|
|
49
|
+
"swarm-status-stopped": "oklch(0.62 0.06 300)",
|
|
50
|
+
"swarm-status-superseded": "oklch(0.66 0.08 200)",
|
|
51
|
+
// «замер» (paused/storm_dead, TASWM-150) — по канону swarm-core
|
|
52
|
+
// STATUS_META: роль --warning, не литеральный оклч.
|
|
53
|
+
"swarm-status-paused": "var(--warning)",
|
|
54
|
+
// v5 таймлайн «Рой» — палитра ФАЗ-сегментов полосы, выведена из
|
|
55
|
+
// семантических swarm-status-* через color-mix с поверхностью --card.
|
|
56
|
+
"swarm-seg-wait": "color-mix(in oklab, var(--swarm-status-queued) 20%, var(--card))",
|
|
57
|
+
"swarm-seg-run": "color-mix(in oklab, var(--swarm-status-running) 42%, var(--card))",
|
|
58
|
+
"swarm-seg-review": "color-mix(in oklab, var(--swarm-status-review) 42%, var(--card))",
|
|
59
|
+
"swarm-seg-pr": "var(--swarm-status-done)", // PR готов / смержено — насыщенный
|
|
60
|
+
"swarm-seg-question": "color-mix(in oklab, var(--swarm-status-question) 45%, var(--card))",
|
|
61
|
+
"swarm-seg-paused": "color-mix(in oklab, var(--swarm-status-paused) 42%, var(--card))",
|
|
62
|
+
"swarm-seg-stalled": "color-mix(in oklab, var(--swarm-status-stalled) 42%, var(--card))",
|
|
63
|
+
"swarm-seg-failed": "color-mix(in oklab, var(--swarm-status-failed) 42%, var(--card))",
|
|
64
|
+
"swarm-seg-stopped": "color-mix(in oklab, var(--swarm-status-stopped) 42%, var(--card))",
|
|
65
|
+
"swarm-seg-superseded": "color-mix(in oklab, var(--swarm-status-superseded) 42%, var(--card))",
|
|
66
|
+
// шов на стыке сегментов (inset-хайлайт).
|
|
67
|
+
"swarm-seg-edge": "color-mix(in oklab, var(--card) 78%, transparent)",
|
|
68
|
+
// вертикаль «сейчас» и ghost-очередь (пунктир).
|
|
69
|
+
"swarm-now-line": "color-mix(in oklab, var(--foreground) 52%, transparent)",
|
|
70
|
+
"swarm-ghost": "color-mix(in oklab, var(--muted-foreground) 60%, transparent)",
|
|
71
|
+
// поток задач — индиго-стрелки цепочки между строками.
|
|
72
|
+
"swarm-flow": "var(--swarm-status-running)",
|
|
73
|
+
card: "oklch(0.185 0.018 250)",
|
|
74
|
+
"card-foreground": "oklch(0.93 0.006 250)",
|
|
75
|
+
popover: "oklch(0.185 0.018 250)",
|
|
76
|
+
"popover-foreground": "oklch(0.93 0.006 250)",
|
|
77
|
+
primary: "oklch(0.72 0.17 255)",
|
|
78
|
+
"primary-foreground": "oklch(0.98 0.02 255)",
|
|
79
|
+
secondary: "oklch(0.19 0.018 250)",
|
|
80
|
+
"secondary-foreground": "oklch(0.93 0.006 250)",
|
|
81
|
+
muted: "oklch(0.19 0.018 250)",
|
|
82
|
+
"muted-foreground": "oklch(0.60 0.012 250)",
|
|
83
|
+
accent: "oklch(0.19 0.018 250)",
|
|
84
|
+
"accent-foreground": "oklch(0.93 0.006 250)",
|
|
85
|
+
destructive: "oklch(0.62 0.19 25)",
|
|
86
|
+
"destructive-foreground": "oklch(0.98 0.02 25)",
|
|
87
|
+
success: "oklch(0.72 0.15 150)",
|
|
88
|
+
"success-foreground": "oklch(0.17 0.03 150)",
|
|
89
|
+
warning: "oklch(0.78 0.155 75)",
|
|
90
|
+
"warning-foreground": "oklch(0.19 0.035 75)",
|
|
91
|
+
// TAS-177: семантический акцент «контент от лица воркспейса» (роль, не
|
|
92
|
+
// цвет). Вне статусной палитры (синий=бренд, амбер=ожидание,
|
|
93
|
+
// зелёный=готово, красный=опасно).
|
|
94
|
+
workspace: "oklch(0.58 0.20 300)",
|
|
95
|
+
"workspace-foreground": "oklch(0.99 0.015 300)",
|
|
96
|
+
border: "oklch(0.24 0.013 250)",
|
|
97
|
+
// Тонкий border у контентной карточки + волоски строк в таблицах.
|
|
98
|
+
"card-border": "oklch(0.20 0.014 250)",
|
|
99
|
+
input: "oklch(0.30 0.014 250)",
|
|
100
|
+
ring: "oklch(0.72 0.17 255 / 0.3)",
|
|
101
|
+
// Подсветка активного/наведённого пункта в @-дропдаунах (mention/agent).
|
|
102
|
+
// Чистый --secondary в тёмной теме сливается с --popover — подмешиваем
|
|
103
|
+
// foreground для контраста. (TAS-315)
|
|
104
|
+
"mention-active": "color-mix(in oklab, var(--foreground) 10%, var(--secondary))",
|
|
105
|
+
// Цвет выделения текущего пользователя («я») в списках и mention-чипах. (TAS-331)
|
|
106
|
+
"mention-me": "oklch(0.80 0.17 145)",
|
|
107
|
+
sidebar: "oklch(0.135 0.014 250)",
|
|
108
|
+
"sidebar-foreground": "oklch(0.93 0.006 250)",
|
|
109
|
+
"sidebar-primary": "oklch(0.72 0.17 255)",
|
|
110
|
+
"sidebar-primary-foreground": "oklch(0.98 0.02 255)",
|
|
111
|
+
"sidebar-accent": "oklch(0.19 0.018 250)",
|
|
112
|
+
"sidebar-accent-foreground": "oklch(0.93 0.006 250)",
|
|
113
|
+
"sidebar-border": "oklch(0.24 0.013 250)",
|
|
114
|
+
"sidebar-ring": "oklch(0.72 0.17 255 / 0.3)",
|
|
115
|
+
// Agent / preview-card design tokens (mirror design/agent.html).
|
|
116
|
+
rule: "oklch(0.22 0.014 250)",
|
|
117
|
+
"rule-strong": "oklch(0.30 0.014 250)",
|
|
118
|
+
"fg-soft": "oklch(0.80 0.010 250)",
|
|
119
|
+
dim: "oklch(0.38 0.012 250)",
|
|
120
|
+
cyan: "oklch(0.78 0.10 195)",
|
|
121
|
+
amber: "oklch(0.82 0.13 75)",
|
|
122
|
+
green: "oklch(0.78 0.13 150)",
|
|
123
|
+
pink: "oklch(0.80 0.15 320)",
|
|
124
|
+
// Launcher-акценты плашек мобильной главной. blue=primary (уже
|
|
125
|
+
// theme-aware).
|
|
126
|
+
"lc-blue": "var(--primary)",
|
|
127
|
+
"lc-cyan": "var(--cyan)",
|
|
128
|
+
"lc-green": "var(--green)",
|
|
129
|
+
"lc-amber": "var(--amber)",
|
|
130
|
+
"lc-pink": "var(--pink)",
|
|
131
|
+
red: "oklch(0.72 0.18 25)",
|
|
132
|
+
"task-color": "oklch(0.78 0.13 195)",
|
|
133
|
+
"meeting-color": "oklch(0.80 0.15 320)",
|
|
134
|
+
"focus-color": "oklch(0.85 0.13 75)",
|
|
135
|
+
// Гранд-токены content-карточки (AppShell): радиальный фон +
|
|
136
|
+
// градиентный border, плавно меняются вместе с темой.
|
|
137
|
+
"card-grad-bright": "oklch(0.19 0.018 250)",
|
|
138
|
+
"card-border-bright": "oklch(0.22 0.014 250)",
|
|
139
|
+
"card-border-dim": "oklch(0.17 0.014 250)",
|
|
140
|
+
},
|
|
141
|
+
light: {
|
|
142
|
+
background: "oklch(0.985 0.003 250)",
|
|
143
|
+
foreground: "oklch(0.20 0.012 250)",
|
|
144
|
+
// Swarm — цвета статусов дронов (light), парные к dark выше (TASWM-76).
|
|
145
|
+
"swarm-status-review": "oklch(0.52 0.13 155)",
|
|
146
|
+
"swarm-status-running": "oklch(0.52 0.15 265)",
|
|
147
|
+
"swarm-status-queued": "oklch(0.55 0.02 250)",
|
|
148
|
+
"swarm-status-failed": "oklch(0.54 0.19 25)",
|
|
149
|
+
"swarm-status-question": "oklch(0.55 0.13 90)",
|
|
150
|
+
"swarm-status-done": "oklch(0.50 0.13 155)",
|
|
151
|
+
"swarm-status-stopped": "oklch(0.50 0.09 300)",
|
|
152
|
+
"swarm-status-superseded": "oklch(0.50 0.11 200)",
|
|
153
|
+
// swarm-status-paused/swarm-status-stalled НЕ переопределены: они —
|
|
154
|
+
// var(--warning)/var(--destructive) в dark, которые уже per-theme.
|
|
155
|
+
card: "oklch(1.00 0 0)",
|
|
156
|
+
"card-foreground": "oklch(0.20 0.012 250)",
|
|
157
|
+
popover: "oklch(1.00 0 0)",
|
|
158
|
+
"popover-foreground": "oklch(0.20 0.012 250)",
|
|
159
|
+
primary: "oklch(0.55 0.20 255)",
|
|
160
|
+
"primary-foreground": "oklch(0.99 0.005 255)",
|
|
161
|
+
secondary: "oklch(0.95 0.005 250)",
|
|
162
|
+
"secondary-foreground": "oklch(0.22 0.012 250)",
|
|
163
|
+
muted: "oklch(0.95 0.005 250)",
|
|
164
|
+
"muted-foreground": "oklch(0.50 0.010 250)",
|
|
165
|
+
accent: "oklch(0.94 0.008 250)",
|
|
166
|
+
"accent-foreground": "oklch(0.20 0.012 250)",
|
|
167
|
+
destructive: "oklch(0.55 0.22 25)",
|
|
168
|
+
"destructive-foreground": "oklch(0.99 0.01 25)",
|
|
169
|
+
success: "oklch(0.55 0.18 150)",
|
|
170
|
+
"success-foreground": "oklch(0.99 0.01 150)",
|
|
171
|
+
warning: "oklch(0.65 0.18 75)",
|
|
172
|
+
"warning-foreground": "oklch(0.20 0.04 75)",
|
|
173
|
+
// TAS-177: акцент воркспейса (light).
|
|
174
|
+
workspace: "oklch(0.62 0.21 300)",
|
|
175
|
+
"workspace-foreground": "oklch(0.99 0.01 300)",
|
|
176
|
+
border: "oklch(0.91 0.004 250)",
|
|
177
|
+
"card-border": "oklch(0.85 0.008 250)",
|
|
178
|
+
input: "oklch(0.96 0.004 250)",
|
|
179
|
+
ring: "oklch(0.55 0.20 255 / 0.3)",
|
|
180
|
+
// TAS-331: «я» в светлой теме — темнее и насыщеннее для контраста на белом.
|
|
181
|
+
"mention-me": "oklch(0.48 0.16 150)",
|
|
182
|
+
sidebar: "oklch(0.95 0.005 250)",
|
|
183
|
+
"sidebar-foreground": "oklch(0.20 0.012 250)",
|
|
184
|
+
"sidebar-primary": "oklch(0.55 0.20 255)",
|
|
185
|
+
"sidebar-primary-foreground": "oklch(0.99 0.005 255)",
|
|
186
|
+
"sidebar-accent": "oklch(0.92 0.008 250)",
|
|
187
|
+
"sidebar-accent-foreground": "oklch(0.20 0.012 250)",
|
|
188
|
+
"sidebar-border": "oklch(0.90 0.006 250)",
|
|
189
|
+
"sidebar-ring": "oklch(0.55 0.20 255 / 0.3)",
|
|
190
|
+
rule: "oklch(0.90 0.006 250)",
|
|
191
|
+
"rule-strong": "oklch(0.82 0.010 250)",
|
|
192
|
+
"fg-soft": "oklch(0.30 0.012 250)",
|
|
193
|
+
dim: "oklch(0.55 0.010 250)",
|
|
194
|
+
"lc-cyan": "oklch(0.56 0.12 195)",
|
|
195
|
+
"lc-green": "oklch(0.55 0.14 150)",
|
|
196
|
+
"lc-amber": "oklch(0.60 0.14 75)",
|
|
197
|
+
"lc-pink": "oklch(0.56 0.18 320)",
|
|
198
|
+
"card-grad-bright": "oklch(0.99 0.003 250)",
|
|
199
|
+
"card-border-bright": "oklch(0.94 0 0)",
|
|
200
|
+
"card-border-dim": "oklch(0.89 0 0)",
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
/**
|
|
204
|
+
* Шкала радиусов. `radius`/`radius-modal`/`radius-popover` — семантические
|
|
205
|
+
* (компонент/слой), `radius-sm..xl`/`radius-full` — размерная шкала кита.
|
|
206
|
+
*/
|
|
207
|
+
export const radiusTokens = {
|
|
208
|
+
radius: "6px",
|
|
209
|
+
// Унифицированные радиусы для overlay-слоёв (dialog/dropdown/select/popover
|
|
210
|
+
// контент). Items внутри используют `radius`.
|
|
211
|
+
"radius-modal": "10px",
|
|
212
|
+
"radius-popover": "10px",
|
|
213
|
+
"radius-sm": "2px",
|
|
214
|
+
"radius-md": "3px",
|
|
215
|
+
"radius-lg": "5px",
|
|
216
|
+
"radius-xl": "7px",
|
|
217
|
+
// Полный круг/pill (кнопки, аватарные элементы, «+N» в AvatarStack).
|
|
218
|
+
// 999px вместо 50%: на не-квадратном контенте даёт pill, а не эллипс.
|
|
219
|
+
"radius-full": "999px",
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* Типографика: семейства шрифтов + шкала кеглей (TAS-300, неймспейс
|
|
223
|
+
* `type-*`, не `text-*` — Tailwind v4 резервирует `--text-*` под утилиты
|
|
224
|
+
* `text-*`). Body (`text.*`) — плоские: на мобиле не уменьшаются, UI-текст
|
|
225
|
+
* читаем под палец. Заголовки (`head.*`) — флюидные clamp (вьюпорт
|
|
226
|
+
* 360→1280px): крупный дисплей на узком экране уместно ужимать.
|
|
227
|
+
*/
|
|
228
|
+
export const typographyTokens = {
|
|
229
|
+
fontFamily: {
|
|
230
|
+
sans: "'Figtree', system-ui, sans-serif",
|
|
231
|
+
heading: "'Barlow Semi Condensed', system-ui, sans-serif",
|
|
232
|
+
mono: "'Barlow', monospace",
|
|
233
|
+
},
|
|
234
|
+
text: {
|
|
235
|
+
"2xs": "10.5px",
|
|
236
|
+
xs: "12px",
|
|
237
|
+
sm: "13.5px",
|
|
238
|
+
md: "15px",
|
|
239
|
+
lg: "17px",
|
|
240
|
+
},
|
|
241
|
+
head: {
|
|
242
|
+
xs: "clamp(13px, calc(13px + 2 * (100vw - 360px) / 920), 15px)",
|
|
243
|
+
sm: "clamp(15px, calc(15px + 3 * (100vw - 360px) / 920), 18px)",
|
|
244
|
+
md: "clamp(18px, calc(18px + 4 * (100vw - 360px) / 920), 22px)",
|
|
245
|
+
lg: "clamp(22px, calc(22px + 6 * (100vw - 360px) / 920), 28px)",
|
|
246
|
+
xl: "clamp(26px, calc(26px + 8 * (100vw - 360px) / 920), 34px)",
|
|
247
|
+
},
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=designTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designTokens.js","sourceRoot":"","sources":["../src/designTokens.ts"],"names":[],"mappings":"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"}
|
package/dist/domain.d.ts
ADDED
package/dist/domain.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Главный домен прода. Все ссылки на taskless live (UI, MCP, API,
|
|
2
|
+
// субдомены деплоев) идут через этот константный корень. Сменилось —
|
|
3
|
+
// поменял в одном месте.
|
|
4
|
+
export const ROOT_DOMAIN = "taskless.ru";
|
|
5
|
+
// База URL'а сайта (с протоколом). Удобно склеивать с path'ом без
|
|
6
|
+
// `${ROOT_DOMAIN}` ручками.
|
|
7
|
+
export const ROOT_URL = `https://${ROOT_DOMAIN}`;
|
|
8
|
+
//# sourceMappingURL=domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,qEAAqE;AACrE,yBAAyB;AACzB,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AAEzC,kEAAkE;AAClE,4BAA4B;AAC5B,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type FinishChipTone = "neutral" | "urgent" | "overdue";
|
|
2
|
+
export interface FinishChipData {
|
|
3
|
+
/** Иконка как emoji (📌 🗓). UI может заменить на lucide. */
|
|
4
|
+
icon: "pin" | "deadline";
|
|
5
|
+
/** Короткая метка для рендера ("через 3д", "сегодня", "просрочено 2д"). */
|
|
6
|
+
label: string;
|
|
7
|
+
tone: FinishChipTone;
|
|
8
|
+
/** Полный текст для tooltip'а ("🏁 Прод 12.05 — через 3 дня"). */
|
|
9
|
+
tooltip: string;
|
|
10
|
+
}
|
|
11
|
+
interface InputTask {
|
|
12
|
+
/** ISO datetime или null. */
|
|
13
|
+
pinnedUntil?: string | Date | null;
|
|
14
|
+
/** Task.deadline. */
|
|
15
|
+
deadline?: string | Date | null;
|
|
16
|
+
}
|
|
17
|
+
export declare function computeFinishChip(task: InputTask, now?: Date): FinishChipData | null;
|
|
18
|
+
export {};
|