create-freakpunch 0.0.0-stage → 0.2.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 +24 -3
- package/bin/create-freakpunch.mjs +227 -0
- package/files/README.md +19 -0
- package/files/app.config.ts +50 -0
- package/files/locales.ts +10 -0
- package/files/registry.ts +17 -0
- package/package.json +23 -6
- package/template/.dockerignore +17 -0
- package/template/.oxlintrc.json +9 -0
- package/template/AGENTS.md +6 -0
- package/template/BACKEND.md +108 -0
- package/template/CLAUDE.md +297 -0
- package/template/Dockerfile +19 -0
- package/template/_gitignore +26 -0
- package/template/components.json +27 -0
- package/template/design/COMPONENTS.md +145 -0
- package/template/design/DESIGN.md +212 -0
- package/template/design/PATTERNS.md +110 -0
- package/template/index.html +25 -0
- package/template/nginx.conf +32 -0
- package/template/package-lock.json +6484 -0
- package/template/package.json +51 -0
- package/template/public/favicon.svg +1 -0
- package/template/public/robots.txt +2 -0
- package/template/src/app.config.ts +50 -0
- package/template/src/app.roles.ts +24 -0
- package/template/src/components/ui/alert-dialog.tsx +181 -0
- package/template/src/components/ui/avatar.tsx +116 -0
- package/template/src/components/ui/badge.tsx +57 -0
- package/template/src/components/ui/breadcrumb.tsx +130 -0
- package/template/src/components/ui/button.tsx +58 -0
- package/template/src/components/ui/calendar.tsx +277 -0
- package/template/src/components/ui/card.tsx +99 -0
- package/template/src/components/ui/chart.tsx +370 -0
- package/template/src/components/ui/checkbox.tsx +28 -0
- package/template/src/components/ui/combobox.tsx +329 -0
- package/template/src/components/ui/command.tsx +191 -0
- package/template/src/components/ui/dialog.tsx +162 -0
- package/template/src/components/ui/dropdown-menu.tsx +271 -0
- package/template/src/components/ui/empty.tsx +103 -0
- package/template/src/components/ui/field.tsx +236 -0
- package/template/src/components/ui/input-group.tsx +263 -0
- package/template/src/components/ui/input.tsx +45 -0
- package/template/src/components/ui/kbd.tsx +31 -0
- package/template/src/components/ui/label.tsx +17 -0
- package/template/src/components/ui/pagination.tsx +134 -0
- package/template/src/components/ui/popover.tsx +87 -0
- package/template/src/components/ui/radio-group.tsx +35 -0
- package/template/src/components/ui/select.tsx +204 -0
- package/template/src/components/ui/separator.tsx +25 -0
- package/template/src/components/ui/sheet.tsx +139 -0
- package/template/src/components/ui/sidebar.tsx +741 -0
- package/template/src/components/ui/skeleton.tsx +13 -0
- package/template/src/components/ui/sonner.tsx +78 -0
- package/template/src/components/ui/spinner.tsx +42 -0
- package/template/src/components/ui/switch.tsx +29 -0
- package/template/src/components/ui/table.tsx +121 -0
- package/template/src/components/ui/tabs.tsx +191 -0
- package/template/src/components/ui/textarea.tsx +17 -0
- package/template/src/components/ui/toggle-group.tsx +94 -0
- package/template/src/components/ui/toggle.tsx +48 -0
- package/template/src/components/ui/tooltip.tsx +91 -0
- package/template/src/core/api/demo.ts +8 -0
- package/template/src/core/api/http.ts +76 -0
- package/template/src/core/api/mock.ts +88 -0
- package/template/src/core/api/rest.ts +67 -0
- package/template/src/core/api/types.ts +21 -0
- package/template/src/core/audit/audit.service.ts +94 -0
- package/template/src/core/audit/hooks.ts +19 -0
- package/template/src/core/auth/auth-store.ts +52 -0
- package/template/src/core/auth/auth.service.ts +86 -0
- package/template/src/core/auth/can.tsx +39 -0
- package/template/src/core/auth/dev-role-switcher.tsx +64 -0
- package/template/src/core/auth/local-credentials.ts +46 -0
- package/template/src/core/auth/permissions.ts +115 -0
- package/template/src/core/auth/require-auth.tsx +16 -0
- package/template/src/core/auth/require-permission.tsx +24 -0
- package/template/src/core/auth/roles.ts +9 -0
- package/template/src/core/auth/types.ts +20 -0
- package/template/src/core/auth/use-auth.ts +19 -0
- package/template/src/core/company/company.service.ts +94 -0
- package/template/src/core/company/hooks.ts +40 -0
- package/template/src/core/company/password-policy.ts +40 -0
- package/template/src/core/company/types.ts +46 -0
- package/template/src/core/company/use-app-name.ts +7 -0
- package/template/src/core/components/button-link.tsx +14 -0
- package/template/src/core/components/confirm-dialog.tsx +116 -0
- package/template/src/core/components/data-table/data-table.tsx +297 -0
- package/template/src/core/components/data-table/features.ts +24 -0
- package/template/src/core/components/data-table/table-header-cell.tsx +13 -0
- package/template/src/core/components/data-table/toolbar.tsx +100 -0
- package/template/src/core/components/data-table/use-list-url-state.ts +108 -0
- package/template/src/core/components/date-picker.tsx +71 -0
- package/template/src/core/components/file-attachments.tsx +84 -0
- package/template/src/core/components/form-error.tsx +9 -0
- package/template/src/core/components/form-page.tsx +93 -0
- package/template/src/core/components/image-upload.tsx +86 -0
- package/template/src/core/components/page.tsx +75 -0
- package/template/src/core/components/phone-input.tsx +58 -0
- package/template/src/core/components/search-select.tsx +57 -0
- package/template/src/core/components/segmented.tsx +41 -0
- package/template/src/core/components/states.tsx +97 -0
- package/template/src/core/components/status-badge.tsx +26 -0
- package/template/src/core/components/user-avatar.tsx +23 -0
- package/template/src/core/config/runtime.ts +16 -0
- package/template/src/core/config/types.ts +37 -0
- package/template/src/core/i18n/i18n.ts +69 -0
- package/template/src/core/i18n/i18next.d.ts +12 -0
- package/template/src/core/i18n/keys.ts +37 -0
- package/template/src/core/i18n/language-switcher.tsx +45 -0
- package/template/src/core/i18n/types.ts +17 -0
- package/template/src/core/i18n/use-format.ts +31 -0
- package/template/src/core/layout/app-shell.tsx +50 -0
- package/template/src/core/layout/app-sidebar.tsx +285 -0
- package/template/src/core/layout/command-menu.tsx +117 -0
- package/template/src/core/layout/top-bar.tsx +100 -0
- package/template/src/core/lib/csv.ts +27 -0
- package/template/src/core/lib/format.ts +87 -0
- package/template/src/core/lib/phone.ts +50 -0
- package/template/src/core/lib/storage.ts +27 -0
- package/template/src/core/modules/lazy-page.ts +9 -0
- package/template/src/core/modules/navigation.ts +39 -0
- package/template/src/core/modules/types.ts +55 -0
- package/template/src/core/notifications/hooks.ts +84 -0
- package/template/src/core/notifications/notification-center.tsx +251 -0
- package/template/src/core/notifications/notifications.service.ts +132 -0
- package/template/src/core/notifications/types.ts +70 -0
- package/template/src/core/preferences/preferences-store.ts +70 -0
- package/template/src/core/setup/setup-gate.tsx +20 -0
- package/template/src/core/setup/setup.service.ts +101 -0
- package/template/src/core/theme/brand-context.tsx +53 -0
- package/template/src/core/theme/brand.ts +29 -0
- package/template/src/core/theme/theme-context.tsx +62 -0
- package/template/src/core/theme/theme-options.ts +8 -0
- package/template/src/core/theme/theme-toggle.tsx +45 -0
- package/template/src/core/users/hooks.ts +51 -0
- package/template/src/core/users/types.ts +37 -0
- package/template/src/core/users/users.service.ts +167 -0
- package/template/src/hooks/use-mobile.ts +19 -0
- package/template/src/index.css +321 -0
- package/template/src/lib/utils.ts +1 -0
- package/template/src/locales/en/account.ts +180 -0
- package/template/src/locales/en/auth.ts +18 -0
- package/template/src/locales/en/common.ts +151 -0
- package/template/src/locales/en/company.ts +380 -0
- package/template/src/locales/en/dashboard.ts +46 -0
- package/template/src/locales/en/errors.ts +18 -0
- package/template/src/locales/en/notifications.ts +43 -0
- package/template/src/locales/en/settings.ts +25 -0
- package/template/src/locales/en/setup.ts +45 -0
- package/template/src/locales/index.ts +58 -0
- package/template/src/locales/tr/account.ts +184 -0
- package/template/src/locales/tr/auth.ts +22 -0
- package/template/src/locales/tr/common.ts +154 -0
- package/template/src/locales/tr/company.ts +384 -0
- package/template/src/locales/tr/dashboard.ts +50 -0
- package/template/src/locales/tr/errors.ts +22 -0
- package/template/src/locales/tr/notifications.ts +47 -0
- package/template/src/locales/tr/settings.ts +29 -0
- package/template/src/locales/tr/setup.ts +49 -0
- package/template/src/main.tsx +16 -0
- package/template/src/modules/locales.ts +10 -0
- package/template/src/modules/registry.ts +17 -0
- package/template/src/pages/dashboard/dashboard-page.tsx +55 -0
- package/template/src/pages/dashboard/quick-actions.tsx +37 -0
- package/template/src/pages/login-page.tsx +152 -0
- package/template/src/pages/no-access-page.tsx +11 -0
- package/template/src/pages/not-found-page.tsx +61 -0
- package/template/src/pages/settings/account/account.service.ts +128 -0
- package/template/src/pages/settings/account/components/mock-qr.tsx +50 -0
- package/template/src/pages/settings/account/components/password-strength.tsx +38 -0
- package/template/src/pages/settings/account/components/two-factor-dialog.tsx +140 -0
- package/template/src/pages/settings/account/hooks.ts +73 -0
- package/template/src/pages/settings/account/notifications-page.tsx +103 -0
- package/template/src/pages/settings/account/preferences-page.tsx +157 -0
- package/template/src/pages/settings/account/profile-page.tsx +242 -0
- package/template/src/pages/settings/account/security-page.tsx +364 -0
- package/template/src/pages/settings/account/types.ts +37 -0
- package/template/src/pages/settings/company/audit-log-page.tsx +126 -0
- package/template/src/pages/settings/company/branding-page.tsx +278 -0
- package/template/src/pages/settings/company/components/invite-dialog.tsx +106 -0
- package/template/src/pages/settings/company/components/read-only-notice.tsx +13 -0
- package/template/src/pages/settings/company/danger-zone-page.tsx +127 -0
- package/template/src/pages/settings/company/general-page.tsx +234 -0
- package/template/src/pages/settings/company/integrations/api-keys-panel.tsx +170 -0
- package/template/src/pages/settings/company/integrations/hooks.ts +37 -0
- package/template/src/pages/settings/company/integrations/integrations-page.tsx +57 -0
- package/template/src/pages/settings/company/integrations/integrations.service.ts +153 -0
- package/template/src/pages/settings/company/integrations/settings-forms.tsx +299 -0
- package/template/src/pages/settings/company/integrations/webhooks-panel.tsx +179 -0
- package/template/src/pages/settings/company/modules-page.tsx +65 -0
- package/template/src/pages/settings/company/roles-page.tsx +116 -0
- package/template/src/pages/settings/company/security-policies-page.tsx +164 -0
- package/template/src/pages/settings/company/users-page.tsx +262 -0
- package/template/src/pages/settings/settings-layout.tsx +57 -0
- package/template/src/pages/settings/settings-nav.ts +69 -0
- package/template/src/pages/settings/settings-routes.tsx +49 -0
- package/template/src/pages/setup-page.tsx +387 -0
- package/template/src/providers.tsx +68 -0
- package/template/src/router.tsx +59 -0
- package/template/tools/check-design.mjs +73 -0
- package/template/tools/new-module.mjs +90 -0
- package/template/tools/templates/module/api/__id__.mock.ts.tpl +17 -0
- package/template/tools/templates/module/api/__id__.service.ts.tpl +51 -0
- package/template/tools/templates/module/hooks.ts.tpl +57 -0
- package/template/tools/templates/module/index.ts.tpl +44 -0
- package/template/tools/templates/module/locales/en.ts.tpl +51 -0
- package/template/tools/templates/module/locales/tr.ts.tpl +55 -0
- package/template/tools/templates/module/pages/__id__-detail-page.tsx.tpl +103 -0
- package/template/tools/templates/module/pages/__id__-form-page.tsx.tpl +121 -0
- package/template/tools/templates/module/pages/__id__-list-page.tsx.tpl +234 -0
- package/template/tools/templates/module/types.ts.tpl +32 -0
- package/template/tsconfig.app.json +32 -0
- package/template/tsconfig.json +12 -0
- package/template/tsconfig.node.json +23 -0
- package/template/vite.config.ts +47 -0
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
@import "shadcn/tailwind.css";
|
|
4
|
+
@import "@fontsource-variable/inter";
|
|
5
|
+
|
|
6
|
+
@custom-variant dark (&:is(.dark *));
|
|
7
|
+
|
|
8
|
+
/* ==========================================================================
|
|
9
|
+
DESIGN TOKENS: the single source of truth.
|
|
10
|
+
Every color, radius, shadow and layout spacing value used by the app is
|
|
11
|
+
defined here as a CSS variable. Components only reference these tokens
|
|
12
|
+
(through Tailwind utilities such as bg-primary, text-muted-foreground).
|
|
13
|
+
|
|
14
|
+
Brand color: change --brand / --brand-foreground below, or set `brand` in
|
|
15
|
+
src/app.config.ts (applied at runtime, overrides the default here).
|
|
16
|
+
========================================================================== */
|
|
17
|
+
|
|
18
|
+
/* `.light` / `.dark` on any element scope its subtree to that theme (e.g. logo previews). */
|
|
19
|
+
:root,
|
|
20
|
+
.light {
|
|
21
|
+
/* ---- Brand (one accent color) ---- */
|
|
22
|
+
--brand: oklch(0.585 0.233 277.117); /* indigo */
|
|
23
|
+
--brand-foreground: oklch(1 0 0);
|
|
24
|
+
|
|
25
|
+
/* ---- Surfaces ---- */
|
|
26
|
+
--canvas: oklch(0.974 0.004 84.6); /* warm off-white app background, sidebar sits on it */
|
|
27
|
+
--background: oklch(1 0 0); /* floating content panel */
|
|
28
|
+
--foreground: oklch(0.17 0.004 84.6);
|
|
29
|
+
--card: oklch(1 0 0);
|
|
30
|
+
--card-foreground: var(--foreground);
|
|
31
|
+
--popover: oklch(1 0 0);
|
|
32
|
+
--popover-foreground: var(--foreground);
|
|
33
|
+
--raised: oklch(1 0 0); /* active nav pill, segmented controls */
|
|
34
|
+
|
|
35
|
+
/* ---- Neutrals ---- */
|
|
36
|
+
--secondary: oklch(0.968 0.002 84.6);
|
|
37
|
+
--secondary-foreground: var(--foreground);
|
|
38
|
+
--muted: oklch(0.968 0.002 84.6);
|
|
39
|
+
--muted-foreground: oklch(0.5 0.005 84.6);
|
|
40
|
+
--accent: oklch(0.556 0 0 / 8%);
|
|
41
|
+
--accent-foreground: var(--foreground);
|
|
42
|
+
--fill-1: oklch(0.556 0.005 84.6 / 5%);
|
|
43
|
+
--fill-2: oklch(0.556 0.005 84.6 / 8%);
|
|
44
|
+
--fill-3: oklch(0.556 0.005 84.6 / 12%);
|
|
45
|
+
--fill-4: oklch(0.556 0.005 84.6 / 16%);
|
|
46
|
+
|
|
47
|
+
/* ---- Lines & controls (1px hairlines) ---- */
|
|
48
|
+
--border: oklch(0.17 0.004 84.6 / 9%);
|
|
49
|
+
--input: oklch(0.17 0.004 84.6 / 10%);
|
|
50
|
+
--field: oklch(0.556 0 0 / 2.5%);
|
|
51
|
+
--field-border: oklch(0.17 0.004 84.6 / 11%);
|
|
52
|
+
--control: oklch(1 0 0);
|
|
53
|
+
--control-hover: oklch(0.985 0.002 84.6);
|
|
54
|
+
--control-border: oklch(0.17 0.004 84.6 / 11%);
|
|
55
|
+
|
|
56
|
+
/* ---- Brand-driven roles ---- */
|
|
57
|
+
--primary: var(--brand);
|
|
58
|
+
--primary-foreground: var(--brand-foreground);
|
|
59
|
+
--ring: var(--brand);
|
|
60
|
+
--selection: color-mix(in oklch, var(--brand) 18%, transparent);
|
|
61
|
+
|
|
62
|
+
/* ---- Semantic (only where they carry meaning) ---- */
|
|
63
|
+
--success: oklch(0.627 0.17 149.2);
|
|
64
|
+
--warning: oklch(0.75 0.16 70);
|
|
65
|
+
--danger: oklch(0.6 0.22 25.3);
|
|
66
|
+
--info: oklch(0.62 0.19 255);
|
|
67
|
+
--destructive: var(--danger);
|
|
68
|
+
--destructive-foreground: oklch(0.505 0.213 27.518);
|
|
69
|
+
|
|
70
|
+
/* ---- Sidebar (sits on the canvas) ---- */
|
|
71
|
+
--sidebar: var(--canvas);
|
|
72
|
+
--sidebar-foreground: var(--foreground);
|
|
73
|
+
--sidebar-primary: var(--brand);
|
|
74
|
+
--sidebar-primary-foreground: var(--brand-foreground);
|
|
75
|
+
--sidebar-accent: var(--fill-2);
|
|
76
|
+
--sidebar-accent-foreground: var(--foreground);
|
|
77
|
+
--sidebar-border: var(--border);
|
|
78
|
+
--sidebar-ring: var(--brand);
|
|
79
|
+
|
|
80
|
+
/* ---- Charts (series 1 follows the brand) ---- */
|
|
81
|
+
--chart-1: var(--brand);
|
|
82
|
+
--chart-2: oklch(0.72 0.01 84.6);
|
|
83
|
+
--chart-3: oklch(0.837 0.128 66.29);
|
|
84
|
+
--chart-4: oklch(0.765 0.177 163.223);
|
|
85
|
+
--chart-5: oklch(0.511 0.096 186.391);
|
|
86
|
+
--chart-6: oklch(0.97 0 0);
|
|
87
|
+
--chart-7: oklch(0.718 0.202 349.761);
|
|
88
|
+
--chart-8: oklch(0.811 0.111 293.571);
|
|
89
|
+
--chart-9: oklch(0.841 0.238 128.85);
|
|
90
|
+
--chart-10: oklch(0.5 0.134 242.749);
|
|
91
|
+
|
|
92
|
+
/* ---- Radius (12–16px for surfaces) ---- */
|
|
93
|
+
--radius: 0.75rem; /* 12px: cards, inputs groups */
|
|
94
|
+
--radius-panel: 1rem; /* 16px: floating content panel, large cards */
|
|
95
|
+
|
|
96
|
+
/* ---- Shadows (very soft) ---- */
|
|
97
|
+
--shadow-card: 0 1px 2px 0 oklch(0.3 0.01 84.6 / 4%);
|
|
98
|
+
--shadow-panel: 0 1px 2px 0 oklch(0.3 0.01 84.6 / 4%), 0 4px 16px -4px oklch(0.3 0.01 84.6 / 5%);
|
|
99
|
+
--shadow-raised: 0 1px 2px 0 oklch(0.3 0.01 84.6 / 6%), 0 1px 1px -1px oklch(0.3 0.01 84.6 / 6%);
|
|
100
|
+
--shadow-popover: 0 10px 24px -6px oklch(0.2 0.01 84.6 / 10%), 0 2px 6px -2px oklch(0.2 0.01 84.6 / 6%);
|
|
101
|
+
--shadow-dialog: 0 24px 48px -12px oklch(0.2 0.01 84.6 / 16%);
|
|
102
|
+
|
|
103
|
+
/* ---- Layout spacing ---- */
|
|
104
|
+
--panel-inset: 0.5rem; /* gap between content panel and canvas edges */
|
|
105
|
+
--page-gutter: 1.5rem; /* horizontal padding inside the content panel */
|
|
106
|
+
--page-gutter-mobile: 1rem;
|
|
107
|
+
--page-max-width: 80rem;
|
|
108
|
+
--topbar-height: 3.25rem;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.dark {
|
|
112
|
+
--brand-foreground: oklch(1 0 0);
|
|
113
|
+
|
|
114
|
+
--canvas: oklch(0.155 0.003 84.6);
|
|
115
|
+
--background: oklch(0.195 0.003 84.6);
|
|
116
|
+
--foreground: oklch(0.975 0.002 84.6);
|
|
117
|
+
--card: oklch(0.215 0.003 84.6);
|
|
118
|
+
--popover: oklch(0.235 0.003 84.6);
|
|
119
|
+
--raised: oklch(0.26 0.003 84.6);
|
|
120
|
+
|
|
121
|
+
--secondary: oklch(0.235 0.003 84.6);
|
|
122
|
+
--muted: oklch(0.235 0.003 84.6);
|
|
123
|
+
--muted-foreground: oklch(0.7 0.005 84.6);
|
|
124
|
+
--accent: oklch(1 0 0 / 8%);
|
|
125
|
+
--fill-1: oklch(1 0 0 / 4%);
|
|
126
|
+
--fill-2: oklch(1 0 0 / 7%);
|
|
127
|
+
--fill-3: oklch(1 0 0 / 11%);
|
|
128
|
+
--fill-4: oklch(1 0 0 / 15%);
|
|
129
|
+
|
|
130
|
+
--border: oklch(1 0 0 / 8%);
|
|
131
|
+
--input: oklch(1 0 0 / 10%);
|
|
132
|
+
--field: oklch(1 0 0 / 3%);
|
|
133
|
+
--field-border: oklch(1 0 0 / 12%);
|
|
134
|
+
--control: oklch(0.235 0.003 84.6);
|
|
135
|
+
--control-hover: oklch(0.26 0.003 84.6);
|
|
136
|
+
--control-border: oklch(1 0 0 / 10%);
|
|
137
|
+
|
|
138
|
+
--success: oklch(0.72 0.17 149.2);
|
|
139
|
+
--warning: oklch(0.8 0.15 70);
|
|
140
|
+
--danger: oklch(0.68 0.2 22);
|
|
141
|
+
--info: oklch(0.7 0.16 255);
|
|
142
|
+
--destructive-foreground: oklch(0.704 0.191 22.216);
|
|
143
|
+
|
|
144
|
+
--chart-2: oklch(0.45 0.005 84.6);
|
|
145
|
+
--chart-6: oklch(0.371 0 0);
|
|
146
|
+
|
|
147
|
+
--shadow-card: 0 1px 2px 0 oklch(0 0 0 / 20%);
|
|
148
|
+
--shadow-panel: 0 0 0 1px oklch(1 0 0 / 4%), 0 8px 24px -8px oklch(0 0 0 / 40%);
|
|
149
|
+
--shadow-raised: 0 1px 2px 0 oklch(0 0 0 / 30%);
|
|
150
|
+
--shadow-popover: 0 12px 28px -6px oklch(0 0 0 / 45%);
|
|
151
|
+
--shadow-dialog: 0 24px 48px -12px oklch(0 0 0 / 55%);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Map tokens to Tailwind utilities. Do not put raw values in components. */
|
|
155
|
+
@theme inline {
|
|
156
|
+
--font-sans: "Inter Variable", ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
157
|
+
--font-heading: var(--font-sans);
|
|
158
|
+
--font-mono: initial; /* no mono font: `font-mono` (used by vendored chart tooltips) is a no-op */
|
|
159
|
+
|
|
160
|
+
--color-canvas: var(--canvas);
|
|
161
|
+
--color-background: var(--background);
|
|
162
|
+
--color-foreground: var(--foreground);
|
|
163
|
+
--color-card: var(--card);
|
|
164
|
+
--color-card-foreground: var(--card-foreground);
|
|
165
|
+
--color-popover: var(--popover);
|
|
166
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
167
|
+
--color-raised: var(--raised);
|
|
168
|
+
--color-brand: var(--brand);
|
|
169
|
+
--color-brand-foreground: var(--brand-foreground);
|
|
170
|
+
--color-primary: var(--primary);
|
|
171
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
172
|
+
--color-secondary: var(--secondary);
|
|
173
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
174
|
+
--color-muted: var(--muted);
|
|
175
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
176
|
+
--color-accent: var(--accent);
|
|
177
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
178
|
+
--color-fill-1: var(--fill-1);
|
|
179
|
+
--color-fill-2: var(--fill-2);
|
|
180
|
+
--color-fill-3: var(--fill-3);
|
|
181
|
+
--color-fill-4: var(--fill-4);
|
|
182
|
+
--color-border: var(--border);
|
|
183
|
+
--color-input: var(--input);
|
|
184
|
+
--color-field: var(--field);
|
|
185
|
+
--color-field-border: var(--field-border);
|
|
186
|
+
--color-control: var(--control);
|
|
187
|
+
--color-control-hover: var(--control-hover);
|
|
188
|
+
--color-control-border: var(--control-border);
|
|
189
|
+
--color-ring: var(--ring);
|
|
190
|
+
--color-success: var(--success);
|
|
191
|
+
--color-warning: var(--warning);
|
|
192
|
+
--color-danger: var(--danger);
|
|
193
|
+
--color-info: var(--info);
|
|
194
|
+
--color-destructive: var(--destructive);
|
|
195
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
196
|
+
--color-sidebar: var(--sidebar);
|
|
197
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
198
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
199
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
200
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
201
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
202
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
203
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
204
|
+
--color-chart-1: var(--chart-1);
|
|
205
|
+
--color-chart-2: var(--chart-2);
|
|
206
|
+
--color-chart-3: var(--chart-3);
|
|
207
|
+
--color-chart-4: var(--chart-4);
|
|
208
|
+
--color-chart-5: var(--chart-5);
|
|
209
|
+
--color-chart-6: var(--chart-6);
|
|
210
|
+
--color-chart-7: var(--chart-7);
|
|
211
|
+
--color-chart-8: var(--chart-8);
|
|
212
|
+
--color-chart-9: var(--chart-9);
|
|
213
|
+
--color-chart-10: var(--chart-10);
|
|
214
|
+
|
|
215
|
+
/* Radius ladder (SortUI components use these names) */
|
|
216
|
+
--radius-xs: 0.25rem;
|
|
217
|
+
--radius-sm: 0.375rem;
|
|
218
|
+
--radius-md: 0.5rem;
|
|
219
|
+
--radius-lg: 0.625rem;
|
|
220
|
+
--radius-xl: var(--radius); /* 12px */
|
|
221
|
+
--radius-14: 0.875rem;
|
|
222
|
+
--radius-2xl: var(--radius-panel); /* 16px */
|
|
223
|
+
--radius-3xl: var(--radius-panel); /* cards: capped at 16px */
|
|
224
|
+
--radius-4xl: 1.5rem;
|
|
225
|
+
|
|
226
|
+
/* Shadow ladder */
|
|
227
|
+
--shadow-2xs: 0 1px 1px -1px oklch(0 0 0 / 5%);
|
|
228
|
+
--shadow-xs: 0 1px 2px 0 oklch(0 0 0 / 4%);
|
|
229
|
+
--shadow-sm: var(--shadow-card);
|
|
230
|
+
--shadow-md: 0 4px 8px -2px oklch(0 0 0 / 5%), 0 2px 4px -2px oklch(0 0 0 / 4%);
|
|
231
|
+
--shadow-lg: var(--shadow-popover);
|
|
232
|
+
--shadow-xl: var(--shadow-dialog);
|
|
233
|
+
--shadow-2xl: var(--shadow-dialog);
|
|
234
|
+
--shadow-secondary-control: inset 0 -1px 0 oklch(0 0 0 / 6%), 0 1px 2px -1px oklch(0 0 0 / 4%);
|
|
235
|
+
|
|
236
|
+
/* Type scale (SortUI) */
|
|
237
|
+
--text-2xs: 0.75rem;
|
|
238
|
+
--text-2xs--line-height: calc(1 / 0.75);
|
|
239
|
+
--text-2xs--letter-spacing: -0.005em;
|
|
240
|
+
--text-xs: 0.8125rem;
|
|
241
|
+
--text-xs--line-height: calc(1.25 / 0.8125);
|
|
242
|
+
--text-xs--letter-spacing: -0.005em;
|
|
243
|
+
--text-sm--letter-spacing: -0.005em;
|
|
244
|
+
--text-lg--letter-spacing: -0.005em;
|
|
245
|
+
--text-xl--letter-spacing: -0.01em;
|
|
246
|
+
--text-2xl--letter-spacing: -0.015em;
|
|
247
|
+
--text-3xl--letter-spacing: -0.02em;
|
|
248
|
+
--text-4xl--letter-spacing: -0.025em;
|
|
249
|
+
--text-5xl: 2.5rem;
|
|
250
|
+
--text-5xl--line-height: calc(2.75 / 2.5);
|
|
251
|
+
--text-5xl--letter-spacing: -0.025em;
|
|
252
|
+
--text-6xl: 3rem;
|
|
253
|
+
--text-6xl--line-height: 1;
|
|
254
|
+
--text-6xl--letter-spacing: -0.03em;
|
|
255
|
+
--text-7xl: 3.75rem;
|
|
256
|
+
--text-7xl--line-height: 1;
|
|
257
|
+
--text-7xl--letter-spacing: -0.035em;
|
|
258
|
+
--font-weight-540: 540;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* Small uppercase label (Inter): sidebar groups, card eyebrows, table headers */
|
|
262
|
+
@utility label-caps {
|
|
263
|
+
font-size: 0.6875rem;
|
|
264
|
+
line-height: 1rem;
|
|
265
|
+
font-weight: 500;
|
|
266
|
+
letter-spacing: 0.06em;
|
|
267
|
+
text-transform: uppercase;
|
|
268
|
+
color: var(--muted-foreground);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* Horizontal scrollers (mobile sub-nav, tab lists): scrollable without a visible bar */
|
|
272
|
+
@utility scrollbar-none {
|
|
273
|
+
scrollbar-width: none;
|
|
274
|
+
&::-webkit-scrollbar {
|
|
275
|
+
display: none;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
@layer base {
|
|
280
|
+
* {
|
|
281
|
+
@apply border-border outline-ring/50;
|
|
282
|
+
}
|
|
283
|
+
html {
|
|
284
|
+
@apply font-sans antialiased;
|
|
285
|
+
color-scheme: light;
|
|
286
|
+
}
|
|
287
|
+
html.dark {
|
|
288
|
+
color-scheme: dark;
|
|
289
|
+
}
|
|
290
|
+
body {
|
|
291
|
+
@apply bg-canvas text-foreground;
|
|
292
|
+
font-feature-settings: "cv11", "ss01";
|
|
293
|
+
}
|
|
294
|
+
/* Inter is the only font: keyboard hints and inline code don't switch to a monospace face */
|
|
295
|
+
code,
|
|
296
|
+
kbd,
|
|
297
|
+
samp,
|
|
298
|
+
pre {
|
|
299
|
+
font-family: inherit;
|
|
300
|
+
}
|
|
301
|
+
::selection {
|
|
302
|
+
background: var(--selection);
|
|
303
|
+
}
|
|
304
|
+
:focus-visible {
|
|
305
|
+
outline-color: var(--ring);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/* Overlays: soft dim, no blur (no glassmorphism). Unlayered so it wins over
|
|
310
|
+
the SortUI defaults without editing vendored components. */
|
|
311
|
+
[data-slot="dialog-overlay"],
|
|
312
|
+
[data-slot="alert-dialog-overlay"],
|
|
313
|
+
[data-slot="sheet-overlay"] {
|
|
314
|
+
backdrop-filter: none;
|
|
315
|
+
background-color: oklch(0.2 0.01 84.6 / 22%);
|
|
316
|
+
}
|
|
317
|
+
.dark [data-slot="dialog-overlay"],
|
|
318
|
+
.dark [data-slot="alert-dialog-overlay"],
|
|
319
|
+
.dark [data-slot="sheet-overlay"] {
|
|
320
|
+
background-color: oklch(0 0 0 / 50%);
|
|
321
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { cn } from "cn"
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/** Settings → My account: profile, security, notifications, preferences. */
|
|
2
|
+
export default {
|
|
3
|
+
profile: {
|
|
4
|
+
title: 'Profile',
|
|
5
|
+
description: 'Your personal details and how teammates see you.',
|
|
6
|
+
saved: 'Profile saved',
|
|
7
|
+
saveFailed: 'Could not save your profile',
|
|
8
|
+
photo: {
|
|
9
|
+
title: 'Photo',
|
|
10
|
+
description: 'PNG, JPG or WebP, up to 2 MB.',
|
|
11
|
+
change: 'Change photo',
|
|
12
|
+
tooLarge: 'The image is larger than 2 MB.',
|
|
13
|
+
invalidType: 'Choose a PNG, JPG, WebP or SVG image.',
|
|
14
|
+
},
|
|
15
|
+
personal: {
|
|
16
|
+
title: 'Personal information',
|
|
17
|
+
description: 'Shown in the sidebar, on activity you create and to your team.',
|
|
18
|
+
firstName: 'First name',
|
|
19
|
+
lastName: 'Last name',
|
|
20
|
+
jobTitle: 'Job title',
|
|
21
|
+
jobTitlePlaceholder: 'e.g. Operations lead',
|
|
22
|
+
},
|
|
23
|
+
contact: {
|
|
24
|
+
title: 'Contact',
|
|
25
|
+
description: 'Changing your email requires verification before it takes effect.',
|
|
26
|
+
email: 'Email',
|
|
27
|
+
phone: 'Phone',
|
|
28
|
+
phoneHint: 'Optional. Used for account recovery.',
|
|
29
|
+
countryCode: 'Country code',
|
|
30
|
+
phoneInvalid: 'Enter a valid phone number for {{country}}',
|
|
31
|
+
emailTaken: 'This email is already used by another account',
|
|
32
|
+
},
|
|
33
|
+
pending: {
|
|
34
|
+
title: 'Verification pending',
|
|
35
|
+
description: 'We sent a link to <b>{{email}}</b>. Your current email stays active until you confirm.',
|
|
36
|
+
resend: 'Resend link',
|
|
37
|
+
resent: 'Verification link sent to {{email}}',
|
|
38
|
+
cancel: 'Cancel change',
|
|
39
|
+
cancelled: 'Email change cancelled',
|
|
40
|
+
simulate: 'Mark as verified (demo)',
|
|
41
|
+
verified: 'Email updated to {{email}}',
|
|
42
|
+
started: 'Check {{email}} to confirm the change',
|
|
43
|
+
},
|
|
44
|
+
role: {
|
|
45
|
+
title: 'Role',
|
|
46
|
+
description: 'Assigned by an admin. It controls what you can see and change.',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
security: {
|
|
50
|
+
title: 'Security',
|
|
51
|
+
description: 'Password, two-factor authentication and where you are signed in.',
|
|
52
|
+
password: {
|
|
53
|
+
title: 'Password',
|
|
54
|
+
description: 'Last changed {{when}}.',
|
|
55
|
+
current: 'Current password',
|
|
56
|
+
new: 'New password',
|
|
57
|
+
confirm: 'Confirm new password',
|
|
58
|
+
submit: 'Update password',
|
|
59
|
+
updated: 'Password updated',
|
|
60
|
+
mismatch: 'Passwords don’t match',
|
|
61
|
+
sameAsCurrent: 'Choose a password different from the current one',
|
|
62
|
+
wrongCurrent: 'The current password is incorrect',
|
|
63
|
+
rules: {
|
|
64
|
+
minLength: 'At least {{count}} characters',
|
|
65
|
+
uppercase: 'An uppercase letter',
|
|
66
|
+
number: 'A number',
|
|
67
|
+
symbol: 'A symbol',
|
|
68
|
+
},
|
|
69
|
+
notMet: 'The password doesn’t meet the requirements',
|
|
70
|
+
strength: {
|
|
71
|
+
label: 'Strength',
|
|
72
|
+
tooWeak: 'Too weak',
|
|
73
|
+
weak: 'Weak',
|
|
74
|
+
fair: 'Fair',
|
|
75
|
+
good: 'Good',
|
|
76
|
+
strong: 'Strong',
|
|
77
|
+
},
|
|
78
|
+
show: 'Show password',
|
|
79
|
+
hide: 'Hide password',
|
|
80
|
+
},
|
|
81
|
+
twoFactor: {
|
|
82
|
+
title: 'Two-factor authentication',
|
|
83
|
+
description: 'Require a code from an authenticator app when you sign in.',
|
|
84
|
+
enabled: 'Enabled',
|
|
85
|
+
disabled: 'Off',
|
|
86
|
+
enabledSince: 'Enabled {{when}}',
|
|
87
|
+
required: 'Required by your company',
|
|
88
|
+
enable: 'Set up',
|
|
89
|
+
disable: 'Turn off',
|
|
90
|
+
disableConfirmTitle: 'Turn off two-factor authentication?',
|
|
91
|
+
disableConfirmDescription: 'Your account will be protected by your password only.',
|
|
92
|
+
disabledToast: 'Two-factor authentication turned off',
|
|
93
|
+
cannotDisable: 'Your company requires two-factor authentication.',
|
|
94
|
+
dialog: {
|
|
95
|
+
title: 'Set up two-factor authentication',
|
|
96
|
+
scanStep: 'Scan this QR code with an authenticator app such as 1Password, Google Authenticator or Authy.',
|
|
97
|
+
manual: 'Can’t scan? Enter this key manually:',
|
|
98
|
+
qrLabel: 'QR code for your authenticator app',
|
|
99
|
+
codeLabel: 'Six-digit code',
|
|
100
|
+
codeHint: 'Enter the code shown in the app. Demo: any six digits work.',
|
|
101
|
+
codeInvalid: 'Enter the six-digit code',
|
|
102
|
+
verify: 'Verify and enable',
|
|
103
|
+
recoveryTitle: 'Save your recovery codes',
|
|
104
|
+
recoveryDescription: 'Each code works once if you lose access to your authenticator app. Store them somewhere safe.',
|
|
105
|
+
copyCodes: 'Copy codes',
|
|
106
|
+
done: 'Done',
|
|
107
|
+
enabledToast: 'Two-factor authentication is on',
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
sessions: {
|
|
111
|
+
title: 'Active sessions',
|
|
112
|
+
description: 'Devices currently signed in to your account.',
|
|
113
|
+
signOutOthers: 'Sign out other sessions',
|
|
114
|
+
signOutOthersConfirmTitle: 'Sign out all other sessions?',
|
|
115
|
+
signOutOthersConfirmDescription: 'Every device except this one will need to sign in again.',
|
|
116
|
+
signedOutOthers: 'Other sessions signed out',
|
|
117
|
+
revoke: 'Sign out',
|
|
118
|
+
revokeLabel: 'Sign out {{device}}',
|
|
119
|
+
revoked: '{{device}} signed out',
|
|
120
|
+
current: 'This device',
|
|
121
|
+
device: '{{browser}} on {{os}}',
|
|
122
|
+
lastActive: 'Active {{when}}',
|
|
123
|
+
none: 'No other active sessions',
|
|
124
|
+
},
|
|
125
|
+
history: {
|
|
126
|
+
title: 'Recent sign-ins',
|
|
127
|
+
description: 'The last sign-in attempts to your account.',
|
|
128
|
+
columns: { when: 'When', device: 'Device', location: 'Location', ip: 'IP address', result: 'Result' },
|
|
129
|
+
success: 'Successful',
|
|
130
|
+
failed: 'Failed',
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
notifications: {
|
|
134
|
+
title: 'Notifications',
|
|
135
|
+
description: 'Choose what you hear about and where.',
|
|
136
|
+
saved: 'Notification settings saved',
|
|
137
|
+
channels: { event: 'Event', email: 'Email', inApp: 'In-app' },
|
|
138
|
+
toggle: '{{channel}}: {{event}}',
|
|
139
|
+
groups: {
|
|
140
|
+
account: 'Account & security',
|
|
141
|
+
team: 'Team',
|
|
142
|
+
company: 'Company',
|
|
143
|
+
catalog: 'Catalog',
|
|
144
|
+
updates: 'Updates',
|
|
145
|
+
},
|
|
146
|
+
events: {
|
|
147
|
+
newSignIn: { label: 'New sign-in', description: 'Someone signs in to your account from a new device.' },
|
|
148
|
+
passwordChanged: { label: 'Password changed', description: 'Your password or two-factor settings change.' },
|
|
149
|
+
userJoined: { label: 'Team changes', description: 'Someone is invited, joins or leaves the company.' },
|
|
150
|
+
roleChanged: { label: 'Role changes', description: 'Your role or permissions change.' },
|
|
151
|
+
settingsChanged: { label: 'Settings changes', description: 'Company settings, branding or integrations change.' },
|
|
152
|
+
lowStock: { label: 'Low stock', description: 'Active products run low on stock.' },
|
|
153
|
+
productChanged: { label: 'Product changes', description: 'Products are created, edited or deleted.' },
|
|
154
|
+
weeklySummary: { label: 'Weekly summary', description: 'A short report every Monday morning.' },
|
|
155
|
+
announcements: { label: 'Product news', description: 'New features and tips. Rarely.' },
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
preferences: {
|
|
159
|
+
title: 'Preferences',
|
|
160
|
+
description: 'How the app looks and formats information for you. Changes apply immediately.',
|
|
161
|
+
appearance: { title: 'Appearance', description: 'Follows your system setting by default.' },
|
|
162
|
+
language: { title: 'Language', description: 'Used for the interface, emails and formats.' },
|
|
163
|
+
region: {
|
|
164
|
+
title: 'Date & time',
|
|
165
|
+
description: 'How dates and times are shown across the app.',
|
|
166
|
+
timeZone: 'Time zone',
|
|
167
|
+
auto: 'Automatic ({{zone}})',
|
|
168
|
+
dateFormat: 'Date format',
|
|
169
|
+
dateAuto: 'Language default ({{example}})',
|
|
170
|
+
example: 'Example: {{value}}',
|
|
171
|
+
},
|
|
172
|
+
sidebar: {
|
|
173
|
+
title: 'Sidebar',
|
|
174
|
+
description: 'How the sidebar starts when you open the app.',
|
|
175
|
+
remember: 'Remember last',
|
|
176
|
+
expanded: 'Expanded',
|
|
177
|
+
collapsed: 'Collapsed',
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Sign-in screen and session messages. */
|
|
2
|
+
export default {
|
|
3
|
+
signIn: {
|
|
4
|
+
title: 'Sign in',
|
|
5
|
+
heading: 'Welcome back',
|
|
6
|
+
description: 'Sign in to your {{name}} account',
|
|
7
|
+
email: 'Email',
|
|
8
|
+
password: 'Password',
|
|
9
|
+
submit: 'Continue',
|
|
10
|
+
demo: 'Demo mode: any password works. Sign in as owner@, admin@, editor@ or viewer@{{domain}} to try a role.',
|
|
11
|
+
invalid: 'The email or password is incorrect.',
|
|
12
|
+
welcome: 'Welcome, {{name}}',
|
|
13
|
+
failed: 'Sign in failed',
|
|
14
|
+
passwordRequired: 'Enter your password',
|
|
15
|
+
invitationOnly: 'Accounts are created by invitation. Ask an admin of your workspace to invite you.',
|
|
16
|
+
inactive: 'This account is not active. Ask an admin to reactivate it or accept your invitation first.',
|
|
17
|
+
},
|
|
18
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/** Shared strings: shell, navigation, actions, states, tables, validation. */
|
|
2
|
+
export default {
|
|
3
|
+
app: {
|
|
4
|
+
tagline: 'Admin template',
|
|
5
|
+
},
|
|
6
|
+
nav: {
|
|
7
|
+
groups: {
|
|
8
|
+
overview: 'Overview',
|
|
9
|
+
catalog: 'Catalog',
|
|
10
|
+
content: 'Content',
|
|
11
|
+
system: 'System',
|
|
12
|
+
},
|
|
13
|
+
dashboard: 'Dashboard',
|
|
14
|
+
settings: 'Settings',
|
|
15
|
+
notFound: 'Not found',
|
|
16
|
+
noAccess: 'No access',
|
|
17
|
+
},
|
|
18
|
+
roles: {
|
|
19
|
+
owner: 'Owner',
|
|
20
|
+
admin: 'Admin',
|
|
21
|
+
editor: 'Editor',
|
|
22
|
+
viewer: 'Viewer',
|
|
23
|
+
},
|
|
24
|
+
plans: {
|
|
25
|
+
personal: 'Personal',
|
|
26
|
+
business: 'Business',
|
|
27
|
+
team: 'Team',
|
|
28
|
+
},
|
|
29
|
+
shell: {
|
|
30
|
+
workspaces: 'Workspaces',
|
|
31
|
+
switchWorkspace: 'Switch workspace',
|
|
32
|
+
addWorkspace: 'Add workspace',
|
|
33
|
+
accountMenu: 'Account menu',
|
|
34
|
+
profile: 'Profile',
|
|
35
|
+
signOut: 'Sign out',
|
|
36
|
+
search: 'Search',
|
|
37
|
+
searchShortcut: 'Search ({{shortcut}})',
|
|
38
|
+
toggleSidebar: 'Toggle sidebar',
|
|
39
|
+
breadcrumb: 'Breadcrumb',
|
|
40
|
+
devRole: 'Dev: role',
|
|
41
|
+
devRoleHint: 'Development only. Signs in as the mock user with this role.',
|
|
42
|
+
devSwitched: 'Signed in as {{name}} ({{role}})',
|
|
43
|
+
},
|
|
44
|
+
/** Screen-reader text inside vendored SortUI components. */
|
|
45
|
+
a11y: {
|
|
46
|
+
sidebar: 'Navigation',
|
|
47
|
+
sidebarDescription: 'Main navigation and account menu',
|
|
48
|
+
loading: 'Loading',
|
|
49
|
+
more: 'More',
|
|
50
|
+
morePages: 'More pages',
|
|
51
|
+
pagination: 'Pagination',
|
|
52
|
+
previous: 'Previous',
|
|
53
|
+
next: 'Next',
|
|
54
|
+
previousPage: 'Go to previous page',
|
|
55
|
+
nextPage: 'Go to next page',
|
|
56
|
+
},
|
|
57
|
+
command: {
|
|
58
|
+
title: 'Search',
|
|
59
|
+
description: 'Jump to a page or run a command',
|
|
60
|
+
placeholder: 'Search pages and actions…',
|
|
61
|
+
empty: 'No results.',
|
|
62
|
+
pages: 'Pages',
|
|
63
|
+
actions: 'Actions',
|
|
64
|
+
preferences: 'Preferences',
|
|
65
|
+
},
|
|
66
|
+
actions: {
|
|
67
|
+
back: 'Back',
|
|
68
|
+
save: 'Save',
|
|
69
|
+
saveChanges: 'Save changes',
|
|
70
|
+
cancel: 'Cancel',
|
|
71
|
+
confirm: 'Confirm',
|
|
72
|
+
delete: 'Delete',
|
|
73
|
+
edit: 'Edit',
|
|
74
|
+
view: 'View',
|
|
75
|
+
retry: 'Try again',
|
|
76
|
+
clear: 'Clear',
|
|
77
|
+
close: 'Close',
|
|
78
|
+
copy: 'Copy',
|
|
79
|
+
copied: 'Copied',
|
|
80
|
+
continue: 'Continue',
|
|
81
|
+
upload: 'Upload',
|
|
82
|
+
remove: 'Remove',
|
|
83
|
+
reset: 'Reset',
|
|
84
|
+
discard: 'Discard',
|
|
85
|
+
backToDashboard: 'Back to dashboard',
|
|
86
|
+
backHome: 'Back home',
|
|
87
|
+
},
|
|
88
|
+
states: {
|
|
89
|
+
loading: 'Loading…',
|
|
90
|
+
emptyTitle: 'Nothing here yet',
|
|
91
|
+
errorTitle: 'Something went wrong',
|
|
92
|
+
errorDescription: 'Please try again in a moment.',
|
|
93
|
+
notFoundTitle: 'Not found',
|
|
94
|
+
notFoundDescription: 'It may have been deleted, or the link is wrong.',
|
|
95
|
+
readOnly: 'You can view these settings but not change them.',
|
|
96
|
+
},
|
|
97
|
+
table: {
|
|
98
|
+
search: 'Search…',
|
|
99
|
+
noResults: 'No results found',
|
|
100
|
+
range: '{{from}}–{{to}} of {{total}} {{noun}}',
|
|
101
|
+
results: 'results',
|
|
102
|
+
rows: 'Rows',
|
|
103
|
+
rowsPerPage: 'Rows per page',
|
|
104
|
+
page: '{{page}} / {{count}}',
|
|
105
|
+
previousPage: 'Previous page',
|
|
106
|
+
nextPage: 'Next page',
|
|
107
|
+
actions: 'Actions',
|
|
108
|
+
actionsFor: 'Actions for {{name}}',
|
|
109
|
+
selected: '{{count}} selected',
|
|
110
|
+
clearSelection: 'Clear selection',
|
|
111
|
+
selectAll: 'Select all rows on this page',
|
|
112
|
+
selectRow: 'Select row',
|
|
113
|
+
},
|
|
114
|
+
fields: {
|
|
115
|
+
pickDate: 'Pick a date',
|
|
116
|
+
search: 'Search…',
|
|
117
|
+
addFiles: 'Add files',
|
|
118
|
+
removeFile: 'Remove {{name}}',
|
|
119
|
+
},
|
|
120
|
+
form: {
|
|
121
|
+
unsaved: 'You have unsaved changes',
|
|
122
|
+
optional: 'Optional',
|
|
123
|
+
},
|
|
124
|
+
confirm: {
|
|
125
|
+
typeToConfirm: 'Type <b>{{value}}</b> to confirm.',
|
|
126
|
+
typeToConfirmLabel: 'Confirmation text',
|
|
127
|
+
},
|
|
128
|
+
theme: {
|
|
129
|
+
label: 'Theme',
|
|
130
|
+
change: 'Change theme',
|
|
131
|
+
light: 'Light',
|
|
132
|
+
dark: 'Dark',
|
|
133
|
+
system: 'System',
|
|
134
|
+
command: '{{theme}} theme',
|
|
135
|
+
},
|
|
136
|
+
language: {
|
|
137
|
+
label: 'Language',
|
|
138
|
+
change: 'Change language',
|
|
139
|
+
},
|
|
140
|
+
validation: {
|
|
141
|
+
required: 'This field is required',
|
|
142
|
+
email: 'Enter a valid email',
|
|
143
|
+
minChars: 'Use at least {{min}} characters',
|
|
144
|
+
maxChars: 'Keep it under {{max}} characters',
|
|
145
|
+
number: 'Enter a number',
|
|
146
|
+
integer: 'Whole numbers only',
|
|
147
|
+
nonNegative: 'Cannot be negative',
|
|
148
|
+
max: 'Must be {{max, number}} or less',
|
|
149
|
+
choose: 'Choose an option',
|
|
150
|
+
},
|
|
151
|
+
}
|