@tutti-os/ui-system 0.0.7 → 0.0.9
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/AGENTS.md +3 -3
- package/README.md +11 -11
- package/agent/install-skill.mjs +8 -8
- package/agent/{nextop-ui-system → tutti-ui-system}/SKILL.md +4 -4
- package/agent/{nextop-ui-system → tutti-ui-system}/scripts/create-business-preview.mjs +8 -8
- package/dist/{chunk-GX3U3V36.js → chunk-K57FUMQG.js} +11 -11
- package/dist/chunk-K57FUMQG.js.map +1 -0
- package/dist/{chunk-XHA7R2WC.js → chunk-RKQ4FPGY.js} +4 -4
- package/dist/chunk-RKQ4FPGY.js.map +1 -0
- package/dist/{chunk-QXXI5OBT.js → chunk-YIAY5DKS.js} +2 -2
- package/dist/chunk-YIAY5DKS.js.map +1 -0
- package/dist/components/index.js +1 -1
- package/dist/date-format.d.ts +5 -5
- package/dist/date-format.js +7 -7
- package/dist/dev-vite.d.ts +3 -3
- package/dist/dev-vite.js +6 -6
- package/dist/dev-vite.js.map +1 -1
- package/dist/icons/index.d.ts +2 -2
- package/dist/icons/index.js +3 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +11 -11
- package/dist/metadata/components.json +5 -5
- package/dist/metadata/components.schema.json +2 -2
- package/dist/metadata/index.js +5 -5
- package/dist/metadata/index.js.map +1 -1
- package/dist/styles/base.css +5 -5
- package/package.json +3 -3
- package/ui-system.md +18 -18
- package/dist/chunk-GX3U3V36.js.map +0 -1
- package/dist/chunk-QXXI5OBT.js.map +0 -1
- package/dist/chunk-XHA7R2WC.js.map +0 -1
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/extract-base-component.md +0 -0
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/maintain-inventory.md +0 -0
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/promote-business-component.md +0 -0
- /package/agent/{nextop-ui-system → tutti-ui-system}/references/use-existing-component.md +0 -0
package/dist/styles/base.css
CHANGED
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
min-height: 100vh;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
@keyframes
|
|
75
|
+
@keyframes tutti-dropdown-open {
|
|
76
76
|
from {
|
|
77
77
|
transform: scale(var(--dropdown-pre-scale));
|
|
78
78
|
opacity: 0;
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
@keyframes
|
|
87
|
+
@keyframes tutti-dropdown-close {
|
|
88
88
|
from {
|
|
89
89
|
transform: scale(1);
|
|
90
90
|
opacity: 1;
|
|
@@ -107,15 +107,15 @@
|
|
|
107
107
|
transform: scale(1);
|
|
108
108
|
opacity: 1;
|
|
109
109
|
pointer-events: auto;
|
|
110
|
-
animation:
|
|
111
|
-
|
|
110
|
+
animation: tutti-dropdown-open var(--dropdown-open-dur) var(--dropdown-ease)
|
|
111
|
+
both;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
.t-dropdown[data-state="closed"] {
|
|
115
115
|
transform: scale(var(--dropdown-closing-scale));
|
|
116
116
|
opacity: 0;
|
|
117
117
|
pointer-events: none;
|
|
118
|
-
animation:
|
|
118
|
+
animation: tutti-dropdown-close var(--dropdown-close-dur)
|
|
119
119
|
var(--dropdown-ease) both;
|
|
120
120
|
}
|
|
121
121
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/ui-system",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"./dist/styles.css"
|
|
11
11
|
],
|
|
12
12
|
"bin": {
|
|
13
|
-
"
|
|
13
|
+
"tutti-ui-system-install-skill": "./agent/install-skill.mjs"
|
|
14
14
|
},
|
|
15
15
|
"imports": {
|
|
16
16
|
"#components/*": "./src/components/*/index.tsx",
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
"react": "^19.1.0",
|
|
86
86
|
"react-dom": "^19.1.0"
|
|
87
87
|
},
|
|
88
|
-
"
|
|
88
|
+
"tutti": {
|
|
89
89
|
"tailwindSourceRoot": "src"
|
|
90
90
|
},
|
|
91
91
|
"publishConfig": {
|
package/ui-system.md
CHANGED
|
@@ -16,7 +16,7 @@ It is organized into two public component layers:
|
|
|
16
16
|
Basic visual primitives and foundations such as tokens, icons, Button,
|
|
17
17
|
Input, Dialog, Select, Card, Badge, and Toast.
|
|
18
18
|
- `business`
|
|
19
|
-
Multi-end reusable
|
|
19
|
+
Multi-end reusable Tutti business display components. These components may
|
|
20
20
|
expose domain display props such as workspace, file, task, or agent state, and
|
|
21
21
|
should compose `base` primitives instead of recreating them.
|
|
22
22
|
|
|
@@ -127,7 +127,7 @@ The UI system follows a shadcn-like self-owned source model:
|
|
|
127
127
|
behavior where a proven primitive exists
|
|
128
128
|
- CVA-style variant definitions keep component variants explicit and typed
|
|
129
129
|
- Tailwind classes consume shared semantic tokens instead of local palettes
|
|
130
|
-
-
|
|
130
|
+
- Tutti owns the checked-in source, public exports, metadata, storyboard
|
|
131
131
|
examples, and boundary validation
|
|
132
132
|
|
|
133
133
|
Before extracting a component, decide whether the target is `base`, `business`,
|
|
@@ -145,7 +145,7 @@ Promote to `base` when the component is a foundation primitive:
|
|
|
145
145
|
|
|
146
146
|
Promote to `business` when the component is a reusable business display unit:
|
|
147
147
|
|
|
148
|
-
- it represents a cross-surface
|
|
148
|
+
- it represents a cross-surface Tutti concept such as workspace, file, task,
|
|
149
149
|
agent, run, project, or account display state
|
|
150
150
|
- it receives all business data, labels, statuses, permissions, and callbacks
|
|
151
151
|
from the host through props
|
|
@@ -201,7 +201,7 @@ For every promoted component, define this contract before editing code:
|
|
|
201
201
|
- storyboard states and examples
|
|
202
202
|
- validation commands
|
|
203
203
|
|
|
204
|
-
The bundled `packages/ui/system/agent/
|
|
204
|
+
The bundled `packages/ui/system/agent/tutti-ui-system/SKILL.md` skill is the
|
|
205
205
|
standard prompt-level workflow for this judgment-heavy promotion step. Boundary
|
|
206
206
|
scripts are still required, but they only catch mechanical violations.
|
|
207
207
|
|
|
@@ -246,7 +246,7 @@ host-owned caller logic.
|
|
|
246
246
|
- CSS variables are the source of truth for theme values
|
|
247
247
|
- Tailwind utilities should consume the same token layer rather than defining a parallel color system
|
|
248
248
|
- prefer semantic token names such as `background`, `foreground`, `primary`, `muted`, and `destructive` over raw palette leakage in public APIs
|
|
249
|
-
- keep
|
|
249
|
+
- keep tutti-specific token extensions additive and minimal
|
|
250
250
|
- Build primitives for a calm workbench shell, not for marketing-card
|
|
251
251
|
theatrics.
|
|
252
252
|
|
|
@@ -359,7 +359,7 @@ should declare that requirement in their `package.json`:
|
|
|
359
359
|
|
|
360
360
|
```json
|
|
361
361
|
{
|
|
362
|
-
"
|
|
362
|
+
"tutti": {
|
|
363
363
|
"tailwindSourceRoot": "src"
|
|
364
364
|
}
|
|
365
365
|
}
|
|
@@ -367,13 +367,13 @@ should declare that requirement in their `package.json`:
|
|
|
367
367
|
|
|
368
368
|
`pnpm check:ui-boundaries` validates that the desktop renderer entrypoint
|
|
369
369
|
`apps/desktop/src/renderer/src/style.css` includes matching `@source` directives
|
|
370
|
-
for any imported workspace package that declares `
|
|
370
|
+
for any imported workspace package that declares `tutti.tailwindSourceRoot`.
|
|
371
371
|
It also validates that the path matches the declared source root and reports the
|
|
372
372
|
exact `@source` line to add or replace.
|
|
373
373
|
|
|
374
374
|
Tailwind source troubleshooting checklist:
|
|
375
375
|
|
|
376
|
-
- if a reusable package introduces new utility classes but the desktop UI does not change at runtime, confirm the package declares `
|
|
376
|
+
- if a reusable package introduces new utility classes but the desktop UI does not change at runtime, confirm the package declares `tutti.tailwindSourceRoot` when it renders runtime Tailwind classes
|
|
377
377
|
- confirm the desktop renderer Tailwind entrypoint includes the package source path through `@source`
|
|
378
378
|
- re-run `pnpm check:ui-boundaries` before assuming the issue is a hot-reload or build-cache problem
|
|
379
379
|
|
|
@@ -509,7 +509,7 @@ localStorage.setItem("workspace", id);
|
|
|
509
509
|
## Promotion Review Gate
|
|
510
510
|
|
|
511
511
|
Use this gate for every base or business component promotion. It adapts
|
|
512
|
-
frontend design review practice to
|
|
512
|
+
frontend design review practice to Tutti's product standard; do not import
|
|
513
513
|
general marketing, portfolio, or decorative frontend heuristics into the shared
|
|
514
514
|
workbench system.
|
|
515
515
|
|
|
@@ -564,9 +564,9 @@ Report the promotion review in this structure:
|
|
|
564
564
|
|
|
565
565
|
## Agent Skill Rules
|
|
566
566
|
|
|
567
|
-
Use the bundled `
|
|
567
|
+
Use the bundled `tutti-ui-system` skill for prompt-level work involving
|
|
568
568
|
`@tutti-os/ui-system`. The source lives under
|
|
569
|
-
`packages/ui/system/agent/
|
|
569
|
+
`packages/ui/system/agent/tutti-ui-system/SKILL.md` so it can ship with the UI
|
|
570
570
|
system package.
|
|
571
571
|
|
|
572
572
|
The skill should route internally across these scenarios:
|
|
@@ -586,18 +586,18 @@ a short agent instruction such as:
|
|
|
586
586
|
|
|
587
587
|
```md
|
|
588
588
|
When promoting business UI into @tutti-os/ui-system, use the
|
|
589
|
-
|
|
589
|
+
tutti-ui-system skill and follow packages/ui/system/ui-system.md.
|
|
590
590
|
```
|
|
591
591
|
|
|
592
592
|
After installing `@tutti-os/ui-system`, external repositories can configure the
|
|
593
593
|
bundled skill with:
|
|
594
594
|
|
|
595
595
|
```bash
|
|
596
|
-
pnpm exec
|
|
596
|
+
pnpm exec tutti-ui-system-install-skill
|
|
597
597
|
```
|
|
598
598
|
|
|
599
|
-
The command copies the bundled skill into `.codex/skills/
|
|
600
|
-
the current repository. When `.
|
|
599
|
+
The command copies the bundled skill into `.codex/skills/tutti-ui-system` in
|
|
600
|
+
the current repository. When `.tutti-ui-system-dev/` is present, the installer
|
|
601
601
|
prefers the synced source checkout so the skill and bundled UI-system rules stay
|
|
602
602
|
aligned with the current local UI-system source. It refuses to overwrite local
|
|
603
603
|
changes unless run with `--force`.
|
|
@@ -626,16 +626,16 @@ external app keep normal `@tutti-os/ui-system` imports while temporarily resolvi
|
|
|
626
626
|
the stable entrypoints to a generated local cache.
|
|
627
627
|
|
|
628
628
|
- start it with `pnpm --filter @tutti-os/ui-system dev:server`
|
|
629
|
-
- external Vite apps opt in with `
|
|
629
|
+
- external Vite apps opt in with `tuttiUISystemDev` from
|
|
630
630
|
`@tutti-os/ui-system/dev-vite`
|
|
631
631
|
- when the server is unavailable, external apps must fall back to their
|
|
632
632
|
installed package in `node_modules`
|
|
633
|
-
- the generated `.
|
|
633
|
+
- the generated `.tutti-ui-system-dev/` cache belongs in the external app's
|
|
634
634
|
`.gitignore`
|
|
635
635
|
- Tailwind consumers must include both the installed package output and the
|
|
636
636
|
generated dev cache in source scanning, for example
|
|
637
637
|
`@source "../node_modules/@tutti-os/ui-system/dist";` and
|
|
638
|
-
`@source "../.
|
|
638
|
+
`@source "../.tutti-ui-system-dev";`
|
|
639
639
|
- do not make CI, production builds, or package publishing depend on the dev
|
|
640
640
|
server
|
|
641
641
|
- `@tutti-os/ui-system/dev-vite` may be imported only from bundler config or
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/date-format.ts"],"sourcesContent":["export type NextopDateLocale = \"en\" | \"zh-CN\";\n\nconst fullDateTimeFormatterByLocale = new Map<string, Intl.DateTimeFormat>();\nconst shortDateTimeFormatterByLocale = new Map<string, Intl.DateTimeFormat>();\n\nexport function getCurrentNextopDateLocale(): NextopDateLocale {\n if (typeof document !== \"undefined\") {\n const locale = normalizeNextopDateLocale(document.documentElement.lang);\n if (locale) {\n return locale;\n }\n }\n\n return \"en\";\n}\n\nexport function formatNextopDateTime(\n value: Date | number,\n locale = getCurrentNextopDateLocale()\n): string {\n return getFullDateTimeFormatter(locale).format(value);\n}\n\nexport function formatNextopShortDateTime(\n value: Date | number,\n locale = getCurrentNextopDateLocale()\n): string {\n return getShortDateTimeFormatter(locale).format(value);\n}\n\nfunction getFullDateTimeFormatter(locale: string): Intl.DateTimeFormat {\n const normalizedLocale = normalizeNextopDateLocale(locale) ?? \"en\";\n const cached = fullDateTimeFormatterByLocale.get(normalizedLocale);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(normalizedLocale, {\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n });\n fullDateTimeFormatterByLocale.set(normalizedLocale, formatter);\n return formatter;\n}\n\nfunction getShortDateTimeFormatter(locale: string): Intl.DateTimeFormat {\n const normalizedLocale = normalizeNextopDateLocale(locale) ?? \"en\";\n const cached = shortDateTimeFormatterByLocale.get(normalizedLocale);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(normalizedLocale, {\n day: \"numeric\",\n hour: \"2-digit\",\n hourCycle: \"h23\",\n minute: \"2-digit\",\n month: normalizedLocale === \"en\" ? \"short\" : \"long\"\n });\n shortDateTimeFormatterByLocale.set(normalizedLocale, formatter);\n return formatter;\n}\n\nfunction normalizeNextopDateLocale(\n locale: string | null | undefined\n): NextopDateLocale | null {\n const normalized = locale?.trim().toLowerCase() ?? \"\";\n if (!normalized) {\n return null;\n }\n if (normalized === \"zh\" || normalized.startsWith(\"zh-\")) {\n return \"zh-CN\";\n }\n if (normalized === \"en\" || normalized.startsWith(\"en-\")) {\n return \"en\";\n }\n return null;\n}\n"],"mappings":";AAEA,IAAM,gCAAgC,oBAAI,IAAiC;AAC3E,IAAM,iCAAiC,oBAAI,IAAiC;AAErE,SAAS,6BAA+C;AAC7D,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,SAAS,0BAA0B,SAAS,gBAAgB,IAAI;AACtE,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,OACA,SAAS,2BAA2B,GAC5B;AACR,SAAO,yBAAyB,MAAM,EAAE,OAAO,KAAK;AACtD;AAEO,SAAS,0BACd,OACA,SAAS,2BAA2B,GAC5B;AACR,SAAO,0BAA0B,MAAM,EAAE,OAAO,KAAK;AACvD;AAEA,SAAS,yBAAyB,QAAqC;AACrE,QAAM,mBAAmB,0BAA0B,MAAM,KAAK;AAC9D,QAAM,SAAS,8BAA8B,IAAI,gBAAgB;AACjE,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,IAAI,KAAK,eAAe,kBAAkB;AAAA,IAC1D,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR,CAAC;AACD,gCAA8B,IAAI,kBAAkB,SAAS;AAC7D,SAAO;AACT;AAEA,SAAS,0BAA0B,QAAqC;AACtE,QAAM,mBAAmB,0BAA0B,MAAM,KAAK;AAC9D,QAAM,SAAS,+BAA+B,IAAI,gBAAgB;AAClE,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,IAAI,KAAK,eAAe,kBAAkB;AAAA,IAC1D,KAAK;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO,qBAAqB,OAAO,UAAU;AAAA,EAC/C,CAAC;AACD,iCAA+B,IAAI,kBAAkB,SAAS;AAC9D,SAAO;AACT;AAEA,SAAS,0BACP,QACyB;AACzB,QAAM,aAAa,QAAQ,KAAK,EAAE,YAAY,KAAK;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,eAAe,QAAQ,WAAW,WAAW,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,eAAe,QAAQ,WAAW,WAAW,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,SAAO;AACT;","names":[]}
|