@flamingo-stack/openframe-frontend-core 0.0.767 → 0.0.769

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 (143) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-REJMFXGD.cjs → chunk-2MND64QJ.cjs} +46 -46
  3. package/dist/{chunk-BXMDLQUA.cjs → chunk-2TS3FEPQ.cjs} +4 -4
  4. package/dist/{chunk-KHISVNNH.cjs → chunk-3AZZFTT6.cjs} +6 -6
  5. package/dist/{chunk-DGNBXZXT.cjs → chunk-4EJU462O.cjs} +57 -30
  6. package/dist/{chunk-GJ5DHDFQ.cjs → chunk-5HWBW7WU.cjs} +12 -12
  7. package/dist/{chunk-IKXUJUXC.cjs → chunk-5O6PHVKO.cjs} +4 -4
  8. package/dist/{chunk-XZ6DKGT4.cjs → chunk-5QP3K2CE.cjs} +5 -5
  9. package/dist/{chunk-NO2DEFAP.cjs → chunk-BIHMMGRP.cjs} +80 -80
  10. package/dist/{chunk-YRFWOJF4.cjs → chunk-BLTNKLAX.cjs} +4 -4
  11. package/dist/{chunk-I7A5MPXA.cjs → chunk-D45Q3WEP.cjs} +3 -3
  12. package/dist/{chunk-WEPIWJGR.cjs → chunk-DEJB5WHZ.cjs} +26 -26
  13. package/dist/{chunk-GTONIRJU.cjs → chunk-EHJE3UWZ.cjs} +10 -16
  14. package/dist/{chunk-XIXR6BHI.cjs → chunk-EZTHTSWZ.cjs} +44 -44
  15. package/dist/{chunk-UHDBMKJB.cjs → chunk-GGORS7G6.cjs} +13 -13
  16. package/dist/{chunk-FZB4RMRK.cjs → chunk-HQF62LAU.cjs} +33 -33
  17. package/dist/{chunk-JTSUAHDL.cjs → chunk-HY6BCZH7.cjs} +4 -2
  18. package/dist/{chunk-MNIMYGFR.cjs → chunk-IEPWXEA6.cjs} +31 -31
  19. package/dist/{chunk-FVH53QZJ.cjs → chunk-L5WSNX4H.cjs} +517 -550
  20. package/dist/{chunk-MPTMT773.cjs → chunk-LJT2KRE2.cjs} +14 -14
  21. package/dist/{chunk-NBVZIHGS.cjs → chunk-MYA6NR2C.cjs} +2 -2
  22. package/dist/{chunk-ZV45VS6K.cjs → chunk-MZLWB5AH.cjs} +35 -44
  23. package/dist/{chunk-GQ7RGD4Y.cjs → chunk-QC47HVA4.cjs} +76 -76
  24. package/dist/{chunk-ZRDMGMY7.cjs → chunk-QS4G7CHU.cjs} +2 -2
  25. package/dist/{chunk-TPOLNGOW.cjs → chunk-SV6K7ZLA.cjs} +41 -41
  26. package/dist/{chunk-JBJVUQVH.cjs → chunk-UBPSA3RM.cjs} +87 -87
  27. package/dist/{chunk-7TJVYRHR.cjs → chunk-UIXWG2IW.cjs} +24 -24
  28. package/dist/{chunk-AAECWUNV.cjs → chunk-VFUMM6JC.cjs} +19 -11
  29. package/dist/{chunk-7ZU3AVEX.cjs → chunk-VVBRYOSI.cjs} +19 -19
  30. package/dist/{chunk-M2UU3CWX.cjs → chunk-YTPEJIAO.cjs} +5 -5
  31. package/dist/{chunk-RMUSPTJN.cjs → chunk-ZVNL5OK6.cjs} +5 -5
  32. package/dist/{chunk-YL6ZB2SR.cjs → chunk-ZXFOMNI5.cjs} +183 -183
  33. package/dist/{cloud-tenants-WXK5RDSY.cjs → cloud-tenants-3BEIT4LX.cjs} +13 -13
  34. package/dist/components/case-studies/index.cjs +29 -29
  35. package/dist/components/case-studies/index.d.ts +1 -1
  36. package/dist/components/case-studies/index.d.ts.map +1 -1
  37. package/dist/components/case-studies/index.js +5 -1
  38. package/dist/components/chat/entity-cards/campaign-card-admin.d.ts.map +1 -1
  39. package/dist/components/chat/entity-cards/investor-update-card.d.ts.map +1 -1
  40. package/dist/components/chat/entity-cards/investor-update-card.js +9 -1
  41. package/dist/components/chat/hooks/use-ask-prompts.d.ts.map +1 -1
  42. package/dist/components/chat/index.cjs +9 -9
  43. package/dist/components/contact/index.cjs +14 -14
  44. package/dist/components/docs/index.cjs +17 -17
  45. package/dist/components/embeds/index.cjs +14 -14
  46. package/dist/components/faq/index.cjs +15 -15
  47. package/dist/components/features/cards-strip.d.ts.map +1 -1
  48. package/dist/components/features/command-box.d.ts.map +1 -1
  49. package/dist/components/features/command-box.js +2 -19
  50. package/dist/components/features/index.cjs +13 -13
  51. package/dist/components/features/paths-display.d.ts.map +1 -1
  52. package/dist/components/features/remote-session/remote-desktop-chat-message-row.d.ts.map +1 -1
  53. package/dist/components/features/remote-session/remote-desktop-chat-message-row.js +1 -10
  54. package/dist/components/features/remote-session/remote-session-keep-modals.d.ts.map +1 -1
  55. package/dist/components/features/remote-session/remote-session-keep-modals.js +1 -1
  56. package/dist/components/help-center-pages/index.cjs +98 -98
  57. package/dist/components/icon-display.d.ts.map +1 -1
  58. package/dist/components/icon-display.js +9 -1
  59. package/dist/components/index.cjs +74 -74
  60. package/dist/components/interactive-wrapper.d.ts.map +1 -1
  61. package/dist/components/interactive-wrapper.js +7 -1
  62. package/dist/components/layout/page-heading.d.ts.map +1 -1
  63. package/dist/components/layout/page-heading.js +8 -1
  64. package/dist/components/meeting-scheduler/directory.d.ts.map +1 -1
  65. package/dist/components/meeting-scheduler/index.cjs +73 -73
  66. package/dist/components/navigation/index.cjs +16 -16
  67. package/dist/components/onboarding-guides/index.cjs +16 -16
  68. package/dist/components/product-demo/index.cjs +24 -24
  69. package/dist/components/related-content/index.cjs +7 -7
  70. package/dist/components/results-count.d.ts.map +1 -1
  71. package/dist/components/results-count.js +2 -2
  72. package/dist/components/tickets/index.cjs +19 -19
  73. package/dist/components/ui/avatar-stack.d.ts.map +1 -1
  74. package/dist/components/ui/avatar-stack.js +17 -9
  75. package/dist/components/ui/cursor-pagination.d.ts.map +1 -1
  76. package/dist/components/ui/data-table/data-table-row-count.js +1 -1
  77. package/dist/components/ui/date-picker.d.ts.map +1 -1
  78. package/dist/components/ui/date-picker.js +16 -3
  79. package/dist/components/ui/feature-card.d.ts.map +1 -1
  80. package/dist/components/ui/feature-list.d.ts.map +1 -1
  81. package/dist/components/ui/feature-list.js +7 -21
  82. package/dist/components/ui/incident-feed.d.ts +1 -1
  83. package/dist/components/ui/incident-feed.d.ts.map +1 -1
  84. package/dist/components/ui/incident-feed.js +1 -7
  85. package/dist/components/ui/index.cjs +13 -13
  86. package/dist/components/ui/leader-row.d.ts.map +1 -1
  87. package/dist/components/ui/product-screen-frame.d.ts.map +1 -1
  88. package/dist/components/ui/product-screen-frame.js +4 -13
  89. package/dist/components/ui/status-badge.d.ts.map +1 -1
  90. package/dist/components/ui/status-badge.js +5 -1
  91. package/dist/components/ui/status-line.d.ts.map +1 -1
  92. package/dist/components/ui/status-line.js +1 -7
  93. package/dist/components/ui/strip-card.d.ts.map +1 -1
  94. package/dist/components/ui/tag.d.ts.map +1 -1
  95. package/dist/{devices-UHHHTCJF.cjs → devices-ZCOK24D4.cjs} +14 -14
  96. package/dist/{embeddable-chat-YL6ZSTDJ.cjs → embeddable-chat-BXEK3SPJ.cjs} +83 -83
  97. package/dist/index.cjs +20 -18
  98. package/dist/{knowledge-TJKHM7W4.cjs → knowledge-W47QGTEK.cjs} +14 -14
  99. package/dist/{logs-B3KCCMPE.cjs → logs-3DMPE2TM.cjs} +21 -21
  100. package/dist/{policies-ZTUIXSYZ.cjs → policies-UWHW765K.cjs} +17 -17
  101. package/dist/{remote-session-PPA5SXX7.cjs → remote-session-WVORQV7V.cjs} +7 -7
  102. package/dist/{scripts-FIFAHBS6.cjs → scripts-BH7V2ZC4.cjs} +20 -20
  103. package/dist/{software-update-62PLASQU.cjs → software-update-W6AAGJ2H.cjs} +17 -17
  104. package/dist/{tickets-board-G3WBH4SV.cjs → tickets-board-YT25IX3O.cjs} +8 -8
  105. package/dist/utils/format.d.ts +13 -3
  106. package/dist/utils/format.d.ts.map +1 -1
  107. package/dist/utils/format.js +4 -2
  108. package/dist/utils/index.cjs +3 -1
  109. package/dist/utils/index.d.ts +1 -1
  110. package/dist/utils/index.d.ts.map +1 -1
  111. package/dist/utils/index.js +2 -0
  112. package/package.json +1 -1
  113. package/src/components/case-studies/entity-quotes-panel.tsx +18 -18
  114. package/src/components/case-studies/index.ts +8 -1
  115. package/src/components/chat/entity-cards/campaign-card-admin.tsx +1 -3
  116. package/src/components/chat/entity-cards/investor-update-card.tsx +6 -1
  117. package/src/components/chat/hooks/use-ask-prompts.ts +1 -2
  118. package/src/components/features/cards-strip.tsx +3 -2
  119. package/src/components/features/command-box.tsx +2 -11
  120. package/src/components/features/paths-display.tsx +4 -1
  121. package/src/components/features/remote-session/remote-desktop-chat-message-row.tsx +1 -6
  122. package/src/components/features/remote-session/remote-session-keep-modals.tsx +2 -1
  123. package/src/components/icon-display.tsx +6 -1
  124. package/src/components/interactive-wrapper.tsx +4 -1
  125. package/src/components/layout/page-heading.tsx +15 -3
  126. package/src/components/meeting-scheduler/directory.tsx +2 -1
  127. package/src/components/results-count.tsx +3 -2
  128. package/src/components/ui/avatar-stack.tsx +5 -1
  129. package/src/components/ui/button/button-styles.ts +0 -1
  130. package/src/components/ui/cursor-pagination.tsx +8 -1
  131. package/src/components/ui/data-table/data-table-row-count.tsx +1 -1
  132. package/src/components/ui/date-picker.tsx +41 -14
  133. package/src/components/ui/feature-card.tsx +2 -10
  134. package/src/components/ui/feature-list.tsx +2 -8
  135. package/src/components/ui/incident-feed.tsx +2 -13
  136. package/src/components/ui/leader-row.tsx +0 -1
  137. package/src/components/ui/product-screen-frame.tsx +1 -6
  138. package/src/components/ui/status-badge.tsx +5 -1
  139. package/src/components/ui/status-line.tsx +1 -4
  140. package/src/components/ui/strip-card.tsx +1 -3
  141. package/src/components/ui/tag.tsx +3 -1
  142. package/src/utils/format.ts +16 -4
  143. package/src/utils/index.ts +1 -0
@@ -188,11 +188,12 @@ function toValidDate(date) {
188
188
  const d = date instanceof Date ? date : new Date(date);
189
189
  return Number.isNaN(d.getTime()) ? null : d;
190
190
  }
191
+ const viewerLocale = () => typeof navigator === "undefined" ? void 0 : navigator.language || void 0;
191
192
  function formatDateWithTimezone(date, timezone, style = "medium", options) {
192
193
  const dateObj = toValidDate(date);
193
194
  if (!dateObj) return "";
194
195
  const { timeZone: _ignored, ...fields } = typeof style === "string" ? ZONED_DATE_STYLES[style] : style;
195
- return formatterFor(timezone, fields, options?.viewerLocale ? void 0 : "en-US").format(dateObj);
196
+ return formatterFor(timezone, fields, options?.viewerLocale ? viewerLocale() : "en-US").format(dateObj);
196
197
  }
197
198
  function formatDateTimeYmd(date, timezone, options) {
198
199
  const dateObj = toValidDate(date);
@@ -471,5 +472,6 @@ export {
471
472
  personInitials,
472
473
  singleInitial,
473
474
  stripHtml,
474
- titleCaseFromSlug
475
+ titleCaseFromSlug,
476
+ viewerLocale
475
477
  };
@@ -80412,11 +80412,12 @@ function toValidDate(date) {
80412
80412
  const d = date instanceof Date ? date : new Date(date);
80413
80413
  return Number.isNaN(d.getTime()) ? null : d;
80414
80414
  }
80415
+ var viewerLocale = () => typeof navigator === "undefined" ? void 0 : navigator.language || void 0;
80415
80416
  function formatDateWithTimezone(date, timezone, style = "medium", options) {
80416
80417
  const dateObj = toValidDate(date);
80417
80418
  if (!dateObj) return "";
80418
80419
  const { timeZone: _ignored, ...fields } = typeof style === "string" ? ZONED_DATE_STYLES[style] : style;
80419
- return formatterFor(timezone, fields, options?.viewerLocale ? void 0 : "en-US").format(dateObj);
80420
+ return formatterFor(timezone, fields, options?.viewerLocale ? viewerLocale() : "en-US").format(dateObj);
80420
80421
  }
80421
80422
  function formatDateTimeYmd(date, timezone, options) {
80422
80423
  const dateObj = toValidDate(date);
@@ -86591,6 +86592,7 @@ exports.validateEmailDomainList = validateEmailDomainList;
86591
86592
  exports.validatePhoneNumber = validatePhoneNumber;
86592
86593
  exports.vendorClassificationCopy = vendorClassificationCopy;
86593
86594
  exports.vendorClassificationGroup = vendorClassificationGroup;
86595
+ exports.viewerLocale = viewerLocale;
86594
86596
  exports.walkthroughDismissCookieName = walkthroughDismissCookieName;
86595
86597
  exports.webinarTiming = webinarTiming;
86596
86598
  exports.withFirstTouchAttribution = withFirstTouchAttribution;
@@ -44,7 +44,7 @@ export * from './after-page-load';
44
44
  export * from './dismissal-storage';
45
45
  export * from './walkthrough-deep-link';
46
46
  export { type GetProxiedImageUrlOptions, getProxiedImageUrl, urlPathLooksLikeSvg, shouldProxyImage, generateImageSizes, skipsImageOptimizer, } from './image-proxy';
47
- export { formatLargeNumber, formatAbbreviatedNumber, nameInitials, personFirstName, personInitials, singleInitial, formatDurationMMSS, formatDurationCompact, formatTimeWithTimezone, formatDateWithTimezone, formatDateTimeYmd, VIEWER_TIMEZONE, formatWebinarTimeMeta, formatProgramDate, formatProgramDateRange, formatProgramTimeRange, type ZonedDateStyle, formatDurationFromRange, isOrderedRange, type FormatDateUTCOptions, formatDateUTC, formatEntryMonthUTC, formatCurrency, formatPercent, formatWholeDollars, formatLegalDate, formatBytesShort, formatFileSize, formatDateTimeAt, formatDurationFromMs, type MetricFormat, type TrendPolarity, formatCompactMetric, getTrendColors, formatDateRange, formatDuration, formatUnderscoreText, titleCaseFromSlug, stripHtml, formatBioText, formatClassification, formatPricingModel, } from './format';
47
+ export { formatLargeNumber, formatAbbreviatedNumber, nameInitials, personFirstName, personInitials, singleInitial, formatDurationMMSS, formatDurationCompact, formatTimeWithTimezone, formatDateWithTimezone, formatDateTimeYmd, VIEWER_TIMEZONE, viewerLocale, formatWebinarTimeMeta, formatProgramDate, formatProgramDateRange, formatProgramTimeRange, type ZonedDateStyle, formatDurationFromRange, isOrderedRange, type FormatDateUTCOptions, formatDateUTC, formatEntryMonthUTC, formatCurrency, formatPercent, formatWholeDollars, formatLegalDate, formatBytesShort, formatFileSize, formatDateTimeAt, formatDurationFromMs, type MetricFormat, type TrendPolarity, formatCompactMetric, getTrendColors, formatDateRange, formatDuration, formatUnderscoreText, titleCaseFromSlug, stripHtml, formatBioText, formatClassification, formatPricingModel, } from './format';
48
48
  export { formatRelativeTime, formatAbsoluteDate, formatDateTime, getDetailedTimeDifference, isToday, isWithinMinutes, createUTCTimestamp, formatTicketRelativeTime, formatTicketFullTimestamp, } from './date-utils';
49
49
  export { SOURCE_ICON_NAMES, getSourceIconName, SOURCE_LABELS_BY_TABLE, getSourceLabel } from './source-icons';
50
50
  export { DOC_TABLE_TYPES, groupsByTable, recordCountLabel, buildGroupedSource, groupSourcesByTable, formatCitationIndices, type GroupedSourceRow, } from './source-grouping';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
@@ -110,6 +110,7 @@ import {
110
110
  formatDateWithTimezone,
111
111
  formatDateTimeYmd,
112
112
  VIEWER_TIMEZONE,
113
+ viewerLocale,
113
114
  formatWebinarTimeMeta,
114
115
  formatProgramDate,
115
116
  formatProgramDateRange,
@@ -464,5 +465,6 @@ export {
464
465
  usePlatformColors,
465
466
  vendorClassificationCopy,
466
467
  vendorClassificationGroup,
468
+ viewerLocale,
467
469
  webinarTiming
468
470
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.767",
3
+ "version": "0.0.769",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -33,24 +33,24 @@ export function EntityQuotesPanel({ quotes, className }: EntityQuotesPanelProps)
33
33
  // Optional per record, so the loading state draws none: the gate leaves the loaded panel out of its comparison.
34
34
  // A plain block around the one panel, so the parent's spacing applies to it as it did to the panel.
35
35
  <div data-loading-optional>
36
- <StackedRowsPanel
37
- className={className}
38
- title={`${ENTITY_QUOTES_TITLE} · ${quotes.length}`}
39
- rows={quotes.map(q => ({
40
- id: q.key,
41
- columns: [
42
- {
43
- key: 'quote',
44
- content: (
45
- <blockquote className={QUOTE_CLASS}>
46
- <p className={QUOTE_TEXT_CLASS}>&ldquo;{q.text}&rdquo;</p>
47
- {q.speaker && <p className={QUOTE_SPEAKER_CLASS}>{q.speaker}</p>}
48
- </blockquote>
49
- ),
50
- },
51
- ],
52
- }))}
53
- />
36
+ <StackedRowsPanel
37
+ className={className}
38
+ title={`${ENTITY_QUOTES_TITLE} · ${quotes.length}`}
39
+ rows={quotes.map(q => ({
40
+ id: q.key,
41
+ columns: [
42
+ {
43
+ key: 'quote',
44
+ content: (
45
+ <blockquote className={QUOTE_CLASS}>
46
+ <p className={QUOTE_TEXT_CLASS}>&ldquo;{q.text}&rdquo;</p>
47
+ {q.speaker && <p className={QUOTE_SPEAKER_CLASS}>{q.speaker}</p>}
48
+ </blockquote>
49
+ ),
50
+ },
51
+ ],
52
+ }))}
53
+ />
54
54
  </div>
55
55
  );
56
56
  }
@@ -1,3 +1,10 @@
1
1
  export { ShareExperienceSection, type ShareExperienceSectionProps } from './share-experience-section';
2
2
  export { EntityQuotesPanel, EntityQuotesPanelSkeleton, type EntityQuotesPanelProps } from './entity-quotes-panel';
3
- export { QuoteCardTile, QuoteCardTileSkeleton, QuoteCardsStrip, type QuoteCard, type QuoteCardTileProps, type QuoteCardsStripProps } from './quote-cards-strip';
3
+ export {
4
+ QuoteCardTile,
5
+ QuoteCardTileSkeleton,
6
+ QuoteCardsStrip,
7
+ type QuoteCard,
8
+ type QuoteCardTileProps,
9
+ type QuoteCardsStripProps,
10
+ } from './quote-cards-strip';
@@ -95,7 +95,5 @@ export function CampaignCardAdmin({ campaign, className, anchorProps }: Campaign
95
95
  }
96
96
 
97
97
  export function CampaignCardAdminSkeleton({ className }: { className?: string }) {
98
- return (
99
- <CompactCardSkeleton rows={[{ width: 'w-1/2' }, { width: 'w-11/12' }]} className={className} />
100
- );
98
+ return <CompactCardSkeleton rows={[{ width: 'w-1/2' }, { width: 'w-11/12' }]} className={className} />;
101
99
  }
@@ -80,7 +80,12 @@ export function InvestorUpdateCardSkeleton({
80
80
  }
81
81
  if (size === 'sm') {
82
82
  return (
83
- <CompactCardSkeleton titleWidth="w-1/2" titleBadges={['w-8']} rows={[{ width: 'w-1/3' }, { width: 'w-11/12' }]} className={className} />
83
+ <CompactCardSkeleton
84
+ titleWidth="w-1/2"
85
+ titleBadges={['w-8']}
86
+ rows={[{ width: 'w-1/3' }, { width: 'w-11/12' }]}
87
+ className={className}
88
+ />
84
89
  );
85
90
  }
86
91
  return null;
@@ -230,8 +230,7 @@ export function useAskSurface({
230
230
  const queue = useAskQueue();
231
231
  // In a loading scope a surface takes no turn and picks nothing: it draws its loading state.
232
232
  const held = useLoadingScope();
233
- const picks =
234
- !held && assistantAvailable(assistant) && !!assistant.askPromptsUrl && enabled && exclude !== null;
233
+ const picks = !held && assistantAvailable(assistant) && !!assistant.askPromptsUrl && enabled && exclude !== null;
235
234
 
236
235
  // A layout effect: surfaces a page mounts together take their turns in document order.
237
236
  useLayoutEffect(() => {
@@ -307,7 +307,6 @@ function ManagedCell({
307
307
  // Component
308
308
  // =============================================================================
309
309
 
310
-
311
310
  export function CardsStrip<T = unknown>(props: CardsStripProps<T>): React.ReactElement | null {
312
311
  const {
313
312
  title,
@@ -801,7 +800,9 @@ export function CardsStrip<T = unknown>(props: CardsStripProps<T>): React.ReactE
801
800
  return <ManagedCell item={item} ctx={ctx} cardWidthMobile={cardWidthMobile} cardWidthDesktop={cardWidthDesktop} />;
802
801
  };
803
802
 
804
- const heading = showTitle && title && <h2 className={`${SECTION_HEADING_CLASS} break-words`}>{accentSentenceMarks(title)}</h2>;
803
+ const heading = showTitle && title && (
804
+ <h2 className={`${SECTION_HEADING_CLASS} break-words`}>{accentSentenceMarks(title)}</h2>
805
+ );
805
806
  if (items.length === 0) {
806
807
  // Outside a loading state an empty strip is nothing; inside one, a strip whose host states a skeleton draws it
807
808
  // (a host that states none expects no strip, e.g. a record with no bites).
@@ -166,11 +166,7 @@ export function CommandBox({
166
166
  and collapsing on each one would fold an expanded box under the
167
167
  typist, the exact jump this mode exists to prevent. Nothing goes stale
168
168
  without it: the expanded height is re-measured on every commit. */}
169
- <FadePreview
170
- fixedHeight
171
- collapsedHeight={fixedCommandHeight(visibleLines)}
172
- labels={COMMAND_TOGGLE_LABELS}
173
- >
169
+ <FadePreview fixedHeight collapsedHeight={fixedCommandHeight(visibleLines)} labels={COMMAND_TOGGLE_LABELS}>
174
170
  {text}
175
171
  </FadePreview>
176
172
  </div>
@@ -185,12 +181,7 @@ export function CommandBox({
185
181
  {onCopy ? (
186
182
  <div className={COMMAND_BOX_COPY_ROW_CLASS}>
187
183
  {commandText}
188
- <button
189
- type="button"
190
- onClick={onCopy}
191
- aria-label={copyAriaLabel}
192
- className={COMMAND_BOX_COPY_BUTTON_CLASS}
193
- >
184
+ <button type="button" onClick={onCopy} aria-label={copyAriaLabel} className={COMMAND_BOX_COPY_BUTTON_CLASS}>
194
185
  <Copy02Icon className="h-5 w-5" />
195
186
  </button>
196
187
  </div>
@@ -158,7 +158,10 @@ export function PathsDisplaySkeleton({
158
158
  copyIconSize = 'w-6 h-6',
159
159
  leadingIcon,
160
160
  className,
161
- }: Pick<PathsDisplayProps, 'title' | 'description' | 'showCopyButtons' | 'copyIconSize' | 'leadingIcon' | 'className'> & {
161
+ }: Pick<
162
+ PathsDisplayProps,
163
+ 'title' | 'description' | 'showCopyButtons' | 'copyIconSize' | 'leadingIcon' | 'className'
164
+ > & {
162
165
  rows?: number;
163
166
  }) {
164
167
  return (
@@ -43,12 +43,7 @@ export function RemoteDesktopChatMessageRow({
43
43
  {isTechnician && (
44
44
  <SquareAvatar variant="round" sizePx={24} src={avatarUrl} alt={authorName} className="shrink-0" />
45
45
  )}
46
- <span
47
- className={cn(
48
- MESSAGE_NAME_CLASS,
49
- isTechnician ? 'text-ods-accent' : 'text-ods-text-secondary',
50
- )}
51
- >
46
+ <span className={cn(MESSAGE_NAME_CLASS, isTechnician ? 'text-ods-accent' : 'text-ods-text-secondary')}>
52
47
  {authorName}
53
48
  </span>
54
49
  {/* The time is in the viewer's zone, which a server render cannot know. */}
@@ -181,7 +181,8 @@ export function ReleaseKeepingModal({
181
181
  <ModalV2Title>Release Keeping</ModalV2Title>
182
182
  </ModalV2Header>
183
183
 
184
- <div className="flex w-full flex-col gap-[var(--spacing-system-xsf)] text-ods-text-primary text-h4">
184
+ {/* break-words: a free-text reason ("Other") can be one long word, which ran past the modal's edge. */}
185
+ <div className="flex w-full flex-col gap-[var(--spacing-system-xsf)] break-words text-ods-text-primary text-h4">
185
186
  <p>
186
187
  Kept by {keptBy} on {keptOn} for {reason}.
187
188
  </p>
@@ -46,7 +46,12 @@ export function EntityIcon({
46
46
  // In a loading scope the icon is data still being read: a box of its size.
47
47
  if (held) {
48
48
  return (
49
- <UnifiedSkeleton as="span" width={size} height={size} className={cn('inline-block shrink-0 rounded-md', className)} />
49
+ <UnifiedSkeleton
50
+ as="span"
51
+ width={size}
52
+ height={size}
53
+ className={cn('inline-block shrink-0 rounded-md', className)}
54
+ />
50
55
  );
51
56
  }
52
57
  if (!icon?.url && identity?.url) {
@@ -176,7 +176,10 @@ export const InteractiveWrapper = forwardRef<HTMLElement, InteractiveWrapperProp
176
176
  ) : null,
177
177
  /* Loading Overlay */
178
178
  loading ? (
179
- <div key="loading" className={cn('pointer-events-none absolute inset-0 bg-current opacity-10', LIVE_PULSE_CLASS)} />
179
+ <div
180
+ key="loading"
181
+ className={cn('pointer-events-none absolute inset-0 bg-current opacity-10', LIVE_PULSE_CLASS)}
182
+ />
180
183
  ) : null,
181
184
  );
182
185
  },
@@ -248,7 +248,11 @@ export function SectionEyebrow({
248
248
  tone?: HeadingAccentTone;
249
249
  className?: string;
250
250
  }) {
251
- return <span className={['text-h5', headingAccentClass(platform, tone), className].filter(Boolean).join(' ')}>{children}</span>;
251
+ return (
252
+ <span className={['text-h5', headingAccentClass(platform, tone), className].filter(Boolean).join(' ')}>
253
+ {children}
254
+ </span>
255
+ );
252
256
  }
253
257
 
254
258
  /**
@@ -272,7 +276,11 @@ export function SectionHeading({
272
276
  const accentClassName = headingAccentClass(platform, tone);
273
277
  const layout = SECTION_HEADING_LAYOUT[level];
274
278
  const Tag = presentational ? 'div' : level === 'page' ? 'h1' : 'h2';
275
- const eyebrowNode = eyebrow ? <SectionEyebrow platform={platform} tone={tone}>{eyebrow}</SectionEyebrow> : null;
279
+ const eyebrowNode = eyebrow ? (
280
+ <SectionEyebrow platform={platform} tone={tone}>
281
+ {eyebrow}
282
+ </SectionEyebrow>
283
+ ) : null;
276
284
  const headingText = (
277
285
  <>
278
286
  {accentSentenceMarks(title, platform, tone)}
@@ -362,7 +370,11 @@ export function SectionHeadingSkeleton({
362
370
  <div className={layout.intro}>
363
371
  {Array.from({ length: introLines }, (_, i) => (
364
372
  // biome-ignore lint/suspicious/noArrayIndexKey: skeleton lines never reorder
365
- <TextLineSkeleton key={i} type="inherit" className={i === introLines - 1 && introLines > 1 ? 'w-2/3' : 'w-full'} />
373
+ <TextLineSkeleton
374
+ key={i}
375
+ type="inherit"
376
+ className={i === introLines - 1 && introLines > 1 ? 'w-2/3' : 'w-full'}
377
+ />
366
378
  ))}
367
379
  </div>
368
380
  ) : null}
@@ -75,7 +75,8 @@ export const MEETING_DIRECTORY_PAGE_SIZE = 6;
75
75
  const directoryRowsMinHeight = (pageSize: number) => pageSize * 80 + (pageSize - 1) * 16;
76
76
 
77
77
  /** A row's frame and columns, read by the row and by its skeleton, so the skeleton is the row's size. */
78
- const ROW_FRAME_CLASS = 'flex min-h-20 w-full items-center gap-4 rounded-lg border border-ods-border bg-ods-card px-4 py-3';
78
+ const ROW_FRAME_CLASS =
79
+ 'flex min-h-20 w-full items-center gap-4 rounded-lg border border-ods-border bg-ods-card px-4 py-3';
79
80
  const ROW_TITLE_COLUMN_CLASS = 'flex min-w-0 flex-1 flex-col justify-center text-left';
80
81
  const ROW_NEXT_COLUMN_CLASS = 'hidden w-44 shrink-0 flex-col items-end justify-center content-md:flex';
81
82
  const ROW_NEXT_LABEL_CLASS = 'text-ods-text-secondary text-h6';
@@ -56,8 +56,9 @@ export function ResultsCountSkeleton({
56
56
  return (
57
57
  <div className={RESULTS_COUNT_ROW_CLASS} aria-hidden>
58
58
  <p className={RESULTS_COUNT_TEXT_CLASS}>
59
- Showing <TextLineSkeleton type="inherit" as="span" className="inline-block align-top w-10" /> of{' '}
60
- <TextLineSkeleton type="inherit" as="span" className="inline-block align-top w-6" /> {resultLabel(resultType, false)}
59
+ Showing <TextLineSkeleton type="inherit" as="span" className="inline-block w-10 align-top" /> of{' '}
60
+ <TextLineSkeleton type="inherit" as="span" className="inline-block w-6 align-top" />{' '}
61
+ {resultLabel(resultType, false)}
61
62
  {sortingMessage && <span className={RESULTS_COUNT_SORTING_CLASS}>• {sortingMessage}</span>}
62
63
  </p>
63
64
  </div>
@@ -85,7 +85,11 @@ export function AvatarStackSkeleton({
85
85
  className?: string;
86
86
  }) {
87
87
  return (
88
- <div aria-hidden className={cn(STACK_ROW_CLASS, slots && 'shrink-0', className)} style={slotsWidthStyle(size, slots)}>
88
+ <div
89
+ aria-hidden
90
+ className={cn(STACK_ROW_CLASS, slots && 'shrink-0', className)}
91
+ style={slotsWidthStyle(size, slots)}
92
+ >
89
93
  {Array.from({ length: count }, (_, i) => (
90
94
  <UnifiedSkeleton
91
95
  // biome-ignore lint/suspicious/noArrayIndexKey: skeleton faces never reorder
@@ -125,4 +125,3 @@ export const BUTTON_SIZE_CLASS = {
125
125
  } as const;
126
126
 
127
127
  export type ButtonSizeKey = keyof typeof BUTTON_SIZE_CLASS;
128
-
@@ -152,7 +152,14 @@ export function CursorPagination({
152
152
  export function CursorPaginationSkeleton(
153
153
  props: Pick<
154
154
  CursorPaginationProps,
155
- 'hasPreviousPage' | 'onPrevious' | 'onReset' | 'className' | 'showInfo' | 'compact' | 'resetButtonLabel' | 'resetButtonIcon'
155
+ | 'hasPreviousPage'
156
+ | 'onPrevious'
157
+ | 'onReset'
158
+ | 'className'
159
+ | 'showInfo'
160
+ | 'compact'
161
+ | 'resetButtonLabel'
162
+ | 'resetButtonIcon'
156
163
  >,
157
164
  ) {
158
165
  return <CursorPagination {...props} hasNextPage={false} skeleton />;
@@ -27,7 +27,7 @@ const ROW_COUNT_CLASS = 'whitespace-nowrap text-ods-text-secondary text-h6';
27
27
  export function DataTableRowCountSkeleton({ label, className }: { label: string; className?: string }) {
28
28
  return (
29
29
  <span className={cn(ROW_COUNT_CLASS, className)} aria-hidden>
30
- <TextLineSkeleton type="inherit" as="span" className="inline-block align-top w-6" /> {label}
30
+ <TextLineSkeleton type="inherit" as="span" className="inline-block w-6 align-top" /> {label}
31
31
  </span>
32
32
  );
33
33
  }
@@ -661,6 +661,20 @@ const timeSelectTriggerStyles = cn(
661
661
  'text-ods-text-primary',
662
662
  );
663
663
 
664
+ // ============================================================================
665
+ // Popover bounds (shared by every date popover in this file)
666
+ // ============================================================================
667
+
668
+ /**
669
+ * Keeps a date popover inside the window. Radix flips a popover to the other
670
+ * side only when it fits there whole and never shrinks it, so near the bottom
671
+ * of a short window (a list too short to scroll) the lower part, Apply
672
+ * included, ended up below the screen. The content is capped at the space
673
+ * Radix measures and scrolls inside instead.
674
+ */
675
+ const DATE_POPOVER_COLLISION_PADDING = 16;
676
+ const datePopoverBounds = 'max-h-[var(--radix-popover-content-available-height)]';
677
+
664
678
  // ============================================================================
665
679
  // DatePicker Component
666
680
  // ============================================================================
@@ -739,12 +753,15 @@ export function DatePicker(props: DatePickerProps) {
739
753
  <Popover.Content
740
754
  className={cn(
741
755
  'z-[9999]',
756
+ datePopoverBounds,
757
+ 'overflow-y-auto',
742
758
  'animate-in fade-in-0 zoom-in-95',
743
759
  'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
744
760
  'data-[side=bottom]:slide-in-from-top-2',
745
761
  'data-[side=top]:slide-in-from-bottom-2',
746
762
  )}
747
763
  sideOffset={8}
764
+ collisionPadding={DATE_POPOVER_COLLISION_PADDING}
748
765
  align="start"
749
766
  >
750
767
  <DatePickerCalendar
@@ -923,12 +940,15 @@ export function DatePickerInput(props: DatePickerInputProps) {
923
940
  <Popover.Content
924
941
  className={cn(
925
942
  'z-[9999]',
943
+ datePopoverBounds,
944
+ 'overflow-y-auto',
926
945
  'animate-in fade-in-0 zoom-in-95',
927
946
  'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
928
947
  'data-[side=bottom]:slide-in-from-top-2',
929
948
  'data-[side=top]:slide-in-from-bottom-2',
930
949
  )}
931
950
  sideOffset={8}
951
+ collisionPadding={DATE_POPOVER_COLLISION_PADDING}
932
952
  align="start"
933
953
  >
934
954
  <DatePickerCalendar
@@ -1150,12 +1170,15 @@ export function DatePickerInputSimple(props: DatePickerInputSimpleProps) {
1150
1170
  <Popover.Content
1151
1171
  className={cn(
1152
1172
  'z-[9999]',
1173
+ datePopoverBounds,
1174
+ 'overflow-y-auto',
1153
1175
  'animate-in fade-in-0 zoom-in-95',
1154
1176
  'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
1155
1177
  'data-[side=bottom]:slide-in-from-top-2',
1156
1178
  'data-[side=top]:slide-in-from-bottom-2',
1157
1179
  )}
1158
1180
  sideOffset={8}
1181
+ collisionPadding={DATE_POPOVER_COLLISION_PADDING}
1159
1182
  align="start"
1160
1183
  >
1161
1184
  <DatePickerCalendar
@@ -1424,6 +1447,7 @@ export function DateFilterMenu({
1424
1447
  <Popover.Content
1425
1448
  className={cn(
1426
1449
  'z-[9999] w-80 max-w-[calc(100vw-2rem)]',
1450
+ datePopoverBounds,
1427
1451
  'flex flex-col gap-4 rounded-[6px] border border-ods-border bg-ods-bg p-4',
1428
1452
  'animate-in fade-in-0 zoom-in-95',
1429
1453
  'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
@@ -1431,24 +1455,27 @@ export function DateFilterMenu({
1431
1455
  'data-[side=top]:slide-in-from-bottom-2',
1432
1456
  )}
1433
1457
  sideOffset={8}
1458
+ collisionPadding={DATE_POPOVER_COLLISION_PADDING}
1434
1459
  align={align}
1435
1460
  >
1436
- {/* Sort + calendar (shared panel) */}
1437
- <DateFilterPanel
1438
- mode={mode}
1439
- sort={draftSort}
1440
- onSortChange={setDraftSort}
1441
- selected={draftSelected}
1442
- onSelect={setDraftSelected}
1443
- fromDate={fromDate}
1444
- toDate={toDate}
1445
- locale={locale}
1446
- ascLabel={ascLabel}
1447
- descLabel={descLabel}
1448
- />
1461
+ {/* Sort + calendar (shared panel). Scrolls when the window is short, so the actions stay on screen. */}
1462
+ <div className="min-h-0 overflow-y-auto">
1463
+ <DateFilterPanel
1464
+ mode={mode}
1465
+ sort={draftSort}
1466
+ onSortChange={setDraftSort}
1467
+ selected={draftSelected}
1468
+ onSelect={setDraftSelected}
1469
+ fromDate={fromDate}
1470
+ toDate={toDate}
1471
+ locale={locale}
1472
+ ascLabel={ascLabel}
1473
+ descLabel={descLabel}
1474
+ />
1475
+ </div>
1449
1476
 
1450
1477
  {/* Actions */}
1451
- <div className="flex w-full items-stretch gap-4">
1478
+ <div className="flex w-full shrink-0 items-stretch gap-4">
1452
1479
  <Button type="button" variant="outline" fullWidth onClick={hasChanges ? handleReset : handleClose}>
1453
1480
  {hasChanges ? 'Reset' : 'Close'}
1454
1481
  </Button>
@@ -260,11 +260,7 @@ function FeatureCardGridView({
260
260
  </span>
261
261
  )}
262
262
  <h3 className={`text-ods-text-primary text-h2 ${titleClassName}`}>
263
- {loading ? (
264
- <TextLineSkeleton type="inherit" as="span" className="w-1/2" />
265
- ) : (
266
- item.title
267
- )}
263
+ {loading ? <TextLineSkeleton type="inherit" as="span" className="w-1/2" /> : item.title}
268
264
  </h3>
269
265
  {item.subtitle && (
270
266
  <p className={`text-h4 ${accentClassName} ${subtitleClassName}`}>
@@ -294,11 +290,7 @@ function FeatureCardGridView({
294
290
  </h3>
295
291
  {item.subtitle && (
296
292
  <p className={`text-h4 ${accentClassName} ${subtitleClassName}`}>
297
- {loading ? (
298
- <TextLineSkeleton type="inherit" as="span" className="w-3/4" />
299
- ) : (
300
- item.subtitle
301
- )}
293
+ {loading ? <TextLineSkeleton type="inherit" as="span" className="w-3/4" /> : item.subtitle}
302
294
  </p>
303
295
  )}
304
296
  </div>
@@ -116,14 +116,8 @@ export function FeatureList({
116
116
  return (
117
117
  <div className={`${BOXED_LIST_CLASS} ${className}`}>
118
118
  {items.map((item, index) => (
119
- <div
120
- key={index}
121
- className={`${BOXED_ROW_CLASS} ${index < items.length - 1 ? BOXED_ROW_DIVIDER_CLASS : ''}`}
122
- >
123
- <div
124
- className={ICON_BOX_CLASS}
125
- style={{ width: iconBoxSize, height: iconBoxSize }}
126
- >
119
+ <div key={index} className={`${BOXED_ROW_CLASS} ${index < items.length - 1 ? BOXED_ROW_DIVIDER_CLASS : ''}`}>
120
+ <div className={ICON_BOX_CLASS} style={{ width: iconBoxSize, height: iconBoxSize }}>
127
121
  {item.icon}
128
122
  </div>
129
123
  <div className={BOXED_TEXT_CLASS}>
@@ -69,11 +69,7 @@ const SOURCE_TAG_CLASS =
69
69
  'inline-flex shrink-0 rounded-md border border-ods-border px-2 py-1 text-ods-text-secondary text-h5';
70
70
 
71
71
  function SourceTag({ children }: { children: ReactNode }) {
72
- return (
73
- <span className={SOURCE_TAG_CLASS}>
74
- {children}
75
- </span>
76
- );
72
+ return <span className={SOURCE_TAG_CLASS}>{children}</span>;
77
73
  }
78
74
 
79
75
  /** The row above an item's title: where it was found and when. Nothing to show: no row. */
@@ -93,13 +89,7 @@ function ItemMeta({ item }: { item: IncidentFeedItem }) {
93
89
  * to a single row each. An item that is waiting on a person stays open even
94
90
  * after newer ones arrive, because it is still the thing to look at.
95
91
  */
96
- export function IncidentFeed({
97
- items,
98
- statusLabels,
99
- emptyLabel,
100
- anchor = 'top',
101
- className,
102
- }: IncidentFeedProps) {
92
+ export function IncidentFeed({ items, statusLabels, emptyLabel, anchor = 'top', className }: IncidentFeedProps) {
103
93
  const lastIndex = items.length - 1;
104
94
  return (
105
95
  <div className={cn(FEED_CLASS, anchor === 'bottom' && FEED_BOTTOM_CLASS, className)}>
@@ -146,4 +136,3 @@ export function IncidentFeed({
146
136
  </div>
147
137
  );
148
138
  }
149
-