@flamingo-stack/openframe-frontend-core 0.0.666 → 0.0.667-2387.7141.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 (95) hide show
  1. package/dist/{chunk-QSYYYL55.cjs → chunk-2FUSTKIV.cjs} +3 -3
  2. package/dist/{chunk-QSYYYL55.cjs.map → chunk-2FUSTKIV.cjs.map} +1 -1
  3. package/dist/{chunk-WI5LLFA6.cjs → chunk-3A6MM3CK.cjs} +13 -13
  4. package/dist/{chunk-WI5LLFA6.cjs.map → chunk-3A6MM3CK.cjs.map} +1 -1
  5. package/dist/{chunk-NIVLGQKS.js → chunk-4FHL6C5E.js} +2 -2
  6. package/dist/{chunk-HQHZZ3SL.js → chunk-57BIWOGD.js} +2 -2
  7. package/dist/{chunk-YVMSA7LR.js → chunk-5ZHLPC32.js} +5 -5
  8. package/dist/{chunk-XMY2XTHG.cjs → chunk-6M5NRLFI.cjs} +3 -3
  9. package/dist/{chunk-XMY2XTHG.cjs.map → chunk-6M5NRLFI.cjs.map} +1 -1
  10. package/dist/{chunk-O5GV3WQO.js → chunk-7ZIOUUWU.js} +2 -2
  11. package/dist/{chunk-JBRNIUYC.js → chunk-AAZLZBR5.js} +2 -2
  12. package/dist/{chunk-L7QXTWI7.cjs → chunk-AUHHSY5H.cjs} +17 -17
  13. package/dist/{chunk-L7QXTWI7.cjs.map → chunk-AUHHSY5H.cjs.map} +1 -1
  14. package/dist/{chunk-KDFSFVNX.cjs → chunk-B76ZH6HA.cjs} +10 -10
  15. package/dist/{chunk-KDFSFVNX.cjs.map → chunk-B76ZH6HA.cjs.map} +1 -1
  16. package/dist/{chunk-EYCF3GGM.js → chunk-BO2ZXX4Z.js} +5 -5
  17. package/dist/{chunk-CYPLD5F3.js → chunk-CEPI3A3T.js} +2 -2
  18. package/dist/{chunk-YAF2JKAK.cjs → chunk-CIB3QB2T.cjs} +51 -51
  19. package/dist/{chunk-YAF2JKAK.cjs.map → chunk-CIB3QB2T.cjs.map} +1 -1
  20. package/dist/{chunk-XSRIPH6U.cjs → chunk-CYBRUQ2Z.cjs} +17 -17
  21. package/dist/{chunk-XSRIPH6U.cjs.map → chunk-CYBRUQ2Z.cjs.map} +1 -1
  22. package/dist/{chunk-V3B37LQY.js → chunk-DG763XMY.js} +4 -4
  23. package/dist/{chunk-7H7LYI4M.cjs → chunk-DKBXW3EI.cjs} +4 -4
  24. package/dist/{chunk-7H7LYI4M.cjs.map → chunk-DKBXW3EI.cjs.map} +1 -1
  25. package/dist/{chunk-DDW7G6U7.js → chunk-DYFQCHUY.js} +4 -4
  26. package/dist/{chunk-CRDKQMTP.js → chunk-GKAZC2JI.js} +2 -2
  27. package/dist/{chunk-W2WEIVHT.cjs → chunk-JMPZUL2X.cjs} +36 -9
  28. package/dist/chunk-JMPZUL2X.cjs.map +1 -0
  29. package/dist/{chunk-R6NU4QFR.js → chunk-KS2PRUHN.js} +2 -2
  30. package/dist/{chunk-ZDGEJFDG.js → chunk-M6PDHXI5.js} +2 -2
  31. package/dist/{chunk-2S44CUCH.cjs → chunk-QHJ4GEDA.cjs} +4 -4
  32. package/dist/{chunk-2S44CUCH.cjs.map → chunk-QHJ4GEDA.cjs.map} +1 -1
  33. package/dist/{chunk-IUNCGKFP.cjs → chunk-SFMFRUY2.cjs} +3 -3
  34. package/dist/{chunk-IUNCGKFP.cjs.map → chunk-SFMFRUY2.cjs.map} +1 -1
  35. package/dist/{chunk-VI35TSB2.js → chunk-TN33GNFP.js} +3 -3
  36. package/dist/{chunk-ILAEMVAI.js → chunk-TSEYXPXZ.js} +54 -27
  37. package/dist/{chunk-ILAEMVAI.js.map → chunk-TSEYXPXZ.js.map} +1 -1
  38. package/dist/{chunk-OPY4JNY2.cjs → chunk-VUQWJUW7.cjs} +36 -36
  39. package/dist/{chunk-OPY4JNY2.cjs.map → chunk-VUQWJUW7.cjs.map} +1 -1
  40. package/dist/{chunk-AAIL6J56.cjs → chunk-WD73QMY3.cjs} +3 -3
  41. package/dist/{chunk-AAIL6J56.cjs.map → chunk-WD73QMY3.cjs.map} +1 -1
  42. package/dist/{chunk-VN2U4EBP.cjs → chunk-YW4LA55U.cjs} +33 -33
  43. package/dist/{chunk-VN2U4EBP.cjs.map → chunk-YW4LA55U.cjs.map} +1 -1
  44. package/dist/{chunk-VUYRTI3Z.cjs → chunk-Z5FOWR7O.cjs} +18 -18
  45. package/dist/{chunk-VUYRTI3Z.cjs.map → chunk-Z5FOWR7O.cjs.map} +1 -1
  46. package/dist/{chunk-SCRVQY42.js → chunk-ZRD3YAPM.js} +2 -2
  47. package/dist/components/case-studies/index.cjs +11 -11
  48. package/dist/components/case-studies/index.js +2 -2
  49. package/dist/components/contact/index.cjs +3 -3
  50. package/dist/components/contact/index.js +2 -2
  51. package/dist/components/docs/index.cjs +6 -6
  52. package/dist/components/docs/index.js +5 -5
  53. package/dist/components/embeds/index.cjs +3 -3
  54. package/dist/components/embeds/index.js +2 -2
  55. package/dist/components/faq/index.cjs +3 -3
  56. package/dist/components/faq/index.js +2 -2
  57. package/dist/components/features/board/ticket-card.d.ts +13 -3
  58. package/dist/components/features/board/ticket-card.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 +31 -31
  64. package/dist/components/index.js +12 -12
  65. package/dist/components/meeting-scheduler/index.cjs +21 -21
  66. package/dist/components/meeting-scheduler/index.js +1 -1
  67. package/dist/components/navigation/index.cjs +5 -5
  68. package/dist/components/navigation/index.js +4 -4
  69. package/dist/components/onboarding-guides/index.cjs +5 -5
  70. package/dist/components/onboarding-guides/index.js +4 -4
  71. package/dist/components/tickets/index.cjs +6 -6
  72. package/dist/components/tickets/index.js +5 -5
  73. package/dist/components/ui/index.cjs +2 -2
  74. package/dist/components/ui/index.js +1 -1
  75. package/dist/index.cjs +6 -6
  76. package/dist/index.js +5 -5
  77. package/package.json +1 -1
  78. package/src/__tests__/ticket-card-meta.test.tsx +39 -1
  79. package/src/components/features/board/.ticket-card.md +2 -2
  80. package/src/components/features/board/ticket-card.tsx +49 -10
  81. package/dist/chunk-W2WEIVHT.cjs.map +0 -1
  82. /package/dist/{chunk-NIVLGQKS.js.map → chunk-4FHL6C5E.js.map} +0 -0
  83. /package/dist/{chunk-HQHZZ3SL.js.map → chunk-57BIWOGD.js.map} +0 -0
  84. /package/dist/{chunk-YVMSA7LR.js.map → chunk-5ZHLPC32.js.map} +0 -0
  85. /package/dist/{chunk-O5GV3WQO.js.map → chunk-7ZIOUUWU.js.map} +0 -0
  86. /package/dist/{chunk-JBRNIUYC.js.map → chunk-AAZLZBR5.js.map} +0 -0
  87. /package/dist/{chunk-EYCF3GGM.js.map → chunk-BO2ZXX4Z.js.map} +0 -0
  88. /package/dist/{chunk-CYPLD5F3.js.map → chunk-CEPI3A3T.js.map} +0 -0
  89. /package/dist/{chunk-V3B37LQY.js.map → chunk-DG763XMY.js.map} +0 -0
  90. /package/dist/{chunk-DDW7G6U7.js.map → chunk-DYFQCHUY.js.map} +0 -0
  91. /package/dist/{chunk-CRDKQMTP.js.map → chunk-GKAZC2JI.js.map} +0 -0
  92. /package/dist/{chunk-R6NU4QFR.js.map → chunk-KS2PRUHN.js.map} +0 -0
  93. /package/dist/{chunk-ZDGEJFDG.js.map → chunk-M6PDHXI5.js.map} +0 -0
  94. /package/dist/{chunk-VI35TSB2.js.map → chunk-TN33GNFP.js.map} +0 -0
  95. /package/dist/{chunk-SCRVQY42.js.map → chunk-ZRD3YAPM.js.map} +0 -0
@@ -7,6 +7,7 @@ import { preserveOffsetOnSource } from '@atlaskit/pragmatic-drag-and-drop/elemen
7
7
  import { setCustomNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/set-custom-native-drag-preview';
8
8
  import {
9
9
  memo,
10
+ useCallback,
10
11
  useEffect,
11
12
  useMemo,
12
13
  useRef,
@@ -82,11 +83,27 @@ export interface TicketCardBodyProps {
82
83
  * `TicketCard` adapts its own `(ticketId, requestId)` signature onto these). */
83
84
  onApprove?: (requestId?: string) => void | Promise<void>;
84
85
  onReject?: (requestId?: string) => void | Promise<void>;
86
+ /** Where the card opens. The body sits above the card's own link with pointer
87
+ * events off, but the number/time line has to take them back for its tooltip -
88
+ * so with an `href` that line is a link of its own, and a click on it opens the
89
+ * ticket like a click anywhere else on the card. That link is out of the tab
90
+ * order, so pass `href` only from a card that already renders its own focusable
91
+ * link to the same place, as `TicketCard` does. */
92
+ href?: string;
93
+ onLinkClick?: (e: MouseEvent) => void;
85
94
  }
86
95
 
87
96
  /** The card's inner content: title + device/org, priority + assignees, tags,
88
97
  * timestamp, "New Message", and the approval row. Pure — driven only by props. */
89
- export function TicketCardBody({ ticket, columnColor, renderAssignSlot, onApprove, onReject }: TicketCardBodyProps) {
98
+ export function TicketCardBody({
99
+ ticket,
100
+ columnColor,
101
+ renderAssignSlot,
102
+ onApprove,
103
+ onReject,
104
+ href,
105
+ onLinkClick,
106
+ }: TicketCardBodyProps) {
90
107
  const showNewMessage = !!ticket.hasNewMessage && !!columnColor;
91
108
  const newMessageTextColor = columnColor ? getReadableTextColor(columnColor) : undefined;
92
109
 
@@ -143,6 +160,22 @@ export function TicketCardBody({ ticket, columnColor, renderAssignSlot, onApprov
143
160
  // may be empty - the hub hero card and tickets without one send '' - so either
144
161
  // half stands on its own and the line disappears with both missing.
145
162
  const metaLabel = [ticket.ticketNumber || null, timestampLabel].filter(Boolean).join(' \u2022 ');
163
+ const metaClass = 'truncate text-ods-text-secondary text-h6';
164
+ // Out of the tab order: the card's own link is the one stop for the ticket.
165
+ const meta = href ? (
166
+ <Link
167
+ href={href}
168
+ draggable={false}
169
+ prefetch={false}
170
+ tabIndex={-1}
171
+ onClick={onLinkClick}
172
+ className={cn('pointer-events-auto block', metaClass)}
173
+ >
174
+ {metaLabel}
175
+ </Link>
176
+ ) : (
177
+ <p className={cn(tooltipLabel && 'pointer-events-auto', metaClass)}>{metaLabel}</p>
178
+ );
146
179
 
147
180
  return (
148
181
  <>
@@ -165,14 +198,12 @@ export function TicketCardBody({ ticket, columnColor, renderAssignSlot, onApprov
165
198
  (tooltipLabel ? (
166
199
  <TooltipProvider>
167
200
  <Tooltip>
168
- <TooltipTrigger asChild>
169
- <p className="pointer-events-auto truncate text-ods-text-secondary text-h6">{metaLabel}</p>
170
- </TooltipTrigger>
201
+ <TooltipTrigger asChild>{meta}</TooltipTrigger>
171
202
  <TooltipContent>{tooltipLabel}</TooltipContent>
172
203
  </Tooltip>
173
204
  </TooltipProvider>
174
205
  ) : (
175
- <p className="truncate text-ods-text-secondary text-h6">{metaLabel}</p>
206
+ meta
176
207
  ))}
177
208
  {ticket.escalatedByUser && (
178
209
  <div className="flex items-center gap-[var(--spacing-system-xxs)] text-ods-open-yellow text-h6">
@@ -215,7 +246,9 @@ export function TicketCardBody({ ticket, columnColor, renderAssignSlot, onApprov
215
246
  // drag-and-drop / board context (for embeds, marketing heroes, previews).
216
247
  // =============================================================================
217
248
 
218
- export interface TicketCardViewProps extends TicketCardBodyProps {
249
+ /** No `href`: the static card has no card-wide link for keyboard users, so the
250
+ * number/time line must not become a pointer-only one. */
251
+ export interface TicketCardViewProps extends Omit<TicketCardBodyProps, 'href' | 'onLinkClick'> {
219
252
  className?: string;
220
253
  /** Merged over the shell's own — the board uses it to fade the copy it leaves
221
254
  * behind and to place the one that follows the pointer. */
@@ -412,9 +445,13 @@ export const TicketCard = memo(function TicketCardImpl({
412
445
  const style: CSSProperties = {};
413
446
  if (showNewMessage) style.borderColor = columnColor;
414
447
 
415
- const handleClick = (e: MouseEvent) => {
416
- if (isDragging) e.preventDefault();
417
- };
448
+ // Stable between drags: it is handed into the memoized body below.
449
+ const handleClick = useCallback(
450
+ (e: MouseEvent) => {
451
+ if (isDragging) e.preventDefault();
452
+ },
453
+ [isDragging],
454
+ );
418
455
 
419
456
  // Held as one memoized element, not re-created per render. A card being
420
457
  // dragged over re-renders on every edge flip — it owns the hover state that
@@ -430,9 +467,11 @@ export const TicketCard = memo(function TicketCardImpl({
430
467
  renderAssignSlot={renderAssignSlot}
431
468
  onApprove={onApprove ? requestId => onApprove(ticket.id, requestId) : undefined}
432
469
  onReject={onReject ? requestId => onReject(ticket.id, requestId) : undefined}
470
+ href={href}
471
+ onLinkClick={handleClick}
433
472
  />
434
473
  ),
435
- [ticket, columnColor, renderAssignSlot, onApprove, onReject],
474
+ [ticket, columnColor, renderAssignSlot, onApprove, onReject, href, handleClick],
436
475
  );
437
476
 
438
477
  // No transition on the margins below, and that is not a style choice: room is