@haposoft/cafekit 0.16.6 → 0.18.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/README.md +14 -22
- package/bin/__tests__/codex-hooks-ownership.test.js +2 -2
- package/bin/__tests__/codex-hooks.test.js +0 -36
- package/bin/__tests__/codex-native.test.js +46 -88
- package/bin/__tests__/develop-contract.test.js +26 -57
- package/bin/__tests__/docs-sync-on-demand.test.js +93 -0
- package/bin/__tests__/grok-envelope.test.js +0 -56
- package/bin/__tests__/hook-payload.test.js +4 -6
- package/bin/__tests__/legacy-authority-decoupled.test.js +159 -0
- package/bin/__tests__/legacy-hooks-retired.test.js +221 -0
- package/bin/__tests__/omp-bridge.test.js +20 -17
- package/bin/__tests__/omp-hooks.test.js +0 -19
- package/bin/__tests__/optional-skill-inventory.test.js +112 -4
- package/bin/__tests__/orca-session.test.js +0 -2
- package/bin/__tests__/package-inventory.test.js +100 -541
- package/bin/__tests__/runtime-dir.test.js +0 -3
- package/bin/__tests__/runtime-schema.test.js +3 -2
- package/bin/__tests__/skill-routing-source.test.js +27 -15
- package/bin/__tests__/spec-narrowing.test.js +0 -27
- package/bin/__tests__/specs-v2-execution-closeout.test.js +4 -69
- package/bin/__tests__/ui-ux-skill.test.js +101 -0
- package/bin/__tests__/usage-hook-retired.test.js +114 -0
- package/bin/__tests__/validator-grounding.test.js +9 -28
- package/bin/phases/codex-runtime.js +24 -0
- package/bin/phases/omp-runtime.js +22 -0
- package/package.json +1 -1
- package/src/claude/CLAUDE.md +3 -10
- package/src/claude/agents/brainstormer.md +7 -3
- package/src/claude/agents/code-auditor.md +35 -50
- package/src/claude/agents/debugger.md +5 -79
- package/src/claude/agents/deployer.md +3 -5
- package/src/claude/agents/docs-keeper.md +2 -7
- package/src/claude/agents/implementer.md +6 -9
- package/src/claude/agents/inspector.md +2 -3
- package/src/claude/agents/project-manager.md +7 -15
- package/src/claude/agents/researcher.md +9 -3
- package/src/claude/agents/spec-maker.md +11 -11
- package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -1
- package/src/claude/hooks/__tests__/spec-gate.test.js +112 -3
- package/src/claude/hooks/__tests__/spec-state-touched.test.js +134 -0
- package/src/claude/hooks/__tests__/state.test.js +68 -0
- package/src/claude/hooks/__tests__/statusline.test.js +140 -11
- package/src/claude/hooks/agent.cjs +2 -1
- package/src/claude/hooks/lib/context.cjs +0 -89
- package/src/claude/hooks/lib/hook-payload.cjs +2 -2
- package/src/claude/hooks/rules.cjs +2 -1
- package/src/claude/hooks/session.cjs +0 -1
- package/src/claude/hooks/spec-gate.cjs +18 -28
- package/src/claude/hooks/spec-state.cjs +95 -1
- package/src/claude/hooks/state.cjs +21 -2
- package/src/claude/migration-manifest.json +30 -15
- package/src/claude/rules/ai-dev-rules.md +1 -1
- package/src/claude/rules/hook-protocols.md +8 -15
- package/src/claude/rules/manage-docs.md +9 -23
- package/src/claude/rules/orchestrator.md +3 -4
- package/src/claude/rules/review-audit-self-decision.md +3 -3
- package/src/claude/rules/skill-domain-routing.md +1 -3
- package/src/claude/rules/skill-workflow-routing.md +4 -5
- package/src/claude/rules/state-sync.md +3 -12
- package/src/claude/rules/workflow.md +10 -18
- package/src/claude/runtime.schema.json +5 -3
- package/src/claude/scripts/generate-skill-catalog.cjs +7 -6
- package/src/claude/scripts/provenance.cjs +23 -5
- package/src/claude/scripts/spec-receipt.cjs +52 -6
- package/src/claude/scripts/spec-resolver.cjs +1 -2
- package/src/claude/scripts/validate-spec-output.cjs +5 -32
- package/src/claude/scripts/workflow-policy.cjs +22 -10
- package/src/claude/settings/settings.json +1 -32
- package/src/claude/skills/{question → ask}/SKILL.md +9 -75
- package/src/claude/skills/brainstorm/SKILL.md +43 -131
- package/src/claude/skills/code-review/SKILL.md +48 -17
- package/src/claude/skills/code-review/references/spec-compliance-review.md +2 -3
- package/src/claude/skills/code-review/references/verification-gate.md +22 -27
- package/src/claude/skills/debug/SKILL.md +29 -149
- package/src/claude/skills/develop/SKILL.md +27 -36
- package/src/claude/skills/develop/references/parallel-waves.md +0 -8
- package/src/claude/skills/develop/references/quality-gate.md +15 -13
- package/src/claude/skills/docs/SKILL.md +2 -2
- package/src/claude/skills/docs/references/update-workflow.md +1 -1
- package/src/claude/skills/fix/SKILL.md +153 -0
- package/src/claude/skills/{hotfix → fix}/references/diagnosis-protocol.md +2 -2
- package/src/claude/skills/{hotfix → fix}/references/parallel-patterns.md +2 -2
- package/src/claude/skills/{hotfix → fix}/references/prevention-gate.md +3 -3
- package/src/claude/skills/{hotfix → fix}/references/review-cycle.md +1 -1
- package/src/claude/skills/git/SKILL.md +48 -9
- package/src/claude/skills/git/references/commit-protocols.md +35 -16
- package/src/claude/skills/git/references/worktree-blueprint.md +42 -6
- package/src/claude/skills/orca/SKILL.md +9 -8
- package/src/claude/skills/research/SKILL.md +2 -0
- package/src/claude/skills/scout/SKILL.md +61 -0
- package/src/claude/skills/{inspect → scout}/references/internal-inspection.md +26 -10
- package/src/claude/skills/specs/SKILL.md +22 -29
- package/src/claude/skills/specs/references/review.md +8 -6
- package/src/claude/skills/specs/references/templates.md +38 -44
- package/src/claude/skills/sync/SKILL.md +8 -15
- package/src/claude/skills/sync/references/rebind-and-audit.md +59 -0
- package/src/claude/skills/sync/references/sync-protocols.md +4 -13
- package/src/claude/skills/test/SKILL.md +22 -3
- package/src/claude/skills/test/references/execution-strategy.md +83 -0
- package/src/claude/skills/test/references/failure-triage.md +1 -1
- package/src/claude/skills/ui-ux/LICENSE +21 -0
- package/src/claude/skills/ui-ux/SKILL.md +497 -0
- package/src/claude/skills/ui-ux/references/brand-tokens.md +90 -0
- package/src/claude/skills/ui-ux/references/budgets.md +113 -0
- package/src/claude/skills/ui-ux/references/checklist.md +271 -0
- package/src/claude/skills/ui-ux/references/components/accordion.md +246 -0
- package/src/claude/skills/ui-ux/references/components/avatar.md +153 -0
- package/src/claude/skills/ui-ux/references/components/banner.md +43 -0
- package/src/claude/skills/ui-ux/references/components/breadcrumb.md +201 -0
- package/src/claude/skills/ui-ux/references/components/button.md +142 -0
- package/src/claude/skills/ui-ux/references/components/card.md +113 -0
- package/src/claude/skills/ui-ux/references/components/charts.md +376 -0
- package/src/claude/skills/ui-ux/references/components/chat.md +132 -0
- package/src/claude/skills/ui-ux/references/components/choice-controls.md +369 -0
- package/src/claude/skills/ui-ux/references/components/comment-thread.md +17 -0
- package/src/claude/skills/ui-ux/references/components/description-list.md +116 -0
- package/src/claude/skills/ui-ux/references/components/empty-state.md +98 -0
- package/src/claude/skills/ui-ux/references/components/file-upload.md +107 -0
- package/src/claude/skills/ui-ux/references/components/inline-edit.md +128 -0
- package/src/claude/skills/ui-ux/references/components/input.md +161 -0
- package/src/claude/skills/ui-ux/references/components/list-row.md +56 -0
- package/src/claude/skills/ui-ux/references/components/loading.md +198 -0
- package/src/claude/skills/ui-ux/references/components/logo.md +147 -0
- package/src/claude/skills/ui-ux/references/components/otp-input.md +43 -0
- package/src/claude/skills/ui-ux/references/components/quantity-input.md +100 -0
- package/src/claude/skills/ui-ux/references/components/range-slider.md +16 -0
- package/src/claude/skills/ui-ux/references/components/small-controls.md +340 -0
- package/src/claude/skills/ui-ux/references/components/sortable-header.md +86 -0
- package/src/claude/skills/ui-ux/references/components/tag-input.md +14 -0
- package/src/claude/skills/ui-ux/references/components/timeline.md +38 -0
- package/src/claude/skills/ui-ux/references/components/tree.md +30 -0
- package/src/claude/skills/ui-ux/references/design-process.md +650 -0
- package/src/claude/skills/ui-ux/references/layouts/app-kanban.html +303 -0
- package/src/claude/skills/ui-ux/references/layouts/app.md +1369 -0
- package/src/claude/skills/ui-ux/references/layouts/form.md +430 -0
- package/src/claude/skills/ui-ux/references/layouts/overlay.md +552 -0
- package/src/claude/skills/ui-ux/references/layouts/pricing.md +204 -0
- package/src/claude/skills/ui-ux/references/locked-rules.md +35 -0
- package/src/claude/skills/ui-ux/references/principles.md +408 -0
- package/src/claude/skills/ui-ux/references/refactor.md +245 -0
- package/src/claude/skills/ui-ux/references/responsive.md +195 -0
- package/src/claude/skills/ui-ux/references/review.md +528 -0
- package/src/claude/skills/ui-ux/references/rules-color.md +623 -0
- package/src/claude/skills/ui-ux/references/rules-form.md +235 -0
- package/src/claude/skills/ui-ux/references/rules-state.md +680 -0
- package/src/claude/skills/ui-ux/references/rules-type.md +369 -0
- package/src/claude/skills/ui-ux/references/styles.md +311 -0
- package/src/claude/skills/ui-ux/references/system.md +219 -0
- package/src/claude/skills/ui-ux/references/tailwind-v4-traps.md +237 -0
- package/src/claude/skills/ui-ux/references/tokens.css +362 -0
- package/src/claude/skills/ui-ux/scripts/lint-skill.mjs +216 -0
- package/src/claude/skills/ui-ux/scripts/package.json +9 -0
- package/src/claude/skills/ui-ux/scripts/probe.mjs +4447 -0
- package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
- package/src/claude/status.cjs +149 -144
- package/src/codex/AGENTS.md +8 -13
- package/src/codex/hooks/agent.cjs +2 -1
- package/src/codex/hooks/lib/spec-receipt.cjs +5 -0
- package/src/codex/hooks/lib/spec-utils.cjs +0 -7
- package/src/codex/hooks/rules.cjs +2 -1
- package/src/codex/hooks/session.cjs +0 -2
- package/src/codex/hooks/spec-gate.cjs +8 -18
- package/src/codex/hooks.json +0 -20
- package/src/codex/rules/state-sync.md +3 -12
- package/src/common/AGENTS.md +2 -2
- package/src/omp/extensions/cafekit-bridge.mjs +6 -6
- package/src/claude/hooks/__tests__/completion-authority.test.js +0 -990
- package/src/claude/hooks/__tests__/semantic-review-authority.test.js +0 -259
- package/src/claude/hooks/completion-authority-check.cjs +0 -56
- package/src/claude/hooks/completion-authority-state.cjs +0 -527
- package/src/claude/hooks/completion-authority.cjs +0 -163
- package/src/claude/hooks/semantic-review-authority.cjs +0 -154
- package/src/claude/hooks/task-scaffold-guard.cjs +0 -114
- package/src/claude/hooks/usage.cjs +0 -197
- package/src/claude/skills/delegate/SKILL.md +0 -124
- package/src/claude/skills/delegate/references/codex-delegation.md +0 -71
- package/src/claude/skills/delegate/references/grok-delegation.md +0 -84
- package/src/claude/skills/hotfix/SKILL.md +0 -289
- package/src/claude/skills/inspect/SKILL.md +0 -142
- package/src/claude/skills/loop/SKILL.md +0 -114
- package/src/claude/skills/loop/references/bounded-loop-protocol.md +0 -104
- package/src/claude/skills/loop/references/metric-and-guard-contract.md +0 -76
- package/src/claude/skills/route/SKILL.md +0 -94
- package/src/claude/skills/route/references/agent-timing.md +0 -46
- package/src/claude/skills/route/references/chaining-patterns.md +0 -53
- package/src/claude/skills/route/references/task-taxonomy.md +0 -48
- package/src/codex/hooks/completion-authority-check.cjs +0 -67
- package/src/codex/hooks/completion-authority-state.cjs +0 -527
- package/src/codex/hooks/completion-authority.cjs +0 -109
- package/src/codex/hooks/semantic-review-authority.cjs +0 -130
- package/src/codex/hooks/task-scaffold-guard.cjs +0 -63
- /package/src/claude/skills/{question → ask}/templates/question.md +0 -0
- /package/src/claude/skills/{hotfix → fix}/references/escalation-tactics.md +0 -0
- /package/src/claude/skills/{hotfix → fix}/references/workflow-specialized.md +0 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="vi">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Bảng công việc</title>
|
|
7
|
+
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
|
+
<link
|
|
11
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap"
|
|
12
|
+
rel="stylesheet"
|
|
13
|
+
/>
|
|
14
|
+
|
|
15
|
+
<!-- Tailwind v4 bản chạy trong trình duyệt: cùng cú pháp với skill (outline-hidden, @theme inline). -->
|
|
16
|
+
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
|
17
|
+
|
|
18
|
+
<style>
|
|
19
|
+
/* ===== KHỐI ĐỔI THƯƠNG HIỆU, chép từ references/tokens.css (nền sáng).
|
|
20
|
+
Ngoài khối này không có mã màu nào khác. ===== */
|
|
21
|
+
:root {
|
|
22
|
+
/* ===== FONT, KHAI MỘT LẦN, DÙNG CHUNG =====
|
|
23
|
+
Một font cho cả app. Phân vai bằng weight:
|
|
24
|
+
heading 600, body 400, nhãn phụ 500 (T2). */
|
|
25
|
+
--app-font: "Inter", ui-sans-serif, system-ui, sans-serif;
|
|
26
|
+
/* ========================================== */
|
|
27
|
+
|
|
28
|
+
/* ===== MÀU NHẤN, NỀN SÁNG ===== */
|
|
29
|
+
--primary: #181818; /* mặc định gần đen. Màu riêng thì thay vào đây */
|
|
30
|
+
--primary-hover: #2e2e2e; /* nhạt hơn --primary một bậc */
|
|
31
|
+
--primary-foreground: #ffffff;
|
|
32
|
+
/* ============================== */
|
|
33
|
+
|
|
34
|
+
--background: #f4f4f6; /* nền trang, xám nhạt, không bao giờ trắng */
|
|
35
|
+
--surface: #ffffff; /* nền card, input, header */
|
|
36
|
+
--foreground: #2c2c2c; /* chữ chính */
|
|
37
|
+
--muted: #707070; /* chữ phụ, label, placeholder, icon phụ. 4.95:1 */
|
|
38
|
+
/* Hai token viền, chia theo vai (M14). --border: đường tóc trang trí (viền card,
|
|
39
|
+
đường chia). --border-strong: viền ô nhập, nút outline, đường kẻ khung app
|
|
40
|
+
(dưới header), viền card khi hover. */
|
|
41
|
+
--border: #f7f7f8;
|
|
42
|
+
--border-strong: #eaeaea;
|
|
43
|
+
|
|
44
|
+
--secondary: #e7e8ec; /* nút phụ, mục đang chọn; luôn chìm hơn --surface */
|
|
45
|
+
--secondary-hover: #dbdce2;
|
|
46
|
+
--background-hover: #e7e7ea; /* ô trạng thái nhỏ trong hàng có hover (M18) */
|
|
47
|
+
--surface-hover: #f8f8fa; /* hover dòng tràn hết bề ngang khung trắng (I10) */
|
|
48
|
+
--button-hover: #f1f1f3; /* hover nút viền: chỉ đổi nền, viền giữ nguyên */
|
|
49
|
+
|
|
50
|
+
--ring-focus: rgba(24, 24, 24, 0.1);
|
|
51
|
+
--border-focus: var(--primary);
|
|
52
|
+
}
|
|
53
|
+
/* ===== HẾT KHỐI ĐỔI THƯƠNG HIỆU ===== */
|
|
54
|
+
|
|
55
|
+
/* ===== THANH CUỘN TỰ ẨN (I18), chép từ tokens.css. Board dựa vào khối này:
|
|
56
|
+
đứng yên không thấy, rê vào vùng cuộn thì hiện 4px, người dùng chuột vẫn có chỗ kéo ngang. */
|
|
57
|
+
* { --scrollbar-thumb: transparent; }
|
|
58
|
+
*:hover { --scrollbar-thumb: color-mix(in srgb, var(--foreground) 16%, transparent); }
|
|
59
|
+
.is-scrolling { --scrollbar-thumb: color-mix(in srgb, var(--foreground) 28%, transparent); }
|
|
60
|
+
::-webkit-scrollbar { width: 4px; height: 4px; }
|
|
61
|
+
::-webkit-scrollbar-track { background: transparent; }
|
|
62
|
+
::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border-radius: 9999px; }
|
|
63
|
+
::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--foreground) 40%, transparent); }
|
|
64
|
+
|
|
65
|
+
@supports not selector(::-webkit-scrollbar) {
|
|
66
|
+
* { scrollbar-width: thin; scrollbar-color: transparent transparent; }
|
|
67
|
+
*:hover { scrollbar-color: color-mix(in srgb, var(--foreground) 18%, transparent) transparent; }
|
|
68
|
+
.is-scrolling { scrollbar-color: color-mix(in srgb, var(--foreground) 28%, transparent) transparent; }
|
|
69
|
+
}
|
|
70
|
+
/* ===================================================== */
|
|
71
|
+
</style>
|
|
72
|
+
|
|
73
|
+
<style type="text/tailwindcss">
|
|
74
|
+
/* Map token sang class, như khối @theme inline của tokens.css. */
|
|
75
|
+
@theme inline {
|
|
76
|
+
--font-sans: var(--app-font);
|
|
77
|
+
|
|
78
|
+
--color-primary: var(--primary);
|
|
79
|
+
--color-primary-hover: var(--primary-hover);
|
|
80
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
81
|
+
|
|
82
|
+
--color-background: var(--background);
|
|
83
|
+
--color-background-hover: var(--background-hover);
|
|
84
|
+
--color-surface: var(--surface);
|
|
85
|
+
--color-surface-hover: var(--surface-hover);
|
|
86
|
+
--color-foreground: var(--foreground);
|
|
87
|
+
--color-muted: var(--muted);
|
|
88
|
+
--color-border: var(--border);
|
|
89
|
+
--color-border-strong: var(--border-strong);
|
|
90
|
+
--color-secondary: var(--secondary);
|
|
91
|
+
--color-secondary-hover: var(--secondary-hover);
|
|
92
|
+
--color-button-hover: var(--button-hover);
|
|
93
|
+
|
|
94
|
+
--border-color-focus: var(--border-focus);
|
|
95
|
+
--ring-color-focus: var(--ring-focus);
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
98
|
+
</head>
|
|
99
|
+
|
|
100
|
+
<body class="bg-background font-sans text-foreground antialiased">
|
|
101
|
+
<div class="flex min-h-screen w-full flex-col">
|
|
102
|
+
<!-- Thanh header theo layouts/app.md: h-16, nền trắng --surface, đường kẻ dưới --border-strong.
|
|
103
|
+
Trang không có đầu trang riêng nên tên trên thanh chính là <h1>, font-semibold (T2).
|
|
104
|
+
px-4 sm:px-6: tên trang thẳng mép icon đầu cột bên dưới (hàng cột px-3 + đầu cột px-1). -->
|
|
105
|
+
<header
|
|
106
|
+
class="flex h-16 shrink-0 items-center justify-between gap-3 border-b border-border bg-surface px-4 sm:px-6"
|
|
107
|
+
>
|
|
108
|
+
<h1 class="min-w-0 truncate text-base font-semibold text-foreground">Bảng công việc</h1>
|
|
109
|
+
|
|
110
|
+
<!-- Nút đặc duy nhất của thanh: h-9 rounded-lg, icon plus (app.md, "Nhóm nút bên phải thanh header"). -->
|
|
111
|
+
<button
|
|
112
|
+
type="button"
|
|
113
|
+
class="inline-flex h-9 shrink-0 cursor-pointer items-center gap-2 rounded-lg bg-primary px-3 text-sm font-medium text-primary-foreground outline-hidden transition-colors hover:bg-primary-hover"
|
|
114
|
+
>
|
|
115
|
+
<i data-lucide="plus" class="size-4 shrink-0" aria-hidden="true"></i>
|
|
116
|
+
Thêm việc
|
|
117
|
+
</button>
|
|
118
|
+
</header>
|
|
119
|
+
|
|
120
|
+
<!-- Vùng nội dung chỉ padding dọc: board cuộn ngang phải chạm hai mép màn, nên lề ngang nằm ở
|
|
121
|
+
từng khối (hàng lọc mx-3 sm:mx-5; hàng cột px-3 sm:px-5), không kéo board ra bằng -mx (N11). -->
|
|
122
|
+
<div class="flex flex-1 flex-col py-3 sm:py-5">
|
|
123
|
+
<div class="mx-3 mb-4 flex flex-col gap-3 sm:mx-5 sm:flex-row sm:items-center sm:justify-between">
|
|
124
|
+
<!-- Chip lọc chính theo components/small-controls.md, có aria-pressed. Ba chip vừa 375px nên
|
|
125
|
+
hàng không cuộn, không scrollbar-clean. Thêm chip tới mức tràn thì theo R6 và R10
|
|
126
|
+
(responsive.md): khung cuộn scrollbar-clean + mép mờ + nút mũi tên ở máy có chuột. -->
|
|
127
|
+
<div class="flex items-center gap-2">
|
|
128
|
+
<button type="button" aria-pressed="true" class="inline-flex h-9 shrink-0 cursor-pointer items-center rounded-full bg-primary px-3.5 text-sm font-medium text-primary-foreground outline-hidden transition-colors">
|
|
129
|
+
Tất cả
|
|
130
|
+
</button>
|
|
131
|
+
<button type="button" aria-pressed="false" class="inline-flex h-9 shrink-0 cursor-pointer items-center rounded-full bg-foreground/5 px-3.5 text-sm font-medium text-foreground/70 outline-hidden transition-colors hover:bg-foreground/10 hover:text-foreground">
|
|
132
|
+
Của tôi
|
|
133
|
+
</button>
|
|
134
|
+
<button type="button" aria-pressed="false" class="inline-flex h-9 shrink-0 cursor-pointer items-center rounded-full bg-foreground/5 px-3.5 text-sm font-medium text-foreground/70 outline-hidden transition-colors hover:bg-foreground/10 hover:text-foreground">
|
|
135
|
+
Quá hạn
|
|
136
|
+
</button>
|
|
137
|
+
</div>
|
|
138
|
+
|
|
139
|
+
<!-- Ô tìm theo components/input.md: h-11 md:h-10, text-base md:text-sm (R8). -->
|
|
140
|
+
<label class="relative block shrink-0 sm:w-64">
|
|
141
|
+
<span class="sr-only">Tìm việc</span>
|
|
142
|
+
<input
|
|
143
|
+
type="search"
|
|
144
|
+
placeholder="Tìm việc"
|
|
145
|
+
class="h-11 w-full rounded-xl border border-border-strong bg-surface px-4 text-base text-foreground outline-hidden transition-colors placeholder:text-muted focus:border-focus focus:ring-2 focus:ring-focus md:h-10 md:text-sm"
|
|
146
|
+
/>
|
|
147
|
+
</label>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<!-- Board không scrollbar-clean: thanh cuộn tự ẩn (I18), người dùng chuột vẫn có chỗ kéo ngang. -->
|
|
151
|
+
<div class="flex-1 overflow-x-auto">
|
|
152
|
+
<!-- w-max giữ lề phải khi cuộn, min-w-full cho cột giãn khi còn chỗ (layouts/app.md). -->
|
|
153
|
+
<div class="flex w-max min-w-full items-start gap-4 px-3 pb-2 sm:px-5">
|
|
154
|
+
<section class="w-[248px] min-w-0 max-w-[320px] shrink-0 grow">
|
|
155
|
+
<header class="mb-3 flex items-center gap-2 px-1">
|
|
156
|
+
<i data-lucide="circle" class="size-4 shrink-0 text-zinc-500"></i>
|
|
157
|
+
<h2 class="min-w-0 truncate text-base font-semibold text-foreground">Cần làm</h2>
|
|
158
|
+
<span class="text-xs font-medium text-muted">4</span>
|
|
159
|
+
</header>
|
|
160
|
+
|
|
161
|
+
<ul class="flex flex-col gap-3">
|
|
162
|
+
<li
|
|
163
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
164
|
+
>
|
|
165
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
166
|
+
Viết lại nội dung trang giới thiệu theo bản brief mới
|
|
167
|
+
</p>
|
|
168
|
+
<p class="mt-2 text-xs text-muted">Website · 22/08</p>
|
|
169
|
+
</li>
|
|
170
|
+
<li
|
|
171
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
172
|
+
>
|
|
173
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
174
|
+
Chuẩn bị số liệu doanh thu tháng 7 cho buổi họp
|
|
175
|
+
</p>
|
|
176
|
+
<p class="mt-2 text-xs"><span class="text-muted">Báo cáo · </span><span class="font-medium text-amber-700">Quá hạn 2 ngày</span></p>
|
|
177
|
+
</li>
|
|
178
|
+
<li
|
|
179
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
180
|
+
>
|
|
181
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
182
|
+
Dọn danh sách khách hàng trùng trong CRM
|
|
183
|
+
</p>
|
|
184
|
+
<p class="mt-2 text-xs text-muted">Vận hành · 26/08</p>
|
|
185
|
+
</li>
|
|
186
|
+
<li
|
|
187
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
188
|
+
>
|
|
189
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
190
|
+
Đặt lịch phỏng vấn hai ứng viên vòng cuối
|
|
191
|
+
</p>
|
|
192
|
+
<p class="mt-2 text-xs text-muted">Tuyển dụng · 29/08</p>
|
|
193
|
+
</li>
|
|
194
|
+
</ul>
|
|
195
|
+
</section>
|
|
196
|
+
|
|
197
|
+
<section class="w-[248px] min-w-0 max-w-[320px] shrink-0 grow">
|
|
198
|
+
<header class="mb-3 flex items-center gap-2 px-1">
|
|
199
|
+
<i data-lucide="circle-dot" class="size-4 shrink-0 text-zinc-500"></i>
|
|
200
|
+
<h2 class="min-w-0 truncate text-base font-semibold text-foreground">Đang làm</h2>
|
|
201
|
+
<span class="text-xs font-medium text-muted">3</span>
|
|
202
|
+
</header>
|
|
203
|
+
|
|
204
|
+
<ul class="flex flex-col gap-3">
|
|
205
|
+
<li
|
|
206
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
207
|
+
>
|
|
208
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
209
|
+
Dựng màn hình thanh toán cho gói năm
|
|
210
|
+
</p>
|
|
211
|
+
<p class="mt-2 text-xs text-muted">Sản phẩm · 21/08</p>
|
|
212
|
+
</li>
|
|
213
|
+
<li
|
|
214
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
215
|
+
>
|
|
216
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
217
|
+
Chuyển kho ảnh sản phẩm sang CDN mới
|
|
218
|
+
</p>
|
|
219
|
+
<p class="mt-2 text-xs text-muted">Hạ tầng · 25/08</p>
|
|
220
|
+
</li>
|
|
221
|
+
<li
|
|
222
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
223
|
+
>
|
|
224
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
225
|
+
Trả lời 18 phản hồi còn tồn trong hộp thư hỗ trợ
|
|
226
|
+
</p>
|
|
227
|
+
<p class="mt-2 text-xs"><span class="text-muted">Hỗ trợ · </span><span class="font-medium text-foreground">Hôm nay</span></p>
|
|
228
|
+
</li>
|
|
229
|
+
</ul>
|
|
230
|
+
</section>
|
|
231
|
+
|
|
232
|
+
<section class="w-[248px] min-w-0 max-w-[320px] shrink-0 grow">
|
|
233
|
+
<header class="mb-3 flex items-center gap-2 px-1">
|
|
234
|
+
<i data-lucide="circle-ellipsis" class="size-4 shrink-0 text-amber-600"></i>
|
|
235
|
+
<h2 class="min-w-0 truncate text-base font-semibold text-foreground">Chờ duyệt</h2>
|
|
236
|
+
<span class="text-xs font-medium text-muted">2</span>
|
|
237
|
+
</header>
|
|
238
|
+
|
|
239
|
+
<ul class="flex flex-col gap-3">
|
|
240
|
+
<li
|
|
241
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
242
|
+
>
|
|
243
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
244
|
+
Bảng giá mới cho gói doanh nghiệp
|
|
245
|
+
</p>
|
|
246
|
+
<p class="mt-2 text-xs text-muted">Kinh doanh · gửi 19/08</p>
|
|
247
|
+
</li>
|
|
248
|
+
<li
|
|
249
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
250
|
+
>
|
|
251
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
252
|
+
Hợp đồng gia hạn với nhà cung cấp máy chủ
|
|
253
|
+
</p>
|
|
254
|
+
<p class="mt-2 text-xs text-muted">Pháp lý · gửi 20/08</p>
|
|
255
|
+
</li>
|
|
256
|
+
</ul>
|
|
257
|
+
</section>
|
|
258
|
+
|
|
259
|
+
<section class="w-[248px] min-w-0 max-w-[320px] shrink-0 grow">
|
|
260
|
+
<header class="mb-3 flex items-center gap-2 px-1">
|
|
261
|
+
<i data-lucide="circle-check" class="size-4 shrink-0 text-emerald-600"></i>
|
|
262
|
+
<h2 class="min-w-0 truncate text-base font-semibold text-foreground">Xong</h2>
|
|
263
|
+
<span class="text-xs font-medium text-muted">3</span>
|
|
264
|
+
</header>
|
|
265
|
+
|
|
266
|
+
<ul class="flex flex-col gap-3">
|
|
267
|
+
<li
|
|
268
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
269
|
+
>
|
|
270
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
271
|
+
Chốt bản thiết kế trang chủ với khách
|
|
272
|
+
</p>
|
|
273
|
+
<p class="mt-2 text-xs text-muted">Website · xong 18/08</p>
|
|
274
|
+
</li>
|
|
275
|
+
<li
|
|
276
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
277
|
+
>
|
|
278
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
279
|
+
Sao lưu cơ sở dữ liệu quý 2
|
|
280
|
+
</p>
|
|
281
|
+
<p class="mt-2 text-xs text-muted">Hạ tầng · xong 17/08</p>
|
|
282
|
+
</li>
|
|
283
|
+
<li
|
|
284
|
+
class="cursor-grab rounded-2xl border border-border bg-surface p-4 transition-colors hover:border-border-strong"
|
|
285
|
+
>
|
|
286
|
+
<p class="line-clamp-2 text-sm font-medium text-foreground">
|
|
287
|
+
Gửi hoá đơn tháng 7 cho 12 khách hàng
|
|
288
|
+
</p>
|
|
289
|
+
<p class="mt-2 text-xs text-muted">Kế toán · xong 15/08</p>
|
|
290
|
+
</li>
|
|
291
|
+
</ul>
|
|
292
|
+
</section>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
<script src="https://unpkg.com/lucide@0.460.0/dist/umd/lucide.min.js"></script>
|
|
299
|
+
<script>
|
|
300
|
+
lucide.createIcons();
|
|
301
|
+
</script>
|
|
302
|
+
</body>
|
|
303
|
+
</html>
|