@flamingo-stack/openframe-frontend-core 0.0.745 → 0.0.747

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 (96) hide show
  1. package/dist/build/export-map.json +1 -1
  2. package/dist/{chunk-PM5ELQBL.cjs → chunk-2CEQGGRN.cjs} +32 -32
  3. package/dist/{chunk-6IQDQQ56.cjs → chunk-4AWI6CCU.cjs} +38 -38
  4. package/dist/{chunk-75BF7YJR.cjs → chunk-4DT5YXTM.cjs} +13 -13
  5. package/dist/{chunk-YJRMCFX3.cjs → chunk-4MGZYY6U.cjs} +7 -7
  6. package/dist/{chunk-HVR7DPAY.cjs → chunk-6RTHHU3S.cjs} +4 -4
  7. package/dist/{chunk-DJO7YMT3.cjs → chunk-7Y5U3Y4S.cjs} +194 -194
  8. package/dist/{chunk-GAGNKWOC.cjs → chunk-BBM2ICOY.cjs} +2 -2
  9. package/dist/{chunk-4N7KGOBS.cjs → chunk-BEC43GHL.cjs} +3 -3
  10. package/dist/{chunk-GOTEXQZN.cjs → chunk-C7NTL2GV.cjs} +80 -80
  11. package/dist/{chunk-NFINQ7IZ.cjs → chunk-FCQCEQBY.cjs} +6 -6
  12. package/dist/{chunk-URVIPSAJ.cjs → chunk-HNLI4OU5.cjs} +14 -14
  13. package/dist/{chunk-HMSCUL4R.cjs → chunk-HTMHDEIV.cjs} +4 -4
  14. package/dist/{chunk-3LX5AGZO.cjs → chunk-IJA3OZWF.cjs} +24 -24
  15. package/dist/{chunk-ABLUMGCI.cjs → chunk-JHQNUWFM.cjs} +83 -33
  16. package/dist/{chunk-RIGSZEXS.cjs → chunk-JPSMPXCH.cjs} +90 -90
  17. package/dist/{chunk-UY6A6TEY.cjs → chunk-L2IQESTQ.cjs} +2 -2
  18. package/dist/{chunk-M4FKV2U5.cjs → chunk-LLAKQT3B.cjs} +12 -12
  19. package/dist/{chunk-GQ2TRIOV.cjs → chunk-MA7T36JY.cjs} +35 -35
  20. package/dist/{chunk-7KHQHYXL.cjs → chunk-O6QQ44I3.cjs} +18 -18
  21. package/dist/{chunk-LJ46XYYP.cjs → chunk-P7KTAXXE.cjs} +41 -27
  22. package/dist/{chunk-FNIFUCXU.cjs → chunk-PIQRV4EQ.cjs} +5 -5
  23. package/dist/{chunk-OWGLRE74.cjs → chunk-PSIKUDUV.cjs} +8 -8
  24. package/dist/{chunk-4A6OF4HI.cjs → chunk-PSSGIZXZ.cjs} +44 -44
  25. package/dist/{chunk-YIOWV7LS.cjs → chunk-QPSQ5WLG.cjs} +2 -2
  26. package/dist/{chunk-QES5NV4T.cjs → chunk-R3FXJXSQ.cjs} +1040 -1010
  27. package/dist/{chunk-7PQOZLVP.cjs → chunk-TYW7NBP7.cjs} +20 -20
  28. package/dist/{chunk-U2O5YQRP.cjs → chunk-U6XWGK53.cjs} +33 -33
  29. package/dist/{chunk-GEEKJ7SH.cjs → chunk-WY4FKKCV.cjs} +74 -74
  30. package/dist/{chunk-JGZEHBBD.cjs → chunk-YIRX6C7V.cjs} +10 -10
  31. package/dist/{chunk-5TCIRWHL.cjs → chunk-YRULLK7N.cjs} +5 -5
  32. package/dist/{cloud-tenants-DECPWIYQ.cjs → cloud-tenants-QJZIF2JS.cjs} +13 -13
  33. package/dist/components/case-studies/index.cjs +31 -29
  34. package/dist/components/case-studies/share-experience-section.d.ts.map +1 -1
  35. package/dist/components/case-studies/share-experience-section.js +6 -5
  36. package/dist/components/chat/index.cjs +9 -9
  37. package/dist/components/contact/index.cjs +14 -14
  38. package/dist/components/docs/index.cjs +17 -17
  39. package/dist/components/embeds/index.cjs +14 -14
  40. package/dist/components/faq/index.cjs +15 -15
  41. package/dist/components/features/index.cjs +13 -13
  42. package/dist/components/help-center-pages/index.cjs +116 -116
  43. package/dist/components/index.cjs +121 -125
  44. package/dist/components/layout/page-heading.d.ts +16 -0
  45. package/dist/components/layout/page-heading.d.ts.map +1 -1
  46. package/dist/components/layout/page-heading.js +16 -2
  47. package/dist/components/meeting-scheduler/index.cjs +63 -63
  48. package/dist/components/navigation/index.cjs +16 -16
  49. package/dist/components/onboarding-guides/index.cjs +16 -16
  50. package/dist/components/product-demo/index.cjs +9 -9
  51. package/dist/components/related-content/index.cjs +7 -7
  52. package/dist/components/tickets/index.cjs +19 -19
  53. package/dist/components/ui/filter-checkbox-item.d.ts +8 -2
  54. package/dist/components/ui/filter-checkbox-item.d.ts.map +1 -1
  55. package/dist/components/ui/filter-checkbox-item.js +14 -4
  56. package/dist/components/ui/index.cjs +15 -13
  57. package/dist/components/ui/layout-hold.d.ts +4 -3
  58. package/dist/components/ui/layout-hold.d.ts.map +1 -1
  59. package/dist/components/ui/layout-hold.js +29 -9
  60. package/dist/components/unified-filter-logic.js +1 -1
  61. package/dist/components/vendor-tag.d.ts +12 -0
  62. package/dist/components/vendor-tag.d.ts.map +1 -1
  63. package/dist/components/vendor-tag.js +50 -47
  64. package/dist/{devices-HJKDRWQX.cjs → devices-V55KQCAL.cjs} +14 -14
  65. package/dist/{embeddable-chat-3SKFBO2P.cjs → embeddable-chat-5CDR4I6E.cjs} +80 -80
  66. package/dist/index.cjs +22 -18
  67. package/dist/{knowledge-NH2CGY2C.cjs → knowledge-S3VGDRKR.cjs} +14 -14
  68. package/dist/{logs-KZYIDYQK.cjs → logs-K5E2BGZE.cjs} +21 -21
  69. package/dist/{policies-UAVTPIKM.cjs → policies-BWU4FRFE.cjs} +17 -17
  70. package/dist/{remote-session-N4PJB5FW.cjs → remote-session-IYT4LWJC.cjs} +7 -7
  71. package/dist/{scripts-FRPY43KU.cjs → scripts-25UPGXZU.cjs} +20 -20
  72. package/dist/{software-update-AEJJNLX5.cjs → software-update-F6UC7ULZ.cjs} +17 -17
  73. package/dist/{tickets-board-O753S4ZB.cjs → tickets-board-4MT6ZB4F.cjs} +8 -8
  74. package/dist/utils/format.d.ts.map +1 -1
  75. package/dist/utils/format.js +2 -3
  76. package/dist/utils/index.cjs +74 -24
  77. package/dist/utils/index.d.ts +1 -1
  78. package/dist/utils/index.d.ts.map +1 -1
  79. package/dist/utils/index.js +8 -6
  80. package/dist/utils/vendor-classification.d.ts +43 -17
  81. package/dist/utils/vendor-classification.d.ts.map +1 -1
  82. package/dist/utils/vendor-classification.js +73 -22
  83. package/package.json +1 -1
  84. package/src/components/case-studies/share-experience-section.tsx +9 -6
  85. package/src/components/layout/page-heading.tsx +52 -11
  86. package/src/components/ui/filter-checkbox-item.tsx +21 -5
  87. package/src/components/ui/layout-hold.tsx +38 -10
  88. package/src/components/unified-filter-logic.tsx +1 -1
  89. package/src/components/vendor-tag.tsx +73 -69
  90. package/src/utils/format.ts +2 -3
  91. package/src/utils/index.ts +7 -5
  92. package/src/utils/vendor-classification.ts +113 -34
  93. package/dist/utils/format-text-stub.d.ts +0 -5
  94. package/dist/utils/format-text-stub.d.ts.map +0 -1
  95. package/dist/utils/format-text-stub.js +0 -20
  96. package/src/utils/format-text-stub.ts +0 -17
@@ -80142,35 +80142,85 @@ if (_orderIdx("flamingo") > _orderIdx("universal") || getPlatformByHostname("fla
80142
80142
  }
80143
80143
 
80144
80144
  // src/utils/vendor-classification.ts
80145
- var VENDOR_CLASSIFICATIONS = [
80146
- "open_source",
80147
- "commercial",
80148
- "openframe_selected",
80149
- "openframe_shipped",
80150
- "openframe_connect"
80151
- ];
80152
- var OPENFRAME_CLASSIFICATIONS = {
80145
+ var VENDOR_CLASSIFICATION_COPY = {
80153
80146
  openframe_selected: {
80154
- word: "Selected",
80155
80147
  label: "OpenFrame Selected",
80156
- description: "OpenFrame is a unified platform that integrates multiple open-source IT and security tools into a single dashboard for MSPs. This filter shows vendors selected by our team for their excellence, community support, and MSP-specific value."
80148
+ word: "Selected",
80149
+ description: "OpenFrame is a unified platform that integrates multiple open-source IT and security tools into a single dashboard for MSPs. This filter shows vendors selected by our team for their excellence, community support, and MSP-specific value.",
80150
+ group: "openframe",
80151
+ icon: { name: "openframe-logo", tone: "accent" }
80152
+ },
80153
+ openframe_connect: {
80154
+ label: "OpenFrame Connect",
80155
+ word: "Connect",
80156
+ description: "Services OpenFrame connects to and manages for every client, such as Microsoft 365 and Google Workspace, beside devices and tickets.",
80157
+ group: "openframe",
80158
+ icon: { name: "openframe-logo", tone: "accent" }
80157
80159
  },
80158
80160
  openframe_shipped: {
80159
- word: "Shipped",
80160
80161
  label: "OpenFrame Shipped",
80161
- description: "Tools and OpenFrame products that are in the released OpenFrame product today, not on the roadmap."
80162
+ word: "Shipped",
80163
+ description: "Tools and OpenFrame products that are in the released OpenFrame product today, not on the roadmap.",
80164
+ group: "openframe",
80165
+ icon: { name: "openframe-logo", tone: "accent" }
80162
80166
  },
80163
- openframe_connect: {
80164
- word: "Connect",
80165
- label: "OpenFrame Connect",
80166
- description: "Services OpenFrame connects to and manages for every client, such as Microsoft 365 and Google Workspace, beside devices and tickets."
80167
+ open_source: {
80168
+ label: "Open Source",
80169
+ description: "Released under an OSI-approved open-source license.",
80170
+ group: "license",
80171
+ icon: { name: "code", tone: "accent" }
80172
+ },
80173
+ source_available: {
80174
+ label: "Source-available",
80175
+ description: "The source code is public, but the license restricts how it may be used (for example SSPL, BSL, the Elastic License, or limits on company size or on offering it as a service).",
80176
+ group: "license",
80177
+ icon: { name: "file-code", tone: "neutral" }
80178
+ },
80179
+ commercial: {
80180
+ label: "Commercial",
80181
+ description: "Proprietary software sold by the vendor.",
80182
+ group: "license",
80183
+ icon: { name: "dollar", tone: "neutral" }
80184
+ },
80185
+ end_of_life: {
80186
+ label: "End of life",
80187
+ description: "The vendor has discontinued or retired the product. No new releases.",
80188
+ group: "lifecycle",
80189
+ icon: { name: "alert-triangle", tone: "warning" }
80190
+ },
80191
+ end_of_support: {
80192
+ label: "End of support",
80193
+ description: "The vendor no longer provides support or security fixes, though the product can still be obtained.",
80194
+ group: "lifecycle",
80195
+ icon: { name: "clock", tone: "warning" }
80196
+ },
80197
+ unmaintained: {
80198
+ label: "Unmaintained",
80199
+ description: "No release for years and no official end-of-life notice.",
80200
+ group: "lifecycle",
80201
+ icon: { name: "pause-circle", tone: "warning" }
80167
80202
  }
80168
80203
  };
80169
- function isVendorClassification(value) {
80170
- return VENDOR_CLASSIFICATIONS.includes(value);
80204
+ function vendorClassificationCopy(value) {
80205
+ if (!value || !Object.prototype.hasOwnProperty.call(VENDOR_CLASSIFICATION_COPY, value)) return void 0;
80206
+ return VENDOR_CLASSIFICATION_COPY[value];
80207
+ }
80208
+ function vendorClassificationGroup(value) {
80209
+ return vendorClassificationCopy(value)?.group;
80171
80210
  }
80172
80211
  function isOpenFrameClassification(value) {
80173
- return !!value && Object.prototype.hasOwnProperty.call(OPENFRAME_CLASSIFICATIONS, value);
80212
+ return vendorClassificationGroup(value) === "openframe";
80213
+ }
80214
+ var DISPLAY_ORDER = Object.keys(VENDOR_CLASSIFICATION_COPY);
80215
+ function compareVendorClassifications(a, b) {
80216
+ const ia = DISPLAY_ORDER.indexOf(a);
80217
+ const ib = DISPLAY_ORDER.indexOf(b);
80218
+ if (ia !== -1 || ib !== -1) {
80219
+ if (ia === -1) return 1;
80220
+ if (ib === -1) return -1;
80221
+ return ia - ib;
80222
+ }
80223
+ return a.localeCompare(b);
80174
80224
  }
80175
80225
 
80176
80226
  // src/utils/format.ts
@@ -80568,8 +80618,7 @@ function stripHtml(html) {
80568
80618
  return noTags.replace(/&nbsp;/g, " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&#x27;/g, "'").replace(/&apos;/g, "'").replace(/&amp;/g, "&").replace(/\s+/g, " ").trim();
80569
80619
  }
80570
80620
  function formatClassification(classification) {
80571
- if (isOpenFrameClassification(classification)) return OPENFRAME_CLASSIFICATIONS[classification].label;
80572
- return formatUnderscoreText(classification);
80621
+ return vendorClassificationCopy(classification)?.label ?? formatUnderscoreText(classification);
80573
80622
  }
80574
80623
  function formatPricingModel(pricingModel) {
80575
80624
  const customMappings = {
@@ -86082,7 +86131,6 @@ exports.ODS_SPACING_TOKENS = ODS_SPACING_TOKENS;
86082
86131
  exports.ODS_SPACING_TOKEN_PATTERN = ODS_SPACING_TOKEN_PATTERN;
86083
86132
  exports.ODS_STEM_CLASSES = ODS_STEM_CLASSES;
86084
86133
  exports.ODS_STEM_TOKENS = ODS_STEM_TOKENS;
86085
- exports.OPENFRAME_CLASSIFICATIONS = OPENFRAME_CLASSIFICATIONS;
86086
86134
  exports.OPENFRAME_DEV_SECTIONS = OPENFRAME_DEV_SECTIONS;
86087
86135
  exports.OS_PLATFORMS = OS_PLATFORMS;
86088
86136
  exports.PAGE_PARAM_LIMITS = PAGE_PARAM_LIMITS;
@@ -86108,7 +86156,7 @@ exports.TICKET_OPEN_PARAM = TICKET_OPEN_PARAM;
86108
86156
  exports.TICKET_STATUS_OPTIONS = TICKET_STATUS_OPTIONS;
86109
86157
  exports.TOKEN_RATE_EMPTY = TOKEN_RATE_EMPTY;
86110
86158
  exports.TRIAL_TERMS = TRIAL_TERMS;
86111
- exports.VENDOR_CLASSIFICATIONS = VENDOR_CLASSIFICATIONS;
86159
+ exports.VENDOR_CLASSIFICATION_COPY = VENDOR_CLASSIFICATION_COPY;
86112
86160
  exports.VIEWER_TIMEZONE = VIEWER_TIMEZONE;
86113
86161
  exports.WALKTHROUGH_OPEN_QUERY_PARAM = WALKTHROUGH_OPEN_QUERY_PARAM;
86114
86162
  exports.WALKTHROUGH_VIDEO_DISMISS_KEY = WALKTHROUGH_VIDEO_DISMISS_KEY;
@@ -86143,6 +86191,7 @@ exports.clearLegacyAnnouncementCache = clearLegacyAnnouncementCache;
86143
86191
  exports.clearWalkthroughDismissal = clearWalkthroughDismissal;
86144
86192
  exports.clickupTaskUrl = clickupTaskUrl;
86145
86193
  exports.cn = cn;
86194
+ exports.compareVendorClassifications = compareVendorClassifications;
86146
86195
  exports.complianceStandardForName = complianceStandardForName;
86147
86196
  exports.consumeAccessCode = consumeAccessCode;
86148
86197
  exports.copyrightLine = copyrightLine;
@@ -86350,7 +86399,6 @@ exports.isValidEmailDomain = isValidEmailDomain;
86350
86399
  exports.isValidPathPattern = isValidPathPattern;
86351
86400
  exports.isValidSchedulingSlug = isValidSchedulingSlug;
86352
86401
  exports.isValidToolType = isValidToolType;
86353
- exports.isVendorClassification = isVendorClassification;
86354
86402
  exports.isVideoMedia = isVideoMedia;
86355
86403
  exports.isWalkthroughDismissed = isWalkthroughDismissed;
86356
86404
  exports.isWithinMinutes = isWithinMinutes;
@@ -86472,6 +86520,8 @@ exports.validateAndConsumeAccessCode = validateAndConsumeAccessCode;
86472
86520
  exports.validateEmailDomain = validateEmailDomain;
86473
86521
  exports.validateEmailDomainList = validateEmailDomainList;
86474
86522
  exports.validatePhoneNumber = validatePhoneNumber;
86523
+ exports.vendorClassificationCopy = vendorClassificationCopy;
86524
+ exports.vendorClassificationGroup = vendorClassificationGroup;
86475
86525
  exports.walkthroughDismissCookieName = walkthroughDismissCookieName;
86476
86526
  exports.webinarTiming = webinarTiming;
86477
86527
  exports.withFirstTouchAttribution = withFirstTouchAttribution;
@@ -4,7 +4,7 @@ export { formatDate, formatNumber, formatPrice, formatBytes, formatUrlForDisplay
4
4
  export * from './ai-providers';
5
5
  export * from './model-token-rates';
6
6
  export { TRIAL_TERMS, trialLabels, trialLengthLabel } from './trial';
7
- export { VENDOR_CLASSIFICATIONS, OPENFRAME_CLASSIFICATIONS, isVendorClassification, isOpenFrameClassification, type VendorClassificationValue, type OpenFrameClassification, type OpenFrameClassificationCopy, } from './vendor-classification';
7
+ export { VENDOR_CLASSIFICATION_COPY, vendorClassificationCopy, vendorClassificationGroup, compareVendorClassifications, isOpenFrameClassification, type VendorClassificationValue, type VendorClassificationGroup, type VendorClassificationCopy, type VendorClassificationIconConfig, } from './vendor-classification';
8
8
  export { PLAY_ICON_PATH } from '../components/icons-v2-generated/media-playback/play-icon';
9
9
  export { getPlatformAccentColor, getCurrentPlatform, getPlatformConfig, usePlatformColors, switchPlatformTheme, getSemanticColor, type ColorCategory, HEX_PATTERN, getReadableTextColor, hexToRgb, rgbToHex, deriveHoverColor, deriveActiveColor, } from './ods-color-utils';
10
10
  export { errorMessage, delay, generateRandomString, truncateString, deepClone, getSlackCommunityJoinUrl, serializeJsonLd, clamp, pick, NO_CLIENT_CACHE, } from './common';
@@ -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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"}
@@ -13,9 +13,10 @@ export * from "./ai-providers.js";
13
13
  export * from "./model-token-rates.js";
14
14
  import { TRIAL_TERMS, trialLabels, trialLengthLabel } from "./trial.js";
15
15
  import {
16
- VENDOR_CLASSIFICATIONS,
17
- OPENFRAME_CLASSIFICATIONS,
18
- isVendorClassification,
16
+ VENDOR_CLASSIFICATION_COPY,
17
+ vendorClassificationCopy,
18
+ vendorClassificationGroup,
19
+ compareVendorClassifications,
19
20
  isOpenFrameClassification
20
21
  } from "./vendor-classification.js";
21
22
  import { PLAY_ICON_PATH } from "../components/icons-v2-generated/media-playback/play-icon.js";
@@ -286,7 +287,6 @@ export {
286
287
  ICON_REGISTRY,
287
288
  LOCATION_HASH_SYNC_EVENT,
288
289
  NO_CLIENT_CACHE,
289
- OPENFRAME_CLASSIFICATIONS,
290
290
  PLAY_ICON_PATH,
291
291
  PROGRAM_META_RENDERERS,
292
292
  SCROLL_ANCHOR,
@@ -298,7 +298,7 @@ export {
298
298
  STICKY_HEADER_OFFSET_PX,
299
299
  TICKET_OPEN_PARAM,
300
300
  TRIAL_TERMS,
301
- VENDOR_CLASSIFICATIONS,
301
+ VENDOR_CLASSIFICATION_COPY,
302
302
  VIEWER_TIMEZONE,
303
303
  applyProxyAuth,
304
304
  buildAutoContinuationDirective,
@@ -314,6 +314,7 @@ export {
314
314
  clearEmbedProxyAuth,
315
315
  clickupTaskUrl,
316
316
  cn,
317
+ compareVendorClassifications,
317
318
  copyrightLine,
318
319
  createSseSubscription,
319
320
  createUTCTimestamp,
@@ -415,7 +416,6 @@ export {
415
416
  isOrderedRange,
416
417
  isScrollSyncedHash,
417
418
  isToday,
418
- isVendorClassification,
419
419
  isWithinMinutes,
420
420
  makeComposeContentUrl,
421
421
  nameInitials,
@@ -458,5 +458,7 @@ export {
458
458
  truncateString,
459
459
  urlPathLooksLikeSvg,
460
460
  usePlatformColors,
461
+ vendorClassificationCopy,
462
+ vendorClassificationGroup,
461
463
  webinarTiming
462
464
  };
@@ -1,26 +1,52 @@
1
1
  /**
2
- * Vendor classifications: the ONE vocabulary of `vendor_classification.classification`.
2
+ * Vendor classifications: whatever `vendor_classification.classification` holds on the
3
+ * server. The database owns the vocabulary (its CHECK constraint is the list), the catalog
4
+ * builds its filters from the rows that exist, and nothing here limits which values are valid.
3
5
  *
4
- * A vendor may carry several (an OpenFrame product is `open_source` and
5
- * `openframe_selected`). The two OpenFrame ones are drawn with the OpenFrame
6
- * mark and ONE word, everywhere: a tag on a card, a filter in the catalog.
6
+ * This module only ENRICHES the values we want to present specially: a curated label, a
7
+ * tooltip description and a group. A value with no entry still works everywhere, labelled
8
+ * by title case. To present a new value better, add an entry here; to make it exist, add it
9
+ * to the database.
7
10
  *
8
- * - `openframe_selected`: a tool OpenFrame is built on, picked by the team.
9
- * - `openframe_shipped`: a tool or OpenFrame product that is in the released product today.
10
- * - `openframe_connect`: a service OpenFrame connects to and manages.
11
+ * Groups:
12
+ * - `license`: how the software is licensed.
13
+ * - `lifecycle`: where the product is in its life (a tag and a filter; a card's one tag stays the license).
14
+ * - `openframe`: drawn with the OpenFrame mark and ONE word (`word`).
11
15
  */
12
- export declare const VENDOR_CLASSIFICATIONS: readonly ["open_source", "commercial", "openframe_selected", "openframe_shipped", "openframe_connect"];
13
- export type VendorClassificationValue = (typeof VENDOR_CLASSIFICATIONS)[number];
14
- export type OpenFrameClassification = Extract<VendorClassificationValue, `openframe_${string}`>;
15
- export interface OpenFrameClassificationCopy {
16
- /** The word drawn beside the OpenFrame mark. */
17
- word: string;
18
- /** The full name, for plain-text surfaces (a select option, an aria label). */
16
+ export type VendorClassificationValue = string;
17
+ export type VendorClassificationGroup = 'license' | 'lifecycle' | 'openframe';
18
+ export interface VendorClassificationCopy {
19
+ /** The label on a tag, a filter and a plain-text surface. */
19
20
  label: string;
20
21
  /** What the classification means, for a tooltip. */
21
22
  description: string;
23
+ group: VendorClassificationGroup;
24
+ /** OpenFrame group only: the one word drawn beside the OpenFrame mark. */
25
+ word?: string;
26
+ /** The icon drawn beside the label, by name (resolved by the shared icon resolver), and its tone. */
27
+ icon?: VendorClassificationIconConfig;
22
28
  }
23
- export declare const OPENFRAME_CLASSIFICATIONS: Record<OpenFrameClassification, OpenFrameClassificationCopy>;
24
- export declare function isVendorClassification(value: string): value is VendorClassificationValue;
25
- export declare function isOpenFrameClassification(value: string | null | undefined): value is OpenFrameClassification;
29
+ /**
30
+ * A classification's icon, as data: `name` is any name the shared resolver knows (an alias such
31
+ * as `openframe-logo`, an icon of the design set by its kebab name, or a lucide name). `tone`:
32
+ * `accent` (the brand colour), `neutral` (secondary text on a tile) or `warning`.
33
+ */
34
+ export interface VendorClassificationIconConfig {
35
+ name: string;
36
+ tone: 'accent' | 'neutral' | 'warning';
37
+ }
38
+ /** In display order: a filter list shows OpenFrame first, then license, then lifecycle. */
39
+ export declare const VENDOR_CLASSIFICATION_COPY: Readonly<Record<string, VendorClassificationCopy>>;
40
+ /** The enrichment of a classification, or undefined for a value we do not present specially. */
41
+ export declare function vendorClassificationCopy(value: string | null | undefined): VendorClassificationCopy | undefined;
42
+ /** The group of a classification, or undefined for a value with no enrichment. */
43
+ export declare function vendorClassificationGroup(value: string | null | undefined): VendorClassificationGroup | undefined;
44
+ /** A classification drawn with the OpenFrame mark (it has a `word`). */
45
+ export declare function isOpenFrameClassification(value: string | null | undefined): boolean;
46
+ /**
47
+ * Sort order for a list of classifications (a filter list): the enriched values in their
48
+ * display order (OpenFrame Selected, Connect, Shipped, then license, then lifecycle), then
49
+ * every other value the server holds, alphabetically.
50
+ */
51
+ export declare function compareVendorClassifications(a: string, b: string): number;
26
52
  //# sourceMappingURL=vendor-classification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vendor-classification.d.ts","sourceRoot":"","sources":["../../src/utils/vendor-classification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,wGAMzB,CAAC;AAEX,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhF,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAAC,yBAAyB,EAAE,aAAa,MAAM,EAAE,CAAC,CAAC;AAEhG,MAAM,WAAW,2BAA2B;IAC1C,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,CAkBlG,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,yBAAyB,CAExF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,KAAK,IAAI,uBAAuB,CAE5G"}
1
+ {"version":3,"file":"vendor-classification.d.ts","sourceRoot":"","sources":["../../src/utils/vendor-classification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAE/C,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9E,MAAM,WAAW,wBAAwB;IACvC,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,yBAAyB,CAAC;IACjC,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qGAAqG;IACrG,IAAI,CAAC,EAAE,8BAA8B,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CACxC;AAED,2FAA2F;AAC3F,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CA6DzF,CAAC;AAEF,gGAAgG;AAChG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,wBAAwB,GAAG,SAAS,CAG/G;AAED,kFAAkF;AAClF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,yBAAyB,GAAG,SAAS,CAEjH;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEnF;AAID;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CASzE"}
@@ -1,36 +1,87 @@
1
- const VENDOR_CLASSIFICATIONS = [
2
- "open_source",
3
- "commercial",
4
- "openframe_selected",
5
- "openframe_shipped",
6
- "openframe_connect"
7
- ];
8
- const OPENFRAME_CLASSIFICATIONS = {
1
+ const VENDOR_CLASSIFICATION_COPY = {
9
2
  openframe_selected: {
10
- word: "Selected",
11
3
  label: "OpenFrame Selected",
12
- description: "OpenFrame is a unified platform that integrates multiple open-source IT and security tools into a single dashboard for MSPs. This filter shows vendors selected by our team for their excellence, community support, and MSP-specific value."
4
+ word: "Selected",
5
+ description: "OpenFrame is a unified platform that integrates multiple open-source IT and security tools into a single dashboard for MSPs. This filter shows vendors selected by our team for their excellence, community support, and MSP-specific value.",
6
+ group: "openframe",
7
+ icon: { name: "openframe-logo", tone: "accent" }
8
+ },
9
+ openframe_connect: {
10
+ label: "OpenFrame Connect",
11
+ word: "Connect",
12
+ description: "Services OpenFrame connects to and manages for every client, such as Microsoft 365 and Google Workspace, beside devices and tickets.",
13
+ group: "openframe",
14
+ icon: { name: "openframe-logo", tone: "accent" }
13
15
  },
14
16
  openframe_shipped: {
15
- word: "Shipped",
16
17
  label: "OpenFrame Shipped",
17
- description: "Tools and OpenFrame products that are in the released OpenFrame product today, not on the roadmap."
18
+ word: "Shipped",
19
+ description: "Tools and OpenFrame products that are in the released OpenFrame product today, not on the roadmap.",
20
+ group: "openframe",
21
+ icon: { name: "openframe-logo", tone: "accent" }
18
22
  },
19
- openframe_connect: {
20
- word: "Connect",
21
- label: "OpenFrame Connect",
22
- description: "Services OpenFrame connects to and manages for every client, such as Microsoft 365 and Google Workspace, beside devices and tickets."
23
+ open_source: {
24
+ label: "Open Source",
25
+ description: "Released under an OSI-approved open-source license.",
26
+ group: "license",
27
+ icon: { name: "code", tone: "accent" }
28
+ },
29
+ source_available: {
30
+ label: "Source-available",
31
+ description: "The source code is public, but the license restricts how it may be used (for example SSPL, BSL, the Elastic License, or limits on company size or on offering it as a service).",
32
+ group: "license",
33
+ icon: { name: "file-code", tone: "neutral" }
34
+ },
35
+ commercial: {
36
+ label: "Commercial",
37
+ description: "Proprietary software sold by the vendor.",
38
+ group: "license",
39
+ icon: { name: "dollar", tone: "neutral" }
40
+ },
41
+ end_of_life: {
42
+ label: "End of life",
43
+ description: "The vendor has discontinued or retired the product. No new releases.",
44
+ group: "lifecycle",
45
+ icon: { name: "alert-triangle", tone: "warning" }
46
+ },
47
+ end_of_support: {
48
+ label: "End of support",
49
+ description: "The vendor no longer provides support or security fixes, though the product can still be obtained.",
50
+ group: "lifecycle",
51
+ icon: { name: "clock", tone: "warning" }
52
+ },
53
+ unmaintained: {
54
+ label: "Unmaintained",
55
+ description: "No release for years and no official end-of-life notice.",
56
+ group: "lifecycle",
57
+ icon: { name: "pause-circle", tone: "warning" }
23
58
  }
24
59
  };
25
- function isVendorClassification(value) {
26
- return VENDOR_CLASSIFICATIONS.includes(value);
60
+ function vendorClassificationCopy(value) {
61
+ if (!value || !Object.prototype.hasOwnProperty.call(VENDOR_CLASSIFICATION_COPY, value)) return void 0;
62
+ return VENDOR_CLASSIFICATION_COPY[value];
63
+ }
64
+ function vendorClassificationGroup(value) {
65
+ return vendorClassificationCopy(value)?.group;
27
66
  }
28
67
  function isOpenFrameClassification(value) {
29
- return !!value && Object.prototype.hasOwnProperty.call(OPENFRAME_CLASSIFICATIONS, value);
68
+ return vendorClassificationGroup(value) === "openframe";
69
+ }
70
+ const DISPLAY_ORDER = Object.keys(VENDOR_CLASSIFICATION_COPY);
71
+ function compareVendorClassifications(a, b) {
72
+ const ia = DISPLAY_ORDER.indexOf(a);
73
+ const ib = DISPLAY_ORDER.indexOf(b);
74
+ if (ia !== -1 || ib !== -1) {
75
+ if (ia === -1) return 1;
76
+ if (ib === -1) return -1;
77
+ return ia - ib;
78
+ }
79
+ return a.localeCompare(b);
30
80
  }
31
81
  export {
32
- OPENFRAME_CLASSIFICATIONS,
33
- VENDOR_CLASSIFICATIONS,
82
+ VENDOR_CLASSIFICATION_COPY,
83
+ compareVendorClassifications,
34
84
  isOpenFrameClassification,
35
- isVendorClassification
85
+ vendorClassificationCopy,
86
+ vendorClassificationGroup
36
87
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.745",
3
+ "version": "0.0.747",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -7,7 +7,7 @@ import { CapterraIcon } from '../icons-v2-generated/brand-logos/capterra-icon';
7
7
  import { G2Icon } from '../icons-v2-generated/brand-logos/g2-icon';
8
8
  import { GetappIcon } from '../icons-v2-generated/brand-logos/getapp-icon';
9
9
  import { TrustpilotIcon } from '../icons-v2-generated/brand-logos/trustpilot-icon';
10
- import { accentSentenceMarks } from '../layout/page-heading';
10
+ import { accentSentenceMarks, HeadingLines } from '../layout/page-heading';
11
11
  import { BenefitCard, BenefitCardGrid } from '../ui';
12
12
 
13
13
  /**
@@ -56,11 +56,14 @@ export interface ShareExperienceSectionProps {
56
56
  }
57
57
 
58
58
  const DEFAULT_TITLE: React.ReactNode = (
59
- <>
60
- Share Your Experience
61
- <br />
62
- with Fellow MSPs<span className="text-ods-accent">:</span>
63
- </>
59
+ <HeadingLines>
60
+ {[
61
+ 'Share Your Experience',
62
+ <>
63
+ with Fellow MSPs<span className="text-ods-accent">:</span>
64
+ </>,
65
+ ]}
66
+ </HeadingLines>
64
67
  );
65
68
 
66
69
  const DEFAULT_SUBTITLE: React.ReactNode = (
@@ -68,6 +68,41 @@ export function PageHeading({
68
68
  );
69
69
  }
70
70
 
71
+ /**
72
+ * THE way a heading is drawn on more than one line: each line on its own line,
73
+ * with a space before every break. The space is what keeps the heading's TEXT
74
+ * (what search engines, screen readers and link previews read) in words:
75
+ * "own. Approved", never "own.Approved". It sits at the end of a line, where it
76
+ * draws nothing. An empty line is a blank line.
77
+ *
78
+ * Every multi-line title goes through this; never write a bare `<br />` or one
79
+ * block `<span>` per line in a heading. The lines are its children, so anything
80
+ * that walks a title's children (the accent marks) reaches every line.
81
+ */
82
+ export interface HeadingLinesProps {
83
+ /** The title's lines, top to bottom: one child per line. */
84
+ children: ReactNode;
85
+ }
86
+
87
+ export function HeadingLines({ children }: HeadingLinesProps) {
88
+ return (
89
+ <>
90
+ {Children.toArray(children).map((line, index) => (
91
+ // biome-ignore lint/suspicious/noArrayIndexKey: a title's lines never reorder
92
+ <Fragment key={index}>
93
+ {index > 0 ? (
94
+ <>
95
+ {' '}
96
+ <br />
97
+ </>
98
+ ) : null}
99
+ {line}
100
+ </Fragment>
101
+ ))}
102
+ </>
103
+ );
104
+ }
105
+
71
106
  /** A sentence mark inside a title: `.`, `:`, `?` or `!` that ends a sentence (followed by a space or the end). */
72
107
  const SENTENCE_MARK = /([.:?!]+)(?=\s|$)/g;
73
108
  const ONLY_MARKS = /^\s*[.:?!]+\s*$/;
@@ -116,17 +151,22 @@ function accentMarks(node: ReactNode, accentClassName: string): ReactNode {
116
151
  if (ONLY_MARKS.test(node)) return node;
117
152
  const parts = node.split(SENTENCE_MARK);
118
153
  if (parts.length === 1) return node;
119
- return parts.map((part, index) =>
120
- // `split` with one capture group alternates text, mark, text, mark...
121
- index % 2 === 1 ? (
122
- // biome-ignore lint/suspicious/noArrayIndexKey: the parts of one string never reorder
123
- <span key={index} className={accentClassName}>
124
- {part}
125
- </span>
126
- ) : (
127
- // biome-ignore lint/suspicious/noArrayIndexKey: the parts of one string never reorder
128
- <Fragment key={index}>{part}</Fragment>
129
- ),
154
+ // One node for one string, so a list of children keeps its length (each of `HeadingLines`' lines stays one line).
155
+ return (
156
+ <>
157
+ {parts.map((part, index) =>
158
+ // `split` with one capture group alternates text, mark, text, mark...
159
+ index % 2 === 1 ? (
160
+ // biome-ignore lint/suspicious/noArrayIndexKey: the parts of one string never reorder
161
+ <span key={index} className={accentClassName}>
162
+ {part}
163
+ </span>
164
+ ) : (
165
+ // biome-ignore lint/suspicious/noArrayIndexKey: the parts of one string never reorder
166
+ <Fragment key={index}>{part}</Fragment>
167
+ ),
168
+ )}
169
+ </>
130
170
  );
131
171
  }
132
172
  if (Array.isArray(node)) {
@@ -225,6 +265,7 @@ export function SectionHeading({
225
265
  // `contents`: the element names the heading and draws no box, so the stack lays its two children out as before.
226
266
  <Tag className="contents">
227
267
  {eyebrowNode}
268
+ {/* A space between the eyebrow and the title, so the heading's text reads "Eyebrow Title", not "EyebrowTitle". */}{' '}
228
269
  <span className={`block ${layout.heading}`} data-section-heading>
229
270
  {headingText}
230
271
  </span>
@@ -1,30 +1,46 @@
1
1
  'use client';
2
2
 
3
3
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
4
+ import type { ReactNode } from 'react';
4
5
  import { cn } from '../../utils/cn';
5
6
  import { CheckboxCheckmarkIcon } from '../icons-v2-generated/signs-and-symbols/checkbox-checkmark-icon';
6
7
 
7
8
  export interface FilterCheckboxItemProps {
8
- label: string;
9
+ /** Text, or a richer label (an icon with a word and a tooltip). */
10
+ label: ReactNode;
11
+ /** The accessible name when `label` is not plain text. */
12
+ ariaLabel?: string;
9
13
  checked: boolean;
10
14
  onChange: (checked: boolean) => void;
11
15
  count?: number;
16
+ /** Ignore clicks (e.g. while a navigation started by this filter is pending). */
17
+ disabled?: boolean;
12
18
  className?: string;
13
19
  }
14
20
 
15
- export function FilterCheckboxItem({ label, checked, onChange, count, className }: FilterCheckboxItemProps) {
21
+ export function FilterCheckboxItem({
22
+ label,
23
+ ariaLabel,
24
+ checked,
25
+ onChange,
26
+ count,
27
+ disabled,
28
+ className,
29
+ }: FilterCheckboxItemProps) {
16
30
  return (
17
31
  <div
18
32
  className={cn(
19
33
  'flex items-center gap-3 border-b border-ods-border bg-ods-card last:border-b-0',
20
- 'cursor-pointer transition-colors hover:bg-ods-bg-hover',
34
+ disabled ? 'cursor-wait opacity-70' : 'cursor-pointer transition-colors hover:bg-ods-bg-hover',
21
35
  count !== undefined ? 'px-4 py-3' : 'p-3',
22
36
  className,
23
37
  )}
24
- onClick={() => onChange(!checked)}
38
+ onClick={() => !disabled && onChange(!checked)}
25
39
  >
26
40
  <CheckboxPrimitive.Root
27
41
  checked={checked}
42
+ disabled={disabled}
43
+ aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}
28
44
  onCheckedChange={c => onChange(c === true)}
29
45
  className={cn(
30
46
  'h-6 w-6 shrink-0 rounded-[6px] border-2',
@@ -37,7 +53,7 @@ export function FilterCheckboxItem({ label, checked, onChange, count, className
37
53
  <CheckboxCheckmarkIcon size={10} />
38
54
  </CheckboxPrimitive.Indicator>
39
55
  </CheckboxPrimitive.Root>
40
- <span className="flex-1 text-ods-text-primary text-h4">{label}</span>
56
+ <span className="min-w-0 flex-1 text-ods-text-primary text-h4">{label}</span>
41
57
  {count !== undefined && (
42
58
  <span className="shrink-0 text-ods-text-secondary text-h5">{count.toLocaleString()}</span>
43
59
  )}