@cratis/scene.blueprint.default 4.35.0 → 4.36.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.
Files changed (133) hide show
  1. package/ComponentName.ts +12 -0
  2. package/defaultBlueprintComponents.ts +5 -1
  3. package/dist/cjs/ComponentName.js +4 -0
  4. package/dist/cjs/ComponentName.js.map +1 -1
  5. package/dist/cjs/defaultBlueprint.js +1 -0
  6. package/dist/cjs/defaultBlueprint.js.map +1 -1
  7. package/dist/cjs/defaultBlueprintComponentMetadata.js +1 -0
  8. package/dist/cjs/defaultBlueprintComponentMetadata.js.map +1 -1
  9. package/dist/cjs/defaultBlueprintComponents.js +9 -1
  10. package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
  11. package/dist/cjs/foundation/ActivityFeed.js +122 -0
  12. package/dist/cjs/foundation/ActivityFeed.js.map +1 -0
  13. package/dist/cjs/foundation/AvatarStack.js +73 -0
  14. package/dist/cjs/foundation/AvatarStack.js.map +1 -0
  15. package/dist/cjs/foundation/ChecklistSection.js +174 -0
  16. package/dist/cjs/foundation/ChecklistSection.js.map +1 -0
  17. package/dist/cjs/foundation/FileUploader.js +218 -0
  18. package/dist/cjs/foundation/FileUploader.js.map +1 -0
  19. package/dist/cjs/foundation/FileUploaderHandler.js +17 -0
  20. package/dist/cjs/foundation/FileUploaderHandler.js.map +1 -0
  21. package/dist/cjs/foundation/activityModel.js +63 -0
  22. package/dist/cjs/foundation/activityModel.js.map +1 -0
  23. package/dist/cjs/foundation/avatarModel.js +42 -0
  24. package/dist/cjs/foundation/avatarModel.js.map +1 -0
  25. package/dist/cjs/foundation/checklistModel.js +59 -0
  26. package/dist/cjs/foundation/checklistModel.js.map +1 -0
  27. package/dist/cjs/foundation/formatting.js +11 -0
  28. package/dist/cjs/foundation/formatting.js.map +1 -1
  29. package/dist/cjs/foundation/foundationComponentMetadata.js +26 -0
  30. package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
  31. package/dist/cjs/foundation/foundationDescriptors.js +128 -0
  32. package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
  33. package/dist/cjs/foundation/foundationSamples.js +114 -0
  34. package/dist/cjs/foundation/foundationSamples.js.map +1 -1
  35. package/dist/cjs/foundation/foundationStrings.js +15 -0
  36. package/dist/cjs/foundation/foundationStrings.js.map +1 -1
  37. package/dist/cjs/foundation/uploadModel.js +71 -0
  38. package/dist/cjs/foundation/uploadModel.js.map +1 -0
  39. package/dist/cjs/index.js +33 -0
  40. package/dist/cjs/index.js.map +1 -1
  41. package/dist/esm/ComponentName.d.ts +5 -1
  42. package/dist/esm/ComponentName.d.ts.map +1 -1
  43. package/dist/esm/ComponentName.js +4 -0
  44. package/dist/esm/ComponentName.js.map +1 -1
  45. package/dist/esm/defaultBlueprint.js +1 -0
  46. package/dist/esm/defaultBlueprint.js.map +1 -1
  47. package/dist/esm/defaultBlueprintComponentMetadata.js +1 -0
  48. package/dist/esm/defaultBlueprintComponentMetadata.js.map +1 -1
  49. package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
  50. package/dist/esm/defaultBlueprintComponents.js +9 -1
  51. package/dist/esm/defaultBlueprintComponents.js.map +1 -1
  52. package/dist/esm/foundation/ActivityFeed.d.ts +3 -0
  53. package/dist/esm/foundation/ActivityFeed.d.ts.map +1 -0
  54. package/dist/esm/foundation/ActivityFeed.js +120 -0
  55. package/dist/esm/foundation/ActivityFeed.js.map +1 -0
  56. package/dist/esm/foundation/AvatarStack.d.ts +3 -0
  57. package/dist/esm/foundation/AvatarStack.d.ts.map +1 -0
  58. package/dist/esm/foundation/AvatarStack.js +71 -0
  59. package/dist/esm/foundation/AvatarStack.js.map +1 -0
  60. package/dist/esm/foundation/ChecklistSection.d.ts +3 -0
  61. package/dist/esm/foundation/ChecklistSection.d.ts.map +1 -0
  62. package/dist/esm/foundation/ChecklistSection.js +172 -0
  63. package/dist/esm/foundation/ChecklistSection.js.map +1 -0
  64. package/dist/esm/foundation/FileUploader.d.ts +3 -0
  65. package/dist/esm/foundation/FileUploader.d.ts.map +1 -0
  66. package/dist/esm/foundation/FileUploader.js +216 -0
  67. package/dist/esm/foundation/FileUploader.js.map +1 -0
  68. package/dist/esm/foundation/FileUploaderHandler.d.ts +8 -0
  69. package/dist/esm/foundation/FileUploaderHandler.d.ts.map +1 -0
  70. package/dist/esm/foundation/FileUploaderHandler.js +14 -0
  71. package/dist/esm/foundation/FileUploaderHandler.js.map +1 -0
  72. package/dist/esm/foundation/Foundation.stories.d.ts +8 -0
  73. package/dist/esm/foundation/Foundation.stories.d.ts.map +1 -1
  74. package/dist/esm/foundation/Foundation.stories.js +8 -0
  75. package/dist/esm/foundation/Foundation.stories.js.map +1 -1
  76. package/dist/esm/foundation/activityModel.d.ts +22 -0
  77. package/dist/esm/foundation/activityModel.d.ts.map +1 -0
  78. package/dist/esm/foundation/activityModel.js +58 -0
  79. package/dist/esm/foundation/activityModel.js.map +1 -0
  80. package/dist/esm/foundation/avatarModel.d.ts +11 -0
  81. package/dist/esm/foundation/avatarModel.d.ts.map +1 -0
  82. package/dist/esm/foundation/avatarModel.js +38 -0
  83. package/dist/esm/foundation/avatarModel.js.map +1 -0
  84. package/dist/esm/foundation/checklistModel.d.ts +17 -0
  85. package/dist/esm/foundation/checklistModel.d.ts.map +1 -0
  86. package/dist/esm/foundation/checklistModel.js +53 -0
  87. package/dist/esm/foundation/checklistModel.js.map +1 -0
  88. package/dist/esm/foundation/formatting.d.ts +1 -0
  89. package/dist/esm/foundation/formatting.d.ts.map +1 -1
  90. package/dist/esm/foundation/formatting.js +11 -1
  91. package/dist/esm/foundation/formatting.js.map +1 -1
  92. package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
  93. package/dist/esm/foundation/foundationComponentMetadata.js +26 -0
  94. package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
  95. package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
  96. package/dist/esm/foundation/foundationDescriptors.js +128 -0
  97. package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
  98. package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
  99. package/dist/esm/foundation/foundationSamples.js +114 -0
  100. package/dist/esm/foundation/foundationSamples.js.map +1 -1
  101. package/dist/esm/foundation/foundationStrings.d.ts +15 -0
  102. package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
  103. package/dist/esm/foundation/foundationStrings.js +15 -0
  104. package/dist/esm/foundation/foundationStrings.js.map +1 -1
  105. package/dist/esm/foundation/index.d.ts +9 -0
  106. package/dist/esm/foundation/index.d.ts.map +1 -1
  107. package/dist/esm/foundation/index.js +9 -0
  108. package/dist/esm/foundation/index.js.map +1 -1
  109. package/dist/esm/foundation/uploadModel.d.ts +31 -0
  110. package/dist/esm/foundation/uploadModel.d.ts.map +1 -0
  111. package/dist/esm/foundation/uploadModel.js +65 -0
  112. package/dist/esm/foundation/uploadModel.js.map +1 -0
  113. package/dist/esm/index.js +10 -1
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  116. package/foundation/ActivityFeed.tsx +61 -0
  117. package/foundation/AvatarStack.tsx +43 -0
  118. package/foundation/ChecklistSection.tsx +80 -0
  119. package/foundation/FileUploader.tsx +122 -0
  120. package/foundation/FileUploaderHandler.tsx +22 -0
  121. package/foundation/Foundation.stories.tsx +8 -0
  122. package/foundation/activityModel.ts +65 -0
  123. package/foundation/avatarModel.ts +36 -0
  124. package/foundation/checklistModel.ts +62 -0
  125. package/foundation/formatting.ts +9 -0
  126. package/foundation/foundationComponentMetadata.ts +4 -0
  127. package/foundation/foundationDescriptors.ts +79 -0
  128. package/foundation/foundationSamples.ts +29 -0
  129. package/foundation/foundationStrings.ts +15 -0
  130. package/foundation/index.ts +9 -0
  131. package/foundation/uploadModel.ts +66 -0
  132. package/package.json +8 -8
  133. package/shell/layout.css +234 -0
@@ -49,6 +49,35 @@ export const foundationSamples: Record<string, FoundationSample> = {
49
49
  properties: { views: [{ id: 'all', label: 'All leads' }, { id: 'mine', label: 'Mine' }, { id: 'overdue', label: 'Overdue' }], activeView: 'mine' },
50
50
  data: ['Mine'], stateful: true,
51
51
  },
52
+ [ComponentName.ChecklistSection]: {
53
+ properties: {
54
+ today: '2026-03-10', locale: 'en-US',
55
+ sections: [
56
+ { title: 'Before day one', items: [{ id: 't1', label: 'Send the contract', owner: 'Grace', due: '2026-03-01', done: true }, { id: 't2', label: 'Order a laptop', owner: 'Linus', due: '2026-03-05' }] },
57
+ { title: 'First week', items: [{ id: 't3', label: 'Security training', owner: 'Ada', due: '2026-03-20' }] },
58
+ ],
59
+ },
60
+ data: ['Send the contract', '1 of 2 complete'], stateful: true,
61
+ },
62
+ [ComponentName.ActivityFeed]: {
63
+ properties: {
64
+ locale: 'en-US', timeZone: 'UTC',
65
+ entries: [
66
+ { id: 'a1', actor: 'Ada Lovelace', action: 'commented', kind: 'comment', at: '2026-03-10T09:30:00Z', body: 'Sent the revised quote.' },
67
+ { id: 'a2', actor: 'Grace Hopper', action: 'changed the owner to Linus', kind: 'change', at: '2026-03-09T16:00:00Z' },
68
+ { id: 'a3', actor: 'System', action: 'marked the deal as qualified', kind: 'status', at: '2026-03-09T08:00:00Z' },
69
+ ],
70
+ },
71
+ data: ['Sent the revised quote.'], stateful: true,
72
+ },
73
+ [ComponentName.AvatarStack]: {
74
+ properties: { people: [{ name: 'Ada Lovelace' }, { name: 'Grace Hopper' }, { name: 'Linus Torvalds' }, { name: 'Margaret Hamilton' }, { name: 'Alan Turing' }, { name: 'Barbara Liskov' }], max: 4 },
75
+ data: ['+2'], stateful: true,
76
+ },
77
+ [ComponentName.FileUploader]: {
78
+ properties: { accept: '.pdf, image/*', maxSizeMb: 10, multiple: true },
79
+ data: [], stateful: true,
80
+ },
52
81
  };
53
82
 
54
83
  /** A scene element for a foundation component, populated with its sample unless properties are given, with the state forced when asked. */
@@ -80,11 +80,26 @@ export const foundationStrings = {
80
80
  viewsNone: 'There are no saved views',
81
81
  checklistProgress: '{done} of {total} complete',
82
82
  checklistOwner: 'Owner',
83
+ checklistOverdue: 'Overdue',
84
+ checklistDone: 'Done',
85
+ checklistOpen: 'Open',
86
+ checklistItemProgress: 'Progress of {title}',
87
+ checklistNone: 'This checklist has no tasks',
83
88
  checklistDue: 'Due',
84
89
  activityEmpty: 'No activity yet',
90
+ activityComment: 'Comment',
91
+ activityChange: 'Change',
92
+ activityStatus: 'Status',
93
+ activitySystem: 'System',
94
+ activityBy: 'by {actor}',
85
95
  avatarOverflow: '{count} more',
86
96
  avatarPeople: '{count} people',
87
97
  uploadDrop: 'Drop files here or',
98
+ uploadLimits: 'Up to {limit} each',
99
+ uploadAccepts: 'Accepts {types}',
100
+ uploadSelected: 'Selected files',
101
+ uploadQueued: 'Ready to upload',
102
+ uploadSingle: 'Only one file can be uploaded at a time',
88
103
  uploadBrowse: 'Browse files',
89
104
  uploadRemove: 'Remove {name}',
90
105
  uploadTooLarge: '{name} is larger than {limit}',
@@ -21,6 +21,15 @@ export * from './columnModel';
21
21
  export * from './ColumnChooser';
22
22
  export * from './viewModel';
23
23
  export * from './SavedViewsMenu';
24
+ export * from './checklistModel';
25
+ export * from './ChecklistSection';
26
+ export * from './activityModel';
27
+ export * from './ActivityFeed';
28
+ export * from './avatarModel';
29
+ export * from './AvatarStack';
30
+ export * from './uploadModel';
31
+ export * from './FileUploaderHandler';
32
+ export * from './FileUploader';
24
33
  export * from './foundationDescriptors';
25
34
  export * from './foundationComponentMetadata';
26
35
  export * from './foundationSamples';
@@ -0,0 +1,66 @@
1
+ // Copyright (c) Cratis. All rights reserved.
2
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
+
4
+ /** Where a file is in being uploaded. */
5
+ export enum UploadStatus {
6
+ Queued = 'queued',
7
+ Uploading = 'uploading',
8
+ Done = 'done',
9
+ Failed = 'failed',
10
+ }
11
+
12
+ /** The rules a selection is checked against before anything is sent. */
13
+ export interface UploadRules {
14
+ /** A comma-separated `accept` list: extensions (`.pdf`), MIME types (`image/png`) and wildcards (`image/*`). */
15
+ accept: string;
16
+ maximumBytes: number;
17
+ multiple: boolean;
18
+ }
19
+
20
+ /** What the checker needs of a file. */
21
+ export interface SelectedFile {
22
+ name: string;
23
+ size: number;
24
+ type: string;
25
+ }
26
+
27
+ /** Why a file was refused. */
28
+ export enum UploadRefusal {
29
+ WrongType = 'wrongType',
30
+ TooLarge = 'tooLarge',
31
+ Single = 'single',
32
+ }
33
+
34
+ /** Whether a file matches an `accept` list; an empty list accepts everything, and matching ignores case. */
35
+ export function matchesAccept(file: SelectedFile, accept: string): boolean {
36
+ const patterns = accept.split(',').map(pattern => pattern.trim().toLowerCase()).filter(pattern => pattern.length > 0);
37
+ if (patterns.length === 0) return true;
38
+
39
+ const name = file.name.toLowerCase();
40
+ const type = file.type.toLowerCase();
41
+ return patterns.some(pattern => pattern.startsWith('.') ? name.endsWith(pattern) : pattern.endsWith('/*') ? type.startsWith(pattern.slice(0, -1)) : type === pattern);
42
+ }
43
+
44
+ /** Sorts a selection into the files to take and the reasons for refusing the others. Only the first is taken when one file is allowed. */
45
+ export function checkSelection<T extends SelectedFile>(files: T[], rules: UploadRules, alreadySelected = 0): { accepted: T[]; refused: { file: T; reason: UploadRefusal }[] } {
46
+ const accepted: T[] = [];
47
+ const refused: { file: T; reason: UploadRefusal }[] = [];
48
+
49
+ for (const file of files) {
50
+ if (!matchesAccept(file, rules.accept)) refused.push({ file, reason: UploadRefusal.WrongType });
51
+ else if (rules.maximumBytes > 0 && file.size > rules.maximumBytes) refused.push({ file, reason: UploadRefusal.TooLarge });
52
+ else if (!rules.multiple && alreadySelected + accepted.length >= 1) refused.push({ file, reason: UploadRefusal.Single });
53
+ else accepted.push(file);
54
+ }
55
+
56
+ return { accepted, refused };
57
+ }
58
+
59
+ /** A file size in the largest unit that keeps it under 1024, for the locale. */
60
+ export function formatBytes(bytes: number, locale: string): string {
61
+ const units = ['B', 'KB', 'MB', 'GB'];
62
+ let value = bytes;
63
+ let unit = 0;
64
+ while (value >= 1024 && unit < units.length - 1) { value /= 1024; unit++; }
65
+ return `${new Intl.NumberFormat(locale, { maximumFractionDigits: unit === 0 ? 0 : 1 }).format(value)} ${units[unit]}`;
66
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/scene.blueprint.default",
3
- "version": "4.35.0",
3
+ "version": "4.36.0",
4
4
  "description": "The default blueprint: application shell layouts, the screen and dialog templates that go inside them, the components that fill their slots, and two themes.",
5
5
  "keywords": [
6
6
  "cratis",
@@ -55,15 +55,15 @@
55
55
  "build-storybook": "storybook build"
56
56
  },
57
57
  "dependencies": {
58
- "@cratis/scene.engine": "4.35.0",
59
- "@cratis/scene.model": "4.35.0",
60
- "@cratis/scene.react": "4.35.0"
58
+ "@cratis/scene.engine": "4.36.0",
59
+ "@cratis/scene.model": "4.36.0",
60
+ "@cratis/scene.react": "4.36.0"
61
61
  },
62
62
  "devDependencies": {
63
- "@cratis/scene.engine": "4.35.0",
64
- "@cratis/scene.model": "4.35.0",
65
- "@cratis/scene.primereact": "4.35.0",
66
- "@cratis/scene.react": "4.35.0",
63
+ "@cratis/scene.engine": "4.36.0",
64
+ "@cratis/scene.model": "4.36.0",
65
+ "@cratis/scene.primereact": "4.36.0",
66
+ "@cratis/scene.react": "4.36.0",
67
67
  "@primereact/core": "11.2.0",
68
68
  "@primereact/headless": "11.2.0",
69
69
  "@primeuix/themes": "^3.0.1",
package/shell/layout.css CHANGED
@@ -1607,3 +1607,237 @@
1607
1607
  grid-row: 1;
1608
1608
  }
1609
1609
  }
1610
+
1611
+ /* Checklist. */
1612
+ .foundation-checklist {
1613
+ display: flex;
1614
+ flex-direction: column;
1615
+ gap: var(--foundation-space-4);
1616
+ padding: var(--foundation-space-4);
1617
+ border: 1px solid var(--foundation-border);
1618
+ border-radius: var(--foundation-radius);
1619
+ background: var(--foundation-surface);
1620
+ }
1621
+
1622
+ .foundation-checklist-header {
1623
+ display: flex;
1624
+ align-items: baseline;
1625
+ justify-content: space-between;
1626
+ gap: var(--foundation-space-2);
1627
+ }
1628
+
1629
+ .foundation-checklist-header h3 {
1630
+ margin: 0;
1631
+ font-size: 1rem;
1632
+ }
1633
+
1634
+ .foundation-progress {
1635
+ overflow: hidden;
1636
+ block-size: 0.5rem;
1637
+ margin-block: var(--foundation-space-2);
1638
+ border-radius: 999px;
1639
+ background: var(--foundation-hover);
1640
+ border: 1px solid var(--foundation-border);
1641
+ }
1642
+
1643
+ .foundation-progress-bar {
1644
+ display: block;
1645
+ block-size: 100%;
1646
+ background: var(--foundation-primary);
1647
+ }
1648
+
1649
+ .foundation-checklist-items {
1650
+ display: flex;
1651
+ flex-direction: column;
1652
+ margin: 0;
1653
+ padding: 0;
1654
+ list-style: none;
1655
+ }
1656
+
1657
+ .foundation-checklist-item {
1658
+ display: flex;
1659
+ flex-wrap: wrap;
1660
+ align-items: center;
1661
+ justify-content: space-between;
1662
+ gap: var(--foundation-space-1) var(--foundation-space-4);
1663
+ min-block-size: var(--foundation-row-height);
1664
+ border-block-end: 1px solid var(--foundation-border);
1665
+ }
1666
+
1667
+ .foundation-checklist-item[data-done='true'] .foundation-checklist-label {
1668
+ color: var(--foundation-muted);
1669
+ text-decoration: line-through;
1670
+ }
1671
+
1672
+ .foundation-checklist-meta {
1673
+ display: inline-flex;
1674
+ flex-wrap: wrap;
1675
+ gap: var(--foundation-space-1) var(--foundation-space-4);
1676
+ color: var(--foundation-muted);
1677
+ font-size: 0.875rem;
1678
+ }
1679
+
1680
+ .foundation-overdue {
1681
+ color: var(--foundation-danger);
1682
+ }
1683
+
1684
+ /* Activity feed. */
1685
+ .foundation-activity-feed {
1686
+ padding: var(--foundation-space-4);
1687
+ border: 1px solid var(--foundation-border);
1688
+ border-radius: var(--foundation-radius);
1689
+ background: var(--foundation-surface);
1690
+ }
1691
+
1692
+ .foundation-activity-heading {
1693
+ margin: var(--foundation-space-3) 0;
1694
+ color: var(--foundation-muted);
1695
+ font-size: 0.875rem;
1696
+ font-weight: 600;
1697
+ }
1698
+
1699
+ .foundation-activity-list {
1700
+ display: flex;
1701
+ flex-direction: column;
1702
+ gap: var(--foundation-space-3);
1703
+ margin: 0;
1704
+ padding: 0;
1705
+ list-style: none;
1706
+ }
1707
+
1708
+ .foundation-activity-entry {
1709
+ display: flex;
1710
+ gap: var(--foundation-space-3);
1711
+ }
1712
+
1713
+ .foundation-activity-icon {
1714
+ display: inline-flex;
1715
+ flex: none;
1716
+ align-items: center;
1717
+ justify-content: center;
1718
+ inline-size: 2rem;
1719
+ block-size: 2rem;
1720
+ border-radius: 50%;
1721
+ background: var(--foundation-highlight);
1722
+ color: var(--foundation-highlight-text);
1723
+ }
1724
+
1725
+ .foundation-activity-content {
1726
+ display: flex;
1727
+ flex-direction: column;
1728
+ gap: var(--foundation-space-1);
1729
+ min-inline-size: 0;
1730
+ }
1731
+
1732
+ .foundation-activity-summary,
1733
+ .foundation-activity-body {
1734
+ margin: 0;
1735
+ overflow-wrap: anywhere;
1736
+ }
1737
+
1738
+ .foundation-activity-body {
1739
+ padding: var(--foundation-space-2) var(--foundation-space-3);
1740
+ border-radius: var(--foundation-radius);
1741
+ background: var(--foundation-background);
1742
+ }
1743
+
1744
+ /* Avatar stack. */
1745
+ .foundation-avatars {
1746
+ display: inline-flex;
1747
+ margin: 0;
1748
+ padding: 0;
1749
+ list-style: none;
1750
+ }
1751
+
1752
+ .foundation-avatar {
1753
+ display: inline-flex;
1754
+ flex: none;
1755
+ align-items: center;
1756
+ justify-content: center;
1757
+ overflow: hidden;
1758
+ inline-size: 2.5rem;
1759
+ block-size: 2.5rem;
1760
+ border: 2px solid var(--foundation-surface);
1761
+ border-radius: 50%;
1762
+ background: var(--foundation-highlight);
1763
+ color: var(--foundation-highlight-text);
1764
+ font-size: 0.875rem;
1765
+ font-weight: 700;
1766
+ }
1767
+
1768
+ .foundation-avatar + .foundation-avatar {
1769
+ margin-inline-start: calc(var(--foundation-space-3) * -1);
1770
+ }
1771
+
1772
+ .foundation-avatar img {
1773
+ inline-size: 100%;
1774
+ block-size: 100%;
1775
+ object-fit: cover;
1776
+ }
1777
+
1778
+ .foundation-avatar-more {
1779
+ background: var(--foundation-hover);
1780
+ color: var(--foundation-text);
1781
+ }
1782
+
1783
+ .foundation-avatars[data-size='small'] .foundation-avatar {
1784
+ inline-size: 1.75rem;
1785
+ block-size: 1.75rem;
1786
+ font-size: 0.75rem;
1787
+ }
1788
+
1789
+ /* File uploader. */
1790
+ .foundation-file-uploader {
1791
+ display: flex;
1792
+ flex-direction: column;
1793
+ gap: var(--foundation-space-3);
1794
+ }
1795
+
1796
+ .foundation-dropzone {
1797
+ display: flex;
1798
+ flex-direction: column;
1799
+ align-items: center;
1800
+ gap: var(--foundation-space-2);
1801
+ padding: var(--foundation-space-6);
1802
+ border: 2px dashed var(--foundation-border);
1803
+ border-radius: var(--foundation-radius);
1804
+ background: var(--foundation-surface);
1805
+ text-align: center;
1806
+ }
1807
+
1808
+ .foundation-dropzone[data-dragging='true'] {
1809
+ border-color: var(--foundation-primary);
1810
+ background: var(--foundation-highlight);
1811
+ }
1812
+
1813
+ .foundation-upload-problems {
1814
+ color: var(--foundation-danger);
1815
+ }
1816
+
1817
+ .foundation-upload-list {
1818
+ display: flex;
1819
+ flex-direction: column;
1820
+ margin: 0;
1821
+ padding: 0;
1822
+ list-style: none;
1823
+ }
1824
+
1825
+ .foundation-upload-item {
1826
+ display: flex;
1827
+ flex-wrap: wrap;
1828
+ align-items: center;
1829
+ gap: var(--foundation-space-2);
1830
+ min-block-size: var(--foundation-row-height);
1831
+ border-block-end: 1px solid var(--foundation-border);
1832
+ }
1833
+
1834
+ .foundation-upload-name {
1835
+ flex: 1;
1836
+ min-inline-size: 0;
1837
+ overflow-wrap: anywhere;
1838
+ }
1839
+
1840
+ .foundation-upload-item[data-status='failed'] .foundation-upload-status {
1841
+ color: var(--foundation-danger);
1842
+ font-weight: 600;
1843
+ }