@flamingo-stack/openframe-frontend-core 0.0.512 → 0.0.513-1642.4228.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/{chunk-VVXUUBML.cjs → chunk-2B4GFIZR.cjs} +26 -26
  2. package/dist/{chunk-VVXUUBML.cjs.map → chunk-2B4GFIZR.cjs.map} +1 -1
  3. package/dist/{chunk-XG7FLAKQ.js → chunk-2M2XTLLU.js} +2 -2
  4. package/dist/{chunk-SG25J6LV.cjs → chunk-3DOS3NN3.cjs} +87 -87
  5. package/dist/{chunk-SG25J6LV.cjs.map → chunk-3DOS3NN3.cjs.map} +1 -1
  6. package/dist/{chunk-WVZHCDB5.cjs → chunk-3HUYWTDH.cjs} +11 -11
  7. package/dist/{chunk-WVZHCDB5.cjs.map → chunk-3HUYWTDH.cjs.map} +1 -1
  8. package/dist/{chunk-FI35LJ3L.js → chunk-3PAWTYGX.js} +2 -2
  9. package/dist/{chunk-2WWDZR4D.cjs → chunk-6NUWOSJ2.cjs} +31 -31
  10. package/dist/{chunk-2WWDZR4D.cjs.map → chunk-6NUWOSJ2.cjs.map} +1 -1
  11. package/dist/{chunk-5JBDT2MQ.cjs → chunk-7TWV3RQF.cjs} +7 -7
  12. package/dist/{chunk-5JBDT2MQ.cjs.map → chunk-7TWV3RQF.cjs.map} +1 -1
  13. package/dist/{chunk-F2YI5N7E.cjs → chunk-AFVPKV2V.cjs} +13 -13
  14. package/dist/{chunk-F2YI5N7E.cjs.map → chunk-AFVPKV2V.cjs.map} +1 -1
  15. package/dist/{chunk-JOFGJYIT.js → chunk-C7EEPMMS.js} +2 -2
  16. package/dist/{chunk-IK2WRYVA.js → chunk-CPR3LS3G.js} +4 -4
  17. package/dist/{chunk-7VBEOGCR.cjs → chunk-EDEHY73L.cjs} +61 -61
  18. package/dist/{chunk-7VBEOGCR.cjs.map → chunk-EDEHY73L.cjs.map} +1 -1
  19. package/dist/{chunk-VZX3SSFL.js → chunk-F5JG5KXZ.js} +2 -2
  20. package/dist/{chunk-OT4RV6WY.js → chunk-GIYB77AH.js} +6 -6
  21. package/dist/{chunk-HGZPH7S5.js → chunk-HQTKEWJQ.js} +2 -2
  22. package/dist/{chunk-6LMTBNLN.js → chunk-J2IHMVWH.js} +2 -2
  23. package/dist/{chunk-JO3NPEK6.js → chunk-L6BZVJMU.js} +2 -2
  24. package/dist/{chunk-V5WLIFKN.js → chunk-LIUGDM6D.js} +2888 -2841
  25. package/dist/chunk-LIUGDM6D.js.map +1 -0
  26. package/dist/{chunk-ZIQMVAGA.js → chunk-LWNPUXEW.js} +2 -2
  27. package/dist/{chunk-RJXI25TJ.cjs → chunk-O57VWXJ6.cjs} +26 -26
  28. package/dist/{chunk-RJXI25TJ.cjs.map → chunk-O57VWXJ6.cjs.map} +1 -1
  29. package/dist/{chunk-IHNUMRMU.js → chunk-PDFXMFQM.js} +2 -2
  30. package/dist/{chunk-DQDPDUI3.cjs → chunk-PZOWHJVO.cjs} +4 -4
  31. package/dist/{chunk-DQDPDUI3.cjs.map → chunk-PZOWHJVO.cjs.map} +1 -1
  32. package/dist/{chunk-JIW5JI3E.cjs → chunk-REITDNP6.cjs} +3 -3
  33. package/dist/{chunk-JIW5JI3E.cjs.map → chunk-REITDNP6.cjs.map} +1 -1
  34. package/dist/{chunk-AWLFJMOJ.cjs → chunk-UX3QT5QM.cjs} +37 -37
  35. package/dist/{chunk-AWLFJMOJ.cjs.map → chunk-UX3QT5QM.cjs.map} +1 -1
  36. package/dist/{chunk-67YDSTH7.cjs → chunk-VNW62WLX.cjs} +9 -9
  37. package/dist/{chunk-67YDSTH7.cjs.map → chunk-VNW62WLX.cjs.map} +1 -1
  38. package/dist/{chunk-JKAX5K7C.js → chunk-XMUEU55V.js} +5 -5
  39. package/dist/{chunk-4NFDSMB5.js → chunk-XOVSXNLV.js} +4 -4
  40. package/dist/{chunk-GOFTC2HV.cjs → chunk-XQGBMU5W.cjs} +66 -19
  41. package/dist/chunk-XQGBMU5W.cjs.map +1 -0
  42. package/dist/{chunk-2XL7UK5Y.cjs → chunk-ZGRBMHHW.cjs} +5 -5
  43. package/dist/{chunk-2XL7UK5Y.cjs.map → chunk-ZGRBMHHW.cjs.map} +1 -1
  44. package/dist/components/case-studies/index.cjs +8 -8
  45. package/dist/components/case-studies/index.js +2 -2
  46. package/dist/components/chat/index.cjs +2 -2
  47. package/dist/components/chat/index.js +1 -1
  48. package/dist/components/contact/index.cjs +3 -3
  49. package/dist/components/contact/index.js +2 -2
  50. package/dist/components/docs/index.cjs +5 -5
  51. package/dist/components/docs/index.js +4 -4
  52. package/dist/components/embeds/index.cjs +3 -3
  53. package/dist/components/embeds/index.js +2 -2
  54. package/dist/components/faq/index.cjs +3 -3
  55. package/dist/components/faq/index.js +2 -2
  56. package/dist/components/features/board/ticket-card.d.ts.map +1 -1
  57. package/dist/components/features/board/types.d.ts +2 -0
  58. package/dist/components/features/board/types.d.ts.map +1 -1
  59. package/dist/components/features/index.cjs +2 -2
  60. package/dist/components/features/index.js +1 -1
  61. package/dist/components/help-center-pages/index.cjs +22 -22
  62. package/dist/components/help-center-pages/index.js +13 -13
  63. package/dist/components/index.cjs +134 -132
  64. package/dist/components/index.cjs.map +1 -1
  65. package/dist/components/index.js +13 -11
  66. package/dist/components/index.js.map +1 -1
  67. package/dist/components/meeting-scheduler/index.cjs +34 -34
  68. package/dist/components/meeting-scheduler/index.js +3 -3
  69. package/dist/components/navigation/index.cjs +2 -2
  70. package/dist/components/navigation/index.js +1 -1
  71. package/dist/components/onboarding-guides/index.cjs +5 -5
  72. package/dist/components/onboarding-guides/index.js +4 -4
  73. package/dist/components/related-content/index.cjs +3 -3
  74. package/dist/components/related-content/index.js +2 -2
  75. package/dist/components/tickets/index.cjs +6 -6
  76. package/dist/components/tickets/index.js +5 -5
  77. package/dist/components/ui/assignee-dropdown.d.ts +2 -0
  78. package/dist/components/ui/assignee-dropdown.d.ts.map +1 -1
  79. package/dist/components/ui/deleted-user-avatar.d.ts +27 -0
  80. package/dist/components/ui/deleted-user-avatar.d.ts.map +1 -0
  81. package/dist/components/ui/index.cjs +4 -2
  82. package/dist/components/ui/index.cjs.map +1 -1
  83. package/dist/components/ui/index.d.ts +1 -0
  84. package/dist/components/ui/index.d.ts.map +1 -1
  85. package/dist/components/ui/index.js +3 -1
  86. package/dist/components/ui/ticket-info-section.d.ts +2 -0
  87. package/dist/components/ui/ticket-info-section.d.ts.map +1 -1
  88. package/dist/index.cjs +4 -2
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.js +3 -1
  91. package/package.json +1 -1
  92. package/src/components/features/board/.ticket-card.md +1 -1
  93. package/src/components/features/board/.types.md +3 -2
  94. package/src/components/features/board/ticket-card.tsx +15 -10
  95. package/src/components/features/board/types.ts +2 -0
  96. package/src/components/ui/.assignee-dropdown.md +3 -2
  97. package/src/components/ui/.deleted-user-avatar.md +20 -0
  98. package/src/components/ui/.ticket-info-section.md +3 -2
  99. package/src/components/ui/assignee-dropdown.tsx +46 -24
  100. package/src/components/ui/deleted-user-avatar.tsx +52 -0
  101. package/src/components/ui/index.ts +1 -0
  102. package/src/components/ui/ticket-info-section.tsx +2 -0
  103. package/dist/chunk-GOFTC2HV.cjs.map +0 -1
  104. package/dist/chunk-V5WLIFKN.js.map +0 -1
  105. /package/dist/{chunk-XG7FLAKQ.js.map → chunk-2M2XTLLU.js.map} +0 -0
  106. /package/dist/{chunk-FI35LJ3L.js.map → chunk-3PAWTYGX.js.map} +0 -0
  107. /package/dist/{chunk-JOFGJYIT.js.map → chunk-C7EEPMMS.js.map} +0 -0
  108. /package/dist/{chunk-IK2WRYVA.js.map → chunk-CPR3LS3G.js.map} +0 -0
  109. /package/dist/{chunk-VZX3SSFL.js.map → chunk-F5JG5KXZ.js.map} +0 -0
  110. /package/dist/{chunk-OT4RV6WY.js.map → chunk-GIYB77AH.js.map} +0 -0
  111. /package/dist/{chunk-HGZPH7S5.js.map → chunk-HQTKEWJQ.js.map} +0 -0
  112. /package/dist/{chunk-6LMTBNLN.js.map → chunk-J2IHMVWH.js.map} +0 -0
  113. /package/dist/{chunk-JO3NPEK6.js.map → chunk-L6BZVJMU.js.map} +0 -0
  114. /package/dist/{chunk-ZIQMVAGA.js.map → chunk-LWNPUXEW.js.map} +0 -0
  115. /package/dist/{chunk-IHNUMRMU.js.map → chunk-PDFXMFQM.js.map} +0 -0
  116. /package/dist/{chunk-JKAX5K7C.js.map → chunk-XMUEU55V.js.map} +0 -0
  117. /package/dist/{chunk-4NFDSMB5.js.map → chunk-XOVSXNLV.js.map} +0 -0
@@ -0,0 +1,20 @@
1
+ <!-- source-hash: 2f3d376de06fcf7bbf7f975bb94674e9 -->
2
+ Red round user-x placeholder rendered instead of an avatar for deleted user accounts (statuses `DELETED` / `SELF_DELETED`).
3
+
4
+ ## Key Components
5
+
6
+ ### `DeletedUserAvatar`
7
+
8
+ **Props (`DeletedUserAvatarProps`):**
9
+
10
+ | Prop | Type | Description |
11
+ |---|---|---|
12
+ | `size` | `'sm' \| 'md' \| 'lg'` | Mirrors `SquareAvatar` size buckets (32 / 40 / 48px). Default `'md'`. |
13
+ | `className` | `string` | Extra classes (e.g. `h-6 w-6` for the dropdown-option size). |
14
+ | `accessibleLabel` | `string` | Accessible name; pass the user identity when known (e.g. "Deleted user: Jane Doe"). Defaults to "Deleted user". |
15
+
16
+ ## Notes
17
+
18
+ - A dedicated component — not a `SquareAvatar` prop — because `SquareAvatar`'s only fallback is text initials, and initials for a deleted account is exactly what the design replaces.
19
+ - Styling: `bg-ods-error/20` circle + `text-ods-error` `UserXmarkIcon`.
20
+ - Consumed by `AssigneeDropdown` and the board `TicketCardBody` via the `deleted` flag on their assignee shapes; app repos also use it directly for their own user cells.
@@ -1,4 +1,4 @@
1
- <!-- source-hash: 7ac50b47361449080e2ba3874b959c5f -->
1
+ <!-- source-hash: 64199a542faa0b43a2d1edd2ca00d745 -->
2
2
  A collapsible ticket information panel that displays key ticket metadata (organization, assignee, device, status) in a compact header row, with an expandable section revealing description, attachments, tags, and notes.
3
3
 
4
4
  ## Key Components
@@ -48,4 +48,5 @@ import { TicketInfoSection } from "./ticket-info-section"
48
48
 
49
49
  ## Source
50
50
 
51
- [`ticket-info-section.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/ticket-info-section.tsx)
51
+ [`ticket-info-section.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/ticket-info-section.tsx)
52
+ - `assigned.currentAssignee.deleted` — forwarded to `AssigneeDropdown`: deleted accounts render the red user-x placeholder + red name.
@@ -4,6 +4,7 @@ import * as React from 'react'
4
4
  import { PenEditIcon, UserIcon, UserPlusIcon } from '../icons-v2-generated'
5
5
  import { cn } from '../../utils/cn'
6
6
  import { Autocomplete, type AutocompleteOption } from './autocomplete'
7
+ import { DeletedUserAvatar } from './deleted-user-avatar'
7
8
  import { SearchableSelect, type SearchableSelectOption } from './searchable-select'
8
9
  import { SquareAvatar } from './square-avatar'
9
10
 
@@ -18,6 +19,8 @@ export interface AssigneeDropdownProps {
18
19
  id: string
19
20
  name: string
20
21
  avatarSrc?: string
22
+ /** Deleted account (DELETED / SELF_DELETED) — renders the red user-x placeholder + red name. */
23
+ deleted?: boolean
21
24
  }
22
25
  options: TicketAssigneeOption[]
23
26
  isLoading?: boolean
@@ -79,13 +82,17 @@ function CompactAssigneeDropdown({
79
82
  className,
80
83
  )}
81
84
  >
82
- <SquareAvatar
83
- src={currentAssignee.avatarSrc}
84
- alt={currentAssignee.name}
85
- fallback={currentAssignee.name || 'User'}
86
- size="sm"
87
- variant="round"
88
- />
85
+ {currentAssignee.deleted ? (
86
+ <DeletedUserAvatar size="sm" accessibleLabel={`Deleted user: ${currentAssignee.name || currentAssignee.id}`} />
87
+ ) : (
88
+ <SquareAvatar
89
+ src={currentAssignee.avatarSrc}
90
+ alt={currentAssignee.name}
91
+ fallback={currentAssignee.name || 'User'}
92
+ size="sm"
93
+ variant="round"
94
+ />
95
+ )}
89
96
  </button>
90
97
  ) : (
91
98
  <button
@@ -159,14 +166,22 @@ function DefaultAssigneeDropdown({
159
166
  showChevron={false}
160
167
  startAdornment={
161
168
  hasAssignee ? (
162
- <SquareAvatar
163
- src={currentAssignee!.avatarSrc}
164
- alt={currentAssignee!.name}
165
- fallback={currentAssignee!.name || 'User'}
166
- size="sm"
167
- variant="round"
168
- className="h-6 w-6"
169
- />
169
+ currentAssignee!.deleted ? (
170
+ <DeletedUserAvatar
171
+ size="sm"
172
+ className="h-6 w-6"
173
+ accessibleLabel={`Deleted user: ${currentAssignee!.name || currentAssignee!.id}`}
174
+ />
175
+ ) : (
176
+ <SquareAvatar
177
+ src={currentAssignee!.avatarSrc}
178
+ alt={currentAssignee!.name}
179
+ fallback={currentAssignee!.name || 'User'}
180
+ size="sm"
181
+ variant="round"
182
+ className="h-6 w-6"
183
+ />
184
+ )
170
185
  ) : (
171
186
  <UserIcon className="size-5 text-ods-text-secondary" />
172
187
  )
@@ -181,14 +196,18 @@ function DefaultAssigneeDropdown({
181
196
  if (hasAssignee) {
182
197
  return (
183
198
  <div className={cn('flex items-center gap-[var(--spacing-system-xs)] min-w-0', className)}>
184
- <SquareAvatar
185
- src={currentAssignee!.avatarSrc}
186
- alt={currentAssignee!.name}
187
- fallback={currentAssignee!.name || 'User'}
188
- size="md"
189
- variant="round"
190
- className="shrink-0"
191
- />
199
+ {currentAssignee!.deleted ? (
200
+ <DeletedUserAvatar size="md" accessibleLabel={`Deleted user: ${currentAssignee!.name || currentAssignee!.id}`} />
201
+ ) : (
202
+ <SquareAvatar
203
+ src={currentAssignee!.avatarSrc}
204
+ alt={currentAssignee!.name}
205
+ fallback={currentAssignee!.name || 'User'}
206
+ size="md"
207
+ variant="round"
208
+ className="shrink-0"
209
+ />
210
+ )}
192
211
  <div className="flex-1 min-w-0 overflow-hidden">
193
212
  <div className="flex flex-col justify-center">
194
213
  <div className="flex items-center gap-[var(--spacing-system-xxs)] w-full min-w-0">
@@ -198,7 +217,10 @@ function DefaultAssigneeDropdown({
198
217
  className="flex items-center gap-[var(--spacing-system-xxs)] cursor-pointer group text-left"
199
218
  >
200
219
  <PenEditIcon className="size-4 shrink-0 text-ods-text-secondary group-hover:text-ods-accent transition-colors" />
201
- <span className="text-h4 text-ods-text-primary truncate" title={currentAssignee!.name}>{currentAssignee!.name}</span>
220
+ <span
221
+ className={cn('text-h4 truncate', currentAssignee!.deleted ? 'text-ods-error' : 'text-ods-text-primary')}
222
+ title={currentAssignee!.name}
223
+ >{currentAssignee!.name}</span>
202
224
  </button>
203
225
  </div>
204
226
  <span className="text-h6 text-ods-text-secondary truncate">Assigned</span>
@@ -0,0 +1,52 @@
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import { UserXmarkIcon } from '../icons-v2-generated'
5
+ import { cn } from '../../utils/cn'
6
+
7
+ /** Mirrors SquareAvatar's size buckets (sm 32 / md 40 / lg 48). */
8
+ const SIZE_CLASSES = {
9
+ sm: 'h-8 w-8',
10
+ md: 'h-10 w-10',
11
+ lg: 'h-12 w-12',
12
+ } as const
13
+
14
+ const ICON_CLASSES = {
15
+ sm: 'w-4 h-4',
16
+ md: 'w-5 h-5',
17
+ lg: 'w-6 h-6',
18
+ } as const
19
+
20
+ export interface DeletedUserAvatarProps {
21
+ size?: keyof typeof SIZE_CLASSES
22
+ className?: string
23
+ /**
24
+ * Accessible name for the placeholder. Pass the user's identity when known
25
+ * (e.g. "Deleted user: Jane Doe") so assistive technology doesn't lose who
26
+ * the row refers to. Falls back to the generic "Deleted user".
27
+ */
28
+ accessibleLabel?: string
29
+ }
30
+
31
+ /**
32
+ * Red round user-x placeholder shown instead of the avatar for deleted users
33
+ * (accounts with status DELETED / SELF_DELETED). A dedicated component — not a
34
+ * `SquareAvatar` prop — because `SquareAvatar`'s only fallback is text
35
+ * initials, and initials for a deleted account is exactly what the design
36
+ * replaces.
37
+ */
38
+ export function DeletedUserAvatar({ size = 'md', className, accessibleLabel }: DeletedUserAvatarProps) {
39
+ return (
40
+ <span
41
+ role="img"
42
+ aria-label={accessibleLabel || 'Deleted user'}
43
+ className={cn(
44
+ 'flex items-center justify-center rounded-full bg-ods-error/20 shrink-0',
45
+ SIZE_CLASSES[size],
46
+ className,
47
+ )}
48
+ >
49
+ <UserXmarkIcon className={cn('text-ods-error', ICON_CLASSES[size])} />
50
+ </span>
51
+ )
52
+ }
@@ -103,6 +103,7 @@ export * from './page-actions'
103
103
  export * from './service-card'
104
104
  export * from './slider'
105
105
  export * from './avatar-stack'
106
+ export * from './deleted-user-avatar'
106
107
  export * from './square-avatar'
107
108
  export * from './tab-selector'
108
109
  export * from './tag'
@@ -57,6 +57,8 @@ export interface TicketInfoSectionProps {
57
57
  id: string
58
58
  name: string
59
59
  avatarSrc?: string
60
+ /** Deleted account (DELETED / SELF_DELETED) — renders the red user-x placeholder + red name. */
61
+ deleted?: boolean
60
62
  }
61
63
  options: TicketAssigneeOption[]
62
64
  isLoading?: boolean