@tera-system/pro 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/MANIFEST.json +8 -6
  2. package/RELEASES.md +16 -0
  3. package/package.json +3 -6
  4. package/scripts/build.mjs +4 -3
  5. package/scripts/install.js +26 -6
  6. package/agents/application-blueprint.md +0 -411
  7. package/agents/auditor.md +0 -669
  8. package/agents/design-reviewer.md +0 -396
  9. package/agents/domain-expert-agent.md +0 -514
  10. package/agents/domain-research-agent.md +0 -364
  11. package/agents/engineering-agent-dotnet.md +0 -222
  12. package/agents/engineering-agent-phaser.md +0 -279
  13. package/agents/engineering-agent-typescript.md +0 -304
  14. package/agents/engineering-agent.md +0 -147
  15. package/agents/monitor.md +0 -399
  16. package/agents/production-erp-expert.md +0 -510
  17. package/agents/project-knowledge-agent.md +0 -275
  18. package/agents/qa-agent.md +0 -502
  19. package/agents/tera-business-transformation-consultant.md +0 -294
  20. package/agents/tera-client-engagement.md +0 -895
  21. package/agents/tera-software-designer.md +0 -241
  22. package/agents/tera-strategic-advisor.md +0 -329
  23. package/agents/tera-system-evolution.md +0 -763
  24. package/agents/tera.md +0 -524
  25. package/agents/ui-designer.md +0 -430
  26. package/commands/tera-approve.md +0 -36
  27. package/commands/tera-diagnose.md +0 -49
  28. package/commands/tera-gate.md +0 -42
  29. package/commands/tera-help.md +0 -43
  30. package/commands/tera-new-project.md +0 -37
  31. package/commands/tera-plan.md +0 -36
  32. package/commands/tera-request-build.md +0 -47
  33. package/commands/tera-resume.md +0 -36
  34. package/commands/tera-review.md +0 -54
  35. package/commands/tera-status.md +0 -40
  36. package/commands/tera-update.md +0 -50
  37. package/core/tera-system/AGENT_ACTIVATION_MATRIX.md +0 -285
  38. package/core/tera-system/AGENT_DEPENDENCY_MAP.md +0 -117
  39. package/core/tera-system/AGENT_GENERATION_TEMPLATE.md +0 -312
  40. package/core/tera-system/AGENT_PERMISSION_MODEL.md +0 -343
  41. package/core/tera-system/AIS_PROTOCOL.md +0 -191
  42. package/core/tera-system/TERA_AGENT_CONDUCT.md +0 -102
  43. package/core/tera-system/TERA_CONTINUOUS_IMPROVEMENT_POLICY.md +0 -111
  44. package/core/tera-system/TERA_DISTRIBUTION_POLICY.md +0 -291
  45. package/core/tera-system/TERA_LICENSE_GUARD.md +0 -144
  46. package/core/tera-system/TERA_PROJECT_DECISION.md +0 -281
  47. package/core/tera-system/TERA_USER_GUIDE.md +0 -462
  48. package/core/tera-system/TOOLING_AND_MCP_POLICY.md +0 -285
  49. package/core/tera-system/TeraApplicationQuestionBank.md +0 -362
  50. package/core/tera-system/TeraArchitectureMap.md +0 -91
  51. package/core/tera-system/TeraClientPolicy.md +0 -366
  52. package/core/tera-system/TeraHelperAgents.md +0 -970
  53. package/core/tera-system/TeraPolicyMap.md +0 -131
  54. package/core/tera-system/TeraPreExecutionGate.md +0 -818
  55. package/core/tera-system/TeraPreparationDocumentationGovernance.md +0 -370
  56. package/core/tera-system/TeraPricingPolicy.md +0 -674
  57. package/core/tera-system/TeraProjectIntakePolicy.md +0 -164
  58. package/core/tera-system/TeraScenarioStressTests.md +0 -168
  59. package/core/tera-system/TeraSubAgents.md +0 -854
  60. package/core/tera-system/TeraSystemMaintenanceChecklist.md +0 -80
  61. package/core/tera-system/TeraTokenPolicy.md +0 -362
  62. package/core/tera-system/Tera_Project_Preparation_Files.md +0 -1045
  63. package/core/tera-system/agent-helpers/application-blueprint-details.md +0 -177
  64. package/core/tera-system/client-helpers/tera-client-engagement-discovery-domains.md +0 -99
  65. package/core/tera-system/client-helpers/tera-client-engagement-gates.md +0 -258
  66. package/core/tera-system/client-helpers/tera-client-engagement-pricing.md +0 -341
  67. package/core/tera-system/client-helpers/tera-client-engagement-protocols.md +0 -692
  68. package/core/tera-system/consulting-helpers/BTCA_METHODOLOGY_FRAMEWORK.md +0 -195
  69. package/core/tera-system/consulting-helpers/BTCA_REPORT_TEMPLATES.md +0 -266
  70. package/core/tera-system/design-system/ACCESSIBILITY_RULES.md +0 -31
  71. package/core/tera-system/design-system/COMPONENT_LIBRARY_SCHEMA.md +0 -46
  72. package/core/tera-system/design-system/DESIGN_MD_INTEGRATION.md +0 -59
  73. package/core/tera-system/design-system/DESIGN_REVIEW_STANDARDS.md +0 -241
  74. package/core/tera-system/design-system/DESIGN_SOURCE_PROTOCOL.md +0 -61
  75. package/core/tera-system/design-system/DESIGN_SYSTEM_OVERVIEW.md +0 -66
  76. package/core/tera-system/design-system/DESIGN_TOKENS_SCHEMA.md +0 -66
  77. package/core/tera-system/design-system/EXTERNAL_REFERENCE_ANALYSIS.md +0 -52
  78. package/core/tera-system/design-system/FIGMA_INTEGRATION.md +0 -138
  79. package/core/tera-system/design-system/INTERNAL_KITS_INDEX.md +0 -26
  80. package/core/tera-system/design-system/LAYOUT_PATTERNS.md +0 -52
  81. package/core/tera-system/design-system/MOBILE_UI_UX_STANDARDS.md +0 -342
  82. package/core/tera-system/design-system/RTL_LTR_RULES.md +0 -39
  83. package/core/tera-system/design-system/UI_ACCEPTANCE_GATE.md +0 -80
  84. package/core/tera-system/design-system/kits/KIT_ADMIN_DASHBOARD.md +0 -102
  85. package/core/tera-system/engineering-governance/ENGINEERING_AGENT_RESPONSIBILITIES.md +0 -210
  86. package/core/tera-system/engineering-governance/ENGINEERING_BEST_PRACTICES.md +0 -468
  87. package/core/tera-system/engineering-governance/ENGINEERING_GOVERNANCE_GATE.md +0 -131
  88. package/core/tera-system/engineering-governance/ENGINEERING_REVIEW_CHECKLIST.md +0 -129
  89. package/core/tera-system/engineering-governance/QUALITY_GATE_THRESHOLDS.md +0 -159
  90. package/core/tera-system/engineering-helpers/engineering-agent-core.md +0 -171
  91. package/core/tera-system/knowledge-base/OPENHANDS_ARCHITECTURE_REFERENCE.md +0 -243
  92. package/core/tera-system/knowledge-base/manufacturing/00_INDEX.md +0 -32
  93. package/core/tera-system/knowledge-base/manufacturing/01_MANUFACTURING_ERP_CORE_CONCEPTS.md +0 -7
  94. package/core/tera-system/knowledge-base/manufacturing/02_SAP_MANUFACTURING_RESEARCH.md +0 -7
  95. package/core/tera-system/knowledge-base/manufacturing/03_DYNAMICS_365_MANUFACTURING_RESEARCH.md +0 -7
  96. package/core/tera-system/knowledge-base/manufacturing/04_ORACLE_MANUFACTURING_RESEARCH.md +0 -7
  97. package/core/tera-system/knowledge-base/manufacturing/05_ODOO_MANUFACTURING_RESEARCH.md +0 -7
  98. package/core/tera-system/knowledge-base/manufacturing/06_ERPNEXT_MANUFACTURING_RESEARCH.md +0 -7
  99. package/core/tera-system/knowledge-base/manufacturing/07_MANUFACTURING_COSTING_GUIDE.md +0 -7
  100. package/core/tera-system/knowledge-base/manufacturing/08_PRODUCTION_DISCOVERY_QUESTIONS.md +0 -7
  101. package/core/tera-system/knowledge-base/manufacturing/09_MANUFACTURING_BLUEPRINT_CHECKLIST.md +0 -7
  102. package/core/tera-system/knowledge-base/manufacturing/10_PRODUCTION_TEST_SCENARIOS.md +0 -7
  103. package/core/tera-system/knowledge-base/manufacturing/11_QUALITY_REWORK_AND_SCRAP_GUIDE.md +0 -7
  104. package/core/tera-system/knowledge-base/manufacturing/12_MRP_AND_PLANNING_GUIDE.md +0 -7
  105. package/core/tera-system/knowledge-base/manufacturing/13_LOCAL_AND_REGIONAL_MANUFACTURING_CONTEXT.md +0 -7
  106. package/core/tera-system/knowledge-base/manufacturing/14_VENDOR_COMPARISON_MATRIX.md +0 -7
  107. package/core/tera-system/product-standards/maintenance-apps/BEST_PRACTICES_DOMAIN.md +0 -325
  108. package/core/tera-system/product-standards/maintenance-apps/STANDARD_DEFINITION.md +0 -142
  109. package/core/tera-system/profiles/PROFILES_INDEX.md +0 -57
  110. package/core/tera-system/profiles/TEMPLATE.md +0 -47
  111. package/core/tera-system/profiles/dotnet-blazor-ef.md +0 -76
  112. package/core/tera-system/profiles/dotnet-razorpages-adonet.md +0 -137
  113. package/core/tera-system/profiles/dotnet-wpf-sqlite.md +0 -159
  114. package/core/tera-system/profiles/effect-bun-opencode.md +0 -109
  115. package/core/tera-system/profiles/flutter-mobile.md +0 -369
  116. package/core/tera-system/profiles/nextjs-prisma.md +0 -110
  117. package/core/tera-system/profiles/phaser-react-node.md +0 -302
  118. package/core/tera-system/profiles/react-pwa.md +0 -97
  119. package/core/tera-system/runtime/CLIENT_DISCOVERY_PROTOCOL.md +0 -145
  120. package/core/tera-system/runtime/DOMAIN_INTELLIGENCE_PROTOCOL.md +0 -124
  121. package/core/tera-system/runtime/MVP_DEFINITION_PROTOCOL.md +0 -176
  122. package/core/tera-system/runtime/TERA_RUNTIME_CHECKLISTS.md +0 -646
  123. package/core/tera-system/runtime/TERA_RUNTIME_PROTOCOLS.md +0 -50
  124. package/core/tera-system/runtime/TERA_RUNTIME_PROTOCOLS_CLIENT.md +0 -355
  125. package/core/tera-system/runtime/TERA_RUNTIME_PROTOCOLS_CORE.md +0 -799
  126. package/core/tera-system/runtime/TERA_RUNTIME_TEMPLATES.md +0 -908
  127. package/core/tera-system/runtime/TERA_RUNTIME_TEMPLATES_DELIVERY.md +0 -584
  128. package/core/tera-system/runtime/TERA_RUNTIME_TEMPLATES_PREPARATION.md +0 -376
  129. package/core/tera-system/runtime/TERA_SOLUTION_PREPARATION_PROTOCOL.md +0 -335
  130. package/core/tera-system/runtime/TERA_SOLUTION_PREPARATION_TEMPLATES.md +0 -397
  131. package/core/tera-system/runtime/VERSION_LIFECYCLE_PROTOCOL.md +0 -296
  132. package/core/tera-system/semgrep-rules/README.md +0 -32
  133. package/core/tera-system/semgrep-rules/tera-security.yml +0 -66
  134. package/core/tera-system/semgrep-rules/tera-standards.yml +0 -49
  135. package/core/tera-system/teranoo-ui/README.md +0 -48
  136. package/core/tera-system/teranoo-ui/components/button.tsx +0 -51
  137. package/core/tera-system/teranoo-ui/components/card.tsx +0 -49
  138. package/core/tera-system/teranoo-ui/components/dashboard-layout.tsx +0 -36
  139. package/core/tera-system/teranoo-ui/components/data-table.tsx +0 -146
  140. package/core/tera-system/teranoo-ui/components/empty-state.tsx +0 -31
  141. package/core/tera-system/teranoo-ui/components/kpi-card.tsx +0 -42
  142. package/core/tera-system/teranoo-ui/components/page-header.tsx +0 -25
  143. package/core/tera-system/teranoo-ui/components/search-input.tsx +0 -40
  144. package/core/tera-system/teranoo-ui/components/sidebar.tsx +0 -66
  145. package/core/tera-system/teranoo-ui/components/stats-card.tsx +0 -37
  146. package/core/tera-system/teranoo-ui/registry.json +0 -77
  147. package/core/tera-system/teranoo-ui/styles/teranoo-theme.css +0 -61
  148. package/tools/tera-clean.ps1 +0 -97
  149. package/tools/tera-fetch.ps1 +0 -165
  150. package/tools/tera-release.ps1 +0 -96
  151. package/tools/tera-schedule.ps1 +0 -59
  152. package/tools/tera-update.ps1 +0 -472
  153. package/tools/tera-watch.ps1 +0 -154
  154. package/tools/update-client-repositories.ps1 +0 -92
@@ -1,32 +0,0 @@
1
- # Semgrep Rules — Tera System
2
-
3
- قواعد Semgrep الخاصة بمنظومة Tera لجودة وأمان الكود.
4
-
5
- ## كيفية الاستخدام
6
-
7
- ### كـ MCP (للاستخدام من العملاء)
8
- ```bash
9
- # MCP Server مضبوط مسبقاً — العملاء يستدعون semgrep_scan مباشرة
10
- ```
11
-
12
- ### كـ CLI (للمراجعة اليدوية)
13
- ```bash
14
- # فحص المشروع كاملاً
15
- semgrep --config=tera-system/semgrep-rules/ --metrics=off .
16
-
17
- # فحص ملفات محددة
18
- semgrep --config=tera-system/semgrep-rules/ --metrics=off path/to/file
19
- ```
20
-
21
- ## الملفات
22
-
23
- | الملف | الغرض | Severity |
24
- |-------|-------|----------|
25
- | `tera-security.yml` | قواعد أمنية — Secrets, Injection, Eval | ERROR |
26
- | `tera-standards.yml` | قواعد جودة — Console.log, TODOs, حجم الدوال | WARNING / INFO |
27
-
28
- ## تطوير القواعد
29
-
30
- - القواعد مبدئية — تُوسع حسب الاحتياج
31
- - أي إضافة/تعديل → يحتاج SYSTEM_CHANGE_PROPOSAL
32
- - يُفضل اختبار القاعدة على Semgrep Playground قبل الإضافة
@@ -1,66 +0,0 @@
1
- rules:
2
- - id: tera-no-hardcoded-secrets
3
- message: >
4
- SECURITY [QG-SEC-001]: لا تخزن مفاتيح أو ConnectionStrings أو Secrets في الكود.
5
- استخدم User Secrets / Environment Variables / Azure Key Vault / أي آلية آمنة معتمدة.
6
- severity: ERROR
7
- languages:
8
- - csharp
9
- - javascript
10
- - typescript
11
- - python
12
- patterns:
13
- - pattern: |
14
- $VAR = "..."
15
- - metavariable-regex:
16
- metavariable: $VAR
17
- regex: (?i).*(password|secret|connection.?string|api.?key|apikey|passwd|pwd|credential).*
18
-
19
- - id: tera-no-eval
20
- pattern: eval(...)
21
- message: >
22
- SECURITY [QG-SEC-004]: eval() ممنوع — يشكل خطر حقن كود.
23
- استخدم بديلاً آمناً.
24
- languages:
25
- - javascript
26
- - typescript
27
- - python
28
- severity: ERROR
29
-
30
- - id: tera-sql-concatenation
31
- message: >
32
- SECURITY [QG-SEC-003]: خطر SQL Injection — لا تركب استعلامات SQL يدوياً.
33
- استخدم Parameterized Queries / Entity Framework / Dapper مع parameters.
34
- severity: ERROR
35
- languages:
36
- - csharp
37
- - javascript
38
- - typescript
39
- - python
40
- - java
41
- patterns:
42
- - pattern: '"..." + $VAR'
43
- - metavariable-regex:
44
- metavariable: $VAR
45
- regex: (?i).*
46
-
47
- - id: tera-exposed-credentials
48
- message: >
49
- SECURITY [QG-SEC-001]: لا تخزن مفاتيح أو توكنز أو API Keys بشكل صريح في الكود.
50
- severity: ERROR
51
- languages:
52
- - csharp
53
- - javascript
54
- - typescript
55
- - python
56
- - java
57
- patterns:
58
- - pattern-either:
59
- - pattern: |
60
- $VAR = "=...="
61
- - pattern: |
62
- $VAR = "sk-..."
63
- - pattern: |
64
- $VAR = "ghp_..."
65
- - pattern: |
66
- $VAR = "AKIA..."
@@ -1,49 +0,0 @@
1
- rules:
2
- - id: tera-console-log
3
- message: >
4
- QUALITY: لا تترك console.log / print / Console.WriteLine في كود الإنتاج.
5
- استخدم مكتبة logging رسمية (Serilog, Winston, structlog, loguru).
6
- severity: WARNING
7
- languages:
8
- - csharp
9
- - javascript
10
- - typescript
11
- - python
12
- patterns:
13
- - pattern-either:
14
- - pattern: console.log(...)
15
- - pattern: console.error(...)
16
- - pattern: console.warn(...)
17
- - pattern: Console.WriteLine(...)
18
- - pattern: Console.Write(...)
19
- - pattern: print(...)
20
-
21
- - id: tera-todo-left
22
- pattern: TODO
23
- message: >
24
- QUALITY: في TODO / FIXME / HACK متروك في الكود.
25
- إما أنجزه الآن، أو سجله كـ Task/Clearing Issue في TASK_REGISTRY.
26
- severity: INFO
27
- languages:
28
- - csharp
29
- - javascript
30
- - typescript
31
- - python
32
- - java
33
- - go
34
-
35
- - id: tera-debug-statement
36
- message: >
37
- QUALITY: debugger / Debug statements متروكة في الكود.
38
- لا يجوز تسليم كود إنتاج وفيه debugger breakpoints.
39
- severity: ERROR
40
- languages:
41
- - csharp
42
- - javascript
43
- - typescript
44
- patterns:
45
- - pattern-either:
46
- - pattern: debugger
47
- - pattern: Debug.WriteLine(...)
48
- - pattern: Debug.Print(...)
49
- - pattern: Debugger.Break()
@@ -1,48 +0,0 @@
1
- # Teranoo UI Registry 🎨
2
-
3
- المكونات المعتمدة لتطبيقات Tera — مبنية على [shadcn/ui](https://ui.shadcn.com).
4
-
5
- ## الاستخدام
6
-
7
- ### المتطلبات
8
- - Next.js + TypeScript + Tailwind CSS
9
- - تم تشغيل `npx shadcn@latest init` في المشروع
10
-
11
- ### إضافة مكونات shadcn/ui الأساسية
12
- ```bash
13
- npx shadcn@latest add button card input label form select table dropdown-menu dialog tabs
14
- ```
15
-
16
- ### إضافة مكونات Teranoo UI
17
- ```bash
18
- npx shadcn@latest add button --registry=./tera-system/teranoo-ui
19
- npx shadcn@latest add dashboard-layout --registry=./tera-system/teranoo-ui
20
- npx shadcn@latest add kpi-card --registry=./tera-system/teranoo-ui
21
- ```
22
-
23
- ### تطبيق ثيم Tera
24
- انسخ ملف `styles/teranoo-theme.css` إلى مجلد المشروع وأضف الـ import:
25
- ```css
26
- @import './styles/teranoo-theme.css';
27
- ```
28
-
29
- ## قائمة المكونات
30
-
31
- | المكون | الوصف | يستخدم shadcn/ui |
32
- |--------|-------|-------------------|
33
- | `button` | زر Tera الأساسي | ✅ shadcn button |
34
- | `card` | بطاقة محتوى | ✅ shadcn card |
35
- | `dashboard-layout` | هيكل لوحة تحكم كامل | ❌ (هيكل مركب) |
36
- | `data-table` | جدول متقدم | ✅ shadcn table |
37
- | `kpi-card` | بطاقة KPI | ✅ shadcn card |
38
- | `sidebar` | قائمة جانبية | ❌ (مخصص) |
39
- | `stats-card` | بطاقة إحصائية | ✅ shadcn card |
40
- | `page-header` | عنوان صفحة | ❌ (مخصص) |
41
- | `search-input` | حقل بحث | ✅ shadcn input |
42
- | `empty-state` | حالة فراغ | ❌ (مخصص) |
43
-
44
- ## المبدأ
45
-
46
- > استخدم مكونات shadcn/ui أولاً.
47
- > استخدم Teranoo UI Registry للمكونات المخصصة المتكررة.
48
- > اكتب من الصفر فقط لما لا يوجد في الاثنين.
@@ -1,51 +0,0 @@
1
- import * as React from "react"
2
- import { Slot } from "@radix-ui/react-slot"
3
- import { cva, type VariantProps } from "class-variance-authority"
4
-
5
- const buttonVariants = cva(
6
- "inline-flex items-center justify-center whitespace-nowrap rounded-[var(--teranoo-radius)] text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--teranoo-ring)] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
7
- {
8
- variants: {
9
- variant: {
10
- default: "bg-[var(--teranoo-primary)] text-[var(--teranoo-primary-foreground)] hover:bg-[var(--teranoo-primary-hover)]",
11
- destructive: "bg-[var(--teranoo-danger)] text-white hover:bg-red-600",
12
- outline: "border border-[var(--teranoo-border)] bg-[var(--teranoo-background)] hover:bg-[var(--teranoo-muted)]",
13
- secondary: "bg-[var(--teranoo-secondary)] text-[var(--teranoo-secondary-foreground)] hover:bg-[var(--teranoo-secondary)]/80",
14
- ghost: "hover:bg-[var(--teranoo-muted)]",
15
- link: "text-[var(--teranoo-primary)] underline-offset-4 hover:underline",
16
- },
17
- size: {
18
- default: "h-10 px-4 py-2",
19
- sm: "h-9 rounded-md px-3",
20
- lg: "h-11 rounded-md px-8",
21
- icon: "h-10 w-10",
22
- },
23
- },
24
- defaultVariants: {
25
- variant: "default",
26
- size: "default",
27
- },
28
- }
29
- )
30
-
31
- export interface ButtonProps
32
- extends React.ButtonHTMLAttributes<HTMLButtonElement>,
33
- VariantProps<typeof buttonVariants> {
34
- asChild?: boolean
35
- }
36
-
37
- const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
38
- ({ className, variant, size, asChild = false, ...props }, ref) => {
39
- const Comp = asChild ? Slot : "button"
40
- return (
41
- <Comp
42
- className={buttonVariants({ variant, size, className })}
43
- ref={ref}
44
- {...props}
45
- />
46
- )
47
- }
48
- )
49
- Button.displayName = "Button"
50
-
51
- export { Button, buttonVariants }
@@ -1,49 +0,0 @@
1
- import * as React from "react"
2
-
3
- const Card = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
4
- ({ className, ...props }, ref) => (
5
- <div
6
- ref={ref}
7
- className="rounded-[var(--teranoo-radius)] border border-[var(--teranoo-border)] bg-[var(--teranoo-background)] shadow-[var(--teranoo-shadow)]"
8
- {...props}
9
- />
10
- )
11
- )
12
- Card.displayName = "Card"
13
-
14
- const CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
15
- ({ className, ...props }, ref) => (
16
- <div ref={ref} className="flex flex-col space-y-1.5 p-6" {...props} />
17
- )
18
- )
19
- CardHeader.displayName = "CardHeader"
20
-
21
- const CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(
22
- ({ className, ...props }, ref) => (
23
- <h3 ref={ref} className="text-2xl font-semibold leading-none tracking-tight" {...props} />
24
- )
25
- )
26
- CardTitle.displayName = "CardTitle"
27
-
28
- const CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
29
- ({ className, ...props }, ref) => (
30
- <p ref={ref} className="text-sm text-[var(--teranoo-muted-foreground)]" {...props} />
31
- )
32
- )
33
- CardDescription.displayName = "CardDescription"
34
-
35
- const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
36
- ({ className, ...props }, ref) => (
37
- <div ref={ref} className="p-6 pt-0" {...props} />
38
- )
39
- )
40
- CardContent.displayName = "CardContent"
41
-
42
- const CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
43
- ({ className, ...props }, ref) => (
44
- <div ref={ref} className="flex items-center p-6 pt-0" {...props} />
45
- )
46
- )
47
- CardFooter.displayName = "CardFooter"
48
-
49
- export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
@@ -1,36 +0,0 @@
1
- import * as React from "react"
2
- import { Sidebar } from "./sidebar"
3
- import type { SidebarItem } from "./sidebar"
4
-
5
- interface DashboardLayoutProps {
6
- sidebarItems: SidebarItem[]
7
- children: React.ReactNode
8
- header?: React.ReactNode
9
- footer?: React.ReactNode
10
- }
11
-
12
- export function DashboardLayout({ sidebarItems, children, header, footer }: DashboardLayoutProps) {
13
- const [collapsed, setCollapsed] = React.useState(false)
14
-
15
- return (
16
- <div className="flex h-screen overflow-hidden bg-[var(--teranoo-muted)]" dir="rtl">
17
- <Sidebar
18
- items={sidebarItems}
19
- collapsed={collapsed}
20
- onToggle={() => setCollapsed(!collapsed)}
21
- footer={footer}
22
- />
23
-
24
- <main className="flex-1 flex flex-col overflow-hidden">
25
- {header && (
26
- <header className="border-b border-[var(--teranoo-border)] bg-[var(--teranoo-background)] px-6 py-3">
27
- {header}
28
- </header>
29
- )}
30
- <div className="flex-1 overflow-y-auto p-6">
31
- {children}
32
- </div>
33
- </main>
34
- </div>
35
- )
36
- }
@@ -1,146 +0,0 @@
1
- import * as React from "react"
2
-
3
- interface Column<T> {
4
- key: string
5
- header: string
6
- render?: (item: T) => React.ReactNode
7
- sortable?: boolean
8
- }
9
-
10
- interface DataTableProps<T> {
11
- columns: Column<T>[]
12
- data: T[]
13
- searchable?: boolean
14
- pageSize?: number
15
- }
16
-
17
- export function DataTable<T extends Record<string, any>>({
18
- columns,
19
- data,
20
- searchable = true,
21
- pageSize = 10,
22
- }: DataTableProps<T>) {
23
- const [search, setSearch] = React.useState("")
24
- const [page, setPage] = React.useState(1)
25
- const [sortKey, setSortKey] = React.useState<string | null>(null)
26
- const [sortDir, setSortDir] = React.useState<"asc" | "desc">("asc")
27
-
28
- // تصفية
29
- const filtered = React.useMemo(() => {
30
- if (!search) return data
31
- return data.filter((item) =>
32
- columns.some((col) =>
33
- String(item[col.key]).toLowerCase().includes(search.toLowerCase())
34
- )
35
- )
36
- }, [data, search, columns])
37
-
38
- // ترتيب
39
- const sorted = React.useMemo(() => {
40
- if (!sortKey) return filtered
41
- return [...filtered].sort((a, b) => {
42
- const aVal = a[sortKey]
43
- const bVal = b[sortKey]
44
- if (aVal < bVal) return sortDir === "asc" ? -1 : 1
45
- if (aVal > bVal) return sortDir === "asc" ? 1 : -1
46
- return 0
47
- })
48
- }, [filtered, sortKey, sortDir])
49
-
50
- // تقسيم الصفحات
51
- const totalPages = Math.ceil(sorted.length / pageSize)
52
- const paged = sorted.slice((page - 1) * pageSize, page * pageSize)
53
-
54
- const handleSort = (key: string) => {
55
- if (sortKey === key) {
56
- setSortDir(sortDir === "asc" ? "desc" : "asc")
57
- } else {
58
- setSortKey(key)
59
- setSortDir("asc")
60
- }
61
- }
62
-
63
- return (
64
- <div className="space-y-4">
65
- {/* بحث */}
66
- {searchable && (
67
- <div className="relative max-w-sm">
68
- <input
69
- value={search}
70
- onChange={(e) => { setSearch(e.target.value); setPage(1) }}
71
- placeholder="بحث..."
72
- className="flex h-10 w-full rounded-[var(--teranoo-radius)] border border-[var(--teranoo-border)] bg-[var(--teranoo-background)] px-3 py-2 pr-10 text-sm"
73
- />
74
- </div>
75
- )}
76
-
77
- {/* جدول */}
78
- <div className="rounded-[var(--teranoo-radius)] border border-[var(--teranoo-border)] overflow-hidden">
79
- <table className="w-full text-sm">
80
- <thead className="bg-[var(--teranoo-muted)]">
81
- <tr>
82
- {columns.map((col) => (
83
- <th
84
- key={col.key}
85
- onClick={() => col.sortable && handleSort(col.key)}
86
- className={`px-4 py-3 text-right font-medium text-[var(--teranoo-muted-foreground)] ${
87
- col.sortable ? "cursor-pointer hover:text-[var(--teranoo-foreground)]" : ""
88
- }`}
89
- >
90
- {col.header}
91
- {sortKey === col.key && (
92
- <span className="mr-1">{sortDir === "asc" ? "↑" : "↓"}</span>
93
- )}
94
- </th>
95
- ))}
96
- </tr>
97
- </thead>
98
- <tbody className="bg-[var(--teranoo-background)]">
99
- {paged.length === 0 ? (
100
- <tr>
101
- <td colSpan={columns.length} className="px-4 py-12 text-center text-[var(--teranoo-muted-foreground)]">
102
- لا توجد بيانات
103
- </td>
104
- </tr>
105
- ) : (
106
- paged.map((item, i) => (
107
- <tr key={i} className="border-t border-[var(--teranoo-border)] hover:bg-[var(--teranoo-muted)]">
108
- {columns.map((col) => (
109
- <td key={col.key} className="px-4 py-3">
110
- {col.render ? col.render(item) : item[col.key]}
111
- </td>
112
- ))}
113
- </tr>
114
- ))
115
- )}
116
- </tbody>
117
- </table>
118
- </div>
119
-
120
- {/* Pagination */}
121
- {totalPages > 1 && (
122
- <div className="flex items-center justify-between">
123
- <p className="text-sm text-[var(--teranoo-muted-foreground)]">
124
- صفحة {page} من {totalPages}
125
- </p>
126
- <div className="flex gap-2">
127
- <button
128
- onClick={() => setPage(p => Math.max(1, p - 1))}
129
- disabled={page === 1}
130
- className="px-3 py-1 rounded border border-[var(--teranoo-border)] text-sm disabled:opacity-50"
131
- >
132
- السابق
133
- </button>
134
- <button
135
- onClick={() => setPage(p => Math.min(totalPages, p + 1))}
136
- disabled={page === totalPages}
137
- className="px-3 py-1 rounded border border-[var(--teranoo-border)] text-sm disabled:opacity-50"
138
- >
139
- التالي
140
- </button>
141
- </div>
142
- </div>
143
- )}
144
- </div>
145
- )
146
- }
@@ -1,31 +0,0 @@
1
- import * as React from "react"
2
-
3
- interface EmptyStateProps {
4
- icon?: React.ReactNode
5
- title: string
6
- description?: string
7
- action?: React.ReactNode
8
- }
9
-
10
- export function EmptyState({ icon, title, description, action }: EmptyStateProps) {
11
- return (
12
- <div className="flex flex-col items-center justify-center py-16 text-center">
13
- {icon && (
14
- <div className="mb-4 h-16 w-16 rounded-full bg-[var(--teranoo-muted)] flex items-center justify-center">
15
- {icon}
16
- </div>
17
- )}
18
- <h3 className="text-lg font-semibold">{title}</h3>
19
- {description && (
20
- <p className="mt-1 text-sm text-[var(--teranoo-muted-foreground)] max-w-sm">
21
- {description}
22
- </p>
23
- )}
24
- {action && (
25
- <div className="mt-4">
26
- {action}
27
- </div>
28
- )}
29
- </div>
30
- )
31
- }
@@ -1,42 +0,0 @@
1
- import * as React from "react"
2
- import { Card, CardContent } from "./card"
3
-
4
- interface KpiCardProps {
5
- title: string
6
- value: string | number
7
- change?: number
8
- changeLabel?: string
9
- icon?: React.ReactNode
10
- variant?: "default" | "success" | "warning" | "danger"
11
- }
12
-
13
- export function KpiCard({ title, value, change, changeLabel, icon, variant = "default" }: KpiCardProps) {
14
- const changeColor = change
15
- ? change > 0
16
- ? "text-[var(--teranoo-success)]"
17
- : "text-[var(--teranoo-danger)]"
18
- : "text-[var(--teranoo-muted-foreground)]"
19
-
20
- return (
21
- <Card>
22
- <CardContent className="p-6">
23
- <div className="flex items-center justify-between">
24
- <div className="space-y-1">
25
- <p className="text-sm text-[var(--teranoo-muted-foreground)]">{title}</p>
26
- <p className="text-3xl font-bold">{value}</p>
27
- {change !== undefined && (
28
- <p className={`text-sm ${changeColor}`}>
29
- {change > 0 ? "+" : ""}{change}% {changeLabel}
30
- </p>
31
- )}
32
- </div>
33
- {icon && (
34
- <div className="h-12 w-12 rounded-full bg-[var(--teranoo-muted)] flex items-center justify-center">
35
- {icon}
36
- </div>
37
- )}
38
- </div>
39
- </CardContent>
40
- </Card>
41
- )
42
- }
@@ -1,25 +0,0 @@
1
- import * as React from "react"
2
-
3
- interface PageHeaderProps {
4
- title: string
5
- description?: string
6
- children?: React.ReactNode
7
- }
8
-
9
- export function PageHeader({ title, description, children }: PageHeaderProps) {
10
- return (
11
- <div className="flex items-center justify-between pb-6">
12
- <div className="space-y-1">
13
- <h1 className="text-2xl font-bold tracking-tight">{title}</h1>
14
- {description && (
15
- <p className="text-sm text-[var(--teranoo-muted-foreground)]">{description}</p>
16
- )}
17
- </div>
18
- {children && (
19
- <div className="flex items-center gap-2">
20
- {children}
21
- </div>
22
- )}
23
- </div>
24
- )
25
- }
@@ -1,40 +0,0 @@
1
- import * as React from "react"
2
-
3
- interface SearchInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
4
- onClear?: () => void
5
- }
6
-
7
- export const SearchInput = React.forwardRef<HTMLInputElement, SearchInputProps>(
8
- ({ className, onClear, value, ...props }, ref) => {
9
- return (
10
- <div className="relative">
11
- <svg
12
- className="absolute right-3 top-1/2 -translate-y-1/2 h-4 w-4 text-[var(--teranoo-muted-foreground)]"
13
- xmlns="http://www.w3.org/2000/svg"
14
- viewBox="0 0 24 24"
15
- fill="none"
16
- stroke="currentColor"
17
- strokeWidth="2"
18
- >
19
- <circle cx="11" cy="11" r="8" />
20
- <path d="m21 21-4.3-4.3" />
21
- </svg>
22
- <input
23
- ref={ref}
24
- value={value}
25
- className="flex h-10 w-full rounded-[var(--teranoo-radius)] border border-[var(--teranoo-border)] bg-[var(--teranoo-background)] px-3 py-2 pr-10 text-sm ring-offset-background placeholder:text-[var(--teranoo-muted-foreground)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--teranoo-ring)] focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
26
- {...props}
27
- />
28
- {value && onClear && (
29
- <button
30
- onClick={onClear}
31
- className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-[var(--teranoo-muted-foreground)] hover:text-[var(--teranoo-foreground)]"
32
- >
33
- ×
34
- </button>
35
- )}
36
- </div>
37
- )
38
- }
39
- )
40
- SearchInput.displayName = "SearchInput"