@rebasepro/app 0.15.0 → 0.16.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rebasepro/app",
3
3
  "type": "module",
4
- "version": "0.15.0",
4
+ "version": "0.16.0",
5
5
  "description": "Rebase core — framework-agnostic runtime for data-driven admin panels",
6
6
  "funding": {
7
7
  "url": "https://github.com/sponsors/rebaseco"
@@ -52,12 +52,12 @@
52
52
  "magic-string": "^0.30.0",
53
53
  "notistack": "^3.0.2",
54
54
  "react-i18next": "^17.0.11",
55
- "@rebasepro/admin-types": "0.15.0",
56
- "@rebasepro/common": "0.15.0",
57
- "@rebasepro/forms": "0.15.0",
58
- "@rebasepro/types": "0.15.0",
59
- "@rebasepro/ui": "0.15.0",
60
- "@rebasepro/utils": "0.15.0"
55
+ "@rebasepro/admin-types": "0.16.0",
56
+ "@rebasepro/forms": "0.16.0",
57
+ "@rebasepro/common": "0.16.0",
58
+ "@rebasepro/types": "0.16.0",
59
+ "@rebasepro/ui": "0.16.0",
60
+ "@rebasepro/utils": "0.16.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "react": ">=19.2.7",
@@ -383,7 +383,7 @@ active: false }
383
383
  </Tabs>
384
384
  {/* Section header pattern — used in all editor sidebars */}
385
385
  <div className={cls("p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900", defaultBorderMixin)}>
386
- <Typography variant="caption" className="font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark">TABLES</Typography>
386
+ <Typography variant="caption" className="font-semibold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark">TABLES</Typography>
387
387
  <IconButton size="small">
388
388
  <SettingsIcon size={iconSize.smallest}/>
389
389
  </IconButton>
@@ -444,7 +444,7 @@ active: false }
444
444
  <Tab value="history">History</Tab>
445
445
  </Tabs>
446
446
  <div className={cls("p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900", defaultBorderMixin)}>
447
- <Typography variant="caption" className="font-bold uppercase tracking-wider text-text-secondary dark:text-text-secondary-dark">TABLES</Typography>
447
+ <Typography variant="caption" className="font-semibold uppercase tracking-wider text-text-secondary dark:text-text-secondary-dark">TABLES</Typography>
448
448
  <IconButton size="small">
449
449
  <SettingsIcon size={iconSize.smallest}/>
450
450
  </IconButton>
@@ -478,7 +478,7 @@ active: false }
478
478
  <Tab value="info">Info</Tab>
479
479
  </Tabs>
480
480
  <div className={cls("p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900", defaultBorderMixin)}>
481
- <Typography variant="caption" className="font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark">RLS</Typography>
481
+ <Typography variant="caption" className="font-semibold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark">RLS</Typography>
482
482
  <IconButton size="small">
483
483
  <SettingsIcon size={iconSize.smallest}/>
484
484
  </IconButton>
@@ -511,7 +511,7 @@ enabled: false }].map(t => (
511
511
  <Typography variant="caption" color="secondary" className="block mb-1">Collection Editor Sidebar</Typography>
512
512
  <div className={cls("flex flex-col h-72 w-[240px] border rounded-lg overflow-hidden bg-white dark:bg-surface-950", defaultBorderMixin)}>
513
513
  <div className={cls("p-3 border-b flex justify-between items-center bg-surface-50 dark:bg-surface-900", defaultBorderMixin)}>
514
- <Typography variant="caption" className="font-bold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark">COLLECTIONS</Typography>
514
+ <Typography variant="caption" className="font-semibold uppercase tracking-wider text-text-disabled dark:text-text-disabled-dark">COLLECTIONS</Typography>
515
515
  <IconButton size="small">
516
516
  <PlusIcon size={iconSize.smallest}/>
517
517
  </IconButton>
@@ -75,7 +75,7 @@ function ProjectCard({ project, compact }: { project: SampleProject; compact?: b
75
75
  {!compact && (
76
76
  <div className={cls("flex items-center justify-between mt-2 pt-2 border-t", defaultBorderMixin)}>
77
77
  <div className="flex items-center gap-1.5">
78
- <div className="w-5 h-5 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[9px] font-bold">{project.assignee[0]}</div>
78
+ <div className="w-5 h-5 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[9px] font-semibold">{project.assignee[0]}</div>
79
79
  <Typography variant="caption" color="secondary" className="truncate max-w-[100px]">{project.assignee}</Typography>
80
80
  </div>
81
81
  <Typography variant="caption" className={cls("font-mono text-[10px]", isOverdue ? "text-red-500 font-semibold" : "text-surface-400")}>{project.dueDate}</Typography>
@@ -91,7 +91,7 @@ export function CollectionTableDemo() {
91
91
  <TableCell><div><Typography variant="body2" className="font-medium">{project.name}</Typography><Typography variant="caption" color="secondary" className="line-clamp-1">{project.description}</Typography></div></TableCell>
92
92
  <TableCell><Chip colorScheme={STATUS_CONFIG[project.status].color} size="small">{STATUS_CONFIG[project.status].label}</Chip></TableCell>
93
93
  <TableCell><Chip colorScheme={PRIORITY_CONFIG[project.priority].color} size="smallest" outlined>{PRIORITY_CONFIG[project.priority].label}</Chip></TableCell>
94
- <TableCell><div className="flex items-center gap-2"><div className="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[10px] font-bold shrink-0">{project.assignee[0]}</div><Typography variant="body2" className="truncate">{project.assignee}</Typography></div></TableCell>
94
+ <TableCell><div className="flex items-center gap-2"><div className="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[10px] font-semibold shrink-0">{project.assignee[0]}</div><Typography variant="body2" className="truncate">{project.assignee}</Typography></div></TableCell>
95
95
  <TableCell><div className="flex flex-wrap gap-1">{project.tags.map(tag => (<Chip key={tag} size="smallest" colorScheme="cyan">{tag}</Chip>))}</div></TableCell>
96
96
  <TableCell><Typography variant="body2" className="font-mono text-xs">{project.dueDate}</Typography></TableCell>
97
97
  <TableCell style={{ width: "80px" }}><div className="flex gap-1"><Tooltip title="Edit" asChild><IconButton size="smallest"><PencilIcon size={iconSize.smallest} /></IconButton></Tooltip><Tooltip title="Delete" asChild><IconButton size="smallest"><Trash2Icon size={iconSize.smallest} /></IconButton></Tooltip></div></TableCell>
@@ -36,7 +36,7 @@ function KanbanProjectCard({ item, isDragging, isGroupedOver, style }: BoardItem
36
36
  </div>
37
37
  <div className="flex items-center justify-between mt-1.5">
38
38
  <div className="flex items-center gap-1">
39
- <div className="w-4 h-4 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[8px] font-bold">{project.assignee[0]}</div>
39
+ <div className="w-4 h-4 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center text-[8px] font-semibold">{project.assignee[0]}</div>
40
40
  <Typography variant="caption" color="secondary" className="truncate max-w-[80px] text-[10px]">{project.assignee}</Typography>
41
41
  </div>
42
42
  <Typography variant="caption" className={cls("font-mono text-[10px]", isOverdue ? "text-red-500 font-semibold" : "text-surface-400")}>{project.dueDate}</Typography>
@@ -708,7 +708,7 @@ export function CrmDashboardDemo() {
708
708
  onClick={() => openClientDrawer(clientInfo.id)}
709
709
  >
710
710
  <div className="flex items-center gap-2.5">
711
- <div className="w-8 h-8 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center font-bold">
711
+ <div className="w-8 h-8 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-500 flex items-center justify-center font-semibold">
712
712
  {clientInfo.name[0].toUpperCase()}
713
713
  </div>
714
714
  <div className="flex-1 min-w-0">
@@ -758,7 +758,7 @@ export function CrmDashboardDemo() {
758
758
  return (
759
759
  <div className="flex-1 space-y-4">
760
760
  <div className="flex items-center gap-3">
761
- <div className="w-12 h-12 rounded-full bg-primary/10 text-primary dark:text-primary-light flex items-center justify-center text-xl font-bold">
761
+ <div className="w-12 h-12 rounded-full bg-primary/10 text-primary dark:text-primary-light flex items-center justify-center text-xl font-semibold">
762
762
  {client.name[0].toUpperCase()}
763
763
  </div>
764
764
  <div className="flex-1 min-w-0">
@@ -14,43 +14,43 @@ export function LanguageToggle() {
14
14
  </IconButton>}>
15
15
  <MenuItem onClick={() => i18n.changeLanguage("en")}>
16
16
  <div className="flex w-full items-center justify-between gap-4">
17
- <Typography variant="body2" className={i18n.language === "en" ? "font-bold" : ""}>English</Typography>
17
+ <Typography variant="body2" className={i18n.language === "en" ? "font-semibold" : ""}>English</Typography>
18
18
  {i18n.language === "en" && <CheckIcon size={iconSize.small}/>}
19
19
  </div>
20
20
  </MenuItem>
21
21
  <MenuItem onClick={() => i18n.changeLanguage("es")}>
22
22
  <div className="flex w-full items-center justify-between gap-4">
23
- <Typography variant="body2" className={i18n.language === "es" ? "font-bold" : ""}>Español</Typography>
23
+ <Typography variant="body2" className={i18n.language === "es" ? "font-semibold" : ""}>Español</Typography>
24
24
  {i18n.language === "es" && <CheckIcon size={iconSize.small}/>}
25
25
  </div>
26
26
  </MenuItem>
27
27
  <MenuItem onClick={() => i18n.changeLanguage("de")}>
28
28
  <div className="flex w-full items-center justify-between gap-4">
29
- <Typography variant="body2" className={i18n.language === "de" ? "font-bold" : ""}>Deutsch</Typography>
29
+ <Typography variant="body2" className={i18n.language === "de" ? "font-semibold" : ""}>Deutsch</Typography>
30
30
  {i18n.language === "de" && <CheckIcon size={iconSize.small}/>}
31
31
  </div>
32
32
  </MenuItem>
33
33
  <MenuItem onClick={() => i18n.changeLanguage("fr")}>
34
34
  <div className="flex w-full items-center justify-between gap-4">
35
- <Typography variant="body2" className={i18n.language === "fr" ? "font-bold" : ""}>Français</Typography>
35
+ <Typography variant="body2" className={i18n.language === "fr" ? "font-semibold" : ""}>Français</Typography>
36
36
  {i18n.language === "fr" && <CheckIcon size={iconSize.small}/>}
37
37
  </div>
38
38
  </MenuItem>
39
39
  <MenuItem onClick={() => i18n.changeLanguage("it")}>
40
40
  <div className="flex w-full items-center justify-between gap-4">
41
- <Typography variant="body2" className={i18n.language === "it" ? "font-bold" : ""}>Italiano</Typography>
41
+ <Typography variant="body2" className={i18n.language === "it" ? "font-semibold" : ""}>Italiano</Typography>
42
42
  {i18n.language === "it" && <CheckIcon size={iconSize.small}/>}
43
43
  </div>
44
44
  </MenuItem>
45
45
  <MenuItem onClick={() => i18n.changeLanguage("hi")}>
46
46
  <div className="flex w-full items-center justify-between gap-4">
47
- <Typography variant="body2" className={i18n.language === "hi" ? "font-bold" : ""}>हिन्दी</Typography>
47
+ <Typography variant="body2" className={i18n.language === "hi" ? "font-semibold" : ""}>हिन्दी</Typography>
48
48
  {i18n.language === "hi" && <CheckIcon size={iconSize.small}/>}
49
49
  </div>
50
50
  </MenuItem>
51
51
  <MenuItem onClick={() => i18n.changeLanguage("pt")}>
52
52
  <div className="flex w-full items-center justify-between gap-4">
53
- <Typography variant="body2" className={i18n.language === "pt" ? "font-bold" : ""}>Português</Typography>
53
+ <Typography variant="body2" className={i18n.language === "pt" ? "font-semibold" : ""}>Português</Typography>
54
54
  {i18n.language === "pt" && <CheckIcon size={iconSize.small}/>}
55
55
  </div>
56
56
  </MenuItem>
@@ -484,7 +484,7 @@ export function LoginView({
484
484
  {(title || subtitle) && (
485
485
  <div className="text-center mb-2">
486
486
  {title && (
487
- <Typography variant="h6" className="mb-0.5 font-bold">
487
+ <Typography variant="h6" className="mb-0.5 font-semibold">
488
488
  {title}
489
489
  </Typography>
490
490
  )}
@@ -17,12 +17,71 @@ export function RebaseLogo({
17
17
  version="1.1"
18
18
  style={style}
19
19
  className={className}
20
- viewBox="0 0 583 583" fill="none" xmlns="http://www.w3.org/2000/svg">
21
- <circle cx="291.5" cy="291.5" r="291.5" fill="#0070F4"/>
22
- <ellipse cx="292" cy="291.5" rx="173" ry="173.5" fill="#FF3773"/>
23
- <path
24
- d="M465 291.5C465 268.847 460.525 246.416 451.831 225.487C443.137 204.558 430.394 185.542 414.329 169.524C398.265 153.506 379.194 140.8 358.204 132.131C337.215 123.462 314.719 119 292 119C269.281 119 246.785 123.462 225.796 132.131C204.806 140.8 185.735 153.506 169.671 169.524C153.606 185.542 140.863 204.558 132.169 225.487C123.475 246.416 119 268.847 119 291.5L292 291.5H465Z"
25
- fill="#FFA400"/>
20
+ viewBox="112.1405 1079.711 306.058 306.058" fill="none" xmlns="http://www.w3.org/2000/svg">
21
+ <path fill="#34b6d9" d="M237.01 1087.234a56 56 0 0 1 56.07 0l83.819 48.473a56 56 0 0 1 27.965 48.477v97.108a56 56 0 0 1-27.965 48.477l-83.819 48.473a56 56 0 0 1-56.07 0l-83.818-48.473a56 56 0 0 1-27.965-48.477v-97.108a56 56 0 0 1 27.965-48.477Z"/>
22
+ <path fill="#358fd8" d="M264.64 1286.718c27.352 0 49.525 22.173 49.525 49.526 0 27.352-22.173 49.525-49.525 49.525-27.353 0-49.526-22.173-49.526-49.525Z"/>
23
+ <path fill="#ff9197" d="M174.941 1131.547c27.352 0 49.526 22.174 49.526 49.526s-22.174 49.526-49.526 49.526-49.526-22.174-49.526-49.526Z"/>
24
+ <path fill="#358fd8" d="M355.338 1131.547c27.352 0 49.526 22.174 49.526 49.526s-22.174 49.526-49.526 49.526-49.526-22.174-49.526-49.526Z"/>
25
+ <path fill="#fe9197" d="M125.227 1196.44v-14.661c0-13.35 7.55-20.303 17.99-18.168l56.424 31.13 2.72 1.572 27.643 31.545 35.193 30.52q.173 1.522.229 3.013l-54.046-11.395-28.464-26.045Z"/>
26
+ <path fill="#013afd" d="M151.207 1328.696c-14.348-8.285-25.98-28.432-25.98-45v-35.214l11.299-.401c.614.866 34.062 48.973 34.606 49.656.394.495 22.156 40.224 34.409 62.328Z"/>
27
+ <path fill="#2c09d1" d="m211.38 1249.996 30.436 6.417 9.53 9.1-2.926 15.797 16.939 30.08-14.049 6.672-35.072-10.288-33.83-61.32 9.09-.323Z"/>
28
+ <path fill="#2ac1cf" d="M240.774 1380.37a34 34 0 0 1-1.304-.716l-16.141-9.319-49.383-74.238 29.211 7.839Z"/>
29
+ <path fill="#2c42d0" d="m173.359 1219.393 9.557 4.558 28.464 26.045-19.883-3.865-12.782.453-31.643-13.936-15.11-11.819Z"/>
30
+ <path fill="#8b66ed" d="M257.113 1381.863c-4.336 2.13-10.043 1.783-16.34-1.493l-37.616-76.434 13.081 3.838Z"/>
31
+ <path fill="#2c09d1" d="m145.888 1247.749 7.224-.257 23.615 41.804 11.98 1.728-24.421-43.544-.014-.383 10.725-.38 28.16 57.219-29.211-7.839-7.37-11.08Z"/>
32
+ <path fill="#2ac1cf" d="M265.451 1311.554v53.1q0 .255-.004.505l-.25-.26-29.148-38.794-6.308-14.37 21.57 6.328 14.048-6.672Z"/>
33
+ <path fill="#fd485f" d="m223.329 1370.335-17.788-10.27c-12.253-22.104-34.015-61.833-34.41-62.328-.543-.683-33.991-48.79-34.605-49.656l9.362-.332 20.688 37.269Z"/>
34
+ <path fill="#2d42d0" d="m202.362 1196.313 37.108 21.424c13.11 7.57 23.953 25.043 25.727 40.641l-35.193-30.52Z"/>
35
+ <path fill="#2b0ad1" d="M265.447 1365.16c-.095 6.58-2.056 11.56-5.304 14.604l-39.936-70.826 9.534 2.797 6.308 14.37 29.148 38.794Z"/>
36
+ <path fill="#fe9196" d="M125.227 1240.59v-16.4l21.845 8.458 31.643 13.936-35.367 1.255Z"/>
37
+ <path fill="#8b66ed" d="m174.997 1246.716 7.411-.263 33.83 61.32-13.08-3.837Z"/>
38
+ <path fill="#2cc5d2" d="m153.112 1247.492 11.16-.395.014.383 24.421 43.544-11.98-1.728Z"/>
39
+ <path fill="#fc4962" d="M125.227 1224.19v-8.878l30.211-4.464 17.92 8.545-41.396 1.436 15.11 11.82Z"/>
40
+ <path fill="#fe475f" d="M265.451 1292.508v18.84l-.092.043-16.939-30.08 2.927-15.799.214.206Z"/>
41
+ <path fill="#2d43cd" d="M125.227 1215.312v-18.871l30.211 14.407Z"/>
42
+ <path fill="#2ac4d1" d="M260.143 1379.764a12.5 12.5 0 0 1-3.03 2.099l-40.875-74.09 3.969 1.165Z"/>
43
+ <path fill="#fe475f" d="M265.426 1261.391q.025.677.025 1.346v16.241l-13.89-13.26-.186-.36-.028.154-9.53-9.099Z"/>
44
+ <path fill="#40b6d9" d="M265.451 1278.978v13.53c-4.95-9.535-12.604-24.31-13.89-26.79Z"/>
45
+ <path fill="#013afd" d="M125.227 1248.482v-7.892l18.12 7.249Z"/>
46
+ <path fill="#fe9197" d="M143.217 1163.611c2.517.515 5.203 1.558 7.99 3.168l48.434 27.963Z"/>
47
+ <path fill="#fec404" d="m251.347 1265.512.028-.154.186.36Z"/>
48
+ <path fill="#ccc" d="M265.451 1311.347v.207l-.092-.163Z"/>
49
+ <path fill="#2fc7d5" d="M383.274 1164.17a31 31 0 0 1-3.887 2.64l-2.59 1.495-95.242 18.988-50.727-18.022 25.55-32.892 63.642 26.919-61.075-31.394Z"/>
50
+ <path fill="#320fdd" d="m215.866 1112.967 18.535-16.15 5.766 32.704 16.212 6.858-25.551 32.892-57.218-19.484Z"/>
51
+ <path fill="#fd4a61" d="m305.806 1094.328 73.58 42.482c7.16 4.134 10.748 9.55 10.757 14.968l-40.264-5.624-25.491-7.867-33.1-30.491-18.842-4.065Z"/>
52
+ <path fill="#fec504" d="M388.516 1158.077c-1.145 2.145-2.892 4.205-5.242 6.093l-124.33-32.266 6.47-29.689 25.874 5.58 33.1 30.492Z"/>
53
+ <path fill="#320fdd" d="m179.744 1183.464-26.935-15.551 18.147-15.813 55.184 23.206-15.732 20.252Z"/>
54
+ <path fill="#33b6d9" d="m358.403 1178.925-52.998 30.599-44.794-17.995 89.572-18.117Z"/>
55
+ <path fill="#fd4a63" d="m234.401 1096.817 12.723-11.087 19.395 11.42-7.574 34.754 61.075 31.394-79.853-33.777Z"/>
56
+ <path fill="#fe9197" d="m152.809 1167.913-1.91-1.103c-10.42-6.016-13.273-14.747-8.558-22.25l56.907-27.791 15.854-3.136Z"/>
57
+ <path fill="#8b69f1" d="m305.405 1209.524-14.281 8.245c-5.252 3.032-11.697 4.954-18.462 5.767l-43.574-25.631 31.523-6.376Z"/>
58
+ <path fill="#3015d8" d="M252.294 1080.973c13.06-2.81 28.331-1.183 38.83 4.879l14.682 8.476-33.36 9.403-7.031-1.516 1.104-5.064-19.395-11.42Z"/>
59
+ <path fill="#2c0ace" d="M239.162 1085.852c3.85-2.223 8.342-3.85 13.132-4.88l-37.192 32.66-15.854 3.137-56.907 27.791c1.777-2.828 4.63-5.482 8.559-7.75Z"/>
60
+ <path fill="#2fc7d5" d="m229.088 1197.905-8.773 1.774-9.907-4.121 15.732-20.252 37.462 15.618Z"/>
61
+ <path fill="#33b6d9" d="M272.662 1223.536c-11.721 1.407-24.402-.515-33.5-5.767l-28.093-16.22 18.019-3.644Z"/>
62
+ <path fill="#fe9197" d="m264.078 1190.828-.476.096-37.462-15.618 4.688-6.035 50.727 18.022ZM170.956 1152.1l2.654-2.313 57.218 19.484-4.688 6.035Z"/>
63
+ <path fill="#30c3d9" d="M390.143 1151.778c.01 2.125-.533 4.25-1.627 6.3l-38.637-11.924Z"/>
64
+ <path fill="#ff4c60" d="m211.07 1201.55-31.326-18.086 40.57 16.215Z"/>
65
+ <path fill="#2d08d0" d="m376.798 1168.305-18.395 10.62-8.22-5.513Z"/>
66
+ <path fill="#2fc7d5" d="M264.887 1262.737c0-16.568 11.632-36.715 25.98-45l40.425-23.339 11.932 35.4-25.718 46.274-26.284-2.855-1.382.145-1.411-.146-23.542.675Z"/>
67
+ <path fill="#32abd6" d="M383.486 1164.684c2.376-.909 4.642-1.382 6.752-1.446l-7.859 43.045-.292 5.18 8.911 13.519 5.344-41.78 4.102-15.889c2.942 3.164 4.667 8.084 4.667 14.466v91.585h-1.324c-1.104 3.308-34.555 60.887-34.486 61.007l-21.13 12.2 8.305-32.902-10.115 14.693 10.115-20.342 47.315-78.499-7.45 6.694-15.674 18.243 2.62-89.698.155-.059Z"/>
68
+ <path fill="#2eabd6" d="m324.54 1360.214-33.672 19.44c-13.695 7.907-24.915 2.15-25.91-12.796l8.385-12.077 47.855-71.354 7.12-26.81 5.119-9.209.57 31.212-13.987 50.442 6.42-5.847-2.408 22.126.459 8.254Z"/>
69
+ <path fill="#8b65f0" d="M264.959 1366.858a33 33 0 0 1-.072-2.204v-88.582l24.953-2.71 26.235 2.554 1.43.156 10.813-19.454-7.12 26.81-47.855 71.353Z"/>
70
+ <path fill="#fd4861" d="m378.764 1192.394 3.89-5.923c-1.987-.058-4.42 64.146-4.402 65.055.019.91-5.901 22.365-5.901 22.365l-17.658 29.778-14.983 14.696 9.72-45.149.036-1.115 6.455-7.894Z"/>
71
+ <path fill="#32abd6" d="m377.832 1167.529.229-.133.703 24.998-22.843 71.813-6.455 7.894.572-17.63-3.443-30.74Z"/>
72
+ <path fill="#8c66ef" d="m328.775 1297.488.034-.126 20.657-25.261-.036 1.115-9.72 45.15 14.983-14.697-13.8 22.045-16.86 19.627 2.407-22.126-6.42 5.847Z"/>
73
+ <path fill="#2c08d3" d="m331.292 1194.398 27.203-15.705 5.51 13.714-20.781 37.391Z"/>
74
+ <path fill="#300bd2" d="m324.491 1353.595-.459-8.254 16.861-19.627 13.8-22.045 17.658-29.778 20.08-31.948 3.91-5.728 7.45-6.694-47.315 78.5-10.115 20.341-21.821 31.852Z"/>
75
+ <path fill="#2c08d3" d="m333.437 1247.408 13.158-23.676 3.443 30.738-4.056 14.678-14.316 17.914 2.34-8.442Z"/>
76
+ <path fill="#8b68ef" d="M405.111 1273.364v10.332c0 16.568-11.632 36.715-25.98 45l-9.83 5.675c-.07-.12 33.382-57.7 34.486-61.007Z"/>
77
+ <path fill="#fec504" d="M390.238 1163.238c4.109-.125 7.625 1.3 10.206 4.075l-4.102 15.89-5.344 41.779-8.91-13.518.291-5.18Z"/>
78
+ <path fill="#300bd2" d="m348.171 1346.57-23.631 13.644 31.936-46.545Z"/>
79
+ <path fill="#348fd8" d="M372.35 1273.891s5.921-21.455 5.902-22.365 2.415-65.113 4.402-65.055l-1.987 67.987 15.675-18.243-3.91 5.728Z"/>
80
+ <path fill="#32abd6" d="m358.495 1178.693 19.337-11.164-13.827 24.878Z"/>
81
+ <path fill="#fd4861" d="m331.391 1288.05.275-.988 14.316-17.914 4.056-14.678-.572 17.63-20.657 25.262Z"/>
82
+ <path fill="#ccc" fillOpacity=".579" d="m378.06 1167.396 1.07-.617a31 31 0 0 1 4.158-2.019l-.634 21.71-3.89 5.924Z"/>
83
+ <path fill="#2fc7d5" d="M264.887 1276.072v-2.18l23.542-.676 1.411.146Z"/>
84
+ <path fill="#8b65f0" d="m291.193 1273.502-1.353-.14 1.382-.145 24.853 2.7Z"/>
26
85
  </svg>
27
86
  );
28
87
 
@@ -207,7 +207,7 @@ export function UserSelectPopover({
207
207
  )}
208
208
  <span className="max-w-[120px] truncate">{effectiveUserLabel}</span>
209
209
  {selectedUser && (
210
- <span className="text-[9px] text-amber-600 dark:text-amber-400 font-bold uppercase">
210
+ <span className="text-[9px] text-amber-600 dark:text-amber-400 font-semibold uppercase">
211
211
  impersonating
212
212
  </span>
213
213
  )}
@@ -225,7 +225,7 @@ export function UserSelectPopover({
225
225
  <div className={cls("px-3 py-2 border-b flex items-center justify-between shrink-0", defaultBorderMixin)}>
226
226
  <Typography
227
227
  variant="caption"
228
- className="font-bold uppercase tracking-wider text-[9px] text-text-disabled dark:text-text-disabled-dark"
228
+ className="font-semibold uppercase tracking-wider text-[9px] text-text-disabled dark:text-text-disabled-dark"
229
229
  >
230
230
  Run as user
231
231
  </Typography>
@@ -123,16 +123,30 @@ export function useDataTableController<M extends Record<string, any> = any, USER
123
123
  const [sortBy, setSortBy] = React.useState<OrderByTuple<Extract<keyof M, string> | (string & {})>[] | undefined>((updateUrl ? sortUrl : undefined) ?? sortInternal);
124
124
 
125
125
  // Sync filter/sort state from URL on browser navigation (back/forward).
126
- // Skip initial mount since useState initializers already handle URL params + collection defaults.
127
- const initialSearchRef = React.useRef<string | null>(location.search);
126
+ //
127
+ // Only ever on an actual *change* of the URL, which is not the same as "not
128
+ // the first run". `useUpdateUrl` writes with `window.history.replaceState`,
129
+ // which react-router does not observe, so the `location` read here keeps
130
+ // reporting the search string this view was mounted with — normally the
131
+ // empty one — no matter what the address bar says. The guard used to be a
132
+ // one-shot ref that skipped the first run and armed itself for every run
133
+ // after; the *second* run then parsed that unchanged, empty search and
134
+ // called `setSortBy(undefined)`, throwing away the collection's `sort`
135
+ // before anything had asked for a different one. Re-running is easy to
136
+ // trigger — this effect depends on `fixedFilter`, a prop most callers pass
137
+ // as a fresh object literal.
138
+ //
139
+ // The visible symptom was a collection that ignored its own default sort: it
140
+ // subscribed correctly, then immediately re-subscribed with no `orderBy` at
141
+ // all, and the second answer replaced the first.
142
+ const lastSyncedSearchRef = React.useRef<string>(location.search);
128
143
  useEffect(() => {
129
144
  if (!updateUrl) return;
130
- // Skip the initial mount - useState already set the correct values
131
- if (initialSearchRef.current !== null && initialSearchRef.current === location.search) {
132
- initialSearchRef.current = null;
133
- return;
134
- }
135
- initialSearchRef.current = null;
145
+ // Unchanged URL — including the initial mount, where the state
146
+ // initialisers have already applied the URL params and the collection
147
+ // defaults — carries nothing to sync.
148
+ if (lastSyncedSearchRef.current === location.search) return;
149
+ lastSyncedSearchRef.current = location.search;
136
150
 
137
151
  const { filterValues: urlFilterValues, sortBy: urlSortBy } = parseFilterAndSort(location.search);
138
152
  if (!fixedFilter) {
@@ -1,6 +1,6 @@
1
1
  import { useEffect } from "react";
2
2
 
3
- const rebaseLogo = "data:image/png;base64,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";
3
+ const rebaseLogo = "data:image/png;base64,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";
4
4
 
5
5
  /**
6
6
  * Internal hook to handle the browser title and icon
@@ -93,8 +93,7 @@ const NOOP_NAVIGATION_STATE: NavigationStateController = {
93
93
 
94
94
  const NOOP_BREADCRUMBS: BreadcrumbsController = {
95
95
  breadcrumbs: [],
96
- set: () => {},
97
- updateCount: () => {}
96
+ set: () => {}
98
97
  };
99
98
 
100
99
  const DEFAULT_CAPABILITIES: StudioCapabilities = {
package/src/locales/de.ts CHANGED
@@ -38,6 +38,7 @@ export const de: RebaseTranslations = {
38
38
  find_entity_by_id: "Entität nach ID suchen",
39
39
  filter: "Filter",
40
40
  filters: "Filter",
41
+ records_in_view: "Datensätze in dieser Ansicht",
41
42
  clear_filter: "Filter löschen",
42
43
  clear_filter_sort: "Filter/Sortierung löschen",
43
44
  clear_sort: "Sortierung löschen",
@@ -80,6 +81,7 @@ export const de: RebaseTranslations = {
80
81
  initialize_kanban_order: "Kanban-Reihenfolge initialisieren",
81
82
  copy_id: "ID kopieren",
82
83
  add_specific: "{{name}} hinzufügen",
84
+ add_named: "\"{{name}}\" hinzufügen",
83
85
  select_specific: "{{name}} auswählen",
84
86
  select_from: "Aus {{name}} auswählen",
85
87
  done: "Fertig",
package/src/locales/en.ts CHANGED
@@ -48,6 +48,7 @@ export const en: RebaseTranslations = {
48
48
  find_entity_by_id: "Find entity by ID",
49
49
  filter: "Filter",
50
50
  filters: "Filters",
51
+ records_in_view: "Records in this view",
51
52
  clear_filter: "Clear filter",
52
53
  clear_filter_sort: "Clear filter/sort",
53
54
  clear_sort: "Clear sort",
@@ -90,6 +91,7 @@ export const en: RebaseTranslations = {
90
91
  initialize_kanban_order: "Initialize Kanban Order",
91
92
  copy_id: "Copy ID",
92
93
  add_specific: "Add {{name}}",
94
+ add_named: "Add \"{{name}}\"",
93
95
  select_specific: "Select {{name}}",
94
96
  select_from: "Select from {{name}}",
95
97
  done: "Done",
package/src/locales/es.ts CHANGED
@@ -46,6 +46,7 @@ export const es: RebaseTranslations = {
46
46
  find_entity_by_id: "Buscar entidad por ID",
47
47
  filter: "Filtrar",
48
48
  filters: "Filtros",
49
+ records_in_view: "Registros en esta vista",
49
50
  clear_filter: "Borrar filtro",
50
51
  clear_filter_sort: "Borrar filtro/orden",
51
52
  clear_sort: "Borrar orden",
@@ -88,6 +89,7 @@ export const es: RebaseTranslations = {
88
89
  initialize_kanban_order: "Inicializar el orden para Kanban",
89
90
  copy_id: "Copiar ID",
90
91
  add_specific: "Añadir {{name}}",
92
+ add_named: "Añadir \"{{name}}\"",
91
93
  select_specific: "Seleccionar {{name}}",
92
94
  select_from: "Seleccionar de {{name}}",
93
95
  done: "Hecho",
package/src/locales/fr.ts CHANGED
@@ -38,6 +38,7 @@ export const fr: RebaseTranslations = {
38
38
  find_entity_by_id: "Rechercher l'entité par ID",
39
39
  filter: "Filtrer",
40
40
  filters: "Filtres",
41
+ records_in_view: "Enregistrements dans cette vue",
41
42
  clear_filter: "Effacer le filtre",
42
43
  clear_filter_sort: "Effacer le filtre/tri",
43
44
  clear_sort: "Effacer le tri",
@@ -80,6 +81,7 @@ export const fr: RebaseTranslations = {
80
81
  initialize_kanban_order: "Initialiser l'ordre Kanban",
81
82
  copy_id: "Copier l'ID",
82
83
  add_specific: "Ajouter {{name}}",
84
+ add_named: "Ajouter « {{name}} »",
83
85
  select_specific: "Sélectionner {{name}}",
84
86
  select_from: "Sélectionner depuis {{name}}",
85
87
  done: "Terminé",
package/src/locales/hi.ts CHANGED
@@ -38,6 +38,7 @@ export const hi: RebaseTranslations = {
38
38
  find_entity_by_id: "ID द्वारा इकाई खोजें",
39
39
  filter: "फ़िल्टर",
40
40
  filters: "फ़िल्टर",
41
+ records_in_view: "इस दृश्य में रिकॉर्ड",
41
42
  clear_filter: "फ़िल्टर साफ़ करें",
42
43
  clear_filter_sort: "फ़िल्टर/सॉर्ट साफ़ करें",
43
44
  clear_sort: "सॉर्ट साफ़ करें",
@@ -80,6 +81,7 @@ export const hi: RebaseTranslations = {
80
81
  initialize_kanban_order: "कानबन क्रम प्रारंभ करें",
81
82
  copy_id: "ID कॉपी करें",
82
83
  add_specific: "{{name}} जोड़ें",
84
+ add_named: "\"{{name}}\" जोड़ें",
83
85
  select_specific: "विशिष्ट {{name}} चुनें",
84
86
  select_from: "{{name}} से चुनें",
85
87
  done: "हो गया",
package/src/locales/it.ts CHANGED
@@ -38,6 +38,7 @@ export const it: RebaseTranslations = {
38
38
  find_entity_by_id: "Cerca entità per ID",
39
39
  filter: "Filtra",
40
40
  filters: "Filtri",
41
+ records_in_view: "Record in questa vista",
41
42
  clear_filter: "Cancella filtro",
42
43
  clear_filter_sort: "Cancella filtro/ordinamento",
43
44
  clear_sort: "Cancella ordinamento",
@@ -80,6 +81,7 @@ export const it: RebaseTranslations = {
80
81
  initialize_kanban_order: "Inizializza ordine Kanban",
81
82
  copy_id: "Copia ID",
82
83
  add_specific: "Aggiungi {{name}}",
84
+ add_named: "Aggiungi \"{{name}}\"",
83
85
  select_specific: "Seleziona {{name}}",
84
86
  select_from: "Seleziona da {{name}}",
85
87
  done: "Fatto",
package/src/locales/pt.ts CHANGED
@@ -43,6 +43,7 @@ export const pt: RebaseTranslations = {
43
43
  find_entity_by_id: "Encontrar entidade por ID",
44
44
  filter: "Filtrar",
45
45
  filters: "Filtros",
46
+ records_in_view: "Registos nesta vista",
46
47
  clear_filter: "Limpar filtro",
47
48
  clear_filter_sort: "Limpar filtro/ordenação",
48
49
  clear_sort: "Limpar ordenação",
@@ -85,6 +86,7 @@ export const pt: RebaseTranslations = {
85
86
  initialize_kanban_order: "Inicializar Ordem Kanban",
86
87
  copy_id: "Copiar ID",
87
88
  add_specific: "Adicionar {{name}}",
89
+ add_named: "Adicionar \"{{name}}\"",
88
90
  select_specific: "Selecionar {{name}}",
89
91
  select_from: "Selecionar de {{name}}",
90
92
  done: "Concluído",