@krizaka/sovkora-design-system 0.0.0-stage → 4.0.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/CHANGELOG.md +234 -0
- package/LICENSE +202 -0
- package/README.md +82 -2
- package/package.json +112 -3
- package/registry/badge.json +97 -0
- package/registry/button.json +140 -0
- package/registry/chat-showcase.json +113 -0
- package/registry/clip-player.json +120 -0
- package/registry/command-palette.json +116 -0
- package/registry/examples/badge/model-state.tsx +16 -0
- package/registry/examples/button/send.tsx +18 -0
- package/registry/examples/chat-showcase/french.tsx +20 -0
- package/registry/examples/chat-showcase/sovereign-answer.tsx +20 -0
- package/registry/examples/clip-player/tea-pour.tsx +27 -0
- package/registry/examples/command-palette/workspace.tsx +30 -0
- package/registry/examples/icon/engine.tsx +26 -0
- package/registry/examples/icon/in-a-button.tsx +12 -0
- package/registry/examples/run-facts/clip-run.tsx +15 -0
- package/registry/examples/sentinel-mini/sidebar.tsx +11 -0
- package/registry/examples/skeleton/answer-loading.tsx +11 -0
- package/registry/examples/video-result/assistant.tsx +36 -0
- package/registry/examples/video-result/tea-pour.tsx +40 -0
- package/registry/foundations.json +2067 -0
- package/registry/icon.json +109 -0
- package/registry/index.json +242 -0
- package/registry/run-facts.json +75 -0
- package/registry/sentinel-mini.json +81 -0
- package/registry/skeleton.json +116 -0
- package/registry/video-result.json +167 -0
- package/src/components/Badge.tsx +36 -0
- package/src/components/Button.tsx +26 -0
- package/src/components/ChatShowcase.tsx +248 -0
- package/src/components/ClipPlayer.tsx +223 -0
- package/src/components/CommandPalette.tsx +104 -0
- package/src/components/CommandPalette.types.ts +33 -0
- package/src/components/Input.tsx +14 -0
- package/src/components/RunFacts.tsx +36 -0
- package/src/components/SentinelMini.tsx +61 -0
- package/src/components/Skeleton.tsx +50 -0
- package/src/components/VideoResult.tsx +123 -0
- package/src/components/badge.meta.ts +34 -0
- package/src/components/button.meta.ts +35 -0
- package/src/components/chat-showcase.css.ts +19 -0
- package/src/components/chat-showcase.meta.ts +50 -0
- package/src/components/clip-player.meta.ts +48 -0
- package/src/components/command-palette.meta.ts +47 -0
- package/src/components/icon.meta.ts +45 -0
- package/src/components/run-facts.meta.ts +32 -0
- package/src/components/sentinel-mini.meta.ts +39 -0
- package/src/components/skeleton.meta.ts +42 -0
- package/src/components/video-result.meta.ts +53 -0
- package/src/icon.registry.tsx +737 -0
- package/src/icon.tsx +74 -0
- package/src/index.ts +43 -0
- package/src/meta.ts +76 -0
- package/src/theme.css +859 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "icon",
|
|
3
|
+
"type": "composite",
|
|
4
|
+
"title": "Icon",
|
|
5
|
+
"summary": "The Sovkora icon registry: one `Icon` component and a typed `name` for every product concept — studios, models, the pipeline, RAG, MCP.",
|
|
6
|
+
"description": "The Sovkora icon registry: one `Icon` component and a typed `name` for every product concept — studios, models, the pipeline, RAG, MCP.",
|
|
7
|
+
"why": "Sovkora's screens name AI concepts (a router, a refiner, a memory, a cost shield) that no generic set draws. The contract centralises them in one registry, so an app never imports an icon library directly and every concept has one picture across the client, the console and the website.",
|
|
8
|
+
"status": "stable",
|
|
9
|
+
"deprecated": null,
|
|
10
|
+
"category": "foundations",
|
|
11
|
+
"platforms": "web",
|
|
12
|
+
"builtOn": [],
|
|
13
|
+
"whenToUse": [
|
|
14
|
+
"Every icon of an Sovkora screen: navigation, buttons, lists, the palette.",
|
|
15
|
+
"A concept of the engine (model, pipeline, router) shown next to its name."
|
|
16
|
+
],
|
|
17
|
+
"whenNotToUse": [
|
|
18
|
+
{
|
|
19
|
+
"when": "For a Krizaka platform concept on the website (the signature set): use @krizaka/icons."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"when": "As the product's logo: use `SovkoraLogo` from @krizaka/ui."
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"bestPractices": [
|
|
26
|
+
"Never import lucide or another set in an app: add the icon to the registry.",
|
|
27
|
+
"An icon-only button carries an `aria-label` (`IconButton` from @krizaka/ui requires one).",
|
|
28
|
+
"Colour through the text role (`text-fg-secondary`, `text-accent`): the strokes are `currentColor`."
|
|
29
|
+
],
|
|
30
|
+
"accessibility": {
|
|
31
|
+
"keyboard": [],
|
|
32
|
+
"notes": [
|
|
33
|
+
"Decorative by default (`aria-hidden`): the text or the button around it names it."
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
"related": [
|
|
37
|
+
"command-palette",
|
|
38
|
+
"sentinel-mini",
|
|
39
|
+
"ui/button"
|
|
40
|
+
],
|
|
41
|
+
"web": {
|
|
42
|
+
"entry": "@krizaka/sovkora-design-system",
|
|
43
|
+
"import": "import { Icon } from \"@krizaka/sovkora-design-system\";",
|
|
44
|
+
"props": [
|
|
45
|
+
{
|
|
46
|
+
"component": "Icon",
|
|
47
|
+
"description": "Polymorphic SVG icon wrapper with uniform fallback configuration.\n\n- Default fine strokeWidth: 1.25\n- Round caps and joins\n- Size control via `size` prop\n- vector-effect=\"non-scaling-stroke\" on all paths",
|
|
48
|
+
"props": [
|
|
49
|
+
{
|
|
50
|
+
"name": "name",
|
|
51
|
+
"type": "\"audio\" | \"code\" | \"menu\" | \"search\" | \"video\" | \"circle\" | \"image\" | \"text\" | \"warning\" | \"key\" | \"send\" | \"timer\" | \"copy\" | \"error\" | \"pipeline\" | \"user\" | \"dashboard\" | \"chat\" | ... 64 more ... | \"studio\"",
|
|
52
|
+
"default": null,
|
|
53
|
+
"description": "Icon identifier from the registry",
|
|
54
|
+
"required": true
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "className",
|
|
58
|
+
"type": "string",
|
|
59
|
+
"default": "",
|
|
60
|
+
"description": "Additional CSS classes",
|
|
61
|
+
"required": false
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "fallback",
|
|
65
|
+
"type": "\"audio\" | \"code\" | \"menu\" | \"search\" | \"video\" | \"circle\" | \"image\" | \"text\" | \"warning\" | \"key\" | \"send\" | \"timer\" | \"copy\" | \"error\" | \"pipeline\" | \"user\" | \"dashboard\" | \"chat\" | ... 65 more ...",
|
|
66
|
+
"default": null,
|
|
67
|
+
"description": "Drawn when `name` is not in the registry (a key that comes from data, e.g. a Studio's `iconKey`).",
|
|
68
|
+
"required": false
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "label",
|
|
72
|
+
"type": "string",
|
|
73
|
+
"default": null,
|
|
74
|
+
"description": "Accessible label — if omitted, icon is decorative (aria-hidden)",
|
|
75
|
+
"required": false
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"name": "size",
|
|
79
|
+
"type": "number",
|
|
80
|
+
"default": "20",
|
|
81
|
+
"description": "Pixel size (width & height). Defaults to 20.",
|
|
82
|
+
"required": false
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"examples": [
|
|
88
|
+
{
|
|
89
|
+
"name": "engine",
|
|
90
|
+
"title": "The engine's concepts",
|
|
91
|
+
"description": "Router, pipeline, model, RAG, memory, MCP — the vocabulary of Sovkora.",
|
|
92
|
+
"path": "examples/icon/engine.tsx",
|
|
93
|
+
"module": "@krizaka/sovkora-design-system/registry/examples/icon/engine",
|
|
94
|
+
"code": "import { Icon, type IconName } from \"@krizaka/sovkora-design-system\";\n\nconst CONCEPTS: { name: IconName; label: string }[] = [\n { name: \"router\", label: \"Router\" },\n { name: \"pipeline\", label: \"Pipeline\" },\n { name: \"model\", label: \"Model\" },\n { name: \"rag\", label: \"RAG\" },\n { name: \"memory\", label: \"Memory\" },\n { name: \"mcp\", label: \"MCP\" },\n { name: \"costShield\", label: \"Cost shield\" },\n { name: \"shield\", label: \"Policies\" },\n];\n\n// The vocabulary of the engine, one picture per concept.\nexport default function Engine() {\n return (\n <ul className=\"grid grid-cols-4 gap-4 text-xs text-fg-secondary\">\n {CONCEPTS.map((c) => (\n <li key={c.name} className=\"flex flex-col items-center gap-1.5\">\n <Icon name={c.name} size={22} className=\"text-fg\" />\n {c.label}\n </li>\n ))}\n </ul>\n );\n}\n"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "in-a-button",
|
|
98
|
+
"title": "In a button",
|
|
99
|
+
"description": "An icon beside a label, coloured by the button's role.",
|
|
100
|
+
"path": "examples/icon/in-a-button.tsx",
|
|
101
|
+
"module": "@krizaka/sovkora-design-system/registry/examples/icon/in-a-button",
|
|
102
|
+
"code": "import { Icon } from \"@krizaka/sovkora-design-system\";\nimport { Button } from \"@krizaka/ui/button\";\n\n// An icon beside a label: it takes the button's text role.\nexport default function InAButton() {\n return (\n <Button variant=\"secondary\">\n <Icon name=\"upload\" size={16} />\n Add documents\n </Button>\n );\n}\n"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"native": null,
|
|
107
|
+
"dependencies": [],
|
|
108
|
+
"registryDependencies": []
|
|
109
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@krizaka/sovkora-design-system",
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"product": "sovkora",
|
|
5
|
+
"extends": {
|
|
6
|
+
"name": "@krizaka/ui",
|
|
7
|
+
"range": "workspace:^"
|
|
8
|
+
},
|
|
9
|
+
"install": {
|
|
10
|
+
"command": "npm install @krizaka/sovkora-design-system && npm install -D tailwindcss",
|
|
11
|
+
"css": "@import \"tailwindcss\";\n@import \"@krizaka/sovkora-design-system/theme.css\";",
|
|
12
|
+
"note": "The package ships its TypeScript sources: add it to `transpilePackages` (with @krizaka/sovkora-shared and @krizaka/ui)."
|
|
13
|
+
},
|
|
14
|
+
"reexports": [
|
|
15
|
+
{
|
|
16
|
+
"name": "buttonVariants",
|
|
17
|
+
"from": "@krizaka/ui/button"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "cn",
|
|
21
|
+
"from": "@krizaka/ui/cn"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "Field",
|
|
25
|
+
"from": "@krizaka/ui/field"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "IconButton",
|
|
29
|
+
"from": "@krizaka/ui/button"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"name": "Input",
|
|
33
|
+
"from": "@krizaka/ui/field"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "Select",
|
|
37
|
+
"from": "@krizaka/ui/field"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "Textarea",
|
|
41
|
+
"from": "@krizaka/ui/field"
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"items": [
|
|
45
|
+
{
|
|
46
|
+
"name": "badge",
|
|
47
|
+
"type": "composite",
|
|
48
|
+
"title": "Badge",
|
|
49
|
+
"summary": "The @krizaka/ui badge with the 1.x `variant` kept as a deprecated alias of `tone`.",
|
|
50
|
+
"description": "The @krizaka/ui badge with the 1.x `variant` kept as a deprecated alias of `tone`.",
|
|
51
|
+
"status": "stable",
|
|
52
|
+
"deprecated": null,
|
|
53
|
+
"category": "data-display",
|
|
54
|
+
"platforms": "web",
|
|
55
|
+
"builtOn": [
|
|
56
|
+
"ui/badge"
|
|
57
|
+
],
|
|
58
|
+
"examples": {
|
|
59
|
+
"web": 1,
|
|
60
|
+
"native": 0
|
|
61
|
+
},
|
|
62
|
+
"dependencies": [],
|
|
63
|
+
"registryDependencies": []
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "button",
|
|
67
|
+
"type": "composite",
|
|
68
|
+
"title": "Button",
|
|
69
|
+
"summary": "The @krizaka/ui button with the Sovkora 1.x default kept: without a `variant`, it is the primary (orange) button.",
|
|
70
|
+
"description": "The @krizaka/ui button with the Sovkora 1.x default kept: without a `variant`, it is the primary (orange) button.",
|
|
71
|
+
"status": "stable",
|
|
72
|
+
"deprecated": null,
|
|
73
|
+
"category": "actions",
|
|
74
|
+
"platforms": "web",
|
|
75
|
+
"builtOn": [
|
|
76
|
+
"ui/button"
|
|
77
|
+
],
|
|
78
|
+
"examples": {
|
|
79
|
+
"web": 1,
|
|
80
|
+
"native": 0
|
|
81
|
+
},
|
|
82
|
+
"dependencies": [],
|
|
83
|
+
"registryDependencies": []
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "chat-showcase",
|
|
87
|
+
"type": "composite",
|
|
88
|
+
"title": "Chat showcase",
|
|
89
|
+
"summary": "A self-playing sovereign AI chat: a question, the answer typed out, the interceptor pipeline it went through, and the promise that nothing left the premises.",
|
|
90
|
+
"description": "A self-playing sovereign AI chat: a question, the answer typed out, the interceptor pipeline it went through, and the promise that nothing left the premises.",
|
|
91
|
+
"status": "stable",
|
|
92
|
+
"deprecated": null,
|
|
93
|
+
"category": "data-display",
|
|
94
|
+
"platforms": "web",
|
|
95
|
+
"builtOn": [],
|
|
96
|
+
"examples": {
|
|
97
|
+
"web": 2,
|
|
98
|
+
"native": 0
|
|
99
|
+
},
|
|
100
|
+
"dependencies": [],
|
|
101
|
+
"registryDependencies": []
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "clip-player",
|
|
105
|
+
"type": "composite",
|
|
106
|
+
"title": "Clip player",
|
|
107
|
+
"summary": "A short clip that is plainly a clip: a muted loop that plays in view, a badge with its length, play/pause and sound buttons, and a click that opens it larger.",
|
|
108
|
+
"description": "A short clip that is plainly a clip: a muted loop that plays in view, a badge with its length, play/pause and sound buttons, and a click that opens it larger.",
|
|
109
|
+
"status": "beta",
|
|
110
|
+
"deprecated": null,
|
|
111
|
+
"category": "data-display",
|
|
112
|
+
"platforms": "web",
|
|
113
|
+
"builtOn": [
|
|
114
|
+
"ui/button",
|
|
115
|
+
"ui/dialog"
|
|
116
|
+
],
|
|
117
|
+
"examples": {
|
|
118
|
+
"web": 1,
|
|
119
|
+
"native": 0
|
|
120
|
+
},
|
|
121
|
+
"dependencies": [],
|
|
122
|
+
"registryDependencies": []
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"name": "command-palette",
|
|
126
|
+
"type": "composite",
|
|
127
|
+
"title": "Command palette",
|
|
128
|
+
"summary": "The Sovkora ⌘K palette: jump to a studio, a chat, a setting — sections, registry icons and a footer of hints, on the platform's command dialog.",
|
|
129
|
+
"description": "The Sovkora ⌘K palette: jump to a studio, a chat, a setting — sections, registry icons and a footer of hints, on the platform's command dialog.",
|
|
130
|
+
"status": "stable",
|
|
131
|
+
"deprecated": null,
|
|
132
|
+
"category": "navigation",
|
|
133
|
+
"platforms": "web",
|
|
134
|
+
"builtOn": [
|
|
135
|
+
"ui/command",
|
|
136
|
+
"ui/kbd",
|
|
137
|
+
"ui/dialog"
|
|
138
|
+
],
|
|
139
|
+
"examples": {
|
|
140
|
+
"web": 1,
|
|
141
|
+
"native": 0
|
|
142
|
+
},
|
|
143
|
+
"dependencies": [],
|
|
144
|
+
"registryDependencies": []
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"name": "icon",
|
|
148
|
+
"type": "composite",
|
|
149
|
+
"title": "Icon",
|
|
150
|
+
"summary": "The Sovkora icon registry: one `Icon` component and a typed `name` for every product concept — studios, models, the pipeline, RAG, MCP.",
|
|
151
|
+
"description": "The Sovkora icon registry: one `Icon` component and a typed `name` for every product concept — studios, models, the pipeline, RAG, MCP.",
|
|
152
|
+
"status": "stable",
|
|
153
|
+
"deprecated": null,
|
|
154
|
+
"category": "foundations",
|
|
155
|
+
"platforms": "web",
|
|
156
|
+
"builtOn": [],
|
|
157
|
+
"examples": {
|
|
158
|
+
"web": 2,
|
|
159
|
+
"native": 0
|
|
160
|
+
},
|
|
161
|
+
"dependencies": [],
|
|
162
|
+
"registryDependencies": []
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"name": "run-facts",
|
|
166
|
+
"type": "composite",
|
|
167
|
+
"title": "Run facts",
|
|
168
|
+
"summary": "What a run recorded, as a description list: label left, value right, in mono.",
|
|
169
|
+
"description": "What a run recorded, as a description list: label left, value right, in mono.",
|
|
170
|
+
"status": "beta",
|
|
171
|
+
"deprecated": null,
|
|
172
|
+
"category": "data-display",
|
|
173
|
+
"platforms": "web",
|
|
174
|
+
"builtOn": [],
|
|
175
|
+
"examples": {
|
|
176
|
+
"web": 1,
|
|
177
|
+
"native": 0
|
|
178
|
+
},
|
|
179
|
+
"dependencies": [],
|
|
180
|
+
"registryDependencies": []
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"name": "sentinel-mini",
|
|
184
|
+
"type": "composite",
|
|
185
|
+
"title": "Sentinel mini",
|
|
186
|
+
"summary": "The Sentinel, Sovkora's guardian, at 24 px: a core, a ring and an orbit in the accent — for a sidebar, a header, a loading corner.",
|
|
187
|
+
"description": "The Sentinel, Sovkora's guardian, at 24 px: a core, a ring and an orbit in the accent — for a sidebar, a header, a loading corner.",
|
|
188
|
+
"status": "stable",
|
|
189
|
+
"deprecated": null,
|
|
190
|
+
"category": "foundations",
|
|
191
|
+
"platforms": "web",
|
|
192
|
+
"builtOn": [],
|
|
193
|
+
"examples": {
|
|
194
|
+
"web": 1,
|
|
195
|
+
"native": 0
|
|
196
|
+
},
|
|
197
|
+
"dependencies": [],
|
|
198
|
+
"registryDependencies": []
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"name": "skeleton",
|
|
202
|
+
"type": "composite",
|
|
203
|
+
"title": "Skeleton",
|
|
204
|
+
"summary": "The @krizaka/ui skeleton (default shape `rect`) with the 1.x shorthands, and `SkeletonGroup` — a paragraph of text lines.",
|
|
205
|
+
"description": "The @krizaka/ui skeleton (default shape `rect`) with the 1.x shorthands, and `SkeletonGroup` — a paragraph of text lines.",
|
|
206
|
+
"status": "stable",
|
|
207
|
+
"deprecated": null,
|
|
208
|
+
"category": "feedback",
|
|
209
|
+
"platforms": "web",
|
|
210
|
+
"builtOn": [
|
|
211
|
+
"ui/skeleton"
|
|
212
|
+
],
|
|
213
|
+
"examples": {
|
|
214
|
+
"web": 1,
|
|
215
|
+
"native": 0
|
|
216
|
+
},
|
|
217
|
+
"dependencies": [],
|
|
218
|
+
"registryDependencies": []
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"name": "video-result",
|
|
222
|
+
"type": "composite",
|
|
223
|
+
"title": "Video result",
|
|
224
|
+
"summary": "What a video run of a Studio leaves: the clip in its player (a muted loop in view, badge, controls, opens larger), the exact prompt, what the run recorded, the command that makes it again, and a download.",
|
|
225
|
+
"description": "What a video run of a Studio leaves: the clip in its player (a muted loop in view, badge, controls, opens larger), the exact prompt, what the run recorded, the command that makes it again, and a download.",
|
|
226
|
+
"status": "beta",
|
|
227
|
+
"deprecated": null,
|
|
228
|
+
"category": "data-display",
|
|
229
|
+
"platforms": "web",
|
|
230
|
+
"builtOn": [
|
|
231
|
+
"ui/code-block",
|
|
232
|
+
"ui/button"
|
|
233
|
+
],
|
|
234
|
+
"examples": {
|
|
235
|
+
"web": 2,
|
|
236
|
+
"native": 0
|
|
237
|
+
},
|
|
238
|
+
"dependencies": [],
|
|
239
|
+
"registryDependencies": []
|
|
240
|
+
}
|
|
241
|
+
]
|
|
242
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "run-facts",
|
|
3
|
+
"type": "composite",
|
|
4
|
+
"title": "Run facts",
|
|
5
|
+
"summary": "What a run recorded, as a description list: label left, value right, in mono.",
|
|
6
|
+
"description": "What a run recorded, as a description list: label left, value right, in mono.",
|
|
7
|
+
"why": "Sovkora shows what proves a result — model, seed, frame, length, time, cost, run id — the same way everywhere. A long id breaks instead of overflowing, so the same list reads on a phone and in a wide card.",
|
|
8
|
+
"status": "beta",
|
|
9
|
+
"deprecated": null,
|
|
10
|
+
"category": "data-display",
|
|
11
|
+
"platforms": "web",
|
|
12
|
+
"builtOn": [],
|
|
13
|
+
"whenToUse": [
|
|
14
|
+
"Under a generated result (a clip, an image) to say how it was made.",
|
|
15
|
+
"In a run's detail, beside its steps."
|
|
16
|
+
],
|
|
17
|
+
"whenNotToUse": [
|
|
18
|
+
{
|
|
19
|
+
"when": "Many rows to compare side by side."
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"bestPractices": [
|
|
23
|
+
"Say the real source (`Made by`, `Run by`), never a flattering one.",
|
|
24
|
+
"Values are as the run recorded them: never rounded to look better."
|
|
25
|
+
],
|
|
26
|
+
"accessibility": {
|
|
27
|
+
"keyboard": [],
|
|
28
|
+
"notes": [
|
|
29
|
+
"A `dl`: a screen reader reads each label with its value."
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"related": [
|
|
33
|
+
"video-result",
|
|
34
|
+
"clip-player"
|
|
35
|
+
],
|
|
36
|
+
"web": {
|
|
37
|
+
"entry": "@krizaka/sovkora-design-system",
|
|
38
|
+
"import": "import { RunFacts } from \"@krizaka/sovkora-design-system\";",
|
|
39
|
+
"props": [
|
|
40
|
+
{
|
|
41
|
+
"component": "RunFacts",
|
|
42
|
+
"description": "What a run recorded, as a description list in mono: label left, value right (a long id breaks instead of overflowing).",
|
|
43
|
+
"props": [
|
|
44
|
+
{
|
|
45
|
+
"name": "facts",
|
|
46
|
+
"type": "readonly RunFact[]",
|
|
47
|
+
"default": null,
|
|
48
|
+
"description": "The facts, in reading order.",
|
|
49
|
+
"required": true
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "className",
|
|
53
|
+
"type": "string",
|
|
54
|
+
"default": null,
|
|
55
|
+
"description": "Extra classes on the list, merged last.",
|
|
56
|
+
"required": false
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"examples": [
|
|
62
|
+
{
|
|
63
|
+
"name": "clip-run",
|
|
64
|
+
"title": "The run of a clip",
|
|
65
|
+
"description": "Model, seed, frame, length and the run id of Eric's tea-pour shot.",
|
|
66
|
+
"path": "examples/run-facts/clip-run.tsx",
|
|
67
|
+
"module": "@krizaka/sovkora-design-system/registry/examples/run-facts/clip-run",
|
|
68
|
+
"code": "import { RunFacts } from \"@krizaka/sovkora-design-system\";\n\n// What the run of Eric's tea-pour shot recorded.\nexport default function ClipRun() {\n return (\n <RunFacts\n facts={[\n { label: \"Model\", value: \"Wan 2.2 A14B\" },\n { label: \"Sovkora run\", value: \"25948442-7c68-4e66-94d6-39cd8b96438d\" },\n { label: \"Seed\", value: \"20261011\" },\n { label: \"Frame\", value: \"832×480 · 16 fps · 5 s\" },\n ]}\n />\n );\n}\n"
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
"native": null,
|
|
73
|
+
"dependencies": [],
|
|
74
|
+
"registryDependencies": []
|
|
75
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sentinel-mini",
|
|
3
|
+
"type": "composite",
|
|
4
|
+
"title": "Sentinel mini",
|
|
5
|
+
"summary": "The Sentinel, Sovkora's guardian, at 24 px: a core, a ring and an orbit in the accent — for a sidebar, a header, a loading corner.",
|
|
6
|
+
"description": "The Sentinel, Sovkora's guardian, at 24 px: a core, a ring and an orbit in the accent — for a sidebar, a header, a loading corner.",
|
|
7
|
+
"why": "The Sovkora mark (`SovkoraLogo`, @krizaka/ui) signs the product; the Sentinel stands for what watches over the requests — the interceptors. It is drawn once here, in the accent role, so it follows the brand and every named theme.",
|
|
8
|
+
"status": "stable",
|
|
9
|
+
"deprecated": null,
|
|
10
|
+
"category": "foundations",
|
|
11
|
+
"platforms": "web",
|
|
12
|
+
"builtOn": [],
|
|
13
|
+
"whenToUse": [
|
|
14
|
+
"Next to a section that the governance watches (the console's pipeline, the audit trail).",
|
|
15
|
+
"As a small brand accent in a dense sidebar where the mark would be too much."
|
|
16
|
+
],
|
|
17
|
+
"whenNotToUse": [
|
|
18
|
+
{
|
|
19
|
+
"when": "As the product's logo: use `SovkoraLogo` from @krizaka/ui."
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"when": "As a loading indicator.",
|
|
23
|
+
"use": "ui/spinner"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"bestPractices": [
|
|
27
|
+
"Decorative: put it next to a text that says what it means.",
|
|
28
|
+
"Keep it small (16–32 px): its strokes are drawn for that size."
|
|
29
|
+
],
|
|
30
|
+
"accessibility": {
|
|
31
|
+
"keyboard": [],
|
|
32
|
+
"notes": [
|
|
33
|
+
"`aria-hidden`: decorative.",
|
|
34
|
+
"Strokes and fills read `--kz-accent`: it follows the theme."
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"related": [
|
|
38
|
+
"chat-showcase",
|
|
39
|
+
"icon",
|
|
40
|
+
"ui/mascots"
|
|
41
|
+
],
|
|
42
|
+
"web": {
|
|
43
|
+
"entry": "@krizaka/sovkora-design-system",
|
|
44
|
+
"import": "import { SentinelMini } from \"@krizaka/sovkora-design-system\";",
|
|
45
|
+
"props": [
|
|
46
|
+
{
|
|
47
|
+
"component": "SentinelMini",
|
|
48
|
+
"description": "Compact 24×24 Sentinel mascot with simplified core + single orbital ring.",
|
|
49
|
+
"props": [
|
|
50
|
+
{
|
|
51
|
+
"name": "className",
|
|
52
|
+
"type": "string",
|
|
53
|
+
"default": "",
|
|
54
|
+
"description": "Additional CSS classes.",
|
|
55
|
+
"required": false
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "size",
|
|
59
|
+
"type": "number",
|
|
60
|
+
"default": "24",
|
|
61
|
+
"description": "SVG size in pixels. Defaults to 24.",
|
|
62
|
+
"required": false
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"examples": [
|
|
68
|
+
{
|
|
69
|
+
"name": "sidebar",
|
|
70
|
+
"title": "In a sidebar heading",
|
|
71
|
+
"description": "Beside the name of the section the governance watches.",
|
|
72
|
+
"path": "examples/sentinel-mini/sidebar.tsx",
|
|
73
|
+
"module": "@krizaka/sovkora-design-system/registry/examples/sentinel-mini/sidebar",
|
|
74
|
+
"code": "import { SentinelMini } from \"@krizaka/sovkora-design-system\";\n\n// Beside the name of the section the governance watches.\nexport default function Sidebar() {\n return (\n <div className=\"flex items-center gap-2 text-sm font-semibold text-fg\">\n <SentinelMini size={24} />\n Governance · 12 policies active\n </div>\n );\n}\n"
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"native": null,
|
|
79
|
+
"dependencies": [],
|
|
80
|
+
"registryDependencies": []
|
|
81
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skeleton",
|
|
3
|
+
"type": "composite",
|
|
4
|
+
"title": "Skeleton",
|
|
5
|
+
"summary": "The @krizaka/ui skeleton (default shape `rect`) with the 1.x shorthands, and `SkeletonGroup` — a paragraph of text lines.",
|
|
6
|
+
"description": "The @krizaka/ui skeleton (default shape `rect`) with the 1.x shorthands, and `SkeletonGroup` — a paragraph of text lines.",
|
|
7
|
+
"why": "Sovkora 1.x sized skeletons with `width` / `height` and chose the shape with `variant`; this adapter keeps them (deprecated) on the primitive, and adds `SkeletonGroup`, the paragraph its chat and document views wait on.",
|
|
8
|
+
"status": "stable",
|
|
9
|
+
"deprecated": null,
|
|
10
|
+
"category": "feedback",
|
|
11
|
+
"platforms": "web",
|
|
12
|
+
"builtOn": [
|
|
13
|
+
"ui/skeleton"
|
|
14
|
+
],
|
|
15
|
+
"whenToUse": [
|
|
16
|
+
"While an answer, a document or a list loads: the shape of what is coming.",
|
|
17
|
+
"`SkeletonGroup` for a paragraph (an answer being prepared)."
|
|
18
|
+
],
|
|
19
|
+
"whenNotToUse": [
|
|
20
|
+
{
|
|
21
|
+
"when": "In new code for a single block: import `Skeleton` from `@krizaka/ui/skeleton` and size it with `className`.",
|
|
22
|
+
"use": "ui/skeleton"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"when": "For an action in progress (a button, a send).",
|
|
26
|
+
"use": "ui/spinner"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"bestPractices": [
|
|
30
|
+
"Size with `className` (`h-4 w-32`), not `width` / `height` (deprecated).",
|
|
31
|
+
"Match the layout that replaces it, so nothing jumps."
|
|
32
|
+
],
|
|
33
|
+
"accessibility": {
|
|
34
|
+
"keyboard": [],
|
|
35
|
+
"notes": [
|
|
36
|
+
"Hidden from assistive technology: announce the loading state elsewhere (`aria-busy` on the region)."
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"related": [
|
|
40
|
+
"ui/skeleton",
|
|
41
|
+
"ui/spinner"
|
|
42
|
+
],
|
|
43
|
+
"web": {
|
|
44
|
+
"entry": "@krizaka/sovkora-design-system",
|
|
45
|
+
"import": "import { Skeleton, SkeletonGroup } from \"@krizaka/sovkora-design-system\";",
|
|
46
|
+
"props": [
|
|
47
|
+
{
|
|
48
|
+
"component": "Skeleton",
|
|
49
|
+
"description": "The",
|
|
50
|
+
"props": [
|
|
51
|
+
{
|
|
52
|
+
"name": "height",
|
|
53
|
+
"type": "string",
|
|
54
|
+
"default": null,
|
|
55
|
+
"description": "@deprecated Since 2.0 — size it with a `className` (`h-4`) or `style`.",
|
|
56
|
+
"required": false
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "shape",
|
|
60
|
+
"type": "\"circle\" | \"rect\" | \"text\"",
|
|
61
|
+
"default": "text",
|
|
62
|
+
"description": "text (a line) · circle (an avatar; give it a height) · rect (a media; give it a height).",
|
|
63
|
+
"required": false
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "variant",
|
|
67
|
+
"type": "NonNullable<\"circle\" | \"rect\" | \"text\">",
|
|
68
|
+
"default": null,
|
|
69
|
+
"description": "@deprecated Since 2.0 — use `shape` (same names).",
|
|
70
|
+
"required": false
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "width",
|
|
74
|
+
"type": "string",
|
|
75
|
+
"default": null,
|
|
76
|
+
"description": "@deprecated Since 2.0 — size it with a `className` (`w-32`) or `style`.",
|
|
77
|
+
"required": false
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"component": "SkeletonGroup",
|
|
83
|
+
"description": "A paragraph of text skeletons; the last line is shorter.",
|
|
84
|
+
"props": [
|
|
85
|
+
{
|
|
86
|
+
"name": "className",
|
|
87
|
+
"type": "string",
|
|
88
|
+
"default": null,
|
|
89
|
+
"description": "Extra classes on the group (its width), merged last.",
|
|
90
|
+
"required": false
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "lines",
|
|
94
|
+
"type": "number",
|
|
95
|
+
"default": "3",
|
|
96
|
+
"description": "The number of text lines; the last one is shorter. Default 3.",
|
|
97
|
+
"required": false
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"examples": [
|
|
103
|
+
{
|
|
104
|
+
"name": "answer-loading",
|
|
105
|
+
"title": "An answer loading",
|
|
106
|
+
"description": "The avatar and three lines while the engine prepares the answer.",
|
|
107
|
+
"path": "examples/skeleton/answer-loading.tsx",
|
|
108
|
+
"module": "@krizaka/sovkora-design-system/registry/examples/skeleton/answer-loading",
|
|
109
|
+
"code": "import { Skeleton, SkeletonGroup } from \"@krizaka/sovkora-design-system\";\n\n// The shape of an answer while the engine prepares it.\nexport default function AnswerLoading() {\n return (\n <div aria-busy=\"true\" aria-label=\"Preparing the answer\" className=\"flex w-80 gap-3\">\n <Skeleton shape=\"circle\" className=\"h-8 w-8 shrink-0\" />\n <SkeletonGroup lines={3} className=\"flex-1\" />\n </div>\n );\n}\n"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
"native": null,
|
|
114
|
+
"dependencies": [],
|
|
115
|
+
"registryDependencies": []
|
|
116
|
+
}
|